diff --git a/.devcontainer/dev/devcontainer.json b/.devcontainer/dev/devcontainer.json index e5fb68ec02e..2e5d5ec2d45 100644 --- a/.devcontainer/dev/devcontainer.json +++ b/.devcontainer/dev/devcontainer.json @@ -1,6 +1,6 @@ { "name": "Development", - "image": "aztecprotocol/devbox:1.0", + "image": "aztecprotocol/devbox:1.2", "features": { // Use custom fork with noble added to list of supported distros. "./docker-in-docker": {} diff --git a/.github/workflows/ci-arm.yml b/.github/workflows/ci-arm.yml index 1ba74da9a63..56137bbed7c 100644 --- a/.github/workflows/ci-arm.yml +++ b/.github/workflows/ci-arm.yml @@ -86,30 +86,31 @@ jobs: sudo shutdown -P 60 # necessary to get around builtin hard timeout earthly-ci ./yarn-project+export-e2e-test-images - # all the non-bench end-to-end integration tests for aztec - e2e: - needs: [build] - runs-on: master-arm - steps: - # permission kludge before checkout, see https://github.com/actions/checkout/issues/211#issuecomment-611986243 - - run: sudo chown -R $USER:$USER /home/ubuntu/ - - uses: actions/checkout@v4 - with: { ref: "${{ env.GIT_COMMIT }}" } - - uses: ./.github/ci-setup-action - with: - concurrency_key: e2e-arm - # prepare images locally, tagged by commit hash - - name: "Build E2E Image" - timeout-minutes: 40 - working-directory: ./yarn-project/end-to-end - run: | - ./scripts/e2e_compose_test.sh uniswap_trade_on_l1_from_l2.test.ts + # TODO(https://github.com/AztecProtocol/aztec-packages/issues/10681) + # # all the non-bench end-to-end integration tests for aztec + # e2e: + # needs: [build] + # runs-on: master-arm + # steps: + # # permission kludge before checkout, see https://github.com/actions/checkout/issues/211#issuecomment-611986243 + # - run: sudo chown -R $USER:$USER /home/ubuntu/ + # - uses: actions/checkout@v4 + # with: { ref: "${{ env.GIT_COMMIT }}" } + # - uses: ./.github/ci-setup-action + # with: + # concurrency_key: e2e-arm + # # prepare images locally, tagged by commit hash + # - name: "Build E2E Image" + # timeout-minutes: 40 + # working-directory: ./yarn-project/end-to-end + # run: | + # ./scripts/e2e_compose_test.sh uniswap_trade_on_l1_from_l2.test.ts rerun-check: runs-on: ubuntu-20.04 permissions: actions: write - needs: [setup, build-images, build, e2e] + needs: [setup, build-images, build] #, e2e] if: ${{ !cancelled() }} steps: - name: Check for Rerun @@ -126,7 +127,7 @@ jobs: # NOTE: we only notify failures after a rerun has occurred notify: - needs: [e2e] + needs: [build] #[e2e] runs-on: ubuntu-latest if: ${{ github.ref == 'refs/heads/master' && failure() && github.run_attempt >= 2 }} steps: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b0da3a15b7..b2f5f49cbdd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -166,22 +166,32 @@ jobs: # (Note ARM uses just 2 tests as a smoketest) - name: Create list of non-bench end-to-end jobs id: e2e_list - env: - REF: contains(github.ref_name, 'gh-readonly-queue') && 'master' || github.ref_name run: | + if [[ "$GITHUB_REF_NAME" == *"gh-readonly-queue"* ]]; then + REF="master" + else + REF="$GITHUB_REF_NAME" + fi + if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then LABELS=$(jq -r '.pull_request.labels | map(.name) | join(",")' "$GITHUB_EVENT_PATH") else LABELS="" fi + + echo REF: $REF echo Labels: $LABELS echo "list=$(./scripts/ci/get_e2e_jobs.sh $REF "$LABELS")" echo "list=$(./scripts/ci/get_e2e_jobs.sh $REF "$LABELS")" >> $GITHUB_OUTPUT - name: Create list of bench end-to-end jobs id: bench_list - env: - REF: contains(github.ref_name, 'gh-readonly-queue') && 'master' || github.ref_name run: | + if [[ "$GITHUB_REF_NAME" == *"gh-readonly-queue"* ]]; then + REF="master" + else + REF="$GITHUB_REF_NAME" + fi + if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then LABELS=$(jq -r '.pull_request.labels | map(.name) | join(",")' "$GITHUB_EVENT_PATH") else @@ -205,7 +215,7 @@ jobs: - run: "echo Full E2E tests enabled." network-test-gate: - needs: [build, configure] + needs: [build, yarn-project-test, configure] if: github.ref_name == 'master' || contains(github.event.pull_request.labels.*.name, 'network-all') runs-on: ubuntu-20.04 steps: @@ -213,7 +223,7 @@ jobs: # all the non-bench end-to-end integration tests for aztec e2e: - needs: [build, e2e-test-gate, configure] + needs: [build, configure] if: needs.configure.outputs.non-docs == 'true' runs-on: ubuntu-20.04 strategy: @@ -230,7 +240,7 @@ jobs: runner=$(./scripts/ci/select_runner.sh ${{ matrix.test }}) echo "type=$runner" >> $GITHUB_OUTPUT - name: Setup and Test - timeout-minutes: 40 + timeout-minutes: 50 uses: ./.github/ensure-tester-with-images env: USERNAME: ${{ needs.configure.outputs.username }} @@ -657,7 +667,7 @@ jobs: with: concurrency_key: prover-client-test-x86 - name: "Prover Client Tests" - timeout-minutes: 40 + timeout-minutes: 60 run: earthly-ci --no-output ./yarn-project/+prover-client-test network-transfer-test: @@ -674,7 +684,7 @@ jobs: run: sudo shutdown -P 60 ; earthly-ci --no-output ./yarn-project/+network-test --test=./test-transfer.sh network-full-test: - needs: [network-test-gate, configure] + needs: [network-test-gate, network-transfer-test, configure] runs-on: ${{ needs.configure.outputs.username }}-x86 strategy: max-parallel: 1 @@ -746,10 +756,10 @@ jobs: values: 16-validators runner_type: 16core-tester-x86 timeout: 60 - - test: gating-passive.test.ts - values: 16-validators - runner_type: 16core-tester-x86 - timeout: 60 + # - test: gating-passive.test.ts + # values: 16-validators + # runner_type: 16core-tester-x86 + # timeout: 60 steps: - uses: actions/checkout@v4 with: { ref: "${{ env.GIT_COMMIT }}" } @@ -868,11 +878,26 @@ jobs: alert-comment-cc-users: "@ludamad @codygunton" max-items-in-chart: 50 - boxes-test: + boxes: needs: [e2e-test-gate, configure] runs-on: ${{ needs.configure.outputs.username }}-x86 + steps: + - uses: actions/checkout@v4 + with: { ref: "${{ github.event.pull_request.head.sha }}" } + - uses: ./.github/ci-setup-action + with: + concurrency_key: boxes-${{ matrix.box }}-${{ matrix.browser }} + - name: Build + working-directory: ./boxes + timeout-minutes: 40 + run: earthly-ci +export-boxes + + boxes-test: + needs: [boxes, configure] + runs-on: ${{ needs.configure.outputs.username }}-x86 strategy: fail-fast: false + max-parallel: 1 matrix: box: [vanilla, react] # intermittent issues with firefox https://github.com/AztecProtocol/aztec-packages/issues/6676 @@ -884,10 +909,6 @@ jobs: - uses: ./.github/ci-setup-action with: concurrency_key: boxes-${{ matrix.box }}-${{ matrix.browser }} - - name: Build - working-directory: ./boxes - timeout-minutes: 40 - run: earthly-ci +export-boxes - name: Box test working-directory: ./boxes timeout-minutes: 40 @@ -1062,7 +1083,7 @@ jobs: actions: write needs: - merge-check - if: github.event.pull_request.draft == false && !cancelled() && !true + if: github.event.pull_request.draft == false && !cancelled() steps: - name: Check for Rerun env: diff --git a/.github/workflows/devnet-deploy.yml b/.github/workflows/devnet-deploy.yml index 31f710afe03..83496bc3be0 100644 --- a/.github/workflows/devnet-deploy.yml +++ b/.github/workflows/devnet-deploy.yml @@ -13,6 +13,11 @@ on: description: The name of the secret which holds the boot node's contract deployment mnemonic required: true default: testnet-deployment-mnemonic + deployment_salt: + description: The salt to use for this deployment. Defaults to random + required: false + type: string + default: "" respect_tf_lock: description: Whether to respect the Terraform lock required: false @@ -39,6 +44,7 @@ jobs: values_file: release-devnet.yaml aztec_docker_image: ${{ github.event.inputs.aztec_docker_image }} deployment_mnemonic_secret_name: ${{ github.event.inputs.deployment_mnemonic_secret_name }} + deployment_salt: ${{ github.event.inputs.deployment_salt }} respect_tf_lock: ${{ github.event.inputs.respect_tf_lock }} secrets: GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }} diff --git a/.github/workflows/network-deploy.yml b/.github/workflows/network-deploy.yml index d8c8cb42375..5677fdea1ca 100644 --- a/.github/workflows/network-deploy.yml +++ b/.github/workflows/network-deploy.yml @@ -20,6 +20,11 @@ on: required: true type: string default: testnet-deployment-mnemonic + deployment_salt: + description: The salt to use for this deployment. Defaults to random + required: false + type: string + default: "" respect_tf_lock: description: Whether to respect the Terraform lock required: false @@ -53,6 +58,10 @@ on: description: The name of the secret which holds the boot node's contract deployment mnemonic required: true default: testnet-deployment-mnemonic + deployment_salt: + description: The salt to use for this deployment. Defaults to random + required: false + default: "" respect_tf_lock: description: Whether to respect the Terraform lock required: false @@ -82,6 +91,7 @@ jobs: NAMESPACE: ${{ inputs.namespace }} VALUES_FILE: ${{ inputs.values_file }} DEPLOYMENT_MNEMONIC_SECRET_NAME: ${{ inputs.deployment_mnemonic_secret_name }} + DEPLOYMENT_SALT: ${{ inputs.deployment_salt }} CHART_PATH: ./spartan/aztec-network CLUSTER_NAME: aztec-gke REGION: us-west1-a @@ -161,6 +171,7 @@ jobs: -var="GKE_CLUSTER_CONTEXT=${{ env.GKE_CLUSTER_CONTEXT }}" \ -var="AZTEC_DOCKER_IMAGE=${{ env.AZTEC_DOCKER_IMAGE }}" \ -var="L1_DEPLOYMENT_MNEMONIC=${{ steps.get-mnemonic.outputs.mnemonic }}" \ + -var="L1_DEPLOYMENT_SALT=${DEPLOYMENT_SALT:-$RANDOM}" \ -out=tfplan \ -lock=${{ inputs.respect_tf_lock }} diff --git a/.github/workflows/publish-aztec-packages.yml b/.github/workflows/publish-aztec-packages.yml index 9da6aad1589..9ef92456560 100644 --- a/.github/workflows/publish-aztec-packages.yml +++ b/.github/workflows/publish-aztec-packages.yml @@ -211,7 +211,7 @@ jobs: - name: Publish aztec manifests if: ${{ env.SHOULD_PUBLISH_DOCKER_IMAGES == 'true' }} run: | - if [ "${{ github.ref_name }}" == "release/*" ]; then + if [[ "${{ github.ref_name }}" =~ ^release/ ]]; then TAG="${{ github.ref_name }}" VERSION="${TAG#release/}" DIST_TAG=devnet @@ -282,7 +282,7 @@ jobs: - name: Set tags and versions id: version_step run: | - if [ "${{ github.ref_name }}" == "release/*" ]; then + if [[ "${{ github.ref_name }}" =~ ^release/ ]]; then DIST_TAG=devnet TAG=${{ env.DEPLOY_TAG }} VERSION=${TAG#aztec-packages-v}-devnet @@ -356,7 +356,7 @@ jobs: - name: Publish aztec-up working-directory: ./aztec-up/terraform run: | - if [ "${{ github.ref_name }}" == "release/*" ]; then + if [[ "${{ github.ref_name }}" =~ ^release/ ]]; then TAG="${{ github.ref_name }}" VERSION="${TAG#release/}" elif [ -n "${{ env.DEPLOY_TAG }}" ]; then diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 3a0defae122..9bf68adabd9 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -5,7 +5,6 @@ on: push: branches: - master - - "release/*" permissions: contents: write diff --git a/.noir-sync-commit b/.noir-sync-commit index 29560ec9797..a6780a1e9ef 100644 --- a/.noir-sync-commit +++ b/.noir-sync-commit @@ -1 +1 @@ -6d0f86ba389a5b59b1d7fdcadcbce3e40eecaa48 +f337992de96ef656681ebfc96a30c2c9c9b82a70 \ No newline at end of file diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 9b0c023a62d..8ce7b21d8c6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,7 +1,7 @@ { - ".": "0.66.0", + ".": "0.67.1", "yarn-project/cli": "0.35.1", - "yarn-project/aztec": "0.66.0", - "barretenberg": "0.66.0", - "barretenberg/ts": "0.66.0" + "yarn-project/aztec": "0.67.1", + "barretenberg": "0.67.1", + "barretenberg/ts": "0.67.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index d98f25dc01f..54fb5c843e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,264 @@ # Changelog +## [0.67.1](https://github.com/AztecProtocol/aztec-packages/compare/aztec-packages-v0.67.0...aztec-packages-v0.67.1) (2024-12-17) + + +### Features + +* `nargo test -q` (or `nargo test --format terse`) (https://github.com/noir-lang/noir/pull/6776) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Add `(x | 1)` optimization for booleans (https://github.com/noir-lang/noir/pull/6795) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Add `nargo test --format json` (https://github.com/noir-lang/noir/pull/6796) ([d74d0fc](https://github.com/AztecProtocol/aztec-packages/commit/d74d0fcec24c533abc28320302e027470843e80c)) +* Add tree equality assertions ([#10756](https://github.com/AztecProtocol/aztec-packages/issues/10756)) ([923826a](https://github.com/AztecProtocol/aztec-packages/commit/923826a9d1bbed6739527a82b34d5610600eca1b)) +* **avm:** Migrate simulator memory to a map ([#10715](https://github.com/AztecProtocol/aztec-packages/issues/10715)) ([64d5f2b](https://github.com/AztecProtocol/aztec-packages/commit/64d5f2bd0dffe637fbff436ea651eb240256ab2c)), closes [#10370](https://github.com/AztecProtocol/aztec-packages/issues/10370) +* Better initialization for permutation mapping components ([#10750](https://github.com/AztecProtocol/aztec-packages/issues/10750)) ([1516d7f](https://github.com/AztecProtocol/aztec-packages/commit/1516d7f7bd6a2adbb650bd7cdd572b33db98dbfc)) +* Blobs 2. ([#10188](https://github.com/AztecProtocol/aztec-packages/issues/10188)) ([d0a4b2f](https://github.com/AztecProtocol/aztec-packages/commit/d0a4b2f011a25e59d5ef077cfefae4490ae1c263)) +* **blobs:** Add consensus client url to config ([#10059](https://github.com/AztecProtocol/aztec-packages/issues/10059)) ([1e15bf5](https://github.com/AztecProtocol/aztec-packages/commit/1e15bf58390f6c15afc3b430edd89b4c28137c2b)) +* Check max fees per gas ([#10283](https://github.com/AztecProtocol/aztec-packages/issues/10283)) ([4e59b06](https://github.com/AztecProtocol/aztec-packages/commit/4e59b06cd1956d43bc44a219448603b4bcf58d27)) +* **cli:** Verify `return` against ABI and `Prover.toml` (https://github.com/noir-lang/noir/pull/6765) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Don't store every block number in block indices DB ([#10658](https://github.com/AztecProtocol/aztec-packages/issues/10658)) ([a3fba84](https://github.com/AztecProtocol/aztec-packages/commit/a3fba8442fdd62f429054c3367984fd4206bbbeb)) +* Json output for get_node_info ([#10771](https://github.com/AztecProtocol/aztec-packages/issues/10771)) ([b086c52](https://github.com/AztecProtocol/aztec-packages/commit/b086c52110e5bc79a3d8eccbc2bc50cd68b3dc9b)) +* Leaf index requests to the native world state can now be performed as a batch query ([#10649](https://github.com/AztecProtocol/aztec-packages/issues/10649)) ([a437e73](https://github.com/AztecProtocol/aztec-packages/commit/a437e73558a936981f3eb3ba022b0770b75d9060)) +* New 17 in 20 IVC bench added to actions ([#10777](https://github.com/AztecProtocol/aztec-packages/issues/10777)) ([9fbcff6](https://github.com/AztecProtocol/aztec-packages/commit/9fbcff60a63e0eca14c4e28677aed1fc5e6f2c14)) +* Note hash management in the AVM ([#10666](https://github.com/AztecProtocol/aztec-packages/issues/10666)) ([e077980](https://github.com/AztecProtocol/aztec-packages/commit/e077980f8cce1fc7922c27d368b6dbced956aad2)) +* **p2p:** Activate gossipsub tx validators ([#10695](https://github.com/AztecProtocol/aztec-packages/issues/10695)) ([9cce2c6](https://github.com/AztecProtocol/aztec-packages/commit/9cce2c6fbae00008451940157690e0b5b99d9e59)) +* **p2p:** Attestation pool persistence ([#10667](https://github.com/AztecProtocol/aztec-packages/issues/10667)) ([dacef9f](https://github.com/AztecProtocol/aztec-packages/commit/dacef9f7f9f11c8ec35ecd333748a9ae8c24d428)) +* PXE browser proving ([#10704](https://github.com/AztecProtocol/aztec-packages/issues/10704)) ([46da3cc](https://github.com/AztecProtocol/aztec-packages/commit/46da3cc8a9c1c407a8ad2857695eea794e334efd)) +* **ssa:** Bring back tracking of RC instructions during DIE (https://github.com/noir-lang/noir/pull/6783) ([308c5ce](https://github.com/AztecProtocol/aztec-packages/commit/308c5cef519b68f5951750851124c0bf8f4ba7ee)) +* **ssa:** Hoist MakeArray instructions during loop invariant code motion (https://github.com/noir-lang/noir/pull/6782) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Sumcheck with disabled rows ([#10068](https://github.com/AztecProtocol/aztec-packages/issues/10068)) ([abd2226](https://github.com/AztecProtocol/aztec-packages/commit/abd2226da3a159e7efb7cbef099e41739f665ef1)) +* TXE detects duplicate nullifiers ([#10764](https://github.com/AztecProtocol/aztec-packages/issues/10764)) ([7f70110](https://github.com/AztecProtocol/aztec-packages/commit/7f701105c2ac44df9cafedc834d77d4eabd92710)) + + +### Bug Fixes + +* Always remove nullified notes ([#10722](https://github.com/AztecProtocol/aztec-packages/issues/10722)) ([5e4b46d](https://github.com/AztecProtocol/aztec-packages/commit/5e4b46d577ebf63114a5a5a1c5b6d2947d3b2567)) +* Avm gas and non-member ([#10709](https://github.com/AztecProtocol/aztec-packages/issues/10709)) ([dd8cc7b](https://github.com/AztecProtocol/aztec-packages/commit/dd8cc7b93119c0376873a366a8310d2ebd2641de)) +* AVM witgen track gas for nested calls and external halts ([#10731](https://github.com/AztecProtocol/aztec-packages/issues/10731)) ([b8bdb52](https://github.com/AztecProtocol/aztec-packages/commit/b8bdb529719c1f72244e904ea667462458a43317)) +* **bb.js:** Use globalThis instead of self ([#10747](https://github.com/AztecProtocol/aztec-packages/issues/10747)) ([309b5f7](https://github.com/AztecProtocol/aztec-packages/commit/309b5f74862089001e3159bdb52cbc8b60c71dc1)), closes [#10741](https://github.com/AztecProtocol/aztec-packages/issues/10741) +* Block building test timeout ([#10812](https://github.com/AztecProtocol/aztec-packages/issues/10812)) ([2cad3e5](https://github.com/AztecProtocol/aztec-packages/commit/2cad3e59765a67ed14158ce556433120e9efd809)) +* Cache ([#10692](https://github.com/AztecProtocol/aztec-packages/issues/10692)) ([1b1306c](https://github.com/AztecProtocol/aztec-packages/commit/1b1306c7dbd9d363181146e02181af4727779b42)) +* Casting vk to rawbuffer before wasm so it reads from the correct offset ([#10769](https://github.com/AztecProtocol/aztec-packages/issues/10769)) ([6a5bcfd](https://github.com/AztecProtocol/aztec-packages/commit/6a5bcfd2dc1a2bef6df2b93e9afa137a9b4ea315)) +* **ci:** Network-test timing ([#10725](https://github.com/AztecProtocol/aztec-packages/issues/10725)) ([9c9a2dc](https://github.com/AztecProtocol/aztec-packages/commit/9c9a2dcac8f7e14c1c5ec5d54d48a04a80284497)) +* Disable failure persistance in nargo test fuzzing (https://github.com/noir-lang/noir/pull/6777) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Get e2e jobs ([#10689](https://github.com/AztecProtocol/aztec-packages/issues/10689)) ([37e1999](https://github.com/AztecProtocol/aztec-packages/commit/37e1999f9f96271faa8cba2fda44858276266a0c)) +* Give build:fast a try in build ([#10702](https://github.com/AztecProtocol/aztec-packages/issues/10702)) ([32095f6](https://github.com/AztecProtocol/aztec-packages/commit/32095f63f4e1585e66251369e234c742aab0fa04)) +* Minimal change to avoid reverting entire PR [#6685](https://github.com/AztecProtocol/aztec-packages/issues/6685) (https://github.com/noir-lang/noir/pull/6778) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Optimizer to keep track of changing opcode locations (https://github.com/noir-lang/noir/pull/6781) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Race condition in block stream ([#10779](https://github.com/AztecProtocol/aztec-packages/issues/10779)) ([64bccd0](https://github.com/AztecProtocol/aztec-packages/commit/64bccd0e3423856aadc58890e6a689db4af08356)) +* Race condition when cleaning epoch proof quotes ([#10795](https://github.com/AztecProtocol/aztec-packages/issues/10795)) ([f540fbe](https://github.com/AztecProtocol/aztec-packages/commit/f540fbee724c2bfe29e0b0bca7759c721a8aaec8)) +* **testdata:** Relative path calculation ([#10791](https://github.com/AztecProtocol/aztec-packages/issues/10791)) ([5a530db](https://github.com/AztecProtocol/aztec-packages/commit/5a530db5c42743e6eff846669141527ae1344bfe)) +* Try fix e2e epochs in CI ([#10804](https://github.com/AztecProtocol/aztec-packages/issues/10804)) ([ba28788](https://github.com/AztecProtocol/aztec-packages/commit/ba28788de22b3209ec324633e91875b3b4b86332)) +* Use correct size for databus_id ([#10673](https://github.com/AztecProtocol/aztec-packages/issues/10673)) ([95eb658](https://github.com/AztecProtocol/aztec-packages/commit/95eb658f90687c75589b345f95a904d96e2a8e62)) +* Use extension in docs link so it also works on GitHub (https://github.com/noir-lang/noir/pull/6787) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Use throw instead of reject in broker facade ([#10735](https://github.com/AztecProtocol/aztec-packages/issues/10735)) ([cc6a72b](https://github.com/AztecProtocol/aztec-packages/commit/cc6a72be1c8dd5b133b5d82eac5224eef89d4ede)) + + +### Miscellaneous + +* `getLogsByTags` request batching in `syncTaggedLogs` ([#10716](https://github.com/AztecProtocol/aztec-packages/issues/10716)) ([bbbf38b](https://github.com/AztecProtocol/aztec-packages/commit/bbbf38b35c7f04414eeb7991a1ee45b19b16664f)) +* Add `Instruction::map_values_mut` (https://github.com/noir-lang/noir/pull/6756) ([308c5ce](https://github.com/AztecProtocol/aztec-packages/commit/308c5cef519b68f5951750851124c0bf8f4ba7ee)) +* Add errors to abis ([#10697](https://github.com/AztecProtocol/aztec-packages/issues/10697)) ([5c8e017](https://github.com/AztecProtocol/aztec-packages/commit/5c8e0174aade70c418a2d02cd9dc0ded3baa0745)) +* Add retries for prover node p2p test ([#10699](https://github.com/AztecProtocol/aztec-packages/issues/10699)) ([4115bf9](https://github.com/AztecProtocol/aztec-packages/commit/4115bf985108e183f8a57aaf76289326251b8c7b)) +* Add spans to proving job ([#10794](https://github.com/AztecProtocol/aztec-packages/issues/10794)) ([df3c51b](https://github.com/AztecProtocol/aztec-packages/commit/df3c51bfdb9770a95f6223fc85baf8632ca93279)) +* Average alerts across namespace for 1 hour ([#10827](https://github.com/AztecProtocol/aztec-packages/issues/10827)) ([962a7a2](https://github.com/AztecProtocol/aztec-packages/commit/962a7a25d71d208992b16fcfd21e86874db5ec05)) +* **avm:** Disable fake avm recursive verifier from the public base rollup ([#10690](https://github.com/AztecProtocol/aztec-packages/issues/10690)) ([b6c9c41](https://github.com/AztecProtocol/aztec-packages/commit/b6c9c4141b4ca6b1fc847068d352ee17590dea09)) +* **avm:** Radix opcode - remove immediates ([#10696](https://github.com/AztecProtocol/aztec-packages/issues/10696)) ([4ac13e6](https://github.com/AztecProtocol/aztec-packages/commit/4ac13e642c958392ce5606684c044ea014325e26)), closes [#10371](https://github.com/AztecProtocol/aztec-packages/issues/10371) +* Better reqresp logging + handle empty responses in snappy ([#10657](https://github.com/AztecProtocol/aztec-packages/issues/10657)) ([934107f](https://github.com/AztecProtocol/aztec-packages/commit/934107f35c2f2772ad422bfa34357bbd64f5049d)) +* Bump metrics and node pool ([#10745](https://github.com/AztecProtocol/aztec-packages/issues/10745)) ([9bb88bf](https://github.com/AztecProtocol/aztec-packages/commit/9bb88bf323e68f42f34cba74ec270681d76d9bd4)) +* Change Id to use a u32 (https://github.com/noir-lang/noir/pull/6807) ([d74d0fc](https://github.com/AztecProtocol/aztec-packages/commit/d74d0fcec24c533abc28320302e027470843e80c)) +* **ci:** Active rollup circuits in compilation report (https://github.com/noir-lang/noir/pull/6813) ([308c5ce](https://github.com/AztecProtocol/aztec-packages/commit/308c5cef519b68f5951750851124c0bf8f4ba7ee)) +* **ci:** Add bloblib to external checks (https://github.com/noir-lang/noir/pull/6818) ([381b0b8](https://github.com/AztecProtocol/aztec-packages/commit/381b0b84d87dd31f8ab5a3e62928f9992837d4c0)) +* Cleanup after e2e tests ([#10748](https://github.com/AztecProtocol/aztec-packages/issues/10748)) ([284b0a4](https://github.com/AztecProtocol/aztec-packages/commit/284b0a496f42813b956e55fbcd41c864dd278241)) +* Disable ARM CI ([#10682](https://github.com/AztecProtocol/aztec-packages/issues/10682)) ([b16945b](https://github.com/AztecProtocol/aztec-packages/commit/b16945b9c9e26d8de5502f698d2bd71e22c53807)) +* Do not print entire functions when running debug trace (https://github.com/noir-lang/noir/pull/6814) ([308c5ce](https://github.com/AztecProtocol/aztec-packages/commit/308c5cef519b68f5951750851124c0bf8f4ba7ee)) +* **docs:** Update migration notes ([#10829](https://github.com/AztecProtocol/aztec-packages/issues/10829)) ([be7cadf](https://github.com/AztecProtocol/aztec-packages/commit/be7cadf12d25042d39e6a500ae32a5002102d3da)) +* **docs:** Workaround (https://github.com/noir-lang/noir/pull/6819) ([381b0b8](https://github.com/AztecProtocol/aztec-packages/commit/381b0b84d87dd31f8ab5a3e62928f9992837d4c0)) +* Granular CLI imports to reduce start time ([#10778](https://github.com/AztecProtocol/aztec-packages/issues/10778)) ([e2fd046](https://github.com/AztecProtocol/aztec-packages/commit/e2fd046250664cd785269a718b036c0310dfcda7)) +* Log error in retry module ([#10719](https://github.com/AztecProtocol/aztec-packages/issues/10719)) ([84ea539](https://github.com/AztecProtocol/aztec-packages/commit/84ea539145173a88bddfdc617051f16a7aba9834)) +* Manage call stacks using a tree (https://github.com/noir-lang/noir/pull/6791) ([381b0b8](https://github.com/AztecProtocol/aztec-packages/commit/381b0b84d87dd31f8ab5a3e62928f9992837d4c0)) +* Move decider PK allocation to methods ([#10670](https://github.com/AztecProtocol/aztec-packages/issues/10670)) ([1ab9e30](https://github.com/AztecProtocol/aztec-packages/commit/1ab9e30d339cfd7a80f333e408c367c1f8bf49f8)) +* **p2p:** Move services into folders ([#10694](https://github.com/AztecProtocol/aztec-packages/issues/10694)) ([e28d12a](https://github.com/AztecProtocol/aztec-packages/commit/e28d12a3cdb182c905995a5ece4cc1b3d1d09482)) +* **prover:** Prover node should not gossip attestations ([#10672](https://github.com/AztecProtocol/aztec-packages/issues/10672)) ([41fc0f0](https://github.com/AztecProtocol/aztec-packages/commit/41fc0f047a6412b824dc33b49cf8fd98c99598aa)) +* Remove default export for noir contracts js ([#10762](https://github.com/AztecProtocol/aztec-packages/issues/10762)) ([c8e7763](https://github.com/AztecProtocol/aztec-packages/commit/c8e77639bf7f30dffe98ae335d5d1137da838e55)) +* Remove sinon in favor of a date provider ([#10705](https://github.com/AztecProtocol/aztec-packages/issues/10705)) ([3d3fabb](https://github.com/AztecProtocol/aztec-packages/commit/3d3fabb38b160c7f98636d0f4d7c6d3c22c6227e)) +* Remove spurious echo ([#10774](https://github.com/AztecProtocol/aztec-packages/issues/10774)) ([5538f8c](https://github.com/AztecProtocol/aztec-packages/commit/5538f8cfc94f617a5604706b53357f9018af1096)) +* Replace relative paths to noir-protocol-circuits ([f85fa3f](https://github.com/AztecProtocol/aztec-packages/commit/f85fa3f9078fc4f3626c564e06161bf9398e87a4)) +* Replace relative paths to noir-protocol-circuits ([b19c561](https://github.com/AztecProtocol/aztec-packages/commit/b19c56154d32050affa786620f95459bb5c29a6e)) +* Set max txs in spam test ([#10717](https://github.com/AztecProtocol/aztec-packages/issues/10717)) ([a50ff6c](https://github.com/AztecProtocol/aztec-packages/commit/a50ff6cf968f459ae09620d0e5b2e955ea56512f)) +* Slack notifications for networks ([#10784](https://github.com/AztecProtocol/aztec-packages/issues/10784)) ([bab9f85](https://github.com/AztecProtocol/aztec-packages/commit/bab9f852c08f29f022bf526aacb8350732fcf4ac)) +* Split up protocol contract artifacts ([#10765](https://github.com/AztecProtocol/aztec-packages/issues/10765)) ([5a9ca18](https://github.com/AztecProtocol/aztec-packages/commit/5a9ca18ceee03ca2175605d1029153a7bf228ea9)) +* **ssa:** Activate loop invariant code motion on ACIR functions (https://github.com/noir-lang/noir/pull/6785) ([8956e28](https://github.com/AztecProtocol/aztec-packages/commit/8956e28269a045732e733b5197bdab5e46cdf354)) +* Sync grafana dashboard ([#10792](https://github.com/AztecProtocol/aztec-packages/issues/10792)) ([421fb65](https://github.com/AztecProtocol/aztec-packages/commit/421fb65d9f14b86df281b0d0dc0934859aa924bc)) +* Tagging cleanup ([#10675](https://github.com/AztecProtocol/aztec-packages/issues/10675)) ([52b541a](https://github.com/AztecProtocol/aztec-packages/commit/52b541ab4e6295aea199a2181575208f20eaa7fc)) +* Trace and handle errors in running promises ([#10645](https://github.com/AztecProtocol/aztec-packages/issues/10645)) ([4cc0a6d](https://github.com/AztecProtocol/aztec-packages/commit/4cc0a6d832e6ee1c3fcc6876517ed3f743f59d4b)) +* Update external joiner script for new networks ([#10810](https://github.com/AztecProtocol/aztec-packages/issues/10810)) ([5f11cf4](https://github.com/AztecProtocol/aztec-packages/commit/5f11cf4bdc51fd21b8bd219ad1e81bf3afe585d9)) + +## [0.67.0](https://github.com/AztecProtocol/aztec-packages/compare/aztec-packages-v0.66.0...aztec-packages-v0.67.0) (2024-12-13) + + +### ⚠ BREAKING CHANGES + +* **stdlib:** Remove Schnorr (https://github.com/noir-lang/noir/pull/6749) +* lower public tx gas limit to 6M ([#10635](https://github.com/AztecProtocol/aztec-packages/issues/10635)) +* l2 gas maximum is per-TX-public-portion. AVM startup gas is now 20k. ([#10214](https://github.com/AztecProtocol/aztec-packages/issues/10214)) +* rm outgoing logs ([#10486](https://github.com/AztecProtocol/aztec-packages/issues/10486)) +* rename Header to BlockHeader ([#10372](https://github.com/AztecProtocol/aztec-packages/issues/10372)) +* several format string fixes and improvements (https://github.com/noir-lang/noir/pull/6703) + +### Features + +* `std::hint::black_box` function. (https://github.com/noir-lang/noir/pull/6529) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Add rollup circuit sample inputs ([#10608](https://github.com/AztecProtocol/aztec-packages/issues/10608)) ([775b459](https://github.com/AztecProtocol/aztec-packages/commit/775b459d0423e6dfe79e2b1a24e195fd61750171)) +* Add verify proof calls to private kernels ([#10533](https://github.com/AztecProtocol/aztec-packages/issues/10533)) ([ce0eee0](https://github.com/AztecProtocol/aztec-packages/commit/ce0eee0ef4a2084ec74b6dae0a75d18af5877ef8)) +* Adding fuzzer for ultra bigfield and relaxing ultra circuit checker ([#10433](https://github.com/AztecProtocol/aztec-packages/issues/10433)) ([da4c47c](https://github.com/AztecProtocol/aztec-packages/commit/da4c47c5dc8caea3e860ac15a58b9ff7f011e4f6)) +* Allow making range queries to prometheus in tests ([f9810cc](https://github.com/AztecProtocol/aztec-packages/commit/f9810cc48f7379a0c02c76d8fc897d3ffc9d6ad8)) +* Allow metrics to be instantly flushed ([f9810cc](https://github.com/AztecProtocol/aztec-packages/commit/f9810cc48f7379a0c02c76d8fc897d3ffc9d6ad8)) +* AVM inserts fee write on txs with public calls ([#10394](https://github.com/AztecProtocol/aztec-packages/issues/10394)) ([98ba747](https://github.com/AztecProtocol/aztec-packages/commit/98ba7475ac0130dac4424a2f5cabdbe37eba5cc8)) +* **ci:** Initial compilation report on test_programs (https://github.com/noir-lang/noir/pull/6731) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* CIVC browser proveThenVerify ([#10431](https://github.com/AztecProtocol/aztec-packages/issues/10431)) ([8c064d4](https://github.com/AztecProtocol/aztec-packages/commit/8c064d484c686fdf00a100f65f1f740be4ef13cb)) +* Cli wallet improvements ([#10425](https://github.com/AztecProtocol/aztec-packages/issues/10425)) ([cc8bd80](https://github.com/AztecProtocol/aztec-packages/commit/cc8bd80730f7ec269be9282d0e90fc2b6dc6561a)) +* **cli:** Run command on the package closest to the current directory (https://github.com/noir-lang/noir/pull/6752) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* DB Metrics now use labels for easier querying ([#10572](https://github.com/AztecProtocol/aztec-packages/issues/10572)) ([adadfa5](https://github.com/AztecProtocol/aztec-packages/commit/adadfa5be51a33d6b089c59d3bad5d46073f8bc3)) +* Deploy a network using master each night night ([#10536](https://github.com/AztecProtocol/aztec-packages/issues/10536)) ([015ec0e](https://github.com/AztecProtocol/aztec-packages/commit/015ec0e506f76610e8378a5ad223a9c0185f78c9)), closes [#10474](https://github.com/AztecProtocol/aztec-packages/issues/10474) [#10473](https://github.com/AztecProtocol/aztec-packages/issues/10473) +* Deploy faucet ([#10580](https://github.com/AztecProtocol/aztec-packages/issues/10580)) ([09e95a1](https://github.com/AztecProtocol/aztec-packages/commit/09e95a1d033deb5c31d9967d5100a6aeb8485ab5)) +* Do not make unique revertible note hashes in the private kernels ([#10524](https://github.com/AztecProtocol/aztec-packages/issues/10524)) ([d327da1](https://github.com/AztecProtocol/aztec-packages/commit/d327da1aeac530e8497e3d21a25152bd920797e2)) +* Emulating blocks and correct (non-partial) note discovery in txe ([#10356](https://github.com/AztecProtocol/aztec-packages/issues/10356)) ([6f209fb](https://github.com/AztecProtocol/aztec-packages/commit/6f209fb69fcce868c6e0fe9b79b5ac3f3a1e5c48)) +* Expose P2P service API and clean up logs ([#10552](https://github.com/AztecProtocol/aztec-packages/issues/10552)) ([98cea58](https://github.com/AztecProtocol/aztec-packages/commit/98cea58dd9c7a4518daa8e625dd794a2b6f4b314)), closes [#10299](https://github.com/AztecProtocol/aztec-packages/issues/10299) +* GETCONTRACTINSTANCE and bytecode retrieval perform nullifier membership checks ([#10445](https://github.com/AztecProtocol/aztec-packages/issues/10445)) ([9301253](https://github.com/AztecProtocol/aztec-packages/commit/9301253f0488e6d96ed12a8c9bde72a653aa7d36)), closes [#10377](https://github.com/AztecProtocol/aztec-packages/issues/10377) [#10379](https://github.com/AztecProtocol/aztec-packages/issues/10379) +* Handle nested calls in witgen ([#10384](https://github.com/AztecProtocol/aztec-packages/issues/10384)) ([1e21f31](https://github.com/AztecProtocol/aztec-packages/commit/1e21f31d430947f48dc9f5e52d0deb1af70ee705)) +* Keccak honk proving in bb.js ([#10489](https://github.com/AztecProtocol/aztec-packages/issues/10489)) ([e0d7431](https://github.com/AztecProtocol/aztec-packages/commit/e0d743121674bcfdd73f84836c17645a5bc2df92)) +* Metrics via terraform ([#10594](https://github.com/AztecProtocol/aztec-packages/issues/10594)) ([e21069d](https://github.com/AztecProtocol/aztec-packages/commit/e21069db0b3fcdf5665b62bb821a5a1d2abe2cee)), closes [#10191](https://github.com/AztecProtocol/aztec-packages/issues/10191) [#10439](https://github.com/AztecProtocol/aztec-packages/issues/10439) +* Modify HonkRecursionConstraint to handle IPA claims ([#10469](https://github.com/AztecProtocol/aztec-packages/issues/10469)) ([a204d1b](https://github.com/AztecProtocol/aztec-packages/commit/a204d1b60514d6321c2db5063375cc2bbd507fe8)) +* Order attribute execution by their source ordering (https://github.com/noir-lang/noir/pull/6326) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Persistence in helm chart for validator and boot node ([#10543](https://github.com/AztecProtocol/aztec-packages/issues/10543)) ([f9810cc](https://github.com/AztecProtocol/aztec-packages/commit/f9810cc48f7379a0c02c76d8fc897d3ffc9d6ad8)) +* Prover-client exec timing analysis scripts. ([82434a2](https://github.com/AztecProtocol/aztec-packages/commit/82434a296f267d517032b5c9b092d787c64af7bc)) +* PXE in the browser ([#10353](https://github.com/AztecProtocol/aztec-packages/issues/10353)) ([676f673](https://github.com/AztecProtocol/aztec-packages/commit/676f673dfbcb14f5351a0068aef9ad9fa4ebf879)) +* PXE sync on demand ([#10613](https://github.com/AztecProtocol/aztec-packages/issues/10613)) ([b2f1159](https://github.com/AztecProtocol/aztec-packages/commit/b2f11596e5c79be0c11ad298e734885e9657e640)) +* Remove auto verify mode from ClientIVC ([#10599](https://github.com/AztecProtocol/aztec-packages/issues/10599)) ([b1d8b97](https://github.com/AztecProtocol/aztec-packages/commit/b1d8b978871948fbba639476465f4de6fb471292)) +* Rename Header to BlockHeader ([#10372](https://github.com/AztecProtocol/aztec-packages/issues/10372)) ([0803964](https://github.com/AztecProtocol/aztec-packages/commit/0803964015492db81001c17252aa4b724e43797b)) +* Rm outgoing logs ([#10486](https://github.com/AztecProtocol/aztec-packages/issues/10486)) ([c28beec](https://github.com/AztecProtocol/aztec-packages/commit/c28beec5014b14b7ea0b1f00d1642aab807fad87)) +* Sayonara old hints ([#10547](https://github.com/AztecProtocol/aztec-packages/issues/10547)) ([dede16e](https://github.com/AztecProtocol/aztec-packages/commit/dede16e035115e1c6971079d12f62e3046407b36)) +* Several `nargo test` improvements (https://github.com/noir-lang/noir/pull/6728) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Several Updates in SMT verification module (part 1) ([#10437](https://github.com/AztecProtocol/aztec-packages/issues/10437)) ([0c37672](https://github.com/AztecProtocol/aztec-packages/commit/0c376725a29ec18e25a7c9a89c0df8f5a1e06ff4)) +* **ssa:** Implement missing brillig constraints SSA check (https://github.com/noir-lang/noir/pull/6658) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Sync from aztec-packages (https://github.com/noir-lang/noir/pull/6730) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* **test:** Check that `nargo::ops::transform_program` is idempotent (https://github.com/noir-lang/noir/pull/6694) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Unified create circuit from acir ([#10440](https://github.com/AztecProtocol/aztec-packages/issues/10440)) ([a4dfe13](https://github.com/AztecProtocol/aztec-packages/commit/a4dfe13c1c0af3d527f5c9b2fcc38fe059e9bc38)) +* Update and generate test Prover.tomls for protocol circuits ([#10659](https://github.com/AztecProtocol/aztec-packages/issues/10659)) ([eb5f18a](https://github.com/AztecProtocol/aztec-packages/commit/eb5f18a439c06afcbd90f5ea6339596a84ba4e8a)) + + +### Bug Fixes + +* [#10473](https://github.com/AztecProtocol/aztec-packages/issues/10473) ([015ec0e](https://github.com/AztecProtocol/aztec-packages/commit/015ec0e506f76610e8378a5ad223a9c0185f78c9)) +* [#10474](https://github.com/AztecProtocol/aztec-packages/issues/10474) ([015ec0e](https://github.com/AztecProtocol/aztec-packages/commit/015ec0e506f76610e8378a5ad223a9c0185f78c9)) +* Allow empty loop headers (https://github.com/noir-lang/noir/pull/6736) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Always respect aztec image pull policy ([#10617](https://github.com/AztecProtocol/aztec-packages/issues/10617)) ([e7686f1](https://github.com/AztecProtocol/aztec-packages/commit/e7686f11811d1bd7cd6752116416687721dd62ed)) +* Attempt to fix flake in e2e cross chain messaging test ([#10634](https://github.com/AztecProtocol/aztec-packages/issues/10634)) ([a69502c](https://github.com/AztecProtocol/aztec-packages/commit/a69502c3bd177a5ae502b7b9d13f260ffe19314e)) +* Bad merge on boxes ([#10579](https://github.com/AztecProtocol/aztec-packages/issues/10579)) ([9b26651](https://github.com/AztecProtocol/aztec-packages/commit/9b266516d706ef0ab371e21bf622420b228bf94e)) +* Boxes webpack config ([#10548](https://github.com/AztecProtocol/aztec-packages/issues/10548)) ([49f9418](https://github.com/AztecProtocol/aztec-packages/commit/49f941848ce1d42530c56e2941de6133ab852c14)) +* Bump hard coded SRS size for wasm from 2^19 to 2^10 ([#10596](https://github.com/AztecProtocol/aztec-packages/issues/10596)) ([a37f82d](https://github.com/AztecProtocol/aztec-packages/commit/a37f82d2ed6a4512eb38f8fa576f52a06ddbdfba)) +* Bump timeout for failing data store tests ([#10639](https://github.com/AztecProtocol/aztec-packages/issues/10639)) ([c75fee0](https://github.com/AztecProtocol/aztec-packages/commit/c75fee0ff34f5019ffc55d424089724a66182a6b)) +* Correct size in bytes of a complete address ([#10574](https://github.com/AztecProtocol/aztec-packages/issues/10574)) ([e72b988](https://github.com/AztecProtocol/aztec-packages/commit/e72b9889fe64dab5382b1352744f7ff4ac9884a1)) +* Destroy old masternet if we can ([#10584](https://github.com/AztecProtocol/aztec-packages/issues/10584)) ([679684d](https://github.com/AztecProtocol/aztec-packages/commit/679684da0e00799a6c861234f2a4c731c1d6fa61)) +* Do not attempt proof quote on empty epoch ([#10557](https://github.com/AztecProtocol/aztec-packages/issues/10557)) ([39d3bc2](https://github.com/AztecProtocol/aztec-packages/commit/39d3bc286ab7ac33a83f27e09df7dd1a482fadf4)) +* Do not load pino-pretty in production bundles ([#10578](https://github.com/AztecProtocol/aztec-packages/issues/10578)) ([e515e6e](https://github.com/AztecProtocol/aztec-packages/commit/e515e6e7644180bab72eb693d83b9496919cc159)) +* Do not merge expressions that contain output witnesses (https://github.com/noir-lang/noir/pull/6757) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Ensure LMDB store metrics have hard coded descriptions ([#10642](https://github.com/AztecProtocol/aztec-packages/issues/10642)) ([043e2c2](https://github.com/AztecProtocol/aztec-packages/commit/043e2c2ad3101a81a197f14307d9d8b1b9f699d3)) +* Formatting master ([#10583](https://github.com/AztecProtocol/aztec-packages/issues/10583)) ([79e49c9](https://github.com/AztecProtocol/aztec-packages/commit/79e49c9419ddd96cb0046c70bce527b289203d1f)) +* Git dependency trailing slash (https://github.com/noir-lang/noir/pull/6725) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* Improve type error when indexing a variable of unknown type (https://github.com/noir-lang/noir/pull/6744) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Link in README.md ([#10471](https://github.com/AztecProtocol/aztec-packages/issues/10471)) ([fca9600](https://github.com/AztecProtocol/aztec-packages/commit/fca96007d6055dcf00b72a46630c680fcb6d190d)) +* Log level not honored with multi transport ([#10643](https://github.com/AztecProtocol/aztec-packages/issues/10643)) ([e1e5864](https://github.com/AztecProtocol/aztec-packages/commit/e1e586479840b18f52f3218c499a476691d93e48)) +* Map entry point indexes after all ssa passes (https://github.com/noir-lang/noir/pull/6740) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Memory leak in the broker ([#10567](https://github.com/AztecProtocol/aztec-packages/issues/10567)) ([ecc037f](https://github.com/AztecProtocol/aztec-packages/commit/ecc037f31fc2a5a02484762fdf90302059b34502)) +* Mispelled aztec ([#10491](https://github.com/AztecProtocol/aztec-packages/issues/10491)) ([866a5f7](https://github.com/AztecProtocol/aztec-packages/commit/866a5f75ff4d4c9145fc00b269ff858e84b14c6c)) +* Parser would hand on function type with colon in it (https://github.com/noir-lang/noir/pull/6764) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Pass salt to deploy-l1-contracts.sh ([#10586](https://github.com/AztecProtocol/aztec-packages/issues/10586)) ([d6be2c8](https://github.com/AztecProtocol/aztec-packages/commit/d6be2c84ba94ca69fd99a186374edc68afe3ebd6)) +* Pod anti affinity spans all namespaces ([#10475](https://github.com/AztecProtocol/aztec-packages/issues/10475)) ([2d4dc3d](https://github.com/AztecProtocol/aztec-packages/commit/2d4dc3dffc98af0361b54f2884a8a0a9f496bed1)) +* Print ssa blocks without recursion (https://github.com/noir-lang/noir/pull/6715) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* Println("{{}}") was printing "{{}}" instead of "{}" (https://github.com/noir-lang/noir/pull/6745) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Properly trace storage reads to slots never written before in AVM ([#10560](https://github.com/AztecProtocol/aztec-packages/issues/10560)) ([410c730](https://github.com/AztecProtocol/aztec-packages/commit/410c730d31773ce1f290f403e53f1e405fe6feda)) +* Remove auto verify in cbind ivc prove ([#10627](https://github.com/AztecProtocol/aztec-packages/issues/10627)) ([d773423](https://github.com/AztecProtocol/aztec-packages/commit/d773423fb4c701d830ac2a732ab9bbc205396a63)) +* Remove otel collector endpoint ([#10604](https://github.com/AztecProtocol/aztec-packages/issues/10604)) ([276a82c](https://github.com/AztecProtocol/aztec-packages/commit/276a82c2f34101fee1d2b7526f50dd76663c56cb)) +* Sequencer negative histogram recodings ([#10490](https://github.com/AztecProtocol/aztec-packages/issues/10490)) ([623f3e2](https://github.com/AztecProtocol/aztec-packages/commit/623f3e240da5a1004b4b3fc025b17d9268482eb8)) +* Several format string fixes and improvements (https://github.com/noir-lang/noir/pull/6703) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* Simulation error enriching ([#10595](https://github.com/AztecProtocol/aztec-packages/issues/10595)) ([2c36088](https://github.com/AztecProtocol/aztec-packages/commit/2c36088c4009fef4054c2414bd50034b59e5f265)) +* Temporary fix for private kernel tail proving ([#10593](https://github.com/AztecProtocol/aztec-packages/issues/10593)) ([d194cdf](https://github.com/AztecProtocol/aztec-packages/commit/d194cdfeabe4d90f786b1ab36a093a27be9f71c3)) +* Track published bytecode ([#10636](https://github.com/AztecProtocol/aztec-packages/issues/10636)) ([cadb4ce](https://github.com/AztecProtocol/aztec-packages/commit/cadb4ce351fa83a55177e0cf50dadf09436b44a4)) +* Tweaking Fr and Fq fromString functionality to distinguish number-only strings ([#10529](https://github.com/AztecProtocol/aztec-packages/issues/10529)) ([736fce1](https://github.com/AztecProtocol/aztec-packages/commit/736fce1f77533925943ef363d1803b2e55f83609)) +* Use e2e structure in cbind ([#10585](https://github.com/AztecProtocol/aztec-packages/issues/10585)) ([985aef1](https://github.com/AztecProtocol/aztec-packages/commit/985aef16ce612a9d3d7ff27b87b871a01911002e)) + + +### Miscellaneous + +* Add a few regression tests for [#6674](https://github.com/AztecProtocol/aztec-packages/issues/6674) (https://github.com/noir-lang/noir/pull/6687) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* Add script to check for critical libraries supporting a given Noir version (https://github.com/noir-lang/noir/pull/6697) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* **avm:** Gas constants adjustment based on trace rows accounting ([#10614](https://github.com/AztecProtocol/aztec-packages/issues/10614)) ([fc729ef](https://github.com/AztecProtocol/aztec-packages/commit/fc729ef3af7ec33f48dbb9fae3820a59a4a26479)), closes [#10368](https://github.com/AztecProtocol/aztec-packages/issues/10368) +* **avm:** More pilcom compat changes ([#10569](https://github.com/AztecProtocol/aztec-packages/issues/10569)) ([f18d701](https://github.com/AztecProtocol/aztec-packages/commit/f18d701aa527c68a1adcc4b8acbb9c7bd239468a)) +* **avm:** Pilcom compatibility changes ([#10544](https://github.com/AztecProtocol/aztec-packages/issues/10544)) ([fbc8c0e](https://github.com/AztecProtocol/aztec-packages/commit/fbc8c0e864b10d2265373688457a33d61517bbb4)) +* **avm:** Reduce the number of gates for fake AVM recursive verifier ([#10619](https://github.com/AztecProtocol/aztec-packages/issues/10619)) ([0be44b2](https://github.com/AztecProtocol/aztec-packages/commit/0be44b2837c40e4332babc98f3c8bcc22bb0aa2f)) +* **avm:** Remove function selector from AvmExecutionEnvironment ([#10532](https://github.com/AztecProtocol/aztec-packages/issues/10532)) ([fef5f93](https://github.com/AztecProtocol/aztec-packages/commit/fef5f93c617640116bb0eea0fc64d7f230c7b763)) +* Boxes tests cause resource issues ([#10676](https://github.com/AztecProtocol/aztec-packages/issues/10676)) ([ccf1c78](https://github.com/AztecProtocol/aztec-packages/commit/ccf1c781c9658a486b6d05576641555f1de7f4ad)) +* Bump avm tree test timeout ([323e2eb](https://github.com/AztecProtocol/aztec-packages/commit/323e2ebcbd39ae49366b30f33c2fa499a65160bb)) +* Bump exp1 config to 48 validators ([#10577](https://github.com/AztecProtocol/aztec-packages/issues/10577)) ([0379718](https://github.com/AztecProtocol/aztec-packages/commit/03797181c72443a5a4aa4ce96df99e2517325f57)) +* Bump jest default test timeout to 30s ([#10550](https://github.com/AztecProtocol/aztec-packages/issues/10550)) ([841bf48](https://github.com/AztecProtocol/aztec-packages/commit/841bf48c27767c3a4a53aacd0115582e8397910f)) +* Bump mocha timeout ([#10571](https://github.com/AztecProtocol/aztec-packages/issues/10571)) ([35e525f](https://github.com/AztecProtocol/aztec-packages/commit/35e525fc9689718adecd49d3bd9e12c14640278d)) +* Bump proven timeout ([#10680](https://github.com/AztecProtocol/aztec-packages/issues/10680)) ([3f5cf6c](https://github.com/AztecProtocol/aztec-packages/commit/3f5cf6c0cb8340c9db5f1cb9c968d824fa95936f)) +* Bump prover agents ([#10626](https://github.com/AztecProtocol/aztec-packages/issues/10626)) ([64eea72](https://github.com/AztecProtocol/aztec-packages/commit/64eea721e3bba20b72c5f6d8922abc2a48c2ed65)) +* **ci:** Extend compiler memory report to external repos (https://github.com/noir-lang/noir/pull/6768) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* **ci:** Handle external libraries in compilation timing report (https://github.com/noir-lang/noir/pull/6750) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* **ci:** Prune launch templates job ([#10561](https://github.com/AztecProtocol/aztec-packages/issues/10561)) ([d6e4f4c](https://github.com/AztecProtocol/aztec-packages/commit/d6e4f4c9d5ca0f3fa9a0074e5c196c04c6d244e7)) +* **ci:** Reenable `rerun-check` job ([#10653](https://github.com/AztecProtocol/aztec-packages/issues/10653)) ([b2c4f48](https://github.com/AztecProtocol/aztec-packages/commit/b2c4f48db6bed6f0205a56d8df88ff8e1b02aafd)) +* Cleanup unrolling pass (https://github.com/noir-lang/noir/pull/6743) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Disable broken test ([#10663](https://github.com/AztecProtocol/aztec-packages/issues/10663)) ([0771260](https://github.com/AztecProtocol/aztec-packages/commit/0771260db2d2026f1ad9bdcb5ba71bdca1424fa7)) +* Disable ivc integration yarn tests ([#10625](https://github.com/AztecProtocol/aztec-packages/issues/10625)) ([7c50107](https://github.com/AztecProtocol/aztec-packages/commit/7c5010759f98aab2ee15325d8cbd8f2091aa6df0)) +* **docs:** Update branding (https://github.com/noir-lang/noir/pull/6759) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Documenting convenient redirect to the spartan creator ([#10565](https://github.com/AztecProtocol/aztec-packages/issues/10565)) ([b94b8ee](https://github.com/AztecProtocol/aztec-packages/commit/b94b8eeaa24edc099472e205c5031c1096bf1f56)) +* Enable nightly tests ([#10542](https://github.com/AztecProtocol/aztec-packages/issues/10542)) ([4fa068c](https://github.com/AztecProtocol/aztec-packages/commit/4fa068c692872b0fa2a1043a2f9e0984fd3c0e3d)) +* Faucet LB if public, proving devnet ([#10665](https://github.com/AztecProtocol/aztec-packages/issues/10665)) ([996d921](https://github.com/AztecProtocol/aztec-packages/commit/996d9214aaf67d48673bab6554fafbc794e7afa2)) +* Fix build issue from bad merge ([85c0676](https://github.com/AztecProtocol/aztec-packages/commit/85c0676647d9f8f7b2bceaf5f2da011b794abf68)) +* Fix migration notes ([#10656](https://github.com/AztecProtocol/aztec-packages/issues/10656)) ([333d6ce](https://github.com/AztecProtocol/aztec-packages/commit/333d6ceffaab6e0be505a8f6214eb838846dcda4)) +* Fix public keys deserialization ([#10647](https://github.com/AztecProtocol/aztec-packages/issues/10647)) ([12473c8](https://github.com/AztecProtocol/aztec-packages/commit/12473c85a073ef1a25f4f70881f77f3c08f41252)) +* Flush archiver metrics on startup ([f9810cc](https://github.com/AztecProtocol/aztec-packages/commit/f9810cc48f7379a0c02c76d8fc897d3ffc9d6ad8)) +* Free memory for silenced warnings early (https://github.com/noir-lang/noir/pull/6748) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Give validators/boot-nodes 100Gi in network configs ([f9810cc](https://github.com/AztecProtocol/aztec-packages/commit/f9810cc48f7379a0c02c76d8fc897d3ffc9d6ad8)) +* Handle errors in e2e teardown to fix e2e token ([#10590](https://github.com/AztecProtocol/aztec-packages/issues/10590)) ([5d4cdc1](https://github.com/AztecProtocol/aztec-packages/commit/5d4cdc11977ea2af5e465092ce9e635414c13710)) +* Increase test timeout to reduce flakes ([#10641](https://github.com/AztecProtocol/aztec-packages/issues/10641)) ([4ade2ad](https://github.com/AztecProtocol/aztec-packages/commit/4ade2ad6ab6d5306ba236457f0373122cc4b8fef)) +* Inject k8s pod name and uid ([#10633](https://github.com/AztecProtocol/aztec-packages/issues/10633)) ([eb472ff](https://github.com/AztecProtocol/aztec-packages/commit/eb472ff8ef38f1045d2c586ad74b4c8774771ac0)) +* L2 gas maximum is per-TX-public-portion. AVM startup gas is now 20k. ([#10214](https://github.com/AztecProtocol/aztec-packages/issues/10214)) ([1365401](https://github.com/AztecProtocol/aztec-packages/commit/1365401cb379d7206e268dc01a33110cecae7293)) +* Load balancers for the boot node, longer epochs ([#10632](https://github.com/AztecProtocol/aztec-packages/issues/10632)) ([001bbb1](https://github.com/AztecProtocol/aztec-packages/commit/001bbb13c70df891f12d7dd1c67cc261d66e0c05)) +* Lock CI to use ubuntu 22.04 (https://github.com/noir-lang/noir/pull/6755) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Log when validator enters commitee ([#10615](https://github.com/AztecProtocol/aztec-packages/issues/10615)) ([7746a39](https://github.com/AztecProtocol/aztec-packages/commit/7746a395ed0f7488d80c6b37d451dc65f1b5938d)), closes [#10337](https://github.com/AztecProtocol/aztec-packages/issues/10337) +* Lower public tx gas limit to 6M ([#10635](https://github.com/AztecProtocol/aztec-packages/issues/10635)) ([9836036](https://github.com/AztecProtocol/aztec-packages/commit/9836036053f1b5f3e57bf4e19bf0eb1a692306bd)) +* Merge queue CI ([#10629](https://github.com/AztecProtocol/aztec-packages/issues/10629)) ([835e6fd](https://github.com/AztecProtocol/aztec-packages/commit/835e6fde9416ebcdf65b9c016f8e53885145e24c)) +* More bots for exp1 ([#10671](https://github.com/AztecProtocol/aztec-packages/issues/10671)) ([0ba2425](https://github.com/AztecProtocol/aztec-packages/commit/0ba242507e2e0c60cf0d9e8e2b1d1c92f31ebfc3)) +* More logs cleanup ([#10630](https://github.com/AztecProtocol/aztec-packages/issues/10630)) ([00c629c](https://github.com/AztecProtocol/aztec-packages/commit/00c629ca2a34c996968e2f52b697cbdeaff54a77)) +* Move some nr utils around ([#10553](https://github.com/AztecProtocol/aztec-packages/issues/10553)) ([d132f83](https://github.com/AztecProtocol/aztec-packages/commit/d132f83d595315565d54590bec69d25f7371559e)) +* Moving stuff from the aztec sequencer node guide into this README ([#10570](https://github.com/AztecProtocol/aztec-packages/issues/10570)) ([93b8b1b](https://github.com/AztecProtocol/aztec-packages/commit/93b8b1bcc5cc3e86b63f923005cb163db0c6cb2c)) +* Optimise grand product computation round based on active ranges ([#10460](https://github.com/AztecProtocol/aztec-packages/issues/10460)) ([7fa8f84](https://github.com/AztecProtocol/aztec-packages/commit/7fa8f844d9e389f8636118f1d3c3ecce707e771e)) +* Optimise older opcodes in reverse order (https://github.com/noir-lang/noir/pull/6476) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* Redo typo PR by Madmaxs2 (https://github.com/noir-lang/noir/pull/6721) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* Reduce bb_prover_full_rollup to a single block epoch test ([#10679](https://github.com/AztecProtocol/aztec-packages/issues/10679)) ([0c2a4d9](https://github.com/AztecProtocol/aztec-packages/commit/0c2a4d9198c48a94939ce1475d60d201415849ae)) +* Remove Proxy from json rpc client ([#10554](https://github.com/AztecProtocol/aztec-packages/issues/10554)) ([93b1c45](https://github.com/AztecProtocol/aztec-packages/commit/93b1c45f3d6b6be9db8c0604c285a7d5d0e3960a)) +* Remove warnings from protocol circuits ([#10556](https://github.com/AztecProtocol/aztec-packages/issues/10556)) ([e065e05](https://github.com/AztecProtocol/aztec-packages/commit/e065e0590f20ed13bed1d0756ea29781b1cabd95)) +* Rename logger modules ([#10404](https://github.com/AztecProtocol/aztec-packages/issues/10404)) ([7441767](https://github.com/AztecProtocol/aztec-packages/commit/7441767d7e8e7e7d602c447ca843dee43f8dc8f8)), closes [#10125](https://github.com/AztecProtocol/aztec-packages/issues/10125) +* Rename pxe script generate-package-info to generate ([#10534](https://github.com/AztecProtocol/aztec-packages/issues/10534)) ([ead9c0b](https://github.com/AztecProtocol/aztec-packages/commit/ead9c0b3f43ffb707b5226a36544832ffcc7c910)) +* Replace relative paths to noir-protocol-circuits ([acfd5df](https://github.com/AztecProtocol/aztec-packages/commit/acfd5df121d67ed75b2b22fe4efba82afb8c5949)) +* Replace relative paths to noir-protocol-circuits ([6c0533f](https://github.com/AztecProtocol/aztec-packages/commit/6c0533f15d221a6792edc2495c4cd8f870112831)) +* Replace relative paths to noir-protocol-circuits ([a245b95](https://github.com/AztecProtocol/aztec-packages/commit/a245b951a22e1df61fdecf566888aebba3ae6f8a)) +* Replace relative paths to noir-protocol-circuits ([153c720](https://github.com/AztecProtocol/aztec-packages/commit/153c72003bcc31988b90f8666f140b0f21416ca5)) +* Replace relative paths to noir-protocol-circuits ([a080436](https://github.com/AztecProtocol/aztec-packages/commit/a08043697bf41ad5de4256c8c366e4b4ef183be4)) +* Replace relative paths to noir-protocol-circuits ([8419f5a](https://github.com/AztecProtocol/aztec-packages/commit/8419f5a22d43432368a1d445bf79c84bbb2d6161)) +* Secret derivation funcs naming cleanup ([#10637](https://github.com/AztecProtocol/aztec-packages/issues/10637)) ([5c50711](https://github.com/AztecProtocol/aztec-packages/commit/5c50711429b93f5eb63ba264af532abb81995b48)) +* Simplify MSM with constant folding (https://github.com/noir-lang/noir/pull/6650) ([f4ed66b](https://github.com/AztecProtocol/aztec-packages/commit/f4ed66b6535818dc87d69ff451bb6aaabd2df8ec)) +* **stdlib:** Remove Schnorr (https://github.com/noir-lang/noir/pull/6749) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Try replace callstack with a linked list (https://github.com/noir-lang/noir/pull/6747) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Tweak validator logs ([#10597](https://github.com/AztecProtocol/aztec-packages/issues/10597)) ([9eaa527](https://github.com/AztecProtocol/aztec-packages/commit/9eaa5278766da48fd4a1eba4b9b03a49290df1b8)) +* Unprove devnet ([#10683](https://github.com/AztecProtocol/aztec-packages/issues/10683)) ([1c92f77](https://github.com/AztecProtocol/aztec-packages/commit/1c92f77047f99ede7f6ab26684633d7eb26a97a3)) +* Update url to 2.5.4 (https://github.com/noir-lang/noir/pull/6741) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* Use `NumericType` not `Type` for casts and numeric constants (https://github.com/noir-lang/noir/pull/6769) ([3166529](https://github.com/AztecProtocol/aztec-packages/commit/31665296c94a221098a473426e3686e56b4b9e96)) +* **val:** Reject proposals not for the current or next slot ([#10450](https://github.com/AztecProtocol/aztec-packages/issues/10450)) ([27620f5](https://github.com/AztecProtocol/aztec-packages/commit/27620f5ccd7bb23cf9d8cb8a913386338c47a08c)) + ## [0.66.0](https://github.com/AztecProtocol/aztec-packages/compare/aztec-packages-v0.65.2...aztec-packages-v0.66.0) (2024-12-06) diff --git a/avm-transpiler/Cargo.lock b/avm-transpiler/Cargo.lock index 4da74e41190..6e6331abfd2 100644 --- a/avm-transpiler/Cargo.lock +++ b/avm-transpiler/Cargo.lock @@ -37,6 +37,7 @@ dependencies = [ "acir", "acvm_blackbox_solver", "brillig_vm", + "fxhash", "indexmap 1.9.3", "serde", "thiserror", @@ -393,6 +394,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "cc" version = "1.1.6" @@ -682,6 +689,15 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" diff --git a/avm-transpiler/src/transpile.rs b/avm-transpiler/src/transpile.rs index 79f4a3f02bb..d8b9c9509c9 100644 --- a/avm-transpiler/src/transpile.rs +++ b/avm-transpiler/src/transpile.rs @@ -1064,29 +1064,30 @@ fn handle_black_box_function(avm_instrs: &mut Vec, operation: &B ..Default::default() }); } - BlackBoxOp::ToRadix { input, radix, output, output_bits } => { - let num_limbs = output.size as u32; + BlackBoxOp::ToRadix { input, radix, output_pointer, num_limbs, output_bits } => { let input_offset = input.to_usize() as u32; - let output_offset = output.pointer.to_usize() as u32; let radix_offset = radix.to_usize() as u32; + let output_offset = output_pointer.to_usize() as u32; + let num_limbs_offset = num_limbs.to_usize() as u32; + let output_bits_offset = output_bits.to_usize() as u32; avm_instrs.push(AvmInstruction { opcode: AvmOpcode::TORADIXBE, indirect: Some( AddressingModeBuilder::default() .direct_operand(input) - .indirect_operand(&output.pointer) .direct_operand(radix) + .direct_operand(num_limbs) + .direct_operand(output_bits) + .indirect_operand(output_pointer) .build(), ), operands: vec![ AvmOperand::U16 { value: input_offset as u16 }, - AvmOperand::U16 { value: output_offset as u16 }, AvmOperand::U16 { value: radix_offset as u16 }, - ], - immediates: vec![ - AvmOperand::U16 { value: num_limbs as u16 }, - AvmOperand::U8 { value: *output_bits as u8 }, + AvmOperand::U16 { value: num_limbs_offset as u16 }, + AvmOperand::U16 { value: output_bits_offset as u16 }, + AvmOperand::U16 { value: output_offset as u16 }, ], ..Default::default() }); diff --git a/aztec-up/bin/docker-compose.sandbox.yml b/aztec-up/bin/docker-compose.sandbox.yml index 186ba3dec69..999aa567685 100644 --- a/aztec-up/bin/docker-compose.sandbox.yml +++ b/aztec-up/bin/docker-compose.sandbox.yml @@ -28,7 +28,6 @@ services: P2P_BLOCK_CHECK_INTERVAL_MS: 50 SEQ_TX_POLLING_INTERVAL_MS: 50 WS_BLOCK_CHECK_INTERVAL_MS: 50 - PXE_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 PXE_PORT: ${PXE_PORT:-8080} PORT: ${AZTEC_NODE_PORT:-8080} diff --git a/barretenberg/.gitrepo b/barretenberg/.gitrepo index ada14c8ca85..76b852eee72 100644 --- a/barretenberg/.gitrepo +++ b/barretenberg/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/barretenberg branch = master - commit = 9b4610f5231f3dc83ad207588c801c92cc7a946d - parent = e1e586479840b18f52f3218c499a476691d93e48 + commit = c6f0e4997cda15c88022515563f9dceaab31f018 + parent = c90bb16a5880c42752809f383f517181e6f8a53a method = merge cmdver = 0.4.6 diff --git a/barretenberg/CHANGELOG.md b/barretenberg/CHANGELOG.md index c0b8a4b3550..ce20f60b5c6 100644 --- a/barretenberg/CHANGELOG.md +++ b/barretenberg/CHANGELOG.md @@ -1,5 +1,72 @@ # Changelog +## [0.67.1](https://github.com/AztecProtocol/aztec-packages/compare/barretenberg-v0.67.0...barretenberg-v0.67.1) (2024-12-17) + + +### Features + +* Add tree equality assertions ([#10756](https://github.com/AztecProtocol/aztec-packages/issues/10756)) ([923826a](https://github.com/AztecProtocol/aztec-packages/commit/923826a9d1bbed6739527a82b34d5610600eca1b)) +* Better initialization for permutation mapping components ([#10750](https://github.com/AztecProtocol/aztec-packages/issues/10750)) ([1516d7f](https://github.com/AztecProtocol/aztec-packages/commit/1516d7f7bd6a2adbb650bd7cdd572b33db98dbfc)) +* Don't store every block number in block indices DB ([#10658](https://github.com/AztecProtocol/aztec-packages/issues/10658)) ([a3fba84](https://github.com/AztecProtocol/aztec-packages/commit/a3fba8442fdd62f429054c3367984fd4206bbbeb)) +* Leaf index requests to the native world state can now be performed as a batch query ([#10649](https://github.com/AztecProtocol/aztec-packages/issues/10649)) ([a437e73](https://github.com/AztecProtocol/aztec-packages/commit/a437e73558a936981f3eb3ba022b0770b75d9060)) +* New 17 in 20 IVC bench added to actions ([#10777](https://github.com/AztecProtocol/aztec-packages/issues/10777)) ([9fbcff6](https://github.com/AztecProtocol/aztec-packages/commit/9fbcff60a63e0eca14c4e28677aed1fc5e6f2c14)) +* Note hash management in the AVM ([#10666](https://github.com/AztecProtocol/aztec-packages/issues/10666)) ([e077980](https://github.com/AztecProtocol/aztec-packages/commit/e077980f8cce1fc7922c27d368b6dbced956aad2)) +* Sumcheck with disabled rows ([#10068](https://github.com/AztecProtocol/aztec-packages/issues/10068)) ([abd2226](https://github.com/AztecProtocol/aztec-packages/commit/abd2226da3a159e7efb7cbef099e41739f665ef1)) + + +### Bug Fixes + +* Avm gas and non-member ([#10709](https://github.com/AztecProtocol/aztec-packages/issues/10709)) ([dd8cc7b](https://github.com/AztecProtocol/aztec-packages/commit/dd8cc7b93119c0376873a366a8310d2ebd2641de)) +* AVM witgen track gas for nested calls and external halts ([#10731](https://github.com/AztecProtocol/aztec-packages/issues/10731)) ([b8bdb52](https://github.com/AztecProtocol/aztec-packages/commit/b8bdb529719c1f72244e904ea667462458a43317)) +* Use correct size for databus_id ([#10673](https://github.com/AztecProtocol/aztec-packages/issues/10673)) ([95eb658](https://github.com/AztecProtocol/aztec-packages/commit/95eb658f90687c75589b345f95a904d96e2a8e62)) + + +### Miscellaneous + +* **avm:** Radix opcode - remove immediates ([#10696](https://github.com/AztecProtocol/aztec-packages/issues/10696)) ([4ac13e6](https://github.com/AztecProtocol/aztec-packages/commit/4ac13e642c958392ce5606684c044ea014325e26)), closes [#10371](https://github.com/AztecProtocol/aztec-packages/issues/10371) +* Move decider PK allocation to methods ([#10670](https://github.com/AztecProtocol/aztec-packages/issues/10670)) ([1ab9e30](https://github.com/AztecProtocol/aztec-packages/commit/1ab9e30d339cfd7a80f333e408c367c1f8bf49f8)) + +## [0.67.0](https://github.com/AztecProtocol/aztec-packages/compare/barretenberg-v0.66.0...barretenberg-v0.67.0) (2024-12-13) + + +### ⚠ BREAKING CHANGES + +* lower public tx gas limit to 6M ([#10635](https://github.com/AztecProtocol/aztec-packages/issues/10635)) +* l2 gas maximum is per-TX-public-portion. AVM startup gas is now 20k. ([#10214](https://github.com/AztecProtocol/aztec-packages/issues/10214)) +* rename Header to BlockHeader ([#10372](https://github.com/AztecProtocol/aztec-packages/issues/10372)) + +### Features + +* Add verify proof calls to private kernels ([#10533](https://github.com/AztecProtocol/aztec-packages/issues/10533)) ([ce0eee0](https://github.com/AztecProtocol/aztec-packages/commit/ce0eee0ef4a2084ec74b6dae0a75d18af5877ef8)) +* Adding fuzzer for ultra bigfield and relaxing ultra circuit checker ([#10433](https://github.com/AztecProtocol/aztec-packages/issues/10433)) ([da4c47c](https://github.com/AztecProtocol/aztec-packages/commit/da4c47c5dc8caea3e860ac15a58b9ff7f011e4f6)) +* AVM inserts fee write on txs with public calls ([#10394](https://github.com/AztecProtocol/aztec-packages/issues/10394)) ([98ba747](https://github.com/AztecProtocol/aztec-packages/commit/98ba7475ac0130dac4424a2f5cabdbe37eba5cc8)) +* CIVC browser proveThenVerify ([#10431](https://github.com/AztecProtocol/aztec-packages/issues/10431)) ([8c064d4](https://github.com/AztecProtocol/aztec-packages/commit/8c064d484c686fdf00a100f65f1f740be4ef13cb)) +* GETCONTRACTINSTANCE and bytecode retrieval perform nullifier membership checks ([#10445](https://github.com/AztecProtocol/aztec-packages/issues/10445)) ([9301253](https://github.com/AztecProtocol/aztec-packages/commit/9301253f0488e6d96ed12a8c9bde72a653aa7d36)), closes [#10377](https://github.com/AztecProtocol/aztec-packages/issues/10377) [#10379](https://github.com/AztecProtocol/aztec-packages/issues/10379) +* Handle nested calls in witgen ([#10384](https://github.com/AztecProtocol/aztec-packages/issues/10384)) ([1e21f31](https://github.com/AztecProtocol/aztec-packages/commit/1e21f31d430947f48dc9f5e52d0deb1af70ee705)) +* Keccak honk proving in bb.js ([#10489](https://github.com/AztecProtocol/aztec-packages/issues/10489)) ([e0d7431](https://github.com/AztecProtocol/aztec-packages/commit/e0d743121674bcfdd73f84836c17645a5bc2df92)) +* Modify HonkRecursionConstraint to handle IPA claims ([#10469](https://github.com/AztecProtocol/aztec-packages/issues/10469)) ([a204d1b](https://github.com/AztecProtocol/aztec-packages/commit/a204d1b60514d6321c2db5063375cc2bbd507fe8)) +* Remove auto verify mode from ClientIVC ([#10599](https://github.com/AztecProtocol/aztec-packages/issues/10599)) ([b1d8b97](https://github.com/AztecProtocol/aztec-packages/commit/b1d8b978871948fbba639476465f4de6fb471292)) +* Rename Header to BlockHeader ([#10372](https://github.com/AztecProtocol/aztec-packages/issues/10372)) ([0803964](https://github.com/AztecProtocol/aztec-packages/commit/0803964015492db81001c17252aa4b724e43797b)) +* Sayonara old hints ([#10547](https://github.com/AztecProtocol/aztec-packages/issues/10547)) ([dede16e](https://github.com/AztecProtocol/aztec-packages/commit/dede16e035115e1c6971079d12f62e3046407b36)) +* Several Updates in SMT verification module (part 1) ([#10437](https://github.com/AztecProtocol/aztec-packages/issues/10437)) ([0c37672](https://github.com/AztecProtocol/aztec-packages/commit/0c376725a29ec18e25a7c9a89c0df8f5a1e06ff4)) +* Unified create circuit from acir ([#10440](https://github.com/AztecProtocol/aztec-packages/issues/10440)) ([a4dfe13](https://github.com/AztecProtocol/aztec-packages/commit/a4dfe13c1c0af3d527f5c9b2fcc38fe059e9bc38)) + + +### Bug Fixes + +* Remove auto verify in cbind ivc prove ([#10627](https://github.com/AztecProtocol/aztec-packages/issues/10627)) ([d773423](https://github.com/AztecProtocol/aztec-packages/commit/d773423fb4c701d830ac2a732ab9bbc205396a63)) +* Use e2e structure in cbind ([#10585](https://github.com/AztecProtocol/aztec-packages/issues/10585)) ([985aef1](https://github.com/AztecProtocol/aztec-packages/commit/985aef16ce612a9d3d7ff27b87b871a01911002e)) + + +### Miscellaneous + +* **avm:** Gas constants adjustment based on trace rows accounting ([#10614](https://github.com/AztecProtocol/aztec-packages/issues/10614)) ([fc729ef](https://github.com/AztecProtocol/aztec-packages/commit/fc729ef3af7ec33f48dbb9fae3820a59a4a26479)), closes [#10368](https://github.com/AztecProtocol/aztec-packages/issues/10368) +* **avm:** More pilcom compat changes ([#10569](https://github.com/AztecProtocol/aztec-packages/issues/10569)) ([f18d701](https://github.com/AztecProtocol/aztec-packages/commit/f18d701aa527c68a1adcc4b8acbb9c7bd239468a)) +* **avm:** Pilcom compatibility changes ([#10544](https://github.com/AztecProtocol/aztec-packages/issues/10544)) ([fbc8c0e](https://github.com/AztecProtocol/aztec-packages/commit/fbc8c0e864b10d2265373688457a33d61517bbb4)) +* L2 gas maximum is per-TX-public-portion. AVM startup gas is now 20k. ([#10214](https://github.com/AztecProtocol/aztec-packages/issues/10214)) ([1365401](https://github.com/AztecProtocol/aztec-packages/commit/1365401cb379d7206e268dc01a33110cecae7293)) +* Lower public tx gas limit to 6M ([#10635](https://github.com/AztecProtocol/aztec-packages/issues/10635)) ([9836036](https://github.com/AztecProtocol/aztec-packages/commit/9836036053f1b5f3e57bf4e19bf0eb1a692306bd)) +* Optimise grand product computation round based on active ranges ([#10460](https://github.com/AztecProtocol/aztec-packages/issues/10460)) ([7fa8f84](https://github.com/AztecProtocol/aztec-packages/commit/7fa8f844d9e389f8636118f1d3c3ecce707e771e)) + ## [0.66.0](https://github.com/AztecProtocol/aztec-packages/compare/barretenberg-v0.65.2...barretenberg-v0.66.0) (2024-12-06) diff --git a/barretenberg/Earthfile b/barretenberg/Earthfile index a1bac58650e..34e966723f5 100644 --- a/barretenberg/Earthfile +++ b/barretenberg/Earthfile @@ -26,12 +26,8 @@ barretenberg-acir-tests-bb: ENV TEST_SRC /usr/src/acir_artifacts ENV VERBOSE=1 - # Fold and verify an ACIR program stack using ClientIvc - RUN INPUT_TYPE=compiletime_stack FLOW=prove_and_verify_client_ivc ./run_acir_tests.sh fold_basic - # Fold and verify an ACIR program stack using ClientIvc, then natively verify the ClientIVC proof. - RUN INPUT_TYPE=compiletime_stack FLOW=prove_then_verify_client_ivc ./run_acir_tests.sh fold_basic # Fold and verify an ACIR program stack using ClientIvc, recursively verify as part of the Tube circuit and produce and verify a Honk proof - RUN FLOW=prove_then_verify_tube ./run_acir_tests.sh fold_basic + RUN FLOW=prove_then_verify_tube ./run_acir_tests.sh 6_array # Run 1_mul through native bb build, all_cmds flow, to test all cli args. RUN FLOW=all_cmds ./run_acir_tests.sh 1_mul @@ -95,7 +91,7 @@ barretenberg-acir-tests-bb-client-ivc: # Construct and verify a ClientIVC proof for a single arbitrary program RUN FLOW=prove_and_verify_client_ivc ./run_acir_tests.sh 6_array # Construct and separately verify a ClientIVC proof for all acir programs - RUN FLOW=prove_then_verify_client_ivc CLIENT_IVC_SKIPS=true ./run_acir_tests.sh + RUN FLOW=prove_then_verify_client_ivc ./run_acir_tests.sh 6_array databus databus_two_calldata barretenberg-acir-tests-sol: FROM ../build-images/+from-registry @@ -174,7 +170,5 @@ barretenberg-acir-tests-bb.js: RUN BIN=../ts/dest/node/main.js FLOW=prove_then_verify_ultra_honk ./run_acir_tests.sh 6_array assert_statement # Run a single arbitrary test not involving recursion through bb.js for MegaHonk RUN BIN=../ts/dest/node/main.js FLOW=prove_and_verify_mega_honk ./run_acir_tests.sh 6_array - # Run fold_basic test through bb.js which runs ClientIVC on fold basic - RUN BIN=../ts/dest/node/main.js FLOW=fold_and_verify_program ./run_acir_tests.sh fold_basic # Run 1_mul through bb.js build, all_cmds flow, to test all cli args. RUN BIN=../ts/dest/node/main.js FLOW=all_cmds ./run_acir_tests.sh 1_mul \ No newline at end of file diff --git a/barretenberg/acir_tests/flows/fold_and_verify_program.sh b/barretenberg/acir_tests/flows/fold_and_verify_program.sh deleted file mode 100755 index 1157e802bc0..00000000000 --- a/barretenberg/acir_tests/flows/fold_and_verify_program.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -set -eu - -# this flow is deprecated. currently it is bb.js only. for bb is is replaced by: -# prove_and_verify --scheme client_ivc --input-type compiletime_stack -VFLAG=${VERBOSE:+-v} - -$BIN fold_and_verify_program $VFLAG -c $CRS_PATH -b ./target/program.json diff --git a/barretenberg/acir_tests/flows/prove_then_verify_tube.sh b/barretenberg/acir_tests/flows/prove_then_verify_tube.sh index dfc298ccd5b..79685bfc286 100755 --- a/barretenberg/acir_tests/flows/prove_then_verify_tube.sh +++ b/barretenberg/acir_tests/flows/prove_then_verify_tube.sh @@ -5,7 +5,7 @@ mkdir -p ./proofs VFLAG=${VERBOSE:+-v} -$BIN prove --scheme client_ivc --input_type compiletime_stack $VFLAG -c $CRS_PATH -b ./target/program.json +$BIN write_arbitrary_valid_proof_and_vk_to_file --scheme client_ivc $VFLAG -c $CRS_PATH $BIN prove_tube -k vk -p proof -c $CRS_PATH $VFLAG $BIN verify_tube -k vk -p proof -c $CRS_PATH $VFLAG diff --git a/barretenberg/acir_tests/regenerate_verify_honk_proof_inputs.sh b/barretenberg/acir_tests/regenerate_verify_honk_proof_inputs.sh index e19abaabed7..da1d1b43496 100755 --- a/barretenberg/acir_tests/regenerate_verify_honk_proof_inputs.sh +++ b/barretenberg/acir_tests/regenerate_verify_honk_proof_inputs.sh @@ -21,7 +21,7 @@ PROGRAM=assert_statement # the program containing the recursive verifier RECURSIVE_PROGRAM=verify_honk_proof -./reset_acir_tests.sh --rebuild-nargo --programs "$PROGRAM" +./reset_acir_tests.sh --programs "$PROGRAM" cd "acir_tests/$PROGRAM" TOML_DIR=../../../../noir/noir-repo/test_programs/execution_success/"$RECURSIVE_PROGRAM" @@ -31,7 +31,7 @@ if [ ! -d "$TOML_DIR" ]; then fi echo "Generating recursion inputs and writing to directory $TOML_DIR" -$BIN write_recursion_inputs_honk $VERBOSE -c $CRS_PATH -b ./target/program.json -o "$TOML_DIR" +$BIN write_recursion_inputs_honk --recursive $VERBOSE -c $CRS_PATH -b ./target/program.json -o "$TOML_DIR" cd ../.. ./reset_acir_tests.sh --programs "$RECURSIVE_PROGRAM" \ No newline at end of file diff --git a/barretenberg/acir_tests/reset_acir_tests.sh b/barretenberg/acir_tests/reset_acir_tests.sh index 7e5b7afce1f..a557c3b7323 100755 --- a/barretenberg/acir_tests/reset_acir_tests.sh +++ b/barretenberg/acir_tests/reset_acir_tests.sh @@ -4,14 +4,14 @@ set -e # Run from within barretenberg/acir_tests # Initialize variables for flags -REBUILD_NARGO_FLAG="" +REBUILD_NARGO_FLAG=true PROGRAMS="" # Parse the arguments while [[ "$#" -gt 0 ]]; do case $1 in - --rebuild-nargo) - REBUILD_NARGO_FLAG="--rebuild-nargo" + --no-rebuild-nargo) + REBUILD_NARGO_FLAG=false ;; --programs) shift @@ -26,12 +26,13 @@ while [[ "$#" -gt 0 ]]; do shift done -# Clean and rebuild noir, then compile the test programs if --rebuild-nargo flag is set -cd ../../noir/noir-repo - -if [[ -n "$REBUILD_NARGO_FLAG" ]]; then + cd ../../noir/noir-repo +# Clean and rebuild noir unless --no-rebuild-nargo is specified, then compile the test programs +if [[ "$REBUILD_NARGO_FLAG" == true ]]; then cargo clean noirup -p . +else + echo "Skipping noir nargo build." fi # Rebuild test programs with rebuild.sh diff --git a/barretenberg/acir_tests/sol-test/package-lock.json b/barretenberg/acir_tests/sol-test/package-lock.json new file mode 100644 index 00000000000..020ba3eed74 --- /dev/null +++ b/barretenberg/acir_tests/sol-test/package-lock.json @@ -0,0 +1,198 @@ +{ + "name": "headless-test", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "headless-test", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ethers": "^6.8.1", + "solc": "^0.8.27" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ethers": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.8.1.tgz", + "integrity": "sha512-iEKm6zox5h1lDn6scuRWdIdFJUCGg3+/aQWu0F4K0GVyEZiktFkqrJbRjTn1FlYEPz7RKA707D6g5Kdk6j7Ljg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solc": { + "version": "0.8.27", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.27.tgz", + "integrity": "sha512-BNxMol2tUAbkH7HKlXBcBqrGi2aqgv+uMHz26mJyTtlVgWmBA4ktiw0qVKHfkjf2oaHbwtbtaSeE2dhn/gTAKw==", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/barretenberg/acir_tests/sol-test/src/index.js b/barretenberg/acir_tests/sol-test/src/index.js index 42749f88d96..ceb1373dd41 100644 --- a/barretenberg/acir_tests/sol-test/src/index.js +++ b/barretenberg/acir_tests/sol-test/src/index.js @@ -4,8 +4,9 @@ import { spawn } from "child_process"; import { ethers } from "ethers"; import solc from "solc"; +// Size excluding number of public inputs const NUMBER_OF_FIELDS_IN_PLONK_PROOF = 93; -const NUMBER_OF_FIELDS_IN_HONK_PROOF = 447; +const NUMBER_OF_FIELDS_IN_HONK_PROOF = 443; // We use the solcjs compiler version in this test, although it is slower than foundry, to run the test end to end // it simplifies of parallelising the test suite diff --git a/barretenberg/acir_tests/sol-test/yarn.lock b/barretenberg/acir_tests/sol-test/yarn.lock index c0a90997654..f8410d95c1a 100644 --- a/barretenberg/acir_tests/sol-test/yarn.lock +++ b/barretenberg/acir_tests/sol-test/yarn.lock @@ -4,44 +4,44 @@ "@adraffy/ens-normalize@1.10.0": version "1.10.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz" integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== "@noble/curves@1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== dependencies: "@noble/hashes" "1.3.2" "@noble/hashes@1.3.2": version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== "@types/node@18.15.13": version "18.15.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== aes-js@4.0.0-beta.5: version "4.0.0-beta.5" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== commander@^8.1.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== ethers@^6.8.1: version "6.8.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.8.1.tgz#ee2a1a39b5f62a13678f90ccd879175391d0a2b4" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.8.1.tgz" integrity sha512-iEKm6zox5h1lDn6scuRWdIdFJUCGg3+/aQWu0F4K0GVyEZiktFkqrJbRjTn1FlYEPz7RKA707D6g5Kdk6j7Ljg== dependencies: "@adraffy/ens-normalize" "1.10.0" @@ -54,32 +54,32 @@ ethers@^6.8.1: follow-redirects@^1.12.1: version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== js-sha3@0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== semver@^5.5.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== solc@^0.8.27: version "0.8.27" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.27.tgz#cb8e7246cceadad8df65ceccffe640e106106bb4" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.27.tgz" integrity sha512-BNxMol2tUAbkH7HKlXBcBqrGi2aqgv+uMHz26mJyTtlVgWmBA4ktiw0qVKHfkjf2oaHbwtbtaSeE2dhn/gTAKw== dependencies: command-exists "^1.2.8" @@ -92,17 +92,17 @@ solc@^0.8.27: tmp@0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" tslib@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== ws@8.5.0: version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== diff --git a/barretenberg/cpp/CMakeLists.txt b/barretenberg/cpp/CMakeLists.txt index 9448d66a951..6e35eb87c15 100644 --- a/barretenberg/cpp/CMakeLists.txt +++ b/barretenberg/cpp/CMakeLists.txt @@ -6,7 +6,7 @@ cmake_minimum_required(VERSION 3.24 FATAL_ERROR) project( Barretenberg DESCRIPTION "BN254 elliptic curve library, and PLONK SNARK prover" - VERSION 0.66.0 # x-release-please-version + VERSION 0.67.1 # x-release-please-version LANGUAGES CXX C ) # Insert version into `bb` config file diff --git a/barretenberg/cpp/Earthfile b/barretenberg/cpp/Earthfile index c9049c4456f..a7e7438d1bb 100644 --- a/barretenberg/cpp/Earthfile +++ b/barretenberg/cpp/Earthfile @@ -230,6 +230,7 @@ bench-client-ivc: COPY --dir +bench-binaries/* . # install SRS needed for proving COPY --dir ./srs_db/+build/. srs_db + RUN cd release && ./bin/client_ivc_bench --benchmark_out=../client_ivc_17_in_20_release.json --benchmark_filter="ClientIVCBench/Ambient_17_in_20/6$" RUN cd release && ./bin/client_ivc_bench --benchmark_out=../client_ivc_release.json --benchmark_filter="ClientIVCBench/Full/6$" RUN cd op-count && ./bin/client_ivc_bench --benchmark_out=../client_ivc_op_count.json --benchmark_filter="ClientIVCBench/Full/6$" RUN cd op-count-time && ./bin/client_ivc_bench --benchmark_out=../client_ivc_op_count_time.json --benchmark_filter="ClientIVCBench/Full/6$" @@ -248,6 +249,7 @@ bench: END COPY ./scripts/ci/combine_benchmarks.py ./scripts/ci/combine_benchmarks.py RUN ./scripts/ci/combine_benchmarks.py \ + native client_ivc_17_in_20_release.json \ native client_ivc_release.json \ native ultra_honk_release.json \ wasm client_ivc_wasm.json \ diff --git a/barretenberg/cpp/pil/avm/gas.pil b/barretenberg/cpp/pil/avm/gas.pil index 32b1a858c86..5e7c809b942 100644 --- a/barretenberg/cpp/pil/avm/gas.pil +++ b/barretenberg/cpp/pil/avm/gas.pil @@ -64,10 +64,10 @@ namespace main(256); is_fake_row * (1 - is_fake_row) = 0; // Temporary //TODO(8945): clean up fake row related code - #[L2_GAS_NO_DECREMENT_FAKE_ROW] - is_fake_row * (l2_gas_remaining - l2_gas_remaining') = 0; - #[DA_GAS_NO_DECREMENT_FAKE_ROW] - is_fake_row * (da_gas_remaining - da_gas_remaining') = 0; + //#[L2_GAS_NO_DECREMENT_FAKE_ROW] + //is_fake_row * (l2_gas_remaining - l2_gas_remaining') = 0; + //#[DA_GAS_NO_DECREMENT_FAKE_ROW] + //is_fake_row * (da_gas_remaining - da_gas_remaining') = 0; // Constrain that the gas decrements correctly per instruction #[L2_GAS_REMAINING_DECREMENT_NOT_CALL] diff --git a/barretenberg/cpp/scripts/compare_branch_vs_baseline.sh b/barretenberg/cpp/scripts/compare_branch_vs_baseline.sh index f798893781e..717b7be7800 100755 --- a/barretenberg/cpp/scripts/compare_branch_vs_baseline.sh +++ b/barretenberg/cpp/scripts/compare_branch_vs_baseline.sh @@ -10,7 +10,7 @@ # it is up to date with local master, and run the script. # Specify the benchmark suite and the "baseline" branch against which to compare -BENCHMARK=${1:-goblin_bench} +BENCHMARK=${1:-client_ivc_bench} FILTER=${2:-""} PRESET=${3:-clang16} BUILD_DIR=${4:-build} diff --git a/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh b/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh index 7c9192fa3f7..50cf755990a 100755 --- a/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh +++ b/barretenberg/cpp/scripts/compare_branch_vs_baseline_remote.sh @@ -10,7 +10,7 @@ # it is up to date with local master, and run the script. # Specify the benchmark suite and the "baseline" branch against which to compare -BENCHMARK=${1:-goblin_bench} +BENCHMARK=${1:-client_ivc_bench} FILTER=${2:-"*."} PRESET=${3:-clang16} BUILD_DIR=${4:-build} diff --git a/barretenberg/cpp/src/barretenberg/bb/api.hpp b/barretenberg/cpp/src/barretenberg/bb/api.hpp index ab1a3628a4f..5c83275543f 100644 --- a/barretenberg/cpp/src/barretenberg/bb/api.hpp +++ b/barretenberg/cpp/src/barretenberg/bb/api.hpp @@ -8,7 +8,6 @@ class API { struct Flags { std::optional output_type; // bytes, fields, bytes_and_fields, fields_msgpack std::optional input_type; // compiletime_stack, runtime_stack - bool no_auto_verify; // TODO(https://github.com/AztecProtocol/barretenberg/issues/1101): remove }; virtual void prove(const Flags& flags, @@ -36,5 +35,8 @@ class API { const std::filesystem::path& proof_path, const std::filesystem::path& vk_path, const std::filesystem::path& output_path) = 0; + + virtual void write_arbitrary_valid_proof_and_vk_to_file(const API::Flags& flags, + const std::filesystem::path& output_dir) = 0; }; } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/bb/api_client_ivc.hpp b/barretenberg/cpp/src/barretenberg/bb/api_client_ivc.hpp index 8d0705b91c0..cbdfae92198 100644 --- a/barretenberg/cpp/src/barretenberg/bb/api_client_ivc.hpp +++ b/barretenberg/cpp/src/barretenberg/bb/api_client_ivc.hpp @@ -3,6 +3,7 @@ #include "barretenberg/bb/acir_format_getters.hpp" #include "barretenberg/bb/api.hpp" #include "barretenberg/bb/init_srs.hpp" +#include "barretenberg/client_ivc/mock_circuit_producer.hpp" #include "barretenberg/common/throw_or_abort.hpp" #include "libdeflate.h" @@ -125,35 +126,22 @@ class ClientIVCAPI : public API { return folding_stack; }; - static std::shared_ptr _accumulate(std::vector& folding_stack, - bool auto_verify = false) + static std::shared_ptr _accumulate(std::vector& folding_stack) { using Builder = MegaCircuitBuilder; using Program = acir_format::AcirProgram; using namespace acir_format; - vinfo("performing accumulation with auto-verify = ", auto_verify); - TraceSettings trace_settings{ E2E_FULL_TEST_STRUCTURE }; - auto ivc = std::make_shared(trace_settings, auto_verify); + auto ivc = std::make_shared(trace_settings); const ProgramMetadata metadata{ ivc }; // Accumulate the entire program stack into the IVC - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1116): remove manual setting of is_kernel - bool is_kernel = false; for (Program& program : folding_stack) { // Construct a bberg circuit from the acir representation then accumulate it into the IVC Builder circuit = acir_format::create_circuit(program, metadata); - // Set the internal is_kernel flag based on the local mechanism only if it has not already been set to true - if (ivc->auto_verify_mode) { - if (!circuit.databus_propagation_data.is_kernel) { - circuit.databus_propagation_data.is_kernel = is_kernel; - } - is_kernel = !is_kernel; - } - // Do one step of ivc accumulator or, if there is only one circuit in the stack, prove that circuit. In this // case, no work is added to the Goblin opqueue, but VM proofs for trivials inputs are produced. ivc->accumulate(circuit, /*one_circuit=*/folding_stack.size() == 1); @@ -183,8 +171,7 @@ class ClientIVCAPI : public API { std::vector folding_stack = _build_folding_stack(*flags.input_type, bytecode_path, witness_path); - bool auto_verify = !flags.no_auto_verify; - std::shared_ptr ivc = _accumulate(folding_stack, auto_verify); + std::shared_ptr ivc = _accumulate(folding_stack); ClientIVC::Proof proof = ivc->prove(); // Write the proof and verification keys into the working directory in 'binary' format (in practice it seems @@ -246,11 +233,56 @@ class ClientIVCAPI : public API { std::vector folding_stack = _build_folding_stack(*flags.input_type, bytecode_path, witness_path); - std::shared_ptr ivc = _accumulate(folding_stack, /*auto_verify=*/true); + std::shared_ptr ivc = _accumulate(folding_stack); const bool verified = ivc->prove_and_verify(); return verified; }; + /** + * @brief Write an arbitrary but valid ClientIVC proof and VK to files + * @details used to test the prove_tube flow + * + * @param flags + * @param output_dir + */ + void write_arbitrary_valid_proof_and_vk_to_file(const API::Flags& flags, + const std::filesystem::path& output_dir) override + { + if (!flags.output_type || *flags.output_type != "fields_msgpack") { + throw_or_abort("No output_type or output_type not supported"); + } + + if (!flags.input_type || !(*flags.input_type == "compiletime_stack" || *flags.input_type == "runtime_stack")) { + throw_or_abort("No input_type or input_type not supported"); + } + + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1163) set these dynamically + init_bn254_crs(1 << 20); + init_grumpkin_crs(1 << 15); + + ClientIVC ivc{ { CLIENT_IVC_BENCH_STRUCTURE } }; + + // Construct and accumulate a series of mocked private function execution circuits + PrivateFunctionExecutionMockCircuitProducer circuit_producer; + size_t NUM_CIRCUITS = 2; + for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { + auto circuit = circuit_producer.create_next_circuit(ivc); + ivc.accumulate(circuit); + } + + ClientIVC::Proof proof = ivc.prove(); + + // Write the proof and verification keys into the working directory in 'binary' format + vinfo("writing ClientIVC proof and vk..."); + write_file(output_dir / "client_ivc_proof", to_buffer(proof)); + + auto eccvm_vk = std::make_shared(ivc.goblin.get_eccvm_proving_key()); + auto translator_vk = + std::make_shared(ivc.goblin.get_translator_proving_key()); + write_file(output_dir / "client_ivc_vk", + to_buffer(ClientIVC::VerificationKey{ ivc.honk_vk, eccvm_vk, translator_vk })); + }; + void gates([[maybe_unused]] const API::Flags& flags, [[maybe_unused]] const std::filesystem::path& bytecode_path, [[maybe_unused]] const std::filesystem::path& witness_path) override diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp index eb1200e7f8e..f5a68f710ba 100644 --- a/barretenberg/cpp/src/barretenberg/bb/main.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp @@ -190,8 +190,6 @@ void prove_tube(const std::string& output_path) { using namespace stdlib::recursion::honk; - using GoblinVerifierInput = ClientIVCRecursiveVerifier::GoblinVerifierInput; - using VerifierInput = ClientIVCRecursiveVerifier::VerifierInput; using Builder = UltraCircuitBuilder; using GrumpkinVk = bb::VerifierCommitmentKey; @@ -211,8 +209,6 @@ void prove_tube(const std::string& output_path) // TODO(https://github.com/AztecProtocol/barretenberg/issues/1025) vk.eccvm->pcs_verification_key = std::make_shared(vk.eccvm->circuit_size + 1); - GoblinVerifierInput goblin_verifier_input{ vk.eccvm, vk.translator }; - VerifierInput input{ vk.mega, goblin_verifier_input }; auto builder = std::make_shared(); // Preserve the public inputs that should be passed to the base rollup by making them public inputs to the tube @@ -226,7 +222,7 @@ void prove_tube(const std::string& output_path) auto offset = bb::HONK_PROOF_PUBLIC_INPUT_OFFSET; builder->add_public_variable(proof.mega_proof[i + offset]); } - ClientIVCRecursiveVerifier verifier{ builder, input }; + ClientIVCRecursiveVerifier verifier{ builder, vk }; ClientIVCRecursiveVerifier::Output client_ivc_rec_verifier_output = verifier.verify(proof); @@ -887,6 +883,8 @@ void write_vk_for_ivc(const std::string& bytecodePath, const std::string& output * @param witnessPath Path to the file containing the serialized witness * @param outputPath Path to write toml file */ +// TODO(https://github.com/AztecProtocol/barretenberg/issues/1172): update the flow to generate recursion inputs for +// double_verify_honk_proof as well template void write_recursion_inputs_honk(const std::string& bytecodePath, const std::string& witnessPath, @@ -1119,8 +1117,7 @@ int main(int argc, char* argv[]) const API::Flags flags = [&args]() { return API::Flags{ .output_type = get_option(args, "--output_type", "fields_msgpack"), - .input_type = get_option(args, "--input_type", "compiletime_stack"), - .no_auto_verify = flag_present(args, "--no_auto_verify") }; + .input_type = get_option(args, "--input_type", "compiletime_stack") }; }(); const std::string command = args[0]; @@ -1158,6 +1155,12 @@ int main(int argc, char* argv[]) return api.prove_and_verify(flags, bytecode_path, witness_path) ? 0 : 1; } + if (command == "write_arbitrary_valid_proof_and_vk_to_file") { + const std::filesystem::path output_dir = get_option(args, "-o", "./target"); + api.write_arbitrary_valid_proof_and_vk_to_file(flags, output_dir); + return 1; + } + throw_or_abort("Invalid command passed to execute_command in bb"); return 1; }; diff --git a/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp index 6033648972c..2acbb568272 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/client_ivc_bench/client_ivc.bench.cpp @@ -45,9 +45,29 @@ BENCHMARK_DEFINE_F(ClientIVCBench, Full)(benchmark::State& state) } } +/** + * @brief Benchmark the prover work for the full PG-Goblin IVC protocol + * @details Processes "dense" circuits of size 2^17 in a size 2^20 structured trace + */ +BENCHMARK_DEFINE_F(ClientIVCBench, Ambient_17_in_20)(benchmark::State& state) +{ + ClientIVC ivc{ { E2E_FULL_TEST_STRUCTURE } }; + + auto total_num_circuits = 2 * static_cast(state.range(0)); // 2x accounts for kernel circuits + auto mocked_vkeys = mock_verification_keys(total_num_circuits); + + for (auto _ : state) { + BB_REPORT_OP_COUNT_IN_BENCH(state); + perform_ivc_accumulation_rounds( + total_num_circuits, ivc, mocked_vkeys, /* mock_vk */ true, /* large_first_app */ false); + ivc.prove(); + } +} + #define ARGS Arg(ClientIVCBench::NUM_ITERATIONS_MEDIUM_COMPLEXITY)->Arg(2) BENCHMARK_REGISTER_F(ClientIVCBench, Full)->Unit(benchmark::kMillisecond)->ARGS; +BENCHMARK_REGISTER_F(ClientIVCBench, Ambient_17_in_20)->Unit(benchmark::kMillisecond)->ARGS; } // namespace diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp index 4ba9ae098c7..df64300f75b 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp @@ -161,10 +161,6 @@ void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptr& precomputed_vk, const bool mock_vk) { - if (auto_verify_mode && circuit.databus_propagation_data.is_kernel) { - complete_kernel_circuit_logic(circuit); - } - // Construct merge proof for the present circuit and add to merge verification queue MergeProof merge_proof = goblin.prove_merge(circuit); merge_verification_queue.emplace_back(merge_proof); @@ -407,10 +403,8 @@ std::vector> ClientIVC::precompute_ // Reset the scheme so it can be reused for actual accumulation, maintaining the trace structure setting as is TraceSettings settings = trace_settings; - bool auto_verify = auto_verify_mode; *this = ClientIVC(); this->trace_settings = settings; - this->auto_verify_mode = auto_verify; return vkeys; } diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp index 12ec8cdc041..eb28477637b 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp @@ -126,10 +126,6 @@ class ClientIVC { // Settings related to the use of fixed block sizes for each gate in the execution trace TraceSettings trace_settings; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1101): eventually do away with this. - // Setting auto_verify_mode = true will cause kernel completion logic to be added to kernels automatically - bool auto_verify_mode; - std::shared_ptr bn254_commitment_key; GoblinProver goblin; @@ -140,10 +136,9 @@ class ClientIVC { bool initialized = false; // Is the IVC accumulator initialized - ClientIVC(TraceSettings trace_settings = {}, bool auto_verify_mode = false) + ClientIVC(TraceSettings trace_settings = {}) : trace_usage_tracker(trace_settings) , trace_settings(trace_settings) - , auto_verify_mode(auto_verify_mode) , bn254_commitment_key(trace_settings.structure.has_value() ? std::make_shared>(trace_settings.dyadic_size()) : nullptr) @@ -191,5 +186,12 @@ class ClientIVC { std::vector> precompute_folding_verification_keys( std::vector circuits); + + VerificationKey get_vk() const + { + return { honk_vk, + std::make_shared(goblin.get_eccvm_proving_key()), + std::make_shared(goblin.get_translator_proving_key()) }; + } }; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc_auto_verify.test.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc_auto_verify.test.cpp deleted file mode 100644 index f4dafde3803..00000000000 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc_auto_verify.test.cpp +++ /dev/null @@ -1,199 +0,0 @@ -#include "barretenberg/client_ivc/client_ivc.hpp" -#include "barretenberg/goblin/goblin.hpp" -#include "barretenberg/goblin/mock_circuits.hpp" -#include "barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" - -#include - -using namespace bb; - -// TODO(https://github.com/AztecProtocol/barretenberg/issues/1101): These tests are for the auto_verify_mode version of -// ClientIVC and can be removed altogether when that functionality is removed. -class ClientIVCAutoVerifyTests : public ::testing::Test { - protected: - static void SetUpTestSuite() - { - srs::init_crs_factory("../srs_db/ignition"); - srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); - } - - using Flavor = ClientIVC::Flavor; - using FF = typename Flavor::FF; - using VerificationKey = Flavor::VerificationKey; - using Builder = ClientIVC::ClientCircuit; - using DeciderProvingKey = ClientIVC::DeciderProvingKey; - using DeciderVerificationKey = ClientIVC::DeciderVerificationKey; - using FoldProof = ClientIVC::FoldProof; - using DeciderProver = ClientIVC::DeciderProver; - using DeciderVerifier = ClientIVC::DeciderVerifier; - using DeciderProvingKeys = DeciderProvingKeys_; - using FoldingProver = ProtogalaxyProver_; - using DeciderVerificationKeys = DeciderVerificationKeys_; - using FoldingVerifier = ProtogalaxyVerifier_; - - /** - * @brief Construct mock circuit with arithmetic gates and goblin ops - * @details Currently default sized to 2^16 to match kernel. (Note: dummy op gates added to avoid non-zero - * polynomials will bump size to next power of 2) - * - */ - static Builder create_mock_circuit(ClientIVC& ivc, bool is_kernel, size_t log2_num_gates = 16) - { - Builder circuit{ ivc.goblin.op_queue }; - MockCircuits::construct_arithmetic_circuit(circuit, log2_num_gates); - - // TODO(https://github.com/AztecProtocol/barretenberg/issues/911): We require goblin ops to be added to the - // function circuit because we cannot support zero commtiments. While the builder handles this at - // finalisation stage via the add_gates_to_ensure_all_polys_are_non_zero function for other MegaHonk - // circuits (where we don't explicitly need to add goblin ops), in ClientIVC merge proving happens prior to - // folding where the absense of goblin ecc ops will result in zero commitments. - MockCircuits::construct_goblin_ecc_op_circuit(circuit); - - circuit.databus_propagation_data.is_kernel = is_kernel; - return circuit; - } -}; - -/** - * @brief A simple-as-possible test demonstrating IVC for two mock circuits - * - */ -TEST_F(ClientIVCAutoVerifyTests, Basic) -{ - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - - // Initialize the IVC with an arbitrary circuit - Builder circuit_0 = create_mock_circuit(ivc, /*is_kernel=*/false); - ivc.accumulate(circuit_0); - - // Create another circuit and accumulate - Builder circuit_1 = create_mock_circuit(ivc, /*is_kernel=*/true); - ivc.accumulate(circuit_1); - - EXPECT_TRUE(ivc.prove_and_verify()); -}; - -/** - * @brief The number of circuits processed can be odd as long as the last one is a kernel - * - */ -TEST_F(ClientIVCAutoVerifyTests, BasicOdd) -{ - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - - // Initialize the IVC with an arbitrary circuit - Builder circuit_0 = create_mock_circuit(ivc, /*is_kernel=*/false); - ivc.accumulate(circuit_0); - - // Create another circuit and accumulate - Builder circuit_1 = create_mock_circuit(ivc, /*is_kernel=*/true); - ivc.accumulate(circuit_1); - - // Create another circuit and accumulate - Builder circuit_2 = create_mock_circuit(ivc, /*is_kernel=*/true); - ivc.accumulate(circuit_2); - - EXPECT_TRUE(ivc.prove_and_verify()); -}; - -/** - * @brief Prove and verify accumulation of an arbitrary set of circuits - * - */ -TEST_F(ClientIVCAutoVerifyTests, BasicLarge) -{ - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - - // Construct a set of arbitrary circuits - size_t NUM_CIRCUITS = 6; - std::vector circuits; - for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { - bool is_kernel = (idx % 2 == 1); // every second circuit is a kernel - circuits.emplace_back(create_mock_circuit(ivc, is_kernel)); - } - - // Accumulate each circuit - for (auto& circuit : circuits) { - ivc.accumulate(circuit); - } - - EXPECT_TRUE(ivc.prove_and_verify()); -}; - -/** - * @brief Using a structured trace allows for the accumulation of circuits of varying size - * - */ -TEST_F(ClientIVCAutoVerifyTests, BasicStructured) -{ - ClientIVC ivc{ { SMALL_TEST_STRUCTURE }, /*auto_verify_mode=*/true }; - - // Construct some circuits of varying size - Builder circuit_0 = create_mock_circuit(ivc, /*is_kernel=*/false, /*log2_num_gates=*/5); - Builder circuit_1 = create_mock_circuit(ivc, /*is_kernel=*/true, /*log2_num_gates=*/8); - Builder circuit_2 = create_mock_circuit(ivc, /*is_kernel=*/false, /*log2_num_gates=*/11); - Builder circuit_3 = create_mock_circuit(ivc, /*is_kernel=*/true, /*log2_num_gates=*/11); - - // The circuits can be accumulated as normal due to the structured trace - ivc.accumulate(circuit_0); - ivc.accumulate(circuit_1); - ivc.accumulate(circuit_2); - ivc.accumulate(circuit_3); - - EXPECT_TRUE(ivc.prove_and_verify()); -}; - -/** - * @brief Prove and verify accumulation of an arbitrary set of circuits using precomputed verification keys - * - */ -TEST_F(ClientIVCAutoVerifyTests, PrecomputedVerificationKeys) -{ - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - - // Construct a set of arbitrary circuits - size_t NUM_CIRCUITS = 4; - std::vector circuits; - for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { - bool is_kernel = (idx % 2 == 1); // every second circuit is a kernel - circuits.emplace_back(create_mock_circuit(ivc, is_kernel)); - } - - // Precompute the verification keys that will be needed for the IVC - auto precomputed_vkeys = ivc.precompute_folding_verification_keys(circuits); - - // Accumulate each circuit using the precomputed VKs - for (auto [circuit, precomputed_vk] : zip_view(circuits, precomputed_vkeys)) { - ivc.accumulate(circuit, /*one_circuit=*/false, precomputed_vk); - } - - EXPECT_TRUE(ivc.prove_and_verify()); -}; - -/** - * @brief Perform accumulation with a structured trace and precomputed verification keys - * - */ -TEST_F(ClientIVCAutoVerifyTests, StructuredPrecomputedVKs) -{ - ClientIVC ivc{ { SMALL_TEST_STRUCTURE }, /*auto_verify_mode=*/true }; - - // Construct a set of arbitrary circuits - size_t NUM_CIRCUITS = 4; - std::vector circuits; - for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { - bool is_kernel = (idx % 2 == 1); // every second circuit is a kernel - circuits.emplace_back(create_mock_circuit(ivc, is_kernel, /*log2_num_gates=*/5)); - } - - // Precompute the (structured) verification keys that will be needed for the IVC - auto precomputed_vkeys = ivc.precompute_folding_verification_keys(circuits); - - // Accumulate each circuit - for (auto [circuit, precomputed_vk] : zip_view(circuits, precomputed_vkeys)) { - ivc.accumulate(circuit, /*one_circuit=*/false, precomputed_vk); - } - - EXPECT_TRUE(ivc.prove_and_verify()); -}; diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/mock_circuit_producer.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/mock_circuit_producer.hpp index 49a7915f0ee..b2ba3f3656d 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/mock_circuit_producer.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/mock_circuit_producer.hpp @@ -96,7 +96,13 @@ class PrivateFunctionExecutionMockCircuitProducer { MockDatabusProducer mock_databus; + bool large_first_app = true; // if true, first app is 2^19, else 2^17 + public: + PrivateFunctionExecutionMockCircuitProducer(bool large_first_app = true) + : large_first_app(large_first_app) + {} + /** * @brief Create the next circuit (app/kernel) in a mocked private function execution stack */ @@ -113,7 +119,7 @@ class PrivateFunctionExecutionMockCircuitProducer { mock_databus.populate_kernel_databus(circuit); // populate databus inputs/outputs ivc.complete_kernel_circuit_logic(circuit); // complete with recursive verifiers etc } else { - bool use_large_circuit = (circuit_counter == 1); // first circuit is size 2^19 + bool use_large_circuit = large_first_app && (circuit_counter == 1); // first circuit is size 2^19 GoblinMockCircuits::construct_mock_app_circuit(circuit, use_large_circuit); // construct mock app mock_databus.populate_app_databus(circuit); // populate databus outputs } diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp index 44d07e4cd0f..07d20b5e02e 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/test_bench_shared.hpp @@ -33,11 +33,12 @@ bool verify_ivc(ClientIVC::Proof& proof, ClientIVC& ivc) void perform_ivc_accumulation_rounds(size_t NUM_CIRCUITS, ClientIVC& ivc, auto& precomputed_vks, - const bool& mock_vk = false) + const bool& mock_vk = false, + const bool large_first_app = true) { ASSERT(precomputed_vks.size() == NUM_CIRCUITS); // ensure presence of a precomputed VK for each circuit - PrivateFunctionExecutionMockCircuitProducer circuit_producer; + PrivateFunctionExecutionMockCircuitProducer circuit_producer(large_first_app); for (size_t circuit_idx = 0; circuit_idx < NUM_CIRCUITS; ++circuit_idx) { MegaCircuitBuilder circuit; diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp index 81ef54a2b9d..dca262c5edc 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp @@ -232,17 +232,16 @@ template class CommitmentKey { std::vector scalars; scalars.reserve(total_num_scalars); - for (const auto& range : active_ranges) { - auto start = &polynomial[range.first]; - auto end = &polynomial[range.second]; - scalars.insert(scalars.end(), start, end); - } std::vector points; points.reserve(total_num_scalars * 2); - for (const auto& range : active_ranges) { - auto start = &point_table[2 * range.first]; - auto end = &point_table[2 * range.second]; - points.insert(points.end(), start, end); + for (const auto& [first, second] : active_ranges) { + auto poly_start = &polynomial[first]; + auto poly_end = &polynomial[second]; + scalars.insert(scalars.end(), poly_start, poly_end); + + auto pts_start = &point_table[2 * first]; + auto pts_end = &point_table[2 * second]; + points.insert(points.end(), pts_start, pts_end); } // Call pippenger diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp index 6c9aea63316..2322375fba3 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/ipa/ipa.hpp @@ -202,7 +202,7 @@ template class IPA { auto log_poly_length = static_cast(numeric::get_msb(poly_length)); // TODO(https://github.com/AztecProtocol/barretenberg/issues/1159): Decouple constant from IPA. if (log_poly_length > CONST_ECCVM_LOG_N) { - throw_or_abort("IPA log_poly_length is too large"); + throw_or_abort("IPA log_poly_length is too large: " + std::to_string(log_poly_length)); } // Allocate space for L_i and R_i elements @@ -329,7 +329,7 @@ template class IPA { "IPA:poly_degree_plus_1")); // note this is base field because this is a uint32_t, which should map // to a bb::fr, not a grumpkin::fr, which is a BaseField element for // Grumpkin - + // Step 2. // Receive generator challenge u and compute auxiliary generator const Fr generator_challenge = transcript->template get_challenge("IPA:generator_challenge"); @@ -342,7 +342,7 @@ template class IPA { auto log_poly_length = static_cast(numeric::get_msb(poly_length)); if (log_poly_length > CONST_ECCVM_LOG_N) { - throw_or_abort("IPA log_poly_length is too large"); + throw_or_abort("IPA log_poly_length is too large " + std::to_string(log_poly_length)); } // Step 3. // Compute C' = C + f(\beta) ⋅ U @@ -465,7 +465,7 @@ template class IPA { const auto log_poly_length = numeric::get_msb(static_cast(poly_length)); if (log_poly_length > CONST_ECCVM_LOG_N) { - throw_or_abort("IPA log_poly_length is too large"); + throw_or_abort("IPA log_poly_length is too large: " + std::to_string(log_poly_length)); } auto pippenger_size = 2 * CONST_ECCVM_LOG_N; std::vector round_challenges(CONST_ECCVM_LOG_N); @@ -608,7 +608,7 @@ template class IPA { * @todo (https://github.com/AztecProtocol/barretenberg/issues/1018): simulator should use the native verify * function with parallelisation */ - static bool full_verify_recursive(const std::shared_ptr& vk, + static bool full_verify_recursive(const std::shared_ptr& vk, const OpeningClaim& opening_claim, auto& transcript) requires Curve::is_stdlib_type @@ -630,7 +630,7 @@ template class IPA { const auto log_poly_length = numeric::get_msb(static_cast(poly_length)); if (log_poly_length > CONST_ECCVM_LOG_N) { - throw_or_abort("IPA log_poly_length is too large"); + throw_or_abort("IPA log_poly_length is too large: " + std::to_string(log_poly_length)); } auto pippenger_size = 2 * CONST_ECCVM_LOG_N; std::vector round_challenges(CONST_ECCVM_LOG_N); @@ -794,11 +794,11 @@ template class IPA { /** * @brief Evaluates the polynomial created from the challenge scalars u_challenges_inv at a challenge r. - * @details This polynomial is defined as challenge_poly(X) = ∏_{i ∈ [k]} (1 + u_{len-i}^{-1}.X^{2^{i-1}}), + * @details This polynomial is defined as challenge_poly(X) = ∏_{i ∈ [k]} (1 + u_{len-i}^{-1}.X^{2^{i-1}}), * so the evaluation is just ∏_{i ∈ [k]} (1 + u_{len-i}^{-1}.r^{2^{i-1}}). - * @param u_challenges_inv - * @param r - * @return Fr + * @param u_challenges_inv + * @param r + * @return Fr */ static Fr evaluate_challenge_poly(Fr log_poly_length, const std::vector& u_challenges_inv, Fr r) { using Builder = typename Curve::Builder; @@ -807,12 +807,12 @@ template class IPA { Fr challenge_poly_eval = 1; Fr r_pow = r; if (uint32_t(log_poly_length.get_value()) > CONST_ECCVM_LOG_N) { - throw_or_abort("IPA log_poly_length is too large"); + throw_or_abort("IPA log_poly_length is too large: " + std::to_string(uint32_t(log_poly_length.get_value()))); } for (size_t i = 0; i < CONST_ECCVM_LOG_N; i++) { // TODO(https://github.com/AztecProtocol/barretenberg/issues/1114): insecure dummy_round derivation! stdlib::bool_t dummy_round = stdlib::witness_t(builder, i < CONST_ECCVM_LOG_N - uint32_t(log_poly_length.get_value())); - + Fr monomial = Fr::conditional_assign(dummy_round, Fr(0), u_challenges_inv[CONST_ECCVM_LOG_N - 1 - i] * r_pow); challenge_poly_eval *= (Fr(1) + monomial); @@ -823,12 +823,12 @@ template class IPA { /** * @brief Combines the challenge_poly evaluations using the challenge alpha. - * - * @param u_challenges_inv_1 - * @param u_challenges_inv_2 - * @param r - * @param alpha - * @return Fr + * + * @param u_challenges_inv_1 + * @param u_challenges_inv_2 + * @param r + * @param alpha + * @return Fr */ static Fr evaluate_and_accumulate_challenge_polys(Fr log_poly_length_1, std::vector u_challenges_inv_1, Fr log_poly_length_2, std::vector u_challenges_inv_2, Fr r, Fr alpha) { auto result = evaluate_challenge_poly(log_poly_length_1, u_challenges_inv_1, r) + alpha * evaluate_challenge_poly(log_poly_length_2, u_challenges_inv_2, r); @@ -837,9 +837,9 @@ template class IPA { /** * @brief Constructs challenge_poly(X) = ∏_{i ∈ [k]} (1 + u_{len-i}^{-1}.X^{2^{i-1}}). - * - * @param u_challenges_inv - * @return Polynomial + * + * @param u_challenges_inv + * @return Polynomial */ static Polynomial construct_poly_from_u_challenges_inv(const size_t log_poly_length, const std::span& u_challenges_inv) { const size_t poly_length = (1 << log_poly_length); @@ -874,11 +874,11 @@ template class IPA { /** * @brief Combines two challenge_polys using the challenge alpha. - * - * @param u_challenges_inv_1 - * @param u_challenges_inv_2 - * @param alpha - * @return Polynomial + * + * @param u_challenges_inv_1 + * @param u_challenges_inv_2 + * @param alpha + * @return Polynomial */ static Polynomial create_challenge_poly(const size_t log_poly_length_1, const std::vector& u_challenges_inv_1, const size_t log_poly_length_2, const std::vector& u_challenges_inv_2, bb::fq alpha) { // Always extend each to 1< class IPA { * @brief Takes two IPA claims and accumulates them into 1 IPA claim. Also computes IPA proof for the claim. * @details We create an IPA accumulator by running the IPA recursive verifier on each claim. Then, we generate challenges, and use these challenges to compute the new accumulator. We also create the accumulated polynomial, and generate the IPA proof for the accumulated claim. * More details are described here: https://hackmd.io/IXoLIPhVT_ej8yhZ_Ehvuw?both. - * - * @param verifier_ck - * @param transcript_1 - * @param claim_1 - * @param transcript_2 - * @param claim_2 - * @return std::pair, HonkProof> + * + * @param verifier_ck + * @param transcript_1 + * @param claim_1 + * @param transcript_2 + * @param claim_2 + * @return std::pair, HonkProof> */ static std::pair, HonkProof> accumulate(const std::shared_ptr>& ck, auto& transcript_1, OpeningClaim claim_1, auto& transcript_2, OpeningClaim claim_2) requires Curve::is_stdlib_type @@ -936,7 +936,7 @@ template class IPA { for (Fr u_inv_i : pair_2.u_challenges_inv) { native_u_challenges_inv_2.push_back(bb::fq(u_inv_i.get_value())); } - + // Compute proof for the claim auto prover_transcript = std::make_shared(); const OpeningPair opening_pair{ bb::fq(output_claim.opening_pair.challenge.get_value()), diff --git a/barretenberg/cpp/src/barretenberg/constants.hpp b/barretenberg/cpp/src/barretenberg/constants.hpp index 364600b2ef8..218761ae550 100644 --- a/barretenberg/cpp/src/barretenberg/constants.hpp +++ b/barretenberg/cpp/src/barretenberg/constants.hpp @@ -16,4 +16,8 @@ static constexpr uint32_t CONST_ECCVM_LOG_N = 15; static constexpr uint32_t MAX_LOOKUP_TABLES_SIZE = 75000; static constexpr uint32_t MAX_DATABUS_SIZE = 10000; + +// The number of entries in ProverPolynomials reserved for randomness intended to mask witness commitments, witness +// evaluation at the sumcheck challenge, and, if necessary, the evaluation of the corresponding shift +static constexpr uint32_t MASKING_OFFSET = 4; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.hpp index d645b460708..b27be4d3aae 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.hpp @@ -159,32 +159,34 @@ template class ContentAddressedAppendOn /** * @brief Returns the index of the provided leaf in the tree */ - void find_leaf_index(const fr& leaf, bool includeUncommitted, const FindLeafCallback& on_completion) const; + void find_leaf_indices(const std::vector& leaves, + bool includeUncommitted, + const FindLeafCallback& on_completion) const; /** * @brief Returns the index of the provided leaf in the tree */ - void find_leaf_index(const fr& leaf, - const block_number_t& blockNumber, - bool includeUncommitted, - const FindLeafCallback& on_completion) const; + void find_leaf_indices(const std::vector& leaves, + const block_number_t& blockNumber, + bool includeUncommitted, + const FindLeafCallback& on_completion) const; /** * @brief Returns the index of the provided leaf in the tree only if it exists after the index value provided */ - void find_leaf_index_from(const fr& leaf, - const index_t& start_index, - bool includeUncommitted, - const FindLeafCallback& on_completion) const; + void find_leaf_indices_from(const std::vector& leaves, + const index_t& start_index, + bool includeUncommitted, + const FindLeafCallback& on_completion) const; /** * @brief Returns the index of the provided leaf in the tree only if it exists after the index value provided */ - void find_leaf_index_from(const fr& leaf, - const index_t& start_index, - const block_number_t& blockNumber, - bool includeUncommitted, - const FindLeafCallback& on_completion) const; + void find_leaf_indices_from(const std::vector& leaves, + const index_t& start_index, + const block_number_t& blockNumber, + bool includeUncommitted, + const FindLeafCallback& on_completion) const; /** * @brief Returns the block numbers that correspond to the given indices values @@ -415,14 +417,9 @@ void ContentAddressedAppendOnlyTree::find_block_numbers( execute_and_report( [=, this](TypedResponse& response) { response.inner.blockNumbers.reserve(indices.size()); - TreeMeta meta; ReadTransactionPtr tx = store_->create_read_transaction(); - store_->get_meta(meta, *tx, true); - index_t maxIndex = meta.committedSize; for (index_t index : indices) { - bool outOfRange = index >= maxIndex; - std::optional block = - outOfRange ? std::nullopt : store_->find_block_for_index(index, *tx); + std::optional block = store_->find_block_for_index(index, *tx); response.inner.blockNumbers.emplace_back(block); } }, @@ -441,16 +438,14 @@ void ContentAddressedAppendOnlyTree::find_block_numbers( execute_and_report( [=, this](TypedResponse& response) { response.inner.blockNumbers.reserve(indices.size()); - TreeMeta meta; BlockPayload blockPayload; ReadTransactionPtr tx = store_->create_read_transaction(); - store_->get_meta(meta, *tx, true); if (!store_->get_block_data(blockNumber, blockPayload, *tx)) { throw std::runtime_error(format("Unable to find block numbers for indices for block ", blockNumber, ", failed to get block data.")); } - index_t maxIndex = std::min(meta.committedSize, blockPayload.size); + index_t maxIndex = blockPayload.size; for (index_t index : indices) { bool outOfRange = index >= maxIndex; std::optional block = @@ -718,43 +713,45 @@ void ContentAddressedAppendOnlyTree::get_leaf(const index_ } template -void ContentAddressedAppendOnlyTree::find_leaf_index(const fr& leaf, - bool includeUncommitted, - const FindLeafCallback& on_completion) const +void ContentAddressedAppendOnlyTree::find_leaf_indices( + const std::vector& leaves, + bool includeUncommitted, + const FindLeafCallback& on_completion) const { - find_leaf_index_from(leaf, 0, includeUncommitted, on_completion); + find_leaf_indices_from(leaves, 0, includeUncommitted, on_completion); } template -void ContentAddressedAppendOnlyTree::find_leaf_index(const fr& leaf, - const block_number_t& blockNumber, - bool includeUncommitted, - const FindLeafCallback& on_completion) const +void ContentAddressedAppendOnlyTree::find_leaf_indices( + const std::vector& leaves, + const block_number_t& blockNumber, + bool includeUncommitted, + const FindLeafCallback& on_completion) const { - find_leaf_index_from(leaf, 0, blockNumber, includeUncommitted, on_completion); + find_leaf_indices_from(leaves, 0, blockNumber, includeUncommitted, on_completion); } template -void ContentAddressedAppendOnlyTree::find_leaf_index_from( - const fr& leaf, const index_t& start_index, bool includeUncommitted, const FindLeafCallback& on_completion) const +void ContentAddressedAppendOnlyTree::find_leaf_indices_from( + const std::vector& leaves, + const index_t& start_index, + bool includeUncommitted, + const FindLeafCallback& on_completion) const { auto job = [=, this]() -> void { execute_and_report( [=, this](TypedResponse& response) { - if (leaf == fr::zero()) { - throw std::runtime_error("Requesting indices for zero leaves is prohibited"); - } + response.inner.leaf_indices.reserve(leaves.size()); ReadTransactionPtr tx = store_->create_read_transaction(); + RequestContext requestContext; requestContext.includeUncommitted = includeUncommitted; requestContext.root = store_->get_current_root(*tx, includeUncommitted); - std::optional leaf_index = - store_->find_leaf_index_from(leaf, start_index, requestContext, *tx, includeUncommitted); - response.success = leaf_index.has_value(); - if (response.success) { - response.inner.leaf_index = leaf_index.value(); - } else { - response.message = format("Failed to find index from ", start_index, " for leaf ", leaf); + + for (const auto& leaf : leaves) { + std::optional leaf_index = + store_->find_leaf_index_from(leaf, start_index, requestContext, *tx); + response.inner.leaf_indices.emplace_back(leaf_index); } }, on_completion); @@ -763,8 +760,8 @@ void ContentAddressedAppendOnlyTree::find_leaf_index_from( } template -void ContentAddressedAppendOnlyTree::find_leaf_index_from( - const fr& leaf, +void ContentAddressedAppendOnlyTree::find_leaf_indices_from( + const std::vector& leaves, const index_t& start_index, const block_number_t& blockNumber, bool includeUncommitted, @@ -773,12 +770,10 @@ void ContentAddressedAppendOnlyTree::find_leaf_index_from( auto job = [=, this]() -> void { execute_and_report( [=, this](TypedResponse& response) { + response.inner.leaf_indices.reserve(leaves.size()); if (blockNumber == 0) { throw std::runtime_error("Unable to find leaf index for block number 0"); } - if (leaf == fr::zero()) { - throw std::runtime_error("Requesting indices for zero leaves is prohibited"); - } ReadTransactionPtr tx = store_->create_read_transaction(); BlockPayload blockData; if (!store_->get_block_data(blockNumber, blockData, *tx)) { @@ -788,18 +783,17 @@ void ContentAddressedAppendOnlyTree::find_leaf_index_from( blockNumber, ", failed to get block data.")); } + RequestContext requestContext; requestContext.blockNumber = blockNumber; requestContext.includeUncommitted = includeUncommitted; requestContext.root = blockData.root; - std::optional leaf_index = - store_->find_leaf_index_from(leaf, start_index, requestContext, *tx, includeUncommitted); - response.success = leaf_index.has_value(); - if (response.success) { - response.inner.leaf_index = leaf_index.value(); - } else { - response.message = format( - "Failed to find index from ", start_index, " for leaf ", leaf, " at block ", blockNumber); + requestContext.maxIndex = blockData.size; + + for (const auto& leaf : leaves) { + std::optional leaf_index = + store_->find_leaf_index_from(leaf, start_index, requestContext, *tx); + response.inner.leaf_indices.emplace_back(leaf_index); } }, on_completion); diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.test.cpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.test.cpp index 83f72c9ca1f..fb16c9d9053 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.test.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/append_only_tree/content_addressed_append_only_tree.test.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -220,83 +221,6 @@ void finalise_block(TreeType& tree, const block_number_t& blockNumber, bool expe signal.wait_for_level(); } -void check_find_leaf_index( - TreeType& tree, const fr& leaf, index_t expected_index, bool expected_success, bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index(leaf, includeUncommitted, completion); - signal.wait_for_level(); -} - -void check_find_historic_leaf_index(TreeType& tree, - const index_t& block_number, - const fr& leaf, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index(leaf, block_number, includeUncommitted, completion); - signal.wait_for_level(); -} - -void check_find_historic_leaf_index_from(TreeType& tree, - const index_t& block_number, - const fr& leaf, - index_t start_index, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index_from(leaf, start_index, block_number, includeUncommitted, completion); - signal.wait_for_level(); -} - -void check_find_leaf_index_from(TreeType& tree, - const fr& leaf, - index_t start_index, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index_from(leaf, start_index, includeUncommitted, completion); - signal.wait_for_level(); -} - void check_leaf( TreeType& tree, const fr& leaf, index_t leaf_index, bool expected_success, bool includeUncommitted = true) { @@ -711,19 +635,19 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, test_find_leaf_index) add_value(tree, 40); // check the committed state and that the uncommitted state is empty - check_find_leaf_index(tree, 10, 1, true, true); - check_find_leaf_index(tree, 10, 0, false, false); + check_find_leaf_index(tree, fr(10), 1, true, true); + check_find_leaf_index(tree, { fr(10) }, { std::nullopt }, true, false); - check_find_leaf_index(tree, 15, 0, false, true); - check_find_leaf_index(tree, 15, 0, false, false); + check_find_leaf_index(tree, { fr(15) }, { std::nullopt }, true, true); + check_find_leaf_index(tree, { fr(15) }, { std::nullopt }, true, false); - check_find_leaf_index(tree, 40, 3, true, true); - check_find_leaf_index(tree, 30, 0, true, true); - check_find_leaf_index(tree, 20, 2, true, true); + check_find_leaf_index(tree, fr(40), 3, true, true); + check_find_leaf_index(tree, fr(30), 0, true, true); + check_find_leaf_index(tree, fr(20), 2, true, true); - check_find_leaf_index(tree, 40, 0, false, false); - check_find_leaf_index(tree, 30, 0, false, false); - check_find_leaf_index(tree, 20, 0, false, false); + check_find_leaf_index(tree, { fr(40) }, { std::nullopt }, true, false); + check_find_leaf_index(tree, { fr(30) }, { std::nullopt }, true, false); + check_find_leaf_index(tree, { fr(20) }, { std::nullopt }, true, false); commit_tree(tree); @@ -731,13 +655,13 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, test_find_leaf_index) add_values(tree, values); // check the now committed state - check_find_leaf_index(tree, 40, 3, true, false); - check_find_leaf_index(tree, 30, 0, true, false); - check_find_leaf_index(tree, 20, 2, true, false); + check_find_leaf_index(tree, fr(40), 3, true, false); + check_find_leaf_index(tree, fr(30), 0, true, false); + check_find_leaf_index(tree, fr(20), 2, true, false); // check the new uncommitted state - check_find_leaf_index(tree, 18, 5, true, true); - check_find_leaf_index(tree, 18, 0, false, false); + check_find_leaf_index(tree, fr(18), 5, true, true); + check_find_leaf_index(tree, { fr(18) }, { std::nullopt }, true, false); commit_tree(tree); @@ -745,9 +669,9 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, test_find_leaf_index) add_values(tree, values); // verify the find index from api - check_find_leaf_index_from(tree, 18, 0, 5, true, true); - check_find_leaf_index_from(tree, 19, 6, 10, true, true); - check_find_leaf_index_from(tree, 19, 0, 0, false, false); + check_find_leaf_index_from(tree, fr(18), 0, 5, true, true); + check_find_leaf_index_from(tree, fr(19), 6, 10, true, true); + check_find_leaf_index_from(tree, { fr(19) }, 0, { std::nullopt }, true, false); commit_tree(tree); @@ -759,13 +683,13 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, test_find_leaf_index) check_size(tree, 12, false); // look past the last instance of this leaf - check_find_leaf_index_from(tree, 18, 6, 0, false, true); + check_find_leaf_index_from(tree, { fr(18) }, 6, { std::nullopt }, true, true); // look beyond the end of uncommitted - check_find_leaf_index_from(tree, 18, 15, 0, false, true); + check_find_leaf_index_from(tree, { fr(18) }, 15, { std::nullopt }, true, true); // look beyond the end of committed and don't include uncomitted - check_find_leaf_index_from(tree, 88, 13, 0, false, false); + check_find_leaf_index_from(tree, { fr(88) }, 13, { std::nullopt }, true, false); } TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_add_multiple_values) @@ -856,10 +780,10 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_not_retrieve_zero_leaf_i add_values(tree, to_add); commit_tree(tree); fr leaf = fr::zero(); - check_find_leaf_index(tree, leaf, 0, false); - check_find_historic_leaf_index(tree, 1, leaf, 0, false); - check_find_leaf_index_from(tree, leaf, 0, 0, false); - check_find_historic_leaf_index_from(tree, 1, leaf, 0, 0, false); + check_find_leaf_index(tree, { leaf }, { std::nullopt }, true); + check_historic_find_leaf_index(tree, { leaf }, 1, { std::nullopt }, true); + check_find_leaf_index_from(tree, { leaf }, 0, { std::nullopt }, true); + check_historic_find_leaf_index_from(tree, { leaf }, 1, 0, { std::nullopt }, true); } TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_commit_multiple_blocks) @@ -1042,23 +966,23 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, test_find_historic_leaf_inde add_values(tree, values); // should not be present at block 1 - check_find_historic_leaf_index(tree, 1, 26, 0, false); + check_historic_find_leaf_index(tree, { fr(26) }, 1, { std::nullopt }, true); // should be present at block 2 - check_find_historic_leaf_index(tree, 2, 26, 6, true); + check_historic_find_leaf_index(tree, fr(26), 2, 6, true); // at block 1 leaf 18 should not be found if only considering committed - check_find_historic_leaf_index_from(tree, 1, 18, 2, 0, false, false); + check_historic_find_leaf_index_from(tree, { fr(18) }, 1, 2, { std::nullopt }, true, false); // at block 2 it should be - check_find_historic_leaf_index_from(tree, 2, 18, 2, 5, true); + check_historic_find_leaf_index_from(tree, fr(18), 2, 2, 5, true); // at block 2, from index 6, 19 should not be found if looking only at committed - check_find_historic_leaf_index_from(tree, 2, 19, 6, 5, false, false); + check_historic_find_leaf_index_from(tree, { fr(19) }, 2, 6, { std::nullopt }, true, false); // at block 2, from index 6, 19 should be found if looking at uncommitted too - check_find_historic_leaf_index_from(tree, 2, 19, 6, 10, true); + check_historic_find_leaf_index_from(tree, fr(19), 2, 6, 10, true); commit_tree(tree); // at block 3, from index 6, should now be found in committed only - check_find_historic_leaf_index_from(tree, 3, 19, 6, 10, true, false); + check_historic_find_leaf_index_from(tree, fr(19), 3, 6, 10, true, false); } TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_be_filled) @@ -1249,12 +1173,12 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_create_images_at_histori check_root(treeAtBlock2, block2Root); check_sibling_path(treeAtBlock2, 3, block2SiblingPathIndex3, false, true); check_leaf(treeAtBlock2, 20, 2, true); - check_find_leaf_index(treeAtBlock2, 10, 1, true); - check_find_leaf_index_from(treeAtBlock2, 15, 1, 4, true); + check_find_leaf_index(treeAtBlock2, fr(10), 1, true); + check_find_leaf_index_from(treeAtBlock2, fr(15), 1, 4, true); // should not exist in our image check_leaf(treeAtBlock2, 4, 9, false); - check_find_leaf_index(treeAtBlock2, 4, 0, false); + check_find_leaf_index(treeAtBlock2, { fr(4) }, { std::nullopt }, true); // now add the same values to our image add_values(treeAtBlock2, values); @@ -1269,12 +1193,12 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_create_images_at_histori // now check historic data check_historic_sibling_path(treeAtBlock2, 3, block1SiblingPathIndex3, 1); - check_find_historic_leaf_index(treeAtBlock2, 1, 10, 1, true); - check_find_historic_leaf_index(treeAtBlock2, 2, 16, 8, true, true); - check_find_historic_leaf_index(treeAtBlock2, 2, 16, 8, false, false); + check_historic_find_leaf_index(treeAtBlock2, fr(10), 2, 1, true); + check_historic_find_leaf_index(treeAtBlock2, fr(16), 2, 8, true, true); + check_historic_find_leaf_index(treeAtBlock2, { fr(16) }, 2, { std::nullopt }, true, false); - check_find_historic_leaf_index_from(treeAtBlock2, 1, 18, 3, 0, false, false); - check_find_historic_leaf_index_from(treeAtBlock2, 1, 20, 0, 2, true, false); + check_historic_find_leaf_index_from(treeAtBlock2, { fr(18) }, 1, 3, { std::nullopt }, true, false); + check_historic_find_leaf_index_from(treeAtBlock2, fr(20), 1, 0, 2, true, false); check_block_height(treeAtBlock2, 2); @@ -1318,8 +1242,8 @@ TEST_F(PersistedContentAddressedAppendOnlyTreeTest, can_remove_historic_block_da const index_t leafIndex = 6; check_historic_leaf(tree, blockNumber, VALUES[leafIndex], leafIndex, expectedSuccess); - check_find_historic_leaf_index(tree, blockNumber, VALUES[leafIndex], leafIndex, expectedSuccess); - check_find_historic_leaf_index_from(tree, blockNumber, VALUES[leafIndex], 0, leafIndex, expectedSuccess); + check_historic_find_leaf_index(tree, VALUES[leafIndex], blockNumber, leafIndex, expectedSuccess); + check_historic_find_leaf_index_from(tree, VALUES[leafIndex], blockNumber, 0, leafIndex, expectedSuccess); } }; @@ -1453,7 +1377,7 @@ void test_unwind(std::string directory, // Trying to find leaves appended in the block that was removed should fail check_leaf(tree, values[1 + deletedBlockStartIndex], 1 + deletedBlockStartIndex, false); - check_find_leaf_index(tree, values[1 + deletedBlockStartIndex], 1 + deletedBlockStartIndex, false); + check_find_leaf_index(tree, { values[1 + deletedBlockStartIndex] }, { std::nullopt }, true); for (index_t j = 0; j < numBlocks; j++) { index_t historicBlockNumber = j + 1; @@ -1466,18 +1390,20 @@ void test_unwind(std::string directory, const index_t leafIndex = 1; check_historic_leaf(tree, historicBlockNumber, values[leafIndex], leafIndex, expectedSuccess); + std::vector> expected_results; + if (expectedSuccess) { + if (values[leafIndex] != fr::zero()) { + expected_results.emplace_back(std::make_optional(leafIndex)); + } else { + expected_results.emplace_back(std::nullopt); + } + } + // find historic leaves, provided they are not zero leaves - check_find_historic_leaf_index(tree, - historicBlockNumber, - values[leafIndex], - leafIndex, - expectedSuccess && values[leafIndex] != fr::zero()); - check_find_historic_leaf_index_from(tree, - historicBlockNumber, - values[leafIndex], - 0, - leafIndex, - expectedSuccess && values[leafIndex] != fr::zero()); + check_historic_find_leaf_index( + tree, { values[leafIndex] }, historicBlockNumber, expected_results, expectedSuccess); + check_historic_find_leaf_index_from( + tree, { values[leafIndex] }, historicBlockNumber, 0, expected_results, expectedSuccess); } } } diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.hpp index e075e36315d..94b8d2723bf 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.hpp @@ -127,23 +127,6 @@ class ContentAddressedIndexedTree : public ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const; - - /** - * @brief Find the index of the provided leaf value if it exists, only considers indexed beyond the value provided - */ - void find_leaf_index_from( - const LeafValueType& leaf, - const index_t& start_index, - bool includeUncommitted, - const ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const; - /** * @brief Find the leaf with the value immediately lower then the value provided */ @@ -154,25 +137,6 @@ class ContentAddressedIndexedTree : public ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const; - - /** - * @brief Find the index of the provided leaf value if it exists, only considers indexed beyond the value provided - */ - void find_leaf_index_from( - const LeafValueType& leaf, - const block_number_t& blockNumber, - const index_t& start_index, - bool includeUncommitted, - const ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const; - /** * @brief Find the leaf with the value immediately lower then the value provided */ @@ -447,95 +411,6 @@ void ContentAddressedIndexedTree::get_leaf(const index_t& workers_->enqueue(job); } -template -void ContentAddressedIndexedTree::find_leaf_index( - const LeafValueType& leaf, - bool includeUncommitted, - const ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const -{ - find_leaf_index_from(leaf, 0, includeUncommitted, on_completion); -} - -template -void ContentAddressedIndexedTree::find_leaf_index( - const LeafValueType& leaf, - const block_number_t& blockNumber, - bool includeUncommitted, - const ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const -{ - find_leaf_index_from(leaf, blockNumber, 0, includeUncommitted, on_completion); -} - -template -void ContentAddressedIndexedTree::find_leaf_index_from( - const LeafValueType& leaf, - const index_t& start_index, - bool includeUncommitted, - const ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const -{ - auto job = [=, this]() -> void { - execute_and_report( - [=, this](TypedResponse& response) { - typename Store::ReadTransactionPtr tx = store_->create_read_transaction(); - RequestContext requestContext; - requestContext.includeUncommitted = includeUncommitted; - requestContext.root = store_->get_current_root(*tx, includeUncommitted); - std::optional leaf_index = - store_->find_leaf_index_from(leaf, start_index, requestContext, *tx, includeUncommitted); - response.success = leaf_index.has_value(); - if (response.success) { - response.inner.leaf_index = leaf_index.value(); - } else { - response.message = format("Index not found for leaf ", leaf); - } - }, - on_completion); - }; - workers_->enqueue(job); -} - -template -void ContentAddressedIndexedTree::find_leaf_index_from( - const LeafValueType& leaf, - const block_number_t& blockNumber, - const index_t& start_index, - bool includeUncommitted, - const ContentAddressedAppendOnlyTree::FindLeafCallback& on_completion) const -{ - auto job = [=, this]() -> void { - execute_and_report( - [=, this](TypedResponse& response) { - if (blockNumber == 0) { - throw std::runtime_error("Unable to find leaf index from for block 0"); - } - typename Store::ReadTransactionPtr tx = store_->create_read_transaction(); - BlockPayload blockData; - if (!store_->get_block_data(blockNumber, blockData, *tx)) { - throw std::runtime_error(format("Unable to find leaf from index ", - start_index, - " for block ", - blockNumber, - ", failed to get block data.")); - } - RequestContext requestContext; - requestContext.blockNumber = blockNumber; - requestContext.includeUncommitted = includeUncommitted; - requestContext.root = blockData.root; - std::optional leaf_index = - store_->find_leaf_index_from(leaf, start_index, requestContext, *tx, includeUncommitted); - response.success = leaf_index.has_value(); - if (response.success) { - response.inner.leaf_index = leaf_index.value(); - } else { - response.message = - format("Unable to find leaf from index ", start_index, " for block ", blockNumber); - } - }, - on_completion); - }; - workers_->enqueue(job); -} - template void ContentAddressedIndexedTree::find_low_leaf(const fr& leaf_key, bool includeUncommitted, @@ -580,6 +455,7 @@ void ContentAddressedIndexedTree::find_low_leaf(const fr& requestContext.blockNumber = blockNumber; requestContext.includeUncommitted = includeUncommitted; requestContext.root = blockData.root; + requestContext.maxIndex = blockData.size; std::pair result = store_->find_low_value(leaf_key, requestContext, *tx); response.inner.index = result.second; response.inner.is_already_present = result.first; diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.test.cpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.test.cpp index 24e8565cc4f..b42d3175574 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.test.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/indexed_tree/content_addressed_indexed_tree.test.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -195,90 +196,6 @@ GetLowIndexedLeafResponse get_historic_low_leaf(TypeOfTree& tree, return low_leaf_info; } -template -void check_find_leaf_index(TypeOfTree& tree, - const LeafValueType& leaf, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index(leaf, includeUncommitted, completion); - signal.wait_for_level(); -} - -template -void check_find_leaf_index_from(TypeOfTree& tree, - const LeafValueType& leaf, - index_t start_index, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index_from(leaf, start_index, includeUncommitted, completion); - signal.wait_for_level(); -} - -template -void check_historic_find_leaf_index(TypeOfTree& tree, - const LeafValueType& leaf, - block_number_t blockNumber, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index(leaf, blockNumber, includeUncommitted, completion); - signal.wait_for_level(); -} - -template -void check_historic_find_leaf_index_from(TypeOfTree& tree, - const LeafValueType& leaf, - block_number_t blockNumber, - index_t start_index, - index_t expected_index, - bool expected_success, - bool includeUncommitted = true) -{ - Signal signal; - auto completion = [&](const TypedResponse& response) -> void { - EXPECT_EQ(response.success, expected_success); - if (response.success) { - EXPECT_EQ(response.inner.leaf_index, expected_index); - } - signal.signal_level(); - }; - - tree.find_leaf_index_from(leaf, blockNumber, start_index, includeUncommitted, completion); - signal.wait_for_level(); -} - template void check_historic_leaf(TypeOfTree& tree, const LeafValueType& leaf, @@ -625,18 +542,23 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_find_leaf_index) // check the committed state and that the uncommitted state is empty check_find_leaf_index(tree, NullifierLeafValue(10), 1 + initial_size, true, true); - check_find_leaf_index(tree, NullifierLeafValue(10), 0, false, false); + check_find_leaf_index( + tree, { NullifierLeafValue(10) }, { std::nullopt }, true, false); - check_find_leaf_index(tree, NullifierLeafValue(15), 0, false, true); - check_find_leaf_index(tree, NullifierLeafValue(15), 0, false, false); + check_find_leaf_index(tree, { NullifierLeafValue(15) }, { std::nullopt }, true, true); + check_find_leaf_index( + tree, { NullifierLeafValue(15) }, { std::nullopt }, true, false); check_find_leaf_index(tree, NullifierLeafValue(40), 3 + initial_size, true, true); check_find_leaf_index(tree, NullifierLeafValue(30), 0 + initial_size, true, true); check_find_leaf_index(tree, NullifierLeafValue(20), 2 + initial_size, true, true); - check_find_leaf_index(tree, NullifierLeafValue(40), 0, false, false); - check_find_leaf_index(tree, NullifierLeafValue(30), 0, false, false); - check_find_leaf_index(tree, NullifierLeafValue(20), 0, false, false); + check_find_leaf_index( + tree, { NullifierLeafValue(40) }, { std::nullopt }, true, false); + check_find_leaf_index( + tree, { NullifierLeafValue(30) }, { std::nullopt }, true, false); + check_find_leaf_index( + tree, { NullifierLeafValue(20) }, { std::nullopt }, true, false); commit_tree(tree); @@ -654,7 +576,8 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_find_leaf_index) // check the new uncommitted state check_find_leaf_index(tree, NullifierLeafValue(18), 5 + initial_size, true, true); - check_find_leaf_index(tree, NullifierLeafValue(18), 0, false, false); + check_find_leaf_index( + tree, { NullifierLeafValue(18) }, { std::nullopt }, true, false); commit_tree(tree); @@ -1854,8 +1777,9 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_historical_leaves) LMDBTreeStore::SharedPtr db = std::make_shared(_directory, name, _mapSize, _maxReaders); std::unique_ptr> store = std::make_unique>(name, depth, db); - auto tree = ContentAddressedIndexedTree, Poseidon2HashPolicy>( - std::move(store), workers, current_size); + using LocalTreeType = + ContentAddressedIndexedTree, Poseidon2HashPolicy>; + auto tree = LocalTreeType(std::move(store), workers, current_size); /** * Intial state: @@ -1913,7 +1837,7 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_historical_leaves) auto leaf2AtBlock2 = PublicDataLeafValue(30, 5); check_historic_leaf(tree, leaf1AtBlock1, 1, 1, true); - // shoudl find this leaf at both blocks 1 and 2 as it looks for the slot which doesn't change + // should find this leaf at both blocks 1 and 2 as it looks for the slot which doesn't change check_historic_find_leaf_index(tree, leaf1AtBlock1, 1, 1, true); check_historic_find_leaf_index(tree, leaf1AtBlock1, 2, 1, true); @@ -1965,7 +1889,8 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_historical_leaves) check_historic_leaf(tree, leaf2AtBlock3, 2, 3, true); // should not be found at block 1 - check_historic_find_leaf_index_from(tree, PublicDataLeafValue(10, 20), 1, 0, 0, false); + check_historic_find_leaf_index_from( + tree, { PublicDataLeafValue(10, 20) }, 1, 0, { std::nullopt }, true); // should be found at block check_historic_find_leaf_index_from(tree, PublicDataLeafValue(10, 20), 2, 0, 3, true); @@ -2109,7 +2034,7 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_can_create_forks_at_histor // should not exist in our image get_leaf(treeAtBlock2, 35 + batch_size, false, false); - check_find_leaf_index(treeAtBlock2, batch3[4], 0, false); + check_find_leaf_index(treeAtBlock2, { batch3[4] }, { std::nullopt }, true); // now add the same values to our image add_values(treeAtBlock2, batch3); @@ -2129,10 +2054,12 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_can_create_forks_at_histor EXPECT_EQ(historicSiblingPath, block1SiblingPathIndex3); check_historic_find_leaf_index(treeAtBlock2, batch1[3], 1, 3 + batch_size, true); check_historic_find_leaf_index(treeAtBlock2, batch3[3], 2, 35 + batch_size, true, true); - check_historic_find_leaf_index(treeAtBlock2, batch3[3], 2, 35 + batch_size, false, false); + check_historic_find_leaf_index( + treeAtBlock2, { batch3[3] }, 2, { std::nullopt }, true, false); check_historic_find_leaf_index_from(treeAtBlock2, batch1[3], 2, 0, 3 + batch_size, true, false); - check_historic_find_leaf_index_from(treeAtBlock2, batch3[3], 2, 20 + batch_size, 35 + batch_size, false, false); + check_historic_find_leaf_index_from( + treeAtBlock2, { batch3[3] }, 2, 20 + batch_size, { std::nullopt }, true, false); check_historic_find_leaf_index_from(treeAtBlock2, batch3[3], 2, 20 + batch_size, 35 + batch_size, true, true); check_unfinalised_block_height(treeAtBlock2, 2); @@ -2151,8 +2078,9 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_remove_historical_blocks) LMDBTreeStore::SharedPtr db = std::make_shared(_directory, name, _mapSize, _maxReaders); std::unique_ptr> store = std::make_unique>(name, depth, db); - auto tree = ContentAddressedIndexedTree, Poseidon2HashPolicy>( - std::move(store), workers, current_size); + using LocalTreeType = + ContentAddressedIndexedTree, Poseidon2HashPolicy>; + auto tree = LocalTreeType(std::move(store), workers, current_size); /** * Intial state: @@ -2268,7 +2196,8 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_remove_historical_blocks) check_historic_leaf(tree, leaf2AtBlock3, 2, 3, true); // should not be found at block 1 - check_historic_find_leaf_index_from(tree, PublicDataLeafValue(10, 20), 1, 0, 0, false); + check_historic_find_leaf_index_from( + tree, { PublicDataLeafValue(10, 20) }, 1, 0, { std::nullopt }, true); // should be found at block check_historic_find_leaf_index_from(tree, PublicDataLeafValue(10, 20), 2, 0, 3, true); @@ -2288,7 +2217,8 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_remove_historical_blocks) // Historic queries against block 1 should no longer work check_historic_leaf(tree, leaf1AtBlock1, 1, 1, false); - check_historic_find_leaf_index(tree, leaf1AtBlock1, 1, 1, false); + check_historic_find_leaf_index( + tree, { leaf1AtBlock1 }, 1, { std::nullopt }, false); // Queries against block 2 should work check_historic_leaf(tree, leaf2AtBlock2, 2, 2, true); @@ -2312,8 +2242,9 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_unwind_blocks) LMDBTreeStore::SharedPtr db = std::make_shared(_directory, name, _mapSize, _maxReaders); std::unique_ptr> store = std::make_unique>(name, depth, db); - auto tree = ContentAddressedIndexedTree, Poseidon2HashPolicy>( - std::move(store), workers, current_size); + using LocalTreeType = + ContentAddressedIndexedTree, Poseidon2HashPolicy>; + auto tree = LocalTreeType(std::move(store), workers, current_size); /** * Intial state: @@ -2477,7 +2408,8 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_unwind_blocks) check_historic_leaf(tree, leaf2AtBlock3, 2, 3, true); // should not be found at block 1 - check_historic_find_leaf_index_from(tree, PublicDataLeafValue(10, 20), 1, 0, 0, false); + check_historic_find_leaf_index_from( + tree, { PublicDataLeafValue(10, 20) }, 1, 0, { std::nullopt }, true); // should be found at block check_historic_find_leaf_index_from(tree, PublicDataLeafValue(10, 20), 2, 0, 3, true); @@ -2516,8 +2448,10 @@ TEST_F(PersistedContentAddressedIndexedTreeTest, test_unwind_blocks) check_block_and_size_data(db, 3, current_size, true); // should fail to find the leaf at index 4 - check_find_leaf_index(tree, PublicDataLeafValue(50, 8), 4, false); - check_find_leaf_index_from(tree, PublicDataLeafValue(50, 8), 0, 5, false); + check_find_leaf_index( + tree, { PublicDataLeafValue(50, 8) }, { std::nullopt }, true); + check_find_leaf_index_from( + tree, { PublicDataLeafValue(50, 8) }, 0, { std::nullopt }, true); // the leaf at index 2 should no longer be as it was after block 5 EXPECT_NE(get_leaf(tree, 2), create_indexed_public_data_leaf(30, 6, 4, 50)); @@ -2797,8 +2731,8 @@ void test_nullifier_tree_unwind(std::string directory, // Trying to find leaves appended in the block that was removed should fail get_leaf(tree, 1 + deletedBlockStartIndex, false, false); - check_find_leaf_index( - tree, leafValues[1 + deletedBlockStartIndexIntoLocalValues], 1 + deletedBlockStartIndex, false); + check_find_leaf_index( + tree, { leafValues[1 + deletedBlockStartIndexIntoLocalValues] }, { std::nullopt }, true); } for (index_t j = 0; j < numBlocks; j++) { @@ -2817,10 +2751,15 @@ void test_nullifier_tree_unwind(std::string directory, const index_t expectedIndexInTree = leafIndex + batchSize; check_historic_leaf( tree, leafValues[leafIndex], expectedIndexInTree, historicBlockNumber, expectedSuccess, false); - check_historic_find_leaf_index( - tree, leafValues[leafIndex], historicBlockNumber, expectedIndexInTree, expectedSuccess, false); - check_historic_find_leaf_index_from( - tree, leafValues[leafIndex], historicBlockNumber, 0, expectedIndexInTree, expectedSuccess, false); + + std::vector> expectedResults; + if (expectedSuccess) { + expectedResults.emplace_back(std::make_optional(expectedIndexInTree)); + } + check_historic_find_leaf_index( + tree, { leafValues[leafIndex] }, historicBlockNumber, expectedResults, expectedSuccess, true); + check_historic_find_leaf_index_from( + tree, { leafValues[leafIndex] }, historicBlockNumber, 0, expectedResults, expectedSuccess, true); } } } diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.cpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.cpp index 09f87cae606..45802caf358 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.cpp @@ -161,15 +161,7 @@ void LMDBTreeStore::write_block_index_data(const block_number_t& blockNumber, msgpack::unpack((const char*)data.data(), data.size()).get().convert(payload); } - // Double check it's not already present (it shouldn't be) - // We then add the block number and sort - // Sorting shouldn't be necessary as we add blocks in ascending order, but we will make sure - // Sorting here and when we unwind blocks means that looking up the block number for an index becomes O(1) - // These lookups are much more frequent than adds or deletes so we take the hit here - if (!payload.contains(blockNumber)) { - payload.blockNumbers.emplace_back(blockNumber); - payload.sort(); - } + payload.add_block(blockNumber); // Write the new payload back down msgpack::sbuffer buffer; @@ -189,11 +181,11 @@ bool LMDBTreeStore::find_block_for_index(const index_t& index, block_number_t& b } BlockIndexPayload payload; msgpack::unpack((const char*)data.data(), data.size()).get().convert(payload); - if (payload.blockNumbers.empty()) { + if (payload.is_empty()) { return false; } // The block numbers are sorted so we simply return the lowest - blockNumber = payload.blockNumbers[0]; + blockNumber = payload.get_min_block_number(); return true; } @@ -217,7 +209,7 @@ void LMDBTreeStore::delete_block_index(const index_t& sizeAtBlock, payload.delete_block(blockNumber); // if it's now empty, delete it - if (payload.blockNumbers.empty()) { + if (payload.is_empty()) { tx.delete_value(key, *_indexToBlockDatabase); return; } diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.hpp index a28ce245967..c67e13f5130 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/common/log.hpp" #include "barretenberg/common/serialize.hpp" #include "barretenberg/crypto/merkle_tree/indexed_tree/indexed_leaf.hpp" #include "barretenberg/crypto/merkle_tree/lmdb_store/callbacks.hpp" @@ -15,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -63,39 +65,90 @@ struct BlockIndexPayload { bool operator==(const BlockIndexPayload& other) const { return blockNumbers == other.blockNumbers; } - void sort() { std::sort(blockNumbers.begin(), blockNumbers.end()); } + bool is_empty() const { return blockNumbers.empty(); } + + block_number_t get_min_block_number() { return blockNumbers[0]; } bool contains(const block_number_t& blockNumber) { - auto it = std::lower_bound(blockNumbers.begin(), blockNumbers.end(), blockNumber); - if (it == blockNumbers.end()) { - // The block was not found, we can return + if (is_empty()) { return false; } - return *it == blockNumber; + if (blockNumbers.size() == 1) { + return blockNumbers[0] == blockNumber; + } + return blockNumber >= blockNumbers[0] && blockNumber <= blockNumbers[1]; } void delete_block(const block_number_t& blockNumber) { + // Shouldn't be possible, but no need to do anything here if (blockNumbers.empty()) { return; } - // shuffle the block number down, removing the one we want to remove and then pop the end item - auto it = std::lower_bound(blockNumbers.begin(), blockNumbers.end(), blockNumber); - if (it == blockNumbers.end()) { - // The block was not found, we can return + + // If the size is 1, the blocknumber must match that in index 0, if it does remove it + if (blockNumbers.size() == 1) { + if (blockNumbers[0] == blockNumber) { + blockNumbers.pop_back(); + } return; } - // It could be a block higher than the one we are looking for - if (*it != blockNumber) { + + // we have 2 entries, we must verify that the block number is equal to the item in index 1 + if (blockNumbers[1] != blockNumber) { + throw std::runtime_error(format("Unable to delete block number ", + blockNumber, + " for retrieval by index, current max block number at that index: ", + blockNumbers[1])); + } + // It is equal, decrement it, we know that the new block number must have been added previously + --blockNumbers[1]; + + // We have modified the high block. If it is now equal to the low block then pop it + if (blockNumbers[0] == blockNumbers[1]) { + blockNumbers.pop_back(); + } + } + + void add_block(const block_number_t& blockNumber) + { + // If empty, just add the block number + if (blockNumbers.empty()) { + blockNumbers.emplace_back(blockNumber); + return; + } + + // If the size is 1, then we must be adding the block 1 larger than that in index 0 + if (blockNumbers.size() == 1) { + if (blockNumber != blockNumbers[0] + 1) { + // We can't accept a block number for this index that does not immediately follow the block before + throw std::runtime_error(format("Unable to store block number ", + blockNumber, + " for retrieval by index, current max block number at that index: ", + blockNumbers[0])); + } + blockNumbers.emplace_back(blockNumber); return; } - // we have found our block, shuffle blocks after this one down - auto readIt = it + 1; - while (readIt != blockNumbers.end()) { - *it++ = *readIt++; + + // Size must be 2 here, if larger, this is an error + if (blockNumbers.size() != 2) { + throw std::runtime_error(format("Unable to store block number ", + blockNumber, + " for retrieval by index, block numbers is of invalid size: ", + blockNumbers.size())); + } + + // If the size is 2, then we must be adding the block 1 larger than that in index 1 + if (blockNumber != blockNumbers[1] + 1) { + // We can't accept a block number for this index that does not immediately follow the block before + throw std::runtime_error(format("Unable to store block number ", + blockNumber, + " for retrieval by index, current max block number at that index: ", + blockNumbers[1])); } - blockNumbers.pop_back(); + blockNumbers[1] = blockNumber; } }; /** diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.test.cpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.test.cpp index e9b85aa5bbc..c33eb42bc23 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.test.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.test.cpp @@ -273,11 +273,10 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_by_index) BlockAndIndex{ .blockNumber = 5, .index = 130 } }; LMDBTreeStore store(_directory, "DB1", _mapSize, _maxReaders); { - // write all of the blocks. we will write them in reverse order + // write all of the blocks. LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); - for (int i = int(blocks.size()) - 1; i >= 0; i--) { + for (auto block : blocks) { // the arg is block size so add 1 - const BlockAndIndex& block = blocks[size_t(i)]; store.write_block_index_data(block.blockNumber, block.index + 1, *transaction); } transaction->commit(); @@ -409,14 +408,24 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in { // write all of the blocks. we will write them in reverse order LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); - for (int i = int(blocks.size()) - 1; i >= 0; i--) { + for (auto block : blocks) { // the arg is block size so add 1 - const BlockAndIndex& block = blocks[size_t(i)]; store.write_block_index_data(block.blockNumber, block.index + 1, *transaction); } transaction->commit(); } + { + // we can't add a duplicate block at an index if it is not the next block number + LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); + // the arg is block size so add 1 + EXPECT_THROW(store.write_block_index_data(3, 60 + 1, *transaction), std::runtime_error); + EXPECT_THROW(store.write_block_index_data(6, 60 + 1, *transaction), std::runtime_error); + EXPECT_THROW(store.write_block_index_data(1, 25 + 1, *transaction), std::runtime_error); + EXPECT_THROW(store.write_block_index_data(3, 25 + 1, *transaction), std::runtime_error); + transaction->abort(); + } + { // read back some blocks and check them LMDBTreeReadTransaction::Ptr transaction = store.create_read_transaction(); @@ -435,11 +444,12 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in } { - // delete block 2 at index 60 + // attempting to delete block 2 at index 60 should fail as it is not the last block in the series at index 60 LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); // the arg is block size so add 1 - store.delete_block_index(blocks[1].index + 1, blocks[1].blockNumber, *transaction); - transaction->commit(); + EXPECT_THROW(store.delete_block_index(blocks[1].index + 1, blocks[1].blockNumber, *transaction), + std::runtime_error); + transaction->abort(); } { @@ -449,9 +459,9 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in EXPECT_TRUE(store.find_block_for_index(5, readBack, *transaction)); EXPECT_EQ(readBack, 1); - // should be the new lowest block at this index + // should still be the lowest block at this index EXPECT_TRUE(store.find_block_for_index(30, readBack, *transaction)); - EXPECT_EQ(readBack, 3); + EXPECT_EQ(readBack, 2); EXPECT_TRUE(store.find_block_for_index(82, readBack, *transaction)); EXPECT_EQ(readBack, 5); @@ -463,9 +473,9 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in // try and delete blocks that don't exist at index 60 LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); // the arg is block size so add 1 - store.delete_block_index(blocks[1].index + 1, 2, *transaction); - store.delete_block_index(blocks[1].index + 1, 5, *transaction); - transaction->commit(); + EXPECT_THROW(store.delete_block_index(blocks[1].index + 1, 2, *transaction), std::runtime_error); + EXPECT_THROW(store.delete_block_index(blocks[1].index + 1, 5, *transaction), std::runtime_error); + transaction->abort(); } { @@ -475,9 +485,8 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in EXPECT_TRUE(store.find_block_for_index(5, readBack, *transaction)); EXPECT_EQ(readBack, 1); - // should be the new lowest block at this index EXPECT_TRUE(store.find_block_for_index(30, readBack, *transaction)); - EXPECT_EQ(readBack, 3); + EXPECT_EQ(readBack, 2); EXPECT_TRUE(store.find_block_for_index(82, readBack, *transaction)); EXPECT_EQ(readBack, 5); @@ -486,7 +495,7 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in } { - // delete 2 more blocks + // delete the last 2 blocks at index 60 LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); // the arg is block size so add 1 store.delete_block_index(blocks[3].index + 1, blocks[3].blockNumber, *transaction); @@ -494,6 +503,32 @@ TEST_F(LMDBTreeStoreTest, can_write_and_retrieve_block_numbers_with_duplicate_in transaction->commit(); } + { + // check the blocks again + LMDBTreeReadTransaction::Ptr transaction = store.create_read_transaction(); + block_number_t readBack = 0; + EXPECT_TRUE(store.find_block_for_index(5, readBack, *transaction)); + EXPECT_EQ(readBack, 1); + + EXPECT_TRUE(store.find_block_for_index(30, readBack, *transaction)); + EXPECT_EQ(readBack, 2); + + EXPECT_TRUE(store.find_block_for_index(82, readBack, *transaction)); + EXPECT_EQ(readBack, 5); + } + + { + // delete the last final block at index 60 + LMDBTreeWriteTransaction::Ptr transaction = store.create_write_transaction(); + // the arg is block size so add 1 + // Only one block remains at index 60, try and delete one that doesn't exist, it should do nothing + store.delete_block_index(blocks[3].index + 1, blocks[3].blockNumber, *transaction); + + // Now delete the last block + store.delete_block_index(blocks[1].index + 1, blocks[1].blockNumber, *transaction); + transaction->commit(); + } + { // check the blocks again LMDBTreeReadTransaction::Ptr transaction = store.create_read_transaction(); diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/node_store/cached_content_addressed_tree_store.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/node_store/cached_content_addressed_tree_store.hpp index abaec64a3c7..cdd5e102754 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/node_store/cached_content_addressed_tree_store.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/node_store/cached_content_addressed_tree_store.hpp @@ -35,26 +35,6 @@ template <> struct std::hash { namespace bb::crypto::merkle_tree { -template fr preimage_to_key(const LeafType& leaf) -{ - return leaf.get_key(); -} - -inline fr preimage_to_key(const fr& leaf) -{ - return leaf; -} - -template bool requires_preimage_for_key() -{ - return true; -} - -template <> inline bool requires_preimage_for_key() -{ - return false; -} - /** * @brief Serves as a key-value node store for merkle trees. Caches all changes in memory before persisting them during * a 'commit' operation. @@ -154,8 +134,7 @@ template class ContentAddressedCachedTreeStore { */ std::optional find_leaf_index(const LeafValueType& leaf, const RequestContext& requestContext, - ReadTransaction& tx, - bool includeUncommitted) const; + ReadTransaction& tx) const; /** * @brief Finds the index of the given leaf value in the tree if available. Includes uncommitted data if requested. @@ -163,8 +142,7 @@ template class ContentAddressedCachedTreeStore { std::optional find_leaf_index_from(const LeafValueType& leaf, const index_t& start_index, const RequestContext& requestContext, - ReadTransaction& tx, - bool includeUncommitted) const; + ReadTransaction& tx) const; /** * @brief Commits the uncommitted data to the underlying store @@ -298,14 +276,13 @@ template index_t ContentAddressedCachedTreeStore::constrain_tree_size(const RequestContext& requestContext, ReadTransaction& tx) const { + // We need to identify the size of the committed tree as it exists from our perspective + // To do this we read the uncommitted meta which will contained the committed size at our initialisation point TreeMeta m; get_meta(m, tx, true); index_t sizeLimit = m.committedSize; - if (requestContext.blockNumber.has_value()) { - BlockPayload blockData; - if (dataStore_->read_block_data(requestContext.blockNumber.value(), blockData, tx)) { - sizeLimit = std::min(meta_.committedSize, blockData.size); - } + if (requestContext.maxIndex.has_value() && requestContext.maxIndex.value() < sizeLimit) { + sizeLimit = requestContext.maxIndex.value(); } return sizeLimit; } @@ -314,6 +291,12 @@ template std::optional ContentAddressedCachedTreeStore::find_block_for_index( const index_t& index, ReadTransaction& tx) const { + RequestContext context; + context.maxIndex = index + 1; + index_t constrainedSize = constrain_tree_size(context, tx); + if (index >= constrainedSize) { + return std::nullopt; + } block_number_t blockNumber = 0; bool success = dataStore_->find_block_for_index(index, blockNumber, tx); return success ? std::make_optional(blockNumber) : std::nullopt; @@ -341,10 +324,7 @@ std::pair ContentAddressedCachedTreeStore::find_lo { auto new_value_as_number = uint256_t(new_leaf_key); index_t committed = 0; - std::optional sizeLimit = std::nullopt; - if (initialised_from_block_.has_value() || requestContext.blockNumber.has_value()) { - sizeLimit = constrain_tree_size(requestContext, tx); - } + std::optional sizeLimit = constrain_tree_size(requestContext, tx); fr found_key = dataStore_->find_low_leaf(new_leaf_key, committed, sizeLimit, tx); index_t db_index = committed; @@ -458,9 +438,9 @@ void ContentAddressedCachedTreeStore::update_index(const index_t& template std::optional ContentAddressedCachedTreeStore::find_leaf_index( - const LeafValueType& leaf, const RequestContext& requestContext, ReadTransaction& tx, bool includeUncommitted) const + const LeafValueType& leaf, const RequestContext& requestContext, ReadTransaction& tx) const { - return find_leaf_index_from(leaf, 0, requestContext, tx, includeUncommitted); + return find_leaf_index_from(leaf, 0, requestContext, tx); } template @@ -468,10 +448,9 @@ std::optional ContentAddressedCachedTreeStore::find_leaf const LeafValueType& leaf, const index_t& start_index, const RequestContext& requestContext, - ReadTransaction& tx, - bool includeUncommitted) const + ReadTransaction& tx) const { - if (includeUncommitted) { + if (requestContext.includeUncommitted) { // Accessing indices_ under a lock std::unique_lock lock(mtx_); auto it = indices_.find(uint256_t(leaf)); diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/response.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/response.hpp index d525acb8672..9af6f103f50 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/response.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/response.hpp @@ -108,7 +108,7 @@ struct BlockForIndexResponse { }; struct FindLeafIndexResponse { - index_t leaf_index; + std::vector> leaf_indices; FindLeafIndexResponse() = default; ~FindLeafIndexResponse() = default; diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/test_fixtures.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/test_fixtures.hpp index 354ba949c20..db52d26b003 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/test_fixtures.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/test_fixtures.hpp @@ -3,10 +3,13 @@ #include "barretenberg/crypto/merkle_tree/indexed_tree/indexed_leaf.hpp" #include "barretenberg/crypto/merkle_tree/lmdb_store/lmdb_tree_store.hpp" +#include "barretenberg/crypto/merkle_tree/response.hpp" +#include "barretenberg/crypto/merkle_tree/signal.hpp" #include "barretenberg/ecc/curves/bn254/fr.hpp" #include "barretenberg/numeric/random/engine.hpp" #include #include +#include namespace bb::crypto::merkle_tree { @@ -80,4 +83,141 @@ void check_leaf_by_hash(LMDBTreeStore::SharedPtr db, IndexedLeaf leaf, } } +template +void check_find_leaf_index(TypeOfTree& tree, + const std::vector& leaves, + const std::vector>& expected_indices, + bool expected_success, + bool includeUncommitted = true) +{ + Signal signal; + auto completion = [&](const TypedResponse& response) -> void { + EXPECT_EQ(response.success, expected_success); + if (expected_success) { + EXPECT_EQ(response.inner.leaf_indices, expected_indices); + } + signal.signal_level(); + }; + + tree.find_leaf_indices(leaves, includeUncommitted, completion); + signal.wait_for_level(); +} + +template +void check_find_leaf_index_from(TypeOfTree& tree, + const std::vector& leaves, + index_t start_index, + const std::vector>& expected_indices, + bool expected_success, + bool includeUncommitted = true) +{ + Signal signal; + auto completion = [&](const TypedResponse& response) -> void { + EXPECT_EQ(response.success, expected_success); + if (expected_success) { + EXPECT_EQ(response.inner.leaf_indices, expected_indices); + } + signal.signal_level(); + }; + + tree.find_leaf_indices_from(leaves, start_index, includeUncommitted, completion); + signal.wait_for_level(); +} + +template +void check_historic_find_leaf_index(TypeOfTree& tree, + const std::vector& leaves, + block_number_t blockNumber, + const std::vector>& expected_indices, + bool expected_success, + bool includeUncommitted = true) +{ + Signal signal; + auto completion = [&](const TypedResponse& response) -> void { + EXPECT_EQ(response.success, expected_success); + if (expected_success) { + EXPECT_EQ(response.inner.leaf_indices, expected_indices); + } + signal.signal_level(); + }; + + tree.find_leaf_indices(leaves, blockNumber, includeUncommitted, completion); + signal.wait_for_level(); +} + +template +void check_historic_find_leaf_index_from(TypeOfTree& tree, + const std::vector& leaves, + block_number_t blockNumber, + index_t start_index, + const std::vector>& expected_indices, + bool expected_success, + bool includeUncommitted = true) +{ + Signal signal; + auto completion = [&](const TypedResponse& response) -> void { + EXPECT_EQ(response.success, expected_success); + if (expected_success) { + EXPECT_EQ(response.inner.leaf_indices, expected_indices); + } + signal.signal_level(); + }; + + tree.find_leaf_indices_from(leaves, start_index, blockNumber, includeUncommitted, completion); + signal.wait_for_level(); +} + +template +void check_find_leaf_index(TypeOfTree& tree, + const LeafValueType& leaf, + index_t expected_index, + bool expected_success, + bool includeUncommitted = true) +{ + check_find_leaf_index( + tree, { leaf }, { std::make_optional(expected_index) }, expected_success, includeUncommitted); +} + +template +void check_find_leaf_index_from(TypeOfTree& tree, + const LeafValueType& leaf, + index_t start_index, + index_t expected_index, + bool expected_success, + bool includeUncommitted = true) +{ + check_find_leaf_index_from( + tree, { leaf }, start_index, { std::make_optional(expected_index) }, expected_success, includeUncommitted); +} + +template +void check_historic_find_leaf_index(TypeOfTree& tree, + const LeafValueType& leaf, + block_number_t blockNumber, + index_t expected_index, + bool expected_success, + bool includeUncommitted = true) +{ + check_historic_find_leaf_index( + tree, { leaf }, blockNumber, { std::make_optional(expected_index) }, expected_success, includeUncommitted); +} + +template +void check_historic_find_leaf_index_from(TypeOfTree& tree, + const LeafValueType& leaf, + block_number_t blockNumber, + index_t start_index, + index_t expected_index, + bool expected_success, + bool includeUncommitted = true) +{ + check_historic_find_leaf_index_from(tree, + { leaf }, + blockNumber, + start_index, + { std::make_optional(expected_index) }, + expected_success, + includeUncommitted); +} + } // namespace bb::crypto::merkle_tree \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/types.hpp b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/types.hpp index c8ce520fb9c..54a1fa3e9be 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/types.hpp +++ b/barretenberg/cpp/src/barretenberg/crypto/merkle_tree/types.hpp @@ -12,8 +12,39 @@ struct RequestContext { bool includeUncommitted; std::optional blockNumber; bb::fr root; + std::optional maxIndex; }; +template fr preimage_to_key(const LeafType& leaf) +{ + return leaf.get_key(); +} + +inline fr preimage_to_key(const fr& leaf) +{ + return leaf; +} + +template bool is_empty(const LeafType& leaf) +{ + return leaf.is_empty(); +} + +inline bool is_empty(const fr& leaf) +{ + return leaf == fr::zero(); +} + +template bool requires_preimage_for_key() +{ + return true; +} + +template <> inline bool requires_preimage_for_key() +{ + return false; +} + const std::string BLOCKS_DB = "blocks"; const std::string NODES_DB = "nodes"; const std::string LEAF_PREIMAGES_DB = "leaf preimages"; diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp index 3ed1f1df1c8..4a5097a4dd4 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_integration.test.cpp @@ -142,7 +142,7 @@ class AcirIntegrationFoldingTest : public AcirIntegrationTest, public testing::W TEST_P(AcirIntegrationSingleTest, DISABLED_ProveAndVerifyProgram) { - using Flavor = MegaFlavor; + using Flavor = UltraFlavor; // using Flavor = bb::plonk::flavor::Ultra; using Builder = Flavor::CircuitBuilder; @@ -388,38 +388,6 @@ TEST_P(AcirIntegrationFoldingTest, DISABLED_ProveAndVerifyProgramStack) } } -TEST_P(AcirIntegrationFoldingTest, DISABLED_FoldAndVerifyProgramStack) -{ - using Flavor = MegaFlavor; - using Builder = Flavor::CircuitBuilder; - - std::string test_name = GetParam(); - auto program_stack = get_program_stack_data_from_test_file( - test_name, /*honk_recursion=*/false); // TODO(https://github.com/AztecProtocol/barretenberg/issues/1013): - // Assumes Flavor is not UltraHonk - - TraceSettings trace_settings{ SMALL_TEST_STRUCTURE }; - auto ivc = std::make_shared(trace_settings, /*auto_verify_mode=*/true); - - const acir_format::ProgramMetadata metadata{ ivc }; - - while (!program_stack.empty()) { - auto program = program_stack.back(); - - // Construct a bberg circuit from the acir representation - auto circuit = acir_format::create_circuit(program, metadata); - - ivc->accumulate(circuit); - - CircuitChecker::check(circuit); - // EXPECT_TRUE(prove_and_verify_honk(circuit)); - - program_stack.pop_back(); - } - - EXPECT_TRUE(ivc->prove_and_verify()); -} - INSTANTIATE_TEST_SUITE_P(AcirTests, AcirIntegrationFoldingTest, testing::Values("fold_basic", "fold_basic_nested_call")); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp index c79535ad7d4..4e34694eb2d 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp @@ -250,7 +250,7 @@ HonkRecursionConstraintOutput create_honk_recursion_constraints( HonkRecursionConstraintOutput output; if (is_rollup_honk_recursion_constraint) { // TODO(https://github.com/AztecProtocol/barretenberg/issues/1168): Add formula to flavor - const size_t HONK_PROOF_LENGTH = 473; + const size_t HONK_PROOF_LENGTH = 469; // The extra calculation is for the IPA proof length. ASSERT(input.proof.size() == HONK_PROOF_LENGTH + 1 + 4 * (CONST_ECCVM_LOG_N) + 2 + 2); ASSERT(proof_fields.size() == HONK_PROOF_LENGTH + 65 + input.public_inputs.size()); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp index fda8739c9fb..5d9d94d25e3 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp @@ -424,8 +424,9 @@ struct BlackBoxOp { struct ToRadix { Program::MemoryAddress input; Program::MemoryAddress radix; - Program::HeapArray output; - bool output_bits; + Program::MemoryAddress output_pointer; + Program::MemoryAddress num_limbs; + Program::MemoryAddress output_bits; friend bool operator==(const ToRadix&, const ToRadix&); std::vector bincodeSerialize() const; @@ -4611,7 +4612,10 @@ inline bool operator==(const BlackBoxOp::ToRadix& lhs, const BlackBoxOp::ToRadix if (!(lhs.radix == rhs.radix)) { return false; } - if (!(lhs.output == rhs.output)) { + if (!(lhs.output_pointer == rhs.output_pointer)) { + return false; + } + if (!(lhs.num_limbs == rhs.num_limbs)) { return false; } if (!(lhs.output_bits == rhs.output_bits)) { @@ -4646,7 +4650,8 @@ void serde::Serializable::serialize(const Program: { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.radix, serializer); - serde::Serializable::serialize(obj.output, serializer); + serde::Serializable::serialize(obj.output_pointer, serializer); + serde::Serializable::serialize(obj.num_limbs, serializer); serde::Serializable::serialize(obj.output_bits, serializer); } @@ -4658,7 +4663,8 @@ Program::BlackBoxOp::ToRadix serde::Deserializable Program::BlackBoxOp::ToRadix obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.radix = serde::Deserializable::deserialize(deserializer); - obj.output = serde::Deserializable::deserialize(deserializer); + obj.output_pointer = serde::Deserializable::deserialize(deserializer); + obj.num_limbs = serde::Deserializable::deserialize(deserializer); obj.output_bits = serde::Deserializable::deserialize(deserializer); return obj; } 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 d4045e636e6..a645a39649f 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/c_bind.cpp @@ -86,43 +86,6 @@ WASM_EXPORT void acir_prove_and_verify_ultra_honk(uint8_t const* acir_vec, info("verified: ", *result); } -WASM_EXPORT void acir_fold_and_verify_program_stack(uint8_t const* acir_vec, - bool const* recursive, - uint8_t const* witness_vec, - bool* result) -{ - using ProgramStack = acir_format::AcirProgramStack; - using Builder = MegaCircuitBuilder; - - auto constraint_systems = - acir_format::program_buf_to_acir_format(from_buffer>(acir_vec), /*honk_recursion=*/false); - auto witness_stack = acir_format::witness_buf_to_witness_stack(from_buffer>(witness_vec)); - - ProgramStack program_stack{ constraint_systems, witness_stack }; - - TraceSettings trace_settings{ SMALL_TEST_STRUCTURE }; - auto ivc = std::make_shared(trace_settings, /*auto_verify_mode=*/true); - - const acir_format::ProgramMetadata metadata{ ivc, *recursive }; - - bool is_kernel = false; - while (!program_stack.empty()) { - auto program = program_stack.back(); - - // Construct a bberg circuit from the acir representation - auto builder = acir_format::create_circuit(program, metadata); - - builder.databus_propagation_data.is_kernel = is_kernel; - is_kernel = !is_kernel; // toggle on/off so every second circuit is intepreted as a kernel - - ivc->accumulate(builder); - - program_stack.pop_back(); - } - *result = ivc->prove_and_verify(); - info("acir_fold_and_verify_program_stack result: ", *result); -} - WASM_EXPORT void acir_prove_and_verify_mega_honk(uint8_t const* acir_vec, bool const* recursive, uint8_t const* witness_vec, @@ -238,9 +201,8 @@ WASM_EXPORT void acir_prove_and_verify_aztec_client(uint8_t const* acir_stack, 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 TraceSettings trace_settings{ E2E_FULL_TEST_STRUCTURE }; - auto ivc = std::make_shared(trace_settings, /*auto_verify_mode=*/true); + auto ivc = std::make_shared(trace_settings); const acir_format::ProgramMetadata metadata{ ivc }; @@ -296,28 +258,18 @@ WASM_EXPORT void acir_prove_aztec_client(uint8_t const* acir_stack, acir_format::circuit_buf_to_acir_format(bincode, /*honk_recursion=*/false); folding_stack.push_back(Program{ constraints, witness }); } - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1101): remove use of auto_verify_mode TraceSettings trace_settings{ E2E_FULL_TEST_STRUCTURE }; auto ivc = std::make_shared(trace_settings); const acir_format::ProgramMetadata metadata{ ivc }; // 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, metadata); - // 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."); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/honk_contract.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/honk_contract.hpp index 95e37c1fbeb..c55919b4edc 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/honk_contract.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_proofs/honk_contract.hpp @@ -147,9 +147,9 @@ uint256 constant CONST_PROOF_SIZE_LOG_N = 28; uint256 constant NUMBER_OF_SUBRELATIONS = 26; uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; -uint256 constant NUMBER_OF_ENTITIES = 44; +uint256 constant NUMBER_OF_ENTITIES = 40; uint256 constant NUMBER_UNSHIFTED = 35; -uint256 constant NUMBER_TO_BE_SHIFTED = 9; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; // Alphas are used as relation separators so there should be NUMBER_OF_SUBRELATIONS - 1 uint256 constant NUMBER_OF_ALPHAS = 25; @@ -166,11 +166,11 @@ enum WIRE { Q_R, Q_O, Q_4, + Q_LOOKUP, Q_ARITH, Q_RANGE, Q_ELLIPTIC, Q_AUX, - Q_LOOKUP, Q_POSEIDON2_EXTERNAL, Q_POSEIDON2_INTERNAL, SIGMA_1, @@ -195,10 +195,6 @@ enum WIRE { LOOKUP_INVERSES, LOOKUP_READ_COUNTS, LOOKUP_READ_TAGS, - TABLE_1_SHIFT, - TABLE_2_SHIFT, - TABLE_3_SHIFT, - TABLE_4_SHIFT, W_L_SHIFT, W_R_SHIFT, W_O_SHIFT, @@ -231,11 +227,11 @@ library Honk { G1Point qr; G1Point qo; G1Point q4; + G1Point qLookup; // Lookup G1Point qArith; // Arithmetic widget G1Point qDeltaRange; // Delta Range sort G1Point qAux; // Auxillary G1Point qElliptic; // Auxillary - G1Point qLookup; // Lookup G1Point qPoseidon2External; G1Point qPoseidon2Internal; // Copy cnstraints @@ -1658,11 +1654,11 @@ contract HonkVerifier is IVerifier commitments[4] = vk.qr; commitments[5] = vk.qo; commitments[6] = vk.q4; - commitments[7] = vk.qArith; - commitments[8] = vk.qDeltaRange; - commitments[9] = vk.qElliptic; - commitments[10] = vk.qAux; - commitments[11] = vk.qLookup; + commitments[7] = vk.qLookup; + commitments[8] = vk.qArith; + commitments[9] = vk.qDeltaRange; + commitments[10] = vk.qElliptic; + commitments[11] = vk.qAux; commitments[12] = vk.qPoseidon2External; commitments[13] = vk.qPoseidon2Internal; commitments[14] = vk.s1; @@ -1691,15 +1687,11 @@ contract HonkVerifier is IVerifier commitments[35] = convertProofPoint(proof.lookupReadTags); // to be Shifted - commitments[36] = vk.t1; - commitments[37] = vk.t2; - commitments[38] = vk.t3; - commitments[39] = vk.t4; - commitments[40] = convertProofPoint(proof.w1); - commitments[41] = convertProofPoint(proof.w2); - commitments[42] = convertProofPoint(proof.w3); - commitments[43] = convertProofPoint(proof.w4); - commitments[44] = convertProofPoint(proof.zPerm); + commitments[36] = convertProofPoint(proof.w1); + commitments[37] = convertProofPoint(proof.w2); + commitments[38] = convertProofPoint(proof.w3); + commitments[39] = convertProofPoint(proof.w4); + commitments[40] = convertProofPoint(proof.zPerm); /* Batch gemini claims from the prover * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp index 69f4f1799e6..6fcea1cb32a 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_circuit_builder.hpp @@ -4,6 +4,7 @@ #include "./msm_builder.hpp" #include "./precomputed_tables_builder.hpp" #include "./transcript_builder.hpp" +#include "barretenberg/constants.hpp" #include "barretenberg/ecc/curves/bn254/fr.hpp" #include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp" #include "barretenberg/honk/proof_system/logderivative_library.hpp" @@ -218,7 +219,7 @@ class ECCVMCircuitBuilder { [[nodiscard]] size_t get_circuit_subgroup_size(const size_t num_rows) const { - const auto num_rows_log2 = static_cast(numeric::get_msb64(num_rows)); + const auto num_rows_log2 = static_cast(numeric::get_msb64(num_rows + MASKING_OFFSET)); size_t num_rows_pow2 = 1UL << (num_rows_log2 + (1UL << num_rows_log2 == num_rows ? 0 : 1)); return num_rows_pow2; } diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp index 7a0128fedbe..2c8f0b7a9d0 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp @@ -87,8 +87,10 @@ class ECCVMFlavor { // BATCHED_RELATION_PARTIAL_LENGTH = algebraic degree of sumcheck relation *after* multiplying by the `pow_zeta` // random polynomial e.g. For \sum(x) [A(x) * B(x) + C(x)] * PowZeta(X), relation length = 2 and random relation - // length = 3 - static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 1; + // length = 3. + // The degree has to be further increased by 1 because the relation is multiplied by the Row Disabling // + // Polynomial + static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 2; static constexpr size_t NUM_RELATIONS = std::tuple_size::value; // Instantiate the BarycentricData needed to extend each Relation Univariate @@ -518,7 +520,8 @@ class ECCVMFlavor { const auto [msm_rows, point_table_read_counts] = ECCVMMSMMBuilder::compute_rows( msms, builder.get_number_of_muls(), builder.op_queue->get_num_msm_rows()); - const size_t num_rows = std::max({ point_table_rows.size(), msm_rows.size(), transcript_rows.size() }); + const size_t num_rows = + std::max({ point_table_rows.size(), msm_rows.size(), transcript_rows.size() }) + MASKING_OFFSET; const auto log_num_rows = static_cast(numeric::get_msb64(num_rows)); const size_t dyadic_num_rows = 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1)); diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index d95a2f01ad7..4a4cfe0a6d2 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -5,7 +5,6 @@ #include "barretenberg/commitment_schemes/shplonk/shplonk.hpp" #include "barretenberg/common/ref_array.hpp" #include "barretenberg/honk/proof_system/logderivative_library.hpp" -#include "barretenberg/honk/proof_system/permutation_library.hpp" #include "barretenberg/plonk_honk_shared/library/grand_product_library.hpp" #include "barretenberg/relations/permutation_relation.hpp" #include "barretenberg/sumcheck/sumcheck.hpp" diff --git a/barretenberg/cpp/src/barretenberg/examples/join_split/join_split.test.cpp b/barretenberg/cpp/src/barretenberg/examples/join_split/join_split.test.cpp index 677e30f198c..1c516b7ae9d 100644 --- a/barretenberg/cpp/src/barretenberg/examples/join_split/join_split.test.cpp +++ b/barretenberg/cpp/src/barretenberg/examples/join_split/join_split.test.cpp @@ -703,7 +703,7 @@ TEST_F(join_split_tests, test_0_input_notes_and_detect_circuit_change) // The below part detects any changes in the join-split circuit constexpr size_t DYADIC_CIRCUIT_SIZE = 1 << 16; - constexpr uint256_t CIRCUIT_HASH("0xe833d0ffaa99f39ca31ef79ded0089b0ec614eb4a528c4e1c4af6221a003fa6e"); + constexpr uint256_t CIRCUIT_HASH("0x9ffbbd2c3ebd45cba861d3da6f75e2f73c448cc5747c9e34b44d6bc8a90b4a9c"); const uint256_t circuit_hash = circuit.hash_circuit(); // circuit is finalized now diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp index 03c86a55b08..237e51a46d7 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp @@ -23,15 +23,15 @@ namespace bb { * they overflow */ static constexpr TraceStructure SMALL_TEST_STRUCTURE_FOR_OVERFLOWS{ .ecc_op = 1 << 14, - .pub_inputs = 1 << 14, .busread = 1 << 14, + .lookup = 1 << 14, + .pub_inputs = 1 << 14, .arithmetic = 1 << 15, .delta_range = 1 << 14, .elliptic = 1 << 14, .aux = 1 << 14, .poseidon2_external = 1 << 14, .poseidon2_internal = 1 << 15, - .lookup = 1 << 14, .overflow = 0 }; class GoblinMockCircuits { diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp index 5565d5197ee..e4aa5872433 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.hpp @@ -25,7 +25,10 @@ void construct_lookup_table_polynomials(const RefArray tables_size + additional_offset); - size_t offset = dyadic_circuit_size - tables_size - additional_offset; + size_t offset = circuit.blocks.lookup.trace_offset; + if constexpr (IsPlonkFlavor) { + offset = circuit.blocks.lookup.trace_offset + additional_offset; + } for (const auto& table : circuit.lookup_tables) { const fr table_index(table.table_index); @@ -51,11 +54,10 @@ template void construct_lookup_read_counts(typename Flavor::Polynomial& read_counts, typename Flavor::Polynomial& read_tags, typename Flavor::CircuitBuilder& circuit, - const size_t dyadic_circuit_size) + [[maybe_unused]] const size_t dyadic_circuit_size) { - const size_t tables_size = circuit.get_tables_size(); // TODO(https://github.com/AztecProtocol/barretenberg/issues/1033): construct tables and counts at top of trace - size_t table_offset = dyadic_circuit_size - tables_size; + size_t table_offset = circuit.blocks.lookup.trace_offset; // loop over all tables used in the circuit; each table contains data about the lookups made on it for (auto& table : circuit.lookup_tables) { diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.test.cpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.test.cpp index 0cd69e9f523..ccdc191c62a 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.test.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/composer_lib.test.cpp @@ -55,7 +55,7 @@ TEST_F(ComposerLibTests, LookupReadCounts) // The table polys are constructed at the bottom of the trace, thus so to are the counts/tags // TODO(https://github.com/AztecProtocol/barretenberg/issues/1033): construct tables and counts at top of trace - size_t offset = circuit_size - builder.get_tables_size(); + size_t offset = builder.blocks.lookup.trace_offset; // The uint32 XOR lookup table is constructed for 6 bit operands via double for loop that iterates through the left // operand externally (0 to 63) then the right operand internally (0 to 63). Computing (1 XOR 5) will thus result in diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp index 5ca536e70c5..d391d425af3 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/composer/permutation_lib.hpp @@ -27,15 +27,15 @@ namespace bb { /** - * @brief cycle_node represents the index of a value of the circuit. + * @brief cycle_node represents the idx of a value of the circuit. * It will belong to a CyclicPermutation, such that all nodes in a CyclicPermutation * must have the value. * The total number of constraints is always <2^32 since that is the type used to represent variables, so we can save * space by using a type smaller than size_t. */ struct cycle_node { - uint32_t wire_index; - uint32_t gate_index; + uint32_t wire_idx; + uint32_t gate_idx; }; /** @@ -45,16 +45,39 @@ struct cycle_node { * */ struct permutation_subgroup_element { - uint32_t row_index = 0; - uint8_t column_index = 0; + uint32_t row_idx = 0; + uint8_t column_idx = 0; bool is_public_input = false; bool is_tag = false; }; +/** + * @brief Stores permutation mapping data for a single wire column + * + */ +struct Mapping { + std::shared_ptr row_idx; // row idx of next entry in copy cycle + std::shared_ptr col_idx; // column idx of next entry in copy cycle + std::shared_ptr is_public_input; + std::shared_ptr is_tag; + size_t _size = 0; + + Mapping() = default; + + size_t size() const { return _size; } + + Mapping(size_t n) + : row_idx(_allocate_aligned_memory(n)) + , col_idx(_allocate_aligned_memory(n)) + , is_public_input(_allocate_aligned_memory(n)) + , is_tag(_allocate_aligned_memory(n)) + , _size(n) + {} +}; + template struct PermutationMapping { - using Mapping = std::array, NUM_WIRES>; - Mapping sigmas; - Mapping ids; + std::array sigmas; + std::array ids; /** * @brief Construct a permutation mapping default initialized so every element is in a cycle by itself @@ -62,23 +85,37 @@ template struct PermutationMapping { */ PermutationMapping(size_t circuit_size) { - PROFILE_THIS_NAME("PermutationMapping constructor"); - for (uint8_t col_idx = 0; col_idx < NUM_WIRES; ++col_idx) { - sigmas[col_idx].reserve(circuit_size); - if constexpr (generalized) { - ids[col_idx].reserve(circuit_size); - } + for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { + sigmas[wire_idx] = Mapping(circuit_size); + ids[wire_idx] = Mapping(circuit_size); + } + + const size_t num_threads = calculate_num_threads_pow2(circuit_size, /*min_iterations_per_thread=*/1 << 10); + size_t iterations_per_thread = circuit_size / num_threads; // actual iterations per thread + + parallel_for(num_threads, [&](size_t thread_idx) { + uint32_t start = static_cast(thread_idx * iterations_per_thread); + uint32_t end = static_cast((thread_idx + 1) * iterations_per_thread); + // Initialize every element to point to itself - for (uint32_t row_idx = 0; row_idx < circuit_size; ++row_idx) { - permutation_subgroup_element self{ row_idx, col_idx }; - sigmas[col_idx].emplace_back(self); - if constexpr (generalized) { - ids[col_idx].emplace_back(self); + for (uint8_t col_idx = 0; col_idx < NUM_WIRES; ++col_idx) { + for (uint32_t row_idx = start; row_idx < end; ++row_idx) { + auto idx = static_cast(row_idx); + sigmas[col_idx].row_idx[idx] = row_idx; + sigmas[col_idx].col_idx[idx] = col_idx; + sigmas[col_idx].is_public_input[idx] = false; + sigmas[col_idx].is_tag[idx] = false; + if constexpr (generalized) { + ids[col_idx].row_idx[idx] = row_idx; + ids[col_idx].col_idx[idx] = col_idx; + ids[col_idx].is_public_input[idx] = false; + ids[col_idx].is_tag[idx] = false; + } } } - } + }); } }; @@ -105,48 +142,47 @@ PermutationMapping compute_permutation_mapping( { // Initialize the table of permutations so that every element points to itself - PermutationMapping mapping{ proving_key->circuit_size }; + PermutationMapping mapping(proving_key->circuit_size); - // Represents the index of a variable in circuit_constructor.variables (needed only for generalized) + // Represents the idx of a variable in circuit_constructor.variables (needed only for generalized) std::span real_variable_tags = circuit_constructor.real_variable_tags; // Go through each cycle - size_t cycle_index = 0; - for (const auto& copy_cycle : wire_copy_cycles) { - for (size_t node_idx = 0; node_idx < copy_cycle.size(); ++node_idx) { - // Get the indices of the current node and next node in the cycle - const cycle_node& current_cycle_node = copy_cycle[node_idx]; - // If current node is the last one in the cycle, then the next one is the first one - size_t next_cycle_node_index = (node_idx == copy_cycle.size() - 1 ? 0 : node_idx + 1); - const cycle_node& next_cycle_node = copy_cycle[next_cycle_node_index]; - const auto current_row = current_cycle_node.gate_index; - const auto next_row = next_cycle_node.gate_index; - - const auto current_column = current_cycle_node.wire_index; - const auto next_column = static_cast(next_cycle_node.wire_index); + for (size_t cycle_idx = 0; cycle_idx < wire_copy_cycles.size(); ++cycle_idx) { + const CyclicPermutation& cycle = wire_copy_cycles[cycle_idx]; + for (size_t node_idx = 0; node_idx < cycle.size(); ++node_idx) { + // Get the indices (column, row) of the current node in the cycle + const cycle_node& current_node = cycle[node_idx]; + const auto current_row = static_cast(current_node.gate_idx); + const auto current_column = current_node.wire_idx; + + // Get indices of next node; If the current node is last in the cycle, then the next is the first one + size_t next_node_idx = (node_idx == cycle.size() - 1 ? 0 : node_idx + 1); + const cycle_node& next_node = cycle[next_node_idx]; + const auto next_row = next_node.gate_idx; + const auto next_column = static_cast(next_node.wire_idx); + // Point current node to the next node - mapping.sigmas[current_column][current_row] = { - .row_index = next_row, .column_index = next_column, .is_public_input = false, .is_tag = false - }; + mapping.sigmas[current_column].row_idx[current_row] = next_row; + mapping.sigmas[current_column].col_idx[current_row] = next_column; if constexpr (generalized) { - bool first_node = (node_idx == 0); - bool last_node = (next_cycle_node_index == 0); + const bool first_node = (node_idx == 0); + const bool last_node = (next_node_idx == 0); if (first_node) { - mapping.ids[current_column][current_row].is_tag = true; - mapping.ids[current_column][current_row].row_index = (real_variable_tags[cycle_index]); + mapping.ids[current_column].is_tag[current_row] = true; + mapping.ids[current_column].row_idx[current_row] = real_variable_tags[cycle_idx]; } if (last_node) { - mapping.sigmas[current_column][current_row].is_tag = true; + mapping.sigmas[current_column].is_tag[current_row] = true; // TODO(Zac): yikes, std::maps (tau) are expensive. Can we find a way to get rid of this? - mapping.sigmas[current_column][current_row].row_index = - circuit_constructor.tau.at(real_variable_tags[cycle_index]); + mapping.sigmas[current_column].row_idx[current_row] = + circuit_constructor.tau.at(real_variable_tags[cycle_idx]); } } } - cycle_index++; } // Add information about public inputs so that the cycles can be altered later; See the construction of the @@ -158,11 +194,11 @@ PermutationMapping compute_permutation_mapping( pub_inputs_offset = proving_key->pub_inputs_offset; } for (size_t i = 0; i < num_public_inputs; ++i) { - size_t idx = i + pub_inputs_offset; - mapping.sigmas[0][idx].row_index = static_cast(idx); - mapping.sigmas[0][idx].column_index = 0; - mapping.sigmas[0][idx].is_public_input = true; - if (mapping.sigmas[0][idx].is_tag) { + uint32_t idx = static_cast(i + pub_inputs_offset); + mapping.sigmas[0].row_idx[static_cast(idx)] = idx; + mapping.sigmas[0].col_idx[static_cast(idx)] = 0; + mapping.sigmas[0].is_public_input[static_cast(idx)] = true; + if (mapping.sigmas[0].is_tag[static_cast(idx)]) { std::cerr << "MAPPING IS BOTH A TAG AND A PUBLIC INPUT" << std::endl; } } @@ -182,37 +218,40 @@ PermutationMapping compute_permutation_mapping( template void compute_honk_style_permutation_lagrange_polynomials_from_mapping( const RefSpan& permutation_polynomials, // sigma or ID poly - const std::array, Flavor::NUM_WIRES>& permutation_mappings, + const std::array& permutation_mappings, typename Flavor::ProvingKey* proving_key) { using FF = typename Flavor::FF; const size_t num_gates = proving_key->circuit_size; - size_t wire_index = 0; + size_t wire_idx = 0; for (auto& current_permutation_poly : permutation_polynomials) { ITERATE_OVER_DOMAIN_START(proving_key->evaluation_domain); - const auto& current_mapping = permutation_mappings[wire_index][i]; - if (current_mapping.is_public_input) { + auto idx = static_cast(i); + const auto& current_row_idx = permutation_mappings[wire_idx].row_idx[idx]; + const auto& current_col_idx = permutation_mappings[wire_idx].col_idx[idx]; + const auto& current_is_tag = permutation_mappings[wire_idx].is_tag[idx]; + const auto& current_is_public_input = permutation_mappings[wire_idx].is_public_input[idx]; + if (current_is_public_input) { // We intentionally want to break the cycles of the public input variables. - // During the witness generation, the left and right wire polynomials at index i contain the i-th public + // During the witness generation, the left and right wire polynomials at idx i contain the i-th public // input. The CyclicPermutation created for these variables always start with (i) -> (n+i), followed by // the indices of the variables in the "real" gates. We make i point to -(i+1), so that the only way of // repairing the cycle is add the mapping // -(i+1) -> (n+i) // These indices are chosen so they can easily be computed by the verifier. They can expect the running // product to be equal to the "public input delta" that is computed in - current_permutation_poly.at(i) = - -FF(current_mapping.row_index + 1 + num_gates * current_mapping.column_index); - } else if (current_mapping.is_tag) { + current_permutation_poly.at(i) = -FF(current_row_idx + 1 + num_gates * current_col_idx); + } else if (current_is_tag) { // Set evaluations to (arbitrary) values disjoint from non-tag values - current_permutation_poly.at(i) = num_gates * Flavor::NUM_WIRES + current_mapping.row_index; + current_permutation_poly.at(i) = num_gates * Flavor::NUM_WIRES + current_row_idx; } else { // For the regular permutation we simply point to the next location by setting the evaluation to its - // index - current_permutation_poly.at(i) = FF(current_mapping.row_index + num_gates * current_mapping.column_index); + // idx + current_permutation_poly.at(i) = FF(current_row_idx + num_gates * current_col_idx); } ITERATE_OVER_DOMAIN_END; - wire_index++; + wire_idx++; } } } // namespace @@ -226,7 +265,7 @@ void compute_honk_style_permutation_lagrange_polynomials_from_mapping( * * */ inline void compute_standard_plonk_lagrange_polynomial(bb::polynomial& output, - const std::vector& permutation, + const Mapping& permutation, const bb::evaluation_domain& small_domain) { if (output.size() < permutation.size()) { @@ -245,19 +284,19 @@ inline void compute_standard_plonk_lagrange_polynomial(bb::polynomial& output, ITERATE_OVER_DOMAIN_START(small_domain); - // `permutation[i]` will specify the 'index' that this wire value will map to. - // Here, 'index' refers to an element of our subgroup H. - // We can almost use `permutation[i]` to directly index our `roots` array, which contains our subgroup elements. + // `permutation[i]` will specify the 'idx' that this wire value will map to. + // Here, 'idx' refers to an element of our subgroup H. + // We can almost use `permutation[i]` to directly idx our `roots` array, which contains our subgroup elements. // We first have to accommodate for the fact that `roots` only contains *half* of our subgroup elements. This is // because ω^{n/2} = -ω and we don't want to perform redundant work computing roots of unity. - size_t raw_idx = permutation[i].row_index; + size_t raw_idx = permutation.row_idx[static_cast(i)]; - // Step 1: is `raw_idx` >= (n / 2)? if so, we will need to index `-roots[raw_idx - subgroup_size / 2]` instead + // Step 1: is `raw_idx` >= (n / 2)? if so, we will need to idx `-roots[raw_idx - subgroup_size / 2]` instead // of `roots[raw_idx]` const bool negative_idx = raw_idx >= root_size; - // Step 2: compute the index of the subgroup element we'll be accessing. + // Step 2: compute the idx of the subgroup element we'll be accessing. // To avoid a conditional branch, we can subtract `negative_idx << log2_root_size` from `raw_idx`. // Here, `log2_root_size = numeric::get_msb(subgroup_size / 2)` (we know our subgroup size will be a power of 2, // so we lose no precision here) @@ -269,23 +308,23 @@ inline void compute_standard_plonk_lagrange_polynomial(bb::polynomial& output, // The output will similarly be overloaded (containing either 2 * modulus - w, or modulus - w) output[i] = roots[idx].conditionally_subtract_from_double_modulus(static_cast(negative_idx)); - // Finally, if our permutation maps to an index in either the right wire vector, or the output wire vector, we + // Finally, if our permutation maps to an idx in either the right wire vector, or the output wire vector, we // need to multiply our result by one of two quadratic non-residues. (This ensures that mapping into the left // wires gives unique values that are not repeated in the right or output wire permutations) (ditto for right // wire and output wire mappings) - if (permutation[i].is_public_input) { + if (permutation.is_public_input[static_cast(i)]) { // As per the paper which modifies plonk to include the public inputs in a permutation argument, the permutation // `σ` is modified to `σ'`, where `σ'` maps all public inputs to a set of l distinct ζ elements which are // disjoint from H ∪ k1·H ∪ k2·H. output[i] *= bb::fr::external_coset_generator(); - } else if (permutation[i].is_tag) { + } else if (permutation.is_tag[static_cast(i)]) { output[i] *= bb::fr::tag_coset_generator(); } else { { - const uint32_t column_index = permutation[i].column_index; - if (column_index > 0) { - output[i] *= bb::fr::coset_generator(column_index - 1); + const uint32_t column_idx = permutation.col_idx[static_cast(i)]; + if (column_idx > 0) { + output[i] *= bb::fr::coset_generator(column_idx - 1); } } } @@ -301,16 +340,15 @@ inline void compute_standard_plonk_lagrange_polynomial(bb::polynomial& output, * @param key */ template -void compute_plonk_permutation_lagrange_polynomials_from_mapping( - std::string label, - std::array, program_width>& mappings, - plonk::proving_key* key) +void compute_plonk_permutation_lagrange_polynomials_from_mapping(std::string label, + std::array& mappings, + plonk::proving_key* key) { for (size_t i = 0; i < program_width; i++) { - std::string index = std::to_string(i + 1); + std::string idx = std::to_string(i + 1); bb::polynomial polynomial_lagrange(key->circuit_size); compute_standard_plonk_lagrange_polynomial(polynomial_lagrange, mappings[i], key->small_domain); - key->polynomial_store.put(label + "_" + index + "_lagrange", polynomial_lagrange.share()); + key->polynomial_store.put(label + "_" + idx + "_lagrange", polynomial_lagrange.share()); } } @@ -327,8 +365,8 @@ template void compute_monomial_and_coset_fft_polynomials_from_lagrange(std::string label, plonk::proving_key* key) { for (size_t i = 0; i < program_width; ++i) { - std::string index = std::to_string(i + 1); - std::string prefix = label + "_" + index; + std::string idx = std::to_string(i + 1); + std::string prefix = label + "_" + idx; // Construct permutation polynomials in lagrange base auto sigma_polynomial_lagrange = key->polynomial_store.get(prefix + "_lagrange"); diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp index 91837b267dd..a8bb7e892da 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp @@ -33,16 +33,17 @@ struct ExecutionTraceUsageTracker { size_t max_tables_size = 0; // For printing only. Must match the order of the members in the arithmetization + static constexpr std::array block_labels{ "ecc_op", - "pub_inputs", "busread", + "lookup", + "pub_inputs", "arithmetic", "delta_range", "elliptic", "aux", "poseidon2_external", "poseidon2_internal", - "lookup", "overflow", "databus_table_data", "lookup_table_data" }; @@ -88,21 +89,18 @@ struct ExecutionTraceUsageTracker { } // The active ranges must also include the rows where the actual databus and lookup table data are stored. - // (Note: lookup tables are constructed at the end of the trace; databus data is constructed at the start) so we - // need to determine the dyadic size for this. We call the size function on the current circuit which will have - // the same fixed block sizes but might also have an overflow block potentially influencing the dyadic circuit - // size. - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1160) - const size_t dyadic_circuit_size = circuit.blocks.get_structured_dyadic_size(); + // (Note: lookup tables are constructed from the beginning of the lookup block ; databus data is constructed at + // the start of the trace). // TODO(https://github.com/AztecProtocol/barretenberg/issues/1152): should be able to use simply Range{ 0, - // max_databus_size } but this breaks for certain choices of num_threads. + // max_databus_size } but this breaks for certain choices of num_threads. It should also be possible to have the + // lookup table data be Range{lookup_start, max_tables_size} but that also breaks. size_t databus_end = std::max(max_databus_size, static_cast(fixed_sizes.busread.trace_offset + max_sizes.busread)); active_ranges.push_back(Range{ 0, databus_end }); - size_t lookups_start = - std::min(dyadic_circuit_size - max_tables_size, static_cast(fixed_sizes.lookup.trace_offset)); - active_ranges.push_back(Range{ lookups_start, dyadic_circuit_size }); + size_t lookups_start = fixed_sizes.lookup.trace_offset; + size_t lookups_end = lookups_start + std::max(max_tables_size, static_cast(max_sizes.lookup)); + active_ranges.emplace_back(Range{ lookups_start, lookups_end }); } // Check whether an index is contained within the active ranges (or previous active ranges; needed for perturbator) diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/mega_execution_trace.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/mega_execution_trace.hpp index a24d4131a93..e1d31a9fac1 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/mega_execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/mega_execution_trace.hpp @@ -14,55 +14,46 @@ namespace bb { * * @details We instantiate this both to contain the actual gates of an execution trace, and also to describe different * trace structures (i.e., sets of capacities for each block type, which we use to optimize the folding prover). + * Note: the ecc_op block has to be the first in the execution trace to not break the Goblin functionality. */ template struct MegaTraceBlockData { T ecc_op; - T pub_inputs; T busread; + T lookup; + T pub_inputs; T arithmetic; T delta_range; T elliptic; T aux; T poseidon2_external; T poseidon2_internal; - T lookup; T overflow; // block gates of arbitrary type that overflow their designated block std::vector get_labels() const { - return { "ecc_op", - "pub_inputs", - "busread", - "arithmetic", - "delta_range", - "elliptic", - "aux", - "poseidon2_external", - "poseidon2_internal", - "lookup", + return { "ecc_op", "busread", "lookup", "pub_inputs", "arithmetic", + "delta_range", "elliptic", "aux", "poseidon2_external", "poseidon2_internal", "overflow" }; } auto get() { - return RefArray{ - ecc_op, pub_inputs, busread, arithmetic, delta_range, elliptic, aux, poseidon2_external, poseidon2_internal, - lookup, overflow - }; + return RefArray{ ecc_op, busread, lookup, pub_inputs, arithmetic, + delta_range, elliptic, aux, poseidon2_external, poseidon2_internal, + overflow }; } auto get() const { - return RefArray{ - ecc_op, pub_inputs, busread, arithmetic, delta_range, elliptic, aux, poseidon2_external, poseidon2_internal, - lookup, overflow - }; + return RefArray{ ecc_op, busread, lookup, pub_inputs, arithmetic, + delta_range, elliptic, aux, poseidon2_external, poseidon2_internal, + overflow }; } - auto get_gate_blocks() + auto get_gate_blocks() const { return RefArray{ - busread, arithmetic, delta_range, elliptic, aux, poseidon2_external, poseidon2_internal, lookup + busread, lookup, arithmetic, delta_range, elliptic, aux, poseidon2_external, poseidon2_internal, }; } @@ -125,24 +116,26 @@ class MegaTraceBlock : public ExecutionTraceBlockselectors[4]; }; auto& q_4() { return this->selectors[5]; }; auto& q_busread() { return this->selectors[6]; }; - auto& q_arith() { return this->selectors[7]; }; - auto& q_delta_range() { return this->selectors[8]; }; - auto& q_elliptic() { return this->selectors[9]; }; - auto& q_aux() { return this->selectors[10]; }; - auto& q_poseidon2_external() { return this->selectors[11]; }; - auto& q_poseidon2_internal() { return this->selectors[12]; }; - auto& q_lookup_type() { return this->selectors[13]; }; + auto& q_lookup_type() { return this->selectors[7]; }; + auto& q_arith() { return this->selectors[8]; }; + auto& q_delta_range() { return this->selectors[9]; }; + auto& q_elliptic() { return this->selectors[10]; }; + auto& q_aux() { return this->selectors[11]; }; + auto& q_poseidon2_external() { return this->selectors[12]; }; + auto& q_poseidon2_internal() { return this->selectors[13]; }; RefVector get_gate_selectors() { - return { q_busread(), - q_arith(), - q_delta_range(), - q_elliptic(), - q_aux(), - q_poseidon2_external(), - q_poseidon2_internal(), - q_lookup_type() }; + return { + q_busread(), + q_lookup_type(), + q_arith(), + q_delta_range(), + q_elliptic(), + q_aux(), + q_poseidon2_external(), + q_poseidon2_internal(), + }; } /** @@ -210,19 +203,19 @@ class MegaExecutionTraceBlocks : public MegaTraceBlockData { { info("Gate blocks summary: (actual gates / fixed capacity)"); info("goblin ecc op :\t", this->ecc_op.size(), "/", this->ecc_op.get_fixed_size()); + info("busread :\t", this->busread.size(), "/", this->busread.get_fixed_size()); + info("lookups :\t", this->lookup.size(), "/", this->lookup.get_fixed_size()); info("pub inputs :\t", this->pub_inputs.size(), "/", this->pub_inputs.get_fixed_size(), " (populated in decider pk constructor)"); - info("busread :\t", this->busread.size(), "/", this->busread.get_fixed_size()); info("arithmetic :\t", this->arithmetic.size(), "/", this->arithmetic.get_fixed_size()); info("delta range :\t", this->delta_range.size(), "/", this->delta_range.get_fixed_size()); info("elliptic :\t", this->elliptic.size(), "/", this->elliptic.get_fixed_size()); info("auxiliary :\t", this->aux.size(), "/", this->aux.get_fixed_size()); info("poseidon ext :\t", this->poseidon2_external.size(), "/", this->poseidon2_external.get_fixed_size()); info("poseidon int :\t", this->poseidon2_internal.size(), "/", this->poseidon2_internal.get_fixed_size()); - info("lookups :\t", this->lookup.size(), "/", this->lookup.get_fixed_size()); info("overflow :\t", this->overflow.size(), "/", this->overflow.get_fixed_size()); info(""); } @@ -251,30 +244,31 @@ class MegaExecutionTraceBlocks : public MegaTraceBlockData { * @brief A tiny structuring (for testing without recursive verifications only) */ static constexpr TraceStructure TINY_TEST_STRUCTURE{ .ecc_op = 18, - .pub_inputs = 1, .busread = 3, + .lookup = 2, + .pub_inputs = 1, .arithmetic = 1 << 14, .delta_range = 5, .elliptic = 2, .aux = 10, .poseidon2_external = 2, .poseidon2_internal = 2, - .lookup = 2, .overflow = 0 }; /** * @brief An arbitrary but small-ish structuring that can be used for generic unit testing with non-trivial circuits */ + static constexpr TraceStructure SMALL_TEST_STRUCTURE{ .ecc_op = 1 << 14, - .pub_inputs = 1 << 14, .busread = 1 << 14, + .lookup = 1 << 14, + .pub_inputs = 1 << 14, .arithmetic = 1 << 15, .delta_range = 1 << 14, .elliptic = 1 << 14, .aux = 1 << 14, .poseidon2_external = 1 << 14, .poseidon2_internal = 1 << 15, - .lookup = 1 << 14, .overflow = 0 }; /** @@ -282,60 +276,60 @@ static constexpr TraceStructure SMALL_TEST_STRUCTURE{ .ecc_op = 1 << 14, * benchmark. */ static constexpr TraceStructure CLIENT_IVC_BENCH_STRUCTURE{ .ecc_op = 1 << 10, - .pub_inputs = 1 << 7, .busread = 1 << 7, + .lookup = 72000, + .pub_inputs = 1 << 7, .arithmetic = 198000, .delta_range = 90000, .elliptic = 9000, .aux = 136000, .poseidon2_external = 2500, .poseidon2_internal = 14000, - .lookup = 72000, .overflow = 0 }; /** * @brief An example structuring of size 2^18. */ static constexpr TraceStructure EXAMPLE_18{ .ecc_op = 1 << 10, - .pub_inputs = 1 << 6, .busread = 1 << 6, + .lookup = 36000, + .pub_inputs = 1 << 6, .arithmetic = 84000, .delta_range = 45000, .elliptic = 9000, .aux = 68000, .poseidon2_external = 2500, .poseidon2_internal = 14000, - .lookup = 36000, .overflow = 0 }; /** * @brief An example structuring of size 2^20. */ static constexpr TraceStructure EXAMPLE_20{ .ecc_op = 1 << 11, - .pub_inputs = 1 << 8, .busread = 1 << 8, + .lookup = 144000, + .pub_inputs = 1 << 8, .arithmetic = 396000, .delta_range = 180000, .elliptic = 18000, .aux = 272000, .poseidon2_external = 5000, .poseidon2_internal = 28000, - .lookup = 144000, .overflow = 0 }; /** * @brief Structuring tailored to the full e2e TS test (TO BE UPDATED ACCORDINGLY) */ static constexpr TraceStructure E2E_FULL_TEST_STRUCTURE{ .ecc_op = 1 << 10, - .pub_inputs = 4000, .busread = 6000, + .lookup = 200000, + .pub_inputs = 4000, .arithmetic = 200000, .delta_range = 25000, .elliptic = 80000, .aux = 100000, .poseidon2_external = 30128, .poseidon2_internal = 172000, - .lookup = 200000, .overflow = 0 }; template diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/ultra_execution_trace.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/ultra_execution_trace.hpp index 92a2c5f8d6b..0bed250dc39 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/ultra_execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/ultra_execution_trace.hpp @@ -15,25 +15,25 @@ namespace bb { * @tparam T */ template struct UltraTraceBlockData { - T pub_inputs; + T pub_inputs; // Has to be the first block otherwise Plonk breaks + T lookup; T arithmetic; T delta_range; T elliptic; T aux; - T lookup; T poseidon2_external; T poseidon2_internal; T overflow; auto get() { - return RefArray{ pub_inputs, arithmetic, delta_range, elliptic, aux, - lookup, poseidon2_external, poseidon2_internal, overflow }; + return RefArray{ pub_inputs, lookup, arithmetic, delta_range, elliptic, aux, poseidon2_external, + poseidon2_internal, overflow }; } - auto get_gate_blocks() + auto get_gate_blocks() const { - return RefArray{ arithmetic, delta_range, elliptic, aux, lookup, poseidon2_external, poseidon2_internal }; + return RefArray{ lookup, arithmetic, delta_range, elliptic, aux, poseidon2_external, poseidon2_internal }; } bool operator==(const UltraTraceBlockData& other) const = default; @@ -66,18 +66,20 @@ class UltraTraceBlock : public ExecutionTraceBlockselectors[3]; }; auto& q_3() { return this->selectors[4]; }; auto& q_4() { return this->selectors[5]; }; - auto& q_arith() { return this->selectors[6]; }; - auto& q_delta_range() { return this->selectors[7]; }; - auto& q_elliptic() { return this->selectors[8]; }; - auto& q_aux() { return this->selectors[9]; }; - auto& q_lookup_type() { return this->selectors[10]; }; + auto& q_lookup_type() { return this->selectors[6]; }; + auto& q_arith() { return this->selectors[7]; }; + auto& q_delta_range() { return this->selectors[8]; }; + auto& q_elliptic() { return this->selectors[9]; }; + auto& q_aux() { return this->selectors[10]; }; auto& q_poseidon2_external() { return this->selectors[11]; }; auto& q_poseidon2_internal() { return this->selectors[12]; }; RefVector get_gate_selectors() { - return { q_arith(), q_delta_range(), q_elliptic(), q_aux(), q_poseidon2_external(), q_poseidon2_internal(), - q_lookup_type() }; + return { + q_lookup_type(), q_arith(), q_delta_range(), q_elliptic(), q_aux(), q_poseidon2_external(), + q_poseidon2_internal(), + }; } }; @@ -113,11 +115,11 @@ class UltraExecutionTraceBlocks : public UltraTraceBlockData { { info("Gate blocks summary:"); info("pub inputs :\t", this->pub_inputs.size()); + info("lookups :\t", this->lookup.size()); info("arithmetic :\t", this->arithmetic.size()); info("delta range:\t", this->delta_range.size()); info("elliptic :\t", this->elliptic.size()); info("auxiliary :\t", this->aux.size()); - info("lookups :\t", this->lookup.size()); info("poseidon ext :\t", this->poseidon2_external.size()); info("poseidon int :\t", this->poseidon2_internal.size()); info("overflow :\t", this->overflow.size()); @@ -146,11 +148,11 @@ class UltraExecutionTraceBlocks : public UltraTraceBlockData { "q_2", "q_3", "q_4", + "table_type", "q_arith", "q_sort", "q_elliptic", "q_aux", - "table_type", "q_poseidon2_external", "q_poseidon2_internal" }; }; diff --git a/barretenberg/cpp/src/barretenberg/polynomials/row_disabling_polynomial.hpp b/barretenberg/cpp/src/barretenberg/polynomials/row_disabling_polynomial.hpp new file mode 100644 index 00000000000..e5c2abe7f67 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/polynomials/row_disabling_polynomial.hpp @@ -0,0 +1,179 @@ +#pragma once +#include "barretenberg/common/compiler_hints.hpp" +#include "barretenberg/common/op_count.hpp" +#include "barretenberg/common/thread.hpp" +#include "barretenberg/stdlib/primitives/bool/bool.hpp" + +#include +#include +namespace bb { +/** + * @struct RowDisablingPolynomial + * @brief Polynomial for Sumcheck with disabled Rows + * + * \f$ n = 2^d \f$ circuit size + * \f$ L_i \f$ multilinear Lagrange in \f$ d \f$ variables, \f$ i = 0,\ldots, n-1 \f$. + * + * Assume we are given a "valid" execution trace at rows \f$ 0,\ldots, n-5 \f$, i.e., + * \f[ + * \sum_{\mathbb{H} \setminus \{n-1, n-2, n-3, n-4\}} H = 0. + * \f] + * + * We want to pad the witness polynomials with random field elements in rows \f$ n-1, n-2, n-3 \f$. + * Since the commitment to the shift must coincide with the commitment to its unshifted counterpart, + * we have to reserve \f$ 4 \f$ rows at the end to be able to. + * To achieve this, we multiply the Honk relation \f$ H \f$ by the polynomial + * \f[ + * 1 - L = 1 - L_{n-1} - L_{n-2} - L_{n-3} - L_{n-4}. + * \f] + * that vanishes at the last \f$ 4 \f$ rows and is equal to \f$ 1 \f$ everywhere else on the hypercube. + * + * We consider the sumcheck protocol for the modified relation + * \f[ + * \sum_{\mathbb{H}} (1 - L) H = \sum_{\mathbb{H}} H - \sum_{\mathbb{H}} L \cdot H. + * \f] + * + * Note that the target sum remains \f$ 0 \f$ because the contributions from the last rows are multiplied by \f$ 0 \f$. + * + * Recall: + * - \f$ n-1 = 2^d - 1 = (1,1, \ldots, 1) \f$ + * - \f$ n-2 = (0,1,\ldots,1) \f$ + * - \f$ n-3 = (1,0,\ldots,1) \f$ + * - \f$ n-4 = (0,0,\ldots,1) \f$ + * + * ### Round 0: + * \f[ + * \begin{aligned} + * S' &= + * S_{H,0} - \Big(L_{n-1}(X, 1, \ldots, 1) + L_{n-2}(X, 1,\ldots,1)\Big) H(X,1,\ldots, 1) \\ + * &\quad - \Big(L_{n-3}(X, 0,1,\ldots,1) + L_{n-4}(X,0,1,\ldots,1)\Big) H(X,0,1,\ldots,1) + * \end{aligned} + * \f] + * + * We do not modify the algorithm computing \f$ S_{H,0} \f$. Simply add a method that computes the contribution from the + * edges \f$ (0,1,\ldots,1) \f$ and \f$ (1,\ldots,1) \in \mathbb{H}^{d-1} \f$. + * + * First, compute the coefficients in the Lagrange basis of the factor coming from the Lagranges: + * \f[ + * \begin{aligned} + * L_{n-1}(X,\vec{1}) + L_{n-2}(X,\vec{1}) &= X + (1 - X) = 1 \\ + * L_{n-3}(X,0,1,\ldots,1) + L_{n-4}(X,0,1,\ldots,1) &= 1 + * \end{aligned} + * \f] + * + * \f[ + * S'_0 = S_{H,0} - H(X,1,\ldots,1) - H(X,0,1,\ldots,1) + * \f] + * + * ### Round 1: + * \f[ + * \begin{aligned} + * L_{n-1}(u_0,X,\vec{1}) + L_{n-2}(u_0,X,\vec{1}) &= + * u_0 X + (1 - u_0) X = X \\ + * L_{n-3}(u_0,X,\vec{1}) + L_{n-4}(u_0,X,\vec{1}) &= + * u_0 (1 - X) + (1 - u_0)(1 - X) = (1 - X) + * \end{aligned} + * \f] + * + * \f[ + * S'_1 = S_{H,1} - H(X,1,\ldots,1) + * \f] + * + * ### Round 2: + * \f[ + * S'_2 = S_{H,2} - X \cdot H(u_0,u_1,X,1,\ldots,1) + * \f] + * + * ### Rounds i > 1: + * We can compute the restricted sumcheck univariates \f$ S' \f$ in each round as follows: + * \f[ + * \begin{aligned} + * S' = S_{H,i} - + * \Big(L_{n-1}(u_0, \ldots, u_{i-1}, X, 1, \ldots, 1) + L_{n-2}(u_0, \ldots, u_{i-1}, X, 1,\ldots,1) \\ + * + L_{n-3}(u_0, \ldots, u_{i-1}, X, 1,\ldots,1) + L_{n-4}(u_0, \ldots, u_{i-1}, X, 1,\ldots,1)\Big) \\ + * \times H(u_0, \ldots, u_{i-1}, X, 1,\ldots,1) + * \end{aligned} + * \f] + * + * Compute the factor coming from the Lagranges: + * \f[ + * \begin{aligned} + * &\left(u_0 \cdots u_{i-1} + (1 - u_0) u_1 \cdots u_{i-1} + u_0 (1 - u_1) u_2 \cdots u_{i-1} + (1 - u_0)(1 - u_1) u_2 + * \cdots u_{i-1}\right) X \\ + * &= \left(u_0 u_1 + (1 - u_0) u_1 + u_0 (1 - u_1) + (1 - u_0)(1 - u_1)\right) u_2 \cdots u_{i-1} X \\ + * &= 0 \cdot (1 - X) + 1 \cdot u_2 \cdots u_{i-1} \cdot X + * \end{aligned} + * \f] + * + * This way, we get: + * \f[ + * S_{H,i}(X) = S_{H,i} - u_2 \cdots u_{i-1} \cdot X \cdot H(u_0, \ldots, u_{i-1}, X, 1, \ldots, 1). + * \f] + * + * ## The algorithm: + * + * Let \f$ D \f$ be the max partial degree of \f$ H \f$. + * + * 1. Compute \f$ S_{H,i} \f$ without any modifications as a polynomial of degree \f$ D \f$. Extend it to degree \f$ D + + * 1 \f$, because it is the max partial degree of \f$ L \cdot H \f$. + * + * 2. If \f$ i = 0 \f$, compute \f$ H(X,1,1,\ldots,1) + H(X,0,1,\ldots,1) \f$ as a univariate of degree \f$ D \f$, else + * compute \f$ H(u_0, \ldots, u_{i-1}, X, 1, \ldots, 1) \f$ as a univariate of degree \f$ D \f$. Extend to degree \f$ D + * + 1 \f$. + * + * 3. Compute the extension of \f$ L^{(i)} = L(u_0, \ldots, u_{i-1}, X, 1, \ldots, 1) \f$ to the degree \f$ D + 1 \f$ + * polynomial. + * + * 4. Compute the coefficients of the product \f$ L^{(i)} \cdot H^{(i)} \f$. + * + * 5. Compute the coefficients of \f$ S_{H,i} - L^{(i)} \cdot H^{(i)} \f$ (degree \f$ D + 1 \f$ univariate). + * + * The verifier needs to evaluate \f$ 1 - L(u_0, \ldots, u_{d-1}) \f$, which is equal to \f$ 0 \f$ if \f$ d < 2 \f$, and + * is equal to \f$ 1- u_2 \cdots u_{d-1} \f$ otherwise. + */ + +template struct RowDisablingPolynomial { + // initialized as a constant linear polynomial = 1 + FF eval_at_0{ 1 }; + FF eval_at_1{ 1 }; + + RowDisablingPolynomial() = default; + /** + * @brief Compute the evaluations of L^{(i)} at 0 and 1. + * + * @details In every round, the contribution from the Honk relation computed at + * disabled rows has to be mutiplied by \f$ L^{(i)} \f$, which is a linear combination of Lagrange polynomials + * defined above. + * + * @param round_challenge Sumcheck round challenge + * @param round_idx Sumcheck round index + */ + void update_evaluations(FF round_challenge, size_t round_idx) + { + if (round_idx == 1) { + eval_at_0 = FF{ 0 }; + } + if (round_idx >= 2) { + eval_at_1 *= round_challenge; + } + } + /** + * @brief Compute the evaluation of \f$ 1 - L \f$ at the sumcheck challenge + * + * @param multivariate_challenge + * @param log_circuit_size + * @return FF + */ + static FF evaluate_at_challenge(std::vector multivariate_challenge, const size_t log_circuit_size) + { + FF evaluation_at_multivariate_challenge{ 1 }; + + for (size_t idx = 2; idx < log_circuit_size; idx++) { + evaluation_at_multivariate_challenge *= multivariate_challenge[idx]; + } + + return FF{ 1 } - evaluation_at_multivariate_challenge; + } +}; + +} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py index 19577972e5b..69a66a79e03 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner_example_gen.py @@ -23,7 +23,6 @@ def __init__(self, base_poly): 'secondary_calldata', 'secondary_calldata_read_counts', 'secondary_calldata_read_tags', 'secondary_calldata_inverses', 'return_data', 'return_data_read_counts', 'return_data_read_tags', 'return_data_inverses', - 'table_1_shift', 'table_2_shift', 'table_3_shift', 'table_4_shift', 'w_l_shift', 'w_r_shift', 'w_o_shift', 'w_4_shift', 'z_perm_shift' ] diff --git a/barretenberg/cpp/src/barretenberg/relations/ultra_relation_consistency.test.cpp b/barretenberg/cpp/src/barretenberg/relations/ultra_relation_consistency.test.cpp index b40b45da3c6..981bb789209 100644 --- a/barretenberg/cpp/src/barretenberg/relations/ultra_relation_consistency.test.cpp +++ b/barretenberg/cpp/src/barretenberg/relations/ultra_relation_consistency.test.cpp @@ -82,17 +82,13 @@ struct InputElements { FF& sorted_accum = std::get<31>(_data); FF& z_perm = std::get<32>(_data); FF& z_lookup = std::get<33>(_data); - FF& table_1_shift = std::get<34>(_data); - FF& table_2_shift = std::get<35>(_data); - FF& table_3_shift = std::get<36>(_data); - FF& table_4_shift = std::get<37>(_data); - FF& w_l_shift = std::get<38>(_data); - FF& w_r_shift = std::get<39>(_data); - FF& w_o_shift = std::get<40>(_data); - FF& w_4_shift = std::get<41>(_data); - FF& sorted_accum_shift = std::get<42>(_data); - FF& z_perm_shift = std::get<43>(_data); - FF& z_lookup_shift = std::get<44>(_data); + FF& w_l_shift = std::get<34>(_data); + FF& w_r_shift = std::get<35>(_data); + FF& w_o_shift = std::get<36>(_data); + FF& w_4_shift = std::get<37>(_data); + FF& sorted_accum_shift = std::get<38>(_data); + FF& z_perm_shift = std::get<39>(_data); + FF& z_lookup_shift = std::get<40>(_data); }; class UltraRelationConsistency : public testing::Test { diff --git a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.cpp index 90a7df0e894..ca351429ab0 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.cpp @@ -11,8 +11,7 @@ namespace bb::stdlib::recursion::honk { ClientIVCRecursiveVerifier::Output ClientIVCRecursiveVerifier::verify(const ClientIVC::Proof& proof) { // Construct stdlib Mega verification key - auto stdlib_mega_vk = - std::make_shared(builder.get(), verifier_input.mega_verification_key); + auto stdlib_mega_vk = std::make_shared(builder.get(), ivc_verification_key.mega); // Dummy aggregation object until we do proper aggregation aggregation_state agg_obj = @@ -23,7 +22,8 @@ ClientIVCRecursiveVerifier::Output ClientIVCRecursiveVerifier::verify(const Clie verifier.verify_proof(proof.mega_proof, agg_obj); // Perform Goblin recursive verification - GoblinVerifier goblin_verifier{ builder.get(), verifier_input.goblin_input }; + GoblinVerifierInput goblin_verification_key{ ivc_verification_key.eccvm, ivc_verification_key.translator }; + GoblinVerifier goblin_verifier{ builder.get(), goblin_verification_key }; GoblinRecursiveVerifierOutput output = goblin_verifier.verify(proof.goblin_proof); return output; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.hpp index db36f16230a..822a83cb8d2 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.hpp @@ -15,6 +15,7 @@ class ClientIVCRecursiveVerifier { using GoblinVerifier = GoblinRecursiveVerifier; using Flavor = RecursiveFlavor::NativeFlavor; using VerificationKey = Flavor::VerificationKey; + using IVCVerificationKey = ClientIVC::VerificationKey; public: using Proof = ClientIVC::Proof; @@ -27,14 +28,14 @@ class ClientIVCRecursiveVerifier { GoblinVerifierInput goblin_input; }; - ClientIVCRecursiveVerifier(std::shared_ptr builder, VerifierInput& verifier_input) + ClientIVCRecursiveVerifier(std::shared_ptr builder, IVCVerificationKey& ivc_verification_key) : builder(builder) - , verifier_input(verifier_input){}; + , ivc_verification_key(ivc_verification_key){}; Output verify(const ClientIVC::Proof&); private: std::shared_ptr builder; - VerifierInput verifier_input; + IVCVerificationKey ivc_verification_key; }; } // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp index 3ce5a457400..dcee5a4eb73 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp @@ -1,6 +1,7 @@ #include "barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.hpp" #include "barretenberg/circuit_checker/circuit_checker.hpp" #include "barretenberg/client_ivc/client_ivc.hpp" +#include "barretenberg/client_ivc/test_bench_shared.hpp" #include "barretenberg/common/test.hpp" namespace bb::stdlib::recursion::honk { @@ -8,16 +9,15 @@ class ClientIVCRecursionTests : public testing::Test { public: using Builder = UltraCircuitBuilder; using ClientIVCVerifier = ClientIVCRecursiveVerifier; - using VerifierInput = ClientIVCVerifier::VerifierInput; using FoldVerifierInput = ClientIVCVerifier::FoldVerifierInput; - using GoblinVerifierInput = ClientIVCVerifier::GoblinVerifierInput; - using DeciderVerificationKey = FoldVerifierInput::DeciderVK; - using ECCVMVK = GoblinVerifier::ECCVMVerificationKey; - using TranslatorVK = GoblinVerifier::TranslatorVerificationKey; using Proof = ClientIVC::Proof; using Flavor = UltraRollupRecursiveFlavor_; using NativeFlavor = Flavor::NativeFlavor; using UltraRecursiveVerifier = UltraRecursiveVerifier_; + using MockCircuitProducer = PrivateFunctionExecutionMockCircuitProducer; + using IVCVerificationKey = ClientIVC::VerificationKey; + + static constexpr TraceSettings trace_settings{ CLIENT_IVC_BENCH_STRUCTURE }; static void SetUpTestSuite() { @@ -27,7 +27,7 @@ class ClientIVCRecursionTests : public testing::Test { struct ClientIVCProverOutput { Proof proof; - VerifierInput verifier_input; + IVCVerificationKey ivc_vk; }; /** @@ -36,22 +36,15 @@ class ClientIVCRecursionTests : public testing::Test { */ static ClientIVCProverOutput construct_client_ivc_prover_output(ClientIVC& ivc) { - using Builder = ClientIVC::ClientCircuit; - + // Construct and accumulate a series of mocked private function execution circuits + MockCircuitProducer circuit_producer; size_t NUM_CIRCUITS = 2; for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { - Builder circuit{ ivc.goblin.op_queue }; - GoblinMockCircuits::construct_mock_function_circuit(circuit); - circuit.databus_propagation_data.is_kernel = (idx % 2 == 1); // every second circuit is a kernel + auto circuit = circuit_producer.create_next_circuit(ivc); ivc.accumulate(circuit); } - Proof proof = ivc.prove(); - GoblinVerifierInput goblin_verifier_input{ std::make_shared(ivc.goblin.get_eccvm_proving_key()), - std::make_shared( - ivc.goblin.get_translator_proving_key()) }; - - return { proof, { ivc.honk_vk, goblin_verifier_input } }; + return { ivc.prove(), ivc.get_vk() }; } }; @@ -61,8 +54,8 @@ class ClientIVCRecursionTests : public testing::Test { */ TEST_F(ClientIVCRecursionTests, NativeVerification) { - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); + ClientIVC ivc{ trace_settings }; + auto [proof, ivc_vk] = construct_client_ivc_prover_output(ivc); // Confirm that the IVC proof can be natively verified EXPECT_TRUE(ivc.verify(proof)); @@ -77,12 +70,12 @@ TEST_F(ClientIVCRecursionTests, Basic) using CIVCRecVerifierOutput = ClientIVCRecursiveVerifier::Output; // Generate a genuine ClientIVC prover output - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); + ClientIVC ivc{ trace_settings }; + auto [proof, ivc_vk] = construct_client_ivc_prover_output(ivc); // Construct the ClientIVC recursive verifier auto builder = std::make_shared(); - ClientIVCVerifier verifier{ builder, verifier_input }; + ClientIVCVerifier verifier{ builder, ivc_vk }; // Generate the recursive verification circuit CIVCRecVerifierOutput output = verifier.verify(proof); @@ -100,12 +93,12 @@ TEST_F(ClientIVCRecursionTests, ClientTubeBase) using CIVCRecVerifierOutput = ClientIVCRecursiveVerifier::Output; // Generate a genuine ClientIVC prover output - ClientIVC ivc{ {}, /*auto_verify_mode=*/true }; - auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); + ClientIVC ivc{ trace_settings }; + auto [proof, ivc_vk] = construct_client_ivc_prover_output(ivc); // Construct the ClientIVC recursive verifier auto tube_builder = std::make_shared(); - ClientIVCVerifier verifier{ tube_builder, verifier_input }; + ClientIVCVerifier verifier{ tube_builder, ivc_vk }; // Generate the recursive verification circuit CIVCRecVerifierOutput client_ivc_rec_verifier_output = verifier.verify(proof); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_flavor.hpp index e1b7703e14e..2c427705063 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/eccvm_verifier/eccvm_recursive_flavor.hpp @@ -57,12 +57,12 @@ template class ECCVMRecursiveFlavor_ { // think these two are not needed for recursive verifier land // using GrandProductRelations = std::tuple>; // using LookupRelation = ECCVMLookupRelation; - static constexpr size_t MAX_PARTIAL_RELATION_LENGTH = compute_max_partial_relation_length(); + static constexpr size_t MAX_PARTIAL_RELATION_LENGTH = ECCVMFlavor::MAX_PARTIAL_RELATION_LENGTH; // BATCHED_RELATION_PARTIAL_LENGTH = algebraic degree of sumcheck relation *after* multiplying by the `pow_zeta` // random polynomial e.g. For \sum(x) [A(x) * B(x) + C(x)] * PowZeta(X), relation length = 2 and random relation // length = 3 - static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 1; + static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = ECCVMFlavor::BATCHED_RELATION_PARTIAL_LENGTH; static constexpr size_t NUM_RELATIONS = std::tuple_size::value; // Instantiate the BarycentricData needed to extend each Relation Univariate diff --git a/barretenberg/cpp/src/barretenberg/stdlib/translator_vm_verifier/translator_recursive_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib/translator_vm_verifier/translator_recursive_flavor.hpp index 13520792bb5..9a07176ffd9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/translator_vm_verifier/translator_recursive_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/translator_vm_verifier/translator_recursive_flavor.hpp @@ -101,7 +101,7 @@ template class TranslatorRecursiveFlavor_ { // BATCHED_RELATION_PARTIAL_LENGTH = algebraic degree of sumcheck relation *after* multiplying by the `pow_zeta` // random polynomial e.g. For \sum(x) [A(x) * B(x) + C(x)] * PowZeta(X), relation length = 2 and random relation // length = 3 - static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 1; + static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = NativeFlavor::BATCHED_RELATION_PARTIAL_LENGTH; static constexpr size_t NUM_RELATIONS = std::tuple_size_v; // define the containers for storing the contributions from each relation in Sumcheck diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index 696bef5b70f..062929736f9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -45,7 +45,7 @@ class MegaFlavor { static constexpr size_t NUM_WIRES = CircuitBuilder::NUM_WIRES; // The number of multivariate polynomials on which a sumcheck prover sumcheck operates (including shifts). We often // need containers of this size to hold related data, so we choose a name more agnostic than `NUM_POLYNOMIALS`. - static constexpr size_t NUM_ALL_ENTITIES = 63; + static constexpr size_t NUM_ALL_ENTITIES = 59; // The number of polynomials precomputed to describe a circuit and to aid a prover in constructing a satisfying // assignment of witnesses. We again choose a neutral name. static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 30; @@ -55,13 +55,9 @@ class MegaFlavor { static constexpr size_t NUM_FOLDED_ENTITIES = NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES; // The number of shifted witness entities including derived witness entities static constexpr size_t NUM_SHIFTED_WITNESSES = 5; - // The number of shifted tables - static constexpr size_t NUM_SHIFTED_TABLES = 4; - static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS = - RepeatedCommitmentsData(NUM_PRECOMPUTED_ENTITIES, - NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES + NUM_SHIFTED_TABLES, - NUM_SHIFTED_WITNESSES); + static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS = RepeatedCommitmentsData( + NUM_PRECOMPUTED_ENTITIES, NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES, NUM_SHIFTED_WITNESSES); // define the tuple of Relations that comprise the Sumcheck relation // Note: made generic for use in MegaRecursive. @@ -125,13 +121,13 @@ class MegaFlavor { q_o, // column 4 q_4, // column 5 q_busread, // column 6 - q_arith, // column 7 - q_delta_range, // column 8 - q_elliptic, // column 9 - q_aux, // column 10 - q_poseidon2_external, // column 11 - q_poseidon2_internal, // column 12 - q_lookup, // column 13 + q_lookup, // column 7 + q_arith, // column 8 + q_delta_range, // column 9 + q_elliptic, // column 10 + q_aux, // column 11 + q_poseidon2_external, // column 12 + q_poseidon2_internal, // column 13 sigma_1, // column 14 sigma_2, // column 15 sigma_3, // column 16 @@ -156,8 +152,15 @@ class MegaFlavor { auto get_gate_selectors() { return RefArray{ - q_busread, q_arith, q_delta_range, q_elliptic, q_aux, q_poseidon2_external, q_poseidon2_internal, - q_lookup + q_busread, + q_lookup, + q_arith, + q_delta_range, + q_elliptic, + q_aux, + q_poseidon2_external, + q_poseidon2_internal, + }; } auto get_selectors() { return concatenate(get_non_gate_selectors(), get_gate_selectors()); } @@ -239,7 +242,10 @@ class MegaFlavor { this->return_data_inverses, }; } - auto get_to_be_shifted() { return DerivedEntities::get_to_be_shifted(); } + auto get_to_be_shifted() + { + return concatenate(WireEntities::get_all(), DerivedEntities::get_to_be_shifted()); + } MSGPACK_FIELDS(this->w_l, this->w_r, @@ -268,9 +274,9 @@ class MegaFlavor { }; /** - * @brief Class for ShiftedWitnessEntities, containing only shifted witness polynomials. + * @brief Class for ShiftedEntities, containing the shifted witness polynomials. */ - template class ShiftedWitnessEntities { + template class ShiftedEntities { public: DEFINE_FLAVOR_MEMBERS(DataType, w_l_shift, // column 0 @@ -279,33 +285,7 @@ class MegaFlavor { w_4_shift, // column 3 z_perm_shift) // column 4 - auto get_shifted_witnesses() { return RefArray{ w_l_shift, w_r_shift, w_o_shift, w_4_shift, z_perm_shift }; }; - }; - - /** - * @brief Class for ShiftedEntities, containing shifted witness and table polynomials. - * TODO: Remove NUM_SHIFTED_TABLES once these entities are deprecated. - */ - template class ShiftedTables { - public: - DEFINE_FLAVOR_MEMBERS(DataType, - table_1_shift, // column 0 - table_2_shift, // column 1 - table_3_shift, // column 2 - table_4_shift // column 3 - ) - }; - - /** - * @brief Class for ShiftedEntities, containing shifted witness and table polynomials. - */ - template - class ShiftedEntities : public ShiftedTables, public ShiftedWitnessEntities { - public: - DEFINE_COMPOUND_GET_ALL(ShiftedTables, ShiftedWitnessEntities) - - auto get_shifted_witnesses() { return ShiftedWitnessEntities::get_all(); }; - auto get_shifted_tables() { return ShiftedTables::get_all(); }; + auto get_shifted() { return RefArray{ w_l_shift, w_r_shift, w_o_shift, w_4_shift, z_perm_shift }; }; }; public: @@ -338,29 +318,15 @@ class MegaFlavor { }; auto get_precomputed() { return PrecomputedEntities::get_all(); } auto get_witness() { return WitnessEntities::get_all(); }; - auto get_to_be_shifted() - { - return concatenate(PrecomputedEntities::get_table_polynomials(), - WitnessEntities::get_wires(), - WitnessEntities::get_to_be_shifted()); - }; + auto get_to_be_shifted() { return WitnessEntities::get_to_be_shifted(); }; auto get_shifted() { return ShiftedEntities::get_all(); }; - // getter for shifted witnesses - auto get_shifted_witnesses() { return ShiftedWitnessEntities::get_all(); }; - // getter for shifted tables - auto get_shifted_tables() { return ShiftedEntities::get_shifted_tables(); }; // this getter is used in ZK Sumcheck, where all witness evaluations (including shifts) have to be masked auto get_all_witnesses() { - return concatenate(WitnessEntities::get_all(), - ShiftedEntities::get_shifted_witnesses()); + return concatenate(WitnessEntities::get_all(), ShiftedEntities::get_all()); }; // getter for the complement of all witnesses inside all entities - auto get_non_witnesses() - { - return concatenate(PrecomputedEntities::get_all(), - ShiftedEntities::get_shifted_tables()); - }; + auto get_non_witnesses() { return PrecomputedEntities::get_all(); }; }; /** @@ -646,13 +612,13 @@ class MegaFlavor { const Commitment& q_o, const Commitment& q_4, const Commitment& q_busread, + const Commitment& q_lookup, const Commitment& q_arith, const Commitment& q_delta_range, const Commitment& q_elliptic, const Commitment& q_aux, const Commitment& q_poseidon2_external, const Commitment& q_poseidon2_internal, - const Commitment& q_lookup, const Commitment& sigma_1, const Commitment& sigma_2, const Commitment& sigma_3, @@ -684,13 +650,13 @@ class MegaFlavor { this->q_o = q_o; this->q_4 = q_4; this->q_busread = q_busread; + this->q_lookup = q_lookup; this->q_arith = q_arith; this->q_delta_range = q_delta_range; this->q_elliptic = q_elliptic; this->q_aux = q_aux; this->q_poseidon2_external = q_poseidon2_external; this->q_poseidon2_internal = q_poseidon2_internal; - this->q_lookup = q_lookup; this->sigma_1 = sigma_1; this->sigma_2 = sigma_2; this->sigma_3 = sigma_3; @@ -722,13 +688,13 @@ class MegaFlavor { q_o, q_4, q_busread, + q_lookup, q_arith, q_delta_range, q_elliptic, q_aux, q_poseidon2_external, q_poseidon2_internal, - q_lookup, sigma_1, sigma_2, sigma_3, @@ -828,13 +794,13 @@ class MegaFlavor { q_4 = "Q_4"; q_m = "Q_M"; q_busread = "Q_BUSREAD"; + q_lookup = "Q_LOOKUP"; q_arith = "Q_ARITH"; q_delta_range = "Q_SORT"; q_elliptic = "Q_ELLIPTIC"; q_aux = "Q_AUX"; q_poseidon2_external = "Q_POSEIDON2_EXTERNAL"; q_poseidon2_internal = "Q_POSEIDON2_INTERNAL"; - q_lookup = "Q_LOOKUP"; sigma_1 = "SIGMA_1"; sigma_2 = "SIGMA_2"; sigma_3 = "SIGMA_3"; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp index 59e3776201d..dbaac3d0164 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp @@ -12,6 +12,8 @@ class MegaZKFlavor : public bb::MegaFlavor { public: // Indicates that this flavor runs with non-ZK Sumcheck. static constexpr bool HasZK = true; + // The degree has to be increased because the relation is multiplied by the Row Disabling Polynomial + static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MegaFlavor::BATCHED_RELATION_PARTIAL_LENGTH + 1; /** * @brief Derived class that defines proof structure for Mega proofs, as well as supporting functions. * Note: Made generic for use in MegaRecursive. diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp index bfef81c27dc..62bc329ba6d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp @@ -45,7 +45,7 @@ class UltraFlavor { // The number of multivariate polynomials on which a sumcheck prover sumcheck operates (witness polynomials, // precomputed polynomials and shifts). We often need containers of this size to hold related data, so we choose a // name more agnostic than `NUM_POLYNOMIALS`. - static constexpr size_t NUM_ALL_ENTITIES = 44; + static constexpr size_t NUM_ALL_ENTITIES = 40; // The number of polynomials precomputed to describe a circuit and to aid a prover in constructing a satisfying // assignment of witnesses. We again choose a neutral name. static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 27; @@ -55,14 +55,10 @@ class UltraFlavor { static constexpr size_t NUM_FOLDED_ENTITIES = NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES; // The number of shifted witness entities including derived witness entities static constexpr size_t NUM_SHIFTED_WITNESSES = 5; - // The number of shifted tables - static constexpr size_t NUM_SHIFTED_TABLES = 4; // A container to be fed to ShpleminiVerifier to avoid redundant scalar muls - static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS = - RepeatedCommitmentsData(NUM_PRECOMPUTED_ENTITIES, - NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES + NUM_SHIFTED_TABLES, - NUM_SHIFTED_WITNESSES); + static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS = RepeatedCommitmentsData( + NUM_PRECOMPUTED_ENTITIES, NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES, NUM_SHIFTED_WITNESSES); // The total number of witnesses including shifts and derived entities. static constexpr size_t NUM_ALL_WITNESS_ENTITIES = NUM_WITNESS_ENTITIES + NUM_SHIFTED_WITNESSES; @@ -132,11 +128,11 @@ class UltraFlavor { q_r, // column 3 q_o, // column 4 q_4, // column 5 - q_arith, // column 6 - q_delta_range, // column 7 - q_elliptic, // column 8 - q_aux, // column 9 - q_lookup, // column 10 + q_lookup, // column 6 + q_arith, // column 7 + q_delta_range, // column 8 + q_elliptic, // column 9 + q_aux, // column 10 q_poseidon2_external, // column 11 q_poseidon2_internal, // column 12 sigma_1, // column 13 @@ -159,8 +155,9 @@ class UltraFlavor { auto get_non_gate_selectors() { return RefArray{ q_m, q_c, q_l, q_r, q_o, q_4 }; } auto get_gate_selectors() { - return RefArray{ q_arith, q_delta_range, q_elliptic, q_aux, - q_lookup, q_poseidon2_external, q_poseidon2_internal }; + return RefArray{ + q_lookup, q_arith, q_delta_range, q_elliptic, q_aux, q_poseidon2_external, q_poseidon2_internal + }; } auto get_selectors() { return concatenate(get_non_gate_selectors(), get_gate_selectors()); } @@ -186,15 +183,15 @@ class UltraFlavor { lookup_read_tags) // column 7 auto get_wires() { return RefArray{ w_l, w_r, w_o, w_4 }; }; - auto get_to_be_shifted() { return RefArray{ z_perm }; }; + auto get_to_be_shifted() { return RefArray{ w_l, w_r, w_o, w_4, z_perm }; }; MSGPACK_FIELDS(w_l, w_r, w_o, w_4, z_perm, lookup_inverses, lookup_read_counts, lookup_read_tags); }; /** - * @brief Class for ShiftedWitnessEntities, containing only shifted witness polynomials. + * @brief Class for ShitftedEntities, containing shifted witness polynomials. */ - template class ShiftedWitnessEntities { + template class ShiftedEntities { public: DEFINE_FLAVOR_MEMBERS(DataType, w_l_shift, // column 0 @@ -203,33 +200,7 @@ class UltraFlavor { w_4_shift, // column 3 z_perm_shift) // column 4 - auto get_shifted_witnesses() { return RefArray{ w_l_shift, w_r_shift, w_o_shift, w_4_shift, z_perm_shift }; }; - }; - - /** - * @brief Class for ShiftedEntities, containing shifted witness and table polynomials. - * TODO: Remove NUM_SHIFTED_TABLES once these entities are deprecated. - */ - template class ShiftedTables { - public: - DEFINE_FLAVOR_MEMBERS(DataType, - table_1_shift, // column 0 - table_2_shift, // column 1 - table_3_shift, // column 2 - table_4_shift // column 3 - ) - }; - - /** - * @brief Class for ShiftedEntities, containing shifted witness and table polynomials. - */ - template - class ShiftedEntities : public ShiftedTables, public ShiftedWitnessEntities { - public: - DEFINE_COMPOUND_GET_ALL(ShiftedTables, ShiftedWitnessEntities) - - auto get_shifted_witnesses() { return ShiftedWitnessEntities::get_all(); }; - auto get_shifted_tables() { return ShiftedTables::get_all(); }; + auto get_shifted() { return RefArray{ w_l_shift, w_r_shift, w_o_shift, w_4_shift, z_perm_shift }; }; }; /** @@ -261,30 +232,15 @@ class UltraFlavor { }; auto get_precomputed() { return PrecomputedEntities::get_all(); } auto get_witness() { return WitnessEntities::get_all(); }; - auto get_to_be_shifted() - { - return concatenate(PrecomputedEntities::get_table_polynomials(), - WitnessEntities::get_wires(), - WitnessEntities::get_to_be_shifted()); - }; + auto get_to_be_shifted() { return WitnessEntities::get_to_be_shifted(); }; - auto get_shifted() { return ShiftedEntities::get_all(); }; - // getter for shifted witnesses - auto get_shifted_witnesses() { return ShiftedEntities::get_shifted_witnesses(); }; - // getter for shifted tables - auto get_shifted_tables() { return ShiftedEntities::get_shifted_tables(); }; // getter for all witnesses including shifted ones auto get_all_witnesses() { - return concatenate(WitnessEntities::get_all(), - ShiftedEntities::get_shifted_witnesses()); + return concatenate(WitnessEntities::get_all(), ShiftedEntities::get_shifted()); }; // getter for the complement of all witnesses inside all entities - auto get_non_witnesses() - { - return concatenate(PrecomputedEntities::get_all(), - ShiftedEntities::get_shifted_tables()); - }; + auto get_non_witnesses() { return PrecomputedEntities::get_all(); }; }; /** @@ -484,11 +440,11 @@ class UltraFlavor { const Commitment& q_r, const Commitment& q_o, const Commitment& q_4, + const Commitment& q_lookup, const Commitment& q_arith, const Commitment& q_delta_range, const Commitment& q_elliptic, const Commitment& q_aux, - const Commitment& q_lookup, const Commitment& q_poseidon2_external, const Commitment& q_poseidon2_internal, const Commitment& sigma_1, @@ -518,11 +474,11 @@ class UltraFlavor { this->q_r = q_r; this->q_o = q_o; this->q_4 = q_4; + this->q_lookup = q_lookup; this->q_arith = q_arith; this->q_delta_range = q_delta_range; this->q_elliptic = q_elliptic; this->q_aux = q_aux; - this->q_lookup = q_lookup; this->q_poseidon2_external = q_poseidon2_external; this->q_poseidon2_internal = q_poseidon2_internal; this->sigma_1 = sigma_1; @@ -554,11 +510,11 @@ class UltraFlavor { q_r, q_o, q_4, + q_lookup, q_arith, q_delta_range, q_elliptic, q_aux, - q_lookup, q_poseidon2_external, q_poseidon2_internal, sigma_1, @@ -644,11 +600,11 @@ class UltraFlavor { q_o = "Q_O"; q_4 = "Q_4"; q_m = "Q_M"; + q_lookup = "Q_LOOKUP"; q_arith = "Q_ARITH"; q_delta_range = "Q_SORT"; q_elliptic = "Q_ELLIPTIC"; q_aux = "Q_AUX"; - q_lookup = "Q_LOOKUP"; q_poseidon2_external = "Q_POSEIDON2_EXTERNAL"; q_poseidon2_internal = "Q_POSEIDON2_INTERNAL"; sigma_1 = "SIGMA_1"; @@ -685,11 +641,11 @@ class UltraFlavor { this->q_r = verification_key->q_r; this->q_o = verification_key->q_o; this->q_4 = verification_key->q_4; + this->q_lookup = verification_key->q_lookup; this->q_arith = verification_key->q_arith; this->q_delta_range = verification_key->q_delta_range; this->q_elliptic = verification_key->q_elliptic; this->q_aux = verification_key->q_aux; - this->q_lookup = verification_key->q_lookup; this->q_poseidon2_external = verification_key->q_poseidon2_external; this->q_poseidon2_internal = verification_key->q_poseidon2_internal; this->sigma_1 = verification_key->sigma_1; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp index 8ca7f72b418..e7b47f9235a 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp @@ -67,11 +67,11 @@ class UltraKeccakFlavor : public bb::UltraFlavor { const Commitment& q_r, const Commitment& q_o, const Commitment& q_4, + const Commitment& q_lookup, const Commitment& q_arith, const Commitment& q_delta_range, const Commitment& q_elliptic, const Commitment& q_aux, - const Commitment& q_lookup, const Commitment& q_poseidon2_external, const Commitment& q_poseidon2_internal, const Commitment& sigma_1, @@ -99,11 +99,11 @@ class UltraKeccakFlavor : public bb::UltraFlavor { this->q_r = q_r; this->q_o = q_o; this->q_4 = q_4; + this->q_lookup = q_lookup; this->q_arith = q_arith; this->q_delta_range = q_delta_range; this->q_elliptic = q_elliptic; this->q_aux = q_aux; - this->q_lookup = q_lookup; this->q_poseidon2_external = q_poseidon2_external; this->q_poseidon2_internal = q_poseidon2_internal; this->sigma_1 = sigma_1; @@ -133,11 +133,11 @@ class UltraKeccakFlavor : public bb::UltraFlavor { q_r, q_o, q_4, + q_lookup, q_arith, q_delta_range, q_elliptic, q_aux, - q_lookup, q_poseidon2_external, q_poseidon2_internal, sigma_1, diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_rollup_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_rollup_flavor.hpp index 6deb40b7020..440d1051834 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_rollup_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_rollup_flavor.hpp @@ -99,11 +99,11 @@ class UltraRollupFlavor : public bb::UltraFlavor { const Commitment& q_r, const Commitment& q_o, const Commitment& q_4, + const Commitment& q_lookup, const Commitment& q_arith, const Commitment& q_delta_range, const Commitment& q_elliptic, const Commitment& q_aux, - const Commitment& q_lookup, const Commitment& q_poseidon2_external, const Commitment& q_poseidon2_internal, const Commitment& sigma_1, @@ -135,11 +135,11 @@ class UltraRollupFlavor : public bb::UltraFlavor { this->q_r = q_r; this->q_o = q_o; this->q_4 = q_4; + this->q_lookup = q_lookup; this->q_arith = q_arith; this->q_delta_range = q_delta_range; this->q_elliptic = q_elliptic; this->q_aux = q_aux; - this->q_lookup = q_lookup; this->q_poseidon2_external = q_poseidon2_external; this->q_poseidon2_internal = q_poseidon2_internal; this->sigma_1 = sigma_1; @@ -173,11 +173,11 @@ class UltraRollupFlavor : public bb::UltraFlavor { q_r, q_o, q_4, + q_lookup, q_arith, q_delta_range, q_elliptic, q_aux, - q_lookup, q_poseidon2_external, q_poseidon2_internal, sigma_1, diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp index f7cc6ba6500..c6ddab34dbe 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp @@ -20,17 +20,11 @@ class UltraFlavorWithZK : public bb::UltraFlavor { public: // This flavor runs with ZK Sumcheck static constexpr bool HasZK = true; - // Compute the maximum over all partial subrelation lengths incremented by the corresponding subrelation witness - // degrees for the Relations inherited from UltraFlavor - static constexpr size_t MAX_PARTIAL_RELATION_LENGTH = compute_max_total_relation_length(); // Determine the number of evaluations of Prover and Libra Polynomials that the Prover sends to the Verifier in // the rounds of ZK Sumcheck. - static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 1; + static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = UltraFlavor::BATCHED_RELATION_PARTIAL_LENGTH + 1; // Construct the container for the subrelations' contributions - using SumcheckTupleOfTuplesOfUnivariates = - decltype(create_sumcheck_tuple_of_tuples_of_univariates()); - // Re-define ExtendedEdges to account for the incremented MAX_PARTIAL_RELATION_LENGTH - using ExtendedEdges = ProverUnivariates; + using SumcheckTupleOfTuplesOfUnivariates = decltype(create_sumcheck_tuple_of_tuples_of_univariates()); }; } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp index adb87ef96c7..b4645bf0d0a 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp @@ -198,11 +198,17 @@ template class SumcheckProver { std::vector multivariate_challenge; multivariate_challenge.reserve(multivariate_d); size_t round_idx = 0; + RowDisablingPolynomial row_disabling_polynomial; // In the first round, we compute the first univariate polynomial and populate the book-keeping table of // #partially_evaluated_polynomials, which has \f$ n/2 \f$ rows and \f$ N \f$ columns. When the Flavor has ZK, // 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); + auto round_univariate = round.compute_univariate(round_idx, + full_polynomials, + relation_parameters, + gate_separators, + alpha, + zk_sumcheck_data, + row_disabling_polynomial); vinfo("starting sumcheck rounds..."); { @@ -217,6 +223,7 @@ template class SumcheckProver { // Prepare ZK Sumcheck data for the next round if constexpr (Flavor::HasZK) { update_zk_sumcheck_data(zk_sumcheck_data, round_challenge, round_idx); + row_disabling_polynomial.update_evaluations(round_challenge, round_idx); }; gate_separators.partially_evaluate(round_challenge); round.round_size = round.round_size >> 1; // TODO(#224)(Cody): Maybe partially_evaluate should do this and @@ -233,7 +240,8 @@ template class SumcheckProver { relation_parameters, gate_separators, alpha, - zk_sumcheck_data); + zk_sumcheck_data, + row_disabling_polynomial); // Place evaluations of Sumcheck Round Univariate in the transcript transcript->send_to_verifier("Sumcheck:univariate_" + std::to_string(round_idx), round_univariate); FF round_challenge = transcript->template get_challenge("Sumcheck:u_" + std::to_string(round_idx)); @@ -243,6 +251,7 @@ template class SumcheckProver { // Prepare evaluation masking and libra structures for the next round (for ZK Flavors) if constexpr (Flavor::HasZK) { update_zk_sumcheck_data(zk_sumcheck_data, round_challenge, round_idx); + row_disabling_polynomial.update_evaluations(round_challenge, round_idx); }; gate_separators.partially_evaluate(round_challenge); @@ -591,10 +600,21 @@ template class SumcheckVerifier { for (auto [eval, transcript_eval] : zip_view(purported_evaluations.get_all(), transcript_evaluations)) { eval = transcript_eval; } + // For ZK Flavors: the evaluation of the Row Disabling Polynomial at the sumcheck challenge + FF correcting_factor{ 1 }; + if constexpr (Flavor::HasZK) { + RowDisablingPolynomial row_disabler = RowDisablingPolynomial(); + correcting_factor = row_disabler.evaluate_at_challenge(multivariate_challenge, multivariate_d); + } + // Evaluate the Honk relation at the point (u_0, ..., u_{d-1}) using claimed evaluations of prover polynomials. // In ZK Flavors, the evaluation is corrected by full_libra_purported_value - FF full_honk_purported_value = round.compute_full_relation_purported_value( - purported_evaluations, relation_parameters, gate_separators, alpha, full_libra_purported_value); + FF full_honk_purported_value = round.compute_full_relation_purported_value(purported_evaluations, + relation_parameters, + gate_separators, + alpha, + full_libra_purported_value, + correcting_factor); bool final_check(false); //! [Final Verification Step] if constexpr (IsRecursiveFlavor) { diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp index 88cdfd405e6..ffbc979548e 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.test.cpp @@ -172,7 +172,7 @@ template class SumcheckTests : public ::testing::Test { // TODO(#225): make the inputs to this test more interesting, e.g. non-trivial permutations void test_prover_verifier_flow() { - const size_t multivariate_d(2); + const size_t multivariate_d(3); const size_t multivariate_n(1 << multivariate_d); // Construct prover polynomials where each is the zero polynomial. @@ -186,8 +186,7 @@ template class SumcheckTests : public ::testing::Test { // Add some non-trivial values to certain polynomials so that the arithmetic relation will have non-trivial // contribution. Note: since all other polynomials are set to 0, all other relations are trivially // satisfied. - std::array w_l; - w_l = { 0, 1, 2, 0 }; + std::array w_l = { 0, 1, 2, 0 }; std::array w_r = { 0, 1, 2, 0 }; std::array w_o = { 0, 2, 4, 0 }; std::array w_4 = { 0, 0, 0, 0 }; @@ -199,6 +198,29 @@ template class SumcheckTests : public ::testing::Test { std::array q_arith = { 0, 1, 1, 0 }; // Setting all of these to 0 ensures the GrandProductRelation is satisfied + // For ZK Flavors: add some randomness to ProverPolynomials + if constexpr (Flavor::HasZK) { + w_l[7] = FF::random_element(); + w_r[6] = FF::random_element(); + w_4[6] = FF::random_element(); + auto z_1 = FF::random_element(); + auto z_2 = FF::random_element(); + auto r = FF::random_element(); + + std::array z_perm = { 0, 0, 0, 0, 0, 0, z_1, z_2 }; + std::array lookup_inverses = { 0, 0, 0, 0, 0, 0, r * r, r }; + + full_polynomials.z_perm = bb::Polynomial(z_perm); + full_polynomials.lookup_inverses = bb::Polynomial(lookup_inverses); + + if constexpr (std::is_same::value) { + std::array ecc_op_wire = { 0, 0, 0, 0, 0, 0, r * r * r, w_4[6] }; + std::array return_data_inverses = { 0, 0, 0, 0, 0, 0, FF(7) * r * r, -r }; + + full_polynomials.ecc_op_wire_1 = bb::Polynomial(ecc_op_wire); + full_polynomials.return_data_inverses = bb::Polynomial(return_data_inverses); + } + } full_polynomials.w_l = bb::Polynomial(w_l); full_polynomials.w_r = bb::Polynomial(w_r); full_polynomials.w_o = bb::Polynomial(w_o); @@ -259,7 +281,9 @@ template class SumcheckTests : public ::testing::Test { void test_failure_prover_verifier_flow() { - const size_t multivariate_d(2); + // Since the last 4 rows in ZK Flavors are disabled, we extend an invalid circuit of size 4 to size 8 by padding + // with 0. + const size_t multivariate_d(3); const size_t multivariate_n(1 << multivariate_d); // Construct prover polynomials where each is the zero polynomial. diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp index ea8c7ec3713..dc42333a19a 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck_round.hpp @@ -2,6 +2,7 @@ #include "barretenberg/common/thread.hpp" #include "barretenberg/flavor/flavor.hpp" #include "barretenberg/polynomials/gate_separator.hpp" +#include "barretenberg/polynomials/row_disabling_polynomial.hpp" #include "barretenberg/relations/relation_parameters.hpp" #include "barretenberg/relations/relation_types.hpp" #include "barretenberg/relations/utils.hpp" @@ -147,7 +148,8 @@ template class SumcheckProverRound { const bb::RelationParameters& relation_parameters, const bb::GateSeparatorPolynomial& gate_sparators, const RelationSeparator alpha, - ZKSumcheckData zk_sumcheck_data) // only populated when Flavor HasZK + ZKSumcheckData zk_sumcheck_data, // only populated when Flavor HasZK + RowDisablingPolynomial row_disabling_poly) { PROFILE_THIS_NAME("compute_univariate"); @@ -189,13 +191,16 @@ template class SumcheckProverRound { Utils::add_nested_tuples(univariate_accumulators, accumulators); } // For ZK Flavors: The evaluations of the round univariates are masked by the evaluations of Libra univariates + // and corrected by subtracting the contribution from the disabled rows if constexpr (Flavor::HasZK) { + const auto contribution_from_disabled_rows = compute_disabled_contribution( + polynomials, relation_parameters, gate_sparators, alpha, round_idx, row_disabling_poly); const auto libra_round_univariate = compute_libra_round_univariate(zk_sumcheck_data, round_idx); // Batch the univariate contributions from each sub-relation to obtain the round univariate const auto round_univariate = batch_over_relations(univariate_accumulators, alpha, gate_sparators); // Mask the round univariate - return round_univariate + libra_round_univariate; + return round_univariate + libra_round_univariate - contribution_from_disabled_rows; } // Batch the univariate contributions from each sub-relation to obtain the round univariate else { @@ -203,6 +208,45 @@ template class SumcheckProverRound { } } + /*! + * @brief For ZK Flavors: A method disabling the last 4 rows of the ProverPolynomials + * + * @details See description of RowDisablingPolynomial + * + */ + template + SumcheckRoundUnivariate compute_disabled_contribution( + ProverPolynomialsOrPartiallyEvaluatedMultivariates& polynomials, + const bb::RelationParameters& relation_parameters, + const bb::GateSeparatorPolynomial& gate_sparators, + const RelationSeparator alpha, + const size_t round_idx, + const RowDisablingPolynomial row_disabling_polynomial) + { + SumcheckTupleOfTuplesOfUnivariates univariate_accumulator; + ExtendedEdges extended_edges; + SumcheckRoundUnivariate result; + + // In Round 0, we have to compute the contribution from 2 edges: n - 1 = (1,1,...,1) and n-4 = (0,1,...,1). + size_t start_edge_idx = (round_idx == 0) ? round_size - 4 : round_size - 2; + + for (size_t edge_idx = start_edge_idx; edge_idx < round_size; edge_idx += 2) { + extend_edges(extended_edges, polynomials, edge_idx); + accumulate_relation_univariates(univariate_accumulator, + extended_edges, + relation_parameters, + gate_sparators[(edge_idx >> 1) * gate_sparators.periodicity]); + } + result = batch_over_relations(univariate_accumulator, alpha, gate_sparators); + bb::Univariate row_disabling_factor = + bb::Univariate({ row_disabling_polynomial.eval_at_0, row_disabling_polynomial.eval_at_1 }); + SumcheckRoundUnivariate row_disabling_factor_extended = + row_disabling_factor.template extend_to(); + result *= row_disabling_factor_extended; + + return result; + } + /** * @brief Given a tuple of tuples of extended per-relation contributions, \f$ (t_0, t_1, \ldots, * t_{\text{NUM_SUBRELATIONS}-1}) \f$ and a challenge \f$ \alpha \f$, scale them by the relation separator @@ -499,7 +543,8 @@ template class SumcheckVerifierRound { const bb::RelationParameters& relation_parameters, const bb::GateSeparatorPolynomial& gate_sparators, const RelationSeparator alpha, - std::optional full_libra_purported_value = std::nullopt) + const FF full_libra_purported_value = FF{ 0 }, + FF correcting_factor = FF{ 1 }) { // The verifier should never skip computation of contributions from any relation Utils::template accumulate_relation_evaluations_without_skipping<>( @@ -509,7 +554,7 @@ template class SumcheckVerifierRound { FF output{ 0 }; Utils::scale_and_batch_elements(relation_evaluations, alpha, running_challenge, output); if constexpr (Flavor::HasZK) { - output += full_libra_purported_value.value(); + output = output * correcting_factor + full_libra_purported_value; if constexpr (IsECCVMRecursiveFlavor) { output.self_reduce(); } diff --git a/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp b/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp index 39eccd6ef01..f9d3405d2f8 100644 --- a/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp +++ b/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp @@ -2,9 +2,9 @@ #include "barretenberg/flavor/plonk_flavors.hpp" #include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp" #include "barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_flavor.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_rollup_flavor.hpp" +#include "barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp" namespace bb { template void TraceToPolynomials::populate_public_inputs_block(Builder& builder) @@ -175,6 +175,7 @@ void TraceToPolynomials::add_ecc_op_wires_to_proving_key(Builder& builde } template class TraceToPolynomials; +template class TraceToPolynomials; template class TraceToPolynomials; template class TraceToPolynomials; template class TraceToPolynomials; diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/translator_flavor.hpp b/barretenberg/cpp/src/barretenberg/translator_vm/translator_flavor.hpp index 18bb9b63818..ca004d8a759 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/translator_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/translator_flavor.hpp @@ -127,8 +127,9 @@ class TranslatorFlavor { // BATCHED_RELATION_PARTIAL_LENGTH = algebraic degree of sumcheck relation *after* multiplying by the `pow_zeta` // random polynomial e.g. For \sum(x) [A(x) * B(x) + C(x)] * PowZeta(X), relation length = 2 and random relation - // length = 3 - static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 1; + // length = 3. + // The degree has to be further increased because the relation is multiplied by the Row Disabling Polynomial + static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH = MAX_PARTIAL_RELATION_LENGTH + 2; static constexpr size_t NUM_RELATIONS = std::tuple_size_v; // define the containers for storing the contributions from each relation in Sumcheck diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp index 01fad4e3974..f1efed42252 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp @@ -11,31 +11,34 @@ #include "barretenberg/ultra_honk/ultra_prover.hpp" #include "barretenberg/ultra_honk/ultra_verifier.hpp" +using namespace bb; namespace { -auto& engine = bb::numeric::get_debug_randomness(); -} +auto& engine = numeric::get_debug_randomness(); + +using FlavorTypes = ::testing::Types; -namespace bb { -class DataBusTests : public ::testing::Test { +template class DataBusTests : public ::testing::Test { protected: static void SetUpTestSuite() { bb::srs::init_crs_factory("../srs_db/ignition"); } using Curve = curve::BN254; using FF = Curve::ScalarField; - using Builder = MegaCircuitBuilder; + using Builder = typename Flavor::CircuitBuilder; + using Prover = UltraProver_; + using Verifier = UltraVerifier_; // Construct and verify a MegaHonk proof for a given circuit static bool construct_and_verify_proof(MegaCircuitBuilder& builder) { - MegaProver prover{ builder }; - auto verification_key = std::make_shared(prover.proving_key->proving_key); - MegaVerifier verifier{ verification_key }; + Prover prover{ builder }; + auto verification_key = std::make_shared(prover.proving_key->proving_key); + Verifier verifier{ verification_key }; auto proof = prover.construct_proof(); return verifier.verify_proof(proof); } // Construct a Mega circuit with some arbitrary sample gates - static MegaCircuitBuilder construct_test_builder() + static Builder construct_test_builder() { auto op_queue = std::make_shared(); auto builder = MegaCircuitBuilder{ op_queue }; @@ -111,54 +114,56 @@ class DataBusTests : public ::testing::Test { } }; +TYPED_TEST_SUITE(DataBusTests, FlavorTypes); + /** * @brief Test proof construction/verification for a circuit with calldata lookup gates * */ -TEST_F(DataBusTests, CallDataRead) +TYPED_TEST(DataBusTests, CallDataRead) { - Builder builder = construct_test_builder(); - construct_circuit_with_calldata_reads(builder); + typename TypeParam::CircuitBuilder builder = this->construct_test_builder(); + this->construct_circuit_with_calldata_reads(builder); - EXPECT_TRUE(construct_and_verify_proof(builder)); + EXPECT_TRUE(this->construct_and_verify_proof(builder)); } /** * @brief Test proof construction/verification for a circuit with secondary_calldata lookup gates * */ -TEST_F(DataBusTests, CallData2Read) +TYPED_TEST(DataBusTests, CallData2Read) { - Builder builder = construct_test_builder(); - construct_circuit_with_secondary_calldata_reads(builder); + typename TypeParam::CircuitBuilder builder = this->construct_test_builder(); + this->construct_circuit_with_secondary_calldata_reads(builder); - EXPECT_TRUE(construct_and_verify_proof(builder)); + EXPECT_TRUE(this->construct_and_verify_proof(builder)); } /** * @brief Test proof construction/verification for a circuit with return data lookup gates * */ -TEST_F(DataBusTests, ReturnDataRead) +TYPED_TEST(DataBusTests, ReturnDataRead) { - Builder builder = construct_test_builder(); - construct_circuit_with_return_data_reads(builder); + typename TypeParam::CircuitBuilder builder = this->construct_test_builder(); + this->construct_circuit_with_return_data_reads(builder); - EXPECT_TRUE(construct_and_verify_proof(builder)); + EXPECT_TRUE(this->construct_and_verify_proof(builder)); } /** * @brief Test proof construction/verification for a circuit with reads from all bus columns * */ -TEST_F(DataBusTests, ReadAll) +TYPED_TEST(DataBusTests, ReadAll) { - Builder builder = construct_test_builder(); - construct_circuit_with_calldata_reads(builder); - construct_circuit_with_secondary_calldata_reads(builder); - construct_circuit_with_return_data_reads(builder); + typename TypeParam::CircuitBuilder builder = this->construct_test_builder(); + this->construct_circuit_with_calldata_reads(builder); + this->construct_circuit_with_secondary_calldata_reads(builder); + this->construct_circuit_with_return_data_reads(builder); - EXPECT_TRUE(construct_and_verify_proof(builder)); + EXPECT_TRUE(this->construct_and_verify_proof(builder)); } /** @@ -166,12 +171,14 @@ TEST_F(DataBusTests, ReadAll) * the read results are correct * */ -TEST_F(DataBusTests, CallDataDuplicateRead) +TYPED_TEST(DataBusTests, CallDataDuplicateRead) { // Construct a circuit and add some ecc op gates and arithmetic gates - auto builder = construct_test_builder(); + typename TypeParam::CircuitBuilder builder = this->construct_test_builder(); + using FF = TypeParam::FF; // Add some values to calldata + std::vector calldata_values = { 7, 10, 3, 12, 1 }; for (auto& val : calldata_values) { builder.add_public_calldata(builder.add_variable(val)); @@ -201,8 +208,7 @@ TEST_F(DataBusTests, CallDataDuplicateRead) EXPECT_EQ(duplicate_read_result_2, expected_read_result_at_1); // Construct and verify Honk proof - bool result = construct_and_verify_proof(builder); + bool result = this->construct_and_verify_proof(builder); EXPECT_TRUE(result); } - -} // namespace bb \ No newline at end of file +} // namespace \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp index e82b2ccacf9..bcef1fe9343 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.cpp @@ -24,12 +24,152 @@ template size_t DeciderProvingKey_::compute_dyadi // The number of gates is the maximum required by the lookup argument or everything else, plus an optional zero row // to allow for shifts. - size_t total_num_gates = num_zero_rows + std::max(min_size_due_to_lookups, min_size_of_execution_trace); + size_t total_num_gates = + MASKING_OFFSET + num_zero_rows + std::max(min_size_due_to_lookups, min_size_of_execution_trace); // Next power of 2 (dyadic circuit size) return circuit.get_circuit_subgroup_size(total_num_gates); } +template void DeciderProvingKey_::allocate_wires() +{ + PROFILE_THIS_NAME("allocate_wires"); + + for (auto& wire : proving_key.polynomials.get_wires()) { + wire = Polynomial::shiftable(proving_key.circuit_size); + } +} + +template void DeciderProvingKey_::allocate_permutation_argument_polynomials() +{ + PROFILE_THIS_NAME("allocate_permutation_argument_polynomials"); + + for (auto& sigma : proving_key.polynomials.get_sigmas()) { + sigma = Polynomial(proving_key.circuit_size); + } + for (auto& id : proving_key.polynomials.get_ids()) { + id = Polynomial(proving_key.circuit_size); + } + proving_key.polynomials.z_perm = Polynomial::shiftable(proving_key.circuit_size); +} + +template void DeciderProvingKey_::allocate_lagrange_polynomials() +{ + PROFILE_THIS_NAME("allocate_lagrange_polynomials"); + + // First and last lagrange polynomials (in the full circuit size) + proving_key.polynomials.lagrange_first = Polynomial( + /* size=*/1, /*virtual size=*/dyadic_circuit_size, /*start_index=*/0); + + // Even though lagrange_last has a single non-zero element, we cannot set its size to 0 as different + // keys being folded might have lagrange_last set at different indexes and folding does not work + // correctly unless the polynomial is allocated in the correct range to accomodate this + proving_key.polynomials.lagrange_last = Polynomial( + /* size=*/dyadic_circuit_size, /*virtual size=*/dyadic_circuit_size, /*start_index=*/0); +} + +template void DeciderProvingKey_::allocate_selectors(const Circuit& circuit) +{ + PROFILE_THIS_NAME("allocate_selectors"); + + // Define gate selectors over the block they are isolated to + for (auto [selector, block] : + zip_view(proving_key.polynomials.get_gate_selectors(), circuit.blocks.get_gate_blocks())) { + + // TODO(https://github.com/AztecProtocol/barretenberg/issues/914): q_arith is currently used + // in aux block. + if (&block == &circuit.blocks.arithmetic) { + size_t arith_size = circuit.blocks.aux.trace_offset - circuit.blocks.arithmetic.trace_offset + + circuit.blocks.aux.get_fixed_size(is_structured); + selector = Polynomial(arith_size, proving_key.circuit_size, circuit.blocks.arithmetic.trace_offset); + } else { + selector = Polynomial(block.get_fixed_size(is_structured), proving_key.circuit_size, block.trace_offset); + } + } + + // Set the other non-gate selector polynomials (e.g. q_l, q_r, q_m etc.) to full size + for (auto& selector : proving_key.polynomials.get_non_gate_selectors()) { + selector = Polynomial(proving_key.circuit_size); + } +} + +template +void DeciderProvingKey_::allocate_table_lookup_polynomials(const Circuit& circuit) +{ + PROFILE_THIS_NAME("allocate_table_lookup_polynomials"); + + size_t table_offset = circuit.blocks.lookup.trace_offset; + const size_t max_tables_size = + std::min(static_cast(MAX_LOOKUP_TABLES_SIZE), dyadic_circuit_size - table_offset); + ASSERT(dyadic_circuit_size > max_tables_size); + + // Allocate the polynomials containing the actual table data + if constexpr (IsUltraFlavor) { + for (auto& poly : proving_key.polynomials.get_tables()) { + poly = Polynomial(max_tables_size, dyadic_circuit_size, table_offset); + } + } + + // Allocate the read counts and tags polynomials + proving_key.polynomials.lookup_read_counts = Polynomial(max_tables_size, dyadic_circuit_size, table_offset); + proving_key.polynomials.lookup_read_tags = Polynomial(max_tables_size, dyadic_circuit_size, table_offset); + ZoneScopedN("allocating lookup and databus inverses"); + + const size_t lookup_block_end = + static_cast(circuit.blocks.lookup.trace_offset + circuit.blocks.lookup.get_fixed_size(is_structured)); + const auto tables_end = circuit.blocks.lookup.trace_offset + max_tables_size; + + // Allocate the lookup_inverses polynomial + + const size_t lookup_inverses_start = table_offset; + const size_t lookup_inverses_end = std::max(lookup_block_end, tables_end); + + proving_key.polynomials.lookup_inverses = + Polynomial(lookup_inverses_end - lookup_inverses_start, dyadic_circuit_size, lookup_inverses_start); +} + +template +void DeciderProvingKey_::allocate_ecc_op_polynomials(const Circuit& circuit) + requires IsMegaFlavor +{ + PROFILE_THIS_NAME("allocate_ecc_op_polynomials"); + + // Allocate the ecc op wires and selector + const size_t op_wire_offset = circuit.blocks.ecc_op.trace_offset; + const size_t ecc_op_block_size = circuit.blocks.ecc_op.get_fixed_size(is_structured); + for (auto& wire : proving_key.polynomials.get_ecc_op_wires()) { + wire = Polynomial(ecc_op_block_size, proving_key.circuit_size, op_wire_offset); + } + proving_key.polynomials.lagrange_ecc_op = Polynomial(ecc_op_block_size, proving_key.circuit_size, op_wire_offset); +} + +template +void DeciderProvingKey_::allocate_databus_polynomials(const Circuit& circuit) + requires HasDataBus +{ + proving_key.polynomials.calldata = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.calldata_read_counts = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.calldata_read_tags = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.secondary_calldata = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.secondary_calldata_read_counts = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.secondary_calldata_read_tags = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.return_data = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.return_data_read_counts = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + proving_key.polynomials.return_data_read_tags = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + + proving_key.polynomials.databus_id = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); + + // Allocate log derivative lookup argument inverse polynomials + const size_t q_busread_end = + circuit.blocks.busread.trace_offset + circuit.blocks.busread.get_fixed_size(is_structured); + proving_key.polynomials.calldata_inverses = + Polynomial(std::max(circuit.get_calldata().size(), q_busread_end), dyadic_circuit_size); + proving_key.polynomials.secondary_calldata_inverses = + Polynomial(std::max(circuit.get_secondary_calldata().size(), q_busread_end), dyadic_circuit_size); + proving_key.polynomials.return_data_inverses = + Polynomial(std::max(circuit.get_return_data().size(), q_busread_end), dyadic_circuit_size); +} + /** * @brief * @details @@ -39,7 +179,7 @@ template size_t DeciderProvingKey_::compute_dyadi */ template void DeciderProvingKey_::construct_databus_polynomials(Circuit& circuit) - requires IsMegaFlavor + requires HasDataBus { auto& calldata_poly = proving_key.polynomials.calldata; auto& calldata_read_counts = proving_key.polynomials.calldata_read_counts; @@ -51,9 +191,9 @@ void DeciderProvingKey_::construct_databus_polynomials(Circuit& circuit) auto& return_data_read_counts = proving_key.polynomials.return_data_read_counts; auto& return_data_read_tags = proving_key.polynomials.return_data_read_tags; - auto calldata = circuit.get_calldata(); - auto secondary_calldata = circuit.get_secondary_calldata(); - auto return_data = circuit.get_return_data(); + const auto& calldata = circuit.get_calldata(); + const auto& secondary_calldata = circuit.get_secondary_calldata(); + const auto& return_data = circuit.get_return_data(); // Note: We do not utilize a zero row for databus columns for (size_t idx = 0; idx < calldata.size(); ++idx) { @@ -188,6 +328,7 @@ void DeciderProvingKey_::move_structured_trace_overflow_to_overflow_bloc } template class DeciderProvingKey_; +template class DeciderProvingKey_; template class DeciderProvingKey_; template class DeciderProvingKey_; template class DeciderProvingKey_; 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 7e114c40a3f..c6b5bf1b1c0 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_proving_key.hpp @@ -6,9 +6,9 @@ #include "barretenberg/plonk_honk_shared/execution_trace/ultra_execution_trace.hpp" #include "barretenberg/relations/relation_parameters.hpp" #include "barretenberg/stdlib_circuit_builders/mega_zk_flavor.hpp" -#include "barretenberg/stdlib_circuit_builders/ultra_flavor.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_keccak_flavor.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_rollup_flavor.hpp" +#include "barretenberg/stdlib_circuit_builders/ultra_zk_flavor.hpp" #include "barretenberg/trace_to_polynomials/trace_to_polynomials.hpp" namespace bb { @@ -98,8 +98,8 @@ template class DeciderProvingKey_ { if constexpr (IsMegaFlavor) { circuit.op_queue->append_nonzero_ops(); } + vinfo("allocating polynomials object in proving key..."); { - PROFILE_THIS_NAME("allocating proving key"); proving_key = ProvingKey(dyadic_circuit_size, circuit.public_inputs.size(), commitment_key); @@ -109,165 +109,24 @@ template class DeciderProvingKey_ { if ((IsMegaFlavor && !is_structured) || (is_structured && circuit.blocks.has_overflow)) { // Allocate full size polynomials proving_key.polynomials = typename Flavor::ProverPolynomials(dyadic_circuit_size); - vinfo("allocated polynomials object in proving key"); } else { // Allocate only a correct amount of memory for each polynomial - // Allocate the wires and selectors polynomials - { - PROFILE_THIS_NAME("allocating wires"); - - for (auto& wire : proving_key.polynomials.get_wires()) { - wire = Polynomial::shiftable(proving_key.circuit_size); - } - } - { - PROFILE_THIS_NAME("allocating gate selectors"); - - // Define gate selectors over the block they are isolated to - for (auto [selector, block] : - zip_view(proving_key.polynomials.get_gate_selectors(), circuit.blocks.get_gate_blocks())) { - - // TODO(https://github.com/AztecProtocol/barretenberg/issues/914): q_arith is currently used - // in aux block. - if (&block == &circuit.blocks.arithmetic) { - size_t arith_size = circuit.blocks.aux.trace_offset - - circuit.blocks.arithmetic.trace_offset + - circuit.blocks.aux.get_fixed_size(is_structured); - selector = Polynomial( - arith_size, proving_key.circuit_size, circuit.blocks.arithmetic.trace_offset); - } else { - selector = Polynomial( - block.get_fixed_size(is_structured), proving_key.circuit_size, block.trace_offset); - } - } - } - { - PROFILE_THIS_NAME("allocating non-gate selectors"); + allocate_wires(); - // Set the other non-gate selector polynomials to full size - for (auto& selector : proving_key.polynomials.get_non_gate_selectors()) { - selector = Polynomial(proving_key.circuit_size); - } - } - if constexpr (IsMegaFlavor) { - PROFILE_THIS_NAME("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); - const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; - for (auto& wire : proving_key.polynomials.get_ecc_op_wires()) { - wire = Polynomial(ecc_op_block_size, proving_key.circuit_size, op_wire_offset); - } - proving_key.polynomials.lagrange_ecc_op = - Polynomial(ecc_op_block_size, proving_key.circuit_size, op_wire_offset); - } + allocate_permutation_argument_polynomials(); - if constexpr (HasDataBus) { - proving_key.polynomials.calldata = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.calldata_read_counts = - Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.calldata_read_tags = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.secondary_calldata = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.secondary_calldata_read_counts = - Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.secondary_calldata_read_tags = - Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.return_data = Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.return_data_read_counts = - Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - proving_key.polynomials.return_data_read_tags = - Polynomial(MAX_DATABUS_SIZE, proving_key.circuit_size); - - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1107): Restricting databus_id to - // databus_size leads to failure. - // const size_t databus_size = std::max({ calldata.size(), secondary_calldata.size(), - // return_data.size() }); - proving_key.polynomials.databus_id = Polynomial(proving_key.circuit_size, proving_key.circuit_size); - } - const size_t max_tables_size = - std::min(static_cast(MAX_LOOKUP_TABLES_SIZE), dyadic_circuit_size - 1); - size_t table_offset = dyadic_circuit_size - max_tables_size; - { - PROFILE_THIS_NAME("allocating table polynomials"); - - ASSERT(dyadic_circuit_size > max_tables_size); - - // Allocate the table polynomials - if constexpr (IsUltraFlavor) { - for (auto& poly : proving_key.polynomials.get_tables()) { - poly = Polynomial(max_tables_size, dyadic_circuit_size, table_offset); - } - } - } - { - PROFILE_THIS_NAME("allocating sigmas and ids"); - - for (auto& sigma : proving_key.polynomials.get_sigmas()) { - sigma = Polynomial(proving_key.circuit_size); - } - for (auto& id : proving_key.polynomials.get_ids()) { - id = Polynomial(proving_key.circuit_size); - } - } - { - ZoneScopedN("allocating lookup read counts and tags"); - // Allocate the read counts and tags polynomials - proving_key.polynomials.lookup_read_counts = - Polynomial(max_tables_size, dyadic_circuit_size, table_offset); - proving_key.polynomials.lookup_read_tags = - Polynomial(max_tables_size, dyadic_circuit_size, table_offset); - } - { - ZoneScopedN("allocating lookup and databus inverses"); - // Allocate the lookup_inverses polynomial - 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 - const size_t table_offset = - dyadic_circuit_size - - std::min(dyadic_circuit_size - 1, static_cast(MAX_LOOKUP_TABLES_SIZE)); - const size_t lookup_inverses_start = std::min(lookup_offset, table_offset); - const size_t lookup_inverses_end = - std::min(dyadic_circuit_size, - std::max(lookup_offset + circuit.blocks.lookup.get_fixed_size(is_structured), - table_offset + MAX_LOOKUP_TABLES_SIZE)); - proving_key.polynomials.lookup_inverses = Polynomial( - lookup_inverses_end - lookup_inverses_start, dyadic_circuit_size, lookup_inverses_start); - if constexpr (HasDataBus) { - const size_t q_busread_end = - circuit.blocks.busread.trace_offset + circuit.blocks.busread.get_fixed_size(is_structured); - // Allocate the databus inverse polynomials - proving_key.polynomials.calldata_inverses = - Polynomial(std::max(circuit.get_calldata().size(), q_busread_end), dyadic_circuit_size); - proving_key.polynomials.secondary_calldata_inverses = Polynomial( - std::max(circuit.get_secondary_calldata().size(), q_busread_end), dyadic_circuit_size); - proving_key.polynomials.return_data_inverses = - Polynomial(std::max(circuit.get_return_data().size(), q_busread_end), dyadic_circuit_size); - } - } - { - PROFILE_THIS_NAME("constructing z_perm"); + allocate_selectors(circuit); - // 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."); - } + allocate_table_lookup_polynomials(circuit); - { - PROFILE_THIS_NAME("allocating lagrange polynomials"); + allocate_lagrange_polynomials(); - // First and last lagrange polynomials (in the full circuit size) - proving_key.polynomials.lagrange_first = Polynomial( - /* size=*/1, /*virtual size=*/dyadic_circuit_size, /*start_idx=*/0); - - // Even though lagrange_last has a single non-zero element, we cannot set its size to 0 as different - // keys being folded might have lagrange_last set at different indexes and folding does not work - // correctly unless the polynomial is allocated in the correct range to accomodate this - proving_key.polynomials.lagrange_last = Polynomial( - /* size=*/dyadic_circuit_size, /*virtual size=*/dyadic_circuit_size, /*start_idx=*/0); + if constexpr (IsMegaFlavor) { + allocate_ecc_op_polynomials(circuit); + } + if constexpr (HasDataBus) { + allocate_databus_polynomials(circuit); } } - vinfo("allocated polynomials object in proving key"); // We can finally set the shifted polynomials now that all of the to_be_shifted polynomials are // defined. proving_key.polynomials.set_shifted(); // Ensure shifted wires are set correctly @@ -276,7 +135,6 @@ 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"); @@ -296,7 +154,7 @@ template class DeciderProvingKey_ { PROFILE_THIS_NAME("constructing lookup table polynomials"); construct_lookup_table_polynomials( - proving_key.polynomials.get_tables(), circuit, dyadic_circuit_size); + proving_key.polynomials.get_tables(), circuit, dyadic_circuit_size, MASKING_OFFSET); } { @@ -343,6 +201,22 @@ template class DeciderProvingKey_ { size_t compute_dyadic_size(Circuit&); + void allocate_wires(); + + void allocate_permutation_argument_polynomials(); + + void allocate_lagrange_polynomials(); + + void allocate_selectors(const Circuit&); + + void allocate_table_lookup_polynomials(const Circuit&); + + void allocate_ecc_op_polynomials(const Circuit&) + requires IsMegaFlavor; + + void allocate_databus_polynomials(const Circuit&) + requires HasDataBus; + /** * @brief Compute dyadic size based on a structured trace with fixed block size * @@ -350,7 +224,7 @@ template class DeciderProvingKey_ { size_t compute_structured_dyadic_size(Circuit& circuit) { return circuit.blocks.get_structured_dyadic_size(); } void construct_databus_polynomials(Circuit&) - requires IsMegaFlavor; + requires HasDataBus; static void move_structured_trace_overflow_to_overflow_block(Circuit& circuit); }; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp index 2902057f62a..31f345c83d1 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp @@ -240,7 +240,6 @@ TYPED_TEST(MegaTranscriptTests, VerifierManifestConsistency) // Check consistency between the manifests generated by the prover and verifier auto prover_manifest = prover.transcript->get_manifest(); - prover_manifest.print(); auto verifier_manifest = verifier.transcript->get_manifest(); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/gas.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/gas.hpp index f8e68f6b0b2..5ac772aa28a 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/gas.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/gas.hpp @@ -10,7 +10,7 @@ template class gasImpl { public: using FF = FF_; - static constexpr std::array SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 3, 3, 3, 5, 5, 4, 4, 2, 2 }; + static constexpr std::array SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 3, 5, 5, 4, 4, 2, 2 }; template void static accumulate(ContainerOverSubrelations& evals, @@ -46,67 +46,53 @@ template class gasImpl { } { using Accumulator = typename std::tuple_element_t<4, ContainerOverSubrelations>; - auto tmp = - (new_term.main_is_fake_row * (new_term.main_l2_gas_remaining - new_term.main_l2_gas_remaining_shift)); - tmp *= scaling_factor; - std::get<4>(evals) += typename Accumulator::View(tmp); - } - { - using Accumulator = typename std::tuple_element_t<5, ContainerOverSubrelations>; - auto tmp = - (new_term.main_is_fake_row * (new_term.main_da_gas_remaining - new_term.main_da_gas_remaining_shift)); - tmp *= scaling_factor; - std::get<5>(evals) += typename Accumulator::View(tmp); - } - { - using Accumulator = typename std::tuple_element_t<6, ContainerOverSubrelations>; auto tmp = ((new_term.main_is_gas_accounted * ((FF(1) - new_term.main_sel_op_external_call) - new_term.main_sel_op_static_call)) * (((new_term.main_l2_gas_remaining_shift - new_term.main_l2_gas_remaining) + new_term.main_base_l2_gas_op_cost) + (new_term.main_dyn_l2_gas_op_cost * new_term.main_dyn_gas_multiplier))); tmp *= scaling_factor; - std::get<6>(evals) += typename Accumulator::View(tmp); + std::get<4>(evals) += typename Accumulator::View(tmp); } { - using Accumulator = typename std::tuple_element_t<7, ContainerOverSubrelations>; + using Accumulator = typename std::tuple_element_t<5, ContainerOverSubrelations>; auto tmp = ((new_term.main_is_gas_accounted * ((FF(1) - new_term.main_sel_op_external_call) - new_term.main_sel_op_static_call)) * (((new_term.main_da_gas_remaining_shift - new_term.main_da_gas_remaining) + new_term.main_base_da_gas_op_cost) + (new_term.main_dyn_da_gas_op_cost * new_term.main_dyn_gas_multiplier))); tmp *= scaling_factor; - std::get<7>(evals) += typename Accumulator::View(tmp); + std::get<5>(evals) += typename Accumulator::View(tmp); } { - using Accumulator = typename std::tuple_element_t<8, ContainerOverSubrelations>; + using Accumulator = typename std::tuple_element_t<6, ContainerOverSubrelations>; auto tmp = (new_term.main_is_gas_accounted * (((FF(1) - (FF(2) * new_term.main_l2_out_of_gas)) * new_term.main_l2_gas_remaining_shift) - new_term.main_abs_l2_rem_gas)); tmp *= scaling_factor; - std::get<8>(evals) += typename Accumulator::View(tmp); + std::get<6>(evals) += typename Accumulator::View(tmp); } { - using Accumulator = typename std::tuple_element_t<9, ContainerOverSubrelations>; + using Accumulator = typename std::tuple_element_t<7, ContainerOverSubrelations>; auto tmp = (new_term.main_is_gas_accounted * (((FF(1) - (FF(2) * new_term.main_da_out_of_gas)) * new_term.main_da_gas_remaining_shift) - new_term.main_abs_da_rem_gas)); tmp *= scaling_factor; - std::get<9>(evals) += typename Accumulator::View(tmp); + std::get<7>(evals) += typename Accumulator::View(tmp); } { - using Accumulator = typename std::tuple_element_t<10, ContainerOverSubrelations>; + using Accumulator = typename std::tuple_element_t<8, ContainerOverSubrelations>; auto tmp = (new_term.main_abs_l2_rem_gas - (new_term.main_l2_gas_u16_r0 + (new_term.main_l2_gas_u16_r1 * FF(65536)))); tmp *= scaling_factor; - std::get<10>(evals) += typename Accumulator::View(tmp); + std::get<8>(evals) += typename Accumulator::View(tmp); } { - using Accumulator = typename std::tuple_element_t<11, ContainerOverSubrelations>; + using Accumulator = typename std::tuple_element_t<9, ContainerOverSubrelations>; auto tmp = (new_term.main_abs_da_rem_gas - (new_term.main_da_gas_u16_r0 + (new_term.main_da_gas_u16_r1 * FF(65536)))); tmp *= scaling_factor; - std::get<11>(evals) += typename Accumulator::View(tmp); + std::get<9>(evals) += typename Accumulator::View(tmp); } } }; @@ -121,12 +107,8 @@ template class gas : public Relation> { case 0: return "IS_GAS_ACCOUNTED"; case 4: - return "L2_GAS_NO_DECREMENT_FAKE_ROW"; - case 5: - return "DA_GAS_NO_DECREMENT_FAKE_ROW"; - case 6: return "L2_GAS_REMAINING_DECREMENT_NOT_CALL"; - case 7: + case 5: return "DA_GAS_REMAINING_DECREMENT_NOT_CALL"; } return std::to_string(index); @@ -134,10 +116,8 @@ template class gas : public Relation> { // Subrelation indices constants, to be used in tests. static constexpr size_t SR_IS_GAS_ACCOUNTED = 0; - static constexpr size_t SR_L2_GAS_NO_DECREMENT_FAKE_ROW = 4; - static constexpr size_t SR_DA_GAS_NO_DECREMENT_FAKE_ROW = 5; - static constexpr size_t SR_L2_GAS_REMAINING_DECREMENT_NOT_CALL = 6; - static constexpr size_t SR_DA_GAS_REMAINING_DECREMENT_NOT_CALL = 7; + static constexpr size_t SR_L2_GAS_REMAINING_DECREMENT_NOT_CALL = 4; + static constexpr size_t SR_DA_GAS_REMAINING_DECREMENT_NOT_CALL = 5; }; } // namespace bb::avm \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp index 26de359d82f..8c69de39672 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/arithmetic.test.cpp @@ -227,8 +227,10 @@ class AvmArithmeticTests : public ::testing::Test { .nested_returndata = {}, .last_pc = 0, .success_offset = 0, - .l2_gas = 0, - .da_gas = 0, + .start_l2_gas_left = 0, + .start_da_gas_left = 0, + .l2_gas_left = 0, + .da_gas_left = 0, .internal_return_ptr_stack = {} }); trace_builder.current_ext_call_ctx = ext_call_ctx; } diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp index 726a17af205..8086db12147 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/cast.test.cpp @@ -193,8 +193,10 @@ TEST_F(AvmCastTests, truncationFFToU16ModMinus1) .nested_returndata = {}, .last_pc = 0, .success_offset = 0, - .l2_gas = 0, - .da_gas = 0, + .start_l2_gas_left = 0, + .start_da_gas_left = 0, + .l2_gas_left = 0, + .da_gas_left = 0, .internal_return_ptr_stack = {} }); trace_builder.current_ext_call_ctx = ext_call_ctx; trace_builder.op_set(0, 0, 0, AvmMemoryTag::U32); @@ -222,8 +224,10 @@ TEST_F(AvmCastTests, truncationFFToU16ModMinus2) .nested_returndata = {}, .last_pc = 0, .success_offset = 0, - .l2_gas = 0, - .da_gas = 0, + .start_l2_gas_left = 0, + .start_da_gas_left = 0, + .l2_gas_left = 0, + .da_gas_left = 0, .internal_return_ptr_stack = {} }); trace_builder.current_ext_call_ctx = ext_call_ctx; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp index 8ddbb487ee6..86b62b8a64e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/execution.test.cpp @@ -54,6 +54,10 @@ class AvmExecutionTests : public ::testing::Test { public_inputs.gas_settings.gas_limits.da_gas = DEFAULT_INITIAL_DA_GAS; public_inputs.start_gas_used.l2_gas = 0; public_inputs.start_gas_used.da_gas = 0; + public_inputs.end_tree_snapshots.note_hash_tree.size = + public_inputs.start_tree_snapshots.note_hash_tree.size + MAX_NOTE_HASHES_PER_TX; + public_inputs.end_tree_snapshots.nullifier_tree.size = + public_inputs.start_tree_snapshots.nullifier_tree.size + MAX_NULLIFIERS_PER_TX; // These values are magic because of how some tests work! Don't change them PublicCallRequest dummy_request = { @@ -126,6 +130,8 @@ class AvmExecutionTests : public ::testing::Test { } }; +class AvmExecutionTestsToRadix : public AvmExecutionTests, public testing::WithParamInterface {}; + // Basic positive test with an ADD and RETURN opcode. // Parsing, trace generation and proving is verified. TEST_F(AvmExecutionTests, basicAddReturn) @@ -850,85 +856,15 @@ TEST_F(AvmExecutionTests, setAndCastOpcodes) validate_trace(std::move(trace), public_inputs); } -// Positive test with TO_RADIX_BE. -TEST_F(AvmExecutionTests, toRadixBeOpcodeBytes) -{ - std::string bytecode_hex = - to_hex(OpCode::SET_8) + // opcode SET - "00" // Indirect flag - "00" // dst_offset - + to_hex(AvmMemoryTag::U32) + "00" // val - + to_hex(OpCode::SET_8) + // opcode SET - "00" // Indirect flag - "01" // dst_offset - + to_hex(AvmMemoryTag::U32) + "01" // val - + to_hex(OpCode::CALLDATACOPY) + // opcode CALLDATACOPY - "00" // Indirect flag - "0000" // cd_offset - "0001" // copy_size - "0001" // dst_offset - + to_hex(OpCode::SET_8) + // opcode SET for indirect src - "00" // Indirect flag - "11" // dst_offset 17 - + to_hex(AvmMemoryTag::U32) + "01" // value 1 (i.e. where the src from calldata is copied) - + to_hex(OpCode::SET_8) + // opcode SET for indirect dst - "00" // Indirect flag - "15" // dst_offset 21 - + to_hex(AvmMemoryTag::U32) + "05" // value 5 (i.e. where the dst will be written to) - + to_hex(OpCode::SET_8) + // opcode SET for indirect dst - "00" // Indirect flag - "80" // radix_offset 80 - + to_hex(AvmMemoryTag::U32) + "02" // value 2 (i.e. radix 2 - perform bitwise decomposition) - + to_hex(OpCode::TORADIXBE) + // opcode TO_RADIX_BE - "03" // Indirect flag - "0011" // src_offset 17 (indirect) - "0015" // dst_offset 21 (indirect) - "0080" // radix_offset 80 (direct) - "0100" // limbs: 256 - "00" // output_bits: false - + to_hex(OpCode::SET_16) + // opcode SET (for return size) - "00" // Indirect flag - "0200" // dst_offset=512 - + to_hex(AvmMemoryTag::U32) + // - "0100" // val: 256 - + to_hex(OpCode::RETURN) + // opcode RETURN - "00" // Indirect flag - "0005" // ret offset 5 - "0200"; // ret size offset 512 - - auto bytecode = hex_to_bytes(bytecode_hex); - auto [instructions, error] = Deserialization::parse_bytecode_statically(bytecode); - ASSERT_TRUE(is_ok(error)); - - // Assign a vector that we will mutate internally in gen_trace to store the return values; - std::vector returndata; - ExecutionHints execution_hints; - auto trace = - gen_trace(bytecode, std::vector{ FF::modulus - FF(1) }, public_inputs, returndata, execution_hints); - - // Find the first row enabling the TORADIXBE selector - // Expected output is bitwise decomposition of MODULUS - 1..could hardcode the result but it's a bit long - size_t num_limbs = 256; - std::vector expected_output(num_limbs); - // Extract each bit. - for (size_t i = 0; i < num_limbs; i++) { - auto byte_index = num_limbs - i - 1; - FF expected_limb = (FF::modulus - 1) >> i & 1; - expected_output[byte_index] = expected_limb; - } - EXPECT_EQ(returndata, expected_output); - - validate_trace(std::move(trace), public_inputs, { FF::modulus - FF(1) }, returndata); -} - -// Positive test with TO_RADIX_BE. -TEST_F(AvmExecutionTests, toRadixBeOpcodeBitsMode) +namespace { +std::vector gen_bytecode_radix(bool is_bit_mode) { + const std::string bit_mode_hex = is_bit_mode ? "01" : "00"; std::string bytecode_hex = to_hex(OpCode::SET_8) + // opcode SET "00" // Indirect flag "00" // dst_offset - + to_hex(AvmMemoryTag::U32) // - + "00" // val + + to_hex(AvmMemoryTag::U32) + // + "00" // val + to_hex(OpCode::SET_8) + // opcode SET "00" // Indirect flag "01" // dst_offset @@ -949,18 +885,28 @@ TEST_F(AvmExecutionTests, toRadixBeOpcodeBitsMode) "15" // dst_offset 21 + to_hex(AvmMemoryTag::U32) + // "05" // value 5 (i.e. where the dst will be written to) - + to_hex(OpCode::SET_8) + // opcode SET for indirect dst + + to_hex(OpCode::SET_8) + // opcode SET (direct radix_offset) "00" // Indirect flag "80" // radix_offset 80 + to_hex(AvmMemoryTag::U32) + // "02" // value 2 (i.e. radix 2 - perform bitwise decomposition) + + to_hex(OpCode::SET_16) + // opcode SET (direct number_limbs_offset) + "00" // Indirect flag + "0090" // number_limbs_offset 0x90 + + to_hex(AvmMemoryTag::U32) + // + "0100" // value 256 + + to_hex(OpCode::SET_8) + // opcode SET (direct output_bits_offset) + "00" // Indirect flag + "95" // output_bits_offset 0x95 + + to_hex(AvmMemoryTag::U1) + // + bit_mode_hex // bit 1 (true for bits mode) + to_hex(OpCode::TORADIXBE) + // opcode TO_RADIX_BE - "03" // Indirect flag + "0011" // Indirect flag "0011" // src_offset 17 (indirect) - "0015" // dst_offset 21 (indirect) "0080" // radix_offset 80 (direct) - "0100" // limbs: 256 - "01" // output_bits: true + "0090" // num_limbs_offset (direct) + "0095" // output_bits_offset (direct) + "0015" // dst_offset 21 (indirect) + to_hex(OpCode::SET_16) + // opcode SET (for return size) "00" // Indirect flag "0200" // dst_offset=512 @@ -971,7 +917,15 @@ TEST_F(AvmExecutionTests, toRadixBeOpcodeBitsMode) "0005" // ret offset 5 "0200"; // ret size offset 512 - auto bytecode = hex_to_bytes(bytecode_hex); + return hex_to_bytes(bytecode_hex); +} +} // namespace + +// Positive test for TORADIXBE opcode parametrized by a boolean toggling bit vs bytes mode. +TEST_P(AvmExecutionTestsToRadix, ParamTest) +{ + const bool is_bit_mode = GetParam(); + auto bytecode = gen_bytecode_radix(is_bit_mode); auto [instructions, error] = Deserialization::parse_bytecode_statically(bytecode); ASSERT_TRUE(is_ok(error)); @@ -996,6 +950,9 @@ TEST_F(AvmExecutionTests, toRadixBeOpcodeBitsMode) validate_trace(std::move(trace), public_inputs, { FF::modulus - FF(1) }, returndata); } +// Run the test for TORADIXBE in bit mode and then in bytes mode. +INSTANTIATE_TEST_SUITE_P(AvmExecutionTests, AvmExecutionTestsToRadix, testing::ValuesIn({ true, false })); + // // Positive test with SHA256COMPRESSION. TEST_F(AvmExecutionTests, sha256CompressionOpcode) { diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp index 5e2b759bba7..ea8830a353c 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/slice.test.cpp @@ -37,8 +37,10 @@ class AvmSliceTests : public ::testing::Test { .nested_returndata = {}, .last_pc = 0, .success_offset = 0, - .l2_gas = 0, - .da_gas = 0, + .start_l2_gas_left = 0, + .start_da_gas_left = 0, + .l2_gas_left = 0, + .da_gas_left = 0, .internal_return_ptr_stack = {} }); trace_builder.current_ext_call_ctx = ext_call_ctx; this->calldata = calldata; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/deserialization.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/deserialization.cpp index ba6a60397ae..2478ba93dd3 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/deserialization.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/deserialization.cpp @@ -179,12 +179,12 @@ const std::unordered_map> OPCODE_WIRE_FORMAT = { OperandType::INDIRECT8, OperandType::UINT16, OperandType::UINT16, OperandType::UINT16, OperandType::UINT16 } }, // Gadget - Conversion { OpCode::TORADIXBE, - { OperandType::INDIRECT8, + { OperandType::INDIRECT16, OperandType::UINT16, OperandType::UINT16, OperandType::UINT16, OperandType::UINT16, - OperandType::UINT8 } }, + OperandType::UINT16 } }, }; const std::unordered_map OPERAND_TYPE_SIZE = { diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/errors.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/errors.hpp index ca121ebefa2..081ee2fbc5e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/errors.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/errors.hpp @@ -20,6 +20,8 @@ enum class AvmError : uint32_t { RADIX_OUT_OF_BOUNDS, DUPLICATE_NULLIFIER, SIDE_EFFECT_LIMIT_REACHED, + OUT_OF_GAS, + STATIC_CALL_ALTERATION }; } // namespace bb::avm_trace diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp index 80a49dafcec..a2478a292ef 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/execution.cpp @@ -9,6 +9,7 @@ #include "barretenberg/vm/avm/generated/verifier.hpp" #include "barretenberg/vm/avm/trace/common.hpp" #include "barretenberg/vm/avm/trace/deserialization.hpp" +#include "barretenberg/vm/avm/trace/gadgets/merkle_tree.hpp" #include "barretenberg/vm/avm/trace/helper.hpp" #include "barretenberg/vm/avm/trace/instructions.hpp" #include "barretenberg/vm/avm/trace/kernel_trace.hpp" @@ -336,23 +337,33 @@ std::vector Execution::gen_trace(AvmPublicInputs const& public_inputs, if (phase == TxExecutionPhase::SETUP) { vinfo("Inserting non-revertible side effects from private before SETUP phase. Checkpointing trees."); // Temporary spot for private non-revertible insertion - std::vector siloed_nullifiers; - siloed_nullifiers.insert( - siloed_nullifiers.end(), - public_inputs.previous_non_revertible_accumulated_data.nullifiers.begin(), - public_inputs.previous_non_revertible_accumulated_data.nullifiers.begin() + - public_inputs.previous_non_revertible_accumulated_data_array_lengths.nullifiers); - trace_builder.insert_private_state(siloed_nullifiers, {}); + auto siloed_nullifiers = + std::vector(public_inputs.previous_non_revertible_accumulated_data.nullifiers.begin(), + public_inputs.previous_non_revertible_accumulated_data.nullifiers.begin() + + public_inputs.previous_non_revertible_accumulated_data_array_lengths.nullifiers); + + auto unique_note_hashes = + std::vector(public_inputs.previous_non_revertible_accumulated_data.note_hashes.begin(), + public_inputs.previous_non_revertible_accumulated_data.note_hashes.begin() + + public_inputs.previous_non_revertible_accumulated_data_array_lengths.note_hashes); + + trace_builder.insert_private_state(siloed_nullifiers, unique_note_hashes); + trace_builder.checkpoint_non_revertible_state(); } else if (phase == TxExecutionPhase::APP_LOGIC) { vinfo("Inserting revertible side effects from private before APP_LOGIC phase"); // Temporary spot for private revertible insertion - std::vector siloed_nullifiers; - siloed_nullifiers.insert(siloed_nullifiers.end(), - public_inputs.previous_revertible_accumulated_data.nullifiers.begin(), - public_inputs.previous_revertible_accumulated_data.nullifiers.begin() + - public_inputs.previous_revertible_accumulated_data_array_lengths.nullifiers); - trace_builder.insert_private_state(siloed_nullifiers, {}); + auto siloed_nullifiers = + std::vector(public_inputs.previous_revertible_accumulated_data.nullifiers.begin(), + public_inputs.previous_revertible_accumulated_data.nullifiers.begin() + + public_inputs.previous_revertible_accumulated_data_array_lengths.nullifiers); + + auto siloed_note_hashes = + std::vector(public_inputs.previous_revertible_accumulated_data.note_hashes.begin(), + public_inputs.previous_revertible_accumulated_data.note_hashes.begin() + + public_inputs.previous_revertible_accumulated_data_array_lengths.note_hashes); + + trace_builder.insert_private_revertible_state(siloed_nullifiers, siloed_note_hashes); } vinfo("Beginning execution of phase ", to_name(phase), " (", public_call_requests.size(), " enqueued calls)."); @@ -388,6 +399,8 @@ std::vector Execution::gen_trace(AvmPublicInputs const& public_inputs, trace_builder.pay_fee(); } + trace_builder.pad_trees(); + auto trace = trace_builder.finalize(apply_e2e_assertions); returndata = trace_builder.get_all_returndata(); @@ -415,6 +428,8 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, // These hints help us to set up first call ctx uint32_t clk = trace_builder.get_clk(); auto context_id = static_cast(clk); + uint32_t l2_gas_allocated_to_enqueued_call = trace_builder.get_l2_gas_left(); + uint32_t da_gas_allocated_to_enqueued_call = trace_builder.get_da_gas_left(); trace_builder.current_ext_call_ctx = AvmTraceBuilder::ExtCallCtx{ .context_id = context_id, .parent_id = 0, @@ -423,10 +438,13 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, .nested_returndata = {}, .last_pc = 0, .success_offset = 0, - .l2_gas = 0, - .da_gas = 0, + .start_l2_gas_left = l2_gas_allocated_to_enqueued_call, + .start_da_gas_left = da_gas_allocated_to_enqueued_call, + .l2_gas_left = l2_gas_allocated_to_enqueued_call, + .da_gas_left = da_gas_allocated_to_enqueued_call, .internal_return_ptr_stack = {}, }; + trace_builder.allocate_gas_for_call(l2_gas_allocated_to_enqueued_call, da_gas_allocated_to_enqueued_call); // Find the bytecode based on contract address of the public call request std::vector bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, check_bytecode_membership); @@ -438,11 +456,13 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, std::stack debug_counter_stack; uint32_t counter = 0; trace_builder.set_call_ptr(context_id); - while (is_ok(error) && (pc = trace_builder.get_pc()) < bytecode.size()) { + while ((pc = trace_builder.get_pc()) < bytecode.size()) { auto [inst, parse_error] = Deserialization::parse(bytecode, pc); - error = parse_error; + // FIXME: properly handle case when an instruction fails parsing + // especially first instruction in bytecode if (!is_ok(error)) { + error = parse_error; break; } @@ -835,9 +855,10 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, std::get(inst.operands.at(3)), std::get(inst.operands.at(4)), std::get(inst.operands.at(5))); + // TODO: what if an error is encountered on return or call which have already modified stack? // We hack it in here the logic to change contract address that we are processing bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, - check_bytecode_membership); + /*check_membership=*/false); debug_counter_stack.push(counter); counter = 0; break; @@ -851,7 +872,7 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, std::get(inst.operands.at(5))); // We hack it in here the logic to change contract address that we are processing bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, - check_bytecode_membership); + /*check_membership=*/false); debug_counter_stack.push(counter); counter = 0; break; @@ -860,17 +881,18 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, auto ret = trace_builder.op_return(std::get(inst.operands.at(0)), std::get(inst.operands.at(1)), std::get(inst.operands.at(2))); - // We hack it in here the logic to change contract address that we are processing + // did the return opcode hit an exceptional halt? + error = ret.error; if (ret.is_top_level) { - error = ret.error; returndata.insert(returndata.end(), ret.return_data.begin(), ret.return_data.end()); - - } else { + } else if (is_ok(error)) { + // switch back to caller's bytecode bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, - check_bytecode_membership); + /*check_membership=*/false); counter = debug_counter_stack.top(); debug_counter_stack.pop(); } + // on error/exceptional-halt, jumping back to parent code is handled at bottom of execution loop break; } case OpCode::REVERT_8: { @@ -878,17 +900,19 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, auto ret = trace_builder.op_revert(std::get(inst.operands.at(0)), std::get(inst.operands.at(1)), std::get(inst.operands.at(2))); + // error is only set here if the revert opcode hit an exceptional halt + // revert itself does not trigger "error" + error = ret.error; if (ret.is_top_level) { - error = ret.error; returndata.insert(returndata.end(), ret.return_data.begin(), ret.return_data.end()); - } else { - // change to the current ext call ctx + } else if (is_ok(error)) { + // switch back to caller's bytecode bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, - check_bytecode_membership); + /*check_membership=*/false); counter = debug_counter_stack.top(); debug_counter_stack.pop(); } - + // on error/exceptional-halt, jumping back to parent code is handled at bottom of execution loop break; } case OpCode::REVERT_16: { @@ -896,17 +920,19 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, auto ret = trace_builder.op_revert(std::get(inst.operands.at(0)), std::get(inst.operands.at(1)), std::get(inst.operands.at(2))); + // error is only set here if the revert opcode hit an exceptional halt + // revert itself does not trigger "error" + error = ret.error; if (ret.is_top_level) { - error = ret.error; returndata.insert(returndata.end(), ret.return_data.begin(), ret.return_data.end()); - } else { - // change to the current ext call ctx + } else if (is_ok(error)) { + // switch back to caller's bytecode bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, - check_bytecode_membership); + /*check_membership=*/false); counter = debug_counter_stack.top(); debug_counter_stack.pop(); } - + // on error/exceptional-halt, jumping back to parent code is handled at bottom of execution loop break; } @@ -961,12 +987,12 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, // Conversions case OpCode::TORADIXBE: - error = trace_builder.op_to_radix_be(std::get(inst.operands.at(0)), + error = trace_builder.op_to_radix_be(std::get(inst.operands.at(0)), std::get(inst.operands.at(1)), std::get(inst.operands.at(2)), std::get(inst.operands.at(3)), std::get(inst.operands.at(4)), - std::get(inst.operands.at(5))); + std::get(inst.operands.at(5))); break; default: @@ -974,18 +1000,36 @@ AvmError Execution::execute_enqueued_call(AvmTraceBuilder& trace_builder, "."); break; } - } - if (!is_ok(error)) { - auto const error_ic = counter - 1; // Need adjustement as counter increment occurs in loop body - std::string reason_prefix = exceptionally_halted(error) ? "exceptional halt" : "REVERT opcode"; - info("AVM enqueued call halted due to ", - reason_prefix, - ". Error: ", - to_name(error), - " at PC: ", - pc, - " IC: ", - error_ic); + + if (!is_ok(error)) { + const bool is_top_level = trace_builder.current_ext_call_ctx.context_id == 0; + + auto const error_ic = counter - 1; // Need adjustement as counter increment occurs in loop body + std::string call_type = is_top_level ? "enqueued" : "nested"; + info("AVM ", + call_type, + " call exceptionally halted. Error: ", + to_name(error), + " at PC: ", + pc, + " IC: ", + error_ic); + + trace_builder.handle_exceptional_halt(); + + if (is_top_level) { + break; + } + // otherwise, handle exceptional halt and proceed with execution in caller/parent + // We hack it in here the logic to change contract address that we are processing + bytecode = trace_builder.get_bytecode(trace_builder.current_ext_call_ctx.contract_address, + /*check_membership=*/false); + counter = debug_counter_stack.top(); + debug_counter_stack.pop(); + + // reset error as we've now returned to caller + error = AvmError::NO_ERROR; + } } return error; } diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.cpp index 87e46bf7128..366d403e54e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.cpp @@ -34,6 +34,16 @@ FF AvmMerkleTreeTraceBuilder::unconstrained_silo_note_hash(FF contract_address, return Poseidon2::hash({ GENERATOR_INDEX__SILOED_NOTE_HASH, contract_address, note_hash }); } +FF AvmMerkleTreeTraceBuilder::unconstrained_compute_note_hash_nonce(FF tx_hash, FF note_index_in_tx) +{ + return Poseidon2::hash({ GENERATOR_INDEX__NOTE_HASH_NONCE, tx_hash, note_index_in_tx }); +} + +FF AvmMerkleTreeTraceBuilder::unconstrained_compute_unique_note_hash(FF nonce, FF siloed_note_hash) +{ + return Poseidon2::hash({ GENERATOR_INDEX__UNIQUE_NOTE_HASH, nonce, siloed_note_hash }); +} + FF AvmMerkleTreeTraceBuilder::unconstrained_silo_nullifier(FF contract_address, FF nullifier) { return Poseidon2::hash({ GENERATOR_INDEX__OUTER_NULLIFIER, contract_address, nullifier }); @@ -78,6 +88,31 @@ FF AvmMerkleTreeTraceBuilder::unconstrained_update_leaf_index(const FF& leaf_val return unconstrained_compute_root_from_path(leaf_value, leaf_index, path); } +bool AvmMerkleTreeTraceBuilder::assert_public_data_non_membership_check( + const PublicDataTreeLeafPreimage& low_leaf_preimage, const FF& leaf_slot) +{ + auto low_leaf_slot = uint256_t(low_leaf_preimage.slot); + auto low_leaf_next_index = uint256_t(low_leaf_preimage.next_index); + auto low_leaf_next_slot = uint256_t(low_leaf_preimage.next_slot); + + auto leaf_slot_value = uint256_t(leaf_slot); + + return low_leaf_slot < leaf_slot_value && (low_leaf_next_index == 0 || low_leaf_next_slot > leaf_slot_value); +} + +bool AvmMerkleTreeTraceBuilder::assert_nullifier_non_membership_check(const NullifierLeafPreimage& low_leaf_preimage, + const FF& siloed_nullifier) +{ + auto low_leaf_nullifier = uint256_t(low_leaf_preimage.nullifier); + auto low_leaf_next_index = uint256_t(low_leaf_preimage.next_index); + auto low_leaf_next_nullifier = uint256_t(low_leaf_preimage.next_nullifier); + + auto siloed_leaf_nullifier = uint256_t(siloed_nullifier); + + return low_leaf_nullifier < siloed_leaf_nullifier && + (low_leaf_next_index == 0 || low_leaf_next_nullifier > siloed_leaf_nullifier); +} + /************************************************************************************************** * STORAGE TREE OPERATIONS **************************************************************************************************/ @@ -111,8 +146,14 @@ FF AvmMerkleTreeTraceBuilder::perform_storage_write([[maybe_unused]] uint32_t cl // Update the low leaf tree_snapshots.public_data_tree.root = unconstrained_update_leaf_index(low_preimage_hash, static_cast(low_index), low_path); + // Update the set of writes to unique slots + public_data_unique_writes.insert(slot); return tree_snapshots.public_data_tree.root; } + // Check the low leaf conditions (i.e. the slot is sandwiched by the low nullifier, or the new slot is a max + // value) + bool low_leaf_conditions = assert_public_data_non_membership_check(low_preimage, slot); + ASSERT(low_leaf_conditions); // The new leaf for an insertion is PublicDataTreeLeafPreimage new_preimage{ .slot = slot, .value = value, .next_index = low_preimage.next_index, .next_slot = low_preimage.next_slot @@ -133,6 +174,8 @@ FF AvmMerkleTreeTraceBuilder::perform_storage_write([[maybe_unused]] uint32_t cl // Insert the new leaf into the tree tree_snapshots.public_data_tree.root = unconstrained_update_leaf_index(leaf_preimage_hash, index, insertion_path); tree_snapshots.public_data_tree.size++; + // Update the set of writes to unique slots + public_data_unique_writes.insert(slot); return tree_snapshots.public_data_tree.root; } @@ -165,6 +208,10 @@ FF AvmMerkleTreeTraceBuilder::perform_nullifier_append([[maybe_unused]] uint32_t ASSERT(is_member); return tree_snapshots.nullifier_tree.root; } + // Check the low leaf conditions (i.e. the slot is sandwiched by the low nullifier, or the new slot is a max + // value) + bool low_leaf_conditions = assert_nullifier_non_membership_check(low_preimage, nullifier); + ASSERT(low_leaf_conditions); // Check membership of the low leaf bool low_leaf_member = unconstrained_check_membership( low_preimage_hash, static_cast(low_index), low_path, tree_snapshots.nullifier_tree.root); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.hpp index 7b67db89313..0a77411bdc9 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/merkle_tree.hpp @@ -6,6 +6,7 @@ #include "barretenberg/vm/avm/trace/gadgets/poseidon2.hpp" #include "barretenberg/vm/avm/trace/public_inputs.hpp" +#include #include namespace bb::avm_trace { @@ -42,6 +43,12 @@ class AvmMerkleTreeTraceBuilder { FF compute_public_tree_leaf_slot(uint32_t clk, FF contract_address, FF leaf_index); TreeSnapshots& get_tree_snapshots() { return tree_snapshots; } + void restore_tree_state(TreeSnapshots& tree_snapshots, std::unordered_set& public_data_unique_writes) + { + this->tree_snapshots = tree_snapshots; + this->public_data_unique_writes = public_data_unique_writes; + } + std::unordered_set get_public_data_unique_writes() { return public_data_unique_writes; } // Public Data Tree bool perform_storage_read(uint32_t clk, @@ -69,6 +76,7 @@ class AvmMerkleTreeTraceBuilder { const std::vector& low_path, const FF& nullifier, const std::vector& insertion_path); + void set_nullifier_tree_size(uint32_t size) { tree_snapshots.nullifier_tree.size = size; } // Note Hash Tree bool perform_note_hash_read(uint32_t clk, @@ -77,6 +85,7 @@ class AvmMerkleTreeTraceBuilder { const std::vector& path) const; FF perform_note_hash_append(uint32_t clk, const FF& note_hash, const std::vector& insertion_path); + void set_note_hash_tree_size(uint32_t size) { tree_snapshots.note_hash_tree.size = size; } // L1 to L2 Message Tree bool perform_l1_to_l2_message_read(uint32_t clk, @@ -99,8 +108,15 @@ class AvmMerkleTreeTraceBuilder { static FF unconstrained_hash_public_data_preimage(const PublicDataTreeLeafPreimage& preimage); static FF unconstrained_silo_note_hash(FF contract_address, FF note_hash); + static FF unconstrained_compute_note_hash_nonce(FF tx_hash, FF note_index_in_tx); + static FF unconstrained_compute_unique_note_hash(FF nonce, FF siloed_note_hash); static FF unconstrained_silo_nullifier(FF contract_address, FF nullifier); static FF unconstrained_compute_public_tree_leaf_slot(FF contract_address, FF leaf_index); + // Could probably template these + static bool assert_public_data_non_membership_check(const PublicDataTreeLeafPreimage& low_leaf_preimage, + const FF& leaf_slot); + static bool assert_nullifier_non_membership_check(const NullifierLeafPreimage& low_leaf_preimage, + const FF& nullifier); void finalize(std::vector>& main_trace); @@ -111,6 +127,7 @@ class AvmMerkleTreeTraceBuilder { std::vector merkle_check_trace; TreeSnapshots non_revertible_tree_snapshots; TreeSnapshots tree_snapshots; + std::unordered_set public_data_unique_writes; MerkleEntry compute_root_from_path(uint32_t clk, const FF& leaf_value, const uint64_t leaf_index, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.cpp index fc52f9f00bd..3bc5b3a6754 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.cpp @@ -24,6 +24,15 @@ void AvmGasTraceBuilder::set_initial_gas(uint32_t l2_gas, uint32_t da_gas) remaining_da_gas = da_gas; } +void AvmGasTraceBuilder::allocate_gas_for_call(uint32_t l2_gas, uint32_t da_gas) +{ + // Remaining gas will be mutated on each opcode + remaining_l2_gas = l2_gas; + remaining_da_gas = da_gas; + // set flag so that the next row will be properly tagged as the first in a nested call + next_row_is_first_in_nested_call = true; +} + uint32_t AvmGasTraceBuilder::get_l2_gas_left() const { if (gas_trace.empty()) { @@ -54,7 +63,7 @@ std::tuple AvmGasTraceBuilder::unconstrained_compute_gas(OpC base_da_gas_cost + dyn_gas_multiplier * dyn_da_gas_cost }; } -void AvmGasTraceBuilder::constrain_gas( +bool AvmGasTraceBuilder::constrain_gas( uint32_t clk, OpCode opcode, uint32_t dyn_gas_multiplier, uint32_t nested_l2_gas_cost, uint32_t nested_da_gas_cost) { uint32_t effective_nested_l2_gas_cost = 0; @@ -65,8 +74,6 @@ void AvmGasTraceBuilder::constrain_gas( effective_nested_da_gas_cost = nested_da_gas_cost; } - gas_opcode_lookup_counter[opcode]++; - // Get the gas prices for this opcode const auto& GAS_COST_TABLE = FixedGasTable::get(); const auto& gas_info = GAS_COST_TABLE.at(opcode); @@ -76,8 +83,17 @@ void AvmGasTraceBuilder::constrain_gas( auto dyn_da_gas_cost = static_cast(gas_info.dyn_da_gas_fixed_table); // Decrease the gas left - remaining_l2_gas -= (base_l2_gas_cost + dyn_gas_multiplier * dyn_l2_gas_cost) + effective_nested_l2_gas_cost; - remaining_da_gas -= (base_da_gas_cost + dyn_gas_multiplier * dyn_da_gas_cost) + effective_nested_da_gas_cost; + bool out_of_gas = false; + const auto l2_cost = (base_l2_gas_cost + dyn_gas_multiplier * dyn_l2_gas_cost) + effective_nested_l2_gas_cost; + const auto da_cost = (base_da_gas_cost + dyn_gas_multiplier * dyn_da_gas_cost) + effective_nested_da_gas_cost; + if (l2_cost > remaining_l2_gas) { + remaining_l2_gas = 0; + remaining_da_gas = 0; + out_of_gas = true; + } else { + remaining_l2_gas -= l2_cost; + remaining_da_gas -= da_cost; + } // Create a gas trace entry gas_trace.push_back({ @@ -90,7 +106,72 @@ void AvmGasTraceBuilder::constrain_gas( .dyn_gas_multiplier = dyn_gas_multiplier, .remaining_l2_gas = remaining_l2_gas, .remaining_da_gas = remaining_da_gas, + .is_halt_or_first_row_in_nested_call = next_row_is_first_in_nested_call, }); + + if (next_row_is_first_in_nested_call) { + next_row_is_first_in_nested_call = false; + } else { + gas_opcode_lookup_counter[opcode]++; + } + + return out_of_gas; +} + +void AvmGasTraceBuilder::constrain_gas_for_halt(bool exceptional_halt, + uint32_t parent_l2_gas_left, + uint32_t parent_da_gas_left, + uint32_t l2_gas_allocated_to_nested_call, + uint32_t da_gas_allocated_to_nested_call) +{ + debug("Resetting to parent's L2 gas left (", parent_l2_gas_left, ") before consuming gas allocated to nested call"); + debug("Resetting to parent's DA gas left (", parent_da_gas_left, ") before consuming gas allocated to nested call"); + // how much gas did the nested call consume + auto l2_gas_consumed = l2_gas_allocated_to_nested_call - remaining_l2_gas; + auto da_gas_consumed = da_gas_allocated_to_nested_call - remaining_da_gas; + if (exceptional_halt) { + // on error (exceptional halt), consume all gas allocated to nested call + l2_gas_consumed = l2_gas_allocated_to_nested_call; + da_gas_consumed = da_gas_allocated_to_nested_call; + debug("Consuming L2 gas used by nested call: ", l2_gas_consumed); + debug("Consuming DA gas used by nested call: ", da_gas_consumed); + } else { + debug("Consuming all L2 gas allocated to nested call: ", l2_gas_allocated_to_nested_call); + debug("Consuming all DA gas allocated to nested call: ", da_gas_allocated_to_nested_call); + } + + // We reload to the parent's l2 gas left minus however much gas consumed by the nested call + remaining_l2_gas = parent_l2_gas_left - l2_gas_consumed; + remaining_da_gas = parent_da_gas_left - da_gas_consumed; + debug("L2 gas remaining after nested call: ", remaining_l2_gas); + debug("DA gas remaining after nested call: ", remaining_da_gas); + + // modify the last row of the gas trace to return to the parent's latest gas + // with the nested call's gas consumption applied + auto& halting_entry = gas_trace.back(); + halting_entry.remaining_l2_gas = remaining_l2_gas; + halting_entry.remaining_da_gas = remaining_da_gas; + halting_entry.is_halt_or_first_row_in_nested_call = true; + + gas_opcode_lookup_counter[halting_entry.opcode]--; +} + +void AvmGasTraceBuilder::constrain_gas_for_top_level_exceptional_halt(uint32_t l2_gas_allocated, + uint32_t da_gas_allocated) +{ + debug("Consuming all L2 gas allocated to top-level call: ", l2_gas_allocated); + debug("Consuming all DA gas allocated to top-level call: ", da_gas_allocated); + + remaining_l2_gas = 0; + remaining_da_gas = 0; + + // modify the last row of the gas trace to consume all remaining gas + auto& halting_entry = gas_trace.back(); + halting_entry.remaining_l2_gas = remaining_l2_gas; + halting_entry.remaining_da_gas = remaining_da_gas; + halting_entry.is_halt_or_first_row_in_nested_call = true; + + gas_opcode_lookup_counter[halting_entry.opcode]--; } void AvmGasTraceBuilder::finalize(std::vector>& main_trace) @@ -131,52 +212,64 @@ void AvmGasTraceBuilder::finalize(std::vector>& main_trace) main_trace.at(current_clk).main_da_gas_remaining = current_da_gas_remaining; main_trace.at(current_clk - 1).main_is_fake_row = 1; } else { - const auto& gas_entry = *gas_it; auto& dest = main_trace.at(gas_entry.clk - 1); auto& next = main_trace.at(gas_entry.clk); - // Temporary. Will be removed once "fake" rows are purged. - dest.main_is_gas_accounted = 1; - - // Write each of the relevant gas accounting values - dest.main_opcode_val = static_cast(gas_entry.opcode); - dest.main_base_l2_gas_op_cost = gas_entry.base_l2_gas_cost; - dest.main_base_da_gas_op_cost = gas_entry.base_da_gas_cost; - dest.main_dyn_l2_gas_op_cost = gas_entry.dyn_l2_gas_cost; - dest.main_dyn_da_gas_op_cost = gas_entry.dyn_da_gas_cost; - dest.main_dyn_gas_multiplier = gas_entry.dyn_gas_multiplier; - - // If gas remaining is increasing, it means we underflowed in uint32_t - bool l2_out_of_gas = current_l2_gas_remaining < gas_entry.remaining_l2_gas; - bool da_out_of_gas = current_da_gas_remaining < gas_entry.remaining_da_gas; - - uint32_t abs_l2_gas_remaining = l2_out_of_gas ? -gas_entry.remaining_l2_gas : gas_entry.remaining_l2_gas; - uint32_t abs_da_gas_remaining = da_out_of_gas ? -gas_entry.remaining_da_gas : gas_entry.remaining_da_gas; - - dest.main_abs_l2_rem_gas = abs_l2_gas_remaining; - dest.main_l2_gas_u16_r0 = static_cast(abs_l2_gas_remaining); - rem_gas_rng_check_counts.at(0)[static_cast(abs_l2_gas_remaining)]++; - - dest.main_l2_gas_u16_r1 = static_cast(abs_l2_gas_remaining >> 16); - rem_gas_rng_check_counts.at(1)[static_cast(abs_l2_gas_remaining >> 16)]++; - - dest.main_abs_da_rem_gas = abs_da_gas_remaining; - dest.main_da_gas_u16_r0 = static_cast(abs_da_gas_remaining); - rem_gas_rng_check_counts.at(2)[static_cast(abs_da_gas_remaining)]++; - dest.main_da_gas_u16_r1 = static_cast(abs_da_gas_remaining >> 16); - rem_gas_rng_check_counts.at(3)[static_cast(abs_da_gas_remaining >> 16)]++; - - dest.main_l2_out_of_gas = static_cast(l2_out_of_gas); - dest.main_da_out_of_gas = static_cast(da_out_of_gas); - - current_l2_gas_remaining = gas_entry.remaining_l2_gas; - current_da_gas_remaining = gas_entry.remaining_da_gas; - next.main_l2_gas_remaining = - l2_out_of_gas ? FF::modulus - uint256_t(abs_l2_gas_remaining) : current_l2_gas_remaining; - next.main_da_gas_remaining = - da_out_of_gas ? FF::modulus - uint256_t(abs_da_gas_remaining) : current_da_gas_remaining; - + if (gas_entry.is_halt_or_first_row_in_nested_call) { + dest.main_is_fake_row = 1; + next.main_l2_gas_remaining = gas_entry.remaining_l2_gas; + next.main_da_gas_remaining = gas_entry.remaining_da_gas; + current_l2_gas_remaining = gas_entry.remaining_l2_gas; + current_da_gas_remaining = gas_entry.remaining_da_gas; + dest.main_opcode_val = static_cast(gas_entry.opcode); + dest.main_base_l2_gas_op_cost = gas_entry.base_l2_gas_cost; + dest.main_base_da_gas_op_cost = gas_entry.base_da_gas_cost; + dest.main_dyn_l2_gas_op_cost = gas_entry.dyn_l2_gas_cost; + dest.main_dyn_da_gas_op_cost = gas_entry.dyn_da_gas_cost; + } else { + dest.main_is_gas_accounted = 1; + + // Write each of the relevant gas accounting values + dest.main_opcode_val = static_cast(gas_entry.opcode); + dest.main_base_l2_gas_op_cost = gas_entry.base_l2_gas_cost; + dest.main_base_da_gas_op_cost = gas_entry.base_da_gas_cost; + dest.main_dyn_l2_gas_op_cost = gas_entry.dyn_l2_gas_cost; + dest.main_dyn_da_gas_op_cost = gas_entry.dyn_da_gas_cost; + dest.main_dyn_gas_multiplier = gas_entry.dyn_gas_multiplier; + + // If gas remaining is increasing, it means we underflowed in uint32_t + bool l2_out_of_gas = current_l2_gas_remaining < gas_entry.remaining_l2_gas; + bool da_out_of_gas = current_da_gas_remaining < gas_entry.remaining_da_gas; + + uint32_t abs_l2_gas_remaining = + l2_out_of_gas ? -gas_entry.remaining_l2_gas : gas_entry.remaining_l2_gas; + uint32_t abs_da_gas_remaining = + da_out_of_gas ? -gas_entry.remaining_da_gas : gas_entry.remaining_da_gas; + + dest.main_abs_l2_rem_gas = abs_l2_gas_remaining; + dest.main_l2_gas_u16_r0 = static_cast(abs_l2_gas_remaining); + rem_gas_rng_check_counts.at(0)[static_cast(abs_l2_gas_remaining)]++; + + dest.main_l2_gas_u16_r1 = static_cast(abs_l2_gas_remaining >> 16); + rem_gas_rng_check_counts.at(1)[static_cast(abs_l2_gas_remaining >> 16)]++; + + dest.main_abs_da_rem_gas = abs_da_gas_remaining; + dest.main_da_gas_u16_r0 = static_cast(abs_da_gas_remaining); + rem_gas_rng_check_counts.at(2)[static_cast(abs_da_gas_remaining)]++; + dest.main_da_gas_u16_r1 = static_cast(abs_da_gas_remaining >> 16); + rem_gas_rng_check_counts.at(3)[static_cast(abs_da_gas_remaining >> 16)]++; + + dest.main_l2_out_of_gas = static_cast(l2_out_of_gas); + dest.main_da_out_of_gas = static_cast(da_out_of_gas); + + current_l2_gas_remaining = gas_entry.remaining_l2_gas; + current_da_gas_remaining = gas_entry.remaining_da_gas; + next.main_l2_gas_remaining = + l2_out_of_gas ? FF::modulus - uint256_t(abs_l2_gas_remaining) : current_l2_gas_remaining; + next.main_da_gas_remaining = + da_out_of_gas ? FF::modulus - uint256_t(abs_da_gas_remaining) : current_da_gas_remaining; + } gas_it++; } } diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.hpp index abf3ee586a6..6fdc47d4e7c 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gas_trace.hpp @@ -21,6 +21,7 @@ class AvmGasTraceBuilder { uint32_t dyn_gas_multiplier = 0; uint32_t remaining_l2_gas = 0; uint32_t remaining_da_gas = 0; + bool is_halt_or_first_row_in_nested_call = false; }; AvmGasTraceBuilder() = default; @@ -33,12 +34,19 @@ class AvmGasTraceBuilder { void finalize_lookups(std::vector>& trace); static std::tuple unconstrained_compute_gas(OpCode opcode, uint32_t dyn_gas_multiplier); - void constrain_gas(uint32_t clk, + bool constrain_gas(uint32_t clk, OpCode opcode, uint32_t dyn_gas_multiplier = 0, uint32_t nested_l2_gas_cost = 0, uint32_t nested_da_gas_cost = 0); + void constrain_gas_for_halt(bool exceptional_halt, + uint32_t parent_l2_gas_left, + uint32_t parent_da_gas_left, + uint32_t l2_gas_allocated_to_nested_call, + uint32_t da_gas_allocated_to_nested_call); + void constrain_gas_for_top_level_exceptional_halt(uint32_t l2_gas_allocated, uint32_t da_gas_allocated); void set_initial_gas(uint32_t l2_gas, uint32_t da_gas); + void allocate_gas_for_call(uint32_t l2_gas, uint32_t da_gas); uint32_t get_l2_gas_left() const; uint32_t get_da_gas_left() const; @@ -55,6 +63,7 @@ class AvmGasTraceBuilder { uint32_t initial_da_gas = 0; uint32_t remaining_l2_gas = 0; uint32_t remaining_da_gas = 0; + bool next_row_is_first_in_nested_call = false; }; } // namespace bb::avm_trace diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp index 28a540f69aa..1028bad79fc 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/helper.cpp @@ -133,6 +133,8 @@ std::string to_name(AvmError error) return "DUPLICATE NULLIFIER"; case AvmError::SIDE_EFFECT_LIMIT_REACHED: return "SIDE EFFECT LIMIT REACHED"; + case AvmError::OUT_OF_GAS: + return "OUT OF GAS"; default: throw std::runtime_error("Invalid error type"); break; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/public_inputs.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/public_inputs.hpp index e7b0f4d1ffe..0f41c44fc99 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/public_inputs.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/public_inputs.hpp @@ -38,6 +38,7 @@ struct GasSettings { Gas gas_limits; Gas teardown_gas_limits; GasFees max_fees_per_gas; + GasFees max_priority_fees_per_gas; }; inline void read(uint8_t const*& it, GasSettings& gas_settings) @@ -46,6 +47,7 @@ inline void read(uint8_t const*& it, GasSettings& gas_settings) read(it, gas_settings.gas_limits); read(it, gas_settings.teardown_gas_limits); read(it, gas_settings.max_fees_per_gas); + read(it, gas_settings.max_priority_fees_per_gas); } struct GlobalVariables { diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp index 94c223f38d5..8002787ebcd 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.cpp @@ -100,7 +100,9 @@ uint32_t finalize_rng_chks_for_testing(std::vector& main_trace, auto old_size = main_trace.size(); for (auto const& clk : custom_clk) { if (clk >= old_size) { - main_trace.push_back(Row{ .main_clk = FF(clk) }); + Row row{}; + row.main_clk = clk; + main_trace.push_back(row); } } @@ -132,7 +134,7 @@ bool check_tag_integral(AvmMemoryTag tag) } } -bool isCanonical(FF contract_address) +bool is_canonical(FF contract_address) { // TODO: constrain this! return contract_address == CANONICAL_AUTH_REGISTRY_ADDRESS || contract_address == DEPLOYER_CONTRACT_ADDRESS || @@ -166,7 +168,7 @@ std::vector AvmTraceBuilder::get_bytecode(const FF contract_address, bo }); bool exists = true; - if (check_membership && !isCanonical(contract_address)) { + if (check_membership && !is_canonical(contract_address)) { if (bytecode_membership_cache.find(contract_address) != bytecode_membership_cache.end()) { // If we have already seen the contract address, we can skip the membership check and used the cached // membership proof @@ -213,8 +215,27 @@ std::vector AvmTraceBuilder::get_bytecode(const FF contract_address, bo throw std::runtime_error("Bytecode not found"); } +uint32_t AvmTraceBuilder::get_inserted_note_hashes_count() +{ + return merkle_tree_trace_builder.get_tree_snapshots().note_hash_tree.size - + public_inputs.start_tree_snapshots.note_hash_tree.size; +} + +uint32_t AvmTraceBuilder::get_inserted_nullifiers_count() +{ + return merkle_tree_trace_builder.get_tree_snapshots().nullifier_tree.size - + public_inputs.start_tree_snapshots.nullifier_tree.size; +} + +// Keeping track of the public data writes isn't as simple as comparing sizes +// because of updates to leaves that were already in the tree and state squashing +uint32_t AvmTraceBuilder::get_public_data_writes_count() +{ + return static_cast(merkle_tree_trace_builder.get_public_data_unique_writes().size()); +} + void AvmTraceBuilder::insert_private_state(const std::vector& siloed_nullifiers, - [[maybe_unused]] const std::vector& siloed_note_hashes) + const std::vector& unique_note_hashes) { for (const auto& siloed_nullifier : siloed_nullifiers) { auto hint = execution_hints.nullifier_write_hints[nullifier_write_counter++]; @@ -225,14 +246,44 @@ void AvmTraceBuilder::insert_private_state(const std::vector& siloed_nullifi siloed_nullifier, hint.insertion_path); } + + for (const auto& unique_note_hash : unique_note_hashes) { + auto hint = execution_hints.note_hash_write_hints[note_hash_write_counter++]; + merkle_tree_trace_builder.perform_note_hash_append(0, unique_note_hash, hint.sibling_path); + } +} + +void AvmTraceBuilder::insert_private_revertible_state(const std::vector& siloed_nullifiers, + const std::vector& siloed_note_hashes) +{ + // Revertibles come only siloed from private, so we need to make them unique here + std::vector unique_note_hashes; + unique_note_hashes.reserve(siloed_note_hashes.size()); + + for (size_t i = 0; i < siloed_note_hashes.size(); i++) { + size_t note_index_in_tx = i + get_inserted_note_hashes_count(); + FF nonce = AvmMerkleTreeTraceBuilder::unconstrained_compute_note_hash_nonce(get_tx_hash(), note_index_in_tx); + unique_note_hashes.push_back( + AvmMerkleTreeTraceBuilder::unconstrained_compute_unique_note_hash(nonce, siloed_note_hashes.at(i))); + } + + insert_private_state(siloed_nullifiers, unique_note_hashes); } void AvmTraceBuilder::pay_fee() { auto clk = static_cast(main_trace.size()) + 1; - auto tx_fee = (public_inputs.global_variables.gas_fees.fee_per_da_gas * public_inputs.end_gas_used.da_gas) + - (public_inputs.global_variables.gas_fees.fee_per_l2_gas * public_inputs.end_gas_used.l2_gas); + auto gas_settings = public_inputs.gas_settings; + auto gas_fees = public_inputs.global_variables.gas_fees; + auto priority_fee_per_da_gas = std::min(gas_settings.max_priority_fees_per_gas.fee_per_da_gas, + gas_settings.max_fees_per_gas.fee_per_da_gas - gas_fees.fee_per_da_gas); + auto priority_fee_per_l2_gas = std::min(gas_settings.max_priority_fees_per_gas.fee_per_l2_gas, + gas_settings.max_fees_per_gas.fee_per_l2_gas - gas_fees.fee_per_l2_gas); + auto total_fee_per_da_gas = gas_fees.fee_per_da_gas + priority_fee_per_da_gas; + auto total_fee_per_l2_gas = gas_fees.fee_per_l2_gas + priority_fee_per_l2_gas; + auto tx_fee = (total_fee_per_da_gas * public_inputs.end_gas_used.da_gas) + + (total_fee_per_l2_gas * public_inputs.end_gas_used.l2_gas); if (public_inputs.fee_payer == 0) { vinfo("No one is paying the fee of ", tx_fee); @@ -269,6 +320,7 @@ void AvmTraceBuilder::pay_fee() throw std::runtime_error("Not enough balance for fee payer to pay for transaction"); } + // TS equivalent: // writeStorage(FEE_JUICE_ADDRESS, balance_slot, updated_balance); PublicDataWriteTreeHint write_hint = execution_hints.storage_write_hints.at(storage_write_counter++); ASSERT(write_hint.new_leaf_preimage.value == updated_balance); @@ -284,6 +336,72 @@ void AvmTraceBuilder::pay_fee() side_effect_counter++; } +void AvmTraceBuilder::pad_trees() +{ + auto current_tree_snapshots = merkle_tree_trace_builder.get_tree_snapshots(); + + auto initial_note_hash_snapshot = public_inputs.start_tree_snapshots.note_hash_tree; + // sanity check + uint32_t padded_note_hash_size = initial_note_hash_snapshot.size + MAX_NOTE_HASHES_PER_TX; + ASSERT(current_tree_snapshots.note_hash_tree.size <= padded_note_hash_size); + merkle_tree_trace_builder.set_note_hash_tree_size(padded_note_hash_size); + + auto initial_nullifier_snapshot = public_inputs.start_tree_snapshots.nullifier_tree; + // sanity check + uint32_t padded_nullifier_size = initial_nullifier_snapshot.size + MAX_NULLIFIERS_PER_TX; + ASSERT(current_tree_snapshots.nullifier_tree.size <= padded_nullifier_size); + merkle_tree_trace_builder.set_nullifier_tree_size(padded_nullifier_size); +} + +void AvmTraceBuilder::allocate_gas_for_call(uint32_t l2_gas, uint32_t da_gas) +{ + gas_trace_builder.allocate_gas_for_call(l2_gas, da_gas); +} + +void AvmTraceBuilder::handle_exceptional_halt() +{ + const bool is_top_level = current_ext_call_ctx.context_id == 0; + if (is_top_level) { + vinfo("Handling exceptional halt in top-level call. Consuming all allocated gas:"); + // Consume all remaining gas. + gas_trace_builder.constrain_gas_for_top_level_exceptional_halt(current_ext_call_ctx.start_l2_gas_left, + current_ext_call_ctx.start_da_gas_left); + + // max out the pc to signify "done" + pc = UINT32_MAX; + } else { + vinfo("Handling exceptional halt in nested call"); + // before the nested call was made, how much gas does the parent have? + const auto l2_gas_allocated_to_nested_call = current_ext_call_ctx.start_l2_gas_left; + const auto da_gas_allocated_to_nested_call = current_ext_call_ctx.start_da_gas_left; + + // Pop the caller/parent's context from the stack to proceed with execution there + current_ext_call_ctx = external_call_ctx_stack.top(); + external_call_ctx_stack.pop(); + + // Grab the saved-off gas remaining in the parent from before the nested call + // now that we have popped its context from the stack. + auto parent_l2_gas_left = current_ext_call_ctx.l2_gas_left; + auto parent_da_gas_left = current_ext_call_ctx.da_gas_left; + + // now modify the last row of the gas trace to return to the parent's latest gas + // with the nested call's entire allocation consumed + gas_trace_builder.constrain_gas_for_halt(/*exceptional_halt=*/true, + parent_l2_gas_left, + parent_da_gas_left, + l2_gas_allocated_to_nested_call, + da_gas_allocated_to_nested_call); + + // Update the call_ptr before we write the success flag + set_call_ptr(static_cast(current_ext_call_ctx.context_id)); + write_to_memory( + current_ext_call_ctx.success_offset, /*success=*/FF::zero(), AvmMemoryTag::U1, /*fix_pc=*/false); + + // Jump back to the parent's last pc + pc = current_ext_call_ctx.last_pc; + } +} + /** * @brief Loads a value from memory into a given intermediate register at a specified clock cycle. * Handles both direct and indirect memory access. @@ -399,13 +517,15 @@ FF AvmTraceBuilder::unconstrained_read_from_memory(AddressWithMode addr) return mem_trace_builder.unconstrained_read(call_ptr, offset); } -void AvmTraceBuilder::write_to_memory(AddressWithMode addr, FF val, AvmMemoryTag w_tag) +void AvmTraceBuilder::write_to_memory(AddressWithMode addr, FF val, AvmMemoryTag w_tag, bool fix_pc) { // op_set increments the pc, so we need to store the current pc and then jump back to it // to legally reset the pc. auto current_pc = pc; op_set(static_cast(addr.mode), val, addr.offset, w_tag, OpCode::SET_FF, true); - op_jump(current_pc, true); + if (fix_pc) { + op_jump(current_pc, true); + } } template @@ -523,7 +643,10 @@ AvmError AvmTraceBuilder::op_add( auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::ADD_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::ADD_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -606,7 +729,10 @@ AvmError AvmTraceBuilder::op_sub( auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::SUB_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SUB_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -687,7 +813,10 @@ AvmError AvmTraceBuilder::op_mul( auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::MUL_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::MUL_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -782,7 +911,10 @@ AvmError AvmTraceBuilder::op_div( auto write_dst = constrained_write_to_memory(call_ptr, clk, resolved_dst, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::DIV_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::DIV_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -874,7 +1006,10 @@ AvmError AvmTraceBuilder::op_fdiv( call_ptr, clk, resolved_c, c, AvmMemoryTag::FF, AvmMemoryTag::FF, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::FDIV_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::FDIV_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -959,7 +1094,10 @@ AvmError AvmTraceBuilder::op_eq( constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, AvmMemoryTag::U1, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::EQ_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::EQ_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1027,7 +1165,10 @@ AvmError AvmTraceBuilder::op_lt( constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, AvmMemoryTag::U1, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::LT_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::LT_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1096,7 +1237,10 @@ AvmError AvmTraceBuilder::op_lte( constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, AvmMemoryTag::U1, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::LTE_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::LTE_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1169,7 +1313,10 @@ AvmError AvmTraceBuilder::op_and( auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::AND_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::AND_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1239,7 +1386,10 @@ AvmError AvmTraceBuilder::op_or( auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::OR_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::OR_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1309,7 +1459,10 @@ AvmError AvmTraceBuilder::op_xor( auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::XOR_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::XOR_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1386,7 +1539,10 @@ AvmError AvmTraceBuilder::op_not(uint8_t indirect, uint32_t a_offset, uint32_t d auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::NOT_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::NOT_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1449,7 +1605,10 @@ AvmError AvmTraceBuilder::op_shl( // Write into memory value c from intermediate register ic. auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::SHL_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SHL_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1516,7 +1675,10 @@ AvmError AvmTraceBuilder::op_shr( // Write into memory value c from intermediate register ic. auto write_c = constrained_write_to_memory(call_ptr, clk, resolved_c, c, in_tag, in_tag, IntermRegister::IC); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::SHR_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SHR_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1571,6 +1733,8 @@ AvmError AvmTraceBuilder::op_shr( AvmError AvmTraceBuilder::op_cast( uint8_t indirect, uint32_t a_offset, uint32_t dst_offset, AvmMemoryTag dst_tag, OpCode op_code) { + // We keep the first encountered error + AvmError error = AvmError::NO_ERROR; auto const clk = static_cast(main_trace.size()) + 1; auto [resolved_addrs, res_error] = @@ -1590,7 +1754,10 @@ AvmError AvmTraceBuilder::op_cast( mem_trace_builder.write_into_memory(call_ptr, clk, IntermRegister::IC, resolved_c, c, memEntry.tag, dst_tag); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::CAST_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::CAST_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1681,8 +1848,6 @@ AvmError AvmTraceBuilder::op_get_env_var(uint8_t indirect, uint32_t dst_offset, .main_sel_op_address = FF(1), // TODO(9407): what selector should this be? }; - // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); main_trace.push_back(row); return AvmError::ENV_VAR_UNKNOWN; } else { @@ -1744,7 +1909,10 @@ AvmError AvmTraceBuilder::op_address(uint8_t indirect, uint32_t dst_offset) row.main_sel_op_address = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1757,7 +1925,10 @@ AvmError AvmTraceBuilder::op_sender(uint8_t indirect, uint32_t dst_offset) row.main_sel_op_sender = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1770,7 +1941,10 @@ AvmError AvmTraceBuilder::op_transaction_fee(uint8_t indirect, uint32_t dst_offs row.main_sel_op_transaction_fee = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1783,7 +1957,10 @@ AvmError AvmTraceBuilder::op_is_static_call(uint8_t indirect, uint32_t dst_offse row.main_sel_op_is_static_call = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1800,7 +1977,10 @@ AvmError AvmTraceBuilder::op_chain_id(uint8_t indirect, uint32_t dst_offset) row.main_sel_op_chain_id = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1813,7 +1993,10 @@ AvmError AvmTraceBuilder::op_version(uint8_t indirect, uint32_t dst_offset) row.main_sel_op_version = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1826,7 +2009,10 @@ AvmError AvmTraceBuilder::op_block_number(uint8_t indirect, uint32_t dst_offset) row.main_sel_op_block_number = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1839,7 +2025,10 @@ AvmError AvmTraceBuilder::op_timestamp(uint8_t indirect, uint32_t dst_offset) row.main_sel_op_timestamp = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1852,7 +2041,10 @@ AvmError AvmTraceBuilder::op_fee_per_l2_gas(uint8_t indirect, uint32_t dst_offse row.main_sel_op_fee_per_l2_gas = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1865,7 +2057,10 @@ AvmError AvmTraceBuilder::op_fee_per_da_gas(uint8_t indirect, uint32_t dst_offse row.main_sel_op_fee_per_da_gas = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(static_cast(row.main_clk), OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); return error; @@ -1935,7 +2130,10 @@ AvmError AvmTraceBuilder::op_calldata_copy(uint8_t indirect, } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::CALLDATACOPY, copy_size); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::CALLDATACOPY, copy_size); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -1979,7 +2177,10 @@ AvmError AvmTraceBuilder::op_returndata_size(uint8_t indirect, uint32_t dst_offs write_to_memory(resolved_dst_offset, returndata_size, AvmMemoryTag::U32); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::RETURNDATASIZE); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::RETURNDATASIZE); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -2022,9 +2223,12 @@ AvmError AvmTraceBuilder::op_returndata_copy(uint8_t indirect, const uint32_t rd_offset = static_cast(unconstrained_read_from_memory(rd_offset_resolved)); const uint32_t copy_size = static_cast(unconstrained_read_from_memory(copy_size_offset_resolved)); - gas_trace_builder.constrain_gas(clk, - OpCode::RETURNDATACOPY, - /*dyn_gas_multiplier=*/copy_size); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, + OpCode::RETURNDATACOPY, + /*dyn_gas_multiplier=*/copy_size); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -2057,6 +2261,8 @@ AvmError AvmTraceBuilder::op_returndata_copy(uint8_t indirect, // Helper for "gas left" related opcodes AvmError AvmTraceBuilder::execute_gasleft(EnvironmentVariable var, uint8_t indirect, uint32_t dst_offset) { + // We keep the first encountered error + AvmError error = AvmError::NO_ERROR; ASSERT(var == EnvironmentVariable::L2GASLEFT || var == EnvironmentVariable::DAGASLEFT); auto clk = static_cast(main_trace.size()) + 1; @@ -2066,7 +2272,10 @@ AvmError AvmTraceBuilder::execute_gasleft(EnvironmentVariable var, uint8_t indir auto [resolved_dst] = resolved_addrs; // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::GETENVVAR_16); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::GETENVVAR_16); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } uint32_t gas_remaining = 0; @@ -2126,11 +2335,16 @@ AvmError AvmTraceBuilder::op_dagasleft(uint8_t indirect, uint32_t dst_offset) */ AvmError AvmTraceBuilder::op_jump(uint32_t jmp_dest, bool skip_gas) { + // We keep the first encountered error + AvmError error = AvmError::NO_ERROR; auto clk = static_cast(main_trace.size()) + 1; // Constrain gas cost if (!skip_gas) { - gas_trace_builder.constrain_gas(clk, OpCode::JUMP_32); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::JUMP_32); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } } main_trace.push_back(Row{ @@ -2138,13 +2352,14 @@ AvmError AvmTraceBuilder::op_jump(uint32_t jmp_dest, bool skip_gas) .main_call_ptr = call_ptr, .main_ia = FF(jmp_dest), .main_internal_return_ptr = FF(internal_return_ptr), + .main_op_err = static_cast(!is_ok(error)), .main_pc = FF(pc), .main_sel_op_jump = FF(1), }); // Adjust parameters for the next row pc = jmp_dest; - return AvmError::NO_ERROR; + return error; } /** @@ -2183,7 +2398,10 @@ AvmError AvmTraceBuilder::op_jumpi(uint8_t indirect, uint32_t cond_offset, uint3 uint32_t next_pc = !id_zero ? jmp_dest : pc + Deserialization::get_pc_increment(OpCode::JUMPI_32); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::JUMPI_32); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::JUMPI_32); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -2220,6 +2438,8 @@ AvmError AvmTraceBuilder::op_jumpi(uint8_t indirect, uint32_t cond_offset, uint3 */ AvmError AvmTraceBuilder::op_internal_call(uint32_t jmp_dest) { + // We keep the first encountered error + AvmError error = AvmError::NO_ERROR; auto clk = static_cast(main_trace.size()) + 1; const auto next_pc = pc + Deserialization::get_pc_increment(OpCode::INTERNALCALL); // We store the next instruction as the return location @@ -2227,7 +2447,10 @@ AvmError AvmTraceBuilder::op_internal_call(uint32_t jmp_dest) // We push the next pc onto the internal return stack of the current context current_ext_call_ctx.internal_return_ptr_stack.emplace(next_pc); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::INTERNALCALL); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::INTERNALCALL); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -2235,13 +2458,14 @@ AvmError AvmTraceBuilder::op_internal_call(uint32_t jmp_dest) .main_ia = FF(jmp_dest), .main_ib = FF(next_pc), .main_internal_return_ptr = FF(internal_return_ptr), + .main_op_err = static_cast(!is_ok(error)), .main_pc = FF(pc), .main_sel_op_internal_call = FF(1), }); // Adjust parameters for the next row pc = jmp_dest; - return AvmError::NO_ERROR; + return error; } /** @@ -2256,6 +2480,8 @@ AvmError AvmTraceBuilder::op_internal_call(uint32_t jmp_dest) */ AvmError AvmTraceBuilder::op_internal_return() { + // We keep the first encountered error + AvmError error = AvmError::NO_ERROR; auto clk = static_cast(main_trace.size()) + 1; // We pop the return location from the internal return stack of the current context @@ -2263,19 +2489,23 @@ AvmError AvmTraceBuilder::op_internal_return() current_ext_call_ctx.internal_return_ptr_stack.pop(); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::INTERNALRETURN); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::INTERNALRETURN); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, .main_call_ptr = call_ptr, .main_ia = next_pc, .main_internal_return_ptr = FF(internal_return_ptr), + .main_op_err = static_cast(!is_ok(error)), .main_pc = pc, .main_sel_op_internal_return = FF(1), }); pc = next_pc; - return AvmError::NO_ERROR; + return error; } /************************************************************************************************** @@ -2317,7 +2547,10 @@ AvmError AvmTraceBuilder::op_set( // Constrain gas cost // FIXME: not great that we are having to choose one specific opcode here! if (!skip_gas) { - gas_trace_builder.constrain_gas(clk, OpCode::SET_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SET_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } } main_trace.push_back(Row{ @@ -2378,7 +2611,10 @@ AvmError AvmTraceBuilder::op_mov(uint8_t indirect, uint32_t src_offset, uint32_t // Constrain gas cost // FIXME: not great that we are having to choose one specific opcode here! - gas_trace_builder.constrain_gas(clk, OpCode::MOV_8); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::MOV_8); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -2520,10 +2756,10 @@ RowWithError AvmTraceBuilder::create_kernel_output_opcode_with_metadata(uint8_t AvmError AvmTraceBuilder::op_sload(uint8_t indirect, uint32_t slot_offset, uint32_t dest_offset) { - auto clk = static_cast(main_trace.size()) + 1; - // We keep the first encountered error AvmError error = AvmError::NO_ERROR; + auto clk = static_cast(main_trace.size()) + 1; + auto [resolved_addrs, res_error] = Addressing<2>::fromWire(indirect, call_ptr).resolve({ slot_offset, dest_offset }, mem_trace_builder); auto [resolved_slot, resolved_dest] = resolved_addrs; @@ -2535,19 +2771,25 @@ AvmError AvmTraceBuilder::op_sload(uint8_t indirect, uint32_t slot_offset, uint3 // Retrieve the public data read hint for this sload PublicDataReadTreeHint read_hint = execution_hints.storage_read_hints.at(storage_read_counter++); + // Check that the hinted leaf is a member of the public data tree + bool is_member = merkle_tree_trace_builder.perform_storage_read( + clk, read_hint.leaf_preimage, read_hint.leaf_index, read_hint.sibling_path); + ASSERT(is_member); // Compute the tree slot FF computed_tree_slot = merkle_tree_trace_builder.compute_public_tree_leaf_slot(clk, current_ext_call_ctx.contract_address, read_slot); - // Sanity check that the computed slot using the value read from slot_offset should match the read hint - ASSERT(computed_tree_slot == read_hint.leaf_preimage.slot); - - // Check that the leaf is a member of the public data tree - bool is_member = merkle_tree_trace_builder.perform_storage_read( - clk, read_hint.leaf_preimage, read_hint.leaf_index, read_hint.sibling_path); - ASSERT(is_member); + // Check if the computed_tree_slot matches the read hint + bool exists = computed_tree_slot == read_hint.leaf_preimage.slot; + + // If it doesnt exist, we should check the low nullifier conditions + if (!exists) { + bool non_member = AvmMerkleTreeTraceBuilder::assert_public_data_non_membership_check(read_hint.leaf_preimage, + computed_tree_slot); + ASSERT(non_member); + } - FF value = read_hint.leaf_preimage.value; + FF value = exists ? read_hint.leaf_preimage.value : FF::zero(); auto write_a = constrained_write_to_memory( call_ptr, clk, resolved_dest, value, AvmMemoryTag::FF, AvmMemoryTag::FF, IntermRegister::IA); @@ -2575,7 +2817,10 @@ AvmError AvmTraceBuilder::op_sload(uint8_t indirect, uint32_t slot_offset, uint3 // Constrain gas cost // TODO: when/if we move this to its own gadget, and we have 1 row only, we should pass the size as // n_multiplier here. - gas_trace_builder.constrain_gas(clk, OpCode::SLOAD); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SLOAD); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -2589,15 +2834,17 @@ AvmError AvmTraceBuilder::op_sload(uint8_t indirect, uint32_t slot_offset, uint3 AvmError AvmTraceBuilder::op_sstore(uint8_t indirect, uint32_t src_offset, uint32_t slot_offset) { - // We keep the first encountered error - AvmError error = AvmError::NO_ERROR; auto clk = static_cast(main_trace.size()) + 1; + uint32_t unique_public_data_slot_writes = get_public_data_writes_count(); + AvmError error = current_ext_call_ctx.is_static_call ? AvmError::STATIC_CALL_ALTERATION + : unique_public_data_slot_writes >= MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + ? AvmError::SIDE_EFFECT_LIMIT_REACHED + : AvmError::NO_ERROR; - if (storage_write_counter >= MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) { + if (!is_ok(error)) { // NOTE: the circuit constraint for this limit should only be applied // for the storage writes performed by this opcode. An exception should before // made for the fee juice storage write made after teardown. - error = AvmError::SIDE_EFFECT_LIMIT_REACHED; auto row = Row{ .main_clk = clk, .main_internal_return_ptr = internal_return_ptr, @@ -2605,7 +2852,6 @@ AvmError AvmTraceBuilder::op_sstore(uint8_t indirect, uint32_t src_offset, uint3 .main_pc = pc, .main_sel_op_sstore = FF(1), }; - gas_trace_builder.constrain_gas(clk, OpCode::SSTORE); main_trace.push_back(row); pc += Deserialization::get_pc_increment(OpCode::SSTORE); return error; @@ -2663,7 +2909,10 @@ AvmError AvmTraceBuilder::op_sstore(uint8_t indirect, uint32_t src_offset, uint3 row.main_sel_op_sstore = FF(1); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::SSTORE); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SSTORE); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -2758,7 +3007,10 @@ AvmError AvmTraceBuilder::op_note_hash_exists(uint8_t indirect, } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::NOTEHASHEXISTS); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::NOTEHASHEXISTS); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -2770,9 +3022,12 @@ AvmError AvmTraceBuilder::op_note_hash_exists(uint8_t indirect, AvmError AvmTraceBuilder::op_emit_note_hash(uint8_t indirect, uint32_t note_hash_offset) { auto const clk = static_cast(main_trace.size()) + 1; + uint32_t inserted_note_hashes_count = get_inserted_note_hashes_count(); + AvmError error = current_ext_call_ctx.is_static_call ? AvmError::STATIC_CALL_ALTERATION + : inserted_note_hashes_count >= MAX_NOTE_HASHES_PER_TX ? AvmError::SIDE_EFFECT_LIMIT_REACHED + : AvmError::NO_ERROR; - if (note_hash_write_counter >= MAX_NOTE_HASHES_PER_TX) { - AvmError error = AvmError::SIDE_EFFECT_LIMIT_REACHED; + if (!is_ok(error)) { auto row = Row{ .main_clk = clk, .main_internal_return_ptr = internal_return_ptr, @@ -2780,30 +3035,40 @@ AvmError AvmTraceBuilder::op_emit_note_hash(uint8_t indirect, uint32_t note_hash .main_pc = pc, .main_sel_op_emit_note_hash = FF(1), }; - gas_trace_builder.constrain_gas(clk, OpCode::EMITNOTEHASH); main_trace.push_back(row); pc += Deserialization::get_pc_increment(OpCode::EMITNOTEHASH); return error; } - auto [row, error] = create_kernel_output_opcode(indirect, clk, note_hash_offset); + auto [row, output_error] = create_kernel_output_opcode(indirect, clk, note_hash_offset); row.main_sel_op_emit_note_hash = FF(1); + if (is_ok(error)) { + error = output_error; + } + row.main_op_err = FF(static_cast(!is_ok(error))); AppendTreeHint note_hash_write_hint = execution_hints.note_hash_write_hints.at(note_hash_write_counter++); - auto siloed_note_hash = AvmMerkleTreeTraceBuilder::unconstrained_silo_note_hash( + FF siloed_note_hash = AvmMerkleTreeTraceBuilder::unconstrained_silo_note_hash( current_public_call_request.contract_address, row.main_ia); - ASSERT(row.main_ia == note_hash_write_hint.leaf_value); + FF nonce = + AvmMerkleTreeTraceBuilder::unconstrained_compute_note_hash_nonce(get_tx_hash(), inserted_note_hashes_count); + FF unique_note_hash = AvmMerkleTreeTraceBuilder::unconstrained_compute_unique_note_hash(nonce, siloed_note_hash); + + ASSERT(unique_note_hash == note_hash_write_hint.leaf_value); // We first check that the index is currently empty bool insert_index_is_empty = merkle_tree_trace_builder.perform_note_hash_read( clk, FF::zero(), note_hash_write_hint.leaf_index, note_hash_write_hint.sibling_path); ASSERT(insert_index_is_empty); // Update the root with the new leaf that is appended - merkle_tree_trace_builder.perform_note_hash_append(clk, siloed_note_hash, note_hash_write_hint.sibling_path); + merkle_tree_trace_builder.perform_note_hash_append(clk, unique_note_hash, note_hash_write_hint.sibling_path); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::EMITNOTEHASH); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::EMITNOTEHASH); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -2836,7 +3101,6 @@ AvmError AvmTraceBuilder::op_nullifier_exists(uint8_t indirect, Row row; // Exists is written to b - bool exists = false; if (is_ok(error)) { NullifierReadTreeHint nullifier_read_hint = execution_hints.nullifier_read_hints.at(nullifier_read_counter++); FF nullifier_value = unconstrained_read_from_memory(resolved_nullifier_offset); @@ -2847,17 +3111,11 @@ AvmError AvmTraceBuilder::op_nullifier_exists(uint8_t indirect, nullifier_read_hint.low_leaf_index, nullifier_read_hint.low_leaf_sibling_path); ASSERT(is_member); - - if (siloed_nullifier == nullifier_read_hint.low_leaf_preimage.nullifier) { - // This is a direct membership check - exists = true; - } else { - exists = false; - // This is a non-membership proof - // Show that the target nullifier meets the non membership conditions (sandwich or max) - ASSERT(siloed_nullifier < nullifier_read_hint.low_leaf_preimage.nullifier && - (nullifier_read_hint.low_leaf_preimage.next_nullifier == FF::zero() || - siloed_nullifier > nullifier_read_hint.low_leaf_preimage.next_nullifier)); + bool exists = siloed_nullifier == nullifier_read_hint.low_leaf_preimage.nullifier; + if (!exists) { + bool is_non_member = AvmMerkleTreeTraceBuilder::assert_nullifier_non_membership_check( + nullifier_read_hint.low_leaf_preimage, siloed_nullifier); + ASSERT(is_non_member); } auto read_a = constrained_read_from_memory( @@ -2908,7 +3166,10 @@ AvmError AvmTraceBuilder::op_nullifier_exists(uint8_t indirect, } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::NULLIFIEREXISTS); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::NULLIFIEREXISTS); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -2921,12 +3182,14 @@ AvmError AvmTraceBuilder::op_nullifier_exists(uint8_t indirect, AvmError AvmTraceBuilder::op_emit_nullifier(uint8_t indirect, uint32_t nullifier_offset) { - // We keep the first encountered error - AvmError error = AvmError::NO_ERROR; auto const clk = static_cast(main_trace.size()) + 1; - if (nullifier_write_counter >= MAX_NULLIFIERS_PER_TX) { - error = AvmError::SIDE_EFFECT_LIMIT_REACHED; + uint32_t inserted_nullifier_count = get_inserted_nullifiers_count(); + AvmError error = current_ext_call_ctx.is_static_call ? AvmError::STATIC_CALL_ALTERATION + : inserted_nullifier_count >= MAX_NULLIFIERS_PER_TX ? AvmError::SIDE_EFFECT_LIMIT_REACHED + : AvmError::NO_ERROR; + + if (!is_ok(error)) { auto row = Row{ .main_clk = clk, .main_internal_return_ptr = internal_return_ptr, @@ -2934,7 +3197,6 @@ AvmError AvmTraceBuilder::op_emit_nullifier(uint8_t indirect, uint32_t nullifier .main_pc = pc, .main_sel_op_emit_nullifier = FF(1), }; - gas_trace_builder.constrain_gas(clk, OpCode::EMITNULLIFIER); main_trace.push_back(row); pc += Deserialization::get_pc_increment(OpCode::EMITNULLIFIER); return error; @@ -2983,7 +3245,10 @@ AvmError AvmTraceBuilder::op_emit_nullifier(uint8_t indirect, uint32_t nullifier row.main_op_err = FF(static_cast(!is_ok(error))); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::EMITNULLIFIER); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::EMITNULLIFIER); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -3078,7 +3343,10 @@ AvmError AvmTraceBuilder::op_l1_to_l2_msg_exists(uint8_t indirect, } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::L1TOL2MSGEXISTS); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::L1TOL2MSGEXISTS); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -3095,7 +3363,10 @@ AvmError AvmTraceBuilder::op_get_contract_instance( AvmError error = AvmError::NO_ERROR; auto clk = static_cast(main_trace.size()) + 1; // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::GETCONTRACTINSTANCE); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::GETCONTRACTINSTANCE); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } if (member_enum >= static_cast(ContractInstanceMember::MAX_MEMBER)) { // Error, bad enum operand @@ -3137,7 +3408,7 @@ AvmError AvmTraceBuilder::op_get_contract_instance( // Read the contract instance hint ContractInstanceHint instance = execution_hints.contract_instance_hints.at(contract_address); - if (isCanonical(contract_address)) { + if (is_canonical(contract_address)) { // skip membership check for canonical contracts exists = true; } else { @@ -3306,8 +3577,6 @@ AvmError AvmTraceBuilder::op_emit_unencrypted_log(uint8_t indirect, uint32_t log .main_pc = pc, .main_sel_op_emit_unencrypted_log = FF(1), }; - // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::EMITUNENCRYPTEDLOG, static_cast(log_size)); main_trace.push_back(row); pc += Deserialization::get_pc_increment(OpCode::EMITUNENCRYPTEDLOG); return error; @@ -3356,7 +3625,10 @@ AvmError AvmTraceBuilder::op_emit_unencrypted_log(uint8_t indirect, uint32_t log } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::EMITUNENCRYPTEDLOG, static_cast(log_size)); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::EMITUNENCRYPTEDLOG, static_cast(log_size)); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -3381,7 +3653,6 @@ AvmError AvmTraceBuilder::op_emit_l2_to_l1_msg(uint8_t indirect, uint32_t recipi .main_pc = pc, .main_sel_op_emit_l2_to_l1_msg = FF(1), }; - gas_trace_builder.constrain_gas(clk, OpCode::SENDL2TOL1MSG); main_trace.push_back(row); pc += Deserialization::get_pc_increment(OpCode::SENDL2TOL1MSG); return error; @@ -3402,7 +3673,10 @@ AvmError AvmTraceBuilder::op_emit_l2_to_l1_msg(uint8_t indirect, uint32_t recipi row.main_op_err = FF(static_cast(!is_ok(error))); // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::SENDL2TOL1MSG); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SENDL2TOL1MSG); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(row); @@ -3461,9 +3735,13 @@ AvmError AvmTraceBuilder::constrain_external_call(OpCode opcode, is_ok(error) ? static_cast(unconstrained_read_from_memory(resolved_args_size_offset)) : 0; // We need to consume the the gas cost of call, and then handle the amount allocated to the call - gas_trace_builder.constrain_gas(clk, - opcode, - /*dyn_gas_multiplier=*/args_size); + // TODO: is cast okay? Should gas be read from memory as u32? + bool out_of_gas = gas_trace_builder.constrain_gas(clk, opcode, /*dyn_gas_multiplier=*/args_size); + // NOTE: we don't run out of gas if the gas specified by user code is > gas left. + // In that case we just cap the gas allocation by gas left. + if (is_ok(error) && out_of_gas) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -3496,9 +3774,16 @@ AvmError AvmTraceBuilder::constrain_external_call(OpCode opcode, pc += Deserialization::get_pc_increment(opcode); + // Save the current gas left in the context before pushing it to stack + // It will be used on RETURN/REVERT/halt to remember how much gas the caller had left. + current_ext_call_ctx.l2_gas_left = gas_trace_builder.get_l2_gas_left(); + current_ext_call_ctx.da_gas_left = gas_trace_builder.get_da_gas_left(); + // We push the current ext call ctx onto the stack and initialize a new one current_ext_call_ctx.last_pc = pc; - current_ext_call_ctx.success_offset = resolved_success_offset, + current_ext_call_ctx.success_offset = resolved_success_offset; + current_ext_call_ctx.tree_snapshot = merkle_tree_trace_builder.get_tree_snapshots(); + current_ext_call_ctx.public_data_unique_writes = merkle_tree_trace_builder.get_public_data_unique_writes(); external_call_ctx_stack.emplace(current_ext_call_ctx); // Ext Ctx setup @@ -3507,18 +3792,29 @@ AvmError AvmTraceBuilder::constrain_external_call(OpCode opcode, set_call_ptr(static_cast(clk)); + // Don't try allocating more than the gas that is actually left + const auto l2_gas_allocated_to_nested_call = + std::min(static_cast(read_gas_l2.val), gas_trace_builder.get_l2_gas_left()); + const auto da_gas_allocated_to_nested_call = + std::min(static_cast(read_gas_da.val), gas_trace_builder.get_da_gas_left()); current_ext_call_ctx = ExtCallCtx{ .context_id = static_cast(clk), .parent_id = current_ext_call_ctx.context_id, + .is_static_call = opcode == OpCode::STATICCALL, .contract_address = read_addr.val, .calldata = calldata, .nested_returndata = {}, .last_pc = 0, .success_offset = 0, - .l2_gas = static_cast(read_gas_l2.val), - .da_gas = static_cast(read_gas_da.val), + .start_l2_gas_left = l2_gas_allocated_to_nested_call, + .start_da_gas_left = da_gas_allocated_to_nested_call, + .l2_gas_left = l2_gas_allocated_to_nested_call, + .da_gas_left = da_gas_allocated_to_nested_call, .internal_return_ptr_stack = {}, + .tree_snapshot = {}, }; + + allocate_gas_for_call(l2_gas_allocated_to_nested_call, da_gas_allocated_to_nested_call); set_pc(0); return error; @@ -3609,7 +3905,34 @@ ReturnDataError AvmTraceBuilder::op_return(uint8_t indirect, uint32_t ret_offset const auto ret_size = static_cast(unconstrained_read_from_memory(resolved_ret_size_offset)); - bool is_top_level = current_ext_call_ctx.context_id == 0; + const bool is_top_level = current_ext_call_ctx.context_id == 0; + + const auto [l2_gas_cost, da_gas_cost] = gas_trace_builder.unconstrained_compute_gas(OpCode::RETURN, ret_size); + bool out_of_gas = + l2_gas_cost > gas_trace_builder.get_l2_gas_left() || da_gas_cost > gas_trace_builder.get_da_gas_left(); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } + if (!is_ok(error)) { + main_trace.push_back(Row{ + .main_clk = clk, + .main_call_ptr = call_ptr, + .main_ib = ret_size, + .main_internal_return_ptr = FF(internal_return_ptr), + .main_op_err = static_cast(!is_ok(error)), + .main_pc = pc, + .main_sel_op_external_return = 1, + }); + return ReturnDataError{ + .return_data = {}, + .error = error, + .is_top_level = is_top_level, + }; + } + + // Charge gas normally. The gas row will be modified later to go back to parent's gas + // minus gas consumed by nested call. + gas_trace_builder.constrain_gas(clk, OpCode::RETURN, ret_size); if (tag_match) { if (is_top_level) { @@ -3619,23 +3942,38 @@ ReturnDataError AvmTraceBuilder::op_return(uint8_t indirect, uint32_t ret_offset returndata = mem_trace_builder.read_return_opcode(clk, call_ptr, resolved_ret_offset, ret_size); slice_trace_builder.create_return_slice(returndata, clk, call_ptr, resolved_ret_offset, ret_size); all_returndata.insert(all_returndata.end(), returndata.begin(), returndata.end()); - } else { + // before the nested call was made, how much gas does the parent have? + const auto l2_gas_allocated_to_nested_call = current_ext_call_ctx.start_l2_gas_left; + const auto da_gas_allocated_to_nested_call = current_ext_call_ctx.start_da_gas_left; // We are returning from a nested call std::vector returndata{}; read_slice_from_memory(resolved_ret_offset, ret_size, returndata); - // Pop the stack + // Pop the caller/parent's context from the stack to proceed with execution there current_ext_call_ctx = external_call_ctx_stack.top(); external_call_ctx_stack.pop(); current_ext_call_ctx.nested_returndata = returndata; + + // Grab the saved-off gas remaining in the parent from before the nested call + // now that we have popped its context from the stack. + auto parent_l2_gas_left = current_ext_call_ctx.l2_gas_left; + auto parent_da_gas_left = current_ext_call_ctx.da_gas_left; + + // modify this instruction's gas row (from constrain_gas) to go back to + // parent's gas minus gas consumed by nested call. + gas_trace_builder.constrain_gas_for_halt(/*exceptional_halt=*/false, + parent_l2_gas_left, + parent_da_gas_left, + l2_gas_allocated_to_nested_call, + da_gas_allocated_to_nested_call); + // Update the call_ptr before we write the success flag set_call_ptr(static_cast(current_ext_call_ctx.context_id)); - write_to_memory(current_ext_call_ctx.success_offset, FF::one(), AvmMemoryTag::U1); + write_to_memory( + current_ext_call_ctx.success_offset, /*success=*/FF::one(), AvmMemoryTag::U1, /*fix_pc=*/false); } } - gas_trace_builder.constrain_gas(clk, OpCode::RETURN, ret_size); - if (ret_size == 0) { main_trace.push_back(Row{ .main_clk = clk, @@ -3706,7 +4044,35 @@ ReturnDataError AvmTraceBuilder::op_revert(uint8_t indirect, uint32_t ret_offset const auto ret_size = is_ok(error) ? static_cast(unconstrained_read_from_memory(resolved_ret_size_offset)) : 0; - bool is_top_level = current_ext_call_ctx.context_id == 0; + const bool is_top_level = current_ext_call_ctx.context_id == 0; + + const auto [l2_gas_cost, da_gas_cost] = gas_trace_builder.unconstrained_compute_gas(OpCode::REVERT_8, ret_size); + bool out_of_gas = + l2_gas_cost > gas_trace_builder.get_l2_gas_left() || da_gas_cost > gas_trace_builder.get_da_gas_left(); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } + if (!is_ok(error)) { + // TODO: fix and set sel_op_revert + main_trace.push_back(Row{ + .main_call_ptr = call_ptr, + .main_ib = ret_size, + .main_internal_return_ptr = FF(internal_return_ptr), + .main_op_err = static_cast(!is_ok(error)), + .main_pc = pc, + .main_sel_op_external_return = 1, + }); + return ReturnDataError{ + .return_data = {}, + .error = error, + .is_top_level = is_top_level, + }; + } + + // Charge gas normally. The gas row will be modified later to go back to parent's gas + // minus gas consumed by nested call. + gas_trace_builder.constrain_gas(clk, OpCode::REVERT_8, ret_size); + if (tag_match) { if (is_top_level) { // The only memory operation performed from the main trace is a possible indirect load for resolving the @@ -3716,21 +4082,39 @@ ReturnDataError AvmTraceBuilder::op_revert(uint8_t indirect, uint32_t ret_offset slice_trace_builder.create_return_slice(returndata, clk, call_ptr, resolved_ret_offset, ret_size); all_returndata.insert(all_returndata.end(), returndata.begin(), returndata.end()); } else { + // before the nested call was made, how much gas does the parent have? + const auto l2_gas_allocated_to_nested_call = current_ext_call_ctx.start_l2_gas_left; + const auto da_gas_allocated_to_nested_call = current_ext_call_ctx.start_da_gas_left; // We are returning from a nested call std::vector returndata{}; read_slice_from_memory(resolved_ret_offset, ret_size, returndata); - // Pop the stack + // Pop the caller/parent's context from the stack to proceed with execution there current_ext_call_ctx = external_call_ctx_stack.top(); external_call_ctx_stack.pop(); current_ext_call_ctx.nested_returndata = returndata; + + // Grab the saved-off gas remaining in the parent from before the nested call + // now that we have popped its context from the stack. + auto parent_l2_gas_left = current_ext_call_ctx.l2_gas_left; + auto parent_da_gas_left = current_ext_call_ctx.da_gas_left; + + // modify this instruction's gas row (from constrain_gas) to go back to + // parent's gas minus gas consumed by nested call. + gas_trace_builder.constrain_gas_for_halt(/*exceptional_halt=*/false, + parent_l2_gas_left, + parent_da_gas_left, + l2_gas_allocated_to_nested_call, + da_gas_allocated_to_nested_call); + // Update the call_ptr before we write the success flag set_call_ptr(static_cast(current_ext_call_ctx.context_id)); - write_to_memory(current_ext_call_ctx.success_offset, FF::one(), AvmMemoryTag::U1); + write_to_memory( + current_ext_call_ctx.success_offset, /*success=*/FF::one(), AvmMemoryTag::U1, /*fix_pc=*/false); + merkle_tree_trace_builder.restore_tree_state(current_ext_call_ctx.tree_snapshot, + current_ext_call_ctx.public_data_unique_writes); } } - gas_trace_builder.constrain_gas(clk, OpCode::REVERT_8, ret_size); - // TODO: fix and set sel_op_revert if (ret_size == 0) { main_trace.push_back(Row{ @@ -3740,7 +4124,7 @@ ReturnDataError AvmTraceBuilder::op_revert(uint8_t indirect, uint32_t ret_offset .main_internal_return_ptr = FF(internal_return_ptr), .main_op_err = FF(static_cast(!is_ok(error))), .main_pc = pc, - .main_sel_op_external_return = 1, + .main_sel_op_external_revert = 1, }); pc = is_top_level ? UINT32_MAX : current_ext_call_ctx.last_pc; @@ -3771,10 +4155,6 @@ ReturnDataError AvmTraceBuilder::op_revert(uint8_t indirect, uint32_t ret_offset pc = is_top_level ? UINT32_MAX : current_ext_call_ctx.last_pc; auto return_data = is_top_level ? returndata : current_ext_call_ctx.nested_returndata; - if (is_ok(error)) { - error = AvmError::REVERT_OPCODE; - } - // op_valid == true otherwise, ret_size == 0 and we would have returned above. return ReturnDataError{ .return_data = return_data, @@ -3811,7 +4191,10 @@ AvmError AvmTraceBuilder::op_debug_log(uint8_t indirect, is_ok(error) ? static_cast(unconstrained_read_from_memory(resolved_fields_size_offset)) : 0; // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::DEBUGLOG, message_size + fields_size); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::DEBUGLOG, message_size + fields_size); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } if (is_ok(error) && !(check_tag_range(AvmMemoryTag::U8, resolved_message_offset, message_size) && check_tag_range(AvmMemoryTag::FF, resolved_fields_offset, fields_size))) { @@ -3861,7 +4244,10 @@ AvmError AvmTraceBuilder::op_poseidon2_permutation(uint8_t indirect, uint32_t in // Resolve indirects in the main trace. Do not resolve the value stored in direct addresses. // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::POSEIDON2PERM); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::POSEIDON2PERM); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } // These read patterns will be refactored - we perform them here instead of in the poseidon gadget trace // even though they are "performed" by the gadget. @@ -3988,12 +4374,12 @@ AvmError AvmTraceBuilder::op_sha256_compression(uint8_t indirect, const uint32_t STATE_SIZE = 8; const uint32_t INPUTS_SIZE = 16; - // The clk plays a crucial role in this function as we attempt to write across multiple lines in the main trace. - auto clk = static_cast(main_trace.size()) + 1; - // We keep the first encountered error AvmError error = AvmError::NO_ERROR; + // The clk plays a crucial role in this function as we attempt to write across multiple lines in the main trace. + auto clk = static_cast(main_trace.size()) + 1; + // Resolve the indirect flags, the results of this function are used to determine the memory offsets // that point to the starting memory addresses for the input and output values. auto [resolved_addrs, res_error] = Addressing<3>::fromWire(indirect, call_ptr) @@ -4013,7 +4399,10 @@ AvmError AvmTraceBuilder::op_sha256_compression(uint8_t indirect, } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::SHA256COMPRESSION); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::SHA256COMPRESSION); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } // Since the above adds mem_reads in the mem_trace_builder at clk, we need to follow up resolving the reads in // the main trace at the same clk cycle to preserve the cross-table permutation @@ -4112,7 +4501,10 @@ AvmError AvmTraceBuilder::op_keccakf1600(uint8_t indirect, uint32_t output_offse } // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::KECCAKF1600); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::KECCAKF1600); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } main_trace.push_back(Row{ .main_clk = clk, @@ -4196,7 +4588,10 @@ AvmError AvmTraceBuilder::op_ec_add(uint16_t indirect, error = AvmError::CHECK_TAG_ERROR; } - gas_trace_builder.constrain_gas(clk, OpCode::ECADD); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::ECADD); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } if (!is_ok(error)) { main_trace.push_back(Row{ @@ -4294,7 +4689,10 @@ AvmError AvmTraceBuilder::op_variable_msm(uint8_t indirect, // TODO(dbanks12): length needs to fit into u32 here or it will certainly // run out of gas. Casting/truncating here is not secure. - gas_trace_builder.constrain_gas(clk, OpCode::MSM, static_cast(points_length)); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::MSM, static_cast(points_length)); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } if (!is_ok(error)) { main_trace.push_back(Row{ @@ -4381,34 +4779,52 @@ AvmError AvmTraceBuilder::op_variable_msm(uint8_t indirect, * * @param indirect A byte encoding information about indirect/direct memory access. * @param src_offset An index in memory pointing to the input of the To_Radix_BE conversion. - * @param dst_offset An index in memory pointing to the output of the To_Radix_BE conversion. * @param radix_offset An index in memory pointing to the strict upper bound of each converted limb, i.e., 0 <= limb * < radix. - * @param num_limbs The number of limbs to the value into. - * @param output_bits Should the output be U1s instead of U8s? + * @param num_limbs_offset Offset pointing to the number of limbs to the value into. + * @param output_bits_offset Offset pointing to a boolean telling whether bits (U1) or bytes (U8) are in the output + * @param dst_offset An index in memory pointing to the output of the To_Radix_BE conversion. */ -AvmError AvmTraceBuilder::op_to_radix_be(uint8_t indirect, +AvmError AvmTraceBuilder::op_to_radix_be(uint16_t indirect, uint32_t src_offset, - uint32_t dst_offset, uint32_t radix_offset, - uint32_t num_limbs, - uint8_t output_bits) + uint32_t num_limbs_offset, + uint32_t output_bits_offset, + uint32_t dst_offset) { // We keep the first encountered error AvmError error = AvmError::NO_ERROR; auto clk = static_cast(main_trace.size()) + 1; - // write output as bits or bytes - AvmMemoryTag w_in_tag = output_bits > 0 ? AvmMemoryTag::U1 // bits mode - : AvmMemoryTag::U8; - - auto [resolved_addrs, res_error] = Addressing<3>::fromWire(indirect, call_ptr) - .resolve({ src_offset, dst_offset, radix_offset }, mem_trace_builder); - auto [resolved_src_offset, resolved_dst_offset, resolved_radix_offset] = resolved_addrs; + auto [resolved_addrs, res_error] = + Addressing<5>::fromWire(indirect, call_ptr) + .resolve({ src_offset, radix_offset, num_limbs_offset, output_bits_offset, dst_offset }, mem_trace_builder); + auto [resolved_src_offset, + resolved_radix_offset, + resolved_num_limbs_offset, + resolved_output_bits_offset, + resolved_dst_offset] = resolved_addrs; error = res_error; + if (is_ok(error) && !check_tag(AvmMemoryTag::U32, resolved_radix_offset) && + !check_tag(AvmMemoryTag::U32, resolved_num_limbs_offset) && + !check_tag(AvmMemoryTag::U1, resolved_output_bits_offset)) { + error = AvmError::CHECK_TAG_ERROR; + } + + const auto num_limbs = static_cast(unconstrained_read_from_memory(resolved_num_limbs_offset)); + // Constrain gas cost - gas_trace_builder.constrain_gas(clk, OpCode::TORADIXBE, num_limbs); + bool out_of_gas = gas_trace_builder.constrain_gas(clk, OpCode::TORADIXBE, num_limbs); + if (out_of_gas && is_ok(error)) { + error = AvmError::OUT_OF_GAS; + } + + const auto output_bits = static_cast(unconstrained_read_from_memory(resolved_output_bits_offset)); + + // write output as bits or bytes + AvmMemoryTag w_in_tag = output_bits > 0 ? AvmMemoryTag::U1 // bits mode + : AvmMemoryTag::U8; auto read_src = constrained_read_from_memory( call_ptr, clk, resolved_src_offset, AvmMemoryTag::FF, w_in_tag, IntermRegister::IA); @@ -4417,10 +4833,6 @@ AvmError AvmTraceBuilder::op_to_radix_be(uint8_t indirect, // auto read_radix = constrained_read_from_memory( // call_ptr, clk, resolved_radix_offset, AvmMemoryTag::U32, AvmMemoryTag::U32, IntermRegister::IB); - if (is_ok(error) && !check_tag(AvmMemoryTag::U32, resolved_radix_offset)) { - error = AvmError::CHECK_TAG_ERROR; - } - auto read_radix = unconstrained_read_from_memory(resolved_radix_offset); FF input = read_src.val; @@ -4764,8 +5176,15 @@ std::vector AvmTraceBuilder::finalize(bool apply_end_gas_assertions) if (apply_end_gas_assertions) { // Sanity check that the amount of gas consumed matches what we expect from the public inputs + auto const l2_gas_left_after_private = + public_inputs.gas_settings.gas_limits.l2_gas - public_inputs.start_gas_used.l2_gas; + auto const allocated_l2_gas = + std::min(l2_gas_left_after_private, static_cast(MAX_L2_GAS_PER_TX_PUBLIC_PORTION)); + // Since end_gas_used also contains start_gas_used, we need to subtract it out to see what is consumed by the + // public computation only + auto expected_public_gas_consumed = public_inputs.end_gas_used.l2_gas - public_inputs.start_gas_used.l2_gas; + auto expected_end_gas_l2 = allocated_l2_gas - expected_public_gas_consumed; auto last_l2_gas_remaining = main_trace.back().main_l2_gas_remaining; - auto expected_end_gas_l2 = public_inputs.gas_settings.gas_limits.l2_gas - public_inputs.end_gas_used.l2_gas; vinfo("Last L2 gas remaining: ", last_l2_gas_remaining); vinfo("Expected end gas L2: ", expected_end_gas_l2); ASSERT(last_l2_gas_remaining == expected_end_gas_l2); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp index 5e6af27c2a9..b988892dc50 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/trace.hpp @@ -220,12 +220,12 @@ class AvmTraceBuilder { uint32_t output_offset, uint32_t point_length_offset); // Conversions - AvmError op_to_radix_be(uint8_t indirect, + AvmError op_to_radix_be(uint16_t indirect, uint32_t src_offset, - uint32_t dst_offset, uint32_t radix_offset, - uint32_t num_limbs, - uint8_t output_bits); + uint32_t num_limbs_offset, + uint32_t output_bits_offset, + uint32_t dst_offset); std::vector finalize(bool apply_end_gas_assertions = false); void reset(); @@ -234,8 +234,13 @@ class AvmTraceBuilder { void rollback_to_non_revertible_checkpoint(); std::vector get_bytecode(const FF contract_address, bool check_membership = false); std::unordered_set bytecode_membership_cache; - void insert_private_state(const std::vector& siloed_nullifiers, const std::vector& siloed_note_hashes); + void insert_private_state(const std::vector& siloed_nullifiers, const std::vector& unique_note_hashes); + void insert_private_revertible_state(const std::vector& siloed_nullifiers, + const std::vector& siloed_note_hashes); void pay_fee(); + void pad_trees(); + void allocate_gas_for_call(uint32_t l2_gas, uint32_t da_gas); + void handle_exceptional_halt(); // These are used for testing only. AvmTraceBuilder& set_range_check_required(bool required) @@ -261,14 +266,19 @@ class AvmTraceBuilder { struct ExtCallCtx { uint32_t context_id; // This is the unique id of the ctx, we'll use the clk uint32_t parent_id; + bool is_static_call = false; FF contract_address{}; std::vector calldata; std::vector nested_returndata; uint32_t last_pc; uint32_t success_offset; - uint32_t l2_gas; - uint32_t da_gas; + uint32_t start_l2_gas_left; + uint32_t start_da_gas_left; + uint32_t l2_gas_left; // as of start of latest nested call + uint32_t da_gas_left; // as of start of latest nested call std::stack internal_return_ptr_stack; + TreeSnapshots tree_snapshot; // This is the tree state at the time of the call + std::unordered_set public_data_unique_writes; }; ExtCallCtx current_ext_call_ctx{}; @@ -359,6 +369,10 @@ class AvmTraceBuilder { AvmMemoryTag write_tag, IntermRegister reg, AvmMemTraceBuilder::MemOpOwner mem_op_owner = AvmMemTraceBuilder::MAIN); + uint32_t get_inserted_note_hashes_count(); + uint32_t get_inserted_nullifiers_count(); + uint32_t get_public_data_writes_count(); + FF get_tx_hash() const { return public_inputs.previous_non_revertible_accumulated_data.nullifiers[0]; } // TODO: remove these once everything is constrained. AvmMemoryTag unconstrained_get_memory_tag(AddressWithMode addr); @@ -366,7 +380,7 @@ class AvmTraceBuilder { bool check_tag_range(AvmMemoryTag tag, AddressWithMode start_offset, uint32_t size); FF unconstrained_read_from_memory(AddressWithMode addr); template void read_slice_from_memory(AddressWithMode addr, size_t slice_len, std::vector& slice); - void write_to_memory(AddressWithMode addr, FF val, AvmMemoryTag w_tag); + void write_to_memory(AddressWithMode addr, FF val, AvmMemoryTag w_tag, bool fix_pc = true); template void write_slice_to_memory(AddressWithMode addr, AvmMemoryTag w_tag, const T& slice); }; diff --git a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp index 24d69635058..d180cb2508b 100644 --- a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp @@ -46,7 +46,7 @@ #define TOTAL_FEES_LENGTH 1 #define PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH 867 #define AVM_ACCUMULATED_DATA_LENGTH 320 -#define AVM_CIRCUIT_PUBLIC_INPUTS_LENGTH 1009 +#define AVM_CIRCUIT_PUBLIC_INPUTS_LENGTH 1011 #define AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS 86 #define AVM_PROOF_LENGTH_IN_FIELDS 4155 #define AVM_PUBLIC_COLUMN_MAX_SIZE 1024 diff --git a/barretenberg/cpp/src/barretenberg/world_state/world_state.cpp b/barretenberg/cpp/src/barretenberg/world_state/world_state.cpp index 7e74fe44896..033ad3a51c3 100644 --- a/barretenberg/cpp/src/barretenberg/world_state/world_state.cpp +++ b/barretenberg/cpp/src/barretenberg/world_state/world_state.cpp @@ -913,19 +913,19 @@ bb::fr WorldState::compute_initial_archive(const StateReference& initial_state_r bool WorldState::is_archive_tip(const WorldStateRevision& revision, const bb::fr& block_header_hash) const { - std::optional leaf_index = std::nullopt; + std::vector> indices; try { - leaf_index = find_leaf_index(revision, MerkleTreeId::ARCHIVE, block_header_hash); + find_leaf_indices(revision, MerkleTreeId::ARCHIVE, { block_header_hash }, indices); } catch (std::runtime_error&) { } - if (!leaf_index.has_value()) { + if (indices.empty() || !indices[0].has_value()) { return false; } TreeMetaResponse archive_state = get_tree_info(revision, MerkleTreeId::ARCHIVE); - return archive_state.meta.size == leaf_index.value() + 1; + return archive_state.meta.size == indices[0].value() + 1; } void WorldState::get_status_summary(WorldStateStatusSummary& status) const diff --git a/barretenberg/cpp/src/barretenberg/world_state/world_state.hpp b/barretenberg/cpp/src/barretenberg/world_state/world_state.hpp index c66412aae77..a87ff94db65 100644 --- a/barretenberg/cpp/src/barretenberg/world_state/world_state.hpp +++ b/barretenberg/cpp/src/barretenberg/world_state/world_state.hpp @@ -156,15 +156,16 @@ class WorldState { * * @param revision The revision to query * @param tree_id The ID of the tree - * @param leaf The leaf to find + * @param leaves The leaves to find + * @param indices The indices to be updated * @param start_index The index to start searching from - * @return std::optional */ template - std::optional find_leaf_index(const WorldStateRevision& revision, - MerkleTreeId tree_id, - const T& leaf, - index_t start_index = 0) const; + void find_leaf_indices(const WorldStateRevision& revision, + MerkleTreeId tree_id, + const std::vector& leaves, + std::vector>& indices, + index_t start_index = 0) const; /** * @brief Appends a set of leaves to an existing Merkle Tree. @@ -475,10 +476,11 @@ std::optional WorldState::get_leaf(const WorldStateRevision& revision, } template -std::optional WorldState::find_leaf_index(const WorldStateRevision& rev, - MerkleTreeId id, - const T& leaf, - index_t start_index) const +void WorldState::find_leaf_indices(const WorldStateRevision& rev, + MerkleTreeId id, + const std::vector& leaves, + std::vector>& indices, + index_t start_index) const { using namespace crypto::merkle_tree; @@ -493,9 +495,10 @@ std::optional WorldState::find_leaf_index(const WorldStateRevision& rev if constexpr (std::is_same_v) { const auto& wrapper = std::get>(fork->_trees.at(id)); if (rev.blockNumber) { - wrapper.tree->find_leaf_index_from(leaf, start_index, rev.blockNumber, rev.includeUncommitted, callback); + wrapper.tree->find_leaf_indices_from( + leaves, start_index, rev.blockNumber, rev.includeUncommitted, callback); } else { - wrapper.tree->find_leaf_index_from(leaf, start_index, rev.includeUncommitted, callback); + wrapper.tree->find_leaf_indices_from(leaves, start_index, rev.includeUncommitted, callback); } } else { @@ -504,19 +507,20 @@ std::optional WorldState::find_leaf_index(const WorldStateRevision& rev auto& wrapper = std::get>(fork->_trees.at(id)); if (rev.blockNumber) { - wrapper.tree->find_leaf_index_from(leaf, rev.blockNumber, start_index, rev.includeUncommitted, callback); + wrapper.tree->find_leaf_indices_from( + leaves, start_index, rev.blockNumber, rev.includeUncommitted, callback); } else { - wrapper.tree->find_leaf_index_from(leaf, start_index, rev.includeUncommitted, callback); + wrapper.tree->find_leaf_indices_from(leaves, start_index, rev.includeUncommitted, callback); } } signal.wait_for_level(0); - if (!local.success) { - return std::nullopt; + if (!local.success || local.inner.leaf_indices.size() != leaves.size()) { + throw std::runtime_error(local.message); } - return local.inner.leaf_index; + indices = std::move(local.inner.leaf_indices); } template void WorldState::append_leaves(MerkleTreeId id, const std::vector& leaves, Fork::Id fork_id) diff --git a/barretenberg/cpp/src/barretenberg/world_state/world_state.test.cpp b/barretenberg/cpp/src/barretenberg/world_state/world_state.test.cpp index a5ced2921ad..8d5e67f89d1 100644 --- a/barretenberg/cpp/src/barretenberg/world_state/world_state.test.cpp +++ b/barretenberg/cpp/src/barretenberg/world_state/world_state.test.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -72,20 +73,24 @@ template void assert_leaf_exists( const WorldState& ws, WorldStateRevision revision, MerkleTreeId tree_id, const Leaf& expected_value, bool exists) { - std::optional index = ws.find_leaf_index(revision, tree_id, expected_value); - EXPECT_EQ(index.has_value(), exists); + std::vector> indices; + ws.find_leaf_indices(revision, tree_id, { expected_value }, indices); + EXPECT_EQ(indices.size(), 1); + EXPECT_EQ(indices[0].has_value(), exists); } template void assert_leaf_index( const WorldState& ws, WorldStateRevision revision, MerkleTreeId tree_id, const Leaf& value, index_t expected_index) { - std::optional index = ws.find_leaf_index(revision, tree_id, value); - EXPECT_TRUE(index.has_value()); - if (!index.has_value()) { + std::vector> indices; + ws.find_leaf_indices(revision, tree_id, { value }, indices); + EXPECT_EQ(indices.size(), 1); + EXPECT_TRUE(indices[0].has_value()); + if (!indices[0].has_value()) { return; } - EXPECT_EQ(index.value(), expected_index); + EXPECT_EQ(indices[0].value(), expected_index); } void assert_tree_size(const WorldState& ws, WorldStateRevision revision, MerkleTreeId tree_id, size_t expected_size) @@ -689,7 +694,11 @@ TEST_F(WorldStateTest, SyncEmptyBlock) ws.sync_block(block_state_ref, fr(1), {}, {}, {}, {}); StateReference after_sync = ws.get_state_reference(WorldStateRevision::committed()); EXPECT_EQ(block_state_ref, after_sync); - EXPECT_EQ(ws.find_leaf_index(WorldStateRevision::committed(), MerkleTreeId::ARCHIVE, fr(1)), 1); + + std::vector> indices; + ws.find_leaf_indices(WorldStateRevision::committed(), MerkleTreeId::ARCHIVE, { fr(1) }, indices); + std::vector> expected{ std::make_optional(1) }; + EXPECT_EQ(indices, expected); } TEST_F(WorldStateTest, ForkingAtBlock0SameState) diff --git a/barretenberg/cpp/src/barretenberg/world_state_napi/addon.cpp b/barretenberg/cpp/src/barretenberg/world_state_napi/addon.cpp index f3290da5e9e..1f343e32e2f 100644 --- a/barretenberg/cpp/src/barretenberg/world_state_napi/addon.cpp +++ b/barretenberg/cpp/src/barretenberg/world_state_napi/addon.cpp @@ -156,8 +156,8 @@ WorldStateAddon::WorldStateAddon(const Napi::CallbackInfo& info) }); _dispatcher.registerTarget( - WorldStateMessageType::FIND_LEAF_INDEX, - [this](msgpack::object& obj, msgpack::sbuffer& buffer) { return find_leaf_index(obj, buffer); }); + WorldStateMessageType::FIND_LEAF_INDICES, + [this](msgpack::object& obj, msgpack::sbuffer& buffer) { return find_leaf_indices(obj, buffer); }); _dispatcher.registerTarget( WorldStateMessageType::FIND_LOW_LEAF, @@ -410,38 +410,43 @@ bool WorldStateAddon::get_block_numbers_for_leaf_indices(msgpack::object& obj, m return true; } -bool WorldStateAddon::find_leaf_index(msgpack::object& obj, msgpack::sbuffer& buffer) const +bool WorldStateAddon::find_leaf_indices(msgpack::object& obj, msgpack::sbuffer& buffer) const { TypedMessage request; obj.convert(request); - std::optional index; + FindLeafIndicesResponse response; + switch (request.value.treeId) { case MerkleTreeId::NOTE_HASH_TREE: case MerkleTreeId::L1_TO_L2_MESSAGE_TREE: case MerkleTreeId::ARCHIVE: { - TypedMessage> r1; + TypedMessage> r1; obj.convert(r1); - index = _ws->find_leaf_index(request.value.revision, request.value.treeId, r1.value.leaf); + _ws->find_leaf_indices( + request.value.revision, request.value.treeId, r1.value.leaves, response.indices, r1.value.startIndex); break; } case MerkleTreeId::PUBLIC_DATA_TREE: { - TypedMessage> r2; + TypedMessage> r2; obj.convert(r2); - index = _ws->find_leaf_index(request.value.revision, request.value.treeId, r2.value.leaf); + _ws->find_leaf_indices( + request.value.revision, request.value.treeId, r2.value.leaves, response.indices, r2.value.startIndex); break; } case MerkleTreeId::NULLIFIER_TREE: { - TypedMessage> r3; + TypedMessage> r3; obj.convert(r3); - index = _ws->find_leaf_index(request.value.revision, request.value.treeId, r3.value.leaf); + _ws->find_leaf_indices( + request.value.revision, request.value.treeId, r3.value.leaves, response.indices, r3.value.startIndex); break; } } MsgHeader header(request.header.messageId); - messaging::TypedMessage> resp_msg(WorldStateMessageType::FIND_LEAF_INDEX, header, index); + messaging::TypedMessage resp_msg( + WorldStateMessageType::FIND_LEAF_INDICES, header, response); msgpack::pack(buffer, resp_msg); return true; diff --git a/barretenberg/cpp/src/barretenberg/world_state_napi/addon.hpp b/barretenberg/cpp/src/barretenberg/world_state_napi/addon.hpp index d0b33be2532..14318c1bb20 100644 --- a/barretenberg/cpp/src/barretenberg/world_state_napi/addon.hpp +++ b/barretenberg/cpp/src/barretenberg/world_state_napi/addon.hpp @@ -40,7 +40,7 @@ class WorldStateAddon : public Napi::ObjectWrap { bool get_sibling_path(msgpack::object& obj, msgpack::sbuffer& buffer) const; bool get_block_numbers_for_leaf_indices(msgpack::object& obj, msgpack::sbuffer& buffer) const; - bool find_leaf_index(msgpack::object& obj, msgpack::sbuffer& buffer) const; + bool find_leaf_indices(msgpack::object& obj, msgpack::sbuffer& buffer) const; bool find_low_leaf(msgpack::object& obj, msgpack::sbuffer& buffer) const; bool append_leaves(msgpack::object& obj, msgpack::sbuffer& buffer); diff --git a/barretenberg/cpp/src/barretenberg/world_state_napi/message.hpp b/barretenberg/cpp/src/barretenberg/world_state_napi/message.hpp index b98a8c6a69d..d903ed7dc2f 100644 --- a/barretenberg/cpp/src/barretenberg/world_state_napi/message.hpp +++ b/barretenberg/cpp/src/barretenberg/world_state_napi/message.hpp @@ -23,7 +23,7 @@ enum WorldStateMessageType { GET_SIBLING_PATH, GET_BLOCK_NUMBERS_FOR_LEAF_INDICES, - FIND_LEAF_INDEX, + FIND_LEAF_INDICES, FIND_LOW_LEAF, APPEND_LEAVES, @@ -143,11 +143,17 @@ struct GetBlockNumbersForLeafIndicesResponse { MSGPACK_FIELDS(blockNumbers); }; -template struct FindLeafIndexRequest { +template struct FindLeafIndicesRequest { MerkleTreeId treeId; WorldStateRevision revision; - T leaf; - MSGPACK_FIELDS(treeId, revision, leaf); + std::vector leaves; + index_t startIndex; + MSGPACK_FIELDS(treeId, revision, leaves, startIndex); +}; + +struct FindLeafIndicesResponse { + std::vector> indices; + MSGPACK_FIELDS(indices); }; struct FindLowLeafRequest { diff --git a/barretenberg/sol/package-lock.json b/barretenberg/sol/package-lock.json new file mode 100644 index 00000000000..dab5c8abab1 --- /dev/null +++ b/barretenberg/sol/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "sol", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/barretenberg/sol/src/honk/HonkTypes.sol b/barretenberg/sol/src/honk/HonkTypes.sol index 55176738d07..7832c767fc4 100644 --- a/barretenberg/sol/src/honk/HonkTypes.sol +++ b/barretenberg/sol/src/honk/HonkTypes.sol @@ -10,9 +10,9 @@ uint256 constant CONST_PROOF_SIZE_LOG_N = 28; uint256 constant NUMBER_OF_SUBRELATIONS = 26; uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; -uint256 constant NUMBER_OF_ENTITIES = 44; +uint256 constant NUMBER_OF_ENTITIES = 40; uint256 constant NUMBER_UNSHIFTED = 35; -uint256 constant NUMBER_TO_BE_SHIFTED = 9; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; // Alphas are used as relation separators so there should be NUMBER_OF_SUBRELATIONS - 1 uint256 constant NUMBER_OF_ALPHAS = 25; @@ -25,11 +25,11 @@ enum WIRE { Q_R, Q_O, Q_4, + Q_LOOKUP, Q_ARITH, Q_RANGE, Q_ELLIPTIC, Q_AUX, - Q_LOOKUP, Q_POSEIDON2_EXTERNAL, Q_POSEIDON2_INTERNAL, SIGMA_1, @@ -54,10 +54,6 @@ enum WIRE { LOOKUP_INVERSES, LOOKUP_READ_COUNTS, LOOKUP_READ_TAGS, - TABLE_1_SHIFT, - TABLE_2_SHIFT, - TABLE_3_SHIFT, - TABLE_4_SHIFT, W_L_SHIFT, W_R_SHIFT, W_O_SHIFT, @@ -91,11 +87,11 @@ library Honk { G1Point qr; G1Point qo; G1Point q4; + G1Point qLookup; // Lookup G1Point qArith; // Arithmetic widget G1Point qDeltaRange; // Delta Range sort G1Point qAux; // Auxillary G1Point qElliptic; // Auxillary - G1Point qLookup; // Lookup G1Point qPoseidon2External; G1Point qPoseidon2Internal; // Copy cnstraints diff --git a/barretenberg/sol/src/honk/Relations.sol b/barretenberg/sol/src/honk/Relations.sol index 9ca4868cc44..251dbe8245a 100644 --- a/barretenberg/sol/src/honk/Relations.sol +++ b/barretenberg/sol/src/honk/Relations.sol @@ -57,6 +57,7 @@ library RelationsLib { * Ultra Arithmetic Relation * */ + function accumulateArithmeticRelation( Fr[NUMBER_OF_ENTITIES] memory p, Fr[NUMBER_OF_SUBRELATIONS] memory evals, diff --git a/barretenberg/sol/src/honk/instance/Add2Honk.sol b/barretenberg/sol/src/honk/instance/Add2Honk.sol index 00e26a8ca1b..9107e9d1e2a 100644 --- a/barretenberg/sol/src/honk/instance/Add2Honk.sol +++ b/barretenberg/sol/src/honk/instance/Add2Honk.sol @@ -276,11 +276,11 @@ contract Add2HonkVerifier is IVerifier { commitments[4] = vk.qr; commitments[5] = vk.qo; commitments[6] = vk.q4; - commitments[7] = vk.qArith; - commitments[8] = vk.qDeltaRange; - commitments[9] = vk.qElliptic; - commitments[10] = vk.qAux; - commitments[11] = vk.qLookup; + commitments[7] = vk.qLookup; + commitments[8] = vk.qArith; + commitments[9] = vk.qDeltaRange; + commitments[10] = vk.qElliptic; + commitments[11] = vk.qAux; commitments[12] = vk.qPoseidon2External; commitments[13] = vk.qPoseidon2Internal; commitments[14] = vk.s1; @@ -309,15 +309,11 @@ contract Add2HonkVerifier is IVerifier { commitments[35] = convertProofPoint(proof.lookupReadTags); // to be Shifted - commitments[36] = vk.t1; - commitments[37] = vk.t2; - commitments[38] = vk.t3; - commitments[39] = vk.t4; - commitments[40] = convertProofPoint(proof.w1); - commitments[41] = convertProofPoint(proof.w2); - commitments[42] = convertProofPoint(proof.w3); - commitments[43] = convertProofPoint(proof.w4); - commitments[44] = convertProofPoint(proof.zPerm); + commitments[36] = convertProofPoint(proof.w1); + commitments[37] = convertProofPoint(proof.w2); + commitments[38] = convertProofPoint(proof.w3); + commitments[39] = convertProofPoint(proof.w4); + commitments[40] = convertProofPoint(proof.zPerm); /* Batch gemini claims from the prover * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from diff --git a/barretenberg/sol/src/honk/instance/BlakeHonk.sol b/barretenberg/sol/src/honk/instance/BlakeHonk.sol index 6e617946e06..b49ee574373 100644 --- a/barretenberg/sol/src/honk/instance/BlakeHonk.sol +++ b/barretenberg/sol/src/honk/instance/BlakeHonk.sol @@ -277,11 +277,11 @@ contract BlakeHonkVerifier is IVerifier { commitments[4] = vk.qr; commitments[5] = vk.qo; commitments[6] = vk.q4; - commitments[7] = vk.qArith; - commitments[8] = vk.qDeltaRange; - commitments[9] = vk.qElliptic; - commitments[10] = vk.qAux; - commitments[11] = vk.qLookup; + commitments[7] = vk.qLookup; + commitments[8] = vk.qArith; + commitments[9] = vk.qDeltaRange; + commitments[10] = vk.qElliptic; + commitments[11] = vk.qAux; commitments[12] = vk.qPoseidon2External; commitments[13] = vk.qPoseidon2Internal; commitments[14] = vk.s1; @@ -310,15 +310,11 @@ contract BlakeHonkVerifier is IVerifier { commitments[35] = convertProofPoint(proof.lookupReadTags); // to be Shifted - commitments[36] = vk.t1; - commitments[37] = vk.t2; - commitments[38] = vk.t3; - commitments[39] = vk.t4; - commitments[40] = convertProofPoint(proof.w1); - commitments[41] = convertProofPoint(proof.w2); - commitments[42] = convertProofPoint(proof.w3); - commitments[43] = convertProofPoint(proof.w4); - commitments[44] = convertProofPoint(proof.zPerm); + commitments[36] = convertProofPoint(proof.w1); + commitments[37] = convertProofPoint(proof.w2); + commitments[38] = convertProofPoint(proof.w3); + commitments[39] = convertProofPoint(proof.w4); + commitments[40] = convertProofPoint(proof.zPerm); /* Batch gemini claims from the prover * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from diff --git a/barretenberg/sol/src/honk/instance/EcdsaHonk.sol b/barretenberg/sol/src/honk/instance/EcdsaHonk.sol index 6d8a4a39c02..5afb9bd1b28 100644 --- a/barretenberg/sol/src/honk/instance/EcdsaHonk.sol +++ b/barretenberg/sol/src/honk/instance/EcdsaHonk.sol @@ -279,11 +279,11 @@ contract EcdsaHonkVerifier is IVerifier { commitments[4] = vk.qr; commitments[5] = vk.qo; commitments[6] = vk.q4; - commitments[7] = vk.qArith; - commitments[8] = vk.qDeltaRange; - commitments[9] = vk.qElliptic; - commitments[10] = vk.qAux; - commitments[11] = vk.qLookup; + commitments[7] = vk.qLookup; + commitments[8] = vk.qArith; + commitments[9] = vk.qDeltaRange; + commitments[10] = vk.qElliptic; + commitments[11] = vk.qAux; commitments[12] = vk.qPoseidon2External; commitments[13] = vk.qPoseidon2Internal; commitments[14] = vk.s1; @@ -312,15 +312,11 @@ contract EcdsaHonkVerifier is IVerifier { commitments[35] = convertProofPoint(proof.lookupReadTags); // to be Shifted - commitments[36] = vk.t1; - commitments[37] = vk.t2; - commitments[38] = vk.t3; - commitments[39] = vk.t4; - commitments[40] = convertProofPoint(proof.w1); - commitments[41] = convertProofPoint(proof.w2); - commitments[42] = convertProofPoint(proof.w3); - commitments[43] = convertProofPoint(proof.w4); - commitments[44] = convertProofPoint(proof.zPerm); + commitments[36] = convertProofPoint(proof.w1); + commitments[37] = convertProofPoint(proof.w2); + commitments[38] = convertProofPoint(proof.w3); + commitments[39] = convertProofPoint(proof.w4); + commitments[40] = convertProofPoint(proof.zPerm); /* Batch gemini claims from the prover * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from diff --git a/barretenberg/sol/src/honk/keys/Add2HonkVerificationKey.sol b/barretenberg/sol/src/honk/keys/Add2HonkVerificationKey.sol index 2402e0a4069..1c246dc4d6b 100644 --- a/barretenberg/sol/src/honk/keys/Add2HonkVerificationKey.sol +++ b/barretenberg/sol/src/honk/keys/Add2HonkVerificationKey.sol @@ -15,48 +15,48 @@ library Add2HonkVerificationKey { logCircuitSize: uint256(5), publicInputsSize: uint256(3), ql: Honk.G1Point({ - x: uint256(0x043d063b130adfb37342af45d0155a28edd1a7e46c840d9c943fdf45521c64ce), - y: uint256(0x261522c4089330646aff96736194949330952ae74c573d1686d9cb4a00733854) + x: uint256(0x27456b3a666ff24c6452657437518f7b73e854ce6c763732122a3b923bc6797b), + y: uint256(0x2ecbc0db4ae72d05db96eb72034b26275a33325b05b2dd53c33662369bcdc4e0) }), qr: Honk.G1Point({ - x: uint256(0x291338e99e7857222c76c5e4ba8b954f5fde09fd2f05634d622ba379657cd501), - y: uint256(0x137030ce3236d7c12307adf650a73b87fc95a774ec43ac0a3a341ef26b7f56c9) + x: uint256(0x274db2ddab5fc87804dcb835027d293547d5fc2b6cde27990e5577a3d77aa4b0), + y: uint256(0x29d2c716e45fccb7b1d8a3fb384854408392a74a4e4fb4d3cfab460efbfdb87d) }), qo: Honk.G1Point({ - x: uint256(0x0f90f4bb16b330b82ef51e7ce3f70a9310ea2d3c5ef855f07b6f58081b5ef41f), - y: uint256(0x0e09412eea75978da57db1d3fa6b7d14c0e282c378be9a6d0efc5770863ed70b) + x: uint256(0x26da077296ea89f2b0caef070f7c380bedee8f4137d8e15972888cb873b6a849), + y: uint256(0x01028d4966e7b172aca7f9c56d169a449b2326bc0293d54f3708482a8fd09d26) }), q4: Honk.G1Point({ - x: uint256(0x1eec247154ced5c29b0836528d7c19eda11399dc21e23df4bee4b5cd0bec659f), - y: uint256(0x107cc382fdee2f6530d39b072a2bc50bdb0c0ac4b054a905b03b9d53bebef404) + x: uint256(0x1b87b4f288e37e4ff07f6a368177b9765eeccd1017bec74e98859fa3fbf201f3), + y: uint256(0x1d100498fbe5bd401d2eb9b77f1a887806c8251de6ccab14008a324357e5ddfb) }), qm: Honk.G1Point({ - x: uint256(0x0c17b7ba3864cabe287a2b121b5cb3f8ee4ede87a7f656b8d9b470be025007c8), - y: uint256(0x09590397bf354089980bd40f5d84f4c12faa8b4646425fa660ab7c4c76fb4859) + x: uint256(0x12dda3f2df2c6774290c833772e87ec75c9a658559506fcd1d743e0e98b6e0ad), + y: uint256(0x2df9dc1c291b41624c0ae46e40238467771572731402b64d664ed641c5078105) }), qc: Honk.G1Point({ - x: uint256(0x2ac1a00b4c9bb4e7deef8d7a6bf9e26e61f2b935409e41c5770c074303b6d142), - y: uint256(0x192d962de288fb26f3d68052b2f475e884ca47e595de1184171cd1500249fa66) + x: uint256(0x0963fc084e9f28db0ad8f6d9cc0fd9dfdf2704140bb42debece9b98ed4e6915b), + y: uint256(0x1e81fc7c58c0d8ae1233acb9d57c1d69a82c4c1a418494558b735fba505f6877) }), qArith: Honk.G1Point({ - x: uint256(0x1797e3e7ee9e4f42b42bd375f13f2ccb395b827e9079e999b6c128d9b083c395), - y: uint256(0x101a60efaab1c8564add45d41b9147efacf45941c3efe93c3568bde1e08e1919) + x: uint256(0x06d4ca88fe948f6b5f555d318feea69879457f1cf2b22f7d464fa8d4a8b5cd46), + y: uint256(0x155440972055e3134a5b514eccdd47b0cc217ff529b603700339d647b7e338d3) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x0e84090add56f2500ab518c655cae63896ea793e6b3f6a14218d476534109610), - y: uint256(0x2b78a584bd6ae88cf4ec7c65c90e0b65df446fdddba972f3c4414ad3c901f4f9) - }), - qElliptic: Honk.G1Point({ x: uint256(0x1bd6129f9646aa21af0d77e7b1cc9794e611b5d59a27773f744710b476fbd30f), y: uint256(0x2f8d492d76a22b6834f0b88e2d4096139a9d1593d56e65e710b2f344756b721e) }), - qAux: Honk.G1Point({ + qElliptic: Honk.G1Point({ x: uint256(0x056ab50282da428d93b17cbd1c81267dcebcfbabdedb47b2d715b5baa6520bff), y: uint256(0x10b4e7bd9d6d91a57b0695be166ffd27cbeee602bcb5a9ed32c8d9440912cb72) }), + qAux: Honk.G1Point({ + x: uint256(0x024236bda126650fb5228cf424a0878775499e69e8bd2c39af33bd5fa0b4079a), + y: uint256(0x233cda9292be02cfa2da9d0fc7b0eab0eb1a867b06854066589b967455259b32) + }), qLookup: Honk.G1Point({ - x: uint256(0x19e2d786ebad24caf1bef735441e58525a2f9b5807b2102f295c58cde00f5c97), - y: uint256(0x085713ce7bac807a084a66904ebc6e695840e8cf405a6fd0c325f8bfcf7c2dd8) + x: uint256(0x2594d00a131b347f472a021eac09e25eacba35749a9ba8f8c7f4a726ff63a910), + y: uint256(0x2499be5abe1cf5463534a1d0613f82449f1989f1186f2d0b67295bda7f8a0f55) }), qPoseidon2External: Honk.G1Point({ x: uint256(0x0ca0bc4b1cd9eadbbf49eae56a99a4502ef13d965226a634d0981555e4a4da56), @@ -67,48 +67,48 @@ library Add2HonkVerificationKey { y: uint256(0x205f76eebda12f565c98c775c4e4f3534b5dcc29e57eed899b1a1a880534dcb9) }), s1: Honk.G1Point({ - x: uint256(0x19a07402ffcc103c3d8fbfbc7e9a660147d7380e65c34f64b75701b8d4868c11), - y: uint256(0x0b7ab8c749a4af75d6100dba9246d7f993748b326d23791a595e21a17653fe30) + x: uint256(0x2183ad847a1249f41cbd3a87f40c2f430eec8e15078ebf4294072495293f623a), + y: uint256(0x18f03d44febf5942b0325bd60625eb1d407adb20bdc51e770aa1f4ca1daf767c) }), s2: Honk.G1Point({ - x: uint256(0x027234cb39eacbf2ebe98907cf433e429a37933e429d4f24df14274b5c4d2549), - y: uint256(0x2c1ea0996e3fd6cfabcfc6bbd4c86c65fb19c3dda2ded5c4f973af397e8e5c8b) + x: uint256(0x2d6764e48b62f11fa745090dbc582712f8a0a16ef81cc7da6fba8b1ec52d23a1), + y: uint256(0x0289e7980be1c71d3e91a117b1d062b27bf4d711e9ab3a8ee82a64eaf4c5ac45) }), s3: Honk.G1Point({ - x: uint256(0x243daee8a40861aba1ef660929ee9e874e52cd8e8d75f8c0245852369a731491), - y: uint256(0x0a20f23c0697fb0698478f7a861dde5e18bf5aa34f4731178e74f7460df49a88) + x: uint256(0x16e299d4076387afc2add98ca386b3ff7ef29b7e87bb492a02e820b6404da3de), + y: uint256(0x2b11799049c80302774a11e05c57c8f614aecbc1c9a524e48328466195f35eaf) }), s4: Honk.G1Point({ - x: uint256(0x18b8202abb615440b5544d88092245911d2b5ff3b5a4a80bb15dbabafdfb56a7), - y: uint256(0x096a6685f36b1ca09a62820ae3be7538128093440fa943ea7412617a6d927916) + x: uint256(0x27c8607e808c4a94be60e9fa6e4263ab2d4b41bd866add287affd942f5879b79), + y: uint256(0x25584de7b2b270f792e86e4ca403dc6fbf31f16b1da4d3f95ed9b8231e1a7e31) }), t1: Honk.G1Point({ - x: uint256(0x2e0cddbc5712d79b59cb3b41ebbcdd494997477ab161763e46601d95844837ef), - y: uint256(0x303126892f664d8d505964d14315ec426db4c64531d350750df62dbbc41a1bd9) + x: uint256(0x1fb7c5d789d32e42a08e41296286139f603c7607ce186d0cce6e472dfe021473), + y: uint256(0x09d80a7c25410f51739aadc54ad122874e4551efc35bd23807ecf23a79ef418a) }), t2: Honk.G1Point({ - x: uint256(0x00874a5ad262eecc6b565e0b08507476a6b2c6040c0c62bd59acfe3e3e125672), - y: uint256(0x127b2a745a1b74968c3edc18982b9bef082fb517183c9c6841c2b8ef2ca1df04) + x: uint256(0x108788a192d4d3c38e445629bb550acf212f9b2049b6fb1cc76900bd482fb5b0), + y: uint256(0x195266ac0788c227762333892ad282a4679450ae72e8e8b4a1ead0e63d4f4e04) }), t3: Honk.G1Point({ - x: uint256(0x15a18748490ff4c2b1871081954e86c9efd4f8c3d56e1eb23d789a8f710d5be6), - y: uint256(0x2097c84955059442a95df075833071a0011ef987dc016ab110eacd554a1d8bbf) + x: uint256(0x1eb529bdb867a986cca8b8c0119e679b5712f4503e5d00698de6b6ae49092404), + y: uint256(0x20886f9e098437ea65110f5591661e37ac720779a376a6155f132dcd6c301a52) }), t4: Honk.G1Point({ - x: uint256(0x2aecd48089890ea0798eb952c66824d38e9426ad3085b68b00a93c17897c2877), - y: uint256(0x1216bdb2f0d961bb8a7a23331d215078d8a9ce405ce559f441f2e71477ff3ddb) + x: uint256(0x1a552bd8d3265d1f23e7ff166cf20fffa5c0688c867cfd3a2ea65452d8ad60a4), + y: uint256(0x1cb1414f7b9f8edb7c7a0d61f66e24e632a4050d9b3be0d6c35109aa99693039) }), id1: Honk.G1Point({ - x: uint256(0x292298ecab24d2b6f6999cac29848def2665a62342170311f44c08708db0fe1f), - y: uint256(0x277022c35d3145de166b139aa94609551122915366ba42ff7c5157b748fb7f9d) + x: uint256(0x2e286f771211f7466ea24e64484140bd5bcdcc759e88c2f4b2cc2fda221fb9c9), + y: uint256(0x21b150b35832343dd3988a32e15c404915b0cebfb762e47ad0a7ce18004bac27) }), id2: Honk.G1Point({ - x: uint256(0x2ddc6a05ccd584bdfc65d642b39a3be3075e7a370602112dbf9fc644789acace), - y: uint256(0x1a4167481d5f295af9921741bd0e32dda7a78cb391132b31ab4a77559c297c2e) + x: uint256(0x18eff4656b9f83aaf418fb251334d580bc6d247b19bb2438d4c4e71ffc3db1df), + y: uint256(0x1f859be892b830da65325a465f711a12a0b777997bbbfa5baebcb9f9a0eae3f1) }), id3: Honk.G1Point({ - x: uint256(0x19629b85ab2acf9713223ff4f758882af6247963bbf2f6ec4f9cbcde13675b87), - y: uint256(0x165063fe922948bf1d065a882242724c1bde5fdfd93be29586b45e1ce2cc750c) + x: uint256(0x0a0ae72496a2b188d803fb33078c15cbd3d6874f3d1dd71eeb6ff7d8f4542ed5), + y: uint256(0x15314a39e87cc4d8274dc773f73f20ec712c0fc7216fc00b016fadca84dbf785) }), id4: Honk.G1Point({ x: uint256(0x2493c99a3d068b03f8f2b8d28b57cea3ee22dd60456277b86c32a18982dcb185), @@ -119,8 +119,8 @@ library Add2HonkVerificationKey { y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x140b0936c323fd2471155617b6af56ee40d90bea71fba7a412dd61fcf34e8ceb), - y: uint256(0x2b6c10790a5f6631c87d652e059df42b90071823185c5ff8e440fd3d73b6fefc) + x: uint256(0x2d855b5b9eda31247e5c717ce51db5b7b0f74ed8027eddb28bb72f061415e49e), + y: uint256(0x1e857d997cc8bd0b6558b670690358ad63520266c81078227f33651c341b7704) }) }); return vk; diff --git a/barretenberg/sol/src/honk/keys/BlakeHonkVerificationKey.sol b/barretenberg/sol/src/honk/keys/BlakeHonkVerificationKey.sol index 0eaeba194f1..fe39ba37928 100644 --- a/barretenberg/sol/src/honk/keys/BlakeHonkVerificationKey.sol +++ b/barretenberg/sol/src/honk/keys/BlakeHonkVerificationKey.sol @@ -15,48 +15,48 @@ library BlakeHonkVerificationKey { logCircuitSize: uint256(15), publicInputsSize: uint256(4), ql: Honk.G1Point({ - x: uint256(0x2e5f133c25f7e05bd6660196c892121f7fa686cb9a8717a5deea6cd0881e618e), - y: uint256(0x1189bba9eeea96ba8935052434f4b0a60b0a481e3464dd81dfcd89e23def001b) + x: uint256(0x259ccc124bd4cf494d50c802a2df9671c3a500ccc3e83b72ead3806a7e740675), + y: uint256(0x0fa82481afabca16ee5f23d7ea094b00ebbc578a716fdaf782e05fd726faf007) }), qr: Honk.G1Point({ - x: uint256(0x2a93ffb34002da94f5b156ba5a212ac3616c848bd9c44c9821bbdd64cfd848af), - y: uint256(0x015699dcc0b28766d45f5ddce8258393e84c40619d26034e76f778460a1e4d89) + x: uint256(0x14ff9e75f0777269c7e1788b0c22a4995ee7aa86b57f1df85daad5dc5394c64d), + y: uint256(0x2459bcedd7bd75b357c9e5feb11de3cd8da023ce6a386b2449cd5f93758a6a3b) }), qo: Honk.G1Point({ - x: uint256(0x2057928e8c5eb539c32c3025007b7be1e1663c358f59540c6f949794c274f886), - y: uint256(0x12bf0b15c3aa92792330f58b04512714c4a902e537fe87cc438293e1805eaabf) + x: uint256(0x2d45d3ef650bc8242021c0b5c7c458abbe387b5697fd64f82c07527f7d1de8c6), + y: uint256(0x0267edd43123342fda564babb7c89110ba206a7b36500e88bb7c485448e97913) }), q4: Honk.G1Point({ - x: uint256(0x304f47a08d4687afa0e2502a9782c32c458bf873ef50c169b732a367e567aaf3), - y: uint256(0x0bb37044594e7de200408a4db6bc46adf7790b06f17dce6f38b7deed480aa9f0) + x: uint256(0x1ce127e531187e01b1ce284179977224b8f76fb470da6c61bf1791509a40d8b8), + y: uint256(0x22bdfdaabf4d8863c4a989a3345c7c9519af302fa6a1f67e4810d6589c2b5d6d) }), qm: Honk.G1Point({ - x: uint256(0x0aea5b04332ad8781411f7edde21266857ffe11e93af334b14a2b948429afaa4), - y: uint256(0x2bd2e3884d486b387122effa12e8698daef82e9b99d7d25b7d5df91a9d738495) + x: uint256(0x0951790dc5ec21ff7bd1054fbc6c3024120f848605d10edcabbd81924ef14404), + y: uint256(0x0715c7ce615280c7629a43891bf15a2194bd659483b15333d6bc66697c59e39e) }), qc: Honk.G1Point({ - x: uint256(0x0e3b418ea1924b4514d5009cd983b5a8074fa95cd1fb200f019fdebe944e4225), - y: uint256(0x1e6ef5bde7a9727f1c1d07c91461ae1b40524650b35fdd92ac7a129f263b1beb) + x: uint256(0x021f1c4697f49682d5b22a39cab4b196a822c7279551d3c86de39eecef6ee491), + y: uint256(0x170cf597b1d291c41d59d76f852fba1a7def57d9d031daf7bb0061b6b45be5b6) }), qArith: Honk.G1Point({ - x: uint256(0x096841bfa8ec2295a5af5bf69ec539c31a05b221c84ed1d24c702e31ce1cbc95), - y: uint256(0x10b14cca7e9ff05fcf1e3084f4fc9ab098cf379864b2e2e2e0d33fc5df9d9a50) + x: uint256(0x2ec15ed0cae4827b6c15a424b3409faea5a3b1488234f9970c12fe64dcd09915), + y: uint256(0x2f78d2844b0fff0faafdd1cd110d85ac77b2f7266dcbadc0e8bc6505f4248292) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x2d27fd1a30a0ab04a05144c27ac41187d5cf89a6022e47b263d1ccb93b3cbea5), - y: uint256(0x238eb233e9aebc81285a2647f2598bab00a4367da47b12c2b0476afc2d94ab1d) + x: uint256(0x257905e6e6a095881dbf7de8c3a7dcff8742f161bc6ca50871aba6543e480cb8), + y: uint256(0x0cac0d52c83175f49f71af8e8bd9d6f943cd3b451b6a6683df582a0e46db170c) }), qElliptic: Honk.G1Point({ - x: uint256(0x1c6fc8e14453adf64e6d9643ef9f1fb55e3a307ac1ec84f86cd736fc866e05ab), - y: uint256(0x1bf8619b1704b99ab8820ed94dd760da2945e8e1c771c0bdeadbe40aa5700cdd) + x: uint256(0x08e2c3e7dcc34da5d0170141b5ed9144c9d7de8976e0e2c81ad74e3b9451f76e), + y: uint256(0x223e14628c0bb1ecd61b88d322fff7c2c2a572c3b3e16fca14fed906a65482cd) }), qAux: Honk.G1Point({ - x: uint256(0x023fe0703623b99c93358348d76eb620f26ceafa58df018e3a8f1d599a61e76f), - y: uint256(0x2ceb9c4c4ca12ea769157ef10cde9644f9f0549805e48d5fd5d73a634d2cdcb5) + x: uint256(0x1a3a5eb5a02862dc132e23eac87a937d4f9b4d3736b3d1ce2bf2aec5b8761283), + y: uint256(0x0e608d3de6c0adf6dfba886c110a388fc2059abe6f660caf3f901bd3dbe4d97d) }), qLookup: Honk.G1Point({ - x: uint256(0x1375bbfbf5ed31b38460f46a43ac14e2cda93a3bc5cfd6e8a93cca356694a346), - y: uint256(0x204c5173892c19a97a04b5f8419898063df5136489809ddb9f7eabb58d6858ab) + x: uint256(0x22ef6b48ceec28053e1ec5bc4f0a91ae22d287d86044f15672c167ec1af91d8b), + y: uint256(0x11b828a2435dfaaa173ec009381bcd95b76c41adee995ac0c716b82879cab160) }), qPoseidon2External: Honk.G1Point({ x: uint256(0x1fa8529236d7eacdab8dcd8169af30d334be103357577353e9ef08dfda841785), @@ -67,60 +67,60 @@ library BlakeHonkVerificationKey { y: uint256(0x0335bb595984ad38686009bca08f5f420e3b4cf888fad5af4a99eca08190a315) }), s1: Honk.G1Point({ - x: uint256(0x26cec5ff3eb1b803c52fa1fefaac7a2be5cd13c1a1cc20bb9f22049c7f8597d2), - y: uint256(0x07e80e74eb0e06d7c0c9a3fbbdea4e86e5934faa8142625f175320778bcba65f) + x: uint256(0x259bede7c068653c0e2a16bd986e1ca97757315d3b973a494c6ca022cea60447), + y: uint256(0x2a93cb60e983030c470c044e1f156a25fe5e1941d38f4d8c91594e0eaa8858ae) }), s2: Honk.G1Point({ - x: uint256(0x140b2faaf30cb5fc528621f4a395943e7fab8198dc734ac13253dd249682dd2a), - y: uint256(0x12709c4a13428f4704d284c90a81cc83280680185ae6298187e86debcd3e00f7) + x: uint256(0x11df397e5ad916749343c5be9797f2b6e3c0450714a1d5fa8a3f55ef32586940), + y: uint256(0x046a6da96359bd452f9f3c3ccc15b9f59c26bab349a02faa1f1d34517282ef6c) }), s3: Honk.G1Point({ - x: uint256(0x0aca5621e9f49279969497b3da0eb8a74c68c3513f4cf98e8b1d6f88567557a8), - y: uint256(0x2664811311f75057a16267bc0479eaeea2424156417cc4d3f8bd286fac9aa5d2) + x: uint256(0x1ed35d2fd753212e17554522ac3d692ae25cb581f54adf02f99a5d6f71969d5d), + y: uint256(0x08352d3f6a0fb619cfd1a960514fe3394d9018f0388f631df9f5af9fcfd0efbe) }), s4: Honk.G1Point({ - x: uint256(0x04417c606a41393e73113ec3f834883dbeb302889199b888c0f5ea58a008ff98), - y: uint256(0x0865670de7962d29b6a9012f28ea52113c4e2b55d7de44e829edec87dba1d5c2) + x: uint256(0x15365aa0c1d6bce15408f45f0251c9472f78297ec2cc5ab508f5c568980a893d), + y: uint256(0x2385c2920ad544f0be29c68152bc7ae98031aee831ddad561a45a95b31ae6ef5) }), t1: Honk.G1Point({ - x: uint256(0x1ec1b607634e31421b5047dc99d7674d6505fed978df0f42a3504f9771a8a7fa), - y: uint256(0x1da802c6dc2fe6cffc6f9ae983080c66690ceee40c181b4d51fdba6c5c360297) + x: uint256(0x25bdb78d4e315a031ab7b6cb0dfdee32d86f4845ef1f837cdafa6c45f9ccae56), + y: uint256(0x0e68860fb89d3a366d4b7244a172f5a7e79147d8f09d3249b1555df77ef64ac9) }), t2: Honk.G1Point({ - x: uint256(0x1e38a0a482b7174f429a3bef25fb0a7656abc88cfd215b8e8404132601620784), - y: uint256(0x2e9ea07a995fa6d589e37fba2715f3f1fa338652ddf84d4e2e4f33dccadb9156) + x: uint256(0x0c0b5c83cfca189b7560979cbb59e4450d970a226e703fa090fc0fba87094c82), + y: uint256(0x290a615d73d77f18f3a7483bd4f7d9ba22ad1c1e28980012e5bb3c9660b96086) }), t3: Honk.G1Point({ - x: uint256(0x211a0833bb3c6f9ae6c94519b6878ed6157c4a080df786a053d9a19796b9a7f8), - y: uint256(0x1a3a450e1a272aa1fe9f097acf359502ff69df617de4918b37a497def94db2b5) + x: uint256(0x09d24c7501264da486f4ddbe6fee4a104edbfbcc8b3b7ea185db69c5e1a6c38b), + y: uint256(0x132e749bb80fdc19494cec612ce529b810d672d471253ffb5ab0ada355163fd3) }), t4: Honk.G1Point({ - x: uint256(0x281a984aef14716cd5d8fc2759eb8ea2464909b5c57d97b6bc50e4dad74d92d3), - y: uint256(0x169160e1505685aabd5bd60e994bac45162c6868235cc4252c8b87d0f12603fd) + x: uint256(0x044ff357ea1fbf33738fc570145106a3f6acc496c748b0b58f4615e1b0626e10), + y: uint256(0x2816e550d752b97bd0a5c2ed5369a652088981b3e92e3d6238b0c63b203aa3f4) }), id1: Honk.G1Point({ - x: uint256(0x01c082a85908fea4c69c4e51436fba7d965e1d88e485da16e35d8f4e8af3b8bd), - y: uint256(0x11b0ada021468b059aa6c27f4d4950ef65b98d4d8808ae21718bd8b90f9bb365) + x: uint256(0x2a2b95a34bb20d564d0b1ba33afdfe5ad95a8128ddfd8faec40b7bc2faf642e2), + y: uint256(0x1355384c7b2deba5fb394e25d297d5f37ccfaacfacd57aac61259bc1e87ea6ed) }), id2: Honk.G1Point({ - x: uint256(0x0b8667619755bd09c7970defeae2c920df2b17b41608303ae1d7393615dd04e4), - y: uint256(0x1c5419cd435c5516ac566a9d1dfecdb4e10190c63f2dbd8a1932785caf022e2c) + x: uint256(0x279ce3dbe9564e5fd66014fbedb03f538e23b5effe8bf1c3ca394eba651d25fc), + y: uint256(0x0d130ad41878eba2d8da55ed688de58a3b8edf7b237e4ead56deebd56d11344c) }), id3: Honk.G1Point({ - x: uint256(0x110aee72793c4b4ede92c1375f058b4170fcf01bf18f8f1ee934f7ae0fa26da5), - y: uint256(0x15c4f6a01ff04ef6b5225c896dfb7060a7a2c320395bda410e756d6b507b7eb8) + x: uint256(0x1f3ca856540e150992ef85a64d5bb2ddc643a53f15dad567e08fc5a61307a2c3), + y: uint256(0x0f44b87f30b55235f069ad5d06f23915c19bf6194c0e6f54e2a4b41ef357e214) }), id4: Honk.G1Point({ - x: uint256(0x2472aba130e7ed2aefad128109415ec2bdeb56e81e3cbeacc93e00c95f203579), - y: uint256(0x0c867d0f8e2f9c861574383b89020980358d898497f80c198a6c17c2f4daf9a4) + x: uint256(0x2b85159a22ab90cb83642950f0240a403dac1dc50a970d1113be0cf8a8b5d63d), + y: uint256(0x1287b2e8e4ee3f0a9afbf798230ea32388a6e90924f13d7c78d5aed275095c79) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x13b825e996cc8d600f363dca4481a54d6dd3da85900cd9f0a61fa02600851998), - y: uint256(0x151cb86205f2dc38a5651840c1a4b4928f3f3c98f77c2abd08336562986dc404) + x: uint256(0x2c3e8add0e69c3bb940ffe92b6d3bdbbe0c8ac0c95866da586d857c73a0556ba), + y: uint256(0x22ed2a9c8e4ee1ecde6e7285f21cb4fe0a23131c9ee50f22e367f7c8cc2ac84a) }) }); return vk; diff --git a/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol b/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol index 26207d04184..bd19e368249 100644 --- a/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol +++ b/barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol @@ -15,112 +15,112 @@ library EcdsaHonkVerificationKey { logCircuitSize: uint256(16), publicInputsSize: uint256(6), ql: Honk.G1Point({ - x: uint256(0x051ccdb8069f35f4ef85ad098e95681736a7bed10a7bee1b76a506235dc0b579), - y: uint256(0x05e168c2e4f90231545f5b24c1a84c1419b8798e4235cc2036c9e101e462b71d) + x: uint256(0x092e1a5431e67f41abd28c9b103ef1fb90a93ff2474f2f5bd2550387fac4b6d6), + y: uint256(0x272df56e1a1740f88fe789b1e63112068687fdc95ef7612024d550202bcbe41f) }), qr: Honk.G1Point({ - x: uint256(0x2c99eed1f855cd5152942cc090aabf15308eb00ac549e965eb3e1950479cce58), - y: uint256(0x170bf8541390153bf5807bc022c9369f99d8bc1fd87922a0627b144fec0414e2) + x: uint256(0x1d22d883b1f1bb07cbc1339682a92e3d96cf09e1c53a881fa283045587ce00fe), + y: uint256(0x12fdb565b8d174d018dede5197be30c94835fa581ed969f40433f65a84222a4a) }), qo: Honk.G1Point({ - x: uint256(0x1594abb7debcf41e3296178eeec941dbb6242ba13f50f4549734657ee5ebb8b1), - y: uint256(0x262e1469c56c719bdc4eaab93cc95868eed9fea1fa9ded03b46f2c061a341d4f) + x: uint256(0x2d928f55abc1f8f5f9e29011fa8c802eb5a94989042b3d5560f013a779e5d193), + y: uint256(0x1086b7bcf22b95fc94f063af74498dd4bac214e0459d68379a1008261358ddd7) }), q4: Honk.G1Point({ - x: uint256(0x16b49bbcd37e15ed89b2f6f5b97d021abe440ba7cbc69904484991fa7e6058a9), - y: uint256(0x197b14cb5d037642b27ed7cd79b9568e5853ad1e3508453c0ed1f30c1962fd52) + x: uint256(0x0a4e034f2d3b73ae4eb6ff0db3fe8e7b0357e6dd375a3107d1e4d9eb5ceb1e5b), + y: uint256(0x1266512c0da5b14ede1f1d5b80ad9dfa43b3c71b2c0bb11c9c123c70eabc62ad) }), qm: Honk.G1Point({ - x: uint256(0x175280d74e116a82ad6ccc34f640a5b3dda74b17372c9a0941d57749e37068a6), - y: uint256(0x0827b11a78b8a625ba940983effbcf7354aa0388bd472481c0a8a088653b9769) + x: uint256(0x1279a8faed8a7d782856985a20218fbcd73a8e8fb2574622210169b3b4eec159), + y: uint256(0x063271b597aa97880532cff9e2ccea5a6bf13d947f4c310c39be452010d59cb9) }), qc: Honk.G1Point({ - x: uint256(0x2a262a7189292da31f3f4a7926c4d9fcae883188aafe9cf3ba2a623f0004a67a), - y: uint256(0x0d90b8808180521422b90889592111434dd5bbc0e5deb27419c1f5e6d0bf9883) + x: uint256(0x1892791334caee5906d99a8c6dc6dc8636e0c667893b8cdd8067ee565028e396), + y: uint256(0x2f86193c2778a4c33d144fbf2803260b1df44d4ad82390dea131bc2b11ad1855) }), qArith: Honk.G1Point({ - x: uint256(0x2026f95bb8f7b6ed57287e4833e2789cce8ec9a95b829e6a2abbf5d13d681d22), - y: uint256(0x19cea5af7d9b39a4ad86a0ab52f8a358f7f35236561a50cdf6f2860f0b3426a8) + x: uint256(0x11ff48b12a216298b2f8efe8dc2f269c1e9f62917ae7ac83c92ff6aea3a2d2fc), + y: uint256(0x2df51751329a326d1374b05e3326d25e145fb20804d78127bf42146799959cd5) }), qDeltaRange: Honk.G1Point({ - x: uint256(0x02d0f736b422d74d9aa2ef26deedb67fdd2e798aae001c4292dabd2c5df31249), - y: uint256(0x0ae6265d6dcc9da8d3b23f088c6fb062c9be10bfa79e9d0463d4a7785ea4a5f9) + x: uint256(0x2c9fffb3a9f0da1f3f8f732cb0873b437cc1dc97a5d9730d19c31df4a1c1f540), + y: uint256(0x1118a1349f966cd8bb7b9557c059c3b936a5b189e8d56f75fffc6511adac2a09) }), qElliptic: Honk.G1Point({ - x: uint256(0x0ffa449a9d6e6c6f3e302eb3f16ce9d3d3711b9102ecf0e303ff91f3f9eb25f5), - y: uint256(0x095ef997439bccdd1234b2431a520823bcfe3e77f50190e66e70e2c51e906193) + x: uint256(0x2d05352c103814f8855acfda27603975ae3dcdb9b08592d4c999769d84047e0c), + y: uint256(0x15c7b3939f3108548006275aa6c62b4cc3095add5e1e463f2a3ab57eff4b9b3c) }), qAux: Honk.G1Point({ - x: uint256(0x09023d45c436e756762d8b3527cfcb3f694cdbafd192ccae59210740bdf03ad3), - y: uint256(0x020c9b591603814f1815038e25d1bb3fb85261bf699abfc8921f48954f0bc2b0) + x: uint256(0x1055198df3ec55ad61ff8c8f824bfc3cf74e459f46dd1c1d2ace45890e9b80fb), + y: uint256(0x07725ad2b53ee322b94db4b28baefdbd7239bf4d9c2e9e0d9565bfda8954a380) }), qLookup: Honk.G1Point({ - x: uint256(0x08c0d34ca72136661975f3b1ad658bfda38661b9ff320b60e2974496e03fd62e), - y: uint256(0x236caf48f4c3a7ca207f5c0ec75f304657e49780015cf40ff9be37f8ba3c6624) + x: uint256(0x0a15b7287881191263af5654587121b7c5db6c7fe8d390ab0454d0996a0b184b), + y: uint256(0x2b5b0486da55ab0a673f7ca8d0fb5400a5462bef7a98730f34fe266bcf8b63ae) }), qPoseidon2External: Honk.G1Point({ - x: uint256(0x09d58ddd055d3d65b4f36a347c18c11956b7d43c4f15434ded62bdf1224ff37d), - y: uint256(0x3002f0782d68214149ae47ee94771a6509709499ca06a8421eeeae97ea37e2a9) + x: uint256(0x2c1c2ccda8b91666f7bd30eb4a992c3e4c729adcf73e008348e8c97083d56242), + y: uint256(0x2b418829be00d02f2e01a1fbf110420b328a44416e889990f1e81b735023ff1d) }), qPoseidon2Internal: Honk.G1Point({ - x: uint256(0x1d11dbf6b2ced628ad64ea9d8afef60b6ea2e246160b6525915eb0ab7bdc94aa), - y: uint256(0x1ecef8438441a2565ee641757bdc6739da7389d913453eee0aaac561fb08495c) + x: uint256(0x1f60a709d42d5e2c7b406365072a764300c610a5a8d2be21f9a0242dde7bd485), + y: uint256(0x2c5af44525879b9580e7687e6a93dd55fd6aa9251d90a5c2c4fc0ea971e1448b) }), s1: Honk.G1Point({ - x: uint256(0x105eb99bfd557812572f2a5ec5b6eff27375b4ed5ce4e7a9649fe3038cfacbac), - y: uint256(0x1efd910252f319f9c0dc21c7688b92d80fd0a8636f152e0d9c8e0afb5c9a6d2e) + x: uint256(0x1d9253a09df46bec5da04d4ef7839fd41bd2e97ae43ccfa143dc0d657fa85553), + y: uint256(0x12eba500137049f38ecfef8f8a8f061abfedbf4f832169375aafd290b8920667) }), s2: Honk.G1Point({ - x: uint256(0x2bbbf5e8a2f7feb08ee64585bf3da54db0da09b211f726adda93020a2ae23e56), - y: uint256(0x2a9e8e1c3850c66da60224163dc4846ea6f37ed48f9d6dfd40b450fa61081484) + x: uint256(0x108fa66ffac071a9a79c3798a54074139931be05a5b8c88596e354ff0c7977b9), + y: uint256(0x2ee653942fe48118b22616ff96b698dc5232a49ae5aaf33196af01d8cd783895) }), s3: Honk.G1Point({ - x: uint256(0x0d264ba46f4a7bafd0ba9d9f9f4827109e1da2cfdb11835b9fc65aaafe9f9f20), - y: uint256(0x0f9ff6e122bcacd091ffd98d8caf249ab216e9c784e667475e2184ed34892272) + x: uint256(0x0e5e0e66b8d82ab97c3a4101da87d1457dfe38d8d781cd54d6a51fc4ed80fb5f), + y: uint256(0x1247d037ee1a73c1772120a83c697906102abd709365442c3057ad2f640e015f) }), s4: Honk.G1Point({ - x: uint256(0x2556809f13dc85764a5e4ea8fda1bbba54f36dad477124915fc8c198db16f496), - y: uint256(0x27461805fb3a7ee919331973984491c36cc83eee61d3664d5319922902327750) + x: uint256(0x1cf115e956940f5beeb730452473c79f981e974cc1fd2dd4811f4de693860f24), + y: uint256(0x1a64f5ff7c28626ff23e5ae82e45f30158fc7dfd23487ad97ea9bb8b5b66e18d) }), t1: Honk.G1Point({ - x: uint256(0x1ddc9ef86584375e5998d9f6fc16a4e646dc315ab86b477abc2f18a723dc24f6), - y: uint256(0x03a3b132ca6590c4ffdf35e1acd932da680a4247a55c88dd2284af78cb047906) + x: uint256(0x2467210c5e67f86104a38488eff67d1252b8dc1de9c1f589ff66bfd5a4de1ed6), + y: uint256(0x2126dbe4e3ee0d2240507870a9d85f0d90490efd7c69070f65a31dbff731889f) }), t2: Honk.G1Point({ - x: uint256(0x1e4cde3e410660193bacdf1db498ffb6bf1618c4d7b355415858d7d996e8bd03), - y: uint256(0x18d7f0300f961521ead0cb3c81a2a43a2dea0fdcb17bd772aef6c7b908be4273) + x: uint256(0x0c6e576e4ea74b4a4b2c70c36633e7c2d25222fa692417d283831aa00a578825), + y: uint256(0x061c370923246a520c238c6cc2442ce9c0790350438fc20d0371682e92fda4e7) }), t3: Honk.G1Point({ - x: uint256(0x0e77f28b07af551fea1ad81b304fd41013850e8b3539309c20bb2fa115289642), - y: uint256(0x15f92fde2f0d7a77c27daeb397336220ffc07b99f710980253e84f8ae94afd4d) + x: uint256(0x10e110ee17259e7746e26e882567409aad3fda44ea148dc6195eadfb80dc3884), + y: uint256(0x23ac2d72dddf2f686d55cacac3d5503003d8a19acaab8d6cf00e3850600bf729) }), t4: Honk.G1Point({ - x: uint256(0x2285ea4116ca00b673b2daadf596052b6d9ba6d231a4bea8af5a3c0f28c44aa4), - y: uint256(0x076bf1e1f682badebfca083e25d808e8dae96372631c0721a7ee238c333a862a) + x: uint256(0x299f1dfcb8b0b56691dd560e5ee9f73c4d07fac967de3ecbbd0769128209cb9f), + y: uint256(0x01598d24dc1b7a351ac26c8ca4d1d7539ef9b9252f7e664648f36adc1deed9ca) }), id1: Honk.G1Point({ - x: uint256(0x0b034b231d25a2e152b830397a59c97e02175212a6c5ce00129625cfb2e5c53d), - y: uint256(0x22e1842515d4569ca06477f4b2685d0a767bfa1eecca343c889840af8c086db9) + x: uint256(0x1a0412e7de1e53ce0c0ccefc666cac1ae83945594a7aaf807e964415a11f00db), + y: uint256(0x2526a8a84a5f7d557379a155d0a8d9dade32a096cd81914029722c685fe420a9) }), id2: Honk.G1Point({ - x: uint256(0x0e82a73cd55280503e70d5bdd855071d202ff65f31a65996955a7661775ff290), - y: uint256(0x1325a665dfee8e1247f3129ca943e12736f800afc1a9dcfa0476050b8e3c87f8) + x: uint256(0x2158c8dcf92c304cd203397b9868e636c7bde65e68883364c458f067acb8c2b4), + y: uint256(0x08ba19108eabee284eccb6e86b4a8837fb36841af7da73e7979eea7d4f2dbe0b) }), id3: Honk.G1Point({ - x: uint256(0x2ad12a1238e051fba16108022b5e58bba1fc7966fe759016a93fae5397e8c403), - y: uint256(0x257cfc281b0135bb8dfb0df6a7b69ca39835af544007eb61ace84ce7014c1fea) + x: uint256(0x211a0d1167642ab55fa62b879782796fb8cd2809c658b45f62d528b5d5b34311), + y: uint256(0x05dab9a3e4d2f01fb9d44a9aefd0fc4565111bb73d25417bc00e0f7969b5e9a0) }), id4: Honk.G1Point({ - x: uint256(0x058bf4de2f71f4d2e11235d140d05db461fb50d8aef64c8c52e2c0f57438dcce), - y: uint256(0x1e90ce7ec8cca2e65d7deafb655e6c7b0c4b964cd2cb1e5b4ef5ad78ab2f4b46) + x: uint256(0x0a53a26d1390a734dd02a7b004ef88102974600e3baa15ec2e461c79ff9b8ca2), + y: uint256(0x21c24911108ee0462b6033b27d7a6acf2c85cf766eaada84575d92e98c103446) }), lagrangeFirst: Honk.G1Point({ x: uint256(0x0000000000000000000000000000000000000000000000000000000000000001), y: uint256(0x0000000000000000000000000000000000000000000000000000000000000002) }), lagrangeLast: Honk.G1Point({ - x: uint256(0x28bf8c9eeae6946902ee08351768a3e4f67d812e6465f55f16bf69fad16cf46d), - y: uint256(0x12dab1c326b33ea63ec6651324077c0ea2cb0ddfafd63fb8f9fbcc70bd53d7e0) + x: uint256(0x27949ee1c2c701a8ee2e8c253ae9e3a429f03da04547f6e17fd7d0d27ae07689), + y: uint256(0x08e6579e77d56473d9b459c4265b407d29913310d4f155fd19348efe52bdd1d2) }) }); return vk; diff --git a/barretenberg/ts/CHANGELOG.md b/barretenberg/ts/CHANGELOG.md index 781197873f9..1758b9d134e 100644 --- a/barretenberg/ts/CHANGELOG.md +++ b/barretenberg/ts/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## [0.67.1](https://github.com/AztecProtocol/aztec-packages/compare/barretenberg.js-v0.67.0...barretenberg.js-v0.67.1) (2024-12-17) + + +### Features + +* PXE browser proving ([#10704](https://github.com/AztecProtocol/aztec-packages/issues/10704)) ([46da3cc](https://github.com/AztecProtocol/aztec-packages/commit/46da3cc8a9c1c407a8ad2857695eea794e334efd)) + + +### Bug Fixes + +* **bb.js:** Use globalThis instead of self ([#10747](https://github.com/AztecProtocol/aztec-packages/issues/10747)) ([309b5f7](https://github.com/AztecProtocol/aztec-packages/commit/309b5f74862089001e3159bdb52cbc8b60c71dc1)), closes [#10741](https://github.com/AztecProtocol/aztec-packages/issues/10741) +* Casting vk to rawbuffer before wasm so it reads from the correct offset ([#10769](https://github.com/AztecProtocol/aztec-packages/issues/10769)) ([6a5bcfd](https://github.com/AztecProtocol/aztec-packages/commit/6a5bcfd2dc1a2bef6df2b93e9afa137a9b4ea315)) + +## [0.67.0](https://github.com/AztecProtocol/aztec-packages/compare/barretenberg.js-v0.66.0...barretenberg.js-v0.67.0) (2024-12-13) + + +### Features + +* CIVC browser proveThenVerify ([#10431](https://github.com/AztecProtocol/aztec-packages/issues/10431)) ([8c064d4](https://github.com/AztecProtocol/aztec-packages/commit/8c064d484c686fdf00a100f65f1f740be4ef13cb)) +* Keccak honk proving in bb.js ([#10489](https://github.com/AztecProtocol/aztec-packages/issues/10489)) ([e0d7431](https://github.com/AztecProtocol/aztec-packages/commit/e0d743121674bcfdd73f84836c17645a5bc2df92)) + + +### Bug Fixes + +* Bump hard coded SRS size for wasm from 2^19 to 2^10 ([#10596](https://github.com/AztecProtocol/aztec-packages/issues/10596)) ([a37f82d](https://github.com/AztecProtocol/aztec-packages/commit/a37f82d2ed6a4512eb38f8fa576f52a06ddbdfba)) + ## [0.66.0](https://github.com/AztecProtocol/aztec-packages/compare/barretenberg.js-v0.65.2...barretenberg.js-v0.66.0) (2024-12-06) diff --git a/barretenberg/ts/package.json b/barretenberg/ts/package.json index d6995a1d921..b21aeede008 100644 --- a/barretenberg/ts/package.json +++ b/barretenberg/ts/package.json @@ -1,7 +1,7 @@ { "name": "@aztec/bb.js", "packageManager": "yarn@1.22.22", - "version": "0.66.0", + "version": "0.67.1", "homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/barretenberg/ts", "license": "MIT", "type": "module", @@ -53,7 +53,7 @@ }, "dependencies": { "comlink": "^4.4.1", - "commander": "^10.0.1", + "commander": "^12.1.0", "debug": "^4.3.4", "fflate": "^0.8.0", "pako": "^2.1.0", diff --git a/barretenberg/ts/src/barretenberg/backend.ts b/barretenberg/ts/src/barretenberg/backend.ts index df541aa7de3..546b6738f6b 100644 --- a/barretenberg/ts/src/barretenberg/backend.ts +++ b/barretenberg/ts/src/barretenberg/backend.ts @@ -255,7 +255,7 @@ export class UltraHonkBackend { await this.instantiate(); const vkBuf = vk ?? (await this.api.acirWriteVkUltraHonk(this.acirUncompressedBytecode, this.circuitOptions.recursive)); - return await this.api.acirHonkSolidityVerifier(this.acirUncompressedBytecode, vkBuf); + return await this.api.acirHonkSolidityVerifier(this.acirUncompressedBytecode, new RawBuffer(vkBuf)); } // TODO(https://github.com/noir-lang/noir/issues/5661): Update this to handle Honk recursive aggregation in the browser once it is ready in the backend itself diff --git a/barretenberg/ts/src/barretenberg/index.ts b/barretenberg/ts/src/barretenberg/index.ts index 4c8097bb89b..688759c18bb 100644 --- a/barretenberg/ts/src/barretenberg/index.ts +++ b/barretenberg/ts/src/barretenberg/index.ts @@ -69,7 +69,7 @@ export class Barretenberg extends BarretenbergApi { async initSRSClientIVC(): Promise { // crsPath can be undefined const crs = await Crs.new(2 ** 20 + 1, this.options.crsPath); - const grumpkinCrs = await GrumpkinCrs.new(2 ** 14 + 1, this.options.crsPath); + const grumpkinCrs = await GrumpkinCrs.new(2 ** 15 + 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. diff --git a/barretenberg/ts/src/barretenberg_wasm/helpers/browser/index.ts b/barretenberg/ts/src/barretenberg_wasm/helpers/browser/index.ts index d66fae16dc7..7803f9eb9a5 100644 --- a/barretenberg/ts/src/barretenberg_wasm/helpers/browser/index.ts +++ b/barretenberg/ts/src/barretenberg_wasm/helpers/browser/index.ts @@ -1,7 +1,7 @@ import { wrap } from 'comlink'; export function getSharedMemoryAvailable() { - const globalScope = typeof window !== 'undefined' ? window : self; + const globalScope = typeof window !== 'undefined' ? window : globalThis; return typeof SharedArrayBuffer !== 'undefined' && globalScope.crossOriginIsolated; } diff --git a/barretenberg/ts/src/random/browser/index.ts b/barretenberg/ts/src/random/browser/index.ts index 70d10d9f953..a79116d40a3 100644 --- a/barretenberg/ts/src/random/browser/index.ts +++ b/barretenberg/ts/src/random/browser/index.ts @@ -1,7 +1,7 @@ export const randomBytes = (len: number) => { const getWebCrypto = () => { if (typeof window !== 'undefined' && window.crypto) return window.crypto; - if (typeof self !== 'undefined' && self.crypto) return self.crypto; + if (typeof globalThis !== 'undefined' && globalThis.crypto) return globalThis.crypto; return undefined; }; diff --git a/barretenberg/ts/webpack.config.js b/barretenberg/ts/webpack.config.js index 02e509f256b..757b3db7212 100644 --- a/barretenberg/ts/webpack.config.js +++ b/barretenberg/ts/webpack.config.js @@ -39,6 +39,7 @@ export default { path: resolve(dirname(fileURLToPath(import.meta.url)), './dest/browser'), filename: 'index.js', module: true, + globalObject: 'globalThis', library: { type: 'module', }, diff --git a/barretenberg/ts/yarn.lock b/barretenberg/ts/yarn.lock index d375496453c..22aafa7eec4 100644 --- a/barretenberg/ts/yarn.lock +++ b/barretenberg/ts/yarn.lock @@ -38,7 +38,7 @@ __metadata: "@typescript-eslint/parser": ^5.54.1 buffer: ^6.0.3 comlink: ^4.4.1 - commander: ^10.0.1 + commander: ^12.1.0 copy-webpack-plugin: ^11.0.0 debug: ^4.3.4 eslint: ^8.35.0 @@ -2434,6 +2434,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 68e9818b00fc1ed9cdab9eb16905551c2b768a317ae69a5e3c43924c2b20ac9bb65b27e1cab36aeda7b6496376d4da908996ba2c0b5d79463e0fb1e77935d514 + languageName: node + linkType: hard + "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" diff --git a/boxes/boxes/vite/.env b/boxes/boxes/vite/.env new file mode 100644 index 00000000000..6f73ed0c33b --- /dev/null +++ b/boxes/boxes/vite/.env @@ -0,0 +1 @@ +VITE_AZTEC_NODE_URL=http://localhost:8080 \ No newline at end of file diff --git a/boxes/boxes/vite/package.json b/boxes/boxes/vite/package.json index 2107b6c79ad..5d127569aef 100644 --- a/boxes/boxes/vite/package.json +++ b/boxes/boxes/vite/package.json @@ -16,6 +16,7 @@ "dependencies": { "@aztec/accounts": "portal:../../../yarn-project/accounts", "@aztec/aztec.js": "portal:../../../yarn-project/aztec.js", + "@aztec/bb-prover": "link:../../../yarn-project/bb-prover", "@aztec/circuit-types": "portal:../../../yarn-project/circuit-types", "@aztec/key-store": "link:../../../yarn-project/key-store", "@aztec/kv-store": "portal:../../../yarn-project/kv-store", @@ -31,18 +32,16 @@ "@eslint/js": "^9.13.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "@vitejs/plugin-react-swc": "^3.5.0", + "@vitejs/plugin-react-swc": "^3.7.2", "eslint": "^9.13.0", - "eslint-plugin-react-hooks": "^5.0.0", - "eslint-plugin-react-refresh": "^0.4.14", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.16", "globals": "^15.11.0", - "memfs": "^4.14.0", - "node-stdlib-browser": "^1.3.0", "typescript": "~5.6.2", "typescript-eslint": "^8.11.0", - "vite": "^5.4.10", - "vite-plugin-externalize-deps": "^0.8.0", + "vite": "^6.0.3", "vite-plugin-node-polyfills": "^0.22.0", + "vite-plugin-strip-block": "^1.0.1", "vite-plugin-top-level-await": "^1.4.4" } -} \ No newline at end of file +} diff --git a/boxes/boxes/vite/src/config.ts b/boxes/boxes/vite/src/config.ts index e17120a3fc5..734f450c80a 100644 --- a/boxes/boxes/vite/src/config.ts +++ b/boxes/boxes/vite/src/config.ts @@ -6,16 +6,21 @@ import { } from "@aztec/aztec.js"; import { BoxReactContractArtifact } from "../artifacts/BoxReact"; import { AccountManager } from "@aztec/aztec.js/account"; -import { SingleKeyAccountContract } from "@aztec/accounts/single_key"; +import { SchnorrAccountContract } from "@aztec/accounts/schnorr"; import { createAztecNodeClient } from "@aztec/aztec.js"; import { PXEService } from "@aztec/pxe/service"; import { PXEServiceConfig, getPXEServiceConfig } from "@aztec/pxe/config"; import { KVPxeDatabase } from "@aztec/pxe/database"; -import { TestPrivateKernelProver } from "@aztec/pxe/kernel_prover"; import { KeyStore } from "@aztec/key-store"; import { PrivateKernelProver } from "@aztec/circuit-types"; import { L2TipsStore } from "@aztec/kv-store/stores"; import { createStore } from "@aztec/kv-store/indexeddb"; +import { BBWasmPrivateKernelProver } from "@aztec/bb-prover/wasm"; + +process.env = Object.keys(import.meta.env).reduce((acc, key) => { + acc[key.replace("VITE_", "")] = import.meta.env[key]; + return acc; +}, {}); const SECRET_KEY = Fr.random(); @@ -24,29 +29,33 @@ export class PrivateEnv { accountContract; account: AccountManager; - constructor(private secretKey: Fr, private nodeURL: string) {} + constructor( + private secretKey: Fr, + private nodeURL: string, + ) {} async init() { const config = getPXEServiceConfig(); config.dataDirectory = "pxe"; const aztecNode = await createAztecNodeClient(this.nodeURL); - const proofCreator = new TestPrivateKernelProver(); + const proofCreator = new BBWasmPrivateKernelProver(16); this.pxe = await this.createPXEService(aztecNode, config, proofCreator); const encryptionPrivateKey = deriveMasterIncomingViewingSecretKey( - this.secretKey + this.secretKey, ); - this.accountContract = new SingleKeyAccountContract(encryptionPrivateKey); + this.accountContract = new SchnorrAccountContract(encryptionPrivateKey); this.account = new AccountManager( this.pxe, this.secretKey, - this.accountContract + this.accountContract, ); + await this.account.deploy().wait(); } async createPXEService( aztecNode: AztecNode, config: PXEServiceConfig, - proofCreator?: PrivateKernelProver + proofCreator?: PrivateKernelProver, ) { const l1Contracts = await aztecNode.getL1ContractAddresses(); const configWithContracts = { @@ -57,7 +66,7 @@ export class PrivateEnv { const store = await createStore( "pxe_data", configWithContracts, - createLogger("pxe:data:indexeddb") + createLogger("pxe:data:indexeddb"), ); const keyStore = new KeyStore(store); @@ -65,27 +74,26 @@ export class PrivateEnv { const db = await KVPxeDatabase.create(store); const tips = new L2TipsStore(store, "pxe"); - const server = new PXEService( + const pxe = new PXEService( keyStore, aztecNode, db, tips, proofCreator, - config + config, ); - await server.start(); - return server; + await pxe.init(); + return pxe; } async getWallet() { - // taking advantage that register is no-op if already registered return await this.account.register(); } } export const deployerEnv = new PrivateEnv( SECRET_KEY, - process.env.PXE_URL || "http://localhost:8080" + process.env.AZTEC_NODE_URL, ); const IGNORE_FUNCTIONS = [ @@ -94,5 +102,5 @@ const IGNORE_FUNCTIONS = [ "sync_notes", ]; export const filteredInterface = BoxReactContractArtifact.functions.filter( - (f) => !IGNORE_FUNCTIONS.includes(f.name) + (f) => !IGNORE_FUNCTIONS.includes(f.name), ); diff --git a/boxes/boxes/vite/src/contracts/src/main.nr b/boxes/boxes/vite/src/contracts/src/main.nr index f4924981e8e..6955a87ecb4 100644 --- a/boxes/boxes/vite/src/contracts/src/main.nr +++ b/boxes/boxes/vite/src/contracts/src/main.nr @@ -3,11 +3,9 @@ use dep::aztec::macros::aztec; #[aztec] contract BoxReact { use dep::aztec::{ - protocol_types::public_keys::OvpkM, - keys::getters::get_public_keys, - prelude::{AztecAddress, PrivateMutable, Map, NoteInterface, NoteHeader, Point}, encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, - macros::{storage::storage, functions::{private, public, initializer}} + macros::{functions::{initializer, private}, storage::storage}, + prelude::{AztecAddress, Map, PrivateMutable}, }; use dep::value_note::value_note::ValueNote; @@ -18,27 +16,27 @@ contract BoxReact { #[private] #[initializer] - fn constructor( - number: Field, - owner: AztecAddress - ) { + fn constructor(number: Field, owner: AztecAddress) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner); - let owner_ovpk_m = get_public_keys(owner).ovpk_m; - numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner, context.msg_sender())); + numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note( + &mut context, + owner, + context.msg_sender(), + )); } #[private] - fn setNumber( - number: Field, - owner: AztecAddress - ) { + fn setNumber(number: Field, owner: AztecAddress) { let numbers = storage.numbers; let mut new_number = ValueNote::new(number, owner); - let owner_ovpk_m = get_public_keys(owner).ovpk_m; - numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner, context.msg_sender())); + numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note( + &mut context, + owner, + context.msg_sender(), + )); } unconstrained fn getNumber(owner: AztecAddress) -> pub ValueNote { diff --git a/boxes/boxes/vite/vite.config.ts b/boxes/boxes/vite/vite.config.ts index eb101d8e821..ef09a7d9e67 100644 --- a/boxes/boxes/vite/vite.config.ts +++ b/boxes/boxes/vite/vite.config.ts @@ -2,6 +2,7 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import { PolyfillOptions, nodePolyfills } from "vite-plugin-node-polyfills"; import topLevelAwait from "vite-plugin-top-level-await"; +import stripBlock from "vite-plugin-strip-block"; // Unfortunate, but needed due to https://github.com/davidmyersdev/vite-plugin-node-polyfills/issues/81 // Suspected to be because of the yarn workspace setup, but not sure @@ -23,17 +24,19 @@ const nodePolyfillsFix = (options?: PolyfillOptions | undefined): Plugin => { // https://vite.dev/config/ export default defineConfig({ + server: { + headers: { + "Cross-Origin-Opener-Policy": "same-origin", + "Cross-Origin-Embedder-Policy": "require-corp", + }, + }, plugins: [ + stripBlock({ start: "testing-only-start", end: "testing-only-end" }), react(), - nodePolyfillsFix({ - overrides: { - fs: "memfs", - buffer: "buffer/", - }, - }), + nodePolyfillsFix({ include: ["buffer", "process", "path"] }), topLevelAwait(), ], optimizeDeps: { - exclude: ["@noir-lang/acvm_js", "@noir-lang/noirc_abi"], + exclude: ["@noir-lang/acvm_js", "@noir-lang/noirc_abi", "@aztec/bb-prover"], }, }); diff --git a/boxes/docker-compose.yml b/boxes/docker-compose.yml index b06cca7ebc8..a19c72fbc17 100644 --- a/boxes/docker-compose.yml +++ b/boxes/docker-compose.yml @@ -17,7 +17,6 @@ services: P2P_BLOCK_CHECK_INTERVAL_MS: 50 SEQ_TX_POLLING_INTERVAL_MS: 50 WS_BLOCK_CHECK_INTERVAL_MS: 50 - PXE_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 depends_on: - ethereum diff --git a/boxes/package.json b/boxes/package.json index a904d9b967b..7cd31f064ca 100644 --- a/boxes/package.json +++ b/boxes/package.json @@ -4,8 +4,8 @@ "version": "0.5.0", "type": "module", "scripts": { - "compile": "yarn workspaces foreach --exclude vite -A -v run compile", - "build": "yarn workspaces foreach --exclude vite -A -v run build", + "compile": "yarn workspaces foreach -A -v run compile", + "build": "yarn workspaces foreach -A -v run build", "install-browsers": "playwright install --with-deps", "publish": "yarn npm publish", "test": "vitest bin.test.js", @@ -43,4 +43,4 @@ "devDependencies": { "@playwright/test": "1.46.1" } -} \ No newline at end of file +} diff --git a/boxes/yarn.lock b/boxes/yarn.lock index 5be00301898..69d40a3842c 100644 --- a/boxes/yarn.lock +++ b/boxes/yarn.lock @@ -27,6 +27,12 @@ __metadata: languageName: node linkType: soft +"@aztec/bb-prover@link:../../../yarn-project/bb-prover::locator=vite%40workspace%3Aboxes%2Fvite": + version: 0.0.0-use.local + resolution: "@aztec/bb-prover@link:../../../yarn-project/bb-prover::locator=vite%40workspace%3Aboxes%2Fvite" + languageName: node + linkType: soft + "@aztec/builder@npm:latest": version: 0.63.1 resolution: "@aztec/builder@npm:0.63.1" @@ -553,6 +559,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/aix-ppc64@npm:0.24.0" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm64@npm:0.21.5" @@ -560,6 +573,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm64@npm:0.24.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-arm@npm:0.21.5" @@ -567,6 +587,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm@npm:0.24.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/android-x64@npm:0.21.5" @@ -574,6 +601,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-x64@npm:0.24.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-arm64@npm:0.21.5" @@ -581,6 +615,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-arm64@npm:0.24.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/darwin-x64@npm:0.21.5" @@ -588,6 +629,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-x64@npm:0.24.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-arm64@npm:0.21.5" @@ -595,6 +643,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-arm64@npm:0.24.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/freebsd-x64@npm:0.21.5" @@ -602,6 +657,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-x64@npm:0.24.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm64@npm:0.21.5" @@ -609,6 +671,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm64@npm:0.24.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-arm@npm:0.21.5" @@ -616,6 +685,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm@npm:0.24.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ia32@npm:0.21.5" @@ -623,6 +699,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ia32@npm:0.24.0" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-loong64@npm:0.21.5" @@ -630,6 +713,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-loong64@npm:0.24.0" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-mips64el@npm:0.21.5" @@ -637,6 +727,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-mips64el@npm:0.24.0" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-ppc64@npm:0.21.5" @@ -644,6 +741,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ppc64@npm:0.24.0" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-riscv64@npm:0.21.5" @@ -651,6 +755,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-riscv64@npm:0.24.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-s390x@npm:0.21.5" @@ -658,6 +769,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-s390x@npm:0.24.0" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/linux-x64@npm:0.21.5" @@ -665,6 +783,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-x64@npm:0.24.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/netbsd-x64@npm:0.21.5" @@ -672,6 +797,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/netbsd-x64@npm:0.24.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-arm64@npm:0.24.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/openbsd-x64@npm:0.21.5" @@ -679,6 +818,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-x64@npm:0.24.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/sunos-x64@npm:0.21.5" @@ -686,6 +832,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/sunos-x64@npm:0.24.0" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-arm64@npm:0.21.5" @@ -693,6 +846,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-arm64@npm:0.24.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-ia32@npm:0.21.5" @@ -700,6 +860,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-ia32@npm:0.24.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.21.5": version: 0.21.5 resolution: "@esbuild/win32-x64@npm:0.21.5" @@ -707,6 +874,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-x64@npm:0.24.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.1 resolution: "@eslint-community/eslint-utils@npm:4.4.1" @@ -1274,38 +1448,6 @@ __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: 88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb - 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": "npm:^1.1.1" - "@jsonjoy.com/util": "npm:^1.1.2" - hyperdyperid: "npm:^1.2.0" - thingies: "npm:^1.20.0" - peerDependencies: - tslib: 2 - checksum: cdf5cb567a7f2e703d4966a3e3a5f7f7b54ee40a2102aa0ede5c79bcf2060c8465d82f39de8583db4cf1d8415bec8e57dfb1156ef663567b846cdea45813d9d1 - 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: 0065ae12c4108d8aede01a479c8d2b5a39bce99e9a449d235befc753f57e8385d9c1115720529f26597840b7398d512898155423d9859fd638319fb0c827365d - languageName: node - linkType: hard - "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.5 resolution: "@leichtgewicht/ip-codec@npm:2.0.5" @@ -1541,6 +1683,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.28.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@rollup/rollup-android-arm64@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-android-arm64@npm:4.27.3" @@ -1548,6 +1697,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-android-arm64@npm:4.28.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-arm64@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-darwin-arm64@npm:4.27.3" @@ -1555,6 +1711,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.28.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-x64@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-darwin-x64@npm:4.27.3" @@ -1562,6 +1725,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-x64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.28.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-freebsd-arm64@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.3" @@ -1569,6 +1739,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.28.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-freebsd-x64@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-freebsd-x64@npm:4.27.3" @@ -1576,6 +1753,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-x64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.28.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3" @@ -1583,6 +1767,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-musleabihf@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.27.3" @@ -1590,6 +1781,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-musleabihf@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.28.1" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-gnu@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.27.3" @@ -1597,6 +1795,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.28.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-musl@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.27.3" @@ -1604,6 +1809,20 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-musl@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.28.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3" @@ -1611,6 +1830,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-gnu@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.27.3" @@ -1618,6 +1844,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.28.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-s390x-gnu@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.27.3" @@ -1625,6 +1858,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-s390x-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.28.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.27.3" @@ -1632,6 +1872,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.28.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-musl@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-linux-x64-musl@npm:4.27.3" @@ -1639,6 +1886,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.28.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.27.3" @@ -1646,6 +1900,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-arm64-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.28.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-ia32-msvc@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.27.3" @@ -1653,6 +1914,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-ia32-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.28.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-msvc@npm:4.27.3": version: 4.27.3 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.27.3" @@ -1660,6 +1928,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.28.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -2523,14 +2798,14 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react-swc@npm:^3.5.0": - version: 3.7.1 - resolution: "@vitejs/plugin-react-swc@npm:3.7.1" +"@vitejs/plugin-react-swc@npm:^3.7.2": + version: 3.7.2 + resolution: "@vitejs/plugin-react-swc@npm:3.7.2" dependencies: "@swc/core": "npm:^1.7.26" peerDependencies: - vite: ^4 || ^5 - checksum: 2d613e69c0d0b809c94df80ca2b0caf39c50f0b98aa1f8599fd086bc37dac1449898eb6572000e1c133313137cac93440c4cb0861e05820c78bd2c07a52e64a8 + vite: ^4 || ^5 || ^6 + checksum: 9b9a5e0540791ba96a9fe4e8b8146ab274edcc730315535705f20126d6dfaffe72ae474bac9904ce841976e1959b6ecffd047bb2f0b7abf4d85aae7fbfdd00ab languageName: node linkType: hard @@ -5052,6 +5327,89 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.24.0": + version: 0.24.0 + resolution: "esbuild@npm:0.24.0" + dependencies: + "@esbuild/aix-ppc64": "npm:0.24.0" + "@esbuild/android-arm": "npm:0.24.0" + "@esbuild/android-arm64": "npm:0.24.0" + "@esbuild/android-x64": "npm:0.24.0" + "@esbuild/darwin-arm64": "npm:0.24.0" + "@esbuild/darwin-x64": "npm:0.24.0" + "@esbuild/freebsd-arm64": "npm:0.24.0" + "@esbuild/freebsd-x64": "npm:0.24.0" + "@esbuild/linux-arm": "npm:0.24.0" + "@esbuild/linux-arm64": "npm:0.24.0" + "@esbuild/linux-ia32": "npm:0.24.0" + "@esbuild/linux-loong64": "npm:0.24.0" + "@esbuild/linux-mips64el": "npm:0.24.0" + "@esbuild/linux-ppc64": "npm:0.24.0" + "@esbuild/linux-riscv64": "npm:0.24.0" + "@esbuild/linux-s390x": "npm:0.24.0" + "@esbuild/linux-x64": "npm:0.24.0" + "@esbuild/netbsd-x64": "npm:0.24.0" + "@esbuild/openbsd-arm64": "npm:0.24.0" + "@esbuild/openbsd-x64": "npm:0.24.0" + "@esbuild/sunos-x64": "npm:0.24.0" + "@esbuild/win32-arm64": "npm:0.24.0" + "@esbuild/win32-ia32": "npm:0.24.0" + "@esbuild/win32-x64": "npm:0.24.0" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 9f1aadd8d64f3bff422ae78387e66e51a5e09de6935a6f987b6e4e189ed00fdc2d1bc03d2e33633b094008529c8b6e06c7ad1a9782fb09fec223bf95998c0683 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -5197,16 +5555,25 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^5.0.0": - version: 5.0.0 - resolution: "eslint-plugin-react-hooks@npm:5.0.0" +"eslint-plugin-react-hooks@npm:^5.1.0": + version: 5.1.0 + resolution: "eslint-plugin-react-hooks@npm:5.1.0" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - checksum: bcb74b421f32e4203a7100405b57aab85526be4461e5a1da01bc537969a30012d2ee209a2c2a6cac543833a27188ce1e6ad71e4628d0bb4a2e5365cad86c5002 + checksum: 37ef76e1d916d46ab8e93a596078efcf2162e2c653614437e0c54e31d02a5dadabec22802fab717effe257aeb4bdc20c2a710666a89ab1cf07e01e614dde75d8 languageName: node linkType: hard -"eslint-plugin-react-refresh@npm:^0.4.14, eslint-plugin-react-refresh@npm:^0.4.3": +"eslint-plugin-react-refresh@npm:^0.4.16": + version: 0.4.16 + resolution: "eslint-plugin-react-refresh@npm:0.4.16" + peerDependencies: + eslint: ">=8.40" + checksum: 0628d54b6cc6773a89252e2a7c82c7905a00dc8dc99a6ae2885a64f3b45bd3012a40cf9791ee24aa5dcf75665d8c8be4699845bbbf205cd0ef652702701a7865 + languageName: node + linkType: hard + +"eslint-plugin-react-refresh@npm:^0.4.3": version: 0.4.14 resolution: "eslint-plugin-react-refresh@npm:0.4.14" peerDependencies: @@ -6527,13 +6894,6 @@ __metadata: languageName: node linkType: hard -"hyperdyperid@npm:^1.2.0": - version: 1.2.0 - resolution: "hyperdyperid@npm:1.2.0" - checksum: 885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 - languageName: node - linkType: hard - "iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -8041,18 +8401,6 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^4.14.0": - version: 4.14.0 - resolution: "memfs@npm:4.14.0" - dependencies: - "@jsonjoy.com/json-pack": "npm:^1.0.3" - "@jsonjoy.com/util": "npm:^1.3.0" - tree-dump: "npm:^1.0.1" - tslib: "npm:^2.0.0" - checksum: d1de2e4b3c269f5b5f27b63f60bb8ea9ae5800843776e0bed4548f2957dcd55237ac5eab3a5ffe0d561a6be53e42c055a7bc79efc1613563b14e14c287ef3b0a - languageName: node - linkType: hard - "merge-descriptors@npm:1.0.3": version: 1.0.3 resolution: "merge-descriptors@npm:1.0.3" @@ -8508,7 +8856,7 @@ __metadata: languageName: node linkType: hard -"node-stdlib-browser@npm:^1.2.0, node-stdlib-browser@npm:^1.3.0": +"node-stdlib-browser@npm:^1.2.0": version: 1.3.0 resolution: "node-stdlib-browser@npm:1.3.0" dependencies: @@ -9221,7 +9569,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.29, postcss@npm:^8.4.33, postcss@npm:^8.4.43": +"postcss@npm:^8.4.29, postcss@npm:^8.4.33, postcss@npm:^8.4.43, postcss@npm:^8.4.49": version: 8.4.49 resolution: "postcss@npm:8.4.49" dependencies: @@ -9893,6 +10241,78 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.23.0": + version: 4.28.1 + resolution: "rollup@npm:4.28.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.28.1" + "@rollup/rollup-android-arm64": "npm:4.28.1" + "@rollup/rollup-darwin-arm64": "npm:4.28.1" + "@rollup/rollup-darwin-x64": "npm:4.28.1" + "@rollup/rollup-freebsd-arm64": "npm:4.28.1" + "@rollup/rollup-freebsd-x64": "npm:4.28.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.28.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.28.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.28.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.28.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.28.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-x64-musl": "npm:4.28.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.28.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.28.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.28.1" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 2d2d0433b7cb53153a04c7b406f342f31517608dc57510e49177941b9e68c30071674b83a0292ef1d87184e5f7c6d0f2945c8b3c74963074de10c75366fe2c14 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -10744,15 +11164,6 @@ __metadata: languageName: node linkType: hard -"thingies@npm:^1.20.0": - version: 1.21.0 - resolution: "thingies@npm:1.21.0" - peerDependencies: - tslib: ^2 - checksum: 7570ee855aecb73185a672ecf3eb1c287a6512bf5476449388433b2d4debcf78100bc8bfd439b0edd38d2bc3bfb8341de5ce85b8557dec66d0f27b962c9a8bc1 - languageName: node - linkType: hard - "thread-stream@npm:^2.6.0": version: 2.7.0 resolution: "thread-stream@npm:2.7.0" @@ -10887,15 +11298,6 @@ __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: d1d180764e9c691b28332dbd74226c6b6af361dfb1e134bb11e60e17cb11c215894adee50ffc578da5dcf546006693947be8b6665eb1269b56e2f534926f1c1f - languageName: node - linkType: hard - "ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": version: 1.4.0 resolution: "ts-api-utils@npm:1.4.0" @@ -11351,15 +11753,6 @@ __metadata: languageName: node linkType: hard -"vite-plugin-externalize-deps@npm:^0.8.0": - version: 0.8.0 - resolution: "vite-plugin-externalize-deps@npm:0.8.0" - peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - checksum: 0ed0d2a85f96e6470b700c1a598de9e3b189b186f7a3d05e4e945c0381bb2717dce5a40de5d6b485ec8e30f31ff33b17d56d487f618395d7b55ad7ef74d35ca3 - languageName: node - linkType: hard - "vite-plugin-node-polyfills@npm:^0.22.0": version: 0.22.0 resolution: "vite-plugin-node-polyfills@npm:0.22.0" @@ -11372,6 +11765,13 @@ __metadata: languageName: node linkType: hard +"vite-plugin-strip-block@npm:^1.0.1": + version: 1.0.1 + resolution: "vite-plugin-strip-block@npm:1.0.1" + checksum: 4302a035fbcaff8c5cfdffeedfd7c61d9b7198aeac1123cdadc00770db1d4828e7b780ce3a84106c786e771eb47c60289a694283c95702819f6f909c21bc3bbe + languageName: node + linkType: hard + "vite-plugin-top-level-await@npm:^1.4.4": version: 1.4.4 resolution: "vite-plugin-top-level-await@npm:1.4.4" @@ -11385,7 +11785,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0, vite@npm:^5.4.10": +"vite@npm:^5.0.0": version: 5.4.11 resolution: "vite@npm:5.4.11" dependencies: @@ -11428,12 +11828,65 @@ __metadata: languageName: node linkType: hard +"vite@npm:^6.0.3": + version: 6.0.3 + resolution: "vite@npm:6.0.3" + dependencies: + esbuild: "npm:^0.24.0" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.49" + rollup: "npm:^4.23.0" + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + bin: + vite: bin/vite.js + checksum: 764ebed14770426a638575b23a51127c630ace873999ab896b0184484d8107e7255cdf64cfb36c65c1ef1d583e44b70a1d14c0f05b89612e834a5806e3964475 + languageName: node + linkType: hard + "vite@workspace:boxes/vite": version: 0.0.0-use.local resolution: "vite@workspace:boxes/vite" dependencies: "@aztec/accounts": "portal:../../../yarn-project/accounts" "@aztec/aztec.js": "portal:../../../yarn-project/aztec.js" + "@aztec/bb-prover": "link:../../../yarn-project/bb-prover" "@aztec/circuit-types": "portal:../../../yarn-project/circuit-types" "@aztec/key-store": "link:../../../yarn-project/key-store" "@aztec/kv-store": "portal:../../../yarn-project/kv-store" @@ -11443,22 +11896,20 @@ __metadata: "@noir-lang/noirc_abi": "link:../../../noir/packages/noirc_abi" "@types/react": "npm:^18.3.12" "@types/react-dom": "npm:^18.3.1" - "@vitejs/plugin-react-swc": "npm:^3.5.0" + "@vitejs/plugin-react-swc": "npm:^3.7.2" buffer: "npm:^6.0.3" eslint: "npm:^9.13.0" - eslint-plugin-react-hooks: "npm:^5.0.0" - eslint-plugin-react-refresh: "npm:^0.4.14" + eslint-plugin-react-hooks: "npm:^5.1.0" + eslint-plugin-react-refresh: "npm:^0.4.16" globals: "npm:^15.11.0" - memfs: "npm:^4.14.0" - node-stdlib-browser: "npm:^1.3.0" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-toastify: "npm:^10.0.6" typescript: "npm:~5.6.2" typescript-eslint: "npm:^8.11.0" - vite: "npm:^5.4.10" - vite-plugin-externalize-deps: "npm:^0.8.0" + vite: "npm:^6.0.3" vite-plugin-node-polyfills: "npm:^0.22.0" + vite-plugin-strip-block: "npm:^1.0.1" vite-plugin-top-level-await: "npm:^1.4.4" languageName: unknown linkType: soft diff --git a/build-images/Earthfile b/build-images/Earthfile index 08664afe3f0..c9f8ab865ad 100644 --- a/build-images/Earthfile +++ b/build-images/Earthfile @@ -233,6 +233,7 @@ basebox: tmux \ vim \ zsh \ + inotify-tools \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # Install earthly. @@ -323,9 +324,9 @@ devbox: CMD ["/bin/zsh"] ARG TARGETARCH - SAVE IMAGE --push aztecprotocol/devbox:1.1-$TARGETARCH + SAVE IMAGE --push aztecprotocol/devbox:1.2-$TARGETARCH # Save it without the arch tag as this is what's referenced in devcontainer.json - SAVE IMAGE aztecprotocol/devbox:1.1 + SAVE IMAGE aztecprotocol/devbox:1.2 devbox-manifest: LET VERSION = 1.1 diff --git a/cspell.json b/cspell.json index 3059335afc2..3ed9bc44cf4 100644 --- a/cspell.json +++ b/cspell.json @@ -11,6 +11,7 @@ "asyncify", "auditability", "authwit", + "authwits", "Automine", "autonat", "autorun", @@ -275,11 +276,12 @@ "unexcluded", "unfinalised", "unprefixed", + "unshift", + "unshifted", + "unsynched", "unzipit", "updateable", "upperfirst", - "unshift", - "unshifted", "usecase", "usecases", "utxo", @@ -323,5 +325,7 @@ "lib", "*.cmake" ], - "flagWords": ["anonymous"] + "flagWords": [ + "anonymous" + ] } diff --git a/docs/docs/migration_notes.md b/docs/docs/migration_notes.md index f2a713587d9..b7817ae8bd7 100644 --- a/docs/docs/migration_notes.md +++ b/docs/docs/migration_notes.md @@ -6,11 +6,17 @@ keywords: [sandbox, aztec, notes, migration, updating, upgrading] Aztec is in full-speed development. Literally every version breaks compatibility with the previous ones. This page attempts to target errors and difficulties you might encounter when upgrading, and how to resolve them. -## TBD +## 0.67.1 + +### Noir contracts package no longer exposes artifacts as default export + +To reduce loading times, the package `@aztec/noir-contracts.js` no longer exposes all artifacts as its default export. Instead, it exposes a `ContractNames` variable with the list of all contract names available. To import a given artifact, use the corresponding export, such as `@aztec/noir-contracts.js/FPC`. + +## 0.67.0 ### L2 Gas limit of 6M enforced for public portion of TX -A 12M limit was previously enforced per-enqueued-public-call. The protocol now enforces a stricter limit that the entire public portion of a transaction consumes at most 6,000,000 L2 gas. +A 12M limit was previously enforced per-enqueued-public-call. The protocol now enforces a stricter limit that the entire public portion of a transaction consumes at most 6,000,000 L2 gas. ### [aztec.nr] Renamed `Header` and associated helpers @@ -24,10 +30,11 @@ The `Header` struct has been renamed to `BlockHeader`, and the `get_header()` fa ### Outgoing Events removed Previously, every event which was emitted included: + - Incoming Header (to convey the app contract address to the recipient) - Incoming Ciphertext (to convey the note contents to the recipient) - Outgoing Header (served as a backup, to convey the app contract address to the "outgoing viewer" - most likely the sender) -- Outgoing Ciphertext (served as a backup, encrypting the summetric key of the incoming ciphertext to the "outgoing viewer" - most likely the sender) +- Outgoing Ciphertext (served as a backup, encrypting the symmetric key of the incoming ciphertext to the "outgoing viewer" - most likely the sender) The latter two have been removed from the `.emit()` functions, so now only an Incoming Header and Incoming Ciphertext will be emitted. @@ -43,6 +50,7 @@ The `getOutgoingNotes` function is removed from the PXE interface. Some aztec.nr library methods' arguments are simplified to remove an `outgoing_viewer` parameter. E.g. `ValueNote::increment`, `ValueNote::decrement`, `ValueNote::decrement_by_at_most`, `EasyPrivateUint::add`, `EasyPrivateUint::sub`. Further changes are planned, so that: + - Outgoing ciphertexts (or any kind of abstract ciphertext) can be emitted by a contract, and on the other side discovered and then processed by the contract. - Headers will be removed, due to the new tagging scheme. diff --git a/docs/docs/reference/developer_references/sandbox_reference/sandbox-reference.md b/docs/docs/reference/developer_references/sandbox_reference/sandbox-reference.md index ce0f32341b5..d00ef025751 100644 --- a/docs/docs/reference/developer_references/sandbox_reference/sandbox-reference.md +++ b/docs/docs/reference/developer_references/sandbox_reference/sandbox-reference.md @@ -37,7 +37,6 @@ ARCHIVER_POLLING_INTERVAL_MS=50 P2P_BLOCK_CHECK_INTERVAL_MS=50 SEQ_TX_POLLING_INTERVAL_MS=50 WS_BLOCK_CHECK_INTERVAL_MS=50 -PXE_BLOCK_POLLING_INTERVAL_MS=50 ARCHIVER_VIEM_POLLING_INTERVAL_MS=500 ``` @@ -90,7 +89,6 @@ Variables like `TEST_ACCOUNTS` & `PXE_PORT` are valid here as described above. AZTEC_NODE_URL='http://localhost:8079' # The address of an Aztec Node URL that the PXE will connect to (default: http://localhost:8079) PXE_PORT=8080 # The port that the PXE will be listening to (default: 8080) TEST_ACCOUNTS='true' # Option to deploy 3 test account when sandbox starts. (default: true) -PXE_BLOCK_POLLING_INTERVAL_MS=50 # Interval to check for new L2 blocks. (default: 50) PXE_L2_STARTING_BLOCK=1 # L2 Block to start synching the PXE from (default: 1) ``` diff --git a/l1-contracts/src/core/Rollup.sol b/l1-contracts/src/core/Rollup.sol index 11ee424ba4d..2e6dedc15b2 100644 --- a/l1-contracts/src/core/Rollup.sol +++ b/l1-contracts/src/core/Rollup.sol @@ -44,7 +44,6 @@ import {MockVerifier} from "@aztec/mock/MockVerifier.sol"; import {Ownable} from "@oz/access/Ownable.sol"; import {IERC20} from "@oz/token/ERC20/IERC20.sol"; import {EIP712} from "@oz/utils/cryptography/EIP712.sol"; -import {Vm} from "forge-std/Vm.sol"; struct Config { uint256 aztecSlotDuration; @@ -59,6 +58,7 @@ struct Config { * @author Aztec Labs * @notice Rollup contract that is concerned about readability and velocity of development * not giving a damn about gas costs. + * @dev WARNING: This contract is VERY close to the size limit (500B at time of writing). */ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITestRollup { using SlotLib for Slot; @@ -80,6 +80,8 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes address public constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); bool public immutable IS_FOUNDRY_TEST; + // @note Always true, exists to override to false for testing only + bool public checkBlob = true; uint256 public immutable CLAIM_DURATION_IN_L2_SLOTS; uint256 public immutable L1_BLOCK_AT_GENESIS; @@ -148,7 +150,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes }); rollupStore.l1GasOracleValues = L1GasOracleValues({ pre: L1FeeData({baseFee: 1 gwei, blobFee: 1}), - post: L1FeeData({baseFee: block.basefee, blobFee: _getBlobBaseFee()}), + post: L1FeeData({baseFee: block.basefee, blobFee: ExtRollupLib.getBlobBaseFee(VM_ADDRESS)}), slotOfChange: LIFETIME }); } @@ -230,15 +232,18 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes * * @param _args - The arguments to propose the block * @param _signatures - Signatures from the validators + * // TODO(#9101): The below _body should be removed once we can extract blobs. It's only here so the archiver can extract tx effects. * @param _body - The body of the L2 block + * @param _blobInput - The blob evaluation KZG proof, challenge, and opening required for the precompile. */ function proposeAndClaim( ProposeArgs calldata _args, Signature[] memory _signatures, bytes calldata _body, + bytes calldata _blobInput, SignedEpochProofQuote calldata _quote ) external override(IRollup) { - propose(_args, _signatures, _body); + propose(_args, _signatures, _body, _blobInput); claimEpochProofRight(_quote); } @@ -260,6 +265,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes * _epochSize - The size of the epoch (to be promoted to a constant) * _args - Array of public inputs to the proof (previousArchive, endArchive, previousBlockHash, endBlockHash, endTimestamp, outHash, proverId) * _fees - Array of recipient-value pairs with fees to be distributed for the epoch + * _blobPublicInputs - The blob public inputs for the proof * _aggregationObject - The aggregation object for the proof * _proof - The proof to verify */ @@ -346,10 +352,11 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes uint256 _epochSize, bytes32[7] calldata _args, bytes32[] calldata _fees, + bytes calldata _blobPublicInputs, bytes calldata _aggregationObject ) external view override(IRollup) returns (bytes32[] memory) { return ExtRollupLib.getEpochProofPublicInputs( - rollupStore, _epochSize, _args, _fees, _aggregationObject + rollupStore, _epochSize, _args, _fees, _blobPublicInputs, _aggregationObject ); } @@ -400,6 +407,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes * @param _signatures - The signatures to validate * @param _digest - The digest to validate * @param _currentTime - The current time + * @param _blobsHash - The blobs hash for this block * @param _flags - The flags to validate */ function validateHeader( @@ -407,16 +415,33 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes Signature[] memory _signatures, bytes32 _digest, Timestamp _currentTime, - bytes32 _txsEffectsHash, + bytes32 _blobsHash, DataStructures.ExecutionFlags memory _flags ) external view override(IRollup) { - uint256 manaBaseFee = getManaBaseFeeAt(_currentTime, true); - Header memory header = ExtRollupLib.decodeHeader(_header); _validateHeader( - header, _signatures, _digest, _currentTime, manaBaseFee, _txsEffectsHash, _flags + ExtRollupLib.decodeHeader(_header), + _signatures, + _digest, + _currentTime, + getManaBaseFeeAt(_currentTime, true), + _blobsHash, + _flags ); } + /** + * @notice Validate blob transactions against given inputs. + * @dev Only exists here for gas estimation. + */ + function validateBlobs(bytes calldata _blobsInput) + external + view + override(IRollup) + returns (bytes32, bytes32) + { + return ExtRollupLib.validateBlobs(_blobsInput, checkBlob); + } + /** * @notice Get the next epoch that can be claimed * @dev Will revert if the epoch has already been claimed or if there is no epoch to prove @@ -436,15 +461,6 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes return epochToProve; } - function computeTxsEffectsHash(bytes calldata _body) - external - pure - override(IRollup) - returns (bytes32) - { - return ExtRollupLib.computeTxsEffectsHash(_body); - } - function claimEpochProofRight(SignedEpochProofQuote calldata _quote) public override(IRollup) { validateEpochProofRightClaimAtTime(Timestamp.wrap(block.timestamp), _quote); @@ -475,21 +491,26 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes * * @param _args - The arguments to propose the block * @param _signatures - Signatures from the validators - * @param _body - The body of the L2 block + * // TODO(#9101): The below _body should be removed once we can extract blobs. It's only here so the archiver can extract tx effects. + * @param - The body of the L2 block + * @param _blobInput - The blob evaluation KZG proof, challenge, and opening required for the precompile. */ - function propose(ProposeArgs calldata _args, Signature[] memory _signatures, bytes calldata _body) - public - override(IRollup) - { + function propose( + ProposeArgs calldata _args, + Signature[] memory _signatures, + // TODO(#9101): Extract blobs from beacon chain => remove below body input + bytes calldata, + bytes calldata _blobInput + ) public override(IRollup) { if (canPrune()) { _prune(); } updateL1GasFeeOracle(); - // The `body` is passed outside the "args" as it does not directly need to be in the digest - // as long as the `txsEffectsHash` is included and matches what is in the header. - // Which we are checking in the `_validateHeader` call below. - bytes32 txsEffectsHash = ExtRollupLib.computeTxsEffectsHash(_body); + // Since an invalid blob hash here would fail the consensus checks of + // the header, the `blobInput` is implicitly accepted by consensus as well. + (bytes32 blobsHash, bytes32 blobPublicInputsHash) = + ExtRollupLib.validateBlobs(_blobInput, checkBlob); // Decode and validate header Header memory header = ExtRollupLib.decodeHeader(_args.header); @@ -504,34 +525,18 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes _digest: _args.digest(), _currentTime: Timestamp.wrap(block.timestamp), _manaBaseFee: manaBaseFee, - _txEffectsHash: txsEffectsHash, + _blobsHash: blobsHash, _flags: DataStructures.ExecutionFlags({ignoreDA: false, ignoreSignatures: false}) }); uint256 blockNumber = ++rollupStore.tips.pendingBlockNumber; { - FeeHeader memory parentFeeHeader = rollupStore.blocks[blockNumber - 1].feeHeader; - uint256 excessMana = IntRollupLib.computeExcessMana(parentFeeHeader); - - rollupStore.blocks[blockNumber] = BlockLog({ - archive: _args.archive, - blockHash: _args.blockHash, - slotNumber: Slot.wrap(header.globalVariables.slotNumber), - feeHeader: FeeHeader({ - excessMana: excessMana, - feeAssetPriceNumerator: parentFeeHeader.feeAssetPriceNumerator.clampedAdd( - _args.oracleInput.feeAssetPriceModifier - ), - manaUsed: header.totalManaUsed, - provingCostPerManaNumerator: parentFeeHeader.provingCostPerManaNumerator.clampedAdd( - _args.oracleInput.provingCostModifier - ), - congestionCost: components.congestionCost - }) - }); + rollupStore.blocks[blockNumber] = _toBlockLog(_args, blockNumber, components.congestionCost); } + rollupStore.blobPublicInputsHashes[blockNumber] = blobPublicInputsHash; + // @note The block number here will always be >=1 as the genesis block is at 0 { bytes32 inHash = INBOX.consume(blockNumber); @@ -544,8 +549,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes // TODO(#7218): Revert to fixed height tree for outbox, currently just providing min as interim // Min size = smallest path of the rollup tree + 1 (uint256 min,) = MerkleLib.computeMinMaxPathLength(header.contentCommitment.numTxs); - uint256 l2ToL1TreeMinHeight = min + 1; - OUTBOX.insert(blockNumber, header.contentCommitment.outHash, l2ToL1TreeMinHeight); + OUTBOX.insert(blockNumber, header.contentCommitment.outHash, min + 1); emit L2BlockProposed(blockNumber, _args.archive); @@ -585,7 +589,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes rollupStore.l1GasOracleValues.pre = rollupStore.l1GasOracleValues.post; rollupStore.l1GasOracleValues.post = - L1FeeData({baseFee: block.basefee, blobFee: _getBlobBaseFee()}); + L1FeeData({baseFee: block.basefee, blobFee: ExtRollupLib.getBlobBaseFee(VM_ADDRESS)}); rollupStore.l1GasOracleValues.slotOfChange = slot + LAG; } @@ -606,11 +610,9 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes override(IRollup) returns (L1FeeData memory) { - Slot slot = getSlotAt(_timestamp); - if (slot < rollupStore.l1GasOracleValues.slotOfChange) { - return rollupStore.l1GasOracleValues.pre; - } - return rollupStore.l1GasOracleValues.post; + return getSlotAt(_timestamp) < rollupStore.l1GasOracleValues.slotOfChange + ? rollupStore.l1GasOracleValues.pre + : rollupStore.l1GasOracleValues.post; } /** @@ -719,6 +721,15 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes return rollupStore.blocks[_blockNumber]; } + function getBlobPublicInputsHash(uint256 _blockNumber) + public + view + override(IRollup) + returns (bytes32) + { + return rollupStore.blobPublicInputsHashes[_blockNumber]; + } + function getEpochForBlock(uint256 _blockNumber) public view override(IRollup) returns (Epoch) { require( _blockNumber <= rollupStore.tips.pendingBlockNumber, @@ -752,10 +763,9 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes * @return bytes32 - The archive root of the block */ function archiveAt(uint256 _blockNumber) public view override(IRollup) returns (bytes32) { - if (_blockNumber <= rollupStore.tips.pendingBlockNumber) { - return rollupStore.blocks[_blockNumber].archive; - } - return bytes32(0); + return _blockNumber <= rollupStore.tips.pendingBlockNumber + ? rollupStore.blocks[_blockNumber].archive + : bytes32(0); } function canPrune() public view override(IRollup) returns (bool) { @@ -814,6 +824,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes * @param _signatures - The signatures for the attestations * @param _digest - The digest that signatures signed * @param _currentTime - The time of execution + * @param _blobsHash - The blobs hash for this block * @dev - This value is provided to allow for simple simulation of future * @param _flags - Flags specific to the execution, whether certain checks should be skipped */ @@ -823,7 +834,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes bytes32 _digest, Timestamp _currentTime, uint256 _manaBaseFee, - bytes32 _txEffectsHash, + bytes32 _blobsHash, DataStructures.ExecutionFlags memory _flags ) internal view { uint256 pendingBlockNumber = canPruneAtTime(_currentTime) @@ -835,7 +846,7 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes header: _header, currentTime: _currentTime, manaBaseFee: _manaBaseFee, - txsEffectsHash: _txEffectsHash, + blobsHash: _blobsHash, pendingBlockNumber: pendingBlockNumber, flags: _flags, version: VERSION, @@ -888,6 +899,31 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes _validateLeonidas(_slot, _signatures, _digest, _flags); } + // Helper to avoid stack too deep + function _toBlockLog(ProposeArgs calldata _args, uint256 _blockNumber, uint256 _congestionCost) + internal + view + returns (BlockLog memory) + { + FeeHeader memory parentFeeHeader = rollupStore.blocks[_blockNumber - 1].feeHeader; + return BlockLog({ + archive: _args.archive, + blockHash: _args.blockHash, + slotNumber: Slot.wrap(uint256(bytes32(_args.header[0x0194:0x01b4]))), + feeHeader: FeeHeader({ + excessMana: IntRollupLib.computeExcessMana(parentFeeHeader), + feeAssetPriceNumerator: parentFeeHeader.feeAssetPriceNumerator.clampedAdd( + _args.oracleInput.feeAssetPriceModifier + ), + manaUsed: uint256(bytes32(_args.header[0x0268:0x0288])), + provingCostPerManaNumerator: parentFeeHeader.provingCostPerManaNumerator.clampedAdd( + _args.oracleInput.provingCostModifier + ), + congestionCost: _congestionCost + }) + }); + } + function _fakeBlockNumberAsProven(uint256 _blockNumber) private { if ( _blockNumber > rollupStore.tips.provenBlockNumber @@ -912,19 +948,4 @@ contract Rollup is EIP712("Aztec Rollup", "1"), Ownable, Leonidas, IRollup, ITes } } } - - /** - * @notice Get the blob base fee - * - * @dev If we are in a foundry test, we use the cheatcode to get the blob base fee. - * Otherwise, we use the `block.blobbasefee` - * - * @return uint256 - The blob base fee - */ - function _getBlobBaseFee() private view returns (uint256) { - if (IS_FOUNDRY_TEST) { - return Vm(VM_ADDRESS).getBlobBaseFee(); - } - return block.blobbasefee; - } } diff --git a/l1-contracts/src/core/interfaces/IRollup.sol b/l1-contracts/src/core/interfaces/IRollup.sol index fb22590932e..44fd7963cdc 100644 --- a/l1-contracts/src/core/interfaces/IRollup.sol +++ b/l1-contracts/src/core/interfaces/IRollup.sol @@ -21,6 +21,7 @@ struct SubmitEpochRootProofArgs { uint256 epochSize; bytes32[7] args; bytes32[] fees; + bytes blobPublicInputs; bytes aggregationObject; bytes proof; } @@ -43,8 +44,11 @@ struct L1GasOracleValues { Slot slotOfChange; } +// The below blobPublicInputsHashes are filled when proposing a block, then used to verify an epoch proof. +// TODO(#8955): When implementing batched kzg proofs, store one instance per epoch rather than block struct RollupStore { mapping(uint256 blockNumber => BlockLog log) blocks; + mapping(uint256 blockNumber => bytes32) blobPublicInputsHashes; ChainTips tips; bytes32 vkTreeRoot; bytes32 protocolContractTreeRoot; @@ -89,13 +93,18 @@ interface IRollup { function claimEpochProofRight(SignedEpochProofQuote calldata _quote) external; - function propose(ProposeArgs calldata _args, Signature[] memory _signatures, bytes calldata _body) - external; + function propose( + ProposeArgs calldata _args, + Signature[] memory _signatures, + bytes calldata _body, + bytes calldata _blobInput + ) external; function proposeAndClaim( ProposeArgs calldata _args, Signature[] memory _signatures, bytes calldata _body, + bytes calldata _blobInput, SignedEpochProofQuote calldata _quote ) external; @@ -108,7 +117,7 @@ interface IRollup { Signature[] memory _signatures, bytes32 _digest, Timestamp _currentTime, - bytes32 _txsEffecstHash, + bytes32 _blobsHash, DataStructures.ExecutionFlags memory _flags ) external view; @@ -148,6 +157,7 @@ interface IRollup { function canPruneAtTime(Timestamp _ts) external view returns (bool); function getProvenBlockNumber() external view returns (uint256); function getPendingBlockNumber() external view returns (uint256); + function getBlobPublicInputsHash(uint256 _blockNumber) external view returns (bytes32); function getEpochToProve() external view returns (Epoch); function getClaimableEpoch() external view returns (Epoch); function validateEpochProofRightClaimAtTime(Timestamp _ts, SignedEpochProofQuote calldata _quote) @@ -158,7 +168,8 @@ interface IRollup { uint256 _epochSize, bytes32[7] calldata _args, bytes32[] calldata _fees, + bytes calldata _blobPublicInputs, bytes calldata _aggregationObject ) external view returns (bytes32[] memory); - function computeTxsEffectsHash(bytes calldata _body) external pure returns (bytes32); + function validateBlobs(bytes calldata _blobsInputs) external view returns (bytes32, bytes32); } diff --git a/l1-contracts/src/core/libraries/ConstantsGen.sol b/l1-contracts/src/core/libraries/ConstantsGen.sol index f9a9435bf8b..6e274c79760 100644 --- a/l1-contracts/src/core/libraries/ConstantsGen.sol +++ b/l1-contracts/src/core/libraries/ConstantsGen.sol @@ -90,8 +90,9 @@ library Constants { uint256 internal constant FUNCTION_SELECTOR_NUM_BYTES = 4; uint256 internal constant INITIALIZATION_SLOT_SEPARATOR = 1000000000; uint256 internal constant INITIAL_L2_BLOCK_NUM = 1; + uint256 internal constant FIELDS_PER_BLOB = 4096; + uint256 internal constant BLOBS_PER_BLOCK = 3; uint256 internal constant PRIVATE_LOG_SIZE_IN_FIELDS = 18; - uint256 internal constant BLOB_SIZE_IN_BYTES = 126976; uint256 internal constant AZTEC_MAX_EPOCH_DURATION = 48; uint256 internal constant GENESIS_ARCHIVE_ROOT = 1002640778211850180189505934749257244705296832326768971348723156503780793518; @@ -137,7 +138,7 @@ library Constants { uint256 internal constant AZTEC_ADDRESS_LENGTH = 1; uint256 internal constant GAS_FEES_LENGTH = 2; uint256 internal constant GAS_LENGTH = 2; - uint256 internal constant GAS_SETTINGS_LENGTH = 6; + uint256 internal constant GAS_SETTINGS_LENGTH = 8; uint256 internal constant CALL_CONTEXT_LENGTH = 4; uint256 internal constant CONTENT_COMMITMENT_LENGTH = 4; uint256 internal constant CONTRACT_INSTANCE_LENGTH = 16; @@ -148,6 +149,10 @@ library Constants { uint256 internal constant FUNCTION_LEAF_PREIMAGE_LENGTH = 5; uint256 internal constant GLOBAL_VARIABLES_LENGTH = 9; uint256 internal constant APPEND_ONLY_TREE_SNAPSHOT_LENGTH = 2; + uint256 internal constant APPEND_ONLY_TREE_SNAPSHOT_LENGTH_BYTES = 36; + uint256 internal constant SPONGE_BLOB_LENGTH = 11; + uint256 internal constant BLOB_PUBLIC_INPUTS = 6; + uint256 internal constant BLOB_PUBLIC_INPUTS_BYTES = 112; uint256 internal constant L1_TO_L2_MESSAGE_LENGTH = 6; uint256 internal constant L2_TO_L1_MESSAGE_LENGTH = 3; uint256 internal constant SCOPED_L2_TO_L1_MESSAGE_LENGTH = 4; @@ -175,33 +180,34 @@ library Constants { uint256 internal constant ROLLUP_VALIDATION_REQUESTS_LENGTH = 2; uint256 internal constant STATE_REFERENCE_LENGTH = 8; uint256 internal constant TREE_SNAPSHOTS_LENGTH = 8; - uint256 internal constant TX_CONTEXT_LENGTH = 8; - uint256 internal constant TX_REQUEST_LENGTH = 12; + uint256 internal constant TX_CONTEXT_LENGTH = 10; + uint256 internal constant TX_REQUEST_LENGTH = 14; uint256 internal constant TOTAL_FEES_LENGTH = 1; uint256 internal constant TOTAL_MANA_USED_LENGTH = 1; uint256 internal constant BLOCK_HEADER_LENGTH = 25; - uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 739; + uint256 internal constant BLOCK_HEADER_LENGTH_BYTES = 648; + uint256 internal constant PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 741; uint256 internal constant PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 867; - uint256 internal constant PRIVATE_CONTEXT_INPUTS_LENGTH = 38; + uint256 internal constant PRIVATE_CONTEXT_INPUTS_LENGTH = 40; uint256 internal constant FEE_RECIPIENT_LENGTH = 2; uint256 internal constant AGGREGATION_OBJECT_LENGTH = 16; uint256 internal constant SCOPED_READ_REQUEST_LEN = 3; uint256 internal constant PUBLIC_DATA_READ_LENGTH = 3; uint256 internal constant PRIVATE_VALIDATION_REQUESTS_LENGTH = 772; uint256 internal constant COMBINED_ACCUMULATED_DATA_LENGTH = 902; - uint256 internal constant TX_CONSTANT_DATA_LENGTH = 35; - uint256 internal constant COMBINED_CONSTANT_DATA_LENGTH = 44; + uint256 internal constant TX_CONSTANT_DATA_LENGTH = 37; + uint256 internal constant COMBINED_CONSTANT_DATA_LENGTH = 46; uint256 internal constant PRIVATE_ACCUMULATED_DATA_LENGTH = 1412; - uint256 internal constant PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 2226; + uint256 internal constant PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 2229; uint256 internal constant PRIVATE_TO_PUBLIC_ACCUMULATED_DATA_LENGTH = 900; uint256 internal constant PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH = 160; uint256 internal constant NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS = 3; - uint256 internal constant PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1845; - uint256 internal constant KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 958; + uint256 internal constant PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1847; + uint256 internal constant KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 960; uint256 internal constant CONSTANT_ROLLUP_DATA_LENGTH = 13; - uint256 internal constant BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 31; - uint256 internal constant BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 122; - uint256 internal constant ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH = 108; + uint256 internal constant BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 52; + uint256 internal constant BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 986; + uint256 internal constant ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH = 972; uint256 internal constant GET_NOTES_ORACLE_RETURN_LENGTH = 674; uint256 internal constant NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; uint256 internal constant NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; @@ -214,9 +220,9 @@ library Constants { uint256 internal constant LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 64; uint256 internal constant NUM_MSGS_PER_BASE_PARITY = 4; uint256 internal constant NUM_BASE_PARITY_PER_ROOT_PARITY = 4; - uint256 internal constant RECURSIVE_PROOF_LENGTH = 463; - uint256 internal constant NESTED_RECURSIVE_PROOF_LENGTH = 463; - uint256 internal constant TUBE_PROOF_LENGTH = 463; + uint256 internal constant RECURSIVE_PROOF_LENGTH = 459; + uint256 internal constant NESTED_RECURSIVE_PROOF_LENGTH = 459; + uint256 internal constant TUBE_PROOF_LENGTH = 459; uint256 internal constant HONK_VERIFICATION_KEY_LENGTH_IN_FIELDS = 128; uint256 internal constant CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS = 143; uint256 internal constant MEM_TAG_FF = 0; @@ -271,6 +277,16 @@ library Constants { uint256 internal constant L2_GAS_PER_LOG_BYTE = 4; uint256 internal constant L2_GAS_PER_PRIVATE_LOG = 0; uint256 internal constant L2_GAS_PER_L2_TO_L1_MSG = 200; + uint256 internal constant TX_START_PREFIX = 8392562855083340404; + uint256 internal constant REVERT_CODE_PREFIX = 1; + uint256 internal constant TX_FEE_PREFIX = 2; + uint256 internal constant NOTES_PREFIX = 3; + uint256 internal constant NULLIFIERS_PREFIX = 4; + uint256 internal constant L2_L1_MSGS_PREFIX = 5; + uint256 internal constant PUBLIC_DATA_UPDATE_REQUESTS_PREFIX = 6; + uint256 internal constant PRIVATE_LOGS_PREFIX = 7; + uint256 internal constant UNENCRYPTED_LOGS_PREFIX = 8; + uint256 internal constant CONTRACT_CLASS_LOGS_PREFIX = 9; uint256 internal constant PROOF_TYPE_PLONK = 0; uint256 internal constant PROOF_TYPE_HONK = 1; uint256 internal constant PROOF_TYPE_OINK = 2; diff --git a/l1-contracts/src/core/libraries/Errors.sol b/l1-contracts/src/core/libraries/Errors.sol index 3b97bb534b5..ccc8198cc28 100644 --- a/l1-contracts/src/core/libraries/Errors.sol +++ b/l1-contracts/src/core/libraries/Errors.sol @@ -60,6 +60,9 @@ library Errors { error Rollup__InvalidProposedArchive(bytes32 expected, bytes32 actual); // 0x32532e73 error Rollup__InvalidTimestamp(Timestamp expected, Timestamp actual); // 0x3132e895 error Rollup__InvalidVersion(uint256 expected, uint256 actual); // 0x9ef30794 + error Rollup__InvalidBlobHash(bytes32 blobHash); // 0xc4a168c6 + error Rollup__InvalidBlobProof(bytes32 blobHash); // 0x5ca17bef + error Rollup__InvalidBlobPublicInputsHash(bytes32 expected, bytes32 actual); // 0xfe6b4994 error Rollup__NoEpochToProve(); // 0xcbaa3951 error Rollup__NonSequentialProving(); // 0x1e5be132 error Rollup__NotClaimingCorrectEpoch(Epoch expected, Epoch actual); // 0xf0e0744d @@ -77,10 +80,6 @@ library Errors { error Rollup__InvalidBasisPointFee(uint256 basisPointFee); // 0x4292d136 error Rollup__InvalidManaBaseFee(uint256 expected, uint256 actual); // 0x73b6d896 - //TxsDecoder - error TxsDecoder__InvalidLogsLength(uint256 expected, uint256 actual); // 0x829ca981 - error TxsDecoder__TxsTooLarge(uint256 expected, uint256 actual); // 0xc7d44a62 - // HeaderLib error HeaderLib__InvalidHeaderSize(uint256 expected, uint256 actual); // 0xf3ccb247 error HeaderLib__InvalidSlotNumber(Slot expected, Slot actual); // 0x09ba91ff diff --git a/l1-contracts/src/core/libraries/RollupLibs/BlobLib.sol b/l1-contracts/src/core/libraries/RollupLibs/BlobLib.sol new file mode 100644 index 00000000000..26fa02529f6 --- /dev/null +++ b/l1-contracts/src/core/libraries/RollupLibs/BlobLib.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright 2024 Aztec Labs. +pragma solidity >=0.8.27; + +import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; +import {Errors} from "@aztec/core/libraries/Errors.sol"; +import {Vm} from "forge-std/Vm.sol"; + +library BlobLib { + /** + * @notice Get the blob base fee + * + * @dev If we are in a foundry test, we use the cheatcode to get the blob base fee. + * Otherwise, we use the `block.blobbasefee` + * + * @return uint256 - The blob base fee + */ + function getBlobBaseFee(address _vmAddress) internal view returns (uint256) { + if (_vmAddress.code.length > 0) { + return Vm(_vmAddress).getBlobBaseFee(); + } + return block.blobbasefee; + } + + /** + * @notice Validate an L2 block's blobs and return the hashed blobHashes and public inputs. + * Input bytes: + * input[:1] - num blobs in block + * input[1:] - 192 * num blobs of the above _blobInput + * @param _blobsInput - The above bytes to verify a blob + */ + function validateBlobs(bytes calldata _blobsInput, bool _checkBlob) + internal + view + returns (bytes32 blobsHash, bytes32 blobPublicInputsHash) + { + // We cannot input the incorrect number of blobs below, as the blobsHash + // and epoch proof verification will fail. + uint8 numBlobs = uint8(_blobsInput[0]); + bytes32[] memory blobHashes = new bytes32[](numBlobs); + bytes memory blobPublicInputs; + for (uint256 i = 0; i < numBlobs; i++) { + // Add 1 for the numBlobs prefix + uint256 blobInputStart = i * 192 + 1; + // Since an invalid blob hash here would fail the consensus checks of + // the header, the `blobInput` is implicitly accepted by consensus as well. + blobHashes[i] = validateBlob(_blobsInput[blobInputStart:blobInputStart + 192], i, _checkBlob); + // We want to extract the 112 bytes we use for public inputs: + // * input[32:64] - z + // * input[64:96] - y + // * input[96:144] - commitment C + // Out of 192 bytes per blob. + blobPublicInputs = abi.encodePacked( + blobPublicInputs, + _blobsInput[blobInputStart + 32:blobInputStart + 32 + Constants.BLOB_PUBLIC_INPUTS_BYTES] + ); + } + // Return the hash of all z, y, and Cs, so we can use them in proof verification later + blobPublicInputsHash = sha256(blobPublicInputs); + // Hash the EVM blob hashes for the block header + blobsHash = Hash.sha256ToField(abi.encodePacked(blobHashes)); + } + + /** + * @notice Validate a blob. + * Input bytes: + * input[:32] - versioned_hash + * input[32:64] - z + * input[64:96] - y + * input[96:144] - commitment C + * input[144:192] - proof (a commitment to the quotient polynomial q(X)) + * - This can be relaxed to happen at the time of `submitProof` instead + * @notice Apparently there is no guarantee that the blobs will be processed in the order sent + * so the use of blobhash(_blobNumber) may fail in production + * @param _blobInput - The above bytes to verify a blob + */ + function validateBlob(bytes calldata _blobInput, uint256 _blobNumber, bool _checkBlob) + internal + view + returns (bytes32 blobHash) + { + if (!_checkBlob) { + return bytes32(_blobInput[0:32]); + } + assembly { + blobHash := blobhash(_blobNumber) + } + require(blobHash == bytes32(_blobInput[0:32]), Errors.Rollup__InvalidBlobHash(blobHash)); + + // Staticcall the point eval precompile https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile : + (bool success,) = address(0x0a).staticcall(_blobInput); + require(success, Errors.Rollup__InvalidBlobProof(blobHash)); + } +} diff --git a/l1-contracts/src/core/libraries/RollupLibs/EpochProofLib.sol b/l1-contracts/src/core/libraries/RollupLibs/EpochProofLib.sol index 6920c00cb4e..826afdb09ff 100644 --- a/l1-contracts/src/core/libraries/RollupLibs/EpochProofLib.sol +++ b/l1-contracts/src/core/libraries/RollupLibs/EpochProofLib.sol @@ -49,8 +49,25 @@ library EpochProofLib { Errors.Rollup__InvalidEpoch(_interimValues.startEpoch, _interimValues.epochToProve) ); + for (uint256 i = 0; i < _args.epochSize; i++) { + // This was moved from getEpochProofPublicInputs() due to stack too deep + uint256 blobOffset = i * Constants.BLOB_PUBLIC_INPUTS_BYTES + i; + uint8 blobsInBlock = uint8(_args.blobPublicInputs[blobOffset++]); + checkBlobPublicInputsHashes( + _args.blobPublicInputs, + _rollupStore.blobPublicInputsHashes[_interimValues.previousBlockNumber + i + 1], + blobOffset, + blobsInBlock + ); + } + bytes32[] memory publicInputs = getEpochProofPublicInputs( - _rollupStore, _args.epochSize, _args.args, _args.fees, _args.aggregationObject + _rollupStore, + _args.epochSize, + _args.args, + _args.fees, + _args.blobPublicInputs, + _args.aggregationObject ); require( @@ -144,6 +161,7 @@ library EpochProofLib { * @param _epochSize - The size of the epoch (to be promoted to a constant) * @param _args - Array of public inputs to the proof (previousArchive, endArchive, previousBlockHash, endBlockHash, endTimestamp, outHash, proverId) * @param _fees - Array of recipient-value pairs with fees to be distributed for the epoch + * @param _blobPublicInputs- The blob public inputs for the proof * @param _aggregationObject - The aggregation object for the proof */ function getEpochProofPublicInputs( @@ -151,6 +169,7 @@ library EpochProofLib { uint256 _epochSize, bytes32[7] calldata _args, bytes32[] calldata _fees, + bytes calldata _blobPublicInputs, bytes calldata _aggregationObject ) internal view returns (bytes32[] memory) { uint256 previousBlockNumber = _rollupStore.tips.provenBlockNumber; @@ -208,10 +227,11 @@ library EpochProofLib { // end_timestamp: u64, // end_block_number: Field, // out_hash: Field, - // fees: [FeeRecipient; Constants.AZTEC_EPOCH_DURATION], + // fees: [FeeRecipient; Constants.AZTEC_MAX_EPOCH_DURATION], // vk_tree_root: Field, // protocol_contract_tree_root: Field, - // prover_id: Field + // prover_id: Field, + // blob_public_inputs: [BlockBlobPublicInputs; Constants.AZTEC_MAX_EPOCH_DURATION], // <--This will be reduced to 1 if/when we implement multi-opening for blob verification // } // previous_archive.root: the previous archive tree root @@ -248,16 +268,45 @@ library EpochProofLib { for (uint256 i = 0; i < feesLength; i++) { publicInputs[9 + i] = _fees[i]; } - uint256 feesEnd = 9 + feesLength; + uint256 offset = 9 + feesLength; // vk_tree_root - publicInputs[feesEnd] = _rollupStore.vkTreeRoot; + publicInputs[offset] = _rollupStore.vkTreeRoot; + offset += 1; // protocol_contract_tree_root - publicInputs[feesEnd + 1] = _rollupStore.protocolContractTreeRoot; + publicInputs[offset] = _rollupStore.protocolContractTreeRoot; + offset += 1; // prover_id: id of current epoch's prover - publicInputs[feesEnd + 2] = _args[6]; + publicInputs[offset] = _args[6]; + offset += 1; + + // blob_public_inputs + uint256 blobOffset = 0; + for (uint256 i = 0; i < _epochSize; i++) { + uint8 blobsInBlock = uint8(_blobPublicInputs[blobOffset++]); + for (uint256 j = 0; j < Constants.BLOBS_PER_BLOCK; j++) { + if (j < blobsInBlock) { + // z + publicInputs[offset++] = bytes32(_blobPublicInputs[blobOffset:blobOffset += 32]); + // y + (publicInputs[offset++], publicInputs[offset++], publicInputs[offset++]) = + bytes32ToBigNum(bytes32(_blobPublicInputs[blobOffset:blobOffset += 32])); + // To fit into 2 fields, the commitment is split into 31 and 17 byte numbers + // See yarn-project/foundation/src/blob/index.ts -> commitmentToFields() + // TODO: The below left pads, possibly inefficiently + // c[0] + publicInputs[offset++] = + bytes32(uint256(uint248(bytes31(_blobPublicInputs[blobOffset:blobOffset += 31])))); + // c[1] + publicInputs[offset++] = + bytes32(uint256(uint136(bytes17(_blobPublicInputs[blobOffset:blobOffset += 17])))); + } else { + offset += Constants.BLOB_PUBLIC_INPUTS; + } + } + } // the block proof is recursive, which means it comes with an aggregation object // this snippet copies it into the public inputs needed for verification @@ -268,9 +317,52 @@ library EpochProofLib { assembly { part := calldataload(add(_aggregationObject.offset, mul(i, 32))) } - publicInputs[i + feesEnd + 3] = part; + publicInputs[i + Constants.ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH] = part; } return publicInputs; } + + /** + * Helper fn to prevent stack too deep. Checks blob public input hashes match for a block: + * @param _blobPublicInputs - The provided blob public inputs bytes array + * @param _blobPublicInputsHash - The stored blob public inputs hash + * @param _index - The index to start in _blobPublicInputs + * @param _blobsInBlock - The number of blobs in this block + */ + function checkBlobPublicInputsHashes( + bytes calldata _blobPublicInputs, + bytes32 _blobPublicInputsHash, + uint256 _index, + uint8 _blobsInBlock + ) internal pure { + bytes32 calcBlobPublicInputsHash = sha256( + abi.encodePacked( + _blobPublicInputs[_index:_index + Constants.BLOB_PUBLIC_INPUTS_BYTES * _blobsInBlock] + ) + ); + require( + calcBlobPublicInputsHash == _blobPublicInputsHash, + Errors.Rollup__InvalidBlobPublicInputsHash(_blobPublicInputsHash, calcBlobPublicInputsHash) + ); + } + + /** + * @notice Converts a BLS12 field element from bytes32 to a nr BigNum type + * The nr bignum type for BLS12 fields is encoded as 3 nr fields - see blob_public_inputs.ts: + * firstLimb = last 15 bytes; + * secondLimb = bytes 2 -> 17; + * thirdLimb = first 2 bytes; + * Used when verifying epoch proofs to gather blob specific public inputs. + * @param _input - The field in bytes32 + */ + function bytes32ToBigNum(bytes32 _input) + internal + pure + returns (bytes32 firstLimb, bytes32 secondLimb, bytes32 thirdLimb) + { + firstLimb = bytes32(uint256(uint120(bytes15(_input << 136)))); + secondLimb = bytes32(uint256(uint120(bytes15(_input << 16)))); + thirdLimb = bytes32(uint256(uint16(bytes2(_input)))); + } } diff --git a/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol b/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol index 4b51f8efef0..6100defd339 100644 --- a/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol +++ b/l1-contracts/src/core/libraries/RollupLibs/ExtRollupLib.sol @@ -10,6 +10,7 @@ import {IRewardDistributor} from "@aztec/governance/interfaces/IRewardDistributo import {IERC20} from "@oz/token/ERC20/IERC20.sol"; import {DataStructures} from "./../DataStructures.sol"; import {Slot, Epoch} from "./../TimeMath.sol"; +import {BlobLib} from "./BlobLib.sol"; import { EpochProofLib, SubmitEpochRootProofAddresses, @@ -18,7 +19,6 @@ import { import {SignedEpochProofQuote} from "./EpochProofQuoteLib.sol"; import {FeeMath, ManaBaseFeeComponents, FeeHeader, L1FeeData} from "./FeeMath.sol"; import {HeaderLib, Header} from "./HeaderLib.sol"; -import {TxsDecoder} from "./TxsDecoder.sol"; import {ValidationLib, ValidateHeaderArgs} from "./ValidationLib.sol"; // We are using this library such that we can more easily "link" just a larger external library // instead of a few smaller ones. @@ -96,18 +96,27 @@ library ExtRollupLib { uint256 _epochSize, bytes32[7] calldata _args, bytes32[] calldata _fees, + bytes calldata _blobPublicInputs, bytes calldata _aggregationObject ) external view returns (bytes32[] memory) { return EpochProofLib.getEpochProofPublicInputs( - _rollupStore, _epochSize, _args, _fees, _aggregationObject + _rollupStore, _epochSize, _args, _fees, _blobPublicInputs, _aggregationObject ); } - function decodeHeader(bytes calldata _header) external pure returns (Header memory) { - return HeaderLib.decode(_header); + function validateBlobs(bytes calldata _blobsInput, bool _checkBlob) + external + view + returns (bytes32 blobsHash, bytes32 blobPublicInputsHash) + { + return BlobLib.validateBlobs(_blobsInput, _checkBlob); + } + + function getBlobBaseFee(address _vmAddress) external view returns (uint256) { + return BlobLib.getBlobBaseFee(_vmAddress); } - function computeTxsEffectsHash(bytes calldata _body) external pure returns (bytes32) { - return TxsDecoder.decode(_body); + function decodeHeader(bytes calldata _header) external pure returns (Header memory) { + return HeaderLib.decode(_header); } } diff --git a/l1-contracts/src/core/libraries/RollupLibs/HeaderLib.sol b/l1-contracts/src/core/libraries/RollupLibs/HeaderLib.sol index 29021febbc3..4749622b992 100644 --- a/l1-contracts/src/core/libraries/RollupLibs/HeaderLib.sol +++ b/l1-contracts/src/core/libraries/RollupLibs/HeaderLib.sol @@ -41,7 +41,7 @@ struct GlobalVariables { struct ContentCommitment { uint256 numTxs; - bytes32 txsEffectsHash; + bytes32 blobsHash; bytes32 inHash; bytes32 outHash; } @@ -74,7 +74,7 @@ struct Header { * | 0x0020 | 0x04 | lastArchive.nextAvailableLeafIndex * | | | ContentCommitment { * | 0x0024 | 0x20 | numTxs - * | 0x0044 | 0x20 | txsEffectsHash + * | 0x0044 | 0x20 | blobsHash * | 0x0064 | 0x20 | inHash * | 0x0084 | 0x20 | outHash * | | | StateReference { @@ -106,7 +106,7 @@ struct Header { * | --- | --- | --- */ library HeaderLib { - uint256 private constant HEADER_LENGTH = 0x288; // Header byte length + uint256 private constant HEADER_LENGTH = Constants.BLOCK_HEADER_LENGTH_BYTES; // Header byte length /** * @notice Decodes the header @@ -128,7 +128,7 @@ library HeaderLib { // Reading ContentCommitment header.contentCommitment.numTxs = uint256(bytes32(_header[0x0024:0x0044])); - header.contentCommitment.txsEffectsHash = bytes32(_header[0x0044:0x0064]); + header.contentCommitment.blobsHash = bytes32(_header[0x0044:0x0064]); header.contentCommitment.inHash = bytes32(_header[0x0064:0x0084]); header.contentCommitment.outHash = bytes32(_header[0x0084:0x00a4]); @@ -165,78 +165,4 @@ library HeaderLib { return header; } - - function toFields(Header memory _header) internal pure returns (bytes32[] memory) { - bytes32[] memory fields = new bytes32[](25); - - // must match the order in the Header.getFields - fields[0] = _header.lastArchive.root; - fields[1] = bytes32(uint256(_header.lastArchive.nextAvailableLeafIndex)); - fields[2] = bytes32(_header.contentCommitment.numTxs); - fields[3] = _header.contentCommitment.txsEffectsHash; - fields[4] = _header.contentCommitment.inHash; - fields[5] = _header.contentCommitment.outHash; - fields[6] = _header.stateReference.l1ToL2MessageTree.root; - fields[7] = bytes32(uint256(_header.stateReference.l1ToL2MessageTree.nextAvailableLeafIndex)); - fields[8] = _header.stateReference.partialStateReference.noteHashTree.root; - fields[9] = bytes32( - uint256(_header.stateReference.partialStateReference.noteHashTree.nextAvailableLeafIndex) - ); - fields[10] = _header.stateReference.partialStateReference.nullifierTree.root; - fields[11] = bytes32( - uint256(_header.stateReference.partialStateReference.nullifierTree.nextAvailableLeafIndex) - ); - fields[12] = _header.stateReference.partialStateReference.publicDataTree.root; - fields[13] = bytes32( - uint256(_header.stateReference.partialStateReference.publicDataTree.nextAvailableLeafIndex) - ); - fields[14] = bytes32(_header.globalVariables.chainId); - fields[15] = bytes32(_header.globalVariables.version); - fields[16] = bytes32(_header.globalVariables.blockNumber); - fields[17] = bytes32(_header.globalVariables.slotNumber); - fields[18] = bytes32(_header.globalVariables.timestamp); - fields[19] = bytes32(uint256(uint160(_header.globalVariables.coinbase))); - fields[20] = bytes32(_header.globalVariables.feeRecipient); - fields[21] = bytes32(_header.globalVariables.gasFees.feePerDaGas); - fields[22] = bytes32(_header.globalVariables.gasFees.feePerL2Gas); - fields[23] = bytes32(_header.totalFees); - fields[24] = bytes32(_header.totalManaUsed); - // fail if the header structure has changed without updating this function - require( - fields.length == Constants.BLOCK_HEADER_LENGTH, - Errors.HeaderLib__InvalidHeaderSize(Constants.BLOCK_HEADER_LENGTH, fields.length) - ); - - return fields; - } - - // TODO(#7346): Currently using the below to verify block root proofs until batch rollups fully integrated. - // Once integrated, remove the below fn (not used anywhere else). - function toFields(GlobalVariables memory _globalVariables) - internal - pure - returns (bytes32[] memory) - { - bytes32[] memory fields = new bytes32[](Constants.GLOBAL_VARIABLES_LENGTH); - - fields[0] = bytes32(_globalVariables.chainId); - fields[1] = bytes32(_globalVariables.version); - fields[2] = bytes32(_globalVariables.blockNumber); - fields[3] = bytes32(_globalVariables.slotNumber); - fields[4] = bytes32(_globalVariables.timestamp); - fields[5] = bytes32(uint256(uint160(_globalVariables.coinbase))); - fields[6] = bytes32(_globalVariables.feeRecipient); - fields[7] = bytes32(_globalVariables.gasFees.feePerDaGas); - fields[8] = bytes32(_globalVariables.gasFees.feePerL2Gas); - - // fail if the header structure has changed without updating this function - // TODO(Miranda): Temporarily using this method and below error while block-root proofs are verified - // When we verify root proofs, this method can be removed => no need for separate named error - require( - fields.length == Constants.GLOBAL_VARIABLES_LENGTH, - Errors.HeaderLib__InvalidHeaderSize(Constants.BLOCK_HEADER_LENGTH, fields.length) - ); - - return fields; - } } diff --git a/l1-contracts/src/core/libraries/RollupLibs/TxsDecoder.sol b/l1-contracts/src/core/libraries/RollupLibs/TxsDecoder.sol deleted file mode 100644 index b3a12b47c2c..00000000000 --- a/l1-contracts/src/core/libraries/RollupLibs/TxsDecoder.sol +++ /dev/null @@ -1,513 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2024 Aztec Labs. -pragma solidity >=0.8.27; - -import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; -import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; -import {Errors} from "@aztec/core/libraries/Errors.sol"; - -/** - * @title Txs Decoder Library - * @author Aztec Labs - * @notice Decoding a L2 block body and computing the TxsHash. - * Concerned with readability and velocity of development not giving a damn about gas costs. - * @dev Assumes the input trees to be padded. - * - * ------------------- - * L2 Body Data Specification - * ------------------- - * | byte start | num bytes | name - * | --- | --- | --- - * | 0x0 | 0x4 | len(numTxs) (denoted t) - * | | | TxEffect 0 { - * | 0x4 | 0x1 | revertCode - * | 0x5 | 0x20 | transactionFee - * | 0x25 | 0x1 | len(noteHashes) (denoted b) - * | 0x25 + 0x1 | b * 0x20 | noteHashes - * | 0x25 + 0x1 + b * 0x20 | 0x1 | len(nullifiers) (denoted c) - * | 0x25 + 0x1 + b * 0x20 + 0x1 | c * 0x20 | nullifiers - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 | 0x1 | len(l2ToL1Msgs) (denoted d) - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 | d * 0x20 | l2ToL1Msgs - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 | 0x1 | len(publicDataUpdateRequests) (denoted e) - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 | e * 0x40 | publicDataUpdateRequests - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 | 0x1 | len(privateLogs) (denoted f) - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x01 | f * 0x240 | privateLogs - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x01 + f * 0x240 | 0x04 | byteLen(unencryptedLogs) (denoted g) - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x01 + f * 0x240 + g | g | unencryptedLogs - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 + f + 0x4 + g | 0x04 | byteLen(contractClassLogs) (denoted h) - * | 0x25 + 0x1 + b * 0x20 + 0x1 + c * 0x20 + 0x1 + d * 0x20 + 0x01 + e * 0x40 + 0x4 + f + 0x4 + g + 0x04| h | contractClassLogs - * | | | }, - * | | | TxEffect 1 { - * | | | ... - * | | | }, - * | | | ... - * | | | TxEffect (t - 1) { - * | | | ... - * | | | }, - */ -library TxsDecoder { - struct ArrayOffsets { - uint256 revertCode; - uint256 transactionFee; - uint256 noteHash; - uint256 nullifier; - uint256 l2ToL1Msgs; - uint256 publicData; - uint256 privateLogs; - uint256 unencryptedLogsLength; - uint256 contractClassLogsLength; - } - - struct Counts { - uint256 noteHash; - uint256 nullifier; - uint256 l2ToL1Msgs; - uint256 publicData; - uint256 privateLogs; - } - - // Note: Used in `computeConsumables` to get around stack too deep errors. - struct ConsumablesVars { - bytes32[] baseLeaves; - bytes baseLeaf; - uint256 kernelUnencryptedLogsLength; - uint256 kernelContractClassLogsLength; - bytes32 unencryptedLogsHash; - bytes32 contractClassLogsHash; - bytes32 txOutHash; - } - - /** - * @notice Computes txs effects hash - * @param _body - The L2 block body calldata. - * @return The txs effects hash. - */ - function decode(bytes calldata _body) internal pure returns (bytes32) { - ArrayOffsets memory offsets; - Counts memory counts; - ConsumablesVars memory vars; - uint256 offset = 0; - - uint32 numTxEffects = uint32(read4(_body, offset)); - uint256 numTxEffectsToPad = computeNumTxEffectsToPad(numTxEffects); - - offset += 0x4; - vars.baseLeaves = new bytes32[](numTxEffects + numTxEffectsToPad); - - // Data starts after header. Look at L2 Block Data specification at the top of this file. - { - for (uint256 i = 0; i < numTxEffects; i++) { - /* - * Compute the leaf to insert. - * Leaf_i = ( - * revertCode, - * transactionFee, - * noteHashesKernel, - * nullifiersKernel, - * txOutHash, |=> Computed below from l2tol1msgs - * publicDataUpdateRequestsKernel, - * privateLogsKernel, - * unencryptedLogsLength, - * unencryptedLogsHash, ____|=> Computed below from logs' preimages. - * ); - * Note that we always read data, the l2Block (atm) must therefore include dummy or zero-notes for - * Zero values. - */ - - // REVERT CODE - offsets.revertCode = offset; - offset += 0x1; - - // TX FEE - offsets.transactionFee = offset; - offset += 0x20; - - // NOTE HASHES - uint256 count = read1(_body, offset); - offset += 0x1; - counts.noteHash = count; - offsets.noteHash = offset; - offset += count * 0x20; // each note hash is 0x20 bytes long - - // NULLIFIERS - count = read1(_body, offset); - offset += 0x1; - counts.nullifier = count; - offsets.nullifier = offset; - offset += count * 0x20; // each nullifier is 0x20 bytes long - - // L2 TO L1 MESSAGES - count = read1(_body, offset); - offset += 0x1; - counts.l2ToL1Msgs = count; - offsets.l2ToL1Msgs = offset; - offset += count * 0x20; // each l2 to l1 message is 0x20 bytes long - - // PUBLIC DATA UPDATE REQUESTS - count = read1(_body, offset); - offset += 0x1; - counts.publicData = count; - offsets.publicData = offset; - offset += count * 0x40; // each public data update request is 0x40 bytes long - - // PRIVATE LOGS - count = read1(_body, offset); - offset += 0x1; - counts.privateLogs = count; - offsets.privateLogs = offset; - offset += count * 0x240; // each private log is 0x240 bytes long - - // UNENCRYPTED LOGS LENGTH - offsets.unencryptedLogsLength = offset; - offset += 0x20; - - // CONTRACT CLASS LOGS LENGTH - offsets.contractClassLogsLength = offset; - offset += 0x20; - - /** - * Compute unencrypted and contract class logs hashes corresponding to the current leaf. - * Note: will advance offsets by the number of bytes processed. - */ - // UNENCRYPTED LOGS HASH - (vars.unencryptedLogsHash, offset, vars.kernelUnencryptedLogsLength) = - computeKernelUnencryptedLogsHash(offset, _body, false); - // CONTRACT CLASS LOGS HASH - // Note: the logic for unenc. and contract class logs hashing is the same: - (vars.contractClassLogsHash, offset, vars.kernelContractClassLogsLength) = - computeKernelUnencryptedLogsHash(offset, _body, true); - // TX LEVEL OUT HASH - (vars.txOutHash) = computeTxOutHash(offsets.l2ToL1Msgs, _body); - - // We throw to ensure that the byte len we charge for DA gas in the kernels matches the actual chargable log byte len - // Without this check, the user may provide the kernels with a lower log len than reality - require( - uint256(bytes32(slice(_body, offsets.unencryptedLogsLength, 0x20))) - == vars.kernelUnencryptedLogsLength, - Errors.TxsDecoder__InvalidLogsLength( - uint256(bytes32(slice(_body, offsets.unencryptedLogsLength, 0x20))), - vars.kernelUnencryptedLogsLength - ) - ); - require( - uint256(bytes32(slice(_body, offsets.contractClassLogsLength, 0x20))) - == vars.kernelContractClassLogsLength, - Errors.TxsDecoder__InvalidLogsLength( - uint256(bytes32(slice(_body, offsets.contractClassLogsLength, 0x20))), - vars.kernelContractClassLogsLength - ) - ); - - // Insertions are split into multiple `bytes.concat` to work around stack too deep. - vars.baseLeaf = bytes.concat( - // pad the revert code to 32 bytes to match the hash preimage - bytes.concat( - sliceAndPadLeft(_body, offsets.revertCode, 0x1, 0x20), - slice(_body, offsets.transactionFee, 0x20) - ), - bytes.concat( - sliceAndPadRight( - _body, - offsets.noteHash, - counts.noteHash * 0x20, - Constants.NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP - ), - sliceAndPadRight( - _body, - offsets.nullifier, - counts.nullifier * 0x20, - Constants.NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP - ), - vars.txOutHash - ), - bytes.concat( - sliceAndPadRight( - _body, - offsets.publicData, - counts.publicData * 0x40, - Constants.PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP - ), - sliceAndPadRight( - _body, - offsets.privateLogs, - counts.privateLogs * 0x240, - Constants.PRIVATE_LOGS_NUM_BYTES_PER_BASE_ROLLUP - ) - ), - bytes.concat( - slice(_body, offsets.unencryptedLogsLength, 0x20), - slice(_body, offsets.contractClassLogsLength, 0x20) - ), - bytes.concat(vars.unencryptedLogsHash, vars.contractClassLogsHash) - ); - - vars.baseLeaves[i] = Hash.sha256ToField(vars.baseLeaf); - } - - // We pad base leaves with hashes of empty tx effect. - for (uint256 i = numTxEffects; i < vars.baseLeaves.length; i++) { - // Value taken from tx_effect.test.ts "hash of empty tx effect matches snapshot" test case - vars.baseLeaves[i] = hex"0038249b91f300ff56f2a8135be3bdb4fc493df5771061b67f2ab01b620b22b7"; - } - } - - return computeUnbalancedRoot(vars.baseLeaves); - } - - /** - * @notice Computes unencrypted or contract class logs hash as is done in the kernel circuits. - * @param _offsetInBlock - The offset of kernel's logs in a block. - * @param _body - The L2 block calldata. - * @return The hash of the logs and offset in a block after processing the logs. - * @dev See above for details. The only difference here is that unencrypted and contract class logs are - * siloed with their contract address. - */ - function computeKernelUnencryptedLogsHash( - uint256 _offsetInBlock, - bytes calldata _body, - bool _contractClassLogs - ) internal pure returns (bytes32, uint256, uint256) { - uint256 offset = _offsetInBlock; - uint256 remainingLogsLength = read4(_body, offset); - uint256 kernelLogsLength = remainingLogsLength; - offset += 0x4; - - bytes memory flattenedLogHashes; // The hash input - - // Iterate until all the logs were processed - while (remainingLogsLength > 0) { - // The length of the logs emitted by Aztec.nr from the function call corresponding to this kernel iteration - uint256 privateCircuitPublicInputLogsLength = read4(_body, offset); - offset += 0x4; - - // Decrease remaining logs length by this privateCircuitPublicInputsLogs's length (len(I?_LOGS)) and 4 bytes for I?_LOGS_LEN - remainingLogsLength -= (privateCircuitPublicInputLogsLength + 0x4); - - kernelLogsLength -= 0x4; - - while (privateCircuitPublicInputLogsLength > 0) { - uint256 singleCallLogsLength = read4(_body, offset); - offset += 0x4; - - bytes32 singleLogHash = Hash.sha256ToField(slice(_body, offset, singleCallLogsLength)); - // The first 32 bytes of an unencrypted log buffer are its address (see UnencryptedL2Log.toBuffer()) - bytes32 siloedLogHash = - Hash.sha256ToField(bytes.concat(slice(_body, offset, 0x20), singleLogHash)); - offset += singleCallLogsLength; - - flattenedLogHashes = bytes.concat(flattenedLogHashes, siloedLogHash); - - privateCircuitPublicInputLogsLength -= (singleCallLogsLength + 0x4); - } - } - - // Not having a 0 value hash for empty logs causes issues with empty txs used for padding. - if (flattenedLogHashes.length == 0) { - return (0, offset, 0); - } - - // padded to MAX_LOGS * 32 bytes - if (_contractClassLogs) { - flattenedLogHashes = bytes.concat( - flattenedLogHashes, - new bytes(Constants.MAX_CONTRACT_CLASS_LOGS_PER_TX * 32 - flattenedLogHashes.length) - ); - } else { - flattenedLogHashes = bytes.concat( - flattenedLogHashes, - new bytes(Constants.MAX_UNENCRYPTED_LOGS_PER_TX * 32 - flattenedLogHashes.length) - ); - } - - bytes32 kernelPublicInputsLogsHash = Hash.sha256ToField(flattenedLogHashes); - - return (kernelPublicInputsLogsHash, offset, kernelLogsLength); - } - - /** - * @notice Computes the root for a binary Merkle-tree given the leafs. - * @dev Uses sha256. - * @param _leafs - The 32 bytes leafs to build the tree of. - * @return The root of the Merkle tree. - */ - function computeRoot(bytes32[] memory _leafs) internal pure returns (bytes32) { - // @todo Must pad the tree - uint256 treeDepth = 0; - while (2 ** treeDepth < _leafs.length) { - treeDepth++; - } - uint256 treeSize = 2 ** treeDepth; - assembly { - mstore(_leafs, treeSize) - } - - for (uint256 i = 0; i < treeDepth; i++) { - for (uint256 j = 0; j < treeSize; j += 2) { - _leafs[j / 2] = Hash.sha256ToField(bytes.concat(_leafs[j], _leafs[j + 1])); - } - treeSize /= 2; - } - - return _leafs[0]; - } - - /** - * @notice Computes the root for a binary unbalanced Merkle-tree given the leaves. - * @dev Filled in greedily with subtrees. Useful for txsEffectsHash and outHash tree. - * @param _leaves - The 32 bytes leafs to build the tree of. - * @return The root of the Merkle tree. - */ - function computeUnbalancedRoot(bytes32[] memory _leaves) internal pure returns (bytes32) { - // e.g. an unbalanced tree of 7 txs will contain subtrees of 4, 2, and 1 tx(s) = 111 - // e.g. an unbalanced tree of 9 txs will contain subtrees of 8 and 1 tx(s) = 1001 - // We collect the roots of each subtree - bytes32 root; - uint256 currentSubtreeSize = 1; - uint256 numTxs = _leaves.length; - // We must calculate the smaller rightmost subtrees first, hence starting at 1 - while (numTxs != 0) { - // If size & txs == 0, the subtree doesn't exist for this number of txs - if (currentSubtreeSize & numTxs == 0) { - currentSubtreeSize <<= 1; - continue; - } - bytes32[] memory leavesInSubtree = new bytes32[](currentSubtreeSize); - uint256 start = numTxs - currentSubtreeSize; - for (uint256 i = start; i < numTxs; i++) { - leavesInSubtree[i - start] = _leaves[i]; - } - bytes32 subtreeRoot = computeRoot(leavesInSubtree); - root = - numTxs == _leaves.length ? subtreeRoot : Hash.sha256ToField(bytes.concat(subtreeRoot, root)); - numTxs -= currentSubtreeSize; - currentSubtreeSize <<= 1; - } - return root; - } - - /** - * @notice Computes the root for the binary variable height Merkle-tree made of one tx's L2 to L1 msgs. - * @dev Mimics compute_kernel_out_hash in base_rollup. - * TODO(#7218): Revert to fixed height tree for outbox - * @param _data - The blob of data containing l2 to l1 msgs. - * @return The root of the Merkle tree. - */ - function computeTxOutHash(uint256 _start, bytes calldata _data) internal pure returns (bytes32) { - uint256 offset = _start; - // The stored offsets.l2ToL1Msgs does not include the single byte storing the num of msgs, hence -1 - uint32 numMsgs = uint32(read1(_data, _start - 1)); - uint256 numMsgsToPad = computeNumMsgsToPad(uint32(numMsgs)); - bytes32[] memory leavesInMsgTree = new bytes32[](numMsgs + numMsgsToPad); - for (uint256 i = 0; i < numMsgs; i++) { - leavesInMsgTree[i] = bytes32(slice(_data, offset, 0x20)); - offset += 0x20; - } - bytes32 outHash = computeRoot(leavesInMsgTree); - return outHash; - } - - /** - * @notice Wrapper around the slicing to avoid some stack too deep - * @param _data - The data to slice - * @param _start - The start of the slice - * @param _length - The length of the slice - * @return The slice - */ - function slice(bytes calldata _data, uint256 _start, uint256 _length) - internal - pure - returns (bytes memory) - { - return _data[_start:_start + _length]; - } - - /** - * @notice Wrapper around the slicing and padding to avoid some stack too deep - * @param _data - The data to slice - * @param _start - The start of the slice - * @param _length - The length of the slice - * @param _targetLength - The length of the padded array - * @return The slice - */ - function sliceAndPadLeft( - bytes calldata _data, - uint256 _start, - uint256 _length, - uint256 _targetLength - ) internal pure returns (bytes memory) { - return bytes.concat(new bytes(_targetLength - _length), _data[_start:_start + _length]); - } - - /** - * @notice Wrapper around the slicing and padding to avoid some stack too deep - * @param _data - The data to slice - * @param _start - The start of the slice - * @param _length - The length of the slice - * @param _targetLength - The length of the padded array - * @return The slice - */ - function sliceAndPadRight( - bytes calldata _data, - uint256 _start, - uint256 _length, - uint256 _targetLength - ) internal pure returns (bytes memory) { - return bytes.concat(_data[_start:_start + _length], new bytes(_targetLength - _length)); - } - - /** - * @notice Reads 1 bytes from the data - * @param _data - The data to read from - * @param _offset - The offset to read from - * @return The 1 byte as a uint256 - */ - function read1(bytes calldata _data, uint256 _offset) internal pure returns (uint256) { - return uint256(uint8(bytes1(slice(_data, _offset, 1)))); - } - - /** - * @notice Reads 4 bytes from the data - * @param _data - The data to read from - * @param _offset - The offset to read from - * @return The 4 bytes read as a uint256 - */ - function read4(bytes calldata _data, uint256 _offset) internal pure returns (uint256) { - return uint256(uint32(bytes4(slice(_data, _offset, 4)))); - } - - /** - * @notice Pads L2 to L1 messages to the next power of 2 - simple algo as we only have a max of 8 msgs - * @param _numL2toL1Msgs - num of msgs (currently between 0 and MAX_L2_TO_L1_MSGS_PER_TX = 8) - * @return Num msgs to pad - */ - function computeNumMsgsToPad(uint32 _numL2toL1Msgs) internal pure returns (uint32) { - // We handle the edge case of 0 msgs by padding by 1 - this ensures computeRoot() gives a result of 0 - if (_numL2toL1Msgs == 0 || _numL2toL1Msgs == 1) { - return 1; - } - - uint32 v = _numL2toL1Msgs; - - // the following rounds _numL2toL1Msgs up to the next power of 2 (works only for 4 bytes value!) - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - // We dont expect to have MAX_L2_TO_L1_MSGS_PER_TX greater than 8 bits, so commented out the below to save gas - // v |= v >> 8; - // v |= v >> 16; - v++; - - return v - _numL2toL1Msgs; - } - - function computeNumTxEffectsToPad(uint32 _numTxEffects) internal pure returns (uint32) { - // 2 is the minimum number of tx effects so we have to handle the following 2 cases separately - if (_numTxEffects == 0) { - return 2; - } else if (_numTxEffects == 1) { - return 1; - } - return 0; - } -} diff --git a/l1-contracts/src/core/libraries/RollupLibs/ValidationLib.sol b/l1-contracts/src/core/libraries/RollupLibs/ValidationLib.sol index 5db4c00b5a1..8aa6b4e34e4 100644 --- a/l1-contracts/src/core/libraries/RollupLibs/ValidationLib.sol +++ b/l1-contracts/src/core/libraries/RollupLibs/ValidationLib.sol @@ -16,7 +16,7 @@ struct ValidateHeaderArgs { Header header; Timestamp currentTime; uint256 manaBaseFee; - bytes32 txsEffectsHash; + bytes32 blobsHash; uint256 pendingBlockNumber; DataStructures.ExecutionFlags flags; uint256 version; @@ -76,8 +76,8 @@ library ValidationLib { // Check if the data is available require( - _args.flags.ignoreDA || _args.header.contentCommitment.txsEffectsHash == _args.txsEffectsHash, - Errors.Rollup__UnavailableTxs(_args.header.contentCommitment.txsEffectsHash) + _args.flags.ignoreDA || _args.header.contentCommitment.blobsHash == _args.blobsHash, + Errors.Rollup__UnavailableTxs(_args.header.contentCommitment.blobsHash) ); // If not canonical rollup, require that the fees are zero diff --git a/l1-contracts/src/core/libraries/crypto/MerkleLib.sol b/l1-contracts/src/core/libraries/crypto/MerkleLib.sol index 394c805044d..b363338e17c 100644 --- a/l1-contracts/src/core/libraries/crypto/MerkleLib.sol +++ b/l1-contracts/src/core/libraries/crypto/MerkleLib.sol @@ -112,4 +112,65 @@ library MerkleLib { } return height; } + + /** + * @notice Computes the root for a binary Merkle-tree given the leafs. + * @dev Uses sha256. + * @param _leafs - The 32 bytes leafs to build the tree of. + * @return The root of the Merkle tree. + */ + function computeRoot(bytes32[] memory _leafs) internal pure returns (bytes32) { + // @todo Must pad the tree + uint256 treeDepth = 0; + while (2 ** treeDepth < _leafs.length) { + treeDepth++; + } + uint256 treeSize = 2 ** treeDepth; + assembly { + mstore(_leafs, treeSize) + } + + for (uint256 i = 0; i < treeDepth; i++) { + for (uint256 j = 0; j < treeSize; j += 2) { + _leafs[j / 2] = Hash.sha256ToField(bytes.concat(_leafs[j], _leafs[j + 1])); + } + treeSize /= 2; + } + + return _leafs[0]; + } + + /** + * @notice Computes the root for a binary unbalanced Merkle-tree given the leaves. + * @dev Filled in greedily with subtrees. Useful for outHash tree. + * @param _leaves - The 32 bytes leafs to build the tree of. + * @return The root of the Merkle tree. + */ + function computeUnbalancedRoot(bytes32[] memory _leaves) internal pure returns (bytes32) { + // e.g. an unbalanced tree of 7 txs will contain subtrees of 4, 2, and 1 tx(s) = 111 + // e.g. an unbalanced tree of 9 txs will contain subtrees of 8 and 1 tx(s) = 1001 + // We collect the roots of each subtree + bytes32 root; + uint256 currentSubtreeSize = 1; + uint256 numTxs = _leaves.length; + // We must calculate the smaller rightmost subtrees first, hence starting at 1 + while (numTxs != 0) { + // If size & txs == 0, the subtree doesn't exist for this number of txs + if (currentSubtreeSize & numTxs == 0) { + currentSubtreeSize <<= 1; + continue; + } + bytes32[] memory leavesInSubtree = new bytes32[](currentSubtreeSize); + uint256 start = numTxs - currentSubtreeSize; + for (uint256 i = start; i < numTxs; i++) { + leavesInSubtree[i - start] = _leaves[i]; + } + bytes32 subtreeRoot = computeRoot(leavesInSubtree); + root = + numTxs == _leaves.length ? subtreeRoot : Hash.sha256ToField(bytes.concat(subtreeRoot, root)); + numTxs -= currentSubtreeSize; + currentSubtreeSize <<= 1; + } + return root; + } } diff --git a/l1-contracts/test/Rollup.t.sol b/l1-contracts/test/Rollup.t.sol index 504db52ae57..0164b72a770 100644 --- a/l1-contracts/test/Rollup.t.sol +++ b/l1-contracts/test/Rollup.t.sol @@ -27,7 +27,6 @@ import {MerkleTestUtil} from "./merkle/TestUtil.sol"; import {TestERC20} from "@aztec/mock/TestERC20.sol"; import {TestConstants} from "./harnesses/TestConstants.sol"; import {RewardDistributor} from "@aztec/governance/RewardDistributor.sol"; -import {TxsDecoderHelper} from "./decoders/helpers/TxsDecoderHelper.sol"; import {IERC20Errors} from "@oz/interfaces/draft-IERC6093.sol"; import { ProposeArgs, OracleInput, ProposeLib @@ -54,7 +53,6 @@ contract RollupTest is DecoderBase, TimeFns { Rollup internal rollup; Leonidas internal leo; MerkleTestUtil internal merkleTestUtil; - TxsDecoderHelper internal txsHelper; TestERC20 internal testERC20; FeeJuicePortal internal feeJuicePortal; IProofCommitmentEscrow internal proofCommitmentEscrow; @@ -110,7 +108,6 @@ contract RollupTest is DecoderBase, TimeFns { registry.upgrade(address(rollup)); merkleTestUtil = new MerkleTestUtil(); - txsHelper = new TxsDecoderHelper(); privateKey = 0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234; signer = vm.addr(privateKey); @@ -137,6 +134,35 @@ contract RollupTest is DecoderBase, TimeFns { vm.warp(Timestamp.unwrap(rollup.getTimestampForSlot(Slot.wrap(_slot)))); } + function getBlobPublicInputs(bytes calldata _blobsInput) + public + pure + returns (bytes memory blobPublicInputs) + { + uint8 numBlobs = uint8(_blobsInput[0]); + blobPublicInputs = abi.encodePacked(numBlobs, blobPublicInputs); + for (uint256 i = 0; i < numBlobs; i++) { + // Add 1 for the numBlobs prefix + uint256 blobInputStart = i * 192 + 1; + // We want to extract the bytes we use for public inputs: + // * input[32:64] - z + // * input[64:96] - y + // * input[96:144] - commitment C + // Out of 192 bytes per blob. + blobPublicInputs = + abi.encodePacked(blobPublicInputs, _blobsInput[blobInputStart + 32:blobInputStart + 144]); + } + } + + function getBlobPublicInputsHash(bytes calldata _blobPublicInputs) + public + pure + returns (bytes32 publicInputsHash) + { + uint8 numBlobs = uint8(_blobPublicInputs[0]); + publicInputsHash = sha256(abi.encodePacked(_blobPublicInputs[1:1 + numBlobs * 112])); + } + function testClaimInTheFuture(uint256 _futureSlot) public setUpFor("mixed_block_1") { uint256 futureSlot = bound(_futureSlot, 1, 1e20); _testBlock("mixed_block_1", false, 1); @@ -255,25 +281,21 @@ contract RollupTest is DecoderBase, TimeFns { function testProofReleasesBond() public setUpFor("mixed_block_1") { DecoderBase.Data memory data = load("mixed_block_1").block; bytes memory header = data.header; - bytes32 archive = data.archive; - bytes32 blockHash = data.blockHash; bytes32 proverId = bytes32(uint256(42)); - bytes memory body = data.body; - bytes32[] memory txHashes = new bytes32[](0); // We jump to the time of the block. (unless it is in the past) vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); header = _updateHeaderBaseFee(header); - + skipBlobCheck(address(rollup)); ProposeArgs memory args = ProposeArgs({ header: header, - archive: archive, - blockHash: blockHash, + archive: data.archive, + blockHash: data.blockHash, oracleInput: OracleInput(0, 0), - txHashes: txHashes + txHashes: new bytes32[](0) }); - rollup.propose(args, signatures, body); + rollup.propose(args, signatures, data.body, data.blobInputs); quote.epochToProve = Epoch.wrap(1); quote.validUntilSlot = toSlots(Epoch.wrap(2)); @@ -285,7 +307,16 @@ contract RollupTest is DecoderBase, TimeFns { proofCommitmentEscrow.deposits(quote.prover), quote.bondAmount * 9, "Invalid escrow balance" ); - _submitEpochProof(rollup, 1, blockLog.archive, archive, blockLog.blockHash, blockHash, proverId); + _submitEpochProof( + rollup, + 1, + blockLog.archive, + data.archive, + blockLog.blockHash, + data.blockHash, + proverId, + this.getBlobPublicInputs(data.blobInputs) + ); assertEq( proofCommitmentEscrow.deposits(quote.prover), quote.bondAmount * 10, "Invalid escrow balance" @@ -430,31 +461,46 @@ contract RollupTest is DecoderBase, TimeFns { function testRevertProveTwice() public setUpFor("mixed_block_1") { DecoderBase.Data memory data = load("mixed_block_1").block; bytes memory header = data.header; - bytes32 archive = data.archive; - bytes32 blockHash = data.blockHash; - bytes32 proverId = bytes32(uint256(42)); bytes memory body = data.body; - bytes32[] memory txHashes = new bytes32[](0); // We jump to the time of the block. (unless it is in the past) vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); header = _updateHeaderBaseFee(header); + skipBlobCheck(address(rollup)); ProposeArgs memory args = ProposeArgs({ header: header, - archive: archive, - blockHash: blockHash, + archive: data.archive, + blockHash: data.blockHash, oracleInput: OracleInput(0, 0), - txHashes: txHashes + txHashes: new bytes32[](0) }); - rollup.propose(args, signatures, body); + rollup.propose(args, signatures, body, data.blobInputs); BlockLog memory blockLog = rollup.getBlock(0); - _submitEpochProof(rollup, 1, blockLog.archive, archive, blockLog.blockHash, blockHash, proverId); + _submitEpochProof( + rollup, + 1, + blockLog.archive, + data.archive, + blockLog.blockHash, + data.blockHash, + bytes32(uint256(42)), + this.getBlobPublicInputs(data.blobInputs) + ); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlockNumber.selector, 1, 2)); - _submitEpochProof(rollup, 1, blockLog.archive, archive, blockLog.blockHash, blockHash, proverId); + _submitEpochProof( + rollup, + 1, + blockLog.archive, + data.archive, + blockLog.blockHash, + data.blockHash, + bytes32(uint256(42)), + new bytes(112) + ); } function testTimestamp() public setUpFor("mixed_block_1") { @@ -470,6 +516,53 @@ contract RollupTest is DecoderBase, TimeFns { } } + function testInvalidBlobHash() public setUpFor("mixed_block_1") { + DecoderBase.Data memory data = load("mixed_block_1").block; + bytes memory header = data.header; + + // We set the blobHash to 1 + bytes32[] memory blobHashes = new bytes32[](1); + blobHashes[0] = bytes32(uint256(1)); + vm.blobhashes(blobHashes); + ProposeArgs memory args = ProposeArgs({ + header: header, + archive: data.archive, + blockHash: data.blockHash, + oracleInput: OracleInput(0, 0), + txHashes: new bytes32[](0) + }); + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlobHash.selector, blobHashes[0])); + rollup.propose(args, signatures, data.body, data.blobInputs); + } + + function testInvalidBlobProof() public setUpFor("mixed_block_1") { + DecoderBase.Data memory data = load("mixed_block_1").block; + bytes memory header = data.header; + bytes memory blobInput = data.blobInputs; + + // We set the blobHash to the correct value + bytes32[] memory blobHashes = new bytes32[](1); + // The below is the blob hash == bytes [1:33] of _blobInput + bytes32 blobHash; + assembly { + blobHash := mload(add(blobInput, 0x21)) + } + blobHashes[0] = blobHash; + vm.blobhashes(blobHashes); + + // We mess with the blob input bytes + blobInput[100] = 0x01; + ProposeArgs memory args = ProposeArgs({ + header: header, + archive: data.archive, + blockHash: data.blockHash, + oracleInput: OracleInput(0, 0), + txHashes: new bytes32[](0) + }); + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlobProof.selector, blobHashes[0])); + rollup.propose(args, signatures, data.body, blobInput); + } + function testRevertPrune() public setUpFor("mixed_block_1") { vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NothingToPrune.selector)); rollup.prune(); @@ -579,6 +672,8 @@ contract RollupTest is DecoderBase, TimeFns { // We jump to the time of the block. (unless it is in the past) vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); + skipBlobCheck(address(rollup)); + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NonZeroDaFee.selector)); ProposeArgs memory args = ProposeArgs({ header: header, @@ -587,7 +682,7 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, data.body); + rollup.propose(args, signatures, data.body, data.blobInputs); } function testNonZeroL2Fee() public setUpFor("mixed_block_1") { @@ -604,6 +699,8 @@ contract RollupTest is DecoderBase, TimeFns { // We jump to the time of the block. (unless it is in the past) vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); + skipBlobCheck(address(rollup)); + vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__NonZeroL2Fee.selector)); ProposeArgs memory args = ProposeArgs({ header: header, @@ -612,16 +709,14 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, data.body); + rollup.propose(args, signatures, data.body, data.blobInputs); } function testBlockFee() public setUpFor("mixed_block_1") { uint256 feeAmount = Constants.FEE_JUICE_INITIAL_MINT + 0.5e18; DecoderBase.Data memory data = load("mixed_block_1").block; - bytes32[] memory txHashes = new bytes32[](0); uint256 portalBalance = testERC20.balanceOf(address(feeJuicePortal)); - address coinbase = data.decodedHeader.globalVariables.coinbase; // Progress time as necessary vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); @@ -637,9 +732,10 @@ contract RollupTest is DecoderBase, TimeFns { // We jump to the time of the block. (unless it is in the past) vm.warp(max(block.timestamp, data.decodedHeader.globalVariables.timestamp)); - uint256 coinbaseBalance = testERC20.balanceOf(coinbase); + uint256 coinbaseBalance = testERC20.balanceOf(data.decodedHeader.globalVariables.coinbase); assertEq(coinbaseBalance, 0, "invalid initial coinbase balance"); + skipBlobCheck(address(rollup)); header = _updateHeaderBaseFee(header); // Assert that balance have NOT been increased by proposing the block @@ -648,10 +744,14 @@ contract RollupTest is DecoderBase, TimeFns { archive: data.archive, blockHash: data.blockHash, oracleInput: OracleInput(0, 0), - txHashes: txHashes + txHashes: new bytes32[](0) }); - rollup.propose(args, signatures, data.body); - assertEq(testERC20.balanceOf(coinbase), 0, "invalid coinbase balance"); + rollup.propose(args, signatures, data.body, data.blobInputs); + assertEq( + testERC20.balanceOf(data.decodedHeader.globalVariables.coinbase), + 0, + "invalid coinbase balance" + ); } BlockLog memory blockLog = rollup.getBlock(0); @@ -664,6 +764,7 @@ contract RollupTest is DecoderBase, TimeFns { rollup.claimEpochProofRight(signedQuote); { + bytes memory blobPublicInputs = this.getBlobPublicInputs(data.blobInputs); vm.expectRevert( abi.encodeWithSelector( IERC20Errors.ERC20InsufficientBalance.selector, @@ -680,11 +781,16 @@ contract RollupTest is DecoderBase, TimeFns { blockLog.blockHash, data.blockHash, bytes32(uint256(42)), - coinbase, + blobPublicInputs, + data.decodedHeader.globalVariables.coinbase, feeAmount ); } - assertEq(testERC20.balanceOf(coinbase), 0, "invalid coinbase balance"); + assertEq( + testERC20.balanceOf(data.decodedHeader.globalVariables.coinbase), + 0, + "invalid coinbase balance" + ); assertEq(testERC20.balanceOf(address(quote.prover)), 0, "invalid prover balance"); { @@ -699,7 +805,8 @@ contract RollupTest is DecoderBase, TimeFns { blockLog.blockHash, data.blockHash, bytes32(uint256(42)), - coinbase, + this.getBlobPublicInputs(data.blobInputs), + data.decodedHeader.globalVariables.coinbase, feeAmount ); @@ -707,7 +814,11 @@ contract RollupTest is DecoderBase, TimeFns { uint256 expectedProverReward = Math.mulDiv(expectedReward, quote.basisPointFee, 10_000); uint256 expectedSequencerReward = expectedReward - expectedProverReward; - assertEq(testERC20.balanceOf(coinbase), expectedSequencerReward, "invalid coinbase balance"); + assertEq( + testERC20.balanceOf(data.decodedHeader.globalVariables.coinbase), + expectedSequencerReward, + "invalid coinbase balance" + ); assertEq(testERC20.balanceOf(quote.prover), expectedProverReward, "invalid prover balance"); } } @@ -757,6 +868,8 @@ contract RollupTest is DecoderBase, TimeFns { bytes memory aggregationObject = ""; bytes memory proof = ""; + bytes memory blobPublicInputs = this.getBlobPublicInputs(data.blobInputs); + vm.expectRevert( abi.encodeWithSelector(Errors.Rollup__InvalidEpoch.selector, Epoch.wrap(0), Epoch.wrap(1)) ); @@ -766,6 +879,7 @@ contract RollupTest is DecoderBase, TimeFns { epochSize: 2, args: args, fees: fees, + blobPublicInputs: blobPublicInputs, aggregationObject: aggregationObject, proof: proof }) @@ -783,8 +897,19 @@ contract RollupTest is DecoderBase, TimeFns { assertEq(rollup.getProvenBlockNumber(), 0, "Invalid initial proven block number"); BlockLog memory blockLog = rollup.getBlock(0); + bytes memory blobPublicInputs = abi.encodePacked( + this.getBlobPublicInputs(load("mixed_block_1").block.blobInputs), + this.getBlobPublicInputs(data.blobInputs) + ); _submitEpochProof( - rollup, 2, blockLog.archive, data.archive, blockLog.blockHash, data.blockHash, bytes32(0) + rollup, + 2, + blockLog.archive, + data.archive, + blockLog.blockHash, + data.blockHash, + bytes32(0), + blobPublicInputs ); assertEq(rollup.getPendingBlockNumber(), 2, "Invalid pending block number"); @@ -799,6 +924,7 @@ contract RollupTest is DecoderBase, TimeFns { bytes32[] memory txHashes = new bytes32[](0); vm.warp(max(block.timestamp, data2.decodedHeader.globalVariables.timestamp)); + skipBlobCheck(address(rollup)); ProposeArgs memory args = ProposeArgs({ header: _updateHeaderBaseFee(data2.header), archive: data2.archive, @@ -806,17 +932,25 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, data2.body); + rollup.propose(args, signatures, data2.body, data2.blobInputs); // Skips proving of block 1 BlockLog memory blockLog = rollup.getBlock(0); + bytes memory blobPublicInputs = this.getBlobPublicInputs(data1.blobInputs); vm.expectRevert( abi.encodeWithSelector( Errors.Rollup__InvalidPreviousArchive.selector, blockLog.archive, data1.archive ) ); _submitEpochProof( - rollup, 1, data1.archive, data2.archive, data1.archive, data2.archive, bytes32(0) + rollup, + 1, + data1.archive, + data2.archive, + data1.archive, + data2.archive, + bytes32(0), + blobPublicInputs ); assertEq(rollup.getPendingBlockNumber(), 2, "Invalid pending block number"); @@ -849,7 +983,7 @@ contract RollupTest is DecoderBase, TimeFns { // TODO: Hardcoding offsets in the middle of tests is annoying to say the least. mstore(add(header, add(0x20, 0x0174)), 0x420) } - + skipBlobCheck(address(rollup)); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidBlockNumber.selector, 1, 0x420)); ProposeArgs memory args = ProposeArgs({ header: header, @@ -858,7 +992,7 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, body); + rollup.propose(args, signatures, body, data.blobInputs); } function testRevertInvalidChainId() public setUpFor("empty_block_1") { @@ -871,7 +1005,7 @@ contract RollupTest is DecoderBase, TimeFns { assembly { mstore(add(header, add(0x20, 0x0134)), 0x420) } - + skipBlobCheck(address(rollup)); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidChainId.selector, 31337, 0x420)); ProposeArgs memory args = ProposeArgs({ header: header, @@ -880,7 +1014,7 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, body); + rollup.propose(args, signatures, body, data.blobInputs); } function testRevertInvalidVersion() public setUpFor("empty_block_1") { @@ -893,7 +1027,7 @@ contract RollupTest is DecoderBase, TimeFns { assembly { mstore(add(header, add(0x20, 0x0154)), 0x420) } - + skipBlobCheck(address(rollup)); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidVersion.selector, 1, 0x420)); ProposeArgs memory args = ProposeArgs({ header: header, @@ -902,7 +1036,7 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, body); + rollup.propose(args, signatures, body, data.blobInputs); } function testRevertInvalidTimestamp() public setUpFor("empty_block_1") { @@ -920,7 +1054,7 @@ contract RollupTest is DecoderBase, TimeFns { assembly { mstore(add(header, add(0x20, 0x01b4)), badTs) } - + skipBlobCheck(address(rollup)); vm.expectRevert(abi.encodeWithSelector(Errors.Rollup__InvalidTimestamp.selector, realTs, badTs)); ProposeArgs memory args = ProposeArgs({ header: header, @@ -929,7 +1063,7 @@ contract RollupTest is DecoderBase, TimeFns { oracleInput: OracleInput(0, 0), txHashes: txHashes }); - rollup.propose(args, signatures, body); + rollup.propose(args, signatures, body, new bytes(144)); } function testBlocksWithAssumeProven() public setUpFor("mixed_block_1") { @@ -959,6 +1093,7 @@ contract RollupTest is DecoderBase, TimeFns { function testSubmitProofNonExistantBlock() public setUpFor("empty_block_1") { _testBlock("empty_block_1", false); DecoderBase.Data memory data = load("empty_block_1").block; + bytes memory blobPublicInputs = this.getBlobPublicInputs(data.blobInputs); BlockLog memory blockLog = rollup.getBlock(0); bytes32 wrong = bytes32(uint256(0xdeadbeef)); @@ -968,7 +1103,14 @@ contract RollupTest is DecoderBase, TimeFns { ) ); _submitEpochProof( - rollup, 1, wrong, data.archive, blockLog.blockHash, data.blockHash, bytes32(0) + rollup, + 1, + wrong, + data.archive, + blockLog.blockHash, + data.blockHash, + bytes32(0), + blobPublicInputs ); // TODO: Reenable when we setup proper initial block hash @@ -982,6 +1124,7 @@ contract RollupTest is DecoderBase, TimeFns { _testBlock("empty_block_1", false); DecoderBase.Data memory data = load("empty_block_1").block; + bytes memory blobPublicInputs = this.getBlobPublicInputs(data.blobInputs); bytes32 wrongArchive = bytes32(uint256(0xdeadbeef)); BlockLog memory blockLog = rollup.getBlock(0); @@ -989,7 +1132,14 @@ contract RollupTest is DecoderBase, TimeFns { abi.encodeWithSelector(Errors.Rollup__InvalidArchive.selector, data.archive, 0xdeadbeef) ); _submitEpochProof( - rollup, 1, blockLog.archive, wrongArchive, blockLog.blockHash, data.blockHash, bytes32(0) + rollup, + 1, + blockLog.archive, + wrongArchive, + blockLog.blockHash, + data.blockHash, + bytes32(0), + blobPublicInputs ); } @@ -997,6 +1147,7 @@ contract RollupTest is DecoderBase, TimeFns { _testBlock("empty_block_1", false); DecoderBase.Data memory data = load("empty_block_1").block; + bytes memory blobPublicInputs = this.getBlobPublicInputs(data.blobInputs); bytes32 wrongBlockHash = bytes32(uint256(0xdeadbeef)); BlockLog memory blockLog = rollup.getBlock(0); @@ -1006,7 +1157,45 @@ contract RollupTest is DecoderBase, TimeFns { ) ); _submitEpochProof( - rollup, 1, blockLog.archive, data.archive, blockLog.blockHash, wrongBlockHash, bytes32(0) + rollup, + 1, + blockLog.archive, + data.archive, + blockLog.blockHash, + wrongBlockHash, + bytes32(0), + blobPublicInputs + ); + } + + function testSubmitProofInvalidBlobPublicInput() public setUpFor("empty_block_1") { + _testBlock("empty_block_1", false); + + DecoderBase.Data memory data = load("empty_block_1").block; + bytes memory blobPublicInputs = this.getBlobPublicInputs(data.blobInputs); + // mess with the data + blobPublicInputs[100] = 0x01; + + BlockLog memory blockLog = rollup.getBlock(0); + bytes32 actualBlobPublicInputsHash = + rollup.getBlobPublicInputsHash(data.decodedHeader.globalVariables.blockNumber); + bytes32 wrongBlobPublicInputsHash = this.getBlobPublicInputsHash(blobPublicInputs); + vm.expectRevert( + abi.encodeWithSelector( + Errors.Rollup__InvalidBlobPublicInputsHash.selector, + actualBlobPublicInputsHash, + wrongBlobPublicInputsHash + ) + ); + _submitEpochProof( + rollup, + 1, + blockLog.archive, + data.archive, + blockLog.blockHash, + data.blockHash, + bytes32(0), + blobPublicInputs ); } @@ -1025,8 +1214,7 @@ contract RollupTest is DecoderBase, TimeFns { function _testBlock(string memory name, bool _submitProof, uint256 _slotNumber) public { DecoderBase.Full memory full = load(name); bytes memory header = full.block.header; - uint32 numTxs = full.block.numTxs; - bytes32[] memory txHashes = new bytes32[](0); + bytes memory blobInputs = full.block.blobInputs; Slot slotNumber = Slot.wrap(_slotNumber); @@ -1047,6 +1235,16 @@ contract RollupTest is DecoderBase, TimeFns { _populateInbox(full.populate.sender, full.populate.recipient, full.populate.l1ToL2Content); + { + bytes32[] memory blobHashes = new bytes32[](1); + // The below is the blob hash == bytes [1:33] of _blobInput + bytes32 blobHash; + assembly { + blobHash := mload(add(blobInputs, 0x21)) + } + blobHashes[0] = blobHash; + vm.blobhashes(blobHashes); + } header = _updateHeaderBaseFee(header); ProposeArgs memory args = ProposeArgs({ @@ -1054,9 +1252,9 @@ contract RollupTest is DecoderBase, TimeFns { archive: full.block.archive, blockHash: full.block.blockHash, oracleInput: OracleInput(0, 0), - txHashes: txHashes + txHashes: new bytes32[](0) }); - rollup.propose(args, signatures, full.block.body); + rollup.propose(args, signatures, full.block.body, blobInputs); if (_submitProof) { uint256 pre = rollup.getProvenBlockNumber(); @@ -1069,7 +1267,8 @@ contract RollupTest is DecoderBase, TimeFns { args.archive, blockLog.blockHash, full.block.blockHash, - bytes32(0) + bytes32(0), + this.getBlobPublicInputs(blobInputs) ); assertEq(pre + 1, rollup.getProvenBlockNumber(), "Block not proven"); } @@ -1083,6 +1282,7 @@ contract RollupTest is DecoderBase, TimeFns { // The below is a little janky - we know that this test deals with full txs with equal numbers // of msgs or txs with no messages, so the division works // TODO edit full.messages to include information about msgs per tx? + uint32 numTxs = full.block.numTxs; uint256 subTreeHeight = full.messages.l2ToL1Messages.length == 0 ? 0 : merkleTestUtil.calculateTreeHeightFromSize(full.messages.l2ToL1Messages.length / numTxs); @@ -1130,7 +1330,8 @@ contract RollupTest is DecoderBase, TimeFns { bytes32 _endArchive, bytes32 _previousBlockHash, bytes32 _endBlockHash, - bytes32 _proverId + bytes32 _proverId, + bytes memory _blobPublicInputs ) internal { _submitEpochProofWithFee( _rollup, @@ -1140,6 +1341,7 @@ contract RollupTest is DecoderBase, TimeFns { _previousBlockHash, _endBlockHash, _proverId, + _blobPublicInputs, address(0), uint256(0) ); @@ -1153,6 +1355,7 @@ contract RollupTest is DecoderBase, TimeFns { bytes32 _previousBlockHash, bytes32 _endBlockHash, bytes32 _proverId, + bytes memory _blobPublicInputs, address _feeRecipient, uint256 _feeAmount ) internal { @@ -1171,16 +1374,14 @@ contract RollupTest is DecoderBase, TimeFns { fees[0] = bytes32(uint256(uint160(_feeRecipient))); fees[1] = bytes32(_feeAmount); - bytes memory aggregationObject = ""; - bytes memory proof = ""; - _rollup.submitEpochRootProof( SubmitEpochRootProofArgs({ epochSize: _epochSize, args: args, fees: fees, - aggregationObject: aggregationObject, - proof: proof + blobPublicInputs: _blobPublicInputs, + aggregationObject: "", + proof: "" }) ); } diff --git a/l1-contracts/test/base/Base.sol b/l1-contracts/test/base/Base.sol index b23e785cd90..1f975efb96a 100644 --- a/l1-contracts/test/base/Base.sol +++ b/l1-contracts/test/base/Base.sol @@ -219,4 +219,12 @@ contract TestBase is Test { assertEq(a, b); } } + + // Blobs + + function skipBlobCheck(address rollup) internal { + // 9 is the slot of checkBlob. We force it to be false (=0): + // Slot number can be checked by running forge inspect src/core/Rollup.sol:Rollup storage + vm.store(rollup, bytes32(uint256(9)), 0); + } } diff --git a/l1-contracts/test/decoders/Base.sol b/l1-contracts/test/decoders/Base.sol index 5ac503e888e..dd47a359ea6 100644 --- a/l1-contracts/test/decoders/Base.sol +++ b/l1-contracts/test/decoders/Base.sol @@ -35,6 +35,7 @@ contract DecoderBase is TestBase { struct Data { bytes32 archive; + bytes blobInputs; bytes32 blockHash; bytes body; DecodedHeader decodedHeader; @@ -43,7 +44,6 @@ contract DecoderBase is TestBase { // decoder changes uint32 numTxs; bytes32 publicInputsHash; - bytes32 txsEffectsHash; } struct DecodedHeader { @@ -77,10 +77,10 @@ contract DecoderBase is TestBase { } struct ContentCommitment { + bytes32 blobsHash; bytes32 inHash; uint256 numTxs; bytes32 outHash; - bytes32 txsEffectsHash; } struct PartialStateReference { diff --git a/l1-contracts/test/decoders/Decoders.t.sol b/l1-contracts/test/decoders/Decoders.t.sol index 2165f759911..6a276be885a 100644 --- a/l1-contracts/test/decoders/Decoders.t.sol +++ b/l1-contracts/test/decoders/Decoders.t.sol @@ -4,12 +4,8 @@ pragma solidity >=0.8.27; import {DecoderBase} from "./Base.sol"; -import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; - import {HeaderLibHelper} from "./helpers/HeaderLibHelper.sol"; -import {TxsDecoderHelper} from "./helpers/TxsDecoderHelper.sol"; -import {HeaderLib, Header} from "@aztec/core/libraries/RollupLibs/HeaderLib.sol"; -import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; +import {Header} from "@aztec/core/libraries/RollupLibs/HeaderLib.sol"; /** * Blocks are generated using the `integration_l1_publisher.test.ts` tests. @@ -19,11 +15,9 @@ import {Constants} from "@aztec/core/libraries/ConstantsGen.sol"; */ contract DecodersTest is DecoderBase { HeaderLibHelper internal headerHelper; - TxsDecoderHelper internal txsHelper; function setUp() public virtual { headerHelper = new HeaderLibHelper(); - txsHelper = new TxsDecoderHelper(); } function testDecodeBlocks() public { @@ -77,9 +71,7 @@ contract DecodersTest is DecoderBase { assertEq(header.contentCommitment.numTxs, contentCommitment.numTxs, "Invalid txTreeSize"); assertEq( - header.contentCommitment.txsEffectsHash, - contentCommitment.txsEffectsHash, - "Invalid txsEffectsHash" + header.contentCommitment.blobsHash, contentCommitment.blobsHash, "Invalid blobHash" ); assertEq(header.contentCommitment.inHash, contentCommitment.inHash, "Invalid inHash"); assertEq(header.contentCommitment.outHash, contentCommitment.outHash, "Invalid outHash"); @@ -153,245 +145,6 @@ contract DecodersTest is DecoderBase { header.lastArchive.root, referenceHeader.lastArchive.root, "Invalid lastArchive.root" ); } - - // Txs - { - bytes32 txsEffectsHash = txsHelper.decode(data.block.body); - assertEq(txsEffectsHash, data.block.txsEffectsHash, "Invalid txs effects hash"); - assertEq( - txsEffectsHash, - data.block.decodedHeader.contentCommitment.txsEffectsHash, - "Invalid txs effects hash" - ); - } - // The public inputs are computed based of these values, but not directly part of the decoding per say. } - - function testComputeKernelLogsIterationWithoutLogs() public view { - bytes memory kernelLogsLength = hex"00000004"; // 4 bytes containing value 4 - bytes memory iterationLogsLength = hex"00000000"; // 4 empty bytes indicating that length of this iteration's logs is 0 - bytes memory encodedLogs = abi.encodePacked(kernelLogsLength, iterationLogsLength); - - (bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) = - txsHelper.computeKernelLogsHash(encodedLogs); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - assertEq(logsLength, 0, "Incorrect logs length"); - assertEq(logsHash, bytes32(0), "Incorrect logs hash"); - } - - function testComputeKernelLogs1Iteration() public view { - // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS || - // K_LOGS_LEN = 4 + 8 = 12 (hex"0000000c") - // I1_LOGS_LEN = 8 (hex"00000008") - // I1_LOGS = 8 bytes (hex"0000000493e78a70") - bytes memory firstFunctionCallLogs = hex"93e78a70"; - // First, prefix logs with the contract address - bytes32 contractAddress = hex"11"; - // Prefix logs with length of kernel logs (12) and length of iteration 1 logs (8) - // Note: 00000004 is the length of 1 log within function logs - // Note: 00000024 is the length of 1 log plus its masked address - bytes memory encodedLogs = - abi.encodePacked(hex"0000002c00000028", hex"00000024", contractAddress, firstFunctionCallLogs); - (bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) = - txsHelper.computeKernelLogsHash(encodedLogs); - - bytes32 privateCircuitPublicInputsLogsHashFirstCall = - Hash.sha256ToField(bytes.concat(contractAddress, firstFunctionCallLogs)); - bytes32 privateCircuitPublicInputsLogsHashFirstCallSiloed = - Hash.sha256ToField(bytes.concat(contractAddress, privateCircuitPublicInputsLogsHashFirstCall)); - - bytes32 referenceLogsHash = Hash.sha256ToField( - abi.encodePacked( - privateCircuitPublicInputsLogsHashFirstCallSiloed, - new bytes(Constants.MAX_UNENCRYPTED_LOGS_PER_TX * 32 - 32) - ) - ); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - // We take 8 as the user does not pay for the gas of the overall len. - assertEq(logsLength, encodedLogs.length - 8, "Incorrect logs length"); - assertEq(logsHash, referenceLogsHash, "Incorrect logs hash"); - } - - function testComputeKernelLogs2Iterations() public view { - // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS | I2_LOGS_LEN | I2_LOGS || - // K_LOGS_LEN = 4 + 8 + 4 + 20 = 36 (hex"00000024") - // I1_LOGS_LEN = 8 (hex"00000008") - // I1_LOGS = 8 random bytes (hex"0000000493e78a70") - // I2_LOGS_LEN = 20 (hex"00000014") - // I2_LOGS = 20 bytes (hex"0000001006a86173c86c6d3f108eefc36e7fb014") - bytes memory firstFunctionCallLogs = hex"93e78a70"; - // First, prefix logs with a contract address to mimic siloing - bytes32 firstCallContractAddress = hex"11"; - bytes memory secondFunctionCallLogs = hex"06a86173c86c6d3f108eefc36e7fb014"; - bytes32 secondCallContractAddress = hex"12"; - bytes memory encodedLogs = abi.encodePacked( - hex"0000006400000028", - hex"00000024", - firstCallContractAddress, - firstFunctionCallLogs, - hex"00000034", - hex"00000030", - secondCallContractAddress, - secondFunctionCallLogs - ); - (bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) = - txsHelper.computeKernelLogsHash(encodedLogs); - - bytes32 referenceLogsHashFromIteration1 = - Hash.sha256ToField(bytes.concat(firstCallContractAddress, firstFunctionCallLogs)); - bytes32 referenceLogsHashFromIteration1Siloed = - Hash.sha256ToField(bytes.concat(firstCallContractAddress, referenceLogsHashFromIteration1)); - - bytes32 privateCircuitPublicInputsLogsHashSecondCall = - Hash.sha256ToField(bytes.concat(secondCallContractAddress, secondFunctionCallLogs)); - bytes32 privateCircuitPublicInputsLogsHashSecondCallSiloed = Hash.sha256ToField( - bytes.concat(secondCallContractAddress, privateCircuitPublicInputsLogsHashSecondCall) - ); - - bytes32 referenceLogsHashFromIteration2 = Hash.sha256ToField( - abi.encodePacked( - referenceLogsHashFromIteration1Siloed, - privateCircuitPublicInputsLogsHashSecondCallSiloed, - new bytes(Constants.MAX_UNENCRYPTED_LOGS_PER_TX * 32 - 64) - ) - ); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - // We take 12 as the user does not pay for the gas of the parent len bytes. - assertEq(logsLength, encodedLogs.length - 12, "Incorrect logs length"); - assertEq(logsHash, referenceLogsHashFromIteration2, "Incorrect logs hash"); - } - - function testComputeKernelLogsMiddleIterationWithoutLogs() public view { - // || K_LOGS_LEN | I1_LOGS_LEN | I1_LOGS | I2_LOGS_LEN | I2_LOGS | I3_LOGS_LEN | I3_LOGS || - // K_LOGS_LEN = 4 + 8 + 4 + 0 + 4 + 20 = 40 (hex"00000028") - // I1_LOGS_LEN = 8 (hex"00000008") - // I1_LOGS = 8 random bytes (hex"0000000493e78a70") - // I2_LOGS_LEN = 0 (hex"00000000") - // I2_LOGS = 0 bytes (hex"") - // I3_LOGS_LEN = 20 (hex"00000014") - // I3_LOGS = 20 random bytes (hex"0000001006a86173c86c6d3f108eefc36e7fb014") - bytes memory firstFunctionCallLogs = hex"93e78a70"; - // First, prefix logs with a contract address to mimic siloing - bytes32 firstCallContractAddress = hex"11"; - bytes memory secondFunctionCallLogs = hex""; - bytes memory thirdFunctionCallLogs = hex"06a86173c86c6d3f108eefc36e7fb014"; - bytes32 thirdCallContractAddress = hex"12"; - bytes memory encodedLogs = abi.encodePacked( - hex"0000006800000028", - hex"00000024", - firstCallContractAddress, - firstFunctionCallLogs, - hex"00000000", - secondFunctionCallLogs, - hex"00000034", - hex"00000030", - thirdCallContractAddress, - thirdFunctionCallLogs - ); - (bytes32 logsHash, uint256 bytesAdvanced, uint256 logsLength) = - txsHelper.computeKernelLogsHash(encodedLogs); - - bytes32 referenceLogsHashFromIteration1 = - Hash.sha256ToField(bytes.concat(firstCallContractAddress, firstFunctionCallLogs)); - bytes32 referenceLogsHashFromIteration1Siloed = - Hash.sha256ToField(bytes.concat(firstCallContractAddress, referenceLogsHashFromIteration1)); - - // Note: as of resolving #5017, we now hash logs inside the circuits - // Following the YP, we skip any zero length logs, hence no use of secondFunctionCallLogs here - - bytes32 privateCircuitPublicInputsLogsHashThirdCall = - Hash.sha256ToField(bytes.concat(thirdCallContractAddress, thirdFunctionCallLogs)); - bytes32 privateCircuitPublicInputsLogsHashThirdCallSiloed = Hash.sha256ToField( - bytes.concat(thirdCallContractAddress, privateCircuitPublicInputsLogsHashThirdCall) - ); - - bytes32 referenceLogsHashFromIteration3 = Hash.sha256ToField( - abi.encodePacked( - referenceLogsHashFromIteration1Siloed, - privateCircuitPublicInputsLogsHashThirdCallSiloed, - new bytes(Constants.MAX_UNENCRYPTED_LOGS_PER_TX * 32 - 64) - ) - ); - - assertEq(bytesAdvanced, encodedLogs.length, "Advanced by an incorrect number of bytes"); - // We take 16 as the user does not pay for the gas of the parent len bytes or contract addresses - assertEq(logsLength, encodedLogs.length - 16, "Incorrect logs length"); - assertEq(logsHash, referenceLogsHashFromIteration3, "Incorrect logs hash"); - } - - function testComputeTxOutHash() public view { - // A tx with no msgs should give an out hash of 0 - bytes memory encodedMsgs = abi.encodePacked(hex"00"); - bytes32 outHash = txsHelper.computeTxOutHash(encodedMsgs); - assertEq(outHash, 0, "Incorrect tx empty out hash"); - // Mimics test_3_elems test in .nr, with msg hashes of value 10, 11, and 12 - bytes32[3] memory msgs = [bytes32(hex"0a"), bytes32(hex"0b"), bytes32(hex"0c")]; - encodedMsgs = abi.encodePacked(hex"03", msgs); - outHash = txsHelper.computeTxOutHash(encodedMsgs); - bytes32 firstNode = Hash.sha256ToField(bytes.concat(msgs[0], msgs[1])); - bytes32 secondNode = Hash.sha256ToField(bytes.concat(msgs[2], bytes32(0))); - bytes32 expectedOutHash = Hash.sha256ToField(bytes.concat(firstNode, secondNode)); - assertEq(outHash, expectedOutHash, "Incorrect tx out hash"); - } - - function testTxsDecoderCorrectlyComputesNumTxEffectsToPad() public view { - // Minimum num txs is 2 so when there are no real txs we need to pad to 2 - uint32 numTxEffects = 0; - uint32 paddedNumTxEffects = txsHelper.computeNumTxEffectsToPad(numTxEffects); - assertEq(paddedNumTxEffects, 2, "Incorrect number of tx effects to pad"); - - numTxEffects = 1; - paddedNumTxEffects = txsHelper.computeNumTxEffectsToPad(numTxEffects); - assertEq(paddedNumTxEffects, 2 ** 1 - numTxEffects, "Incorrect number of tx effects to pad"); - - numTxEffects = 3; - paddedNumTxEffects = txsHelper.computeNumTxEffectsToPad(numTxEffects); - assertEq(paddedNumTxEffects, 0, "Incorrect number of tx effects to pad"); - - numTxEffects = 17; - paddedNumTxEffects = txsHelper.computeNumTxEffectsToPad(numTxEffects); - assertEq(paddedNumTxEffects, 0, "Incorrect number of tx effects to pad"); - } - - function testTxsDecoderCorrectlyComputesNumMsgsToPad() public view { - uint32 numMsgs = 0; - uint32 numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 1, "Incorrect number of msgs to pad"); - - numMsgs = 1; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 2 ** 1 - numMsgs, "Incorrect number of msgs to pad"); - - numMsgs = 2; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 0, "Incorrect number of msgs to pad"); - - numMsgs = 3; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 2 ** 2 - numMsgs, "Incorrect number of msgs to pad"); - - numMsgs = 4; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 0, "Incorrect number of msgs to pad"); - - numMsgs = 5; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 2 ** 3 - numMsgs, "Incorrect number of msgs to pad"); - - numMsgs = 6; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 2 ** 3 - numMsgs, "Incorrect number of msgs to pad"); - - numMsgs = 7; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 2 ** 3 - numMsgs, "Incorrect number of msgs to pad"); - - numMsgs = 7; - numMsgsToPad = txsHelper.computeNumMsgsToPad(numMsgs); - assertEq(numMsgsToPad, 2 ** 3 - numMsgs, "Incorrect number of msgs to pad"); - } } diff --git a/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol b/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol deleted file mode 100644 index 45cd04ad139..00000000000 --- a/l1-contracts/test/decoders/helpers/TxsDecoderHelper.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2024 Aztec Labs. -pragma solidity >=0.8.27; - -import {TxsDecoder} from "@aztec/core/libraries/RollupLibs/TxsDecoder.sol"; -import {MerkleLib} from "@aztec/core/libraries/crypto/MerkleLib.sol"; - -contract TxsDecoderHelper { - // A wrapper used such that we get "calldata" and not memory - function decode(bytes calldata _body) public pure returns (bytes32 txsHash) { - return TxsDecoder.decode(_body); - } - - function computeKernelLogsHash(bytes calldata _kernelLogs) - external - pure - returns (bytes32, uint256, uint256) - { - return TxsDecoder.computeKernelUnencryptedLogsHash(0, _kernelLogs, false); - } - - function computeTxOutHash(bytes calldata _kernelMsgs) external pure returns (bytes32) { - return TxsDecoder.computeTxOutHash(1, _kernelMsgs); - } - - function computeNumTxEffectsToPad(uint32 _numTxEffects) external pure returns (uint32) { - return TxsDecoder.computeNumTxEffectsToPad(_numTxEffects); - } - - function computeNumMsgsToPad(uint32 _numL2toL1Msgs) external pure returns (uint32) { - return TxsDecoder.computeNumMsgsToPad(_numL2toL1Msgs); - } - - function computeUnbalancedRoot(bytes32[] memory _leaves) external pure returns (bytes32) { - return TxsDecoder.computeUnbalancedRoot(_leaves); - } - - function computeMinMaxPathLength(uint32 _numTxEffects) external pure returns (uint256, uint256) { - return MerkleLib.computeMinMaxPathLength(_numTxEffects); - } -} diff --git a/l1-contracts/test/fees/FeeRollup.t.sol b/l1-contracts/test/fees/FeeRollup.t.sol index 8331d66d7ee..4463ea51cfb 100644 --- a/l1-contracts/test/fees/FeeRollup.t.sol +++ b/l1-contracts/test/fees/FeeRollup.t.sol @@ -32,7 +32,6 @@ import {MerkleTestUtil} from "../merkle/TestUtil.sol"; import {TestERC20} from "@aztec/mock/TestERC20.sol"; import {TestConstants} from "../harnesses/TestConstants.sol"; import {RewardDistributor} from "@aztec/governance/RewardDistributor.sol"; -import {TxsDecoderHelper} from "../decoders/helpers/TxsDecoderHelper.sol"; import {IERC20Errors} from "@oz/interfaces/draft-IERC6093.sol"; import {IFeeJuicePortal} from "@aztec/core/interfaces/IFeeJuicePortal.sol"; import {IRewardDistributor} from "@aztec/governance/interfaces/IRewardDistributor.sol"; @@ -92,6 +91,7 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { bytes32 blockHash; bytes header; bytes body; + bytes blobInputs; bytes32[] txHashes; Signature[] signatures; } @@ -218,6 +218,7 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { blockHash: blockHash, header: header, body: body, + blobInputs: full.block.blobInputs, txHashes: txHashes, signatures: signatures }); @@ -233,7 +234,7 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { if (rollup.getCurrentSlot() == nextSlot) { TestPoint memory point = points[nextSlot.unwrap() - 1]; Block memory b = getBlock(); - + skipBlobCheck(address(rollup)); rollup.propose( ProposeArgs({ header: b.header, @@ -246,7 +247,8 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { txHashes: b.txHashes }), b.signatures, - b.body + b.body, + b.blobInputs ); nextSlot = nextSlot + Slot.wrap(1); } @@ -328,6 +330,7 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { Block memory b = getBlock(); + skipBlobCheck(address(rollup)); rollup.propose( ProposeArgs({ header: b.header, @@ -340,7 +343,8 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { txHashes: b.txHashes }), b.signatures, - b.body + b.body, + b.blobInputs ); BlockLog memory blockLog = rollup.getBlock(nextSlot.unwrap()); @@ -429,11 +433,21 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { bytes32(0), bytes32(0) ]; + + bytes memory blobPublicInputs; + for (uint256 j = 0; j < epochSize; j++) { + // For each block in the epoch, add its blob public inputs + // Since we are reusing the same block, they are the same + blobPublicInputs = + abi.encodePacked(blobPublicInputs, this.getBlobPublicInputs(full.block.blobInputs)); + } + rollup.submitEpochRootProof( SubmitEpochRootProofArgs({ epochSize: epochSize, args: args, fees: fees, + blobPublicInputs: blobPublicInputs, aggregationObject: aggregationObject, proof: proof }) @@ -474,4 +488,26 @@ contract FeeRollupTest is FeeModelTestPoints, DecoderBase { }); assertEq(a, bModel); } + + // This is duplicated from Rollup.t.sol because we need to call it as this.getBlobPublicInputs + // so it accepts the input as calldata + function getBlobPublicInputs(bytes calldata _blobsInput) + public + pure + returns (bytes memory blobPublicInputs) + { + uint8 numBlobs = uint8(_blobsInput[0]); + blobPublicInputs = abi.encodePacked(numBlobs, blobPublicInputs); + for (uint256 i = 0; i < numBlobs; i++) { + // Add 1 for the numBlobs prefix + uint256 blobInputStart = i * 192 + 1; + // We want to extract the bytes we use for public inputs: + // * input[32:64] - z + // * input[64:96] - y + // * input[96:144] - commitment C + // Out of 192 bytes per blob. + blobPublicInputs = + abi.encodePacked(blobPublicInputs, _blobsInput[blobInputStart + 32:blobInputStart + 144]); + } + } } diff --git a/l1-contracts/test/fixtures/empty_block_1.json b/l1-contracts/test/fixtures/empty_block_1.json index 0a718ff2451..b98cd861f0f 100644 --- a/l1-contracts/test/fixtures/empty_block_1.json +++ b/l1-contracts/test/fixtures/empty_block_1.json @@ -8,28 +8,27 @@ "l2ToL1Messages": [] }, "block": { - "archive": "0x0fafcb46cf14179b2c9f82f861f0e2c13408687d6b48bcdc3b3b076ad623c716", - "blockHash": "0x245789907f792979d937d01ec9f53675dc2f2b250056fe90d7663dc9ded67dc8", + "archive": "0x2e558c94bd1a3d8512eaf74c297f8a5b28ca14c79636a9f81e0538804b21ff6c", + "blockHash": "0x20e7264407d9dad46301cd1ac2720619fa899e0dc07e2aeaaf1f58a9fe0d9b42", "body": "0x00000000", - "txsEffectsHash": "0x00877c1db9d71fd7786d8ce0fa7dd38f6a71c715db372313f6a59616706fd610", "decodedHeader": { "contentCommitment": { + "blobsHash": "0x001cedbd7ea5309ef9d1d159209835409bf41b6b1802597a52fa70cc82e934d9", "inHash": "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c", "outHash": "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb", - "numTxs": 2, - "txsEffectsHash": "0x00877c1db9d71fd7786d8ce0fa7dd38f6a71c715db372313f6a59616706fd610" + "numTxs": 2 }, "globalVariables": { "blockNumber": 1, "slotNumber": "0x0000000000000000000000000000000000000000000000000000000000000012", "chainId": 31337, - "timestamp": 1732895740, + "timestamp": 1732961424, "version": 1, - "coinbase": "0x17ad712f90d7d8734b3723f6f29ac3acb967a55a", - "feeRecipient": "0x2e84c5024fd1d6e390f8bd37fa9684b45083bbe378140851ef9dea0cb3461a49", + "coinbase": "0x2cf4a1c62581a88edae4234f887da6b9551ab171", + "feeRecipient": "0x0339e43debc9c5093c6862f6dea7ff66fcd7f45c01f87dfa61f802d30530ea4e", "gasFees": { "feePerDaGas": 0, - "feePerL2Gas": 54153594950 + "feePerL2Gas": 54153588500 } }, "totalFees": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -59,8 +58,9 @@ } } }, - "header": "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae00000001000000000000000000000000000000000000000000000000000000000000000200877c1db9d71fd7786d8ce0fa7dd38f6a71c715db372313f6a59616706fd61000089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6000000101fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb000000800c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d6390730000010023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000000800000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000006749e3fc17ad712f90d7d8734b3723f6f29ac3acb967a55a2e84c5024fd1d6e390f8bd37fa9684b45083bbe378140851ef9dea0cb3461a4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bce484600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x00dd5a4191deed280ded7ef5e7029ede7a8fed2a2dafc0b5135944e49346d5a3", + "header": "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae000000010000000000000000000000000000000000000000000000000000000000000002001cedbd7ea5309ef9d1d159209835409bf41b6b1802597a52fa70cc82e934d900089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6000000101fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb000000800c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d6390730000010023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000000800000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000674ae4902cf4a1c62581a88edae4234f887da6b9551ab1710339e43debc9c5093c6862f6dea7ff66fcd7f45c01f87dfa61f802d30530ea4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bce2f1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x005838c184fb9da5be8d12382acd314219bbf72275c7242738bcb5c334f509ef", + "blobInputs": "0x01010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440140ac4f3ee53aedc4865073ae7fb664e7401d10eadbe3bbcc266c35059f14826bb0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "numTxs": 0 } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/empty_block_2.json b/l1-contracts/test/fixtures/empty_block_2.json index 5646d6d90a3..7b99e1d9b7c 100644 --- a/l1-contracts/test/fixtures/empty_block_2.json +++ b/l1-contracts/test/fixtures/empty_block_2.json @@ -8,35 +8,34 @@ "l2ToL1Messages": [] }, "block": { - "archive": "0x17f47e9df1e91a0cc2d64ab507734d0ae6b8b5f48cf5fd584bc33c70456c667d", - "blockHash": "0x2557b79eff9f25a2d7529b97e0af1d7c85ea9bfaf0d8b74389d84e2d2c90cbe4", + "archive": "0x02d998d1be2b2024b668f2581679e28a526abf15d7375aa2e7b969766f6b4150", + "blockHash": "0x29787560359b663bf91fd4877518fa25dbb2423dd20290dd15577c1ea8598d6f", "body": "0x00000000", - "txsEffectsHash": "0x00877c1db9d71fd7786d8ce0fa7dd38f6a71c715db372313f6a59616706fd610", "decodedHeader": { "contentCommitment": { + "blobsHash": "0x001cedbd7ea5309ef9d1d159209835409bf41b6b1802597a52fa70cc82e934d9", "inHash": "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c", "outHash": "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb", - "numTxs": 2, - "txsEffectsHash": "0x00877c1db9d71fd7786d8ce0fa7dd38f6a71c715db372313f6a59616706fd610" + "numTxs": 2 }, "globalVariables": { "blockNumber": 2, "slotNumber": "0x0000000000000000000000000000000000000000000000000000000000000013", "chainId": 31337, - "timestamp": 1732895764, + "timestamp": 1732961448, "version": 1, - "coinbase": "0x17ad712f90d7d8734b3723f6f29ac3acb967a55a", - "feeRecipient": "0x2e84c5024fd1d6e390f8bd37fa9684b45083bbe378140851ef9dea0cb3461a49", + "coinbase": "0x2cf4a1c62581a88edae4234f887da6b9551ab171", + "feeRecipient": "0x0339e43debc9c5093c6862f6dea7ff66fcd7f45c01f87dfa61f802d30530ea4e", "gasFees": { "feePerDaGas": 0, - "feePerL2Gas": 54153594950 + "feePerL2Gas": 54153588500 } }, "totalFees": "0x0000000000000000000000000000000000000000000000000000000000000000", "totalManaUsed": "0x0000000000000000000000000000000000000000000000000000000000000000", "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x0fafcb46cf14179b2c9f82f861f0e2c13408687d6b48bcdc3b3b076ad623c716" + "root": "0x2e558c94bd1a3d8512eaf74c297f8a5b28ca14c79636a9f81e0538804b21ff6c" }, "stateReference": { "l1ToL2MessageTree": { @@ -59,8 +58,9 @@ } } }, - "header": "0x0fafcb46cf14179b2c9f82f861f0e2c13408687d6b48bcdc3b3b076ad623c71600000002000000000000000000000000000000000000000000000000000000000000000200877c1db9d71fd7786d8ce0fa7dd38f6a71c715db372313f6a59616706fd61000089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6000000201fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb000001000c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d6390730000018023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000000800000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000006749e41417ad712f90d7d8734b3723f6f29ac3acb967a55a2e84c5024fd1d6e390f8bd37fa9684b45083bbe378140851ef9dea0cb3461a4900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bce484600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x003923b85214777fa03dd6dd8b7f66c44d98dd8b2cc8f3996a4f5bbfc146a184", + "header": "0x2e558c94bd1a3d8512eaf74c297f8a5b28ca14c79636a9f81e0538804b21ff6c000000020000000000000000000000000000000000000000000000000000000000000002001cedbd7ea5309ef9d1d159209835409bf41b6b1802597a52fa70cc82e934d900089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6000000201fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb000001000c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d6390730000018023c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9000000800000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000674ae4a82cf4a1c62581a88edae4234f887da6b9551ab1710339e43debc9c5093c6862f6dea7ff66fcd7f45c01f87dfa61f802d30530ea4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bce2f1400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x001a7690dc1e32dee9ec361537f5cf2034e9c79310bffe596a6d67e4784134bb", + "blobInputs": "0x01010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440140ac4f3ee53aedc4865073ae7fb664e7401d10eadbe3bbcc266c35059f14826bb0000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "numTxs": 0 } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_1.json b/l1-contracts/test/fixtures/mixed_block_1.json index 2a6921e6eaa..491663b4ee0 100644 --- a/l1-contracts/test/fixtures/mixed_block_1.json +++ b/l1-contracts/test/fixtures/mixed_block_1.json @@ -58,28 +58,27 @@ ] }, "block": { - "archive": "0x1cff61d39a2f942d4f96fe19dd6acba151dda8180b9251f5db3ad4865ff4cbf7", - "blockHash": "0x1145ae8e8b4198948eb566676224c83550d5a9f58589c3e306a7d1ff391a4f96", + "archive": "0x22666f92ace792cc12f915398edb14583d408832420c18e58fc2b0ffe60a3a1d", + "blockHash": "0x04475bf1d89e4a58f7e06d3b4d01ae0a7ed8e26be1eec9cf83824974f4aa91de", "body": "0x00000004000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000004100100000000000000000000000000000000000000000000000000000000000410020000000000000000000000000000000000000000000000000000000000041003000000000000000000000000000000000000000000000000000000000004100400000000000000000000000000000000000000000000000000000000000410050000000000000000000000000000000000000000000000000000000000041006000000000000000000000000000000000000000000000000000000000004100700000000000000000000000000000000000000000000000000000000000410080000000000000000000000000000000000000000000000000000000000041009000000000000000000000000000000000000000000000000000000000004100a000000000000000000000000000000000000000000000000000000000004100b000000000000000000000000000000000000000000000000000000000004100c000000000000000000000000000000000000000000000000000000000004100d000000000000000000000000000000000000000000000000000000000004100e000000000000000000000000000000000000000000000000000000000004100f0000000000000000000000000000000000000000000000000000000000041010000000000000000000000000000000000000000000000000000000000004101100000000000000000000000000000000000000000000000000000000000410120000000000000000000000000000000000000000000000000000000000041013000000000000000000000000000000000000000000000000000000000004101400000000000000000000000000000000000000000000000000000000000410150000000000000000000000000000000000000000000000000000000000041016000000000000000000000000000000000000000000000000000000000004101700000000000000000000000000000000000000000000000000000000000410180000000000000000000000000000000000000000000000000000000000041019000000000000000000000000000000000000000000000000000000000004101a000000000000000000000000000000000000000000000000000000000004101b000000000000000000000000000000000000000000000000000000000004101c000000000000000000000000000000000000000000000000000000000004101d000000000000000000000000000000000000000000000000000000000004101e000000000000000000000000000000000000000000000000000000000004101f0000000000000000000000000000000000000000000000000000000000041020000000000000000000000000000000000000000000000000000000000004102100000000000000000000000000000000000000000000000000000000000410220000000000000000000000000000000000000000000000000000000000041023000000000000000000000000000000000000000000000000000000000004102400000000000000000000000000000000000000000000000000000000000410250000000000000000000000000000000000000000000000000000000000041026000000000000000000000000000000000000000000000000000000000004102700000000000000000000000000000000000000000000000000000000000410280000000000000000000000000000000000000000000000000000000000041029000000000000000000000000000000000000000000000000000000000004102a000000000000000000000000000000000000000000000000000000000004102b000000000000000000000000000000000000000000000000000000000004102c000000000000000000000000000000000000000000000000000000000004102d000000000000000000000000000000000000000000000000000000000004102e000000000000000000000000000000000000000000000000000000000004102f0000000000000000000000000000000000000000000000000000000000041030000000000000000000000000000000000000000000000000000000000004103100000000000000000000000000000000000000000000000000000000000410320000000000000000000000000000000000000000000000000000000000041033000000000000000000000000000000000000000000000000000000000004103400000000000000000000000000000000000000000000000000000000000410350000000000000000000000000000000000000000000000000000000000041036000000000000000000000000000000000000000000000000000000000004103700000000000000000000000000000000000000000000000000000000000410380000000000000000000000000000000000000000000000000000000000041039000000000000000000000000000000000000000000000000000000000004103a000000000000000000000000000000000000000000000000000000000004103b000000000000000000000000000000000000000000000000000000000004103c000000000000000000000000000000000000000000000000000000000004103d000000000000000000000000000000000000000000000000000000000004103e000000000000000000000000000000000000000000000000000000000004103f4000000000000000000000000000000000000000000000000000000000000400010000000000000000000000000000000000000000000000000000000000041100000000000000000000000000000000000000000000000000000000000004110100000000000000000000000000000000000000000000000000000000000411020000000000000000000000000000000000000000000000000000000000041103000000000000000000000000000000000000000000000000000000000004110400000000000000000000000000000000000000000000000000000000000411050000000000000000000000000000000000000000000000000000000000041106000000000000000000000000000000000000000000000000000000000004110700000000000000000000000000000000000000000000000000000000000411080000000000000000000000000000000000000000000000000000000000041109000000000000000000000000000000000000000000000000000000000004110a000000000000000000000000000000000000000000000000000000000004110b000000000000000000000000000000000000000000000000000000000004110c000000000000000000000000000000000000000000000000000000000004110d000000000000000000000000000000000000000000000000000000000004110e000000000000000000000000000000000000000000000000000000000004110f0000000000000000000000000000000000000000000000000000000000041110000000000000000000000000000000000000000000000000000000000004111100000000000000000000000000000000000000000000000000000000000411120000000000000000000000000000000000000000000000000000000000041113000000000000000000000000000000000000000000000000000000000004111400000000000000000000000000000000000000000000000000000000000411150000000000000000000000000000000000000000000000000000000000041116000000000000000000000000000000000000000000000000000000000004111700000000000000000000000000000000000000000000000000000000000411180000000000000000000000000000000000000000000000000000000000041119000000000000000000000000000000000000000000000000000000000004111a000000000000000000000000000000000000000000000000000000000004111b000000000000000000000000000000000000000000000000000000000004111c000000000000000000000000000000000000000000000000000000000004111d000000000000000000000000000000000000000000000000000000000004111e000000000000000000000000000000000000000000000000000000000004111f0000000000000000000000000000000000000000000000000000000000041120000000000000000000000000000000000000000000000000000000000004112100000000000000000000000000000000000000000000000000000000000411220000000000000000000000000000000000000000000000000000000000041123000000000000000000000000000000000000000000000000000000000004112400000000000000000000000000000000000000000000000000000000000411250000000000000000000000000000000000000000000000000000000000041126000000000000000000000000000000000000000000000000000000000004112700000000000000000000000000000000000000000000000000000000000411280000000000000000000000000000000000000000000000000000000000041129000000000000000000000000000000000000000000000000000000000004112a000000000000000000000000000000000000000000000000000000000004112b000000000000000000000000000000000000000000000000000000000004112c000000000000000000000000000000000000000000000000000000000004112d000000000000000000000000000000000000000000000000000000000004112e000000000000000000000000000000000000000000000000000000000004112f0000000000000000000000000000000000000000000000000000000000041130000000000000000000000000000000000000000000000000000000000004113100000000000000000000000000000000000000000000000000000000000411320000000000000000000000000000000000000000000000000000000000041133000000000000000000000000000000000000000000000000000000000004113400000000000000000000000000000000000000000000000000000000000411350000000000000000000000000000000000000000000000000000000000041136000000000000000000000000000000000000000000000000000000000004113700000000000000000000000000000000000000000000000000000000000411380000000000000000000000000000000000000000000000000000000000041139000000000000000000000000000000000000000000000000000000000004113a000000000000000000000000000000000000000000000000000000000004113b000000000000000000000000000000000000000000000000000000000004113c000000000000000000000000000000000000000000000000000000000004113d000000000000000000000000000000000000000000000000000000000004113e080097a6ec570e9b8e257647c9c74c5ad3edc57ca5ef6ae44d80b3c30d1d99b9b300ce48ec41d1edde0066fab553a456ae2f380d14fa8f956af1fb0217513a598900619ff12eaf97f63aa2a2311de3b6571a7b880a5247cb33b6a74787bf3f9bd5007854a2fad4e1801c6404394bf3d37ab08c135ea38a1974242e39a21273685f000f55796e72957a819e68a22e8602d73c3ba3718a5a4bd92b80b0aa444b182a00788b6e9874fb040ee679a7fae257190099a605229b948334e54a57739535d4004f1658ee3c1a91627e5d72f5a731f0796299df82ab41e72c88eee0c82fa85e003ee802add96628c693ed71afa9908138ba5a6fbf0a5f29a9c74e4e42aba6713f0000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000004200a0000000000000000000000000000000000000000000000000000000000042001000000000000000000000000000000000000000000000000000000000004200b0000000000000000000000000000000000000000000000000000000000042002000000000000000000000000000000000000000000000000000000000004200c0000000000000000000000000000000000000000000000000000000000042003000000000000000000000000000000000000000000000000000000000004200d0000000000000000000000000000000000000000000000000000000000042004000000000000000000000000000000000000000000000000000000000004200e0000000000000000000000000000000000000000000000000000000000042005000000000000000000000000000000000000000000000000000000000004200f00000000000000000000000000000000000000000000000000000000000420060000000000000000000000000000000000000000000000000000000000042010000000000000000000000000000000000000000000000000000000000004200700000000000000000000000000000000000000000000000000000000000420110000000000000000000000000000000000000000000000000000000000042008000000000000000000000000000000000000000000000000000000000004201200000000000000000000000000000000000000000000000000000000000420090000000000000000000000000000000000000000000000000000000000042013000000000000000000000000000000000000000000000000000000000004200a0000000000000000000000000000000000000000000000000000000000042014000000000000000000000000000000000000000000000000000000000004200b0000000000000000000000000000000000000000000000000000000000042015000000000000000000000000000000000000000000000000000000000004200c0000000000000000000000000000000000000000000000000000000000042016000000000000000000000000000000000000000000000000000000000004200d0000000000000000000000000000000000000000000000000000000000042017000000000000000000000000000000000000000000000000000000000004200e0000000000000000000000000000000000000000000000000000000000042018000000000000000000000000000000000000000000000000000000000004200f00000000000000000000000000000000000000000000000000000000000420190000000000000000000000000000000000000000000000000000000000042010000000000000000000000000000000000000000000000000000000000004201a0000000000000000000000000000000000000000000000000000000000042011000000000000000000000000000000000000000000000000000000000004201b0000000000000000000000000000000000000000000000000000000000042012000000000000000000000000000000000000000000000000000000000004201c0000000000000000000000000000000000000000000000000000000000042013000000000000000000000000000000000000000000000000000000000004201d0000000000000000000000000000000000000000000000000000000000042014000000000000000000000000000000000000000000000000000000000004201e0000000000000000000000000000000000000000000000000000000000042015000000000000000000000000000000000000000000000000000000000004201f00000000000000000000000000000000000000000000000000000000000420160000000000000000000000000000000000000000000000000000000000042020000000000000000000000000000000000000000000000000000000000004201700000000000000000000000000000000000000000000000000000000000420210000000000000000000000000000000000000000000000000000000000042018000000000000000000000000000000000000000000000000000000000004202200000000000000000000000000000000000000000000000000000000000420190000000000000000000000000000000000000000000000000000000000042023000000000000000000000000000000000000000000000000000000000004201a0000000000000000000000000000000000000000000000000000000000042024000000000000000000000000000000000000000000000000000000000004201b0000000000000000000000000000000000000000000000000000000000042025000000000000000000000000000000000000000000000000000000000004201c0000000000000000000000000000000000000000000000000000000000042026000000000000000000000000000000000000000000000000000000000004201d0000000000000000000000000000000000000000000000000000000000042027000000000000000000000000000000000000000000000000000000000004201e0000000000000000000000000000000000000000000000000000000000042028000000000000000000000000000000000000000000000000000000000004201f00000000000000000000000000000000000000000000000000000000000420290000000000000000000000000000000000000000000000000000000000042020000000000000000000000000000000000000000000000000000000000004202a0000000000000000000000000000000000000000000000000000000000042021000000000000000000000000000000000000000000000000000000000004202b0000000000000000000000000000000000000000000000000000000000042022000000000000000000000000000000000000000000000000000000000004202c0000000000000000000000000000000000000000000000000000000000042023000000000000000000000000000000000000000000000000000000000004202d0000000000000000000000000000000000000000000000000000000000042024000000000000000000000000000000000000000000000000000000000004202e0000000000000000000000000000000000000000000000000000000000042025000000000000000000000000000000000000000000000000000000000004202f00000000000000000000000000000000000000000000000000000000000420260000000000000000000000000000000000000000000000000000000000042030000000000000000000000000000000000000000000000000000000000004202700000000000000000000000000000000000000000000000000000000000420310000000000000000000000000000000000000000000000000000000000042028000000000000000000000000000000000000000000000000000000000004203200000000000000000000000000000000000000000000000000000000000420290000000000000000000000000000000000000000000000000000000000042033000000000000000000000000000000000000000000000000000000000004202a0000000000000000000000000000000000000000000000000000000000042034000000000000000000000000000000000000000000000000000000000004202b0000000000000000000000000000000000000000000000000000000000042035000000000000000000000000000000000000000000000000000000000004202c0000000000000000000000000000000000000000000000000000000000042036000000000000000000000000000000000000000000000000000000000004202d0000000000000000000000000000000000000000000000000000000000042037000000000000000000000000000000000000000000000000000000000004202e0000000000000000000000000000000000000000000000000000000000042038000000000000000000000000000000000000000000000000000000000004202f00000000000000000000000000000000000000000000000000000000000420390000000000000000000000000000000000000000000000000000000000042030000000000000000000000000000000000000000000000000000000000004203a0000000000000000000000000000000000000000000000000000000000042031000000000000000000000000000000000000000000000000000000000004203b0000000000000000000000000000000000000000000000000000000000042032000000000000000000000000000000000000000000000000000000000004203c0000000000000000000000000000000000000000000000000000000000042033000000000000000000000000000000000000000000000000000000000004203d0000000000000000000000000000000000000000000000000000000000042034000000000000000000000000000000000000000000000000000000000004203e0000000000000000000000000000000000000000000000000000000000042035000000000000000000000000000000000000000000000000000000000004203f00000000000000000000000000000000000000000000000000000000000420360000000000000000000000000000000000000000000000000000000000042040000000000000000000000000000000000000000000000000000000000004203700000000000000000000000000000000000000000000000000000000000420410000000000000000000000000000000000000000000000000000000000042038000000000000000000000000000000000000000000000000000000000004204200000000000000000000000000000000000000000000000000000000000420390000000000000000000000000000000000000000000000000000000000042043000000000000000000000000000000000000000000000000000000000004203a0000000000000000000000000000000000000000000000000000000000042044000000000000000000000000000000000000000000000000000000000004203b0000000000000000000000000000000000000000000000000000000000042045000000000000000000000000000000000000000000000000000000000004203c0000000000000000000000000000000000000000000000000000000000042046000000000000000000000000000000000000000000000000000000000004203d0000000000000000000000000000000000000000000000000000000000042047000000000000000000000000000000000000000000000000000000000004203e0000000000000000000000000000000000000000000000000000000000042048200000000000000000000000000000000000000000000000000000000000041700000000000000000000000000000000000000000000000000000000000004170100000000000000000000000000000000000000000000000000000000000417020000000000000000000000000000000000000000000000000000000000041703000000000000000000000000000000000000000000000000000000000004170400000000000000000000000000000000000000000000000000000000000417050000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004170100000000000000000000000000000000000000000000000000000000000417020000000000000000000000000000000000000000000000000000000000041703000000000000000000000000000000000000000000000000000000000004170400000000000000000000000000000000000000000000000000000000000417050000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417020000000000000000000000000000000000000000000000000000000000041703000000000000000000000000000000000000000000000000000000000004170400000000000000000000000000000000000000000000000000000000000417050000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041703000000000000000000000000000000000000000000000000000000000004170400000000000000000000000000000000000000000000000000000000000417050000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041714000000000000000000000000000000000000000000000000000000000004170400000000000000000000000000000000000000000000000000000000000417050000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041714000000000000000000000000000000000000000000000000000000000004171500000000000000000000000000000000000000000000000000000000000417050000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041714000000000000000000000000000000000000000000000000000000000004171500000000000000000000000000000000000000000000000000000000000417160000000000000000000000000000000000000000000000000000000000041706000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041714000000000000000000000000000000000000000000000000000000000004171500000000000000000000000000000000000000000000000000000000000417160000000000000000000000000000000000000000000000000000000000041717000000000000000000000000000000000000000000000000000000000004170700000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041714000000000000000000000000000000000000000000000000000000000004171500000000000000000000000000000000000000000000000000000000000417160000000000000000000000000000000000000000000000000000000000041717000000000000000000000000000000000000000000000000000000000004171800000000000000000000000000000000000000000000000000000000000417080000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f00000000000000000000000000000000000000000000000000000000000417100000000000000000000000000000000000000000000000000000000000041711000000000000000000000000000000000000000000000000000000000004171200000000000000000000000000000000000000000000000000000000000417130000000000000000000000000000000000000000000000000000000000041714000000000000000000000000000000000000000000000000000000000004171500000000000000000000000000000000000000000000000000000000000417160000000000000000000000000000000000000000000000000000000000041717000000000000000000000000000000000000000000000000000000000004171800000000000000000000000000000000000000000000000000000000000417190000000000000000000000000000000000000000000000000000000000041709000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004170a000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004170b000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004170c000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004170d000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004170e000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f000000000000000000000000000000000000000000000000000000000004170f0000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041710000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004171100000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417120000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041713000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041724000000000000000000000000000000000000000000000000000000000004171400000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041724000000000000000000000000000000000000000000000000000000000004172500000000000000000000000000000000000000000000000000000000000417150000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041724000000000000000000000000000000000000000000000000000000000004172500000000000000000000000000000000000000000000000000000000000417260000000000000000000000000000000000000000000000000000000000041716000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041724000000000000000000000000000000000000000000000000000000000004172500000000000000000000000000000000000000000000000000000000000417260000000000000000000000000000000000000000000000000000000000041727000000000000000000000000000000000000000000000000000000000004171700000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041724000000000000000000000000000000000000000000000000000000000004172500000000000000000000000000000000000000000000000000000000000417260000000000000000000000000000000000000000000000000000000000041727000000000000000000000000000000000000000000000000000000000004172800000000000000000000000000000000000000000000000000000000000417180000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f00000000000000000000000000000000000000000000000000000000000417200000000000000000000000000000000000000000000000000000000000041721000000000000000000000000000000000000000000000000000000000004172200000000000000000000000000000000000000000000000000000000000417230000000000000000000000000000000000000000000000000000000000041724000000000000000000000000000000000000000000000000000000000004172500000000000000000000000000000000000000000000000000000000000417260000000000000000000000000000000000000000000000000000000000041727000000000000000000000000000000000000000000000000000000000004172800000000000000000000000000000000000000000000000000000000000417290000000000000000000000000000000000000000000000000000000000041719000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004171a000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004172b000000000000000000000000000000000000000000000000000000000004171b000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004172b000000000000000000000000000000000000000000000000000000000004172c000000000000000000000000000000000000000000000000000000000004171c000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004172b000000000000000000000000000000000000000000000000000000000004172c000000000000000000000000000000000000000000000000000000000004172d000000000000000000000000000000000000000000000000000000000004171d000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004172b000000000000000000000000000000000000000000000000000000000004172c000000000000000000000000000000000000000000000000000000000004172d000000000000000000000000000000000000000000000000000000000004172e000000000000000000000000000000000000000000000000000000000004171e000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004172b000000000000000000000000000000000000000000000000000000000004172c000000000000000000000000000000000000000000000000000000000004172d000000000000000000000000000000000000000000000000000000000004172e000000000000000000000000000000000000000000000000000000000004172f000000000000000000000000000000000000000000000000000000000004171f0000000000000000000000000000000000000000000000000000000000041720000000000000000000000000000000000000000000000000000000000004172100000000000000000000000000000000000000000000000000000000000417220000000000000000000000000000000000000000000000000000000000041723000000000000000000000000000000000000000000000000000000000004172400000000000000000000000000000000000000000000000000000000000417250000000000000000000000000000000000000000000000000000000000041726000000000000000000000000000000000000000000000000000000000004172700000000000000000000000000000000000000000000000000000000000417280000000000000000000000000000000000000000000000000000000000041729000000000000000000000000000000000000000000000000000000000004172a000000000000000000000000000000000000000000000000000000000004172b000000000000000000000000000000000000000000000000000000000004172c000000000000000000000000000000000000000000000000000000000004172d000000000000000000000000000000000000000000000000000000000004172e000000000000000000000000000000000000000000000000000000000004172f0000000000000000000000000000000000000000000000000000000000041730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000008100100000000000000000000000000000000000000000000000000000000000810020000000000000000000000000000000000000000000000000000000000081003000000000000000000000000000000000000000000000000000000000008100400000000000000000000000000000000000000000000000000000000000810050000000000000000000000000000000000000000000000000000000000081006000000000000000000000000000000000000000000000000000000000008100700000000000000000000000000000000000000000000000000000000000810080000000000000000000000000000000000000000000000000000000000081009000000000000000000000000000000000000000000000000000000000008100a000000000000000000000000000000000000000000000000000000000008100b000000000000000000000000000000000000000000000000000000000008100c000000000000000000000000000000000000000000000000000000000008100d000000000000000000000000000000000000000000000000000000000008100e000000000000000000000000000000000000000000000000000000000008100f0000000000000000000000000000000000000000000000000000000000081010000000000000000000000000000000000000000000000000000000000008101100000000000000000000000000000000000000000000000000000000000810120000000000000000000000000000000000000000000000000000000000081013000000000000000000000000000000000000000000000000000000000008101400000000000000000000000000000000000000000000000000000000000810150000000000000000000000000000000000000000000000000000000000081016000000000000000000000000000000000000000000000000000000000008101700000000000000000000000000000000000000000000000000000000000810180000000000000000000000000000000000000000000000000000000000081019000000000000000000000000000000000000000000000000000000000008101a000000000000000000000000000000000000000000000000000000000008101b000000000000000000000000000000000000000000000000000000000008101c000000000000000000000000000000000000000000000000000000000008101d000000000000000000000000000000000000000000000000000000000008101e000000000000000000000000000000000000000000000000000000000008101f0000000000000000000000000000000000000000000000000000000000081020000000000000000000000000000000000000000000000000000000000008102100000000000000000000000000000000000000000000000000000000000810220000000000000000000000000000000000000000000000000000000000081023000000000000000000000000000000000000000000000000000000000008102400000000000000000000000000000000000000000000000000000000000810250000000000000000000000000000000000000000000000000000000000081026000000000000000000000000000000000000000000000000000000000008102700000000000000000000000000000000000000000000000000000000000810280000000000000000000000000000000000000000000000000000000000081029000000000000000000000000000000000000000000000000000000000008102a000000000000000000000000000000000000000000000000000000000008102b000000000000000000000000000000000000000000000000000000000008102c000000000000000000000000000000000000000000000000000000000008102d000000000000000000000000000000000000000000000000000000000008102e000000000000000000000000000000000000000000000000000000000008102f0000000000000000000000000000000000000000000000000000000000081030000000000000000000000000000000000000000000000000000000000008103100000000000000000000000000000000000000000000000000000000000810320000000000000000000000000000000000000000000000000000000000081033000000000000000000000000000000000000000000000000000000000008103400000000000000000000000000000000000000000000000000000000000810350000000000000000000000000000000000000000000000000000000000081036000000000000000000000000000000000000000000000000000000000008103700000000000000000000000000000000000000000000000000000000000810380000000000000000000000000000000000000000000000000000000000081039000000000000000000000000000000000000000000000000000000000008103a000000000000000000000000000000000000000000000000000000000008103b000000000000000000000000000000000000000000000000000000000008103c000000000000000000000000000000000000000000000000000000000008103d000000000000000000000000000000000000000000000000000000000008103e000000000000000000000000000000000000000000000000000000000008103f4000000000000000000000000000000000000000000000000000000000000800010000000000000000000000000000000000000000000000000000000000081100000000000000000000000000000000000000000000000000000000000008110100000000000000000000000000000000000000000000000000000000000811020000000000000000000000000000000000000000000000000000000000081103000000000000000000000000000000000000000000000000000000000008110400000000000000000000000000000000000000000000000000000000000811050000000000000000000000000000000000000000000000000000000000081106000000000000000000000000000000000000000000000000000000000008110700000000000000000000000000000000000000000000000000000000000811080000000000000000000000000000000000000000000000000000000000081109000000000000000000000000000000000000000000000000000000000008110a000000000000000000000000000000000000000000000000000000000008110b000000000000000000000000000000000000000000000000000000000008110c000000000000000000000000000000000000000000000000000000000008110d000000000000000000000000000000000000000000000000000000000008110e000000000000000000000000000000000000000000000000000000000008110f0000000000000000000000000000000000000000000000000000000000081110000000000000000000000000000000000000000000000000000000000008111100000000000000000000000000000000000000000000000000000000000811120000000000000000000000000000000000000000000000000000000000081113000000000000000000000000000000000000000000000000000000000008111400000000000000000000000000000000000000000000000000000000000811150000000000000000000000000000000000000000000000000000000000081116000000000000000000000000000000000000000000000000000000000008111700000000000000000000000000000000000000000000000000000000000811180000000000000000000000000000000000000000000000000000000000081119000000000000000000000000000000000000000000000000000000000008111a000000000000000000000000000000000000000000000000000000000008111b000000000000000000000000000000000000000000000000000000000008111c000000000000000000000000000000000000000000000000000000000008111d000000000000000000000000000000000000000000000000000000000008111e000000000000000000000000000000000000000000000000000000000008111f0000000000000000000000000000000000000000000000000000000000081120000000000000000000000000000000000000000000000000000000000008112100000000000000000000000000000000000000000000000000000000000811220000000000000000000000000000000000000000000000000000000000081123000000000000000000000000000000000000000000000000000000000008112400000000000000000000000000000000000000000000000000000000000811250000000000000000000000000000000000000000000000000000000000081126000000000000000000000000000000000000000000000000000000000008112700000000000000000000000000000000000000000000000000000000000811280000000000000000000000000000000000000000000000000000000000081129000000000000000000000000000000000000000000000000000000000008112a000000000000000000000000000000000000000000000000000000000008112b000000000000000000000000000000000000000000000000000000000008112c000000000000000000000000000000000000000000000000000000000008112d000000000000000000000000000000000000000000000000000000000008112e000000000000000000000000000000000000000000000000000000000008112f0000000000000000000000000000000000000000000000000000000000081130000000000000000000000000000000000000000000000000000000000008113100000000000000000000000000000000000000000000000000000000000811320000000000000000000000000000000000000000000000000000000000081133000000000000000000000000000000000000000000000000000000000008113400000000000000000000000000000000000000000000000000000000000811350000000000000000000000000000000000000000000000000000000000081136000000000000000000000000000000000000000000000000000000000008113700000000000000000000000000000000000000000000000000000000000811380000000000000000000000000000000000000000000000000000000000081139000000000000000000000000000000000000000000000000000000000008113a000000000000000000000000000000000000000000000000000000000008113b000000000000000000000000000000000000000000000000000000000008113c000000000000000000000000000000000000000000000000000000000008113d000000000000000000000000000000000000000000000000000000000008113e08003c0472260790b0bdfb8ae4dc4d437e7686b73643f2198970d84e1059a5f13500bfd46275a318e438726ff2765ae154b63ab8a0daebcbed668a5f58a0e63dc1007906b9418dc758c6b4f8454c69baa48b7889b6b511d707abe8e2cb8f7c397300aeb60c4d65a44f122e58bf9565dfe2024b3ae654d5cf2e47ecb035d53c927000bf82e8cda20345f37bbb1de3932172324b57f0b98be483392697b168e3bba8000fb4bbad884ef30edf68e45a6cf2733fcf50310c69d7c1432b29af2c0aa8040023e1622d27fee3b4a40ab975ae0eb2e31619ef3dc76eb858f7fddb6a056131004689cd7007daf98dd3218b839b8e6a29f957154347b391fdb376bd0b344be23f0000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000008200a0000000000000000000000000000000000000000000000000000000000082001000000000000000000000000000000000000000000000000000000000008200b0000000000000000000000000000000000000000000000000000000000082002000000000000000000000000000000000000000000000000000000000008200c0000000000000000000000000000000000000000000000000000000000082003000000000000000000000000000000000000000000000000000000000008200d0000000000000000000000000000000000000000000000000000000000082004000000000000000000000000000000000000000000000000000000000008200e0000000000000000000000000000000000000000000000000000000000082005000000000000000000000000000000000000000000000000000000000008200f00000000000000000000000000000000000000000000000000000000000820060000000000000000000000000000000000000000000000000000000000082010000000000000000000000000000000000000000000000000000000000008200700000000000000000000000000000000000000000000000000000000000820110000000000000000000000000000000000000000000000000000000000082008000000000000000000000000000000000000000000000000000000000008201200000000000000000000000000000000000000000000000000000000000820090000000000000000000000000000000000000000000000000000000000082013000000000000000000000000000000000000000000000000000000000008200a0000000000000000000000000000000000000000000000000000000000082014000000000000000000000000000000000000000000000000000000000008200b0000000000000000000000000000000000000000000000000000000000082015000000000000000000000000000000000000000000000000000000000008200c0000000000000000000000000000000000000000000000000000000000082016000000000000000000000000000000000000000000000000000000000008200d0000000000000000000000000000000000000000000000000000000000082017000000000000000000000000000000000000000000000000000000000008200e0000000000000000000000000000000000000000000000000000000000082018000000000000000000000000000000000000000000000000000000000008200f00000000000000000000000000000000000000000000000000000000000820190000000000000000000000000000000000000000000000000000000000082010000000000000000000000000000000000000000000000000000000000008201a0000000000000000000000000000000000000000000000000000000000082011000000000000000000000000000000000000000000000000000000000008201b0000000000000000000000000000000000000000000000000000000000082012000000000000000000000000000000000000000000000000000000000008201c0000000000000000000000000000000000000000000000000000000000082013000000000000000000000000000000000000000000000000000000000008201d0000000000000000000000000000000000000000000000000000000000082014000000000000000000000000000000000000000000000000000000000008201e0000000000000000000000000000000000000000000000000000000000082015000000000000000000000000000000000000000000000000000000000008201f00000000000000000000000000000000000000000000000000000000000820160000000000000000000000000000000000000000000000000000000000082020000000000000000000000000000000000000000000000000000000000008201700000000000000000000000000000000000000000000000000000000000820210000000000000000000000000000000000000000000000000000000000082018000000000000000000000000000000000000000000000000000000000008202200000000000000000000000000000000000000000000000000000000000820190000000000000000000000000000000000000000000000000000000000082023000000000000000000000000000000000000000000000000000000000008201a0000000000000000000000000000000000000000000000000000000000082024000000000000000000000000000000000000000000000000000000000008201b0000000000000000000000000000000000000000000000000000000000082025000000000000000000000000000000000000000000000000000000000008201c0000000000000000000000000000000000000000000000000000000000082026000000000000000000000000000000000000000000000000000000000008201d0000000000000000000000000000000000000000000000000000000000082027000000000000000000000000000000000000000000000000000000000008201e0000000000000000000000000000000000000000000000000000000000082028000000000000000000000000000000000000000000000000000000000008201f00000000000000000000000000000000000000000000000000000000000820290000000000000000000000000000000000000000000000000000000000082020000000000000000000000000000000000000000000000000000000000008202a0000000000000000000000000000000000000000000000000000000000082021000000000000000000000000000000000000000000000000000000000008202b0000000000000000000000000000000000000000000000000000000000082022000000000000000000000000000000000000000000000000000000000008202c0000000000000000000000000000000000000000000000000000000000082023000000000000000000000000000000000000000000000000000000000008202d0000000000000000000000000000000000000000000000000000000000082024000000000000000000000000000000000000000000000000000000000008202e0000000000000000000000000000000000000000000000000000000000082025000000000000000000000000000000000000000000000000000000000008202f00000000000000000000000000000000000000000000000000000000000820260000000000000000000000000000000000000000000000000000000000082030000000000000000000000000000000000000000000000000000000000008202700000000000000000000000000000000000000000000000000000000000820310000000000000000000000000000000000000000000000000000000000082028000000000000000000000000000000000000000000000000000000000008203200000000000000000000000000000000000000000000000000000000000820290000000000000000000000000000000000000000000000000000000000082033000000000000000000000000000000000000000000000000000000000008202a0000000000000000000000000000000000000000000000000000000000082034000000000000000000000000000000000000000000000000000000000008202b0000000000000000000000000000000000000000000000000000000000082035000000000000000000000000000000000000000000000000000000000008202c0000000000000000000000000000000000000000000000000000000000082036000000000000000000000000000000000000000000000000000000000008202d0000000000000000000000000000000000000000000000000000000000082037000000000000000000000000000000000000000000000000000000000008202e0000000000000000000000000000000000000000000000000000000000082038000000000000000000000000000000000000000000000000000000000008202f00000000000000000000000000000000000000000000000000000000000820390000000000000000000000000000000000000000000000000000000000082030000000000000000000000000000000000000000000000000000000000008203a0000000000000000000000000000000000000000000000000000000000082031000000000000000000000000000000000000000000000000000000000008203b0000000000000000000000000000000000000000000000000000000000082032000000000000000000000000000000000000000000000000000000000008203c0000000000000000000000000000000000000000000000000000000000082033000000000000000000000000000000000000000000000000000000000008203d0000000000000000000000000000000000000000000000000000000000082034000000000000000000000000000000000000000000000000000000000008203e0000000000000000000000000000000000000000000000000000000000082035000000000000000000000000000000000000000000000000000000000008203f00000000000000000000000000000000000000000000000000000000000820360000000000000000000000000000000000000000000000000000000000082040000000000000000000000000000000000000000000000000000000000008203700000000000000000000000000000000000000000000000000000000000820410000000000000000000000000000000000000000000000000000000000082038000000000000000000000000000000000000000000000000000000000008204200000000000000000000000000000000000000000000000000000000000820390000000000000000000000000000000000000000000000000000000000082043000000000000000000000000000000000000000000000000000000000008203a0000000000000000000000000000000000000000000000000000000000082044000000000000000000000000000000000000000000000000000000000008203b0000000000000000000000000000000000000000000000000000000000082045000000000000000000000000000000000000000000000000000000000008203c0000000000000000000000000000000000000000000000000000000000082046000000000000000000000000000000000000000000000000000000000008203d0000000000000000000000000000000000000000000000000000000000082047000000000000000000000000000000000000000000000000000000000008203e0000000000000000000000000000000000000000000000000000000000082048200000000000000000000000000000000000000000000000000000000000081700000000000000000000000000000000000000000000000000000000000008170100000000000000000000000000000000000000000000000000000000000817020000000000000000000000000000000000000000000000000000000000081703000000000000000000000000000000000000000000000000000000000008170400000000000000000000000000000000000000000000000000000000000817050000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008170100000000000000000000000000000000000000000000000000000000000817020000000000000000000000000000000000000000000000000000000000081703000000000000000000000000000000000000000000000000000000000008170400000000000000000000000000000000000000000000000000000000000817050000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817020000000000000000000000000000000000000000000000000000000000081703000000000000000000000000000000000000000000000000000000000008170400000000000000000000000000000000000000000000000000000000000817050000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081703000000000000000000000000000000000000000000000000000000000008170400000000000000000000000000000000000000000000000000000000000817050000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081714000000000000000000000000000000000000000000000000000000000008170400000000000000000000000000000000000000000000000000000000000817050000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081714000000000000000000000000000000000000000000000000000000000008171500000000000000000000000000000000000000000000000000000000000817050000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081714000000000000000000000000000000000000000000000000000000000008171500000000000000000000000000000000000000000000000000000000000817160000000000000000000000000000000000000000000000000000000000081706000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081714000000000000000000000000000000000000000000000000000000000008171500000000000000000000000000000000000000000000000000000000000817160000000000000000000000000000000000000000000000000000000000081717000000000000000000000000000000000000000000000000000000000008170700000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081714000000000000000000000000000000000000000000000000000000000008171500000000000000000000000000000000000000000000000000000000000817160000000000000000000000000000000000000000000000000000000000081717000000000000000000000000000000000000000000000000000000000008171800000000000000000000000000000000000000000000000000000000000817080000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f00000000000000000000000000000000000000000000000000000000000817100000000000000000000000000000000000000000000000000000000000081711000000000000000000000000000000000000000000000000000000000008171200000000000000000000000000000000000000000000000000000000000817130000000000000000000000000000000000000000000000000000000000081714000000000000000000000000000000000000000000000000000000000008171500000000000000000000000000000000000000000000000000000000000817160000000000000000000000000000000000000000000000000000000000081717000000000000000000000000000000000000000000000000000000000008171800000000000000000000000000000000000000000000000000000000000817190000000000000000000000000000000000000000000000000000000000081709000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008170a000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008170b000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008170c000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008170d000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008170e000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f000000000000000000000000000000000000000000000000000000000008170f0000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081710000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008171100000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817120000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081713000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081724000000000000000000000000000000000000000000000000000000000008171400000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081724000000000000000000000000000000000000000000000000000000000008172500000000000000000000000000000000000000000000000000000000000817150000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081724000000000000000000000000000000000000000000000000000000000008172500000000000000000000000000000000000000000000000000000000000817260000000000000000000000000000000000000000000000000000000000081716000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081724000000000000000000000000000000000000000000000000000000000008172500000000000000000000000000000000000000000000000000000000000817260000000000000000000000000000000000000000000000000000000000081727000000000000000000000000000000000000000000000000000000000008171700000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081724000000000000000000000000000000000000000000000000000000000008172500000000000000000000000000000000000000000000000000000000000817260000000000000000000000000000000000000000000000000000000000081727000000000000000000000000000000000000000000000000000000000008172800000000000000000000000000000000000000000000000000000000000817180000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f00000000000000000000000000000000000000000000000000000000000817200000000000000000000000000000000000000000000000000000000000081721000000000000000000000000000000000000000000000000000000000008172200000000000000000000000000000000000000000000000000000000000817230000000000000000000000000000000000000000000000000000000000081724000000000000000000000000000000000000000000000000000000000008172500000000000000000000000000000000000000000000000000000000000817260000000000000000000000000000000000000000000000000000000000081727000000000000000000000000000000000000000000000000000000000008172800000000000000000000000000000000000000000000000000000000000817290000000000000000000000000000000000000000000000000000000000081719000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008171a000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008172b000000000000000000000000000000000000000000000000000000000008171b000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008172b000000000000000000000000000000000000000000000000000000000008172c000000000000000000000000000000000000000000000000000000000008171c000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008172b000000000000000000000000000000000000000000000000000000000008172c000000000000000000000000000000000000000000000000000000000008172d000000000000000000000000000000000000000000000000000000000008171d000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008172b000000000000000000000000000000000000000000000000000000000008172c000000000000000000000000000000000000000000000000000000000008172d000000000000000000000000000000000000000000000000000000000008172e000000000000000000000000000000000000000000000000000000000008171e000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008172b000000000000000000000000000000000000000000000000000000000008172c000000000000000000000000000000000000000000000000000000000008172d000000000000000000000000000000000000000000000000000000000008172e000000000000000000000000000000000000000000000000000000000008172f000000000000000000000000000000000000000000000000000000000008171f0000000000000000000000000000000000000000000000000000000000081720000000000000000000000000000000000000000000000000000000000008172100000000000000000000000000000000000000000000000000000000000817220000000000000000000000000000000000000000000000000000000000081723000000000000000000000000000000000000000000000000000000000008172400000000000000000000000000000000000000000000000000000000000817250000000000000000000000000000000000000000000000000000000000081726000000000000000000000000000000000000000000000000000000000008172700000000000000000000000000000000000000000000000000000000000817280000000000000000000000000000000000000000000000000000000000081729000000000000000000000000000000000000000000000000000000000008172a000000000000000000000000000000000000000000000000000000000008172b000000000000000000000000000000000000000000000000000000000008172c000000000000000000000000000000000000000000000000000000000008172d000000000000000000000000000000000000000000000000000000000008172e000000000000000000000000000000000000000000000000000000000008172f00000000000000000000000000000000000000000000000000000000000817300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c100100000000000000000000000000000000000000000000000000000000000c100200000000000000000000000000000000000000000000000000000000000c100300000000000000000000000000000000000000000000000000000000000c100400000000000000000000000000000000000000000000000000000000000c100500000000000000000000000000000000000000000000000000000000000c100600000000000000000000000000000000000000000000000000000000000c100700000000000000000000000000000000000000000000000000000000000c100800000000000000000000000000000000000000000000000000000000000c100900000000000000000000000000000000000000000000000000000000000c100a00000000000000000000000000000000000000000000000000000000000c100b00000000000000000000000000000000000000000000000000000000000c100c00000000000000000000000000000000000000000000000000000000000c100d00000000000000000000000000000000000000000000000000000000000c100e00000000000000000000000000000000000000000000000000000000000c100f00000000000000000000000000000000000000000000000000000000000c101000000000000000000000000000000000000000000000000000000000000c101100000000000000000000000000000000000000000000000000000000000c101200000000000000000000000000000000000000000000000000000000000c101300000000000000000000000000000000000000000000000000000000000c101400000000000000000000000000000000000000000000000000000000000c101500000000000000000000000000000000000000000000000000000000000c101600000000000000000000000000000000000000000000000000000000000c101700000000000000000000000000000000000000000000000000000000000c101800000000000000000000000000000000000000000000000000000000000c101900000000000000000000000000000000000000000000000000000000000c101a00000000000000000000000000000000000000000000000000000000000c101b00000000000000000000000000000000000000000000000000000000000c101c00000000000000000000000000000000000000000000000000000000000c101d00000000000000000000000000000000000000000000000000000000000c101e00000000000000000000000000000000000000000000000000000000000c101f00000000000000000000000000000000000000000000000000000000000c102000000000000000000000000000000000000000000000000000000000000c102100000000000000000000000000000000000000000000000000000000000c102200000000000000000000000000000000000000000000000000000000000c102300000000000000000000000000000000000000000000000000000000000c102400000000000000000000000000000000000000000000000000000000000c102500000000000000000000000000000000000000000000000000000000000c102600000000000000000000000000000000000000000000000000000000000c102700000000000000000000000000000000000000000000000000000000000c102800000000000000000000000000000000000000000000000000000000000c102900000000000000000000000000000000000000000000000000000000000c102a00000000000000000000000000000000000000000000000000000000000c102b00000000000000000000000000000000000000000000000000000000000c102c00000000000000000000000000000000000000000000000000000000000c102d00000000000000000000000000000000000000000000000000000000000c102e00000000000000000000000000000000000000000000000000000000000c102f00000000000000000000000000000000000000000000000000000000000c103000000000000000000000000000000000000000000000000000000000000c103100000000000000000000000000000000000000000000000000000000000c103200000000000000000000000000000000000000000000000000000000000c103300000000000000000000000000000000000000000000000000000000000c103400000000000000000000000000000000000000000000000000000000000c103500000000000000000000000000000000000000000000000000000000000c103600000000000000000000000000000000000000000000000000000000000c103700000000000000000000000000000000000000000000000000000000000c103800000000000000000000000000000000000000000000000000000000000c103900000000000000000000000000000000000000000000000000000000000c103a00000000000000000000000000000000000000000000000000000000000c103b00000000000000000000000000000000000000000000000000000000000c103c00000000000000000000000000000000000000000000000000000000000c103d00000000000000000000000000000000000000000000000000000000000c103e00000000000000000000000000000000000000000000000000000000000c103f4000000000000000000000000000000000000000000000000000000000000c000100000000000000000000000000000000000000000000000000000000000c110000000000000000000000000000000000000000000000000000000000000c110100000000000000000000000000000000000000000000000000000000000c110200000000000000000000000000000000000000000000000000000000000c110300000000000000000000000000000000000000000000000000000000000c110400000000000000000000000000000000000000000000000000000000000c110500000000000000000000000000000000000000000000000000000000000c110600000000000000000000000000000000000000000000000000000000000c110700000000000000000000000000000000000000000000000000000000000c110800000000000000000000000000000000000000000000000000000000000c110900000000000000000000000000000000000000000000000000000000000c110a00000000000000000000000000000000000000000000000000000000000c110b00000000000000000000000000000000000000000000000000000000000c110c00000000000000000000000000000000000000000000000000000000000c110d00000000000000000000000000000000000000000000000000000000000c110e00000000000000000000000000000000000000000000000000000000000c110f00000000000000000000000000000000000000000000000000000000000c111000000000000000000000000000000000000000000000000000000000000c111100000000000000000000000000000000000000000000000000000000000c111200000000000000000000000000000000000000000000000000000000000c111300000000000000000000000000000000000000000000000000000000000c111400000000000000000000000000000000000000000000000000000000000c111500000000000000000000000000000000000000000000000000000000000c111600000000000000000000000000000000000000000000000000000000000c111700000000000000000000000000000000000000000000000000000000000c111800000000000000000000000000000000000000000000000000000000000c111900000000000000000000000000000000000000000000000000000000000c111a00000000000000000000000000000000000000000000000000000000000c111b00000000000000000000000000000000000000000000000000000000000c111c00000000000000000000000000000000000000000000000000000000000c111d00000000000000000000000000000000000000000000000000000000000c111e00000000000000000000000000000000000000000000000000000000000c111f00000000000000000000000000000000000000000000000000000000000c112000000000000000000000000000000000000000000000000000000000000c112100000000000000000000000000000000000000000000000000000000000c112200000000000000000000000000000000000000000000000000000000000c112300000000000000000000000000000000000000000000000000000000000c112400000000000000000000000000000000000000000000000000000000000c112500000000000000000000000000000000000000000000000000000000000c112600000000000000000000000000000000000000000000000000000000000c112700000000000000000000000000000000000000000000000000000000000c112800000000000000000000000000000000000000000000000000000000000c112900000000000000000000000000000000000000000000000000000000000c112a00000000000000000000000000000000000000000000000000000000000c112b00000000000000000000000000000000000000000000000000000000000c112c00000000000000000000000000000000000000000000000000000000000c112d00000000000000000000000000000000000000000000000000000000000c112e00000000000000000000000000000000000000000000000000000000000c112f00000000000000000000000000000000000000000000000000000000000c113000000000000000000000000000000000000000000000000000000000000c113100000000000000000000000000000000000000000000000000000000000c113200000000000000000000000000000000000000000000000000000000000c113300000000000000000000000000000000000000000000000000000000000c113400000000000000000000000000000000000000000000000000000000000c113500000000000000000000000000000000000000000000000000000000000c113600000000000000000000000000000000000000000000000000000000000c113700000000000000000000000000000000000000000000000000000000000c113800000000000000000000000000000000000000000000000000000000000c113900000000000000000000000000000000000000000000000000000000000c113a00000000000000000000000000000000000000000000000000000000000c113b00000000000000000000000000000000000000000000000000000000000c113c00000000000000000000000000000000000000000000000000000000000c113d00000000000000000000000000000000000000000000000000000000000c113e0800f8029be42ec3f25204907ca981fb71e5b357093eb5db10fc01ca98a4e4154c0030e13d351a5bf1d5a040e82a163ca57017f39162693f85c571e441e36d702d00a550ae0f39f977d9473d6de1be3232fc68ed0c4a601d53542148695102cfc9005580bc65e4bff9c8fffa64db02c0fa6af14d9d26fd962f4c5904cbd3ddec2500758c4a0d43dfec788b2f580877c4f473adec8f168ea24424f2600e4eb4916f00342602bf90d10f8ca8e582a894dcc4c02bb89fe458532e0c632b53bae54b4d00ca43ab78ab834337e9964d84a0674c9adabdca140539c5a6bc96e0ba9a51f6004ffbfd91be292a7c6a0e255e50caa156ac2d628b40ad2128c4ab63a92d8a1c3f00000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c200a00000000000000000000000000000000000000000000000000000000000c200100000000000000000000000000000000000000000000000000000000000c200b00000000000000000000000000000000000000000000000000000000000c200200000000000000000000000000000000000000000000000000000000000c200c00000000000000000000000000000000000000000000000000000000000c200300000000000000000000000000000000000000000000000000000000000c200d00000000000000000000000000000000000000000000000000000000000c200400000000000000000000000000000000000000000000000000000000000c200e00000000000000000000000000000000000000000000000000000000000c200500000000000000000000000000000000000000000000000000000000000c200f00000000000000000000000000000000000000000000000000000000000c200600000000000000000000000000000000000000000000000000000000000c201000000000000000000000000000000000000000000000000000000000000c200700000000000000000000000000000000000000000000000000000000000c201100000000000000000000000000000000000000000000000000000000000c200800000000000000000000000000000000000000000000000000000000000c201200000000000000000000000000000000000000000000000000000000000c200900000000000000000000000000000000000000000000000000000000000c201300000000000000000000000000000000000000000000000000000000000c200a00000000000000000000000000000000000000000000000000000000000c201400000000000000000000000000000000000000000000000000000000000c200b00000000000000000000000000000000000000000000000000000000000c201500000000000000000000000000000000000000000000000000000000000c200c00000000000000000000000000000000000000000000000000000000000c201600000000000000000000000000000000000000000000000000000000000c200d00000000000000000000000000000000000000000000000000000000000c201700000000000000000000000000000000000000000000000000000000000c200e00000000000000000000000000000000000000000000000000000000000c201800000000000000000000000000000000000000000000000000000000000c200f00000000000000000000000000000000000000000000000000000000000c201900000000000000000000000000000000000000000000000000000000000c201000000000000000000000000000000000000000000000000000000000000c201a00000000000000000000000000000000000000000000000000000000000c201100000000000000000000000000000000000000000000000000000000000c201b00000000000000000000000000000000000000000000000000000000000c201200000000000000000000000000000000000000000000000000000000000c201c00000000000000000000000000000000000000000000000000000000000c201300000000000000000000000000000000000000000000000000000000000c201d00000000000000000000000000000000000000000000000000000000000c201400000000000000000000000000000000000000000000000000000000000c201e00000000000000000000000000000000000000000000000000000000000c201500000000000000000000000000000000000000000000000000000000000c201f00000000000000000000000000000000000000000000000000000000000c201600000000000000000000000000000000000000000000000000000000000c202000000000000000000000000000000000000000000000000000000000000c201700000000000000000000000000000000000000000000000000000000000c202100000000000000000000000000000000000000000000000000000000000c201800000000000000000000000000000000000000000000000000000000000c202200000000000000000000000000000000000000000000000000000000000c201900000000000000000000000000000000000000000000000000000000000c202300000000000000000000000000000000000000000000000000000000000c201a00000000000000000000000000000000000000000000000000000000000c202400000000000000000000000000000000000000000000000000000000000c201b00000000000000000000000000000000000000000000000000000000000c202500000000000000000000000000000000000000000000000000000000000c201c00000000000000000000000000000000000000000000000000000000000c202600000000000000000000000000000000000000000000000000000000000c201d00000000000000000000000000000000000000000000000000000000000c202700000000000000000000000000000000000000000000000000000000000c201e00000000000000000000000000000000000000000000000000000000000c202800000000000000000000000000000000000000000000000000000000000c201f00000000000000000000000000000000000000000000000000000000000c202900000000000000000000000000000000000000000000000000000000000c202000000000000000000000000000000000000000000000000000000000000c202a00000000000000000000000000000000000000000000000000000000000c202100000000000000000000000000000000000000000000000000000000000c202b00000000000000000000000000000000000000000000000000000000000c202200000000000000000000000000000000000000000000000000000000000c202c00000000000000000000000000000000000000000000000000000000000c202300000000000000000000000000000000000000000000000000000000000c202d00000000000000000000000000000000000000000000000000000000000c202400000000000000000000000000000000000000000000000000000000000c202e00000000000000000000000000000000000000000000000000000000000c202500000000000000000000000000000000000000000000000000000000000c202f00000000000000000000000000000000000000000000000000000000000c202600000000000000000000000000000000000000000000000000000000000c203000000000000000000000000000000000000000000000000000000000000c202700000000000000000000000000000000000000000000000000000000000c203100000000000000000000000000000000000000000000000000000000000c202800000000000000000000000000000000000000000000000000000000000c203200000000000000000000000000000000000000000000000000000000000c202900000000000000000000000000000000000000000000000000000000000c203300000000000000000000000000000000000000000000000000000000000c202a00000000000000000000000000000000000000000000000000000000000c203400000000000000000000000000000000000000000000000000000000000c202b00000000000000000000000000000000000000000000000000000000000c203500000000000000000000000000000000000000000000000000000000000c202c00000000000000000000000000000000000000000000000000000000000c203600000000000000000000000000000000000000000000000000000000000c202d00000000000000000000000000000000000000000000000000000000000c203700000000000000000000000000000000000000000000000000000000000c202e00000000000000000000000000000000000000000000000000000000000c203800000000000000000000000000000000000000000000000000000000000c202f00000000000000000000000000000000000000000000000000000000000c203900000000000000000000000000000000000000000000000000000000000c203000000000000000000000000000000000000000000000000000000000000c203a00000000000000000000000000000000000000000000000000000000000c203100000000000000000000000000000000000000000000000000000000000c203b00000000000000000000000000000000000000000000000000000000000c203200000000000000000000000000000000000000000000000000000000000c203c00000000000000000000000000000000000000000000000000000000000c203300000000000000000000000000000000000000000000000000000000000c203d00000000000000000000000000000000000000000000000000000000000c203400000000000000000000000000000000000000000000000000000000000c203e00000000000000000000000000000000000000000000000000000000000c203500000000000000000000000000000000000000000000000000000000000c203f00000000000000000000000000000000000000000000000000000000000c203600000000000000000000000000000000000000000000000000000000000c204000000000000000000000000000000000000000000000000000000000000c203700000000000000000000000000000000000000000000000000000000000c204100000000000000000000000000000000000000000000000000000000000c203800000000000000000000000000000000000000000000000000000000000c204200000000000000000000000000000000000000000000000000000000000c203900000000000000000000000000000000000000000000000000000000000c204300000000000000000000000000000000000000000000000000000000000c203a00000000000000000000000000000000000000000000000000000000000c204400000000000000000000000000000000000000000000000000000000000c203b00000000000000000000000000000000000000000000000000000000000c204500000000000000000000000000000000000000000000000000000000000c203c00000000000000000000000000000000000000000000000000000000000c204600000000000000000000000000000000000000000000000000000000000c203d00000000000000000000000000000000000000000000000000000000000c204700000000000000000000000000000000000000000000000000000000000c203e00000000000000000000000000000000000000000000000000000000000c20482000000000000000000000000000000000000000000000000000000000000c170000000000000000000000000000000000000000000000000000000000000c170100000000000000000000000000000000000000000000000000000000000c170200000000000000000000000000000000000000000000000000000000000c170300000000000000000000000000000000000000000000000000000000000c170400000000000000000000000000000000000000000000000000000000000c170500000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c170100000000000000000000000000000000000000000000000000000000000c170200000000000000000000000000000000000000000000000000000000000c170300000000000000000000000000000000000000000000000000000000000c170400000000000000000000000000000000000000000000000000000000000c170500000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c170200000000000000000000000000000000000000000000000000000000000c170300000000000000000000000000000000000000000000000000000000000c170400000000000000000000000000000000000000000000000000000000000c170500000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c170300000000000000000000000000000000000000000000000000000000000c170400000000000000000000000000000000000000000000000000000000000c170500000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c170400000000000000000000000000000000000000000000000000000000000c170500000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c170500000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c170600000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c170700000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c170800000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c170900000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c170a00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c170b00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c170c00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c170d00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c170e00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c170f00000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c171000000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c171100000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c171200000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c171300000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c171400000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c171500000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c171600000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c171700000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c171800000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c171900000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c171a00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c172b00000000000000000000000000000000000000000000000000000000000c171b00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c172b00000000000000000000000000000000000000000000000000000000000c172c00000000000000000000000000000000000000000000000000000000000c171c00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c172b00000000000000000000000000000000000000000000000000000000000c172c00000000000000000000000000000000000000000000000000000000000c172d00000000000000000000000000000000000000000000000000000000000c171d00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c172b00000000000000000000000000000000000000000000000000000000000c172c00000000000000000000000000000000000000000000000000000000000c172d00000000000000000000000000000000000000000000000000000000000c172e00000000000000000000000000000000000000000000000000000000000c171e00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c172b00000000000000000000000000000000000000000000000000000000000c172c00000000000000000000000000000000000000000000000000000000000c172d00000000000000000000000000000000000000000000000000000000000c172e00000000000000000000000000000000000000000000000000000000000c172f00000000000000000000000000000000000000000000000000000000000c171f00000000000000000000000000000000000000000000000000000000000c172000000000000000000000000000000000000000000000000000000000000c172100000000000000000000000000000000000000000000000000000000000c172200000000000000000000000000000000000000000000000000000000000c172300000000000000000000000000000000000000000000000000000000000c172400000000000000000000000000000000000000000000000000000000000c172500000000000000000000000000000000000000000000000000000000000c172600000000000000000000000000000000000000000000000000000000000c172700000000000000000000000000000000000000000000000000000000000c172800000000000000000000000000000000000000000000000000000000000c172900000000000000000000000000000000000000000000000000000000000c172a00000000000000000000000000000000000000000000000000000000000c172b00000000000000000000000000000000000000000000000000000000000c172c00000000000000000000000000000000000000000000000000000000000c172d00000000000000000000000000000000000000000000000000000000000c172e00000000000000000000000000000000000000000000000000000000000c172f00000000000000000000000000000000000000000000000000000000000c1730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000101000000000000000000000000000000000000000000000000000000000000010100100000000000000000000000000000000000000000000000000000000001010020000000000000000000000000000000000000000000000000000000000101003000000000000000000000000000000000000000000000000000000000010100400000000000000000000000000000000000000000000000000000000001010050000000000000000000000000000000000000000000000000000000000101006000000000000000000000000000000000000000000000000000000000010100700000000000000000000000000000000000000000000000000000000001010080000000000000000000000000000000000000000000000000000000000101009000000000000000000000000000000000000000000000000000000000010100a000000000000000000000000000000000000000000000000000000000010100b000000000000000000000000000000000000000000000000000000000010100c000000000000000000000000000000000000000000000000000000000010100d000000000000000000000000000000000000000000000000000000000010100e000000000000000000000000000000000000000000000000000000000010100f0000000000000000000000000000000000000000000000000000000000101010000000000000000000000000000000000000000000000000000000000010101100000000000000000000000000000000000000000000000000000000001010120000000000000000000000000000000000000000000000000000000000101013000000000000000000000000000000000000000000000000000000000010101400000000000000000000000000000000000000000000000000000000001010150000000000000000000000000000000000000000000000000000000000101016000000000000000000000000000000000000000000000000000000000010101700000000000000000000000000000000000000000000000000000000001010180000000000000000000000000000000000000000000000000000000000101019000000000000000000000000000000000000000000000000000000000010101a000000000000000000000000000000000000000000000000000000000010101b000000000000000000000000000000000000000000000000000000000010101c000000000000000000000000000000000000000000000000000000000010101d000000000000000000000000000000000000000000000000000000000010101e000000000000000000000000000000000000000000000000000000000010101f0000000000000000000000000000000000000000000000000000000000101020000000000000000000000000000000000000000000000000000000000010102100000000000000000000000000000000000000000000000000000000001010220000000000000000000000000000000000000000000000000000000000101023000000000000000000000000000000000000000000000000000000000010102400000000000000000000000000000000000000000000000000000000001010250000000000000000000000000000000000000000000000000000000000101026000000000000000000000000000000000000000000000000000000000010102700000000000000000000000000000000000000000000000000000000001010280000000000000000000000000000000000000000000000000000000000101029000000000000000000000000000000000000000000000000000000000010102a000000000000000000000000000000000000000000000000000000000010102b000000000000000000000000000000000000000000000000000000000010102c000000000000000000000000000000000000000000000000000000000010102d000000000000000000000000000000000000000000000000000000000010102e000000000000000000000000000000000000000000000000000000000010102f0000000000000000000000000000000000000000000000000000000000101030000000000000000000000000000000000000000000000000000000000010103100000000000000000000000000000000000000000000000000000000001010320000000000000000000000000000000000000000000000000000000000101033000000000000000000000000000000000000000000000000000000000010103400000000000000000000000000000000000000000000000000000000001010350000000000000000000000000000000000000000000000000000000000101036000000000000000000000000000000000000000000000000000000000010103700000000000000000000000000000000000000000000000000000000001010380000000000000000000000000000000000000000000000000000000000101039000000000000000000000000000000000000000000000000000000000010103a000000000000000000000000000000000000000000000000000000000010103b000000000000000000000000000000000000000000000000000000000010103c000000000000000000000000000000000000000000000000000000000010103d000000000000000000000000000000000000000000000000000000000010103e000000000000000000000000000000000000000000000000000000000010103f4000000000000000000000000000000000000000000000000000000000001000010000000000000000000000000000000000000000000000000000000000101100000000000000000000000000000000000000000000000000000000000010110100000000000000000000000000000000000000000000000000000000001011020000000000000000000000000000000000000000000000000000000000101103000000000000000000000000000000000000000000000000000000000010110400000000000000000000000000000000000000000000000000000000001011050000000000000000000000000000000000000000000000000000000000101106000000000000000000000000000000000000000000000000000000000010110700000000000000000000000000000000000000000000000000000000001011080000000000000000000000000000000000000000000000000000000000101109000000000000000000000000000000000000000000000000000000000010110a000000000000000000000000000000000000000000000000000000000010110b000000000000000000000000000000000000000000000000000000000010110c000000000000000000000000000000000000000000000000000000000010110d000000000000000000000000000000000000000000000000000000000010110e000000000000000000000000000000000000000000000000000000000010110f0000000000000000000000000000000000000000000000000000000000101110000000000000000000000000000000000000000000000000000000000010111100000000000000000000000000000000000000000000000000000000001011120000000000000000000000000000000000000000000000000000000000101113000000000000000000000000000000000000000000000000000000000010111400000000000000000000000000000000000000000000000000000000001011150000000000000000000000000000000000000000000000000000000000101116000000000000000000000000000000000000000000000000000000000010111700000000000000000000000000000000000000000000000000000000001011180000000000000000000000000000000000000000000000000000000000101119000000000000000000000000000000000000000000000000000000000010111a000000000000000000000000000000000000000000000000000000000010111b000000000000000000000000000000000000000000000000000000000010111c000000000000000000000000000000000000000000000000000000000010111d000000000000000000000000000000000000000000000000000000000010111e000000000000000000000000000000000000000000000000000000000010111f0000000000000000000000000000000000000000000000000000000000101120000000000000000000000000000000000000000000000000000000000010112100000000000000000000000000000000000000000000000000000000001011220000000000000000000000000000000000000000000000000000000000101123000000000000000000000000000000000000000000000000000000000010112400000000000000000000000000000000000000000000000000000000001011250000000000000000000000000000000000000000000000000000000000101126000000000000000000000000000000000000000000000000000000000010112700000000000000000000000000000000000000000000000000000000001011280000000000000000000000000000000000000000000000000000000000101129000000000000000000000000000000000000000000000000000000000010112a000000000000000000000000000000000000000000000000000000000010112b000000000000000000000000000000000000000000000000000000000010112c000000000000000000000000000000000000000000000000000000000010112d000000000000000000000000000000000000000000000000000000000010112e000000000000000000000000000000000000000000000000000000000010112f0000000000000000000000000000000000000000000000000000000000101130000000000000000000000000000000000000000000000000000000000010113100000000000000000000000000000000000000000000000000000000001011320000000000000000000000000000000000000000000000000000000000101133000000000000000000000000000000000000000000000000000000000010113400000000000000000000000000000000000000000000000000000000001011350000000000000000000000000000000000000000000000000000000000101136000000000000000000000000000000000000000000000000000000000010113700000000000000000000000000000000000000000000000000000000001011380000000000000000000000000000000000000000000000000000000000101139000000000000000000000000000000000000000000000000000000000010113a000000000000000000000000000000000000000000000000000000000010113b000000000000000000000000000000000000000000000000000000000010113c000000000000000000000000000000000000000000000000000000000010113d000000000000000000000000000000000000000000000000000000000010113e080099145b6c0d32753835121f8b271186d01236948a4622ce78a98347fcfc98390085277a27c6acbd5ffc4c19cd65fc30056999e9bec36998f753132db0ff8e2300f3cf77a7261759ebd5f4149f6ad56746f4499cfcd4adf27a1d373f77da64d5009bc6e0e994a23cde8c95b90c1acc1b4a480c6599d1df2c3f9f6e76f3d1aff200d7a1c4a2700dacaaf07f1f0ff33837bdbabcf0b9ace17efabe0761708c4bb900dbeb8e96d14f21e57d5786b6d6ae7e5ddb1bb35935c0fb246d4bdbca62e02c00fbf12b5e0df6223b801088798e4e04d2a92ffe9a11639b7f0ce314e3412a8000d796e0724de03b796ba77069fcd6cf921e566f3aed15eb3e77258add74e9ff3f0000000000000000000000000000000000000000000000000000000000102000000000000000000000000000000000000000000000000000000000000010200a0000000000000000000000000000000000000000000000000000000000102001000000000000000000000000000000000000000000000000000000000010200b0000000000000000000000000000000000000000000000000000000000102002000000000000000000000000000000000000000000000000000000000010200c0000000000000000000000000000000000000000000000000000000000102003000000000000000000000000000000000000000000000000000000000010200d0000000000000000000000000000000000000000000000000000000000102004000000000000000000000000000000000000000000000000000000000010200e0000000000000000000000000000000000000000000000000000000000102005000000000000000000000000000000000000000000000000000000000010200f00000000000000000000000000000000000000000000000000000000001020060000000000000000000000000000000000000000000000000000000000102010000000000000000000000000000000000000000000000000000000000010200700000000000000000000000000000000000000000000000000000000001020110000000000000000000000000000000000000000000000000000000000102008000000000000000000000000000000000000000000000000000000000010201200000000000000000000000000000000000000000000000000000000001020090000000000000000000000000000000000000000000000000000000000102013000000000000000000000000000000000000000000000000000000000010200a0000000000000000000000000000000000000000000000000000000000102014000000000000000000000000000000000000000000000000000000000010200b0000000000000000000000000000000000000000000000000000000000102015000000000000000000000000000000000000000000000000000000000010200c0000000000000000000000000000000000000000000000000000000000102016000000000000000000000000000000000000000000000000000000000010200d0000000000000000000000000000000000000000000000000000000000102017000000000000000000000000000000000000000000000000000000000010200e0000000000000000000000000000000000000000000000000000000000102018000000000000000000000000000000000000000000000000000000000010200f00000000000000000000000000000000000000000000000000000000001020190000000000000000000000000000000000000000000000000000000000102010000000000000000000000000000000000000000000000000000000000010201a0000000000000000000000000000000000000000000000000000000000102011000000000000000000000000000000000000000000000000000000000010201b0000000000000000000000000000000000000000000000000000000000102012000000000000000000000000000000000000000000000000000000000010201c0000000000000000000000000000000000000000000000000000000000102013000000000000000000000000000000000000000000000000000000000010201d0000000000000000000000000000000000000000000000000000000000102014000000000000000000000000000000000000000000000000000000000010201e0000000000000000000000000000000000000000000000000000000000102015000000000000000000000000000000000000000000000000000000000010201f00000000000000000000000000000000000000000000000000000000001020160000000000000000000000000000000000000000000000000000000000102020000000000000000000000000000000000000000000000000000000000010201700000000000000000000000000000000000000000000000000000000001020210000000000000000000000000000000000000000000000000000000000102018000000000000000000000000000000000000000000000000000000000010202200000000000000000000000000000000000000000000000000000000001020190000000000000000000000000000000000000000000000000000000000102023000000000000000000000000000000000000000000000000000000000010201a0000000000000000000000000000000000000000000000000000000000102024000000000000000000000000000000000000000000000000000000000010201b0000000000000000000000000000000000000000000000000000000000102025000000000000000000000000000000000000000000000000000000000010201c0000000000000000000000000000000000000000000000000000000000102026000000000000000000000000000000000000000000000000000000000010201d0000000000000000000000000000000000000000000000000000000000102027000000000000000000000000000000000000000000000000000000000010201e0000000000000000000000000000000000000000000000000000000000102028000000000000000000000000000000000000000000000000000000000010201f00000000000000000000000000000000000000000000000000000000001020290000000000000000000000000000000000000000000000000000000000102020000000000000000000000000000000000000000000000000000000000010202a0000000000000000000000000000000000000000000000000000000000102021000000000000000000000000000000000000000000000000000000000010202b0000000000000000000000000000000000000000000000000000000000102022000000000000000000000000000000000000000000000000000000000010202c0000000000000000000000000000000000000000000000000000000000102023000000000000000000000000000000000000000000000000000000000010202d0000000000000000000000000000000000000000000000000000000000102024000000000000000000000000000000000000000000000000000000000010202e0000000000000000000000000000000000000000000000000000000000102025000000000000000000000000000000000000000000000000000000000010202f00000000000000000000000000000000000000000000000000000000001020260000000000000000000000000000000000000000000000000000000000102030000000000000000000000000000000000000000000000000000000000010202700000000000000000000000000000000000000000000000000000000001020310000000000000000000000000000000000000000000000000000000000102028000000000000000000000000000000000000000000000000000000000010203200000000000000000000000000000000000000000000000000000000001020290000000000000000000000000000000000000000000000000000000000102033000000000000000000000000000000000000000000000000000000000010202a0000000000000000000000000000000000000000000000000000000000102034000000000000000000000000000000000000000000000000000000000010202b0000000000000000000000000000000000000000000000000000000000102035000000000000000000000000000000000000000000000000000000000010202c0000000000000000000000000000000000000000000000000000000000102036000000000000000000000000000000000000000000000000000000000010202d0000000000000000000000000000000000000000000000000000000000102037000000000000000000000000000000000000000000000000000000000010202e0000000000000000000000000000000000000000000000000000000000102038000000000000000000000000000000000000000000000000000000000010202f00000000000000000000000000000000000000000000000000000000001020390000000000000000000000000000000000000000000000000000000000102030000000000000000000000000000000000000000000000000000000000010203a0000000000000000000000000000000000000000000000000000000000102031000000000000000000000000000000000000000000000000000000000010203b0000000000000000000000000000000000000000000000000000000000102032000000000000000000000000000000000000000000000000000000000010203c0000000000000000000000000000000000000000000000000000000000102033000000000000000000000000000000000000000000000000000000000010203d0000000000000000000000000000000000000000000000000000000000102034000000000000000000000000000000000000000000000000000000000010203e0000000000000000000000000000000000000000000000000000000000102035000000000000000000000000000000000000000000000000000000000010203f00000000000000000000000000000000000000000000000000000000001020360000000000000000000000000000000000000000000000000000000000102040000000000000000000000000000000000000000000000000000000000010203700000000000000000000000000000000000000000000000000000000001020410000000000000000000000000000000000000000000000000000000000102038000000000000000000000000000000000000000000000000000000000010204200000000000000000000000000000000000000000000000000000000001020390000000000000000000000000000000000000000000000000000000000102043000000000000000000000000000000000000000000000000000000000010203a0000000000000000000000000000000000000000000000000000000000102044000000000000000000000000000000000000000000000000000000000010203b0000000000000000000000000000000000000000000000000000000000102045000000000000000000000000000000000000000000000000000000000010203c0000000000000000000000000000000000000000000000000000000000102046000000000000000000000000000000000000000000000000000000000010203d0000000000000000000000000000000000000000000000000000000000102047000000000000000000000000000000000000000000000000000000000010203e0000000000000000000000000000000000000000000000000000000000102048200000000000000000000000000000000000000000000000000000000000101700000000000000000000000000000000000000000000000000000000000010170100000000000000000000000000000000000000000000000000000000001017020000000000000000000000000000000000000000000000000000000000101703000000000000000000000000000000000000000000000000000000000010170400000000000000000000000000000000000000000000000000000000001017050000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010170100000000000000000000000000000000000000000000000000000000001017020000000000000000000000000000000000000000000000000000000000101703000000000000000000000000000000000000000000000000000000000010170400000000000000000000000000000000000000000000000000000000001017050000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017020000000000000000000000000000000000000000000000000000000000101703000000000000000000000000000000000000000000000000000000000010170400000000000000000000000000000000000000000000000000000000001017050000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101703000000000000000000000000000000000000000000000000000000000010170400000000000000000000000000000000000000000000000000000000001017050000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101714000000000000000000000000000000000000000000000000000000000010170400000000000000000000000000000000000000000000000000000000001017050000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101714000000000000000000000000000000000000000000000000000000000010171500000000000000000000000000000000000000000000000000000000001017050000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101714000000000000000000000000000000000000000000000000000000000010171500000000000000000000000000000000000000000000000000000000001017160000000000000000000000000000000000000000000000000000000000101706000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101714000000000000000000000000000000000000000000000000000000000010171500000000000000000000000000000000000000000000000000000000001017160000000000000000000000000000000000000000000000000000000000101717000000000000000000000000000000000000000000000000000000000010170700000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101714000000000000000000000000000000000000000000000000000000000010171500000000000000000000000000000000000000000000000000000000001017160000000000000000000000000000000000000000000000000000000000101717000000000000000000000000000000000000000000000000000000000010171800000000000000000000000000000000000000000000000000000000001017080000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f00000000000000000000000000000000000000000000000000000000001017100000000000000000000000000000000000000000000000000000000000101711000000000000000000000000000000000000000000000000000000000010171200000000000000000000000000000000000000000000000000000000001017130000000000000000000000000000000000000000000000000000000000101714000000000000000000000000000000000000000000000000000000000010171500000000000000000000000000000000000000000000000000000000001017160000000000000000000000000000000000000000000000000000000000101717000000000000000000000000000000000000000000000000000000000010171800000000000000000000000000000000000000000000000000000000001017190000000000000000000000000000000000000000000000000000000000101709000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010170a000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010170b000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010170c000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010170d000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010170e000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f000000000000000000000000000000000000000000000000000000000010170f0000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101710000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010171100000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017120000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101713000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101724000000000000000000000000000000000000000000000000000000000010171400000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101724000000000000000000000000000000000000000000000000000000000010172500000000000000000000000000000000000000000000000000000000001017150000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101724000000000000000000000000000000000000000000000000000000000010172500000000000000000000000000000000000000000000000000000000001017260000000000000000000000000000000000000000000000000000000000101716000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101724000000000000000000000000000000000000000000000000000000000010172500000000000000000000000000000000000000000000000000000000001017260000000000000000000000000000000000000000000000000000000000101727000000000000000000000000000000000000000000000000000000000010171700000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101724000000000000000000000000000000000000000000000000000000000010172500000000000000000000000000000000000000000000000000000000001017260000000000000000000000000000000000000000000000000000000000101727000000000000000000000000000000000000000000000000000000000010172800000000000000000000000000000000000000000000000000000000001017180000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f00000000000000000000000000000000000000000000000000000000001017200000000000000000000000000000000000000000000000000000000000101721000000000000000000000000000000000000000000000000000000000010172200000000000000000000000000000000000000000000000000000000001017230000000000000000000000000000000000000000000000000000000000101724000000000000000000000000000000000000000000000000000000000010172500000000000000000000000000000000000000000000000000000000001017260000000000000000000000000000000000000000000000000000000000101727000000000000000000000000000000000000000000000000000000000010172800000000000000000000000000000000000000000000000000000000001017290000000000000000000000000000000000000000000000000000000000101719000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010171a000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010172b000000000000000000000000000000000000000000000000000000000010171b000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010172b000000000000000000000000000000000000000000000000000000000010172c000000000000000000000000000000000000000000000000000000000010171c000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010172b000000000000000000000000000000000000000000000000000000000010172c000000000000000000000000000000000000000000000000000000000010172d000000000000000000000000000000000000000000000000000000000010171d000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010172b000000000000000000000000000000000000000000000000000000000010172c000000000000000000000000000000000000000000000000000000000010172d000000000000000000000000000000000000000000000000000000000010172e000000000000000000000000000000000000000000000000000000000010171e000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010172b000000000000000000000000000000000000000000000000000000000010172c000000000000000000000000000000000000000000000000000000000010172d000000000000000000000000000000000000000000000000000000000010172e000000000000000000000000000000000000000000000000000000000010172f000000000000000000000000000000000000000000000000000000000010171f0000000000000000000000000000000000000000000000000000000000101720000000000000000000000000000000000000000000000000000000000010172100000000000000000000000000000000000000000000000000000000001017220000000000000000000000000000000000000000000000000000000000101723000000000000000000000000000000000000000000000000000000000010172400000000000000000000000000000000000000000000000000000000001017250000000000000000000000000000000000000000000000000000000000101726000000000000000000000000000000000000000000000000000000000010172700000000000000000000000000000000000000000000000000000000001017280000000000000000000000000000000000000000000000000000000000101729000000000000000000000000000000000000000000000000000000000010172a000000000000000000000000000000000000000000000000000000000010172b000000000000000000000000000000000000000000000000000000000010172c000000000000000000000000000000000000000000000000000000000010172d000000000000000000000000000000000000000000000000000000000010172e000000000000000000000000000000000000000000000000000000000010172f0000000000000000000000000000000000000000000000000000000000101730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "txsEffectsHash": "0x00b9377a9906113c4237e09edce4d55e149267628834409b8d922ce2a8082fea", "decodedHeader": { "contentCommitment": { + "blobsHash": "0x0047ad599f577c7558023a21c96b4f15fff72314bf54e8a4c59d4fde2659ec12", "inHash": "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c", "outHash": "0x000ca4a4610ad22c97c9161cedcf01faa3619f1b85457f1627d09627b71903a6", - "numTxs": 4, - "txsEffectsHash": "0x00b9377a9906113c4237e09edce4d55e149267628834409b8d922ce2a8082fea" + "numTxs": 4 }, "globalVariables": { "blockNumber": 1, "slotNumber": "0x000000000000000000000000000000000000000000000000000000000000001a", "chainId": 31337, - "timestamp": 1732894948, + "timestamp": 1732960608, "version": 1, - "coinbase": "0x6bb9503e73901291188976cb74f3ee186877aed7", - "feeRecipient": "0x1560bcdb97a3f65361a878c5fde7c89bd762de8a4e92dd872bb5e1f39f86d30c", + "coinbase": "0xf20572542ac9ada404acf215961dd6efd971702f", + "feeRecipient": "0x0e2308c5b3418e8f4a48b435e89759d03ba430e1ce4e4dbc7b44ef103082ea02", "gasFees": { "feePerDaGas": 0, - "feePerL2Gas": 54165220200 + "feePerL2Gas": 54162487970 } }, "totalFees": "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -109,8 +108,9 @@ } } }, - "header": "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae00000001000000000000000000000000000000000000000000000000000000000000000400b9377a9906113c4237e09edce4d55e149267628834409b8d922ce2a8082fea00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c000ca4a4610ad22c97c9161cedcf01faa3619f1b85457f1627d09627b71903a62e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d60000001000553ea03210e12bf95ed15f0105108f39db784d318cfe9b52cba413618711ce000001000627376bc9d9804095498d2fe262c2dceeb5ecfc696966496eaee65f1798fed50000018020a27b2839a892ce7ac7c3a76b625388d4efdd4d736f29f86d41bb32d4bc73cf0000017c0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000006749e0e46bb9503e73901291188976cb74f3ee186877aed71560bcdb97a3f65361a878c5fde7c89bd762de8a4e92dd872bb5e1f39f86d30c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9c7fab6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x00e238c1a9cef83aa07f67d4447c43e1df27285e5fe4059262ff48d52c540364", + "header": "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae0000000100000000000000000000000000000000000000000000000000000000000000040047ad599f577c7558023a21c96b4f15fff72314bf54e8a4c59d4fde2659ec1200089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c000ca4a4610ad22c97c9161cedcf01faa3619f1b85457f1627d09627b71903a62e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d60000001000553ea03210e12bf95ed15f0105108f39db784d318cfe9b52cba413618711ce000001000627376bc9d9804095498d2fe262c2dceeb5ecfc696966496eaee65f1798fed50000018020a27b2839a892ce7ac7c3a76b625388d4efdd4d736f29f86d41bb32d4bc73cf0000017c0000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000674ae160f20572542ac9ada404acf215961dd6efd971702f0e2308c5b3418e8f4a48b435e89759d03ba430e1ce4e4dbc7b44ef103082ea0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9c55faa200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x0034b99c4b69dc95d5716c5adb130a6189254b654c4c8ac10e7e08525625c66a", + "blobInputs": "0x0101cc37eb7aaf02a4133018fd157076feeabf78ad88ff33edcfabad8ac4f36bf7170450ec839926ed04c1c4dbcdb46459ae324944b98c70a4027debb16279e95860ce046b9453d9d9f025ad8e6ed7f1f50eca04c6f0bd1caa021ba74d7f924106af942e8996258b43d5403f231c878ff8fed318c1c9d973ce1677742676688cbc483e03a593b3cce8bc68115e772a4233903eae33609a6d67905c9f4738d96194be8ca02d57e936ef8148f1d77519d041e23921bdacb190c319fec28ab84c8316", "numTxs": 4 } } \ No newline at end of file diff --git a/l1-contracts/test/fixtures/mixed_block_2.json b/l1-contracts/test/fixtures/mixed_block_2.json index 95d14f79e71..52719f4478d 100644 --- a/l1-contracts/test/fixtures/mixed_block_2.json +++ b/l1-contracts/test/fixtures/mixed_block_2.json @@ -58,35 +58,34 @@ ] }, "block": { - "archive": "0x05d151154c5fc1ff94e0cf57a45bd86df6e0555b7e0e7741eee40a3b2d0dcaf1", - "blockHash": "0x22b5ab33961e9aa80ad6dd79558ef6ae56e4eb0afb9d361155c95fd3455f4065", + "archive": "0x229e3c7da0fed7665b1196d18613e8d5b054781aba59c906a6fe574e6f1f7975", + "blockHash": "0x0d9562e07790bc8678900b5fe3157092bfacae88180f03d946ba65b61d10ae54", "body": "0x00000004000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000141000000000000000000000000000000000000000000000000000000000000014100100000000000000000000000000000000000000000000000000000000001410020000000000000000000000000000000000000000000000000000000000141003000000000000000000000000000000000000000000000000000000000014100400000000000000000000000000000000000000000000000000000000001410050000000000000000000000000000000000000000000000000000000000141006000000000000000000000000000000000000000000000000000000000014100700000000000000000000000000000000000000000000000000000000001410080000000000000000000000000000000000000000000000000000000000141009000000000000000000000000000000000000000000000000000000000014100a000000000000000000000000000000000000000000000000000000000014100b000000000000000000000000000000000000000000000000000000000014100c000000000000000000000000000000000000000000000000000000000014100d000000000000000000000000000000000000000000000000000000000014100e000000000000000000000000000000000000000000000000000000000014100f0000000000000000000000000000000000000000000000000000000000141010000000000000000000000000000000000000000000000000000000000014101100000000000000000000000000000000000000000000000000000000001410120000000000000000000000000000000000000000000000000000000000141013000000000000000000000000000000000000000000000000000000000014101400000000000000000000000000000000000000000000000000000000001410150000000000000000000000000000000000000000000000000000000000141016000000000000000000000000000000000000000000000000000000000014101700000000000000000000000000000000000000000000000000000000001410180000000000000000000000000000000000000000000000000000000000141019000000000000000000000000000000000000000000000000000000000014101a000000000000000000000000000000000000000000000000000000000014101b000000000000000000000000000000000000000000000000000000000014101c000000000000000000000000000000000000000000000000000000000014101d000000000000000000000000000000000000000000000000000000000014101e000000000000000000000000000000000000000000000000000000000014101f0000000000000000000000000000000000000000000000000000000000141020000000000000000000000000000000000000000000000000000000000014102100000000000000000000000000000000000000000000000000000000001410220000000000000000000000000000000000000000000000000000000000141023000000000000000000000000000000000000000000000000000000000014102400000000000000000000000000000000000000000000000000000000001410250000000000000000000000000000000000000000000000000000000000141026000000000000000000000000000000000000000000000000000000000014102700000000000000000000000000000000000000000000000000000000001410280000000000000000000000000000000000000000000000000000000000141029000000000000000000000000000000000000000000000000000000000014102a000000000000000000000000000000000000000000000000000000000014102b000000000000000000000000000000000000000000000000000000000014102c000000000000000000000000000000000000000000000000000000000014102d000000000000000000000000000000000000000000000000000000000014102e000000000000000000000000000000000000000000000000000000000014102f0000000000000000000000000000000000000000000000000000000000141030000000000000000000000000000000000000000000000000000000000014103100000000000000000000000000000000000000000000000000000000001410320000000000000000000000000000000000000000000000000000000000141033000000000000000000000000000000000000000000000000000000000014103400000000000000000000000000000000000000000000000000000000001410350000000000000000000000000000000000000000000000000000000000141036000000000000000000000000000000000000000000000000000000000014103700000000000000000000000000000000000000000000000000000000001410380000000000000000000000000000000000000000000000000000000000141039000000000000000000000000000000000000000000000000000000000014103a000000000000000000000000000000000000000000000000000000000014103b000000000000000000000000000000000000000000000000000000000014103c000000000000000000000000000000000000000000000000000000000014103d000000000000000000000000000000000000000000000000000000000014103e000000000000000000000000000000000000000000000000000000000014103f4000000000000000000000000000000000000000000000000000000000001400010000000000000000000000000000000000000000000000000000000000141100000000000000000000000000000000000000000000000000000000000014110100000000000000000000000000000000000000000000000000000000001411020000000000000000000000000000000000000000000000000000000000141103000000000000000000000000000000000000000000000000000000000014110400000000000000000000000000000000000000000000000000000000001411050000000000000000000000000000000000000000000000000000000000141106000000000000000000000000000000000000000000000000000000000014110700000000000000000000000000000000000000000000000000000000001411080000000000000000000000000000000000000000000000000000000000141109000000000000000000000000000000000000000000000000000000000014110a000000000000000000000000000000000000000000000000000000000014110b000000000000000000000000000000000000000000000000000000000014110c000000000000000000000000000000000000000000000000000000000014110d000000000000000000000000000000000000000000000000000000000014110e000000000000000000000000000000000000000000000000000000000014110f0000000000000000000000000000000000000000000000000000000000141110000000000000000000000000000000000000000000000000000000000014111100000000000000000000000000000000000000000000000000000000001411120000000000000000000000000000000000000000000000000000000000141113000000000000000000000000000000000000000000000000000000000014111400000000000000000000000000000000000000000000000000000000001411150000000000000000000000000000000000000000000000000000000000141116000000000000000000000000000000000000000000000000000000000014111700000000000000000000000000000000000000000000000000000000001411180000000000000000000000000000000000000000000000000000000000141119000000000000000000000000000000000000000000000000000000000014111a000000000000000000000000000000000000000000000000000000000014111b000000000000000000000000000000000000000000000000000000000014111c000000000000000000000000000000000000000000000000000000000014111d000000000000000000000000000000000000000000000000000000000014111e000000000000000000000000000000000000000000000000000000000014111f0000000000000000000000000000000000000000000000000000000000141120000000000000000000000000000000000000000000000000000000000014112100000000000000000000000000000000000000000000000000000000001411220000000000000000000000000000000000000000000000000000000000141123000000000000000000000000000000000000000000000000000000000014112400000000000000000000000000000000000000000000000000000000001411250000000000000000000000000000000000000000000000000000000000141126000000000000000000000000000000000000000000000000000000000014112700000000000000000000000000000000000000000000000000000000001411280000000000000000000000000000000000000000000000000000000000141129000000000000000000000000000000000000000000000000000000000014112a000000000000000000000000000000000000000000000000000000000014112b000000000000000000000000000000000000000000000000000000000014112c000000000000000000000000000000000000000000000000000000000014112d000000000000000000000000000000000000000000000000000000000014112e000000000000000000000000000000000000000000000000000000000014112f0000000000000000000000000000000000000000000000000000000000141130000000000000000000000000000000000000000000000000000000000014113100000000000000000000000000000000000000000000000000000000001411320000000000000000000000000000000000000000000000000000000000141133000000000000000000000000000000000000000000000000000000000014113400000000000000000000000000000000000000000000000000000000001411350000000000000000000000000000000000000000000000000000000000141136000000000000000000000000000000000000000000000000000000000014113700000000000000000000000000000000000000000000000000000000001411380000000000000000000000000000000000000000000000000000000000141139000000000000000000000000000000000000000000000000000000000014113a000000000000000000000000000000000000000000000000000000000014113b000000000000000000000000000000000000000000000000000000000014113c000000000000000000000000000000000000000000000000000000000014113d000000000000000000000000000000000000000000000000000000000014113e08005c015113cb57d67dd6c0febd596819ac0298b6a23fc80aba17d445d540059a00f20b7d1308051fe7b68031a7c336b0b4b56738928b6510133aff1b818d5a9a0063eec1883a4f95f4933f9275e850d84b3d035f5061ed986c437a07331fd30e00d3a32d6bbc4fd843686fd0c5e118a73b847529977dca5b9e0e81f6604f22ca00c2f4f5133d9194d41e853e5e951e16690babce8461f25342c0bad20f2aa1e3000a6bf4739e7eb387913d955dc2e8f14f8cce27696b9d2e128b6acefafb80ee005763f7e0648f958b559677622a648f318fc79ebc0cb539170d49c26456e69200302e2b8a92cda941e9af8761b89899a58a587656d9710594e1d865b16522993f0000000000000000000000000000000000000000000000000000000000142000000000000000000000000000000000000000000000000000000000000014200a0000000000000000000000000000000000000000000000000000000000142001000000000000000000000000000000000000000000000000000000000014200b0000000000000000000000000000000000000000000000000000000000142002000000000000000000000000000000000000000000000000000000000014200c0000000000000000000000000000000000000000000000000000000000142003000000000000000000000000000000000000000000000000000000000014200d0000000000000000000000000000000000000000000000000000000000142004000000000000000000000000000000000000000000000000000000000014200e0000000000000000000000000000000000000000000000000000000000142005000000000000000000000000000000000000000000000000000000000014200f00000000000000000000000000000000000000000000000000000000001420060000000000000000000000000000000000000000000000000000000000142010000000000000000000000000000000000000000000000000000000000014200700000000000000000000000000000000000000000000000000000000001420110000000000000000000000000000000000000000000000000000000000142008000000000000000000000000000000000000000000000000000000000014201200000000000000000000000000000000000000000000000000000000001420090000000000000000000000000000000000000000000000000000000000142013000000000000000000000000000000000000000000000000000000000014200a0000000000000000000000000000000000000000000000000000000000142014000000000000000000000000000000000000000000000000000000000014200b0000000000000000000000000000000000000000000000000000000000142015000000000000000000000000000000000000000000000000000000000014200c0000000000000000000000000000000000000000000000000000000000142016000000000000000000000000000000000000000000000000000000000014200d0000000000000000000000000000000000000000000000000000000000142017000000000000000000000000000000000000000000000000000000000014200e0000000000000000000000000000000000000000000000000000000000142018000000000000000000000000000000000000000000000000000000000014200f00000000000000000000000000000000000000000000000000000000001420190000000000000000000000000000000000000000000000000000000000142010000000000000000000000000000000000000000000000000000000000014201a0000000000000000000000000000000000000000000000000000000000142011000000000000000000000000000000000000000000000000000000000014201b0000000000000000000000000000000000000000000000000000000000142012000000000000000000000000000000000000000000000000000000000014201c0000000000000000000000000000000000000000000000000000000000142013000000000000000000000000000000000000000000000000000000000014201d0000000000000000000000000000000000000000000000000000000000142014000000000000000000000000000000000000000000000000000000000014201e0000000000000000000000000000000000000000000000000000000000142015000000000000000000000000000000000000000000000000000000000014201f00000000000000000000000000000000000000000000000000000000001420160000000000000000000000000000000000000000000000000000000000142020000000000000000000000000000000000000000000000000000000000014201700000000000000000000000000000000000000000000000000000000001420210000000000000000000000000000000000000000000000000000000000142018000000000000000000000000000000000000000000000000000000000014202200000000000000000000000000000000000000000000000000000000001420190000000000000000000000000000000000000000000000000000000000142023000000000000000000000000000000000000000000000000000000000014201a0000000000000000000000000000000000000000000000000000000000142024000000000000000000000000000000000000000000000000000000000014201b0000000000000000000000000000000000000000000000000000000000142025000000000000000000000000000000000000000000000000000000000014201c0000000000000000000000000000000000000000000000000000000000142026000000000000000000000000000000000000000000000000000000000014201d0000000000000000000000000000000000000000000000000000000000142027000000000000000000000000000000000000000000000000000000000014201e0000000000000000000000000000000000000000000000000000000000142028000000000000000000000000000000000000000000000000000000000014201f00000000000000000000000000000000000000000000000000000000001420290000000000000000000000000000000000000000000000000000000000142020000000000000000000000000000000000000000000000000000000000014202a0000000000000000000000000000000000000000000000000000000000142021000000000000000000000000000000000000000000000000000000000014202b0000000000000000000000000000000000000000000000000000000000142022000000000000000000000000000000000000000000000000000000000014202c0000000000000000000000000000000000000000000000000000000000142023000000000000000000000000000000000000000000000000000000000014202d0000000000000000000000000000000000000000000000000000000000142024000000000000000000000000000000000000000000000000000000000014202e0000000000000000000000000000000000000000000000000000000000142025000000000000000000000000000000000000000000000000000000000014202f00000000000000000000000000000000000000000000000000000000001420260000000000000000000000000000000000000000000000000000000000142030000000000000000000000000000000000000000000000000000000000014202700000000000000000000000000000000000000000000000000000000001420310000000000000000000000000000000000000000000000000000000000142028000000000000000000000000000000000000000000000000000000000014203200000000000000000000000000000000000000000000000000000000001420290000000000000000000000000000000000000000000000000000000000142033000000000000000000000000000000000000000000000000000000000014202a0000000000000000000000000000000000000000000000000000000000142034000000000000000000000000000000000000000000000000000000000014202b0000000000000000000000000000000000000000000000000000000000142035000000000000000000000000000000000000000000000000000000000014202c0000000000000000000000000000000000000000000000000000000000142036000000000000000000000000000000000000000000000000000000000014202d0000000000000000000000000000000000000000000000000000000000142037000000000000000000000000000000000000000000000000000000000014202e0000000000000000000000000000000000000000000000000000000000142038000000000000000000000000000000000000000000000000000000000014202f00000000000000000000000000000000000000000000000000000000001420390000000000000000000000000000000000000000000000000000000000142030000000000000000000000000000000000000000000000000000000000014203a0000000000000000000000000000000000000000000000000000000000142031000000000000000000000000000000000000000000000000000000000014203b0000000000000000000000000000000000000000000000000000000000142032000000000000000000000000000000000000000000000000000000000014203c0000000000000000000000000000000000000000000000000000000000142033000000000000000000000000000000000000000000000000000000000014203d0000000000000000000000000000000000000000000000000000000000142034000000000000000000000000000000000000000000000000000000000014203e0000000000000000000000000000000000000000000000000000000000142035000000000000000000000000000000000000000000000000000000000014203f00000000000000000000000000000000000000000000000000000000001420360000000000000000000000000000000000000000000000000000000000142040000000000000000000000000000000000000000000000000000000000014203700000000000000000000000000000000000000000000000000000000001420410000000000000000000000000000000000000000000000000000000000142038000000000000000000000000000000000000000000000000000000000014204200000000000000000000000000000000000000000000000000000000001420390000000000000000000000000000000000000000000000000000000000142043000000000000000000000000000000000000000000000000000000000014203a0000000000000000000000000000000000000000000000000000000000142044000000000000000000000000000000000000000000000000000000000014203b0000000000000000000000000000000000000000000000000000000000142045000000000000000000000000000000000000000000000000000000000014203c0000000000000000000000000000000000000000000000000000000000142046000000000000000000000000000000000000000000000000000000000014203d0000000000000000000000000000000000000000000000000000000000142047000000000000000000000000000000000000000000000000000000000014203e0000000000000000000000000000000000000000000000000000000000142048200000000000000000000000000000000000000000000000000000000000141700000000000000000000000000000000000000000000000000000000000014170100000000000000000000000000000000000000000000000000000000001417020000000000000000000000000000000000000000000000000000000000141703000000000000000000000000000000000000000000000000000000000014170400000000000000000000000000000000000000000000000000000000001417050000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014170100000000000000000000000000000000000000000000000000000000001417020000000000000000000000000000000000000000000000000000000000141703000000000000000000000000000000000000000000000000000000000014170400000000000000000000000000000000000000000000000000000000001417050000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417020000000000000000000000000000000000000000000000000000000000141703000000000000000000000000000000000000000000000000000000000014170400000000000000000000000000000000000000000000000000000000001417050000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141703000000000000000000000000000000000000000000000000000000000014170400000000000000000000000000000000000000000000000000000000001417050000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141714000000000000000000000000000000000000000000000000000000000014170400000000000000000000000000000000000000000000000000000000001417050000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141714000000000000000000000000000000000000000000000000000000000014171500000000000000000000000000000000000000000000000000000000001417050000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141714000000000000000000000000000000000000000000000000000000000014171500000000000000000000000000000000000000000000000000000000001417160000000000000000000000000000000000000000000000000000000000141706000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141714000000000000000000000000000000000000000000000000000000000014171500000000000000000000000000000000000000000000000000000000001417160000000000000000000000000000000000000000000000000000000000141717000000000000000000000000000000000000000000000000000000000014170700000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141714000000000000000000000000000000000000000000000000000000000014171500000000000000000000000000000000000000000000000000000000001417160000000000000000000000000000000000000000000000000000000000141717000000000000000000000000000000000000000000000000000000000014171800000000000000000000000000000000000000000000000000000000001417080000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f00000000000000000000000000000000000000000000000000000000001417100000000000000000000000000000000000000000000000000000000000141711000000000000000000000000000000000000000000000000000000000014171200000000000000000000000000000000000000000000000000000000001417130000000000000000000000000000000000000000000000000000000000141714000000000000000000000000000000000000000000000000000000000014171500000000000000000000000000000000000000000000000000000000001417160000000000000000000000000000000000000000000000000000000000141717000000000000000000000000000000000000000000000000000000000014171800000000000000000000000000000000000000000000000000000000001417190000000000000000000000000000000000000000000000000000000000141709000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014170a000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014170b000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014170c000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014170d000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014170e000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f000000000000000000000000000000000000000000000000000000000014170f0000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141710000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014171100000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417120000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141713000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141724000000000000000000000000000000000000000000000000000000000014171400000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141724000000000000000000000000000000000000000000000000000000000014172500000000000000000000000000000000000000000000000000000000001417150000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141724000000000000000000000000000000000000000000000000000000000014172500000000000000000000000000000000000000000000000000000000001417260000000000000000000000000000000000000000000000000000000000141716000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141724000000000000000000000000000000000000000000000000000000000014172500000000000000000000000000000000000000000000000000000000001417260000000000000000000000000000000000000000000000000000000000141727000000000000000000000000000000000000000000000000000000000014171700000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141724000000000000000000000000000000000000000000000000000000000014172500000000000000000000000000000000000000000000000000000000001417260000000000000000000000000000000000000000000000000000000000141727000000000000000000000000000000000000000000000000000000000014172800000000000000000000000000000000000000000000000000000000001417180000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f00000000000000000000000000000000000000000000000000000000001417200000000000000000000000000000000000000000000000000000000000141721000000000000000000000000000000000000000000000000000000000014172200000000000000000000000000000000000000000000000000000000001417230000000000000000000000000000000000000000000000000000000000141724000000000000000000000000000000000000000000000000000000000014172500000000000000000000000000000000000000000000000000000000001417260000000000000000000000000000000000000000000000000000000000141727000000000000000000000000000000000000000000000000000000000014172800000000000000000000000000000000000000000000000000000000001417290000000000000000000000000000000000000000000000000000000000141719000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014171a000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014172b000000000000000000000000000000000000000000000000000000000014171b000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014172b000000000000000000000000000000000000000000000000000000000014172c000000000000000000000000000000000000000000000000000000000014171c000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014172b000000000000000000000000000000000000000000000000000000000014172c000000000000000000000000000000000000000000000000000000000014172d000000000000000000000000000000000000000000000000000000000014171d000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014172b000000000000000000000000000000000000000000000000000000000014172c000000000000000000000000000000000000000000000000000000000014172d000000000000000000000000000000000000000000000000000000000014172e000000000000000000000000000000000000000000000000000000000014171e000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014172b000000000000000000000000000000000000000000000000000000000014172c000000000000000000000000000000000000000000000000000000000014172d000000000000000000000000000000000000000000000000000000000014172e000000000000000000000000000000000000000000000000000000000014172f000000000000000000000000000000000000000000000000000000000014171f0000000000000000000000000000000000000000000000000000000000141720000000000000000000000000000000000000000000000000000000000014172100000000000000000000000000000000000000000000000000000000001417220000000000000000000000000000000000000000000000000000000000141723000000000000000000000000000000000000000000000000000000000014172400000000000000000000000000000000000000000000000000000000001417250000000000000000000000000000000000000000000000000000000000141726000000000000000000000000000000000000000000000000000000000014172700000000000000000000000000000000000000000000000000000000001417280000000000000000000000000000000000000000000000000000000000141729000000000000000000000000000000000000000000000000000000000014172a000000000000000000000000000000000000000000000000000000000014172b000000000000000000000000000000000000000000000000000000000014172c000000000000000000000000000000000000000000000000000000000014172d000000000000000000000000000000000000000000000000000000000014172e000000000000000000000000000000000000000000000000000000000014172f0000000000000000000000000000000000000000000000000000000000141730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000181000000000000000000000000000000000000000000000000000000000000018100100000000000000000000000000000000000000000000000000000000001810020000000000000000000000000000000000000000000000000000000000181003000000000000000000000000000000000000000000000000000000000018100400000000000000000000000000000000000000000000000000000000001810050000000000000000000000000000000000000000000000000000000000181006000000000000000000000000000000000000000000000000000000000018100700000000000000000000000000000000000000000000000000000000001810080000000000000000000000000000000000000000000000000000000000181009000000000000000000000000000000000000000000000000000000000018100a000000000000000000000000000000000000000000000000000000000018100b000000000000000000000000000000000000000000000000000000000018100c000000000000000000000000000000000000000000000000000000000018100d000000000000000000000000000000000000000000000000000000000018100e000000000000000000000000000000000000000000000000000000000018100f0000000000000000000000000000000000000000000000000000000000181010000000000000000000000000000000000000000000000000000000000018101100000000000000000000000000000000000000000000000000000000001810120000000000000000000000000000000000000000000000000000000000181013000000000000000000000000000000000000000000000000000000000018101400000000000000000000000000000000000000000000000000000000001810150000000000000000000000000000000000000000000000000000000000181016000000000000000000000000000000000000000000000000000000000018101700000000000000000000000000000000000000000000000000000000001810180000000000000000000000000000000000000000000000000000000000181019000000000000000000000000000000000000000000000000000000000018101a000000000000000000000000000000000000000000000000000000000018101b000000000000000000000000000000000000000000000000000000000018101c000000000000000000000000000000000000000000000000000000000018101d000000000000000000000000000000000000000000000000000000000018101e000000000000000000000000000000000000000000000000000000000018101f0000000000000000000000000000000000000000000000000000000000181020000000000000000000000000000000000000000000000000000000000018102100000000000000000000000000000000000000000000000000000000001810220000000000000000000000000000000000000000000000000000000000181023000000000000000000000000000000000000000000000000000000000018102400000000000000000000000000000000000000000000000000000000001810250000000000000000000000000000000000000000000000000000000000181026000000000000000000000000000000000000000000000000000000000018102700000000000000000000000000000000000000000000000000000000001810280000000000000000000000000000000000000000000000000000000000181029000000000000000000000000000000000000000000000000000000000018102a000000000000000000000000000000000000000000000000000000000018102b000000000000000000000000000000000000000000000000000000000018102c000000000000000000000000000000000000000000000000000000000018102d000000000000000000000000000000000000000000000000000000000018102e000000000000000000000000000000000000000000000000000000000018102f0000000000000000000000000000000000000000000000000000000000181030000000000000000000000000000000000000000000000000000000000018103100000000000000000000000000000000000000000000000000000000001810320000000000000000000000000000000000000000000000000000000000181033000000000000000000000000000000000000000000000000000000000018103400000000000000000000000000000000000000000000000000000000001810350000000000000000000000000000000000000000000000000000000000181036000000000000000000000000000000000000000000000000000000000018103700000000000000000000000000000000000000000000000000000000001810380000000000000000000000000000000000000000000000000000000000181039000000000000000000000000000000000000000000000000000000000018103a000000000000000000000000000000000000000000000000000000000018103b000000000000000000000000000000000000000000000000000000000018103c000000000000000000000000000000000000000000000000000000000018103d000000000000000000000000000000000000000000000000000000000018103e000000000000000000000000000000000000000000000000000000000018103f4000000000000000000000000000000000000000000000000000000000001800010000000000000000000000000000000000000000000000000000000000181100000000000000000000000000000000000000000000000000000000000018110100000000000000000000000000000000000000000000000000000000001811020000000000000000000000000000000000000000000000000000000000181103000000000000000000000000000000000000000000000000000000000018110400000000000000000000000000000000000000000000000000000000001811050000000000000000000000000000000000000000000000000000000000181106000000000000000000000000000000000000000000000000000000000018110700000000000000000000000000000000000000000000000000000000001811080000000000000000000000000000000000000000000000000000000000181109000000000000000000000000000000000000000000000000000000000018110a000000000000000000000000000000000000000000000000000000000018110b000000000000000000000000000000000000000000000000000000000018110c000000000000000000000000000000000000000000000000000000000018110d000000000000000000000000000000000000000000000000000000000018110e000000000000000000000000000000000000000000000000000000000018110f0000000000000000000000000000000000000000000000000000000000181110000000000000000000000000000000000000000000000000000000000018111100000000000000000000000000000000000000000000000000000000001811120000000000000000000000000000000000000000000000000000000000181113000000000000000000000000000000000000000000000000000000000018111400000000000000000000000000000000000000000000000000000000001811150000000000000000000000000000000000000000000000000000000000181116000000000000000000000000000000000000000000000000000000000018111700000000000000000000000000000000000000000000000000000000001811180000000000000000000000000000000000000000000000000000000000181119000000000000000000000000000000000000000000000000000000000018111a000000000000000000000000000000000000000000000000000000000018111b000000000000000000000000000000000000000000000000000000000018111c000000000000000000000000000000000000000000000000000000000018111d000000000000000000000000000000000000000000000000000000000018111e000000000000000000000000000000000000000000000000000000000018111f0000000000000000000000000000000000000000000000000000000000181120000000000000000000000000000000000000000000000000000000000018112100000000000000000000000000000000000000000000000000000000001811220000000000000000000000000000000000000000000000000000000000181123000000000000000000000000000000000000000000000000000000000018112400000000000000000000000000000000000000000000000000000000001811250000000000000000000000000000000000000000000000000000000000181126000000000000000000000000000000000000000000000000000000000018112700000000000000000000000000000000000000000000000000000000001811280000000000000000000000000000000000000000000000000000000000181129000000000000000000000000000000000000000000000000000000000018112a000000000000000000000000000000000000000000000000000000000018112b000000000000000000000000000000000000000000000000000000000018112c000000000000000000000000000000000000000000000000000000000018112d000000000000000000000000000000000000000000000000000000000018112e000000000000000000000000000000000000000000000000000000000018112f0000000000000000000000000000000000000000000000000000000000181130000000000000000000000000000000000000000000000000000000000018113100000000000000000000000000000000000000000000000000000000001811320000000000000000000000000000000000000000000000000000000000181133000000000000000000000000000000000000000000000000000000000018113400000000000000000000000000000000000000000000000000000000001811350000000000000000000000000000000000000000000000000000000000181136000000000000000000000000000000000000000000000000000000000018113700000000000000000000000000000000000000000000000000000000001811380000000000000000000000000000000000000000000000000000000000181139000000000000000000000000000000000000000000000000000000000018113a000000000000000000000000000000000000000000000000000000000018113b000000000000000000000000000000000000000000000000000000000018113c000000000000000000000000000000000000000000000000000000000018113d000000000000000000000000000000000000000000000000000000000018113e0800f872eb9653f03af10f331da1361fa1524d3cd958cb72dacea1d424f19df3af00ffc548a17cd6ba1f2d228f30e4ddb19ecc46ad3b609977d52bb0f49e1206410032f8058bd779c520eabae2743b02ec4f71670428506fcceb2d4b69f26fb11800c0283e15fbf74ffa4eafb984030394f3c2ea6733cc0eacb0431a9475eff28f00b7f55314bfd9d441c1c624e241908228fe4da3d3a0a7fbd56814e1c8cd5d3e00f430f33a786675271736fd728c7bf7428b8c24ac948d7faf76ddb8783a496c0048fc235ead8d4b9d44929662a6384074fc4e5076bec5b7deb34f612393684300fd9b61cb1ad9b4b28f58399906e73933e3cccee8fc98a393f0eedb95b13ee63f0000000000000000000000000000000000000000000000000000000000182000000000000000000000000000000000000000000000000000000000000018200a0000000000000000000000000000000000000000000000000000000000182001000000000000000000000000000000000000000000000000000000000018200b0000000000000000000000000000000000000000000000000000000000182002000000000000000000000000000000000000000000000000000000000018200c0000000000000000000000000000000000000000000000000000000000182003000000000000000000000000000000000000000000000000000000000018200d0000000000000000000000000000000000000000000000000000000000182004000000000000000000000000000000000000000000000000000000000018200e0000000000000000000000000000000000000000000000000000000000182005000000000000000000000000000000000000000000000000000000000018200f00000000000000000000000000000000000000000000000000000000001820060000000000000000000000000000000000000000000000000000000000182010000000000000000000000000000000000000000000000000000000000018200700000000000000000000000000000000000000000000000000000000001820110000000000000000000000000000000000000000000000000000000000182008000000000000000000000000000000000000000000000000000000000018201200000000000000000000000000000000000000000000000000000000001820090000000000000000000000000000000000000000000000000000000000182013000000000000000000000000000000000000000000000000000000000018200a0000000000000000000000000000000000000000000000000000000000182014000000000000000000000000000000000000000000000000000000000018200b0000000000000000000000000000000000000000000000000000000000182015000000000000000000000000000000000000000000000000000000000018200c0000000000000000000000000000000000000000000000000000000000182016000000000000000000000000000000000000000000000000000000000018200d0000000000000000000000000000000000000000000000000000000000182017000000000000000000000000000000000000000000000000000000000018200e0000000000000000000000000000000000000000000000000000000000182018000000000000000000000000000000000000000000000000000000000018200f00000000000000000000000000000000000000000000000000000000001820190000000000000000000000000000000000000000000000000000000000182010000000000000000000000000000000000000000000000000000000000018201a0000000000000000000000000000000000000000000000000000000000182011000000000000000000000000000000000000000000000000000000000018201b0000000000000000000000000000000000000000000000000000000000182012000000000000000000000000000000000000000000000000000000000018201c0000000000000000000000000000000000000000000000000000000000182013000000000000000000000000000000000000000000000000000000000018201d0000000000000000000000000000000000000000000000000000000000182014000000000000000000000000000000000000000000000000000000000018201e0000000000000000000000000000000000000000000000000000000000182015000000000000000000000000000000000000000000000000000000000018201f00000000000000000000000000000000000000000000000000000000001820160000000000000000000000000000000000000000000000000000000000182020000000000000000000000000000000000000000000000000000000000018201700000000000000000000000000000000000000000000000000000000001820210000000000000000000000000000000000000000000000000000000000182018000000000000000000000000000000000000000000000000000000000018202200000000000000000000000000000000000000000000000000000000001820190000000000000000000000000000000000000000000000000000000000182023000000000000000000000000000000000000000000000000000000000018201a0000000000000000000000000000000000000000000000000000000000182024000000000000000000000000000000000000000000000000000000000018201b0000000000000000000000000000000000000000000000000000000000182025000000000000000000000000000000000000000000000000000000000018201c0000000000000000000000000000000000000000000000000000000000182026000000000000000000000000000000000000000000000000000000000018201d0000000000000000000000000000000000000000000000000000000000182027000000000000000000000000000000000000000000000000000000000018201e0000000000000000000000000000000000000000000000000000000000182028000000000000000000000000000000000000000000000000000000000018201f00000000000000000000000000000000000000000000000000000000001820290000000000000000000000000000000000000000000000000000000000182020000000000000000000000000000000000000000000000000000000000018202a0000000000000000000000000000000000000000000000000000000000182021000000000000000000000000000000000000000000000000000000000018202b0000000000000000000000000000000000000000000000000000000000182022000000000000000000000000000000000000000000000000000000000018202c0000000000000000000000000000000000000000000000000000000000182023000000000000000000000000000000000000000000000000000000000018202d0000000000000000000000000000000000000000000000000000000000182024000000000000000000000000000000000000000000000000000000000018202e0000000000000000000000000000000000000000000000000000000000182025000000000000000000000000000000000000000000000000000000000018202f00000000000000000000000000000000000000000000000000000000001820260000000000000000000000000000000000000000000000000000000000182030000000000000000000000000000000000000000000000000000000000018202700000000000000000000000000000000000000000000000000000000001820310000000000000000000000000000000000000000000000000000000000182028000000000000000000000000000000000000000000000000000000000018203200000000000000000000000000000000000000000000000000000000001820290000000000000000000000000000000000000000000000000000000000182033000000000000000000000000000000000000000000000000000000000018202a0000000000000000000000000000000000000000000000000000000000182034000000000000000000000000000000000000000000000000000000000018202b0000000000000000000000000000000000000000000000000000000000182035000000000000000000000000000000000000000000000000000000000018202c0000000000000000000000000000000000000000000000000000000000182036000000000000000000000000000000000000000000000000000000000018202d0000000000000000000000000000000000000000000000000000000000182037000000000000000000000000000000000000000000000000000000000018202e0000000000000000000000000000000000000000000000000000000000182038000000000000000000000000000000000000000000000000000000000018202f00000000000000000000000000000000000000000000000000000000001820390000000000000000000000000000000000000000000000000000000000182030000000000000000000000000000000000000000000000000000000000018203a0000000000000000000000000000000000000000000000000000000000182031000000000000000000000000000000000000000000000000000000000018203b0000000000000000000000000000000000000000000000000000000000182032000000000000000000000000000000000000000000000000000000000018203c0000000000000000000000000000000000000000000000000000000000182033000000000000000000000000000000000000000000000000000000000018203d0000000000000000000000000000000000000000000000000000000000182034000000000000000000000000000000000000000000000000000000000018203e0000000000000000000000000000000000000000000000000000000000182035000000000000000000000000000000000000000000000000000000000018203f00000000000000000000000000000000000000000000000000000000001820360000000000000000000000000000000000000000000000000000000000182040000000000000000000000000000000000000000000000000000000000018203700000000000000000000000000000000000000000000000000000000001820410000000000000000000000000000000000000000000000000000000000182038000000000000000000000000000000000000000000000000000000000018204200000000000000000000000000000000000000000000000000000000001820390000000000000000000000000000000000000000000000000000000000182043000000000000000000000000000000000000000000000000000000000018203a0000000000000000000000000000000000000000000000000000000000182044000000000000000000000000000000000000000000000000000000000018203b0000000000000000000000000000000000000000000000000000000000182045000000000000000000000000000000000000000000000000000000000018203c0000000000000000000000000000000000000000000000000000000000182046000000000000000000000000000000000000000000000000000000000018203d0000000000000000000000000000000000000000000000000000000000182047000000000000000000000000000000000000000000000000000000000018203e0000000000000000000000000000000000000000000000000000000000182048200000000000000000000000000000000000000000000000000000000000181700000000000000000000000000000000000000000000000000000000000018170100000000000000000000000000000000000000000000000000000000001817020000000000000000000000000000000000000000000000000000000000181703000000000000000000000000000000000000000000000000000000000018170400000000000000000000000000000000000000000000000000000000001817050000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018170100000000000000000000000000000000000000000000000000000000001817020000000000000000000000000000000000000000000000000000000000181703000000000000000000000000000000000000000000000000000000000018170400000000000000000000000000000000000000000000000000000000001817050000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817020000000000000000000000000000000000000000000000000000000000181703000000000000000000000000000000000000000000000000000000000018170400000000000000000000000000000000000000000000000000000000001817050000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181703000000000000000000000000000000000000000000000000000000000018170400000000000000000000000000000000000000000000000000000000001817050000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181714000000000000000000000000000000000000000000000000000000000018170400000000000000000000000000000000000000000000000000000000001817050000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181714000000000000000000000000000000000000000000000000000000000018171500000000000000000000000000000000000000000000000000000000001817050000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181714000000000000000000000000000000000000000000000000000000000018171500000000000000000000000000000000000000000000000000000000001817160000000000000000000000000000000000000000000000000000000000181706000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181714000000000000000000000000000000000000000000000000000000000018171500000000000000000000000000000000000000000000000000000000001817160000000000000000000000000000000000000000000000000000000000181717000000000000000000000000000000000000000000000000000000000018170700000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181714000000000000000000000000000000000000000000000000000000000018171500000000000000000000000000000000000000000000000000000000001817160000000000000000000000000000000000000000000000000000000000181717000000000000000000000000000000000000000000000000000000000018171800000000000000000000000000000000000000000000000000000000001817080000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f00000000000000000000000000000000000000000000000000000000001817100000000000000000000000000000000000000000000000000000000000181711000000000000000000000000000000000000000000000000000000000018171200000000000000000000000000000000000000000000000000000000001817130000000000000000000000000000000000000000000000000000000000181714000000000000000000000000000000000000000000000000000000000018171500000000000000000000000000000000000000000000000000000000001817160000000000000000000000000000000000000000000000000000000000181717000000000000000000000000000000000000000000000000000000000018171800000000000000000000000000000000000000000000000000000000001817190000000000000000000000000000000000000000000000000000000000181709000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018170a000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018170b000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018170c000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018170d000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018170e000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f000000000000000000000000000000000000000000000000000000000018170f0000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181710000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018171100000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817120000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181713000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181724000000000000000000000000000000000000000000000000000000000018171400000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181724000000000000000000000000000000000000000000000000000000000018172500000000000000000000000000000000000000000000000000000000001817150000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181724000000000000000000000000000000000000000000000000000000000018172500000000000000000000000000000000000000000000000000000000001817260000000000000000000000000000000000000000000000000000000000181716000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181724000000000000000000000000000000000000000000000000000000000018172500000000000000000000000000000000000000000000000000000000001817260000000000000000000000000000000000000000000000000000000000181727000000000000000000000000000000000000000000000000000000000018171700000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181724000000000000000000000000000000000000000000000000000000000018172500000000000000000000000000000000000000000000000000000000001817260000000000000000000000000000000000000000000000000000000000181727000000000000000000000000000000000000000000000000000000000018172800000000000000000000000000000000000000000000000000000000001817180000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f00000000000000000000000000000000000000000000000000000000001817200000000000000000000000000000000000000000000000000000000000181721000000000000000000000000000000000000000000000000000000000018172200000000000000000000000000000000000000000000000000000000001817230000000000000000000000000000000000000000000000000000000000181724000000000000000000000000000000000000000000000000000000000018172500000000000000000000000000000000000000000000000000000000001817260000000000000000000000000000000000000000000000000000000000181727000000000000000000000000000000000000000000000000000000000018172800000000000000000000000000000000000000000000000000000000001817290000000000000000000000000000000000000000000000000000000000181719000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018171a000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018172b000000000000000000000000000000000000000000000000000000000018171b000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018172b000000000000000000000000000000000000000000000000000000000018172c000000000000000000000000000000000000000000000000000000000018171c000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018172b000000000000000000000000000000000000000000000000000000000018172c000000000000000000000000000000000000000000000000000000000018172d000000000000000000000000000000000000000000000000000000000018171d000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018172b000000000000000000000000000000000000000000000000000000000018172c000000000000000000000000000000000000000000000000000000000018172d000000000000000000000000000000000000000000000000000000000018172e000000000000000000000000000000000000000000000000000000000018171e000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018172b000000000000000000000000000000000000000000000000000000000018172c000000000000000000000000000000000000000000000000000000000018172d000000000000000000000000000000000000000000000000000000000018172e000000000000000000000000000000000000000000000000000000000018172f000000000000000000000000000000000000000000000000000000000018171f0000000000000000000000000000000000000000000000000000000000181720000000000000000000000000000000000000000000000000000000000018172100000000000000000000000000000000000000000000000000000000001817220000000000000000000000000000000000000000000000000000000000181723000000000000000000000000000000000000000000000000000000000018172400000000000000000000000000000000000000000000000000000000001817250000000000000000000000000000000000000000000000000000000000181726000000000000000000000000000000000000000000000000000000000018172700000000000000000000000000000000000000000000000000000000001817280000000000000000000000000000000000000000000000000000000000181729000000000000000000000000000000000000000000000000000000000018172a000000000000000000000000000000000000000000000000000000000018172b000000000000000000000000000000000000000000000000000000000018172c000000000000000000000000000000000000000000000000000000000018172d000000000000000000000000000000000000000000000000000000000018172e000000000000000000000000000000000000000000000000000000000018172f00000000000000000000000000000000000000000000000000000000001817300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c100100000000000000000000000000000000000000000000000000000000001c100200000000000000000000000000000000000000000000000000000000001c100300000000000000000000000000000000000000000000000000000000001c100400000000000000000000000000000000000000000000000000000000001c100500000000000000000000000000000000000000000000000000000000001c100600000000000000000000000000000000000000000000000000000000001c100700000000000000000000000000000000000000000000000000000000001c100800000000000000000000000000000000000000000000000000000000001c100900000000000000000000000000000000000000000000000000000000001c100a00000000000000000000000000000000000000000000000000000000001c100b00000000000000000000000000000000000000000000000000000000001c100c00000000000000000000000000000000000000000000000000000000001c100d00000000000000000000000000000000000000000000000000000000001c100e00000000000000000000000000000000000000000000000000000000001c100f00000000000000000000000000000000000000000000000000000000001c101000000000000000000000000000000000000000000000000000000000001c101100000000000000000000000000000000000000000000000000000000001c101200000000000000000000000000000000000000000000000000000000001c101300000000000000000000000000000000000000000000000000000000001c101400000000000000000000000000000000000000000000000000000000001c101500000000000000000000000000000000000000000000000000000000001c101600000000000000000000000000000000000000000000000000000000001c101700000000000000000000000000000000000000000000000000000000001c101800000000000000000000000000000000000000000000000000000000001c101900000000000000000000000000000000000000000000000000000000001c101a00000000000000000000000000000000000000000000000000000000001c101b00000000000000000000000000000000000000000000000000000000001c101c00000000000000000000000000000000000000000000000000000000001c101d00000000000000000000000000000000000000000000000000000000001c101e00000000000000000000000000000000000000000000000000000000001c101f00000000000000000000000000000000000000000000000000000000001c102000000000000000000000000000000000000000000000000000000000001c102100000000000000000000000000000000000000000000000000000000001c102200000000000000000000000000000000000000000000000000000000001c102300000000000000000000000000000000000000000000000000000000001c102400000000000000000000000000000000000000000000000000000000001c102500000000000000000000000000000000000000000000000000000000001c102600000000000000000000000000000000000000000000000000000000001c102700000000000000000000000000000000000000000000000000000000001c102800000000000000000000000000000000000000000000000000000000001c102900000000000000000000000000000000000000000000000000000000001c102a00000000000000000000000000000000000000000000000000000000001c102b00000000000000000000000000000000000000000000000000000000001c102c00000000000000000000000000000000000000000000000000000000001c102d00000000000000000000000000000000000000000000000000000000001c102e00000000000000000000000000000000000000000000000000000000001c102f00000000000000000000000000000000000000000000000000000000001c103000000000000000000000000000000000000000000000000000000000001c103100000000000000000000000000000000000000000000000000000000001c103200000000000000000000000000000000000000000000000000000000001c103300000000000000000000000000000000000000000000000000000000001c103400000000000000000000000000000000000000000000000000000000001c103500000000000000000000000000000000000000000000000000000000001c103600000000000000000000000000000000000000000000000000000000001c103700000000000000000000000000000000000000000000000000000000001c103800000000000000000000000000000000000000000000000000000000001c103900000000000000000000000000000000000000000000000000000000001c103a00000000000000000000000000000000000000000000000000000000001c103b00000000000000000000000000000000000000000000000000000000001c103c00000000000000000000000000000000000000000000000000000000001c103d00000000000000000000000000000000000000000000000000000000001c103e00000000000000000000000000000000000000000000000000000000001c103f4000000000000000000000000000000000000000000000000000000000001c000100000000000000000000000000000000000000000000000000000000001c110000000000000000000000000000000000000000000000000000000000001c110100000000000000000000000000000000000000000000000000000000001c110200000000000000000000000000000000000000000000000000000000001c110300000000000000000000000000000000000000000000000000000000001c110400000000000000000000000000000000000000000000000000000000001c110500000000000000000000000000000000000000000000000000000000001c110600000000000000000000000000000000000000000000000000000000001c110700000000000000000000000000000000000000000000000000000000001c110800000000000000000000000000000000000000000000000000000000001c110900000000000000000000000000000000000000000000000000000000001c110a00000000000000000000000000000000000000000000000000000000001c110b00000000000000000000000000000000000000000000000000000000001c110c00000000000000000000000000000000000000000000000000000000001c110d00000000000000000000000000000000000000000000000000000000001c110e00000000000000000000000000000000000000000000000000000000001c110f00000000000000000000000000000000000000000000000000000000001c111000000000000000000000000000000000000000000000000000000000001c111100000000000000000000000000000000000000000000000000000000001c111200000000000000000000000000000000000000000000000000000000001c111300000000000000000000000000000000000000000000000000000000001c111400000000000000000000000000000000000000000000000000000000001c111500000000000000000000000000000000000000000000000000000000001c111600000000000000000000000000000000000000000000000000000000001c111700000000000000000000000000000000000000000000000000000000001c111800000000000000000000000000000000000000000000000000000000001c111900000000000000000000000000000000000000000000000000000000001c111a00000000000000000000000000000000000000000000000000000000001c111b00000000000000000000000000000000000000000000000000000000001c111c00000000000000000000000000000000000000000000000000000000001c111d00000000000000000000000000000000000000000000000000000000001c111e00000000000000000000000000000000000000000000000000000000001c111f00000000000000000000000000000000000000000000000000000000001c112000000000000000000000000000000000000000000000000000000000001c112100000000000000000000000000000000000000000000000000000000001c112200000000000000000000000000000000000000000000000000000000001c112300000000000000000000000000000000000000000000000000000000001c112400000000000000000000000000000000000000000000000000000000001c112500000000000000000000000000000000000000000000000000000000001c112600000000000000000000000000000000000000000000000000000000001c112700000000000000000000000000000000000000000000000000000000001c112800000000000000000000000000000000000000000000000000000000001c112900000000000000000000000000000000000000000000000000000000001c112a00000000000000000000000000000000000000000000000000000000001c112b00000000000000000000000000000000000000000000000000000000001c112c00000000000000000000000000000000000000000000000000000000001c112d00000000000000000000000000000000000000000000000000000000001c112e00000000000000000000000000000000000000000000000000000000001c112f00000000000000000000000000000000000000000000000000000000001c113000000000000000000000000000000000000000000000000000000000001c113100000000000000000000000000000000000000000000000000000000001c113200000000000000000000000000000000000000000000000000000000001c113300000000000000000000000000000000000000000000000000000000001c113400000000000000000000000000000000000000000000000000000000001c113500000000000000000000000000000000000000000000000000000000001c113600000000000000000000000000000000000000000000000000000000001c113700000000000000000000000000000000000000000000000000000000001c113800000000000000000000000000000000000000000000000000000000001c113900000000000000000000000000000000000000000000000000000000001c113a00000000000000000000000000000000000000000000000000000000001c113b00000000000000000000000000000000000000000000000000000000001c113c00000000000000000000000000000000000000000000000000000000001c113d00000000000000000000000000000000000000000000000000000000001c113e08006838aa99533bea0d4204cad17cb3c147e99c2f9089e54a4289d54733eeada2002ab314bd11ace2494a3fb0970d276da39f0fe7da19c9a2438b9c7c334d32470071703d79d8425a7eca52006df6a8f9728508a83639e3e1c2ebae2b853a087c00c9501ac04a78ac5413c9131b08708064ed2c2515b8893f12c2d1cda15a44f100a0955f93e109778d26f9e5b0d46e45c539e59b0941517bfa888eb2d7d2d8a6005adc3be9406cc5f102c6adb44746e8529a256e2396353a8659344cc3e914c4007a5fe572cf6af804f472dabf095c5eb6b30efc5fd627ad3245a8ef0f3f578c003dcaa91dfc9fdad7ba8da68a48fc662dfc0a995cbb0c1bc62099c8257d240d3f00000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c200a00000000000000000000000000000000000000000000000000000000001c200100000000000000000000000000000000000000000000000000000000001c200b00000000000000000000000000000000000000000000000000000000001c200200000000000000000000000000000000000000000000000000000000001c200c00000000000000000000000000000000000000000000000000000000001c200300000000000000000000000000000000000000000000000000000000001c200d00000000000000000000000000000000000000000000000000000000001c200400000000000000000000000000000000000000000000000000000000001c200e00000000000000000000000000000000000000000000000000000000001c200500000000000000000000000000000000000000000000000000000000001c200f00000000000000000000000000000000000000000000000000000000001c200600000000000000000000000000000000000000000000000000000000001c201000000000000000000000000000000000000000000000000000000000001c200700000000000000000000000000000000000000000000000000000000001c201100000000000000000000000000000000000000000000000000000000001c200800000000000000000000000000000000000000000000000000000000001c201200000000000000000000000000000000000000000000000000000000001c200900000000000000000000000000000000000000000000000000000000001c201300000000000000000000000000000000000000000000000000000000001c200a00000000000000000000000000000000000000000000000000000000001c201400000000000000000000000000000000000000000000000000000000001c200b00000000000000000000000000000000000000000000000000000000001c201500000000000000000000000000000000000000000000000000000000001c200c00000000000000000000000000000000000000000000000000000000001c201600000000000000000000000000000000000000000000000000000000001c200d00000000000000000000000000000000000000000000000000000000001c201700000000000000000000000000000000000000000000000000000000001c200e00000000000000000000000000000000000000000000000000000000001c201800000000000000000000000000000000000000000000000000000000001c200f00000000000000000000000000000000000000000000000000000000001c201900000000000000000000000000000000000000000000000000000000001c201000000000000000000000000000000000000000000000000000000000001c201a00000000000000000000000000000000000000000000000000000000001c201100000000000000000000000000000000000000000000000000000000001c201b00000000000000000000000000000000000000000000000000000000001c201200000000000000000000000000000000000000000000000000000000001c201c00000000000000000000000000000000000000000000000000000000001c201300000000000000000000000000000000000000000000000000000000001c201d00000000000000000000000000000000000000000000000000000000001c201400000000000000000000000000000000000000000000000000000000001c201e00000000000000000000000000000000000000000000000000000000001c201500000000000000000000000000000000000000000000000000000000001c201f00000000000000000000000000000000000000000000000000000000001c201600000000000000000000000000000000000000000000000000000000001c202000000000000000000000000000000000000000000000000000000000001c201700000000000000000000000000000000000000000000000000000000001c202100000000000000000000000000000000000000000000000000000000001c201800000000000000000000000000000000000000000000000000000000001c202200000000000000000000000000000000000000000000000000000000001c201900000000000000000000000000000000000000000000000000000000001c202300000000000000000000000000000000000000000000000000000000001c201a00000000000000000000000000000000000000000000000000000000001c202400000000000000000000000000000000000000000000000000000000001c201b00000000000000000000000000000000000000000000000000000000001c202500000000000000000000000000000000000000000000000000000000001c201c00000000000000000000000000000000000000000000000000000000001c202600000000000000000000000000000000000000000000000000000000001c201d00000000000000000000000000000000000000000000000000000000001c202700000000000000000000000000000000000000000000000000000000001c201e00000000000000000000000000000000000000000000000000000000001c202800000000000000000000000000000000000000000000000000000000001c201f00000000000000000000000000000000000000000000000000000000001c202900000000000000000000000000000000000000000000000000000000001c202000000000000000000000000000000000000000000000000000000000001c202a00000000000000000000000000000000000000000000000000000000001c202100000000000000000000000000000000000000000000000000000000001c202b00000000000000000000000000000000000000000000000000000000001c202200000000000000000000000000000000000000000000000000000000001c202c00000000000000000000000000000000000000000000000000000000001c202300000000000000000000000000000000000000000000000000000000001c202d00000000000000000000000000000000000000000000000000000000001c202400000000000000000000000000000000000000000000000000000000001c202e00000000000000000000000000000000000000000000000000000000001c202500000000000000000000000000000000000000000000000000000000001c202f00000000000000000000000000000000000000000000000000000000001c202600000000000000000000000000000000000000000000000000000000001c203000000000000000000000000000000000000000000000000000000000001c202700000000000000000000000000000000000000000000000000000000001c203100000000000000000000000000000000000000000000000000000000001c202800000000000000000000000000000000000000000000000000000000001c203200000000000000000000000000000000000000000000000000000000001c202900000000000000000000000000000000000000000000000000000000001c203300000000000000000000000000000000000000000000000000000000001c202a00000000000000000000000000000000000000000000000000000000001c203400000000000000000000000000000000000000000000000000000000001c202b00000000000000000000000000000000000000000000000000000000001c203500000000000000000000000000000000000000000000000000000000001c202c00000000000000000000000000000000000000000000000000000000001c203600000000000000000000000000000000000000000000000000000000001c202d00000000000000000000000000000000000000000000000000000000001c203700000000000000000000000000000000000000000000000000000000001c202e00000000000000000000000000000000000000000000000000000000001c203800000000000000000000000000000000000000000000000000000000001c202f00000000000000000000000000000000000000000000000000000000001c203900000000000000000000000000000000000000000000000000000000001c203000000000000000000000000000000000000000000000000000000000001c203a00000000000000000000000000000000000000000000000000000000001c203100000000000000000000000000000000000000000000000000000000001c203b00000000000000000000000000000000000000000000000000000000001c203200000000000000000000000000000000000000000000000000000000001c203c00000000000000000000000000000000000000000000000000000000001c203300000000000000000000000000000000000000000000000000000000001c203d00000000000000000000000000000000000000000000000000000000001c203400000000000000000000000000000000000000000000000000000000001c203e00000000000000000000000000000000000000000000000000000000001c203500000000000000000000000000000000000000000000000000000000001c203f00000000000000000000000000000000000000000000000000000000001c203600000000000000000000000000000000000000000000000000000000001c204000000000000000000000000000000000000000000000000000000000001c203700000000000000000000000000000000000000000000000000000000001c204100000000000000000000000000000000000000000000000000000000001c203800000000000000000000000000000000000000000000000000000000001c204200000000000000000000000000000000000000000000000000000000001c203900000000000000000000000000000000000000000000000000000000001c204300000000000000000000000000000000000000000000000000000000001c203a00000000000000000000000000000000000000000000000000000000001c204400000000000000000000000000000000000000000000000000000000001c203b00000000000000000000000000000000000000000000000000000000001c204500000000000000000000000000000000000000000000000000000000001c203c00000000000000000000000000000000000000000000000000000000001c204600000000000000000000000000000000000000000000000000000000001c203d00000000000000000000000000000000000000000000000000000000001c204700000000000000000000000000000000000000000000000000000000001c203e00000000000000000000000000000000000000000000000000000000001c20482000000000000000000000000000000000000000000000000000000000001c170000000000000000000000000000000000000000000000000000000000001c170100000000000000000000000000000000000000000000000000000000001c170200000000000000000000000000000000000000000000000000000000001c170300000000000000000000000000000000000000000000000000000000001c170400000000000000000000000000000000000000000000000000000000001c170500000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c170100000000000000000000000000000000000000000000000000000000001c170200000000000000000000000000000000000000000000000000000000001c170300000000000000000000000000000000000000000000000000000000001c170400000000000000000000000000000000000000000000000000000000001c170500000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c170200000000000000000000000000000000000000000000000000000000001c170300000000000000000000000000000000000000000000000000000000001c170400000000000000000000000000000000000000000000000000000000001c170500000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c170300000000000000000000000000000000000000000000000000000000001c170400000000000000000000000000000000000000000000000000000000001c170500000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c170400000000000000000000000000000000000000000000000000000000001c170500000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c170500000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c170600000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c170700000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c170800000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c170900000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c170a00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c170b00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c170c00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c170d00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c170e00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c170f00000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c171000000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c171100000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c171200000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c171300000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c171400000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c171500000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c171600000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c171700000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c171800000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c171900000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c171a00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c172b00000000000000000000000000000000000000000000000000000000001c171b00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c172b00000000000000000000000000000000000000000000000000000000001c172c00000000000000000000000000000000000000000000000000000000001c171c00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c172b00000000000000000000000000000000000000000000000000000000001c172c00000000000000000000000000000000000000000000000000000000001c172d00000000000000000000000000000000000000000000000000000000001c171d00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c172b00000000000000000000000000000000000000000000000000000000001c172c00000000000000000000000000000000000000000000000000000000001c172d00000000000000000000000000000000000000000000000000000000001c172e00000000000000000000000000000000000000000000000000000000001c171e00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c172b00000000000000000000000000000000000000000000000000000000001c172c00000000000000000000000000000000000000000000000000000000001c172d00000000000000000000000000000000000000000000000000000000001c172e00000000000000000000000000000000000000000000000000000000001c172f00000000000000000000000000000000000000000000000000000000001c171f00000000000000000000000000000000000000000000000000000000001c172000000000000000000000000000000000000000000000000000000000001c172100000000000000000000000000000000000000000000000000000000001c172200000000000000000000000000000000000000000000000000000000001c172300000000000000000000000000000000000000000000000000000000001c172400000000000000000000000000000000000000000000000000000000001c172500000000000000000000000000000000000000000000000000000000001c172600000000000000000000000000000000000000000000000000000000001c172700000000000000000000000000000000000000000000000000000000001c172800000000000000000000000000000000000000000000000000000000001c172900000000000000000000000000000000000000000000000000000000001c172a00000000000000000000000000000000000000000000000000000000001c172b00000000000000000000000000000000000000000000000000000000001c172c00000000000000000000000000000000000000000000000000000000001c172d00000000000000000000000000000000000000000000000000000000001c172e00000000000000000000000000000000000000000000000000000000001c172f00000000000000000000000000000000000000000000000000000000001c1730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000000000000000000000000000020100100000000000000000000000000000000000000000000000000000000002010020000000000000000000000000000000000000000000000000000000000201003000000000000000000000000000000000000000000000000000000000020100400000000000000000000000000000000000000000000000000000000002010050000000000000000000000000000000000000000000000000000000000201006000000000000000000000000000000000000000000000000000000000020100700000000000000000000000000000000000000000000000000000000002010080000000000000000000000000000000000000000000000000000000000201009000000000000000000000000000000000000000000000000000000000020100a000000000000000000000000000000000000000000000000000000000020100b000000000000000000000000000000000000000000000000000000000020100c000000000000000000000000000000000000000000000000000000000020100d000000000000000000000000000000000000000000000000000000000020100e000000000000000000000000000000000000000000000000000000000020100f0000000000000000000000000000000000000000000000000000000000201010000000000000000000000000000000000000000000000000000000000020101100000000000000000000000000000000000000000000000000000000002010120000000000000000000000000000000000000000000000000000000000201013000000000000000000000000000000000000000000000000000000000020101400000000000000000000000000000000000000000000000000000000002010150000000000000000000000000000000000000000000000000000000000201016000000000000000000000000000000000000000000000000000000000020101700000000000000000000000000000000000000000000000000000000002010180000000000000000000000000000000000000000000000000000000000201019000000000000000000000000000000000000000000000000000000000020101a000000000000000000000000000000000000000000000000000000000020101b000000000000000000000000000000000000000000000000000000000020101c000000000000000000000000000000000000000000000000000000000020101d000000000000000000000000000000000000000000000000000000000020101e000000000000000000000000000000000000000000000000000000000020101f0000000000000000000000000000000000000000000000000000000000201020000000000000000000000000000000000000000000000000000000000020102100000000000000000000000000000000000000000000000000000000002010220000000000000000000000000000000000000000000000000000000000201023000000000000000000000000000000000000000000000000000000000020102400000000000000000000000000000000000000000000000000000000002010250000000000000000000000000000000000000000000000000000000000201026000000000000000000000000000000000000000000000000000000000020102700000000000000000000000000000000000000000000000000000000002010280000000000000000000000000000000000000000000000000000000000201029000000000000000000000000000000000000000000000000000000000020102a000000000000000000000000000000000000000000000000000000000020102b000000000000000000000000000000000000000000000000000000000020102c000000000000000000000000000000000000000000000000000000000020102d000000000000000000000000000000000000000000000000000000000020102e000000000000000000000000000000000000000000000000000000000020102f0000000000000000000000000000000000000000000000000000000000201030000000000000000000000000000000000000000000000000000000000020103100000000000000000000000000000000000000000000000000000000002010320000000000000000000000000000000000000000000000000000000000201033000000000000000000000000000000000000000000000000000000000020103400000000000000000000000000000000000000000000000000000000002010350000000000000000000000000000000000000000000000000000000000201036000000000000000000000000000000000000000000000000000000000020103700000000000000000000000000000000000000000000000000000000002010380000000000000000000000000000000000000000000000000000000000201039000000000000000000000000000000000000000000000000000000000020103a000000000000000000000000000000000000000000000000000000000020103b000000000000000000000000000000000000000000000000000000000020103c000000000000000000000000000000000000000000000000000000000020103d000000000000000000000000000000000000000000000000000000000020103e000000000000000000000000000000000000000000000000000000000020103f4000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000201100000000000000000000000000000000000000000000000000000000000020110100000000000000000000000000000000000000000000000000000000002011020000000000000000000000000000000000000000000000000000000000201103000000000000000000000000000000000000000000000000000000000020110400000000000000000000000000000000000000000000000000000000002011050000000000000000000000000000000000000000000000000000000000201106000000000000000000000000000000000000000000000000000000000020110700000000000000000000000000000000000000000000000000000000002011080000000000000000000000000000000000000000000000000000000000201109000000000000000000000000000000000000000000000000000000000020110a000000000000000000000000000000000000000000000000000000000020110b000000000000000000000000000000000000000000000000000000000020110c000000000000000000000000000000000000000000000000000000000020110d000000000000000000000000000000000000000000000000000000000020110e000000000000000000000000000000000000000000000000000000000020110f0000000000000000000000000000000000000000000000000000000000201110000000000000000000000000000000000000000000000000000000000020111100000000000000000000000000000000000000000000000000000000002011120000000000000000000000000000000000000000000000000000000000201113000000000000000000000000000000000000000000000000000000000020111400000000000000000000000000000000000000000000000000000000002011150000000000000000000000000000000000000000000000000000000000201116000000000000000000000000000000000000000000000000000000000020111700000000000000000000000000000000000000000000000000000000002011180000000000000000000000000000000000000000000000000000000000201119000000000000000000000000000000000000000000000000000000000020111a000000000000000000000000000000000000000000000000000000000020111b000000000000000000000000000000000000000000000000000000000020111c000000000000000000000000000000000000000000000000000000000020111d000000000000000000000000000000000000000000000000000000000020111e000000000000000000000000000000000000000000000000000000000020111f0000000000000000000000000000000000000000000000000000000000201120000000000000000000000000000000000000000000000000000000000020112100000000000000000000000000000000000000000000000000000000002011220000000000000000000000000000000000000000000000000000000000201123000000000000000000000000000000000000000000000000000000000020112400000000000000000000000000000000000000000000000000000000002011250000000000000000000000000000000000000000000000000000000000201126000000000000000000000000000000000000000000000000000000000020112700000000000000000000000000000000000000000000000000000000002011280000000000000000000000000000000000000000000000000000000000201129000000000000000000000000000000000000000000000000000000000020112a000000000000000000000000000000000000000000000000000000000020112b000000000000000000000000000000000000000000000000000000000020112c000000000000000000000000000000000000000000000000000000000020112d000000000000000000000000000000000000000000000000000000000020112e000000000000000000000000000000000000000000000000000000000020112f0000000000000000000000000000000000000000000000000000000000201130000000000000000000000000000000000000000000000000000000000020113100000000000000000000000000000000000000000000000000000000002011320000000000000000000000000000000000000000000000000000000000201133000000000000000000000000000000000000000000000000000000000020113400000000000000000000000000000000000000000000000000000000002011350000000000000000000000000000000000000000000000000000000000201136000000000000000000000000000000000000000000000000000000000020113700000000000000000000000000000000000000000000000000000000002011380000000000000000000000000000000000000000000000000000000000201139000000000000000000000000000000000000000000000000000000000020113a000000000000000000000000000000000000000000000000000000000020113b000000000000000000000000000000000000000000000000000000000020113c000000000000000000000000000000000000000000000000000000000020113d000000000000000000000000000000000000000000000000000000000020113e0800e9805e8a4faa87fc419af08a6d956f18976c46ea694bbd4cf6946e6d02033200e0925a6b172b4b01bb76eb1d3f7dd2ced118bca70d223a6d61afa1b75915ae00383590492d2f99a0283d1de57015b4b6b0759a8023af2c68fb4929dee2f303007ed57100dd77e2b6405f780503ef61b7b53e13f344b6e6a6eff3e3c13de0d0001ab1b0c348c46184dbc86ff79f248e7da1b09d3f9c6a986e98fe45389f060d0023d134bc68d7efa25e255001069827dc0bee766c08c988d6300071ed27fe6c0031cbb780b07f632cbaf767dc80608cc0a8e1d1df3ecd6f5d8bc0ca6703e4f4002c7dc9e731fc5f6456b2a70b4e636ac17d5e0cd36d3a591116a9e124f735863f0000000000000000000000000000000000000000000000000000000000202000000000000000000000000000000000000000000000000000000000000020200a0000000000000000000000000000000000000000000000000000000000202001000000000000000000000000000000000000000000000000000000000020200b0000000000000000000000000000000000000000000000000000000000202002000000000000000000000000000000000000000000000000000000000020200c0000000000000000000000000000000000000000000000000000000000202003000000000000000000000000000000000000000000000000000000000020200d0000000000000000000000000000000000000000000000000000000000202004000000000000000000000000000000000000000000000000000000000020200e0000000000000000000000000000000000000000000000000000000000202005000000000000000000000000000000000000000000000000000000000020200f00000000000000000000000000000000000000000000000000000000002020060000000000000000000000000000000000000000000000000000000000202010000000000000000000000000000000000000000000000000000000000020200700000000000000000000000000000000000000000000000000000000002020110000000000000000000000000000000000000000000000000000000000202008000000000000000000000000000000000000000000000000000000000020201200000000000000000000000000000000000000000000000000000000002020090000000000000000000000000000000000000000000000000000000000202013000000000000000000000000000000000000000000000000000000000020200a0000000000000000000000000000000000000000000000000000000000202014000000000000000000000000000000000000000000000000000000000020200b0000000000000000000000000000000000000000000000000000000000202015000000000000000000000000000000000000000000000000000000000020200c0000000000000000000000000000000000000000000000000000000000202016000000000000000000000000000000000000000000000000000000000020200d0000000000000000000000000000000000000000000000000000000000202017000000000000000000000000000000000000000000000000000000000020200e0000000000000000000000000000000000000000000000000000000000202018000000000000000000000000000000000000000000000000000000000020200f00000000000000000000000000000000000000000000000000000000002020190000000000000000000000000000000000000000000000000000000000202010000000000000000000000000000000000000000000000000000000000020201a0000000000000000000000000000000000000000000000000000000000202011000000000000000000000000000000000000000000000000000000000020201b0000000000000000000000000000000000000000000000000000000000202012000000000000000000000000000000000000000000000000000000000020201c0000000000000000000000000000000000000000000000000000000000202013000000000000000000000000000000000000000000000000000000000020201d0000000000000000000000000000000000000000000000000000000000202014000000000000000000000000000000000000000000000000000000000020201e0000000000000000000000000000000000000000000000000000000000202015000000000000000000000000000000000000000000000000000000000020201f00000000000000000000000000000000000000000000000000000000002020160000000000000000000000000000000000000000000000000000000000202020000000000000000000000000000000000000000000000000000000000020201700000000000000000000000000000000000000000000000000000000002020210000000000000000000000000000000000000000000000000000000000202018000000000000000000000000000000000000000000000000000000000020202200000000000000000000000000000000000000000000000000000000002020190000000000000000000000000000000000000000000000000000000000202023000000000000000000000000000000000000000000000000000000000020201a0000000000000000000000000000000000000000000000000000000000202024000000000000000000000000000000000000000000000000000000000020201b0000000000000000000000000000000000000000000000000000000000202025000000000000000000000000000000000000000000000000000000000020201c0000000000000000000000000000000000000000000000000000000000202026000000000000000000000000000000000000000000000000000000000020201d0000000000000000000000000000000000000000000000000000000000202027000000000000000000000000000000000000000000000000000000000020201e0000000000000000000000000000000000000000000000000000000000202028000000000000000000000000000000000000000000000000000000000020201f00000000000000000000000000000000000000000000000000000000002020290000000000000000000000000000000000000000000000000000000000202020000000000000000000000000000000000000000000000000000000000020202a0000000000000000000000000000000000000000000000000000000000202021000000000000000000000000000000000000000000000000000000000020202b0000000000000000000000000000000000000000000000000000000000202022000000000000000000000000000000000000000000000000000000000020202c0000000000000000000000000000000000000000000000000000000000202023000000000000000000000000000000000000000000000000000000000020202d0000000000000000000000000000000000000000000000000000000000202024000000000000000000000000000000000000000000000000000000000020202e0000000000000000000000000000000000000000000000000000000000202025000000000000000000000000000000000000000000000000000000000020202f00000000000000000000000000000000000000000000000000000000002020260000000000000000000000000000000000000000000000000000000000202030000000000000000000000000000000000000000000000000000000000020202700000000000000000000000000000000000000000000000000000000002020310000000000000000000000000000000000000000000000000000000000202028000000000000000000000000000000000000000000000000000000000020203200000000000000000000000000000000000000000000000000000000002020290000000000000000000000000000000000000000000000000000000000202033000000000000000000000000000000000000000000000000000000000020202a0000000000000000000000000000000000000000000000000000000000202034000000000000000000000000000000000000000000000000000000000020202b0000000000000000000000000000000000000000000000000000000000202035000000000000000000000000000000000000000000000000000000000020202c0000000000000000000000000000000000000000000000000000000000202036000000000000000000000000000000000000000000000000000000000020202d0000000000000000000000000000000000000000000000000000000000202037000000000000000000000000000000000000000000000000000000000020202e0000000000000000000000000000000000000000000000000000000000202038000000000000000000000000000000000000000000000000000000000020202f00000000000000000000000000000000000000000000000000000000002020390000000000000000000000000000000000000000000000000000000000202030000000000000000000000000000000000000000000000000000000000020203a0000000000000000000000000000000000000000000000000000000000202031000000000000000000000000000000000000000000000000000000000020203b0000000000000000000000000000000000000000000000000000000000202032000000000000000000000000000000000000000000000000000000000020203c0000000000000000000000000000000000000000000000000000000000202033000000000000000000000000000000000000000000000000000000000020203d0000000000000000000000000000000000000000000000000000000000202034000000000000000000000000000000000000000000000000000000000020203e0000000000000000000000000000000000000000000000000000000000202035000000000000000000000000000000000000000000000000000000000020203f00000000000000000000000000000000000000000000000000000000002020360000000000000000000000000000000000000000000000000000000000202040000000000000000000000000000000000000000000000000000000000020203700000000000000000000000000000000000000000000000000000000002020410000000000000000000000000000000000000000000000000000000000202038000000000000000000000000000000000000000000000000000000000020204200000000000000000000000000000000000000000000000000000000002020390000000000000000000000000000000000000000000000000000000000202043000000000000000000000000000000000000000000000000000000000020203a0000000000000000000000000000000000000000000000000000000000202044000000000000000000000000000000000000000000000000000000000020203b0000000000000000000000000000000000000000000000000000000000202045000000000000000000000000000000000000000000000000000000000020203c0000000000000000000000000000000000000000000000000000000000202046000000000000000000000000000000000000000000000000000000000020203d0000000000000000000000000000000000000000000000000000000000202047000000000000000000000000000000000000000000000000000000000020203e0000000000000000000000000000000000000000000000000000000000202048200000000000000000000000000000000000000000000000000000000000201700000000000000000000000000000000000000000000000000000000000020170100000000000000000000000000000000000000000000000000000000002017020000000000000000000000000000000000000000000000000000000000201703000000000000000000000000000000000000000000000000000000000020170400000000000000000000000000000000000000000000000000000000002017050000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020170100000000000000000000000000000000000000000000000000000000002017020000000000000000000000000000000000000000000000000000000000201703000000000000000000000000000000000000000000000000000000000020170400000000000000000000000000000000000000000000000000000000002017050000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017020000000000000000000000000000000000000000000000000000000000201703000000000000000000000000000000000000000000000000000000000020170400000000000000000000000000000000000000000000000000000000002017050000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201703000000000000000000000000000000000000000000000000000000000020170400000000000000000000000000000000000000000000000000000000002017050000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201714000000000000000000000000000000000000000000000000000000000020170400000000000000000000000000000000000000000000000000000000002017050000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201714000000000000000000000000000000000000000000000000000000000020171500000000000000000000000000000000000000000000000000000000002017050000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201714000000000000000000000000000000000000000000000000000000000020171500000000000000000000000000000000000000000000000000000000002017160000000000000000000000000000000000000000000000000000000000201706000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201714000000000000000000000000000000000000000000000000000000000020171500000000000000000000000000000000000000000000000000000000002017160000000000000000000000000000000000000000000000000000000000201717000000000000000000000000000000000000000000000000000000000020170700000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201714000000000000000000000000000000000000000000000000000000000020171500000000000000000000000000000000000000000000000000000000002017160000000000000000000000000000000000000000000000000000000000201717000000000000000000000000000000000000000000000000000000000020171800000000000000000000000000000000000000000000000000000000002017080000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f00000000000000000000000000000000000000000000000000000000002017100000000000000000000000000000000000000000000000000000000000201711000000000000000000000000000000000000000000000000000000000020171200000000000000000000000000000000000000000000000000000000002017130000000000000000000000000000000000000000000000000000000000201714000000000000000000000000000000000000000000000000000000000020171500000000000000000000000000000000000000000000000000000000002017160000000000000000000000000000000000000000000000000000000000201717000000000000000000000000000000000000000000000000000000000020171800000000000000000000000000000000000000000000000000000000002017190000000000000000000000000000000000000000000000000000000000201709000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020170a000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020170b000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020170c000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020170d000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020170e000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f000000000000000000000000000000000000000000000000000000000020170f0000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201710000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020171100000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017120000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201713000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201724000000000000000000000000000000000000000000000000000000000020171400000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201724000000000000000000000000000000000000000000000000000000000020172500000000000000000000000000000000000000000000000000000000002017150000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201724000000000000000000000000000000000000000000000000000000000020172500000000000000000000000000000000000000000000000000000000002017260000000000000000000000000000000000000000000000000000000000201716000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201724000000000000000000000000000000000000000000000000000000000020172500000000000000000000000000000000000000000000000000000000002017260000000000000000000000000000000000000000000000000000000000201727000000000000000000000000000000000000000000000000000000000020171700000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201724000000000000000000000000000000000000000000000000000000000020172500000000000000000000000000000000000000000000000000000000002017260000000000000000000000000000000000000000000000000000000000201727000000000000000000000000000000000000000000000000000000000020172800000000000000000000000000000000000000000000000000000000002017180000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f00000000000000000000000000000000000000000000000000000000002017200000000000000000000000000000000000000000000000000000000000201721000000000000000000000000000000000000000000000000000000000020172200000000000000000000000000000000000000000000000000000000002017230000000000000000000000000000000000000000000000000000000000201724000000000000000000000000000000000000000000000000000000000020172500000000000000000000000000000000000000000000000000000000002017260000000000000000000000000000000000000000000000000000000000201727000000000000000000000000000000000000000000000000000000000020172800000000000000000000000000000000000000000000000000000000002017290000000000000000000000000000000000000000000000000000000000201719000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020171a000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020172b000000000000000000000000000000000000000000000000000000000020171b000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020172b000000000000000000000000000000000000000000000000000000000020172c000000000000000000000000000000000000000000000000000000000020171c000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020172b000000000000000000000000000000000000000000000000000000000020172c000000000000000000000000000000000000000000000000000000000020172d000000000000000000000000000000000000000000000000000000000020171d000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020172b000000000000000000000000000000000000000000000000000000000020172c000000000000000000000000000000000000000000000000000000000020172d000000000000000000000000000000000000000000000000000000000020172e000000000000000000000000000000000000000000000000000000000020171e000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020172b000000000000000000000000000000000000000000000000000000000020172c000000000000000000000000000000000000000000000000000000000020172d000000000000000000000000000000000000000000000000000000000020172e000000000000000000000000000000000000000000000000000000000020172f000000000000000000000000000000000000000000000000000000000020171f0000000000000000000000000000000000000000000000000000000000201720000000000000000000000000000000000000000000000000000000000020172100000000000000000000000000000000000000000000000000000000002017220000000000000000000000000000000000000000000000000000000000201723000000000000000000000000000000000000000000000000000000000020172400000000000000000000000000000000000000000000000000000000002017250000000000000000000000000000000000000000000000000000000000201726000000000000000000000000000000000000000000000000000000000020172700000000000000000000000000000000000000000000000000000000002017280000000000000000000000000000000000000000000000000000000000201729000000000000000000000000000000000000000000000000000000000020172a000000000000000000000000000000000000000000000000000000000020172b000000000000000000000000000000000000000000000000000000000020172c000000000000000000000000000000000000000000000000000000000020172d000000000000000000000000000000000000000000000000000000000020172e000000000000000000000000000000000000000000000000000000000020172f0000000000000000000000000000000000000000000000000000000000201730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "txsEffectsHash": "0x0061d3e24f48b36153518068bf23cd75841f8fbb806641d019a33be2078d3a3e", "decodedHeader": { "contentCommitment": { + "blobsHash": "0x009e8ec13116b15eb50b79827d2b7e54e1bbbedfe36c073ad7ad123cd219df1c", "inHash": "0x00e1371045bd7d2c3e1f19cba5f536f0e82042ba4bc257d4ba19c146215e8242", "outHash": "0x00a5c37986316b1f5f2df53fa9ddf4965f539e872f5e1374f28d225540faca26", - "numTxs": 4, - "txsEffectsHash": "0x0061d3e24f48b36153518068bf23cd75841f8fbb806641d019a33be2078d3a3e" + "numTxs": 4 }, "globalVariables": { "blockNumber": 2, "slotNumber": "0x0000000000000000000000000000000000000000000000000000000000000023", "chainId": 31337, - "timestamp": 1732895164, + "timestamp": 1732960824, "version": 1, - "coinbase": "0x6bb9503e73901291188976cb74f3ee186877aed7", - "feeRecipient": "0x1560bcdb97a3f65361a878c5fde7c89bd762de8a4e92dd872bb5e1f39f86d30c", + "coinbase": "0xf20572542ac9ada404acf215961dd6efd971702f", + "feeRecipient": "0x0e2308c5b3418e8f4a48b435e89759d03ba430e1ce4e4dbc7b44ef103082ea02", "gasFees": { "feePerDaGas": 0, - "feePerL2Gas": 54154247370 + "feePerL2Gas": 54154091150 } }, "totalFees": "0x0000000000000000000000000000000000000000000000000000000000000000", "totalManaUsed": "0x0000000000000000000000000000000000000000000000000000000000000000", "lastArchive": { "nextAvailableLeafIndex": 2, - "root": "0x1cff61d39a2f942d4f96fe19dd6acba151dda8180b9251f5db3ad4865ff4cbf7" + "root": "0x22666f92ace792cc12f915398edb14583d408832420c18e58fc2b0ffe60a3a1d" }, "stateReference": { "l1ToL2MessageTree": { @@ -109,8 +108,9 @@ } } }, - "header": "0x1cff61d39a2f942d4f96fe19dd6acba151dda8180b9251f5db3ad4865ff4cbf70000000200000000000000000000000000000000000000000000000000000000000000040061d3e24f48b36153518068bf23cd75841f8fbb806641d019a33be2078d3a3e00e1371045bd7d2c3e1f19cba5f536f0e82042ba4bc257d4ba19c146215e824200a5c37986316b1f5f2df53fa9ddf4965f539e872f5e1374f28d225540faca26026efb6c2a517de2448119d0f1255757265dbec7cdd2952df929ede666e10944000000202494d2575971bca59a28ddc774d19136f4a294951ab67258c7e9c2d8f980592400000200137a2b2aa3dc64677f9670d964242d8fbf9fbabaa6b05e2c910eb0cb0f7cc3be000002800c5783f9fe3a18bb5abd12daca67d280f6b5dfef250b7433dc059ce0d868b319000002780000000000000000000000000000000000000000000000000000000000007a69000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000006749e1bc6bb9503e73901291188976cb74f3ee186877aed71560bcdb97a3f65361a878c5fde7c89bd762de8a4e92dd872bb5e1f39f86d30c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bd83cca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "publicInputsHash": "0x00e2042e2204e7779eaa579f3ef5cfae2100db38ccdc0f345793849673a0d5cb", + "header": "0x22666f92ace792cc12f915398edb14583d408832420c18e58fc2b0ffe60a3a1d000000020000000000000000000000000000000000000000000000000000000000000004009e8ec13116b15eb50b79827d2b7e54e1bbbedfe36c073ad7ad123cd219df1c00e1371045bd7d2c3e1f19cba5f536f0e82042ba4bc257d4ba19c146215e824200a5c37986316b1f5f2df53fa9ddf4965f539e872f5e1374f28d225540faca26026efb6c2a517de2448119d0f1255757265dbec7cdd2952df929ede666e10944000000202494d2575971bca59a28ddc774d19136f4a294951ab67258c7e9c2d8f980592400000200137a2b2aa3dc64677f9670d964242d8fbf9fbabaa6b05e2c910eb0cb0f7cc3be000002800c5783f9fe3a18bb5abd12daca67d280f6b5dfef250b7433dc059ce0d868b319000002780000000000000000000000000000000000000000000000000000000000007a6900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000674ae238f20572542ac9ada404acf215961dd6efd971702f0e2308c5b3418e8f4a48b435e89759d03ba430e1ce4e4dbc7b44ef103082ea0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9bd5da8e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "publicInputsHash": "0x0000157180569292d60e39f8c37f6e94a226c19dd99dc231aaac5529a5711c23", + "blobInputs": "0x01016ddb07c26bcdc21e279c2f806b3c0d83ba904a9613e814d6c23809e51679ba0d49b3f9d7f14b92142a0baa0c9b57052dac080c56b28dd35609078dc17cc5644a81a8bd59c424a6981a6a6a7a26d66026183805cb1a62961de02566162eff28a6d6f0b5150a930256ce35717e2fc9b9eb44999512a27afcb61c232b749e3a946e369374fd26c8a392cb5b07922512538069d533d4be5af41daafd826d4b7e0413032361fb05acbac0a61ee09a8d31afdba6fab61583a732ab56cc3e8245a92e", "numTxs": 4 } } \ No newline at end of file diff --git a/l1-contracts/test/merkle/UnbalancedMerkle.t.sol b/l1-contracts/test/merkle/UnbalancedMerkle.t.sol index 44727f03c92..e034a0e7247 100644 --- a/l1-contracts/test/merkle/UnbalancedMerkle.t.sol +++ b/l1-contracts/test/merkle/UnbalancedMerkle.t.sol @@ -5,11 +5,10 @@ pragma solidity >=0.8.27; import {Test} from "forge-std/Test.sol"; import {Hash} from "@aztec/core/libraries/crypto/Hash.sol"; -import {TxsDecoderHelper} from "../decoders/helpers/TxsDecoderHelper.sol"; +import {MerkleLibHelper} from "./helpers/MerkleLibHelper.sol"; /** * Tests the tree construction for unbalanced rollups. - * Used for calculating txsEffectsHash over non balanced rollups - each leaf is one baseLeaf - * calculated in TxsDecoder.sol. + * Used for calculating outHash over non balanced rollups. */ contract UnbalancedMerkleTest is Test { @@ -18,41 +17,41 @@ contract UnbalancedMerkleTest is Test { * powers of 2. * We list them in reverse order as we compute subtree roots from R to L */ - TxsDecoderHelper internal txsHelper; + MerkleLibHelper internal merkleLibHelper; function setUp() public { - txsHelper = new TxsDecoderHelper(); + merkleLibHelper = new MerkleLibHelper(); } function testDecomp() public view { // Worst case - max num txs uint32 numTxs = 65535; - (uint256 min, uint256 max) = txsHelper.computeMinMaxPathLength(numTxs); + (uint256 min, uint256 max) = merkleLibHelper.computeMinMaxPathLength(numTxs); assertEq(min, 15); assertEq(max, 16); // Single tree of 2**15 numTxs = 32768; - (min, max) = txsHelper.computeMinMaxPathLength(numTxs); + (min, max) = merkleLibHelper.computeMinMaxPathLength(numTxs); assertEq(min, 15); assertEq(max, 15); // Single tree of 2**13 numTxs = 8192; - (min, max) = txsHelper.computeMinMaxPathLength(numTxs); + (min, max) = merkleLibHelper.computeMinMaxPathLength(numTxs); assertEq(min, 13); assertEq(max, 13); // Trees of 2**12, 2**11, ... 2**0 numTxs = 8191; - (min, max) = txsHelper.computeMinMaxPathLength(numTxs); + (min, max) = merkleLibHelper.computeMinMaxPathLength(numTxs); assertEq(min, 12); assertEq(max, 13); // Single tree of 2**8 numTxs = 256; - (min, max) = txsHelper.computeMinMaxPathLength(numTxs); + (min, max) = merkleLibHelper.computeMinMaxPathLength(numTxs); assertEq(min, 8); assertEq(max, 8); // Left subtree of 2**8, right subtree of single leaf numTxs = 257; - (min, max) = txsHelper.computeMinMaxPathLength(numTxs); + (min, max) = merkleLibHelper.computeMinMaxPathLength(numTxs); assertEq(min, 1); assertEq(max, 9); } @@ -69,11 +68,11 @@ contract UnbalancedMerkleTest is Test { baseLeaves[i] = Hash.sha256ToField(abi.encodePacked(i)); } // We have just one 'balanced' branch, so depth is 0 with 2 elements - (uint256 min, uint256 max) = txsHelper.computeMinMaxPathLength(2); + (uint256 min, uint256 max) = merkleLibHelper.computeMinMaxPathLength(2); assertEq(min, 1); assertEq(max, 1); bytes32 rootTxsEffectsHash = Hash.sha256ToField(bytes.concat(baseLeaves[0], baseLeaves[1])); - bytes32 calculatedTxsEffectsHash = txsHelper.computeUnbalancedRoot(baseLeaves); + bytes32 calculatedTxsEffectsHash = merkleLibHelper.computeUnbalancedRoot(baseLeaves); assertEq(calculatedTxsEffectsHash, rootTxsEffectsHash); } // Example - 3 txs: @@ -90,13 +89,13 @@ contract UnbalancedMerkleTest is Test { for (uint256 i = 0; i < 3; i++) { baseLeaves[i] = Hash.sha256ToField(abi.encodePacked(i)); } - (uint256 min, uint256 max) = txsHelper.computeMinMaxPathLength(3); + (uint256 min, uint256 max) = merkleLibHelper.computeMinMaxPathLength(3); assertEq(min, 1); assertEq(max, 2); bytes32 mergeTxsEffectsHash = Hash.sha256ToField(bytes.concat(baseLeaves[0], baseLeaves[1])); bytes32 rootTxsEffectsHash = Hash.sha256ToField(bytes.concat(mergeTxsEffectsHash, baseLeaves[2])); - bytes32 calculatedTxsEffectsHash = txsHelper.computeUnbalancedRoot(baseLeaves); + bytes32 calculatedTxsEffectsHash = merkleLibHelper.computeUnbalancedRoot(baseLeaves); assertEq(calculatedTxsEffectsHash, rootTxsEffectsHash); } @@ -115,7 +114,7 @@ contract UnbalancedMerkleTest is Test { for (uint256 i = 0; i < 5; i++) { baseLeaves[i] = Hash.sha256ToField(abi.encodePacked(i)); } - (uint256 min, uint256 max) = txsHelper.computeMinMaxPathLength(5); + (uint256 min, uint256 max) = merkleLibHelper.computeMinMaxPathLength(5); assertEq(min, 1); assertEq(max, 3); bytes32 firstMergeTxsEffectsHash = @@ -126,7 +125,7 @@ contract UnbalancedMerkleTest is Test { Hash.sha256ToField(bytes.concat(firstMergeTxsEffectsHash, secondMergeTxsEffectsHash)); bytes32 rootTxsEffectsHash = Hash.sha256ToField(bytes.concat(thirdMergeTxsEffectsHash, baseLeaves[4])); - bytes32 calculatedTxsEffectsHash = txsHelper.computeUnbalancedRoot(baseLeaves); + bytes32 calculatedTxsEffectsHash = merkleLibHelper.computeUnbalancedRoot(baseLeaves); assertEq(calculatedTxsEffectsHash, rootTxsEffectsHash); } @@ -145,7 +144,7 @@ contract UnbalancedMerkleTest is Test { for (uint256 i = 0; i < 6; i++) { baseLeaves[i] = Hash.sha256ToField(abi.encodePacked(i)); } - (uint256 min, uint256 max) = txsHelper.computeMinMaxPathLength(6); + (uint256 min, uint256 max) = merkleLibHelper.computeMinMaxPathLength(6); assertEq(min, 2); assertEq(max, 3); bytes32 firstMergeTxsEffectsHash = @@ -158,7 +157,7 @@ contract UnbalancedMerkleTest is Test { Hash.sha256ToField(bytes.concat(firstMergeTxsEffectsHash, secondMergeTxsEffectsHash)); bytes32 rootTxsEffectsHash = Hash.sha256ToField(bytes.concat(fourthMergeTxsEffectsHash, thirdMergeTxsEffectsHash)); - bytes32 calculatedTxsEffectsHash = txsHelper.computeUnbalancedRoot(baseLeaves); + bytes32 calculatedTxsEffectsHash = merkleLibHelper.computeUnbalancedRoot(baseLeaves); assertEq(calculatedTxsEffectsHash, rootTxsEffectsHash); } @@ -177,7 +176,7 @@ contract UnbalancedMerkleTest is Test { for (uint256 i = 0; i < 6; i++) { baseLeaves[i] = Hash.sha256ToField(abi.encodePacked(i)); } - (uint256 min, uint256 max) = txsHelper.computeMinMaxPathLength(7); + (uint256 min, uint256 max) = merkleLibHelper.computeMinMaxPathLength(7); assertEq(min, 2); assertEq(max, 3); bytes32 firstMergeTxsEffectsHash = @@ -193,7 +192,7 @@ contract UnbalancedMerkleTest is Test { bytes32 rootTxsEffectsHash = Hash.sha256ToField(bytes.concat(thirdMergeTxsEffectsHash, fifthMergeTxsEffectsHash)); - bytes32 calculatedTxsEffectsHash = txsHelper.computeUnbalancedRoot(baseLeaves); + bytes32 calculatedTxsEffectsHash = merkleLibHelper.computeUnbalancedRoot(baseLeaves); assertEq(calculatedTxsEffectsHash, rootTxsEffectsHash); } } diff --git a/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol b/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol index a897896666b..02386122ae3 100644 --- a/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol +++ b/l1-contracts/test/merkle/helpers/MerkleLibHelper.sol @@ -14,4 +14,12 @@ contract MerkleLibHelper { ) external pure { MerkleLib.verifyMembership(_path, _leaf, _index, _expectedRoot); } + + function computeMinMaxPathLength(uint256 _numTxs) external pure returns (uint256, uint256) { + return MerkleLib.computeMinMaxPathLength(_numTxs); + } + + function computeUnbalancedRoot(bytes32[] memory _leaves) external pure returns (bytes32) { + return MerkleLib.computeUnbalancedRoot(_leaves); + } } diff --git a/l1-contracts/test/portals/UniswapPortal.t.sol b/l1-contracts/test/portals/UniswapPortal.t.sol index fc91ef5d158..7f4060be639 100644 --- a/l1-contracts/test/portals/UniswapPortal.t.sol +++ b/l1-contracts/test/portals/UniswapPortal.t.sol @@ -69,7 +69,7 @@ contract UniswapPortalTest is Test { uniswapPortal.initialize(address(registry), l2UniswapAddress); // Modify the proven block count - vm.store(address(rollup), bytes32(uint256(9)), bytes32(l2BlockNumber + 1)); + vm.store(address(rollup), bytes32(uint256(13)), bytes32(l2BlockNumber + 1)); assertEq(rollup.getProvenBlockNumber(), l2BlockNumber + 1); // have DAI locked in portal that can be moved when funds are withdrawn diff --git a/l1-contracts/test/sparta/Sparta.t.sol b/l1-contracts/test/sparta/Sparta.t.sol index dc5340a39ae..165dd9f7b4f 100644 --- a/l1-contracts/test/sparta/Sparta.t.sol +++ b/l1-contracts/test/sparta/Sparta.t.sol @@ -17,7 +17,6 @@ import {Leonidas} from "@aztec/core/Leonidas.sol"; import {NaiveMerkle} from "../merkle/Naive.sol"; import {MerkleTestUtil} from "../merkle/TestUtil.sol"; import {TestERC20} from "@aztec/mock/TestERC20.sol"; -import {TxsDecoderHelper} from "../decoders/helpers/TxsDecoderHelper.sol"; import {MessageHashUtils} from "@oz/utils/cryptography/MessageHashUtils.sol"; import {MockFeeJuicePortal} from "@aztec/mock/MockFeeJuicePortal.sol"; import { @@ -49,7 +48,6 @@ contract SpartaTest is DecoderBase { Outbox internal outbox; Rollup internal rollup; MerkleTestUtil internal merkleTestUtil; - TxsDecoderHelper internal txsHelper; TestERC20 internal testERC20; RewardDistributor internal rewardDistributor; Signature internal emptySignature; @@ -116,7 +114,6 @@ contract SpartaTest is DecoderBase { outbox = Outbox(address(rollup.OUTBOX())); merkleTestUtil = new MerkleTestUtil(); - txsHelper = new TxsDecoderHelper(); _; } @@ -253,6 +250,7 @@ contract SpartaTest is DecoderBase { // @todo Handle Leonidas__InsufficientAttestations case } + skipBlobCheck(address(rollup)); if (_expectRevert && _invalidProposer) { address realProposer = ree.proposer; ree.proposer = address(uint160(uint256(keccak256(abi.encode("invalid", ree.proposer))))); @@ -263,16 +261,15 @@ contract SpartaTest is DecoderBase { ); ree.shouldRevert = true; } - vm.prank(ree.proposer); - rollup.propose(args, signatures, full.block.body); + rollup.propose(args, signatures, full.block.body, full.block.blobInputs); if (ree.shouldRevert) { return; } } else { Signature[] memory signatures = new Signature[](0); - rollup.propose(args, signatures, full.block.body); + rollup.propose(args, signatures, full.block.body, full.block.blobInputs); } assertEq(_expectRevert, ree.shouldRevert, "Does not match revert expectation"); diff --git a/noir-projects/Earthfile b/noir-projects/Earthfile index 42cfb3d89ad..6fbbd87db9e 100644 --- a/noir-projects/Earthfile +++ b/noir-projects/Earthfile @@ -105,7 +105,7 @@ test-protocol-circuits: # Install nargo COPY ../noir/+nargo/nargo /usr/bin/nargo - RUN cd /usr/src/noir-projects/noir-protocol-circuits && nargo test --silence-warnings + RUN cd /usr/src/noir-projects/noir-protocol-circuits && nargo test --silence-warnings --skip-brillig-constraints-check test-aztec-nr: FROM ../yarn-project/+txe @@ -161,7 +161,7 @@ gates-report: COPY ../barretenberg/cpp/+preset-release/bin/bb /usr/src/barretenberg/cpp/build/bin/bb ENV BB_BIN /usr/src/barretenberg/cpp/build/bin/bb - RUN cd noir-protocol-circuits && yarn && node ./scripts/generate_variants.js tiny && nargo compile --silence-warnings + RUN cd noir-protocol-circuits && yarn && node ./scripts/generate_variants.js tiny && nargo compile --silence-warnings --skip-brillig-constraints-check COPY ./gates_report.sh ./gates_report.sh RUN ./gates_report.sh diff --git a/noir-projects/aztec-nr/.gitrepo b/noir-projects/aztec-nr/.gitrepo index 8756e84cbcc..5e54b8ecc1b 100644 --- a/noir-projects/aztec-nr/.gitrepo +++ b/noir-projects/aztec-nr/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/AztecProtocol/aztec-nr branch = master - commit = 3d4e42b5ec0b11e64c4d1a35c0105a47227e514c + commit = 8f1b670dc383873499a5f2014a2179e8dbeb131f method = merge cmdver = 0.4.6 - parent = 08a733bb0f985732d147ef62573f5ebfe26688e1 + parent = 8e3948e6bf38cbadc247d192db06020d5deb3538 diff --git a/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr b/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr index 751d3c2d718..1b396ef7b65 100644 --- a/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr +++ b/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr @@ -260,7 +260,7 @@ mod test { 0x25afb798ea6d0b8c1618e50fdeafa463059415013d3b7c75d46abf5e242be70c, ); - let _ = OracleMock::mock("getAppTaggingSecretAsSender").returns([69420, 1337]); + let _ = OracleMock::mock("getIndexedTaggingSecretAsSender").returns([69420, 1337]); let _ = OracleMock::mock("incrementAppTaggingSecretIndexAsSender").returns(()); diff --git a/noir-projects/aztec-nr/aztec/src/macros/events/mod.nr b/noir-projects/aztec-nr/aztec/src/macros/events/mod.nr index 3a72031efc0..1fc3671dd7e 100644 --- a/noir-projects/aztec-nr/aztec/src/macros/events/mod.nr +++ b/noir-projects/aztec-nr/aztec/src/macros/events/mod.nr @@ -1,5 +1,6 @@ use super::utils::compute_event_selector; use protocol_types::meta::flatten_to_fields; +use std::meta::typ::fresh_type_variable; comptime fn generate_event_interface(s: StructDefinition) -> Quoted { let name = s.name(); @@ -13,7 +14,6 @@ comptime fn generate_event_interface(s: StructDefinition) -> Quoted { impl aztec::event::event_interface::EventInterface<$content_len> for $name { fn to_be_bytes(self) -> [u8; $content_len * 32 + 32] { let mut buffer: [u8; $content_len * 32 + 32] = [0; $content_len * 32 + 32]; - let event_type_id_bytes: [u8; 32] = $name::get_event_type_id().to_field().to_be_bytes(); for i in 0..32 { diff --git a/noir-projects/aztec-nr/aztec/src/note/utils.nr b/noir-projects/aztec-nr/aztec/src/note/utils.nr index 184d70c8f2b..55c5870d0ff 100644 --- a/noir-projects/aztec-nr/aztec/src/note/utils.nr +++ b/noir-projects/aztec-nr/aztec/src/note/utils.nr @@ -5,8 +5,8 @@ use crate::{ }; use dep::protocol_types::hash::{ - compute_siloed_note_hash as compute_siloed_note_hash, - compute_siloed_nullifier as compute_siloed_nullifier_from_preimage, compute_unique_note_hash, + compute_siloed_note_hash, compute_siloed_nullifier as compute_siloed_nullifier_from_preimage, + compute_unique_note_hash, }; pub fn compute_siloed_nullifier( @@ -29,13 +29,19 @@ where Note: NoteInterface + NullifiableNote, { let note_hash = note.compute_note_hash(); - let nonce = note.get_header().nonce; - let counter = note.get_header().note_hash_counter; + let header = note.get_header(); + let nonce = header.nonce; + let counter = header.note_hash_counter; + // If same tx note, read request always uses the normal note hash if counter != 0 { note_hash } else { - compute_unique_note_hash(nonce, note_hash) + // If the note comes from a different tx, we need to compute the note hash that reached the tree + compute_unique_note_hash( + nonce, + compute_siloed_note_hash(header.contract_address, note_hash), + ) } } @@ -49,20 +55,14 @@ where { let header = note.get_header(); - if header.note_hash_counter != 0 { - if header.nonce == 0 { - // Case 1: Transient note - note_hash_for_read_request - } else { - // Case 2: Non-revertible note, nullified by a revertible nullifier - let unique_note_hash = - compute_unique_note_hash(header.nonce, note_hash_for_read_request); - compute_siloed_note_hash(header.contract_address, unique_note_hash) - } + if (header.note_hash_counter != 0) & (header.nonce != 0) { + // Non-revertible note, nullified by a revertible nullifier, we need to nullify the note hash that will reach the tree + let siloed_note_hash = + compute_siloed_note_hash(header.contract_address, note_hash_for_read_request); + + compute_unique_note_hash(header.nonce, siloed_note_hash) } else { - // Case 3: Note from a previous transaction - // note_hash_for_read_request is already the unique_note_hash in this case - compute_siloed_note_hash(header.contract_address, note_hash_for_read_request) + note_hash_for_read_request } } @@ -129,8 +129,8 @@ where note.set_header(note_header); let note_hash = note.compute_note_hash(); - let unique_note_hash = compute_unique_note_hash(note_header.nonce, note_hash); - let siloed_note_hash = compute_siloed_note_hash(note_header.contract_address, unique_note_hash); + let siloed_note_hash = compute_siloed_note_hash(note_header.contract_address, note_hash); + let unique_note_hash = compute_unique_note_hash(note_header.nonce, siloed_note_hash); let inner_nullifier = if compute_nullifier { note.compute_nullifier_without_context() diff --git a/noir-projects/aztec-nr/aztec/src/oracle/notes.nr b/noir-projects/aztec-nr/aztec/src/oracle/notes.nr index 6d2cdab8f83..e7534b14fb9 100644 --- a/noir-projects/aztec-nr/aztec/src/oracle/notes.nr +++ b/noir-projects/aztec-nr/aztec/src/oracle/notes.nr @@ -205,25 +205,25 @@ pub unconstrained fn check_nullifier_exists(inner_nullifier: Field) -> bool { #[oracle(checkNullifierExists)] unconstrained fn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {} -/// Same as `get_app_tagging_secret_as_sender`, except it returns the derived tag, ready to be included in a log. +/// Same as `get_indexed_tagging_secret_as_sender`, except it returns the derived tag, ready to be included in a log. pub unconstrained fn get_app_tag_as_sender(sender: AztecAddress, recipient: AztecAddress) -> Field { - get_app_tagging_secret_as_sender(sender, recipient).compute_tag(recipient) + get_indexed_tagging_secret_as_sender(sender, recipient).compute_tag(recipient) } /// Returns the tagging secret for a given sender and recipient pair, siloed for the current contract address. /// Includes the last known index used to send a note tagged with this secret. -/// For this to work, PXE must know the ivpsk_m of the sender. +/// For this to work, PXE must know the ivsk_m of the sender. /// For the recipient's side, only the address is needed. -pub unconstrained fn get_app_tagging_secret_as_sender( +pub unconstrained fn get_indexed_tagging_secret_as_sender( sender: AztecAddress, recipient: AztecAddress, ) -> IndexedTaggingSecret { - let result = get_app_tagging_secret_as_sender_oracle(sender, recipient); + let result = get_indexed_tagging_secret_as_sender_oracle(sender, recipient); IndexedTaggingSecret::deserialize(result) } -#[oracle(getAppTaggingSecretAsSender)] -unconstrained fn get_app_tagging_secret_as_sender_oracle( +#[oracle(getIndexedTaggingSecretAsSender)] +unconstrained fn get_indexed_tagging_secret_as_sender_oracle( _sender: AztecAddress, _recipient: AztecAddress, ) -> [Field; INDEXED_TAGGING_SECRET_LENGTH] {} diff --git a/noir-projects/noir-contracts/contracts/amm_contract/src/main.nr b/noir-projects/noir-contracts/contracts/amm_contract/src/main.nr index fe405512cf4..b14258f9d0f 100644 --- a/noir-projects/noir-contracts/contracts/amm_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/amm_contract/src/main.nr @@ -120,7 +120,7 @@ contract AMM { // We then complete the flow in public. Note that the type of operation and amounts will all be publicly known, // but the identity of the caller is not revealed despite us being able to send tokens to them by completing the - // partial notees. + // partial notes. AMM::at(context.this_address()) ._add_liquidity( config, diff --git a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr index d2e5ba81c7b..149cfae9aec 100644 --- a/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/avm_test_contract/src/main.nr @@ -30,7 +30,7 @@ contract AvmTest { // Libs use dep::aztec::context::gas::GasOpts; - use dep::aztec::context::public_context::call; + use dep::aztec::context::public_context::{call, gas_for_call, returndata_size}; use dep::aztec::macros::{functions::{private, public}, storage::storage}; use dep::aztec::oracle::get_contract_instance::{ get_contract_instance_class_id_avm, get_contract_instance_deployer_avm, @@ -38,6 +38,7 @@ contract AvmTest { }; use dep::aztec::prelude::Map; use dep::aztec::protocol_types::{ + abis::function_selector::FunctionSelector, address::{AztecAddress, EthAddress}, point::Point, scalar::Scalar, @@ -243,6 +244,29 @@ contract AvmTest { AvmTest::at(context.this_address()).divide_by_zero().call(&mut context); } + #[public] + fn external_call_to_divide_by_zero_recovers() { + // Be sure to allocate ~200k+ gas to this function~ + + // Get the gas remaining and allocate some smaller amount to nested call. + // We don't want to allocate too much to the nested call + // since it will all be consumed on exceptional halt. + let l2_gas_left = context.l2_gas_left(); + let da_gas_left = context.da_gas_left(); + let gas_allocation: [Field; 2] = [l2_gas_left - 200_000, da_gas_left - 200_000]; + let selector = FunctionSelector::from_signature("divide_by_zero()"); + let success = call( + gas_allocation, + context.this_address(), + &[selector.to_field()], + ); + assert(!success, "Nested CALL instruction should return failure on exceptional halt"); + assert( + returndata_size() == 0, + "Returndata should be empty when nested call exceptionally halts", + ); + } + #[public] fn debug_logging() { dep::aztec::oracle::debug_log::debug_log("just text"); diff --git a/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr index b88cd864158..efc19bcce8b 100644 --- a/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr @@ -13,8 +13,8 @@ contract ContractInstanceDeployer { }; use std::meta::derive; - #[event] #[derive(Serialize)] + #[event] struct ContractInstanceDeployed { DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field, address: AztecAddress, diff --git a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr index 65110e8c61b..f15d51d2249 100644 --- a/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/counter_contract/src/main.nr @@ -224,13 +224,13 @@ contract Counter { assert(notes.len() == 4); assert(get_counter(owner) == 7); - // Checking from the note cache, note that we MUST advance the block to get a correct and updated value. + // Checking from the note cache Counter::at(contract_address).decrement(owner, sender).call(&mut env.private()); let notes: BoundedVec = view_notes(owner_slot, options); - assert(get_counter(owner) == 11); - assert(notes.len() == 5); + assert(get_counter(owner) == 6); + assert(notes.len() == 4); - // We advance the block here to have the nullification of the prior note be applied. Should we try nullifiying notes in our DB on notifyNullifiedNote ? + // Checking that the note was discovered from private logs env.advance_block_by(1); let notes: BoundedVec = view_notes(owner_slot, options); assert(get_counter(owner) == 6); diff --git a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr index 1042a69519c..7644487cba7 100644 --- a/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/crowdfunding_contract/src/main.nr @@ -26,8 +26,8 @@ contract Crowdfunding { use token::Token; // docs:end:all-deps - #[event] #[derive(Serialize)] + #[event] struct WithdrawalProcessed { who: AztecAddress, amount: u64, diff --git a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr index eb1d7c4af50..c7f51654c76 100644 --- a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/main.nr @@ -1,3 +1,4 @@ +mod test; use dep::aztec::macros::aztec; #[aztec] diff --git a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/first.nr b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/first.nr new file mode 100644 index 00000000000..fa1c63cb920 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/first.nr @@ -0,0 +1,111 @@ +use crate::test::utils; +use dep::aztec::oracle::{execution::get_block_number, storage::storage_read}; +use dep::aztec::protocol_types::storage::map::derive_storage_slot_in_map; + +use crate::EasyPrivateVoting; + +#[test] +unconstrained fn test_initializer() { + let (_, voting_contract_address, admin) = utils::setup(); + + let block_number = get_block_number(); + let admin_slot = EasyPrivateVoting::storage_layout().admin.slot; + let admin_storage_value = storage_read(voting_contract_address, admin_slot, block_number); + assert(admin_storage_value == admin, "Vote ended should be false"); +} + +#[test] +unconstrained fn test_check_vote_status() { + let (_, voting_contract_address, _) = utils::setup(); + + let vote_ended_expected: bool = false; + + let block_number = get_block_number(); + let status_slot = EasyPrivateVoting::storage_layout().vote_ended.slot; + let vote_ended_read: bool = storage_read(voting_contract_address, status_slot, block_number); + assert(vote_ended_expected == vote_ended_read, "Vote ended should be false"); +} + +#[test] +unconstrained fn test_end_vote() { + let (env, voting_contract_address, admin) = utils::setup(); + + env.impersonate(admin); + EasyPrivateVoting::at(voting_contract_address).end_vote().call(&mut env.public()); + + let vote_ended_expected = true; + + let block_number = get_block_number(); + let status_slot = EasyPrivateVoting::storage_layout().vote_ended.slot; + let vote_ended_read: bool = storage_read(voting_contract_address, status_slot, block_number); + assert(vote_ended_expected == vote_ended_read, "Vote ended should be true"); +} + +#[test(should_fail)] +unconstrained fn test_fail_end_vote_by_non_admin() { + let (env, voting_contract_address, _) = utils::setup(); + let alice = env.create_account(); + + env.impersonate(alice); + EasyPrivateVoting::at(voting_contract_address).end_vote().call(&mut env.public()); +} + +#[test] +unconstrained fn test_cast_vote() { + let (env, voting_contract_address, _) = utils::setup(); + let alice = env.create_account(); + env.impersonate(alice); + + let candidate = 1; + env.advance_block_by(6); + EasyPrivateVoting::at(voting_contract_address).cast_vote(candidate).call(&mut env.private()); + + // Read vote count from storage + let block_number = get_block_number(); + let tally_slot = EasyPrivateVoting::storage_layout().tally.slot; + let candidate_tally_slot = derive_storage_slot_in_map(tally_slot, candidate); + let vote_count: u32 = storage_read(voting_contract_address, candidate_tally_slot, block_number); + + assert(vote_count == 1, "vote tally should be incremented"); +} + +#[test] +unconstrained fn test_cast_vote_with_separate_accounts() { + let (env, voting_contract_address, _) = utils::setup(); + let alice = env.create_account(); + let bob = env.create_account(); + + let candidate = 101; + + env.impersonate(alice); + env.advance_block_by(1); + EasyPrivateVoting::at(voting_contract_address).cast_vote(candidate).call(&mut env.private()); + + env.impersonate(bob); + env.advance_block_by(1); + EasyPrivateVoting::at(voting_contract_address).cast_vote(candidate).call(&mut env.private()); + + // Read vote count from storage + let block_number = get_block_number(); + let tally_slot = EasyPrivateVoting::storage_layout().tally.slot; + let candidate_tally_slot = derive_storage_slot_in_map(tally_slot, candidate); + let vote_count: u32 = storage_read(voting_contract_address, candidate_tally_slot, block_number); + + assert(vote_count == 2, "vote tally should be 2"); +} + +#[test(should_fail)] +unconstrained fn test_fail_vote_twice() { + let (env, voting_contract_address, _) = utils::setup(); + let alice = env.create_account(); + + let candidate = 101; + + env.impersonate(alice); + env.advance_block_by(1); + EasyPrivateVoting::at(voting_contract_address).cast_vote(candidate).call(&mut env.private()); + + // Vote again as alice + env.advance_block_by(1); + EasyPrivateVoting::at(voting_contract_address).cast_vote(candidate).call(&mut env.private()); +} diff --git a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/mod.nr b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/mod.nr new file mode 100644 index 00000000000..6fde1dc2625 --- /dev/null +++ b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/mod.nr @@ -0,0 +1,2 @@ +mod first; +mod utils; diff --git a/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/utils.nr b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/utils.nr new file mode 100644 index 00000000000..51082b188aa --- /dev/null +++ b/noir-projects/noir-contracts/contracts/easy_private_voting_contract/src/test/utils.nr @@ -0,0 +1,21 @@ +use dep::aztec::{ + note::{note_getter::{MAX_NOTES_PER_PAGE, view_notes}, note_viewer_options::NoteViewerOptions}, + prelude::AztecAddress, + protocol_types::storage::map::derive_storage_slot_in_map, + test::helpers::test_environment::TestEnvironment, +}; + +use crate::EasyPrivateVoting; + +pub fn setup() -> (&mut TestEnvironment, AztecAddress, AztecAddress) { + let mut env = TestEnvironment::new(); + + let admin = env.create_account(); + + let initializer_call_interface = EasyPrivateVoting::interface().constructor(admin); + let voting_contract = env.deploy_self("EasyPrivateVoting").with_public_void_initializer( + initializer_call_interface, + ); + // std::println(voting_contract); + (&mut env, voting_contract.to_address(), admin) +} diff --git a/noir-projects/noir-contracts/contracts/fpc_contract/src/config.nr b/noir-projects/noir-contracts/contracts/fpc_contract/src/config.nr new file mode 100644 index 00000000000..00c1473d34b --- /dev/null +++ b/noir-projects/noir-contracts/contracts/fpc_contract/src/config.nr @@ -0,0 +1,23 @@ +use dep::aztec::protocol_types::{address::AztecAddress, traits::{Deserialize, Serialize}}; + +global CONFIG_LENGTH: u32 = 2; + +pub struct Config { + pub accepted_asset: AztecAddress, // Asset the FPC accepts (denoted as AA below) + pub admin: AztecAddress, // Address to which AA is sent during the private fee payment flow +} + +impl Serialize for Config { + fn serialize(self: Self) -> [Field; CONFIG_LENGTH] { + [self.accepted_asset.to_field(), self.admin.to_field()] + } +} + +impl Deserialize for Config { + fn deserialize(fields: [Field; CONFIG_LENGTH]) -> Self { + Config { + accepted_asset: AztecAddress::from_field(fields[0]), + admin: AztecAddress::from_field(fields[1]), + } + } +} diff --git a/noir-projects/noir-contracts/contracts/fpc_contract/src/lib.nr b/noir-projects/noir-contracts/contracts/fpc_contract/src/lib.nr deleted file mode 100644 index e9aad0aeb73..00000000000 --- a/noir-projects/noir-contracts/contracts/fpc_contract/src/lib.nr +++ /dev/null @@ -1,10 +0,0 @@ -use dep::aztec::context::PublicContext; - -pub fn compute_rebate(context: PublicContext, initial_amount: Field) -> Field { - let actual_fee = context.transaction_fee(); - assert( - !initial_amount.lt(actual_fee), - "Initial amount paid to the paymaster does not cover actual fee", - ); - initial_amount - actual_fee -} diff --git a/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr b/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr index 96ca07817a2..d61d242a1d7 100644 --- a/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/fpc_contract/src/main.nr @@ -1,12 +1,16 @@ -mod lib; -mod settings; +mod config; use dep::aztec::macros::aztec; +/// Fee Payment Contract (FPC) allows users to pay for the transaction fee with an arbitrary asset. Supports private +/// and public fee payment flows. +/// +/// ***Note:*** +/// Accepted asset funds sent by the users to this contract stay in this contract and later on can +/// be pulled by the admin using the `pull_funds` function. #[aztec] contract FPC { - use crate::lib::compute_rebate; - use crate::settings::Settings; + use crate::config::Config; use dep::aztec::{ macros::{functions::{initializer, internal, private, public}, storage::storage}, protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress}, @@ -16,61 +20,153 @@ contract FPC { #[storage] struct Storage { - settings: PublicImmutable, + config: PublicImmutable, } + /// Initializes the contract with an accepted asset (AA) and an admin (address that can pull accumulated AA funds + /// from this contract). #[public] #[initializer] - fn constructor(other_asset: AztecAddress, admin: AztecAddress) { - let settings = Settings { other_asset, admin }; - storage.settings.initialize(settings); + fn constructor(accepted_asset: AztecAddress, admin: AztecAddress) { + let config = Config { accepted_asset, admin }; + storage.config.initialize(config); } + /// Pays for the tx fee with msg_sender's private balance of accepted asset (AA). The maximum fee a user is willing + /// to pay is defined by `max_fee` and is denominated in AA. + /// + /// ## Overview + /// Uses partial notes to implement a refund flow which works as follows: + /// Setup Phase: + /// 1. This `setup_refund` function: + /// - Calls the AA token contract, which: + /// - subtracts the `max_fee` from the user's balance; + /// - prepares a partial note for the user (which will be used to later refund the user any unspent fee); + /// - sets a public teardown function (within the same AA token contract), where at the end of the tx + /// a fee (denominated in AA) will be transferred to the FPC in public, and a partial note will be finalized + /// with the refund amount (also denominated in AA). + /// - Sets itself as the `fee_payer` of the tx; meaning this contract will be responsible for ultimately + /// transferring the `tx_fee` -- denominated in fee juice -- to the protocol, during the later "teardown" + /// phase of this tx. + /// + /// Execution Phase: + /// 2. Then the private and public functions of the tx get executed. + /// + /// Teardown Phase: + /// 3. By this point, the protocol has computed the `tx_fee` (denominated in "fee juice"). So now we can + /// execute the "teardown function" which was lined-up during the earlier "setup phase". + /// Within the teardown function, we: + /// - compute how much of the `max_fee` (denominated in AA) the user needs to pay to the FPC, + /// and how much of it will be refunded back to the user. Since the protocol-calculated `tx_fee` is + /// denominated in fee juice, and not in this FPC's AA, an equivalent value of AA is computed based + /// on an exchange rate between AA and fee juice. + /// - finalize the refund note with a value of `max_fee - tx_fee` for the user; + /// - send the tx fee to the FPC in public. + /// + /// Protocol-enshrined fee-payment phase: + /// 4. The protocol deducts the protocol-calculated `tx_fee` (denominated in fee juice) from the `fee_payer`'s + /// balance (which in this case is this FPC's balance), which is a special storage slot in a protocol-controlled + /// "fee juice" contract. + /// + /// With this scheme a user has privately paid for the tx fee with an arbitrary AA (e.g. could be a stablecoin), + /// by paying this FPC. This FPC has in turn paid the protocol-mandated `tx_fee` (denominated in fee + /// juice). + /// + /// ***Note:*** + /// This flow allows us to pay for the tx with msg_sender's private balance of AA and hence msg_sender's identity + /// is not revealed. We do, however, reveal: + /// - the `max_fee`; + /// - which FPC has been used to make the payment; + /// - the asset which was used to make the payment. #[private] - fn fee_entrypoint_private(amount: Field, asset: AztecAddress, nonce: Field) { + fn fee_entrypoint_private(max_fee: Field, nonce: Field) { // TODO(PR #8022): Once PublicImmutable performs only 1 merkle proof here, we'll save ~4k gates - let settings = storage.settings.read(); + let config = storage.config.read(); - assert(asset == settings.other_asset); - - Token::at(asset).setup_refund(settings.admin, context.msg_sender(), amount, nonce).call( + Token::at(config.accepted_asset).setup_refund(context.msg_sender(), max_fee, nonce).call( &mut context, ); context.set_as_fee_payer(); } + /// Pays for the tx fee with msg_sender's public balance of accepted asset (AA). The maximum fee a user is willing + /// to pay is defined by `max_fee` and is denominated in AA. + /// + /// ## Overview + /// The refund flow works as follows: + /// Setup phase: + /// 1. This `fee_entrypoint_public` function: + /// - Transfers the `max_fee` from the user's balance of the accepted asset to this contract. + /// - Sets itself as the `fee_payer` of the tx. + /// - Sets a public teardown function in which the refund will be paid back to the user in public. + /// + /// Execution phase: + /// 2. Then the private and public functions of the tx get executed. + /// + /// Teardown phase: + /// 3. At this point we know the tx fee so we can compute how much of AA the user needs to pay to FPC and how much + /// of it will be refunded back. We send the refund back to the user in public. + /// + /// Protocol-enshrined fee-payment phase: + /// 4. The protocol deducts the actual fee denominated in fee juice from the FPC's balance. #[private] - fn fee_entrypoint_public(amount: Field, asset: AztecAddress, nonce: Field) { - FPC::at(context.this_address()) - .prepare_fee(context.msg_sender(), amount, asset, nonce) + fn fee_entrypoint_public(max_fee: Field, nonce: Field) { + // TODO(PR #8022): Once PublicImmutable performs only 1 merkle proof here, we'll save ~4k gates + let config = storage.config.read(); + + // We pull the max fee from the user's balance of the accepted asset to this contract. + // docs:start:public_call + Token::at(config.accepted_asset) + .transfer_in_public(context.msg_sender(), context.this_address(), max_fee, nonce) .enqueue(&mut context); + // docs:end:public_call + context.set_as_fee_payer(); // TODO(#6277) for improving interface: - // FPC::at(context.this_address()).pay_refund(context.msg_sender(), amount, asset).set_public_teardown_function(&mut context); + // FPC::at(context.this_address()).pay_refund(...).set_public_teardown_function(&mut context); context.set_public_teardown_function( context.this_address(), comptime { FunctionSelector::from_signature("pay_refund((Field),Field,(Field))") }, - [context.msg_sender().to_field(), amount, asset.to_field()], + [context.msg_sender().to_field(), max_fee, config.accepted_asset.to_field()], ); } + /// Pays the refund to the `refund_recipient`. The refund is the difference between the `max_fee` and + /// the actual fee. `accepted_asset` is the asset in which the refund is paid. It's passed as an argument + /// to avoid the need for another read from public storage. #[public] #[internal] - fn prepare_fee(from: AztecAddress, amount: Field, asset: AztecAddress, nonce: Field) { - // docs:start:public_call - Token::at(asset).transfer_in_public(from, context.this_address(), amount, nonce).call( - &mut context, - ); - // docs:end:public_call + fn pay_refund(refund_recipient: AztecAddress, max_fee: Field, accepted_asset: AztecAddress) { + let actual_fee = context.transaction_fee(); + assert(!max_fee.lt(actual_fee), "Max fee paid to the paymaster does not cover actual fee"); + // TODO(#10805): Introduce a real exchange rate + let refund = max_fee - actual_fee; + + Token::at(accepted_asset) + .transfer_in_public(context.this_address(), refund_recipient, refund, 0) + .call(&mut context); } + /// Pulls all the accepted asset funds from this contract to the `to` address. Only the admin can call + /// this function. #[public] - #[internal] - fn pay_refund(refund_address: AztecAddress, amount: Field, asset: AztecAddress) { - // Just do public refunds for the present - let refund = compute_rebate(context, amount); - Token::at(asset).transfer_in_public(context.this_address(), refund_address, refund, 0).call( - &mut context, - ); + fn pull_funds(to: AztecAddress) { + // TODO(PR #8022): Once PublicImmutable performs only 1 merkle proof here, we'll save ~4k gates + let config = storage.config.read(); + + assert(context.msg_sender() == config.admin, "Only admin can pull funds"); + + let token = Token::at(config.accepted_asset); + + // We send the full balance to `to`. + let balance = token.balance_of_public(context.this_address()).view(&mut context); + token.transfer_in_public(context.this_address(), to, balance, 0).call(&mut context); + } + + /// Note: Not marked as view as we need it to be callable as an entrypoint since in some places we need to obtain + /// this value before we have access to an account contract (kernels do not allow for static entrypoints). + #[private] + fn get_accepted_asset() -> AztecAddress { + storage.config.read().accepted_asset } } diff --git a/noir-projects/noir-contracts/contracts/fpc_contract/src/settings.nr b/noir-projects/noir-contracts/contracts/fpc_contract/src/settings.nr deleted file mode 100644 index c3717ca1a7e..00000000000 --- a/noir-projects/noir-contracts/contracts/fpc_contract/src/settings.nr +++ /dev/null @@ -1,23 +0,0 @@ -use dep::aztec::protocol_types::{address::AztecAddress, traits::{Deserialize, Serialize}}; - -global SETTINGS_LENGTH: u32 = 2; - -pub struct Settings { - other_asset: AztecAddress, - admin: AztecAddress, -} - -impl Serialize for Settings { - fn serialize(self: Self) -> [Field; SETTINGS_LENGTH] { - [self.other_asset.to_field(), self.admin.to_field()] - } -} - -impl Deserialize for Settings { - fn deserialize(fields: [Field; SETTINGS_LENGTH]) -> Self { - Settings { - other_asset: AztecAddress::from_field(fields[0]), - admin: AztecAddress::from_field(fields[1]), - } - } -} diff --git a/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr b/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr index 6623284ec81..109fe6a57f4 100644 --- a/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/nft_contract/src/main.nr @@ -29,12 +29,12 @@ contract NFT { utils::comparison::Comparator, }; use dep::compressed_string::FieldCompressedString; - use std::{embedded_curve_ops::EmbeddedCurvePoint, meta::derive}; + use std::meta::derive; // TODO(#8467): Rename this to Transfer - calling this NFTTransfer to avoid export conflict with the Transfer event // in the Token contract. - #[event] #[derive(Serialize)] + #[event] struct NFTTransfer { from: AztecAddress, to: AztecAddress, @@ -152,7 +152,7 @@ contract NFT { // We prepare the private balance increase. let hiding_point_slot = _prepare_private_balance_increase(to, &mut context, storage); - // At last we finalize the transfer. Usafe of the `unsafe` method here is safe because we set the `from` + // At last we finalize the transfer. Usage of the `unsafe` method here is safe because we set the `from` // function argument to a message sender, guaranteeing that he can transfer only his own NFTs. nft._finalize_transfer_to_private_unsafe(from, token_id, hiding_point_slot).enqueue( &mut context, diff --git a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr index 6fea7719fdf..09a935f95e3 100644 --- a/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/schnorr_account_contract/src/main.nr @@ -107,7 +107,7 @@ contract SchnorrAccount { is_infinite: false, }; let valid_in_private = - std::schnorr::verify_signature(pub_key, signature, message_hash.to_be_bytes::<32>()); + schnorr::verify_signature(pub_key, signature, message_hash.to_be_bytes::<32>()); // Compute the nullifier and check if it is spent // This will BLINDLY TRUST the oracle, but the oracle is us, and diff --git a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr index 058b21fc434..ed3918d1f68 100644 --- a/noir-projects/noir-contracts/contracts/test_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_contract/src/main.nr @@ -39,14 +39,11 @@ contract Test { get_mint_to_private_content_hash, get_mint_to_public_content_hash, }; use dep::value_note::value_note::ValueNote; - // TODO investigate why the macros require EmbeddedCurvePoint and EmbeddedCurveScalar - use std::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar}; use std::meta::derive; use crate::test_note::TestNote; - - #[event] #[derive(Serialize)] + #[event] struct ExampleEvent { value0: Field, value1: Field, diff --git a/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr b/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr index 03b30bfa88c..45824a37b4e 100644 --- a/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/test_log_contract/src/main.nr @@ -10,17 +10,15 @@ contract TestLog { use dep::value_note::value_note::ValueNote; use std::meta::derive; - use std::embedded_curve_ops::EmbeddedCurveScalar; - - #[event] #[derive(Serialize)] + #[event] struct ExampleEvent0 { value0: Field, value1: Field, } - #[event] #[derive(Serialize)] + #[event] struct ExampleEvent1 { value2: AztecAddress, value3: u8, diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr index 642244cf251..f1ec6266f7e 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/main.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/main.nr @@ -505,6 +505,9 @@ contract Token { // docs:end:finalize_transfer_to_private // docs:start:finalize_transfer_to_private_unsafe + /// This is a wrapper around `_finalize_transfer_to_private` placed here so that a call + /// to `_finalize_transfer_to_private` can be enqueued. Called unsafe as it does not check `from` (this has to be + /// done in the calling function). #[public] #[internal] fn _finalize_transfer_to_private_unsafe( @@ -541,7 +544,7 @@ contract Token { // docs:start:mint_to_private /// Mints token `amount` to a private balance of `to`. Message sender has to have minter permissions (checked - /// in the enqueud call). + /// in the enqueued call). #[private] fn mint_to_private( from: AztecAddress, // sender of the tag: TODO(#9887): this is not great? @@ -613,64 +616,44 @@ contract Token { finalization_payload.emit(); } - /// We need to use different randomness for the user and for the fee payer notes because if the randomness values - /// were the same we could fingerprint the user by doing the following: - /// 1) randomness_influence = fee_payer_point - G_npk * fee_payer_npk = - /// = (G_npk * fee_payer_npk + G_rnd * randomness + G_slot * fee_payer_slot) - /// - G_npk * fee_payer_npk - G_slot * fee_payer_slot = - /// = G_rnd * randomness - /// 2) user_fingerprint = user_point - randomness_influence = - /// = (G_npk * user_npk + G_rnd * randomness + G_slot * user_slot) - G_rnd * randomness = - /// = G_npk * user_npk + G_slot * user_slot - /// 3) Then the second time the user would use this fee paying contract we would recover the same fingerprint - /// and link that the 2 transactions were made by the same user. Given that it's expected that only - /// a limited set of fee paying contracts will be used and they will be known, searching for fingerprints - /// by trying different fee payers is a feasible attack. - /// - /// Note 1: fee_payer_npk is part of the fee_payer address preimage derivation, and is assumed to be known. So - // if we have a known set of fee payer contract addresses getting fee_payer_npk and fee_payer_slot is - // trivial (slot is derived in a `Map<...>` as a hash of balances map slot and a fee payer address). - /// Note 2: fee_payer_point and user_point above are public information because they are passed as args to - /// the public `complete_refund(...)` function. // docs:start:setup_refund + /// Called by fee payer contract (FPC) to set up a refund for a user during the private fee payment flow. #[private] fn setup_refund( - fee_payer: AztecAddress, // Address of the entity which will receive the fee note. user: AztecAddress, // A user for which we are setting up the fee refund. - funded_amount: Field, // The amount the user funded the fee payer with (represents fee limit). + max_fee: Field, // The maximum fee a user is willing to pay for the tx. nonce: Field, // A nonce to make authwitness unique. ) { - // 1. This function is called by fee paying contract (fee_payer) when setting up a refund so we need to support - // the authwit flow here and check that the user really permitted fee_payer to set up a refund on their behalf. + // 1. This function is called by FPC when setting up a refund so we need to support the authwit flow here + // and check that the user really permitted fee_recipient to set up a refund on their behalf. assert_current_call_valid_authwit(&mut context, user); - // 3. Deduct the funded amount from the user's balance - this is a maximum fee a user is willing to pay - // (called fee limit in aztec spec). The difference between fee limit and the actual tx fee will be refunded - // to the user in the `complete_refund(...)` function. + // 2. Deduct the max fee from user's balance. The difference between max fee and the actual tx fee will + // be refunded to the user in the `complete_refund(...)` function. let change = subtract_balance( &mut context, storage, user, - U128::from_integer(funded_amount), + U128::from_integer(max_fee), INITIAL_TRANSFER_CALL_MAX_NOTES, ); + // Emit the change note. storage.balances.at(user).add(user, change).emit(encode_and_encrypt_note_unconstrained( &mut context, user, user, )); - // 4. We prepare the partial notes - let fee_payer_point_slot = - _prepare_private_balance_increase(user, fee_payer, &mut context, storage); + // 3. Prepare the partial note for the refund. let user_point_slot = _prepare_private_balance_increase(user, user, &mut context, storage); - // 5. Set the public teardown function to `complete_refund(...)`. Public teardown is the only time when a public + // 4. Set the public teardown function to `complete_refund(...)`. Public teardown is the only time when a public // function has access to the final transaction fee, which is needed to compute the actual refund amount. + let fee_recipient = context.msg_sender(); // FPC is the fee recipient. context.set_public_teardown_function( context.this_address(), - comptime { FunctionSelector::from_signature("complete_refund(Field,Field,Field)") }, - [fee_payer_point_slot, user_point_slot, funded_amount], + comptime { FunctionSelector::from_signature("complete_refund((Field),Field,Field)") }, + [fee_recipient.to_field(), user_point_slot, max_fee], ); } // docs:end:setup_refund @@ -691,32 +674,34 @@ contract Token { context.storage_write(slot + aztec::protocol_types::point::POINT_LENGTH as Field, setup_log); } - // TODO(#7728): even though the funded_amount should be a U128, we can't have that type in a contract interface due + // TODO(#7728): even though the max_fee should be a U128, we can't have that type in a contract interface due // to serialization issues. // docs:start:complete_refund + /// Executed as a public teardown function and is responsible for completing the refund in a private fee payment + /// flow. #[public] #[internal] - fn complete_refund(fee_payer_slot: Field, user_slot: Field, funded_amount: Field) { + fn complete_refund(fee_recipient: AztecAddress, user_slot: Field, max_fee: Field) { // TODO(#7728): Remove the next line - let funded_amount = U128::from_integer(funded_amount); + let max_fee = U128::from_integer(max_fee); let tx_fee = U128::from_integer(context.transaction_fee()); // 1. We check that user funded the fee payer contract with at least the transaction fee. // TODO(#7796): we should try to prevent reverts here - assert(funded_amount >= tx_fee, "funded amount not enough to cover tx fee"); + assert(max_fee >= tx_fee, "max fee not enough to cover tx fee"); + + // 2. We compute the refund amount as the difference between funded amount and the tx fee. + // TODO(#10805): Introduce a real exchange rate + let refund_amount = max_fee - tx_fee; - // 2. We compute the refund amount as the difference between funded amount and tx fee. - let refund_amount = funded_amount - tx_fee; + // 3. We send the tx fee to the fee recipient in public. + _increase_public_balance_inner(fee_recipient, tx_fee.to_field(), storage); - // 3. We construct the note finalization payloads with the correct amounts and hiding points to get the note - // hashes and unencrypted logs. - let fee_payer_finalization_payload = - UintNote::finalization_payload().new(&mut context, fee_payer_slot, tx_fee); + // 4. We construct the user note finalization payload with the refund amount. let user_finalization_payload = UintNote::finalization_payload().new(&mut context, user_slot, refund_amount); - // 4. At last we emit the note hashes and the final note logs. - fee_payer_finalization_payload.emit(); + // 5. At last we emit the user finalization note hash and the corresponding note log. user_finalization_payload.emit(); // --> Once the tx is settled user and fee recipient can add the notes to their pixies. } @@ -724,13 +709,24 @@ contract Token { /// Internal /// // docs:start:increase_public_balance + /// TODO(#9180): Consider adding macro support for functions callable both as an entrypoint and as an internal + /// function. #[public] #[internal] fn _increase_public_balance(to: AztecAddress, amount: Field) { + _increase_public_balance_inner(to, amount, storage); + } + // docs:end:increase_public_balance + + #[contract_library_method] + fn _increase_public_balance_inner( + to: AztecAddress, + amount: Field, + storage: Storage<&mut PublicContext>, + ) { let new_balance = storage.public_balances.at(to).read().add(U128::from_integer(amount)); storage.public_balances.at(to).write(new_balance); } - // docs:end:increase_public_balance // docs:start:reduce_total_supply #[public] diff --git a/noir-projects/noir-contracts/contracts/token_contract/src/test/refunds.nr b/noir-projects/noir-contracts/contracts/token_contract/src/test/refunds.nr index d8797b3ac8c..5e01965e8a2 100644 --- a/noir-projects/noir-contracts/contracts/token_contract/src/test/refunds.nr +++ b/noir-projects/noir-contracts/contracts/token_contract/src/test/refunds.nr @@ -34,7 +34,7 @@ unconstrained fn setup_refund_success() { let _ = OracleMock::mock("getRandomField").returns(fee_payer_randomness); let setup_refund_from_call_interface = - Token::at(token_contract_address).setup_refund(fee_payer, user, funded_amount, nonce); + Token::at(token_contract_address).setup_refund(user, funded_amount, nonce); authwit_cheatcodes::add_private_authwit_from_call_interface( user, @@ -71,7 +71,7 @@ unconstrained fn setup_refund_success() { // This test should be reworked when final support for partial notes is in // Once that happens, the expected error message is commented out below -//#[test(should_fail_with="funded amount not enough to cover tx fee")] +//#[test(should_fail_with="max fee not enough to cover tx fee")] #[test(should_fail_with = "Balance too low")] unconstrained fn setup_refund_insufficient_funded_amount() { let (env, token_contract_address, owner, recipient, _mint_amount) = @@ -86,7 +86,7 @@ unconstrained fn setup_refund_insufficient_funded_amount() { let nonce = random(); let setup_refund_from_call_interface = - Token::at(token_contract_address).setup_refund(fee_payer, user, funded_amount, nonce); + Token::at(token_contract_address).setup_refund(user, funded_amount, nonce); authwit_cheatcodes::add_private_authwit_from_call_interface( user, @@ -96,6 +96,6 @@ unconstrained fn setup_refund_insufficient_funded_amount() { env.impersonate(fee_payer); - // The following should fail with "funded amount not enough to cover tx fee" because funded amount is 0 + // The following should fail with "max fee not enough to cover tx fee" because funded amount is 0 setup_refund_from_call_interface.call(&mut env.private()) } diff --git a/noir-projects/noir-contracts/scripts/flamegraph.sh b/noir-projects/noir-contracts/scripts/flamegraph.sh index 8db540142e6..ca5ae33c18b 100755 --- a/noir-projects/noir-contracts/scripts/flamegraph.sh +++ b/noir-projects/noir-contracts/scripts/flamegraph.sh @@ -63,10 +63,10 @@ FUNCTION_ARTIFACT="${ARTIFACT_NAME}-${FUNCTION}.json" mkdir -p "$SCRIPT_DIR/../dest" # At last, generate the flamegraph -$PROFILER gates-flamegraph --artifact-path "$SCRIPT_DIR/../target/$FUNCTION_ARTIFACT" --backend-path "$SCRIPT_DIR/../../../barretenberg/cpp/build/bin/bb" --backend-gates-command "gates_mega_honk" --output "$SCRIPT_DIR/../dest" +$PROFILER gates --artifact-path "$SCRIPT_DIR/../target/$FUNCTION_ARTIFACT" --backend-path "$SCRIPT_DIR/../../../barretenberg/cpp/build/bin/bb" --backend-gates-command "gates_mega_honk" --output "$SCRIPT_DIR/../dest" # serve the file over http -echo "Serving flamegraph at http://0.0.0.0:8000/main_gates.svg" +echo "Serving flamegraph at http://0.0.0.0:8000/main::gates.svg" python3 -m http.server --directory "$SCRIPT_DIR/../dest" 8000 # Clean up before exiting diff --git a/noir-projects/noir-protocol-circuits/.gitignore b/noir-projects/noir-protocol-circuits/.gitignore index d07185e4441..9a99d303b90 100644 --- a/noir-projects/noir-protocol-circuits/.gitignore +++ b/noir-projects/noir-protocol-circuits/.gitignore @@ -1,4 +1,3 @@ -Prover.toml Verifier.toml target crates/autogenerated diff --git a/noir-projects/noir-protocol-circuits/Nargo.template.toml b/noir-projects/noir-protocol-circuits/Nargo.template.toml index 349516d481e..e482f16c150 100644 --- a/noir-projects/noir-protocol-circuits/Nargo.template.toml +++ b/noir-projects/noir-protocol-circuits/Nargo.template.toml @@ -1,7 +1,7 @@ [workspace] members = [ "crates/types", -# "crates/blob", + "crates/blob", "crates/parity-base", "crates/parity-lib", "crates/parity-root", @@ -29,6 +29,7 @@ members = [ "crates/rollup-base-public-simulated", "crates/rollup-block-merge", "crates/rollup-block-root", + "crates/rollup-block-root-simulated", "crates/rollup-block-root-empty", "crates/rollup-root", ] diff --git a/noir-projects/noir-protocol-circuits/bootstrap.sh b/noir-projects/noir-protocol-circuits/bootstrap.sh index 76d20a5f2a4..4f809893b3f 100755 --- a/noir-projects/noir-protocol-circuits/bootstrap.sh +++ b/noir-projects/noir-protocol-circuits/bootstrap.sh @@ -20,7 +20,8 @@ node ./scripts/generate_variants.js NARGO=${NARGO:-../../noir/noir-repo/target/release/nargo} echo "Compiling protocol circuits with ${RAYON_NUM_THREADS:-1} threads" -RAYON_NUM_THREADS=${RAYON_NUM_THREADS:-1} $NARGO compile --silence-warnings +# NOTE: --skip-brillig-constraints-check added temporarily for blobs build time +RAYON_NUM_THREADS=${RAYON_NUM_THREADS:-1} $NARGO compile --silence-warnings --skip-brillig-constraints-check BB_HASH=${BB_HASH:-$(cd ../../ && git ls-tree -r HEAD | grep 'barretenberg/cpp' | awk '{print $3}' | git hash-object --stdin)} echo Using BB hash $BB_HASH diff --git a/noir-projects/noir-protocol-circuits/crates/blob/Nargo.toml b/noir-projects/noir-protocol-circuits/crates/blob/Nargo.toml index 29bbc9ffce0..da49758490e 100644 --- a/noir-projects/noir-protocol-circuits/crates/blob/Nargo.toml +++ b/noir-projects/noir-protocol-circuits/crates/blob/Nargo.toml @@ -1,8 +1,9 @@ [package] name = "blob" -type = "bin" +type = "lib" authors = [""] compiler_version = ">=0.30.0" [dependencies] -bigint = {tag = "v0.3.4", git = "https://github.com/noir-lang/noir-bignum" } +bigint = {tag = "v0.4.2", git = "https://github.com/noir-lang/noir-bignum" } +types = { path = "../types" } diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/blob.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/blob.nr new file mode 100644 index 00000000000..d2f9d809332 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/blob.nr @@ -0,0 +1,698 @@ +// TODO(#9982): Replace unconstrained_config with config and import ROOTS - calculating ROOTS in unconstrained is insecure. +use crate::{ + blob_public_inputs::{BlobCommitment, BlobPublicInputs, BlockBlobPublicInputs}, + unconstrained_config::{compute_roots_of_unity, D_INV, F, LOG_FIELDS_PER_BLOB}, +}; + +use bigint::BigNum; +// Fixed hash method: +use types::hash::poseidon2_hash_subarray; +// Variable hash method: +// use types::hash::poseidon2_cheaper_variable_hash; +use types::{ + abis::sponge_blob::SpongeBlob, + constants::{BLOBS_PER_BLOCK, FIELDS_PER_BLOB}, + utils::arrays::array_splice, +}; + +global LIMB_MAX: Field = 0x1000000000000000000000000000000; // 2^120 +global TWO_POW_56: u64 = 0x100000000000000; // u64 to aid integer only modulo in __field_to_bignum_limbs +global TWO_POW_64: Field = 0x10000000000000000; + +unconstrained fn __batch_invert_impl(mut x: [F; N]) -> [F; N] { + let mut accumulator: F = BigNum::one(); + + let mut temporaries: [F; N] = std::mem::zeroed(); + for i in 0..N { + temporaries[i] = accumulator; + if (x[i].__is_zero() == false) { + accumulator = accumulator.__mul(x[i]); + } + } + + accumulator = accumulator.__invmod(); + let mut T0: F = BigNum::new(); + for i in 0..N { + let idx = N - 1 - i; + if (x[idx].__is_zero() == false) { + T0 = accumulator.__mul(temporaries[idx]); + accumulator = accumulator.__mul(x[idx]); + x[idx] = T0; + } + } + x +} + +// Taken from https://github.com/iAmMichaelConnor/blob-lib/blob/main/noir-circuits/blob/src/main.nr +unconstrained fn __field_to_bignum_limbs(x: Field) -> [Field; 3] { + // Here we're taking advantage of truncating 64 bit limbs from the input field + // and then subtracting them from the input such that the field division is equivalent to integer division. + let low_120_lower_64 = (x as u64) as Field; + let x_shifted_64 = (x - low_120_lower_64) / TWO_POW_64; + let low_120_upper_56 = ((x_shifted_64 as u64) % TWO_POW_56) as Field; + let low_120 = low_120_lower_64 + TWO_POW_64 * low_120_upper_56; + + let x_shifted_120 = (x_shifted_64 - low_120_upper_56) / (TWO_POW_56 as Field); + + let mid_120_lower_64 = (x_shifted_120 as u64) as Field; + let x_shifted_184 = (x_shifted_120 - mid_120_lower_64) / TWO_POW_64; + let mid_120_upper_56 = ((x_shifted_184 as u64) % TWO_POW_56) as Field; + let mid_120 = mid_120_lower_64 + TWO_POW_64 * mid_120_upper_56; + + let x_shifted_240 = (x_shifted_184 - mid_120_upper_56) / (TWO_POW_56 as Field); + + let hi_120_lower_64 = (x_shifted_240 as u64) as Field; + // We don't need to go further, as we've reached 304 bits, and a Field is 254 bits. + let hi_120 = hi_120_lower_64; + + [low_120, mid_120, hi_120] +} + +// Only works for bignums with modulus larger than the BN Fr size (which is true +// for the bls12-381 Fr field). +fn field_to_bignum(x: Field) -> F { + let __x_limbs = unsafe { __field_to_bignum_limbs(x) }; + + let mut check = __x_limbs[3 - 1]; + for i in 1..3 { + check *= LIMB_MAX; + check += __x_limbs[3 - i - 1]; + } + assert(check == x); + + BigNum { limbs: __x_limbs } +} + +fn convert_blob_fields(blob_as_fields: [Field; FIELDS_PER_BLOB]) -> [F; FIELDS_PER_BLOB] { + let mut blob: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; + for i in 0..FIELDS_PER_BLOB { + blob[i] = field_to_bignum(blob_as_fields[i]); + } + blob +} + +pub fn check_block_blob_sponge( + blobs_as_fields: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK], + mut sponge_blob: SpongeBlob, +) -> Field { + // Check that we haven't overfilled the blobs + assert( + sponge_blob.expected_fields <= FIELDS_PER_BLOB * BLOBS_PER_BLOCK, + "Attempted to overfill blobs", + ); + // Check that the blob is full + assert( + sponge_blob.expected_fields == sponge_blob.fields, + "Incorrect number of tx effects added to blob", + ); + let sponge_hash = sponge_blob.squeeze(); + let hash = poseidon2_hash_subarray(blobs_as_fields, sponge_blob.fields); + assert(hash == sponge_hash, "Mismatched hashed tx effects"); + + sponge_hash +} + +fn compute_challenge(hashed_blobs_fields: Field, kzg_commitment: BlobCommitment) -> Field { + let preimage = [hashed_blobs_fields, kzg_commitment.inner[0], kzg_commitment.inner[1]]; + let challenge = std::hash::poseidon2::Poseidon2::hash(preimage, 3); + challenge +} + +// Note: the kzg_commitment is technically a BLS12-381 point in (Fq, Fq), but +// we don't actually need to operate on it so we've simply encoded it as fitting inside a +// [Field; 2], since two 254-bit fields more-than covers 381+1=382 bits. +// See yarn-project/foundation/src/blob/index.ts -> commitmentToFields() for encoding +fn evaluate_blob( + blob_as_fields: [Field; FIELDS_PER_BLOB], + kzg_commitment: BlobCommitment, + hashed_blobs_fields: Field, +) -> BlobPublicInputs { + let challenge_z: Field = compute_challenge(hashed_blobs_fields, kzg_commitment); + let challenge_z_as_bignum: F = field_to_bignum(challenge_z); + let blob = convert_blob_fields(blob_as_fields); + + let y: F = barycentric_evaluate_blob_at_z(challenge_z_as_bignum, blob); + + BlobPublicInputs { z: challenge_z, y, kzg_commitment } +} + +// Evaluates each blob required for a block +pub fn evaluate_blobs( + blobs_as_fields: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK], + kzg_commitments: [BlobCommitment; BLOBS_PER_BLOCK], + mut sponge_blob: SpongeBlob, +) -> BlockBlobPublicInputs { + // Note that with multiple blobs per block, each blob uses the same hashed_blobs_fields in: + // challenge_z = H(hashed_blobs_fields, kzg_commitment[0], kzg_commitment[1]) + // This is ok, because each commitment is unique to the blob, and we need hashed_blobs_fields to encompass + // all fields in the blob, which it does. + let hashed_blobs_fields = check_block_blob_sponge(blobs_as_fields, sponge_blob); + let mut result = BlockBlobPublicInputs::empty(); + for i in 0..BLOBS_PER_BLOCK { + let single_blob_fields = array_splice(blobs_as_fields, i * FIELDS_PER_BLOB); + result.inner[i] = + evaluate_blob(single_blob_fields, kzg_commitments[i], hashed_blobs_fields); + if (result.inner[i].is_zero()) & (single_blob_fields[0] == 0) { + // We use empty PIs for empty blobs, to make it simpler to verify on L1. + // Since our fields come from the base rollup, we know they are tightly packed + // and should contain no 0 values among valid values => single_blob_fields[0] == 0. + result.inner[i] = BlobPublicInputs::empty(); + } + } + result +} + +/** + * ___d-1 + * z^d - 1 \ omega^i + * p(z) = --------- . / y_i . --------- + * d /____ z - omega^i + * i=0 + * + * p(z) = factor . sum( y_i . num / denom ) + * + * + * where d = 4096 + * + * Precompute: + * - The d roots of unity omega^i (plus maybe their negatives for z - omega^i computations). + * - (1 / d) + * + * @param z + * @param ys - the many y_i's of the blob. + * + * @return y = p(z) + */ +fn barycentric_evaluate_blob_at_z(z: F, ys: [F; FIELDS_PER_BLOB]) -> F { + // TODO(#9982): Delete below and go back to using config.nr - calculating ROOTS in unconstrained is insecure. + let ROOTS = unsafe { compute_roots_of_unity() }; + + // Note: it's more efficient (saving 30k constraints) to compute: + // ___d-1 + // \ / y_i \ + // / | --------- | . omega^i + // /____ \ z - omega^i / + // i=0 + // ^^^^^^^^^ + // frac + // + // ... than to compute: + // + // ___d-1 + // \ / omega^i \ + // / y_i . | --------- | + // /____ \ z - omega^i / + // i=0 + // + // perhaps because all the omega^i terms are constant witnesses? + let fracs = compute_fracs(z, ys, ROOTS); + + // OK so...we can add multiple product terms into a sum...but I am not sure how many! + // we are computing 254 * 254 bit products and we need to ensure each product limb doesn't overflow + // each limb is 120 bits => 120 * 120 = 240 bits. + // however when computing a mul we add up to 5 product terms into a single field element => 243 bits (ish) + // when we do a modular reduction we validate that a field element >> 120 bits is less than 2^{126} which implies we have 246 bits to play with + // which implies...we can accommodate up to EIGHT additions of product terms before we risk overflowing + // (this is really messy! I never considered the case of giant linear sequences of products) + + // Seeking: + // ___d-1 + // \ omega^i + // sum = / y_i . --------- + // /____ z - omega^i + // i=0 + let NUM_PARTIAL_SUMS = FIELDS_PER_BLOB / 8; + let partial_sums: [F; FIELDS_PER_BLOB / 8] = unsafe { + // Safety: This sum is checked by the following `BigNum::evaluate_quadratic_expression` calls. + __compute_partial_sums(fracs, ROOTS) + }; + + // We split off the first term to check the initial sum + + // partial_sums[0] <- (lhs[0] * rhs[0] + ... + lhs[7] * rhs[7]) + // => (lhs[0] * rhs[0] + ... + lhs[7] * rhs[7]) - partial_sums[0] == 0 + let lhs = [ + [ROOTS[0]], [ROOTS[1]], [ROOTS[2]], [ROOTS[3]], [ROOTS[4]], [ROOTS[5]], [ROOTS[6]], + [ROOTS[7]], + ]; + let rhs = [ + [fracs[0]], [fracs[1]], [fracs[2]], [fracs[3]], [fracs[4]], [fracs[5]], [fracs[6]], + [fracs[7]], + ]; + BigNum::evaluate_quadratic_expression( + lhs, + [[false], [false], [false], [false], [false], [false], [false], [false]], + rhs, + [[false], [false], [false], [false], [false], [false], [false], [false]], + [partial_sums[0]], + [true], + ); + for i in 1..NUM_PARTIAL_SUMS { + // Seeking: + // ___i*8 - 1 ___i*8 + 7 + // \ omega^i \ / y_k \ + // sum_out = / y_i . --------- + / omega^k . | --------- | + // /____ z - omega^i /____ \ z - omega^k / + // 0 k = i*8 + // ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // sum partial_sum + // + // ... that is: + // + // ___i*8 - 1 ___ 7 + // \ omega^i \ + // sum_out = / y_i . --------- + / lhs[j] . rhs[j] + // /____ z - omega^i /____ + // 0 j = 0 + // ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ + // sum partial_sum + // + + let mut lhs: [[F; 1]; 8] = [std::mem::zeroed(); 8]; + let mut rhs: [[F; 1]; 8] = [std::mem::zeroed(); 8]; + for j in 0..8 { + let k = i * 8 + j; + lhs[j] = [ROOTS[k]]; // omega^k + rhs[j] = [fracs[k]]; // y_k / (z - omega^k) + } + + let linear_terms = [partial_sums[i - 1], partial_sums[i]]; + + // partial_sums[i] <- partial_sums[i-1] + (lhs[8*i] * rhs[8*i] + ... + lhs[8*i + 7] * rhs[8*i + 7]) + // => (lhs[8*i] * rhs[8*i] + ... + lhs[8*i + 7] * rhs[8*i + 7]) + partial_sums[i-1] - partial_sums[i] == 0 + BigNum::evaluate_quadratic_expression( + lhs, + [[false], [false], [false], [false], [false], [false], [false], [false]], + rhs, + [[false], [false], [false], [false], [false], [false], [false], [false]], + linear_terms, + [false, true], + ); + } + + let factor = compute_factor(z); + let sum = partial_sums[FIELDS_PER_BLOB / 8 - 1]; + factor.mul(sum) +} + +unconstrained fn __compute_factor_helper(z_pow_d: F) -> F { + let one: F = BigNum::one(); + z_pow_d.__sub(one).__mul(D_INV) +} + +fn compute_factor(z: F) -> F { + // z ^ D: + let mut t = z.mul(z); + + for _ in 0..LOG_FIELDS_PER_BLOB - 1 { + t = t.mul(t); + } + + let z_pow_d = t; + + let factor = unsafe { + // Safety: We immediately check that this result is correct in the following `BigNum::evaluate_quadratic_expression` call. + __compute_factor_helper(z_pow_d) + }; + + // (z_pow_d - one) * (D_INV) - factor = 0 + // z_pow_d * D_INV - D_INV - factor = 0 + BigNum::evaluate_quadratic_expression( + [[z_pow_d]], + [[false]], + [[D_INV]], + [[false]], + [factor, D_INV], + [true, true], + ); + + // This version doesn't work: + // BigNum::evaluate_quadratic_expression( + // [[z_pow_d, one]], + // [[false, true]], + // [[D_INV]], + // [[false]], + // [factor], + // [true] + // ); + + factor +} + +unconstrained fn __compute_fracs( + z: F, + ys: [F; FIELDS_PER_BLOB], + ROOTS: [F; FIELDS_PER_BLOB], +) -> [F; FIELDS_PER_BLOB] { + let mut denoms = [BigNum::new(); FIELDS_PER_BLOB]; + for i in 0..FIELDS_PER_BLOB { + denoms[i] = z.__sub(ROOTS[i]); // (z - omega^i) + } + let inv_denoms = __batch_invert_impl(denoms); // 1 / (z - omega^i), for all i + + // We're now done with `denoms` so we can reuse the allocated array to build `fracs`. + let mut fracs: [F; FIELDS_PER_BLOB] = denoms; // y_i / (z - omega^i), for all i + for i in 0..FIELDS_PER_BLOB { + let num = ys[i]; + let inv_denom = inv_denoms[i]; // 1 / (z - omega^i) + fracs[i] = num.__mul(inv_denom); // y_i * (1 / (z - omega^i)) + } + + fracs +} + +fn compute_fracs( + z: F, + ys: [F; FIELDS_PER_BLOB], + ROOTS: [F; FIELDS_PER_BLOB], +) -> [F; FIELDS_PER_BLOB] { + let mut fracs: [F; FIELDS_PER_BLOB] = unsafe { + // Safety: We immediately constrain these `fracs` to be correct in the following call to `BigNum::evaluate_quadratic_expression`. + __compute_fracs(z, ys, ROOTS) + }; + + for i in 0..FIELDS_PER_BLOB { + // frac <-- ys[i] / (z + neg_roots[i]) + // frac * (z + neg_roots[i]) - ys[i] = 0 + BigNum::evaluate_quadratic_expression( + [[fracs[i]]], + [[false]], + [[z, ROOTS[i].neg()]], + [[false, false]], + [ys[i]], + [true], + ); + } + + fracs +} + +// TODO: Clean me +unconstrained fn __compute_partial_sums( + fracs: [F; FIELDS_PER_BLOB], + ROOTS: [F; FIELDS_PER_BLOB], +) -> [F; FIELDS_PER_BLOB / 8] { + let mut partial_sums: [F; FIELDS_PER_BLOB / 8] = std::mem::zeroed(); + + // Seeking: + // ___i*8 + 7 + // \ omega^k + // partial_sum = / y_k . --------- + // /____ z - omega^k + // k=i*8 + 0 + + // Need to split off the first iteration. + let mut partial_sum: F = BigNum::new(); + for i in 0..8 { + // y_k * ( omega^k / (z - omega^k) ) + let summand = ROOTS[i].__mul(fracs[i]); + + // partial_sum + ( y_k * ( omega^k / (z - omega^k) ) -> partial_sum + partial_sum = partial_sum.__add(summand); + } + partial_sums[0] = partial_sum; + + let NUM_PARTIAL_SUMS = FIELDS_PER_BLOB / 8; + for i in 1..NUM_PARTIAL_SUMS { + let mut partial_sum: F = partial_sums[i - 1]; + // Seeking: + // ___i*8 + 7 + // \ omega^k + // partial_sum = / y_k . --------- + // /____ z - omega^k + // k=i*8 + 0 + for j in 0..8 { + let k = i * 8 + j; + // y_k * ( omega^k / (z - omega^k) ) + let summand = ROOTS[k].__mul(fracs[k]); + // partial_sum + ( y_k * ( omega^k / (z - omega^k) ) -> partial_sum + partial_sum = partial_sum.__add(summand); + } + partial_sums[i] = partial_sum; + } + + partial_sums +} + +mod tests { + // TODO(#9982): Replace unconstrained_config with config and import ROOTS - calculating ROOTS in unconstrained is insecure. + use crate::{ + blob::{ + barycentric_evaluate_blob_at_z, check_block_blob_sponge, evaluate_blob, evaluate_blobs, + field_to_bignum, + }, + blob_public_inputs::BlobCommitment, + unconstrained_config::{D, D_INV, F, LOG_FIELDS_PER_BLOB}, + }; + use bigint::{BigNum, fields::bls12_381Fr::BLS12_381_Fr_Params}; + use types::{ + abis::sponge_blob::SpongeBlob, + constants::{BLOBS_PER_BLOCK, FIELDS_PER_BLOB}, + tests::{fixture_builder::FixtureBuilder, utils::pad_end}, + }; + + // Helper to return (z^d - 1)/d (unsafe - test only) + fn z_d_helper(challenge_z: F) -> F { + let mut t1 = unsafe { challenge_z.__mul(challenge_z) }; + let mut t2: F = BigNum::new(); + for _i in 0..LOG_FIELDS_PER_BLOB - 1 { + t2 = unsafe { t1.__mul(t1) }; + t1 = t2; + } + + let z_pow_d = t1; + + let one: F = BigNum::one(); + + t1 = unsafe { z_pow_d.__sub(one) }; + let factor = unsafe { t1.__mul(D_INV) }; + factor + } + + #[test] + unconstrained fn test_one_note() { + let mut tx_data = FixtureBuilder::new(); + tx_data.add_new_note_hash(1); + let mut blob: [Field; FIELDS_PER_BLOB] = [0; FIELDS_PER_BLOB]; + let blob_fields = tx_data.to_combined_accumulated_data().serialize(); + for i in 0..blob_fields.len() { + blob[i] = blob_fields[i]; + } + let mut sponge_blob = SpongeBlob::new(blob_fields.len()); + sponge_blob.absorb(blob_fields, blob_fields.len()); + + let kzg_commitment_in = BlobCommitment { inner: [1, 2] }; // this is made-up nonsense. + let padded_blob_fields = pad_end(blob, 0); + let hashed_blob = check_block_blob_sponge(padded_blob_fields, sponge_blob); + let output = evaluate_blob(blob, kzg_commitment_in, hashed_blob); + let challenge_z = field_to_bignum(output.z); + let y = output.y; + // Our blob is all 0s, apart from one commitment of value 1 at position 0 + // It's in eval form => our barycentric formula to find p(z) becomes: + // + // z^d - 1 omega^0 z^d - 1 1 + // p(z) = --------- . note . --------- = --------- . 1 . --------- + // d z - omega^0 d z - 1 + // + // => + // We check that: + //* z^d - 1 + //* p(z).(z - 1) = --------- + //* d + // + let rhs = z_d_helper(challenge_z); + let z_minus_1 = unsafe { challenge_z.__sub(BigNum::one()) }; + let lhs = y.__mul(z_minus_1); + assert_eq(lhs, rhs); + } + + // TODO: After reverting some noir changes (see PR#10341) the below no longer works in unconstrained + // This happened previously in commit 893f1eca422d952d672eec75e3c9ff8f149a9ae8 but a sync fixed it. + // It works and passes in constrained, just takes a min longer. + #[test] + fn test_base() { + let mut tx_data = FixtureBuilder::new(); + // Add some random bits of state + tx_data.append_note_hashes(50); + tx_data.set_first_nullifier(); + tx_data.append_nullifiers(50); + tx_data.append_l2_to_l1_msgs(5); + tx_data.append_unencrypted_log_hashes(5); + let mut blob: [Field; FIELDS_PER_BLOB] = [0; FIELDS_PER_BLOB]; + let blob_fields = tx_data.to_combined_accumulated_data().serialize(); + for i in 0..blob_fields.len() { + blob[i] = blob_fields[i]; + } + let mut sponge_blob = SpongeBlob::new(blob_fields.len()); + sponge_blob.absorb(blob_fields, blob_fields.len()); + + let kzg_commitment_in = BlobCommitment { inner: [1, 2] }; // this is made-up nonsense. + let padded_blob_fields = pad_end(blob, 0); + let hashed_blob = check_block_blob_sponge(padded_blob_fields, sponge_blob); + let output = evaluate_blob(blob, kzg_commitment_in, hashed_blob); + let expected_z = std::hash::poseidon2::Poseidon2::hash( + [sponge_blob.squeeze(), kzg_commitment_in.inner[0], kzg_commitment_in.inner[1]], + 3, + ); + assert(expected_z == output.z); + } + + // All hardcoded values in this test are taken from yarn-project/foundation/src/blob/blob.test.ts -> 'should evaluate a blob of 400 items' + #[test] + unconstrained fn test_400() { + let mut blob: [Field; FIELDS_PER_BLOB] = [0; FIELDS_PER_BLOB]; + for i in 0..400 { + blob[i] = 3; + } + let mut sponge_blob = SpongeBlob::new(400); + sponge_blob.absorb(blob, 400); + + let kzg_commitment_in = BlobCommitment { + inner: [ + 0x00b2803d5fe972914ba3616033e2748bbaa6dbcddefc3721a54895a7a45e7750, + 0x0000000000000000000000000000004dd1a971c7e8d8292be943d05bccebcfea, + ], + }; + + let padded_blob_fields = pad_end(blob, 0); + let hashed_blob = check_block_blob_sponge(padded_blob_fields, sponge_blob); + let output = evaluate_blob(blob, kzg_commitment_in, hashed_blob); + + // y is a BLS field with value 0x212c4f0c0ee5e7dd037110686a4639d191dde7b57ab99b51e4b06e7d827b6c4c + let expected_y: F = BigNum { + limbs: [0xdde7b57ab99b51e4b06e7d827b6c4c, 0x4f0c0ee5e7dd037110686a4639d191, 0x212c], + }; + assert(expected_y == output.y); + } + + // All hardcoded values in this test are taken from yarn-project/foundation/src/blob/blob.test.ts -> 'should evaluate full blobs' + #[test] + unconstrained fn test_full_blobs() { + let mut blob: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK] = + [0; FIELDS_PER_BLOB * BLOBS_PER_BLOCK]; + for j in 0..BLOBS_PER_BLOCK { + for i in 0..FIELDS_PER_BLOB { + blob[j * FIELDS_PER_BLOB + i] = i as Field + 2; + } + } + + let mut sponge_blob = SpongeBlob::new(FIELDS_PER_BLOB * BLOBS_PER_BLOCK); + sponge_blob.absorb(blob, FIELDS_PER_BLOB * BLOBS_PER_BLOCK); + + let kzg_commitment_in = BlobCommitment { + inner: [ + 0x00ac771dea41e29fc2b7016c32731602c0812548ba0f491864a4e03fdb94b8d3, + 0x000000000000000000000000000000d195faad1967cdf005acf73088b0e8474a, + ], + }; + + let output = evaluate_blobs(blob, [kzg_commitment_in; BLOBS_PER_BLOCK], sponge_blob); + + // y is a BLS field with value 0x52fd4e272015a79f3889cc9ab1d84bee4326de7d8ced52612ecc9ec137bd38ee + let expected_y: F = BigNum { + limbs: [0x26de7d8ced52612ecc9ec137bd38ee, 0x4e272015a79f3889cc9ab1d84bee43, 0x52fd], + }; + for j in 0..BLOBS_PER_BLOCK { + assert(expected_y == output.inner[j].y); + } + } + + #[test(should_fail_with = "Found non-zero field after breakpoint")] + unconstrained fn test_no_extra_blob_fields() { + let mut blob: [Field; FIELDS_PER_BLOB] = [0; FIELDS_PER_BLOB]; + // Fill fields with 50 inputs... + for i in 0..50 { + blob[i] = 3; + } + // ...but the rollup's sponge is only expecting 45... + let mut sponge_blob = SpongeBlob::new(45); + sponge_blob.absorb(blob, 45); + + // ...so the below should fail as it detects we are adding effects which did not come from the rollup. + let padded_blob_fields = pad_end(blob, 0); + let _ = check_block_blob_sponge(padded_blob_fields, sponge_blob); + } + + #[test(should_fail_with = "Incorrect number of tx effects added to blob")] + unconstrained fn test_absorbed_too_few_blob_fields() { + let mut blob: [Field; FIELDS_PER_BLOB] = [0; FIELDS_PER_BLOB]; + // Fill fields with 50 inputs... + for i in 0..50 { + blob[i] = 3; + } + // ...but the rollup's sponge is expecting 100... + let mut sponge_blob = SpongeBlob::new(100); + sponge_blob.absorb(blob, 50); + + // ...so the below should fail as it detects we have not added all the tx effects. + let padded_blob_fields = pad_end(blob, 0); + let _ = check_block_blob_sponge(padded_blob_fields, sponge_blob); + } + + #[test] + unconstrained fn test_empty_blob() { + let mut blob: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK] = + [0; FIELDS_PER_BLOB * BLOBS_PER_BLOCK]; + let mut sponge_blob = SpongeBlob::new(0); + // The below should not throw + let _ = check_block_blob_sponge(blob, sponge_blob); + } + + #[test] + unconstrained fn test_barycentric() { + let z: F = BigNum { limbs: [2, 0, 0] }; + + // many y's form a blob: + let mut ys: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; + + ys[0] = BigNum { limbs: [0x1234, 0, 0] }; + ys[1] = BigNum { limbs: [0xabcd, 0, 0] }; + ys[2] = BigNum { limbs: [0x69, 0, 0] }; + + // evaluate the blob at z = 2 to yield y: + let y = barycentric_evaluate_blob_at_z(z, ys); + + let mut expected_y: [Field; 3] = [0; 3]; + if (FIELDS_PER_BLOB == 4096) { + // Computed with the eth consensus specs py lib + expected_y = + [0x0c62e352a428e8e9842eadc1c106bd, 0x902c5b4968d755b6f49c0231e15af8, 0x00049a]; + // Also computed with cKzg, in the typescript tests: + // 0x049a902c5b4968d755b6f49c0231e15af80c62e352a428e8e9842eadc1c106bd + } + if (FIELDS_PER_BLOB == 8) { + // Computed with the eth consensus specs py lib (after hacking it to cope with blobs of size 8 instead of 4096): + expected_y = + [0xb04cdea4304000053abffffffb203a, 0x0000000002e30785c8afa4496f8e38, 0x000000]; + } + assert(y.limbs == expected_y); + } + + // Helper function used to populate the hard-coded double_modulus value in the bls12381Fr.nr file in the bignum library. + unconstrained fn compute_double_modulus() -> [Field; 3] { + let two_p = [0x7b4805fffcb7fdfffffffe00000002, 0x4ea6533afa906673b0101343b00aa7, 0x00e7db]; + let NUM_LIMBS = 3; // must be >= 3 + let two_pow_120 = 2.pow_32(120); + let mut double_modulus: [Field; 3] = [0; 3]; + + double_modulus[0] = two_p[0] + two_pow_120; + for i in 1..NUM_LIMBS - 1 { + double_modulus[i] = two_p[i] + two_pow_120 - 1; + } + double_modulus[NUM_LIMBS - 1] = two_p[NUM_LIMBS - 1] - 1; + double_modulus + } + + #[test] + unconstrained fn test_compute_double_modulus() { + let double_modulus = BLS12_381_Fr_Params::get_params().double_modulus; + assert_eq(double_modulus, compute_double_modulus()); + } + + #[test] + unconstrained fn test_compute_d_inv() { + let d_inversed = D.__invmod(); + assert_eq(d_inversed, D_INV); + } +} + diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/blob_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/blob_public_inputs.nr new file mode 100644 index 00000000000..a318fd00ed9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/blob_public_inputs.nr @@ -0,0 +1,134 @@ +use crate::unconstrained_config::F; +// TODO(#9982): Replace unconstrained_config with config. +use bigint::BigNum; +use types::{ + constants::{BLOB_PUBLIC_INPUTS, BLOBS_PER_BLOCK}, + traits::{Deserialize, Empty, Serialize}, + utils::reader::Reader, +}; + +// NB: This only exists because a nested array of [[Field; 2]; N] did not build with earthly, but was fine otherwise +// For blobs, we use the compressed 48 byte BLS12 commitment to compute the challenge. We never need to operate on it, +// so it's encoded as 2 fields. The first is the first 31 bytes, and the second is the next 17 bytes. +pub struct BlobCommitment { + pub inner: [Field; 2], +} + +impl Eq for BlobCommitment { + fn eq(self, other: Self) -> bool { + self.inner.eq(other.inner) + } +} + +impl Empty for BlobCommitment { + fn empty() -> Self { + Self { inner: [0; 2] } + } +} + +pub struct BlobPublicInputs { + pub z: Field, + pub y: F, + pub kzg_commitment: BlobCommitment, +} + +impl BlobPublicInputs { + pub fn accumulate(self, other: Self) -> Self { + // TODO: When we verify root, rather than block root, on L1 we need to accumulate many blob openings + // @Mike this may be where we calculate z_acc, y_acc, C_acc, etc. + // WARNING: unimplemented, below is nonsense to get noir to compile + Self { z: self.z + other.z, y: self.y.add(other.y), kzg_commitment: self.kzg_commitment } + } + + // This checks whether the blob public inputs represent data of all 0s + // This is not equivalent to being empty, since the challenge point z is a hash and won't have 0 value. + pub fn is_zero(self) -> bool { + // Note: there is no constrained is_zero in bignum + (self.y == BigNum { limbs: [0, 0, 0] }) & (self.kzg_commitment.inner == [0, 0]) + } +} + +impl Empty for BlobPublicInputs { + fn empty() -> Self { + Self { z: 0, y: BigNum::new(), kzg_commitment: BlobCommitment::empty() } + } +} + +impl Serialize for BlobPublicInputs { + fn serialize(self) -> [Field; BLOB_PUBLIC_INPUTS] { + [ + self.z, + self.y.limbs[0], + self.y.limbs[1], + self.y.limbs[2], + self.kzg_commitment.inner[0], + self.kzg_commitment.inner[1], + ] + } +} + +impl Deserialize for BlobPublicInputs { + fn deserialize(fields: [Field; BLOB_PUBLIC_INPUTS]) -> Self { + Self { + z: fields[0], + y: BigNum { limbs: [fields[1], fields[2], fields[3]] }, + kzg_commitment: BlobCommitment { inner: [fields[4], fields[5]] }, + } + } +} + +impl Eq for BlobPublicInputs { + fn eq(self, other: Self) -> bool { + (self.z == other.z) & (self.y.eq(other.y)) & (self.kzg_commitment.eq(other.kzg_commitment)) + } +} + +// NB: it is much cleaner throughout the protocol circuits to define this struct rather than use a nested array. +// Once we accumulate blob inputs, it should be removed, and we just use BlobPublicInputs::accumulate everywhere. +pub struct BlockBlobPublicInputs { + pub inner: [BlobPublicInputs; BLOBS_PER_BLOCK], +} + +impl Empty for BlockBlobPublicInputs { + fn empty() -> Self { + Self { inner: [BlobPublicInputs::empty(); BLOBS_PER_BLOCK] } + } +} + +impl Serialize for BlockBlobPublicInputs { + fn serialize(self) -> [Field; BLOB_PUBLIC_INPUTS * BLOBS_PER_BLOCK] { + let mut fields: BoundedVec = BoundedVec::new(); + for i in 0..BLOBS_PER_BLOCK { + fields.extend_from_array(self.inner[i].serialize()); + } + fields.storage() + } +} + +impl Deserialize for BlockBlobPublicInputs { + fn deserialize(fields: [Field; BLOB_PUBLIC_INPUTS * BLOBS_PER_BLOCK]) -> Self { + let mut reader = Reader::new(fields); + let item = Self { + inner: reader.read_struct_array( + BlobPublicInputs::deserialize, + [BlobPublicInputs::empty(); BLOBS_PER_BLOCK], + ), + }; + reader.finish(); + item + } +} + +impl Eq for BlockBlobPublicInputs { + fn eq(self, other: Self) -> bool { + self.inner.eq(other.inner) + } +} + +#[test] +fn serialization_of_empty() { + let item = BlockBlobPublicInputs::empty(); + let serialized = item.serialize(); + let deserialized = BlockBlobPublicInputs::deserialize(serialized); + assert(item.eq(deserialized)); +} diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/config.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/config.nr index 8b3fbac3339..53f72447e2b 100644 --- a/noir-projects/noir-protocol-circuits/crates/blob/src/config.nr +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/config.nr @@ -1,4110 +1,12305 @@ -use dep::bigint::{BigNum, fields::bls12_381Fr::BLS12_381_Fr_Params}; +use bigint::{BigNum, fields::bls12_381Fr::BLS12_381_Fr_Params}; +use types::constants::FIELDS_PER_BLOB; -type F = BigNum<3, BLS12_381_Fr_Params>; +pub type F = BigNum<3, 255, BLS12_381_Fr_Params>; -global FIELDS_PER_BLOB: u32 = 4096; -global LOG_FIELDS_PER_BLOB: u32 = 12; -global EXTRA_FIELDS_PER_BLOB: u32 = 16; // 16 = floor(4096 FIELDS_PER_BLOB / 254 noir_field_bits), wasting only 32 bits. -global NOIR_FIELDS_PER_BLOB: u32 = FIELDS_PER_BLOB + EXTRA_FIELDS_PER_BLOB; -global FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB: u32 = EXTRA_FIELDS_PER_BLOB * 254; // EXTRA_FIELDS_PER_BLOB * 254 = 4064. So the first 4064 bls Fr fields in the blob will carry an extra bit in their 255th bit position, that will be used to reconstitute 16 extra fields. -global D: F = BigNum { limbs: [4096, 0, 0] }; -global D_INV = BigNum { limbs: [0x686828bfce5c19400fffff00100001, 0x6878b46ae3705eb6a46a89213de7d3, 0x73e6] }; +// TODO(#9982): Delete unconstrained_config.nr and go back to using this file - calculating ROOTS in unconstrained is insecure. -global ROOTS: [F; FIELDS_PER_BLOB] = [ - BigNum { limbs: [ 0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000 ] } , - BigNum { limbs: [ 0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed ] } , - BigNum { limbs: [ 0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000 ] } , - BigNum { limbs: [ 0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed ] } , - BigNum { limbs: [ 0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457 ] } , - BigNum { limbs: [ 0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96 ] } , - BigNum { limbs: [ 0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333 ] } , - BigNum { limbs: [ 0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9 ] } , - BigNum { limbs: [ 0xbeb312f20b6f7653ea61d87742bcce, 0xce9140267af9dd1c0af834cec32c17, 0x0020b1 ] } , - BigNum { limbs: [ 0xfef0f00df2ec88ac159e2688bd4333, 0xd8c1e977024e561dcd0fd4d314d93b, 0x00533b ] } , - BigNum { limbs: [ 0xf4e672ebc1e1bb95df4b360411fe73, 0x596e753e4fcc6e92a9c460afca4a1e, 0x004f2c ] } , - BigNum { limbs: [ 0xc8bd90143c7a436a20b4c8fbee018e, 0x4de4b45f2d7bc4a72e43a8f20dbb34, 0x0024c1 ] } , - BigNum { limbs: [ 0x7a6b6cfb0faca4807b811a823f728d, 0x919ec91f38ac5ccd4631f16edba496, 0x001edc ] } , - BigNum { limbs: [ 0x43389604eeaf5a7f847ee47dc08d74, 0x15b4607e449bd66c91d61832fc60bd, 0x005511 ] } , - BigNum { limbs: [ 0xbc96af334c36bca1abb31fb37786b9, 0xf2dd7e0c63fccabf643eda8951f257, 0x0038c7 ] } , - BigNum { limbs: [ 0x010d53ccb225425e544cdf4c887948, 0xb475ab91194b687a73c92f188612fc, 0x003b25 ] } , - BigNum { limbs: [ 0x6e88fb4c38fb8a360c60997369df4e, 0x903a157988bab4bcd40e22f55448bf, 0x0050e0 ] } , - BigNum { limbs: [ 0x4f1b07b3c56074c9f39f658c9620b3, 0x17191423f48d7e7d03f9e6ac83bc94, 0x00230d ] } , - BigNum { limbs: [ 0xbc7f62d13a6e1c3ec50c9031a36ca3, 0xc5837cb5fca206050b5832d1099726, 0x0065f6 ] } , - BigNum { limbs: [ 0x0124a02ec3ede2c13af36ece5c935e, 0xe1cface780a62d34ccafd6d0ce6e2d, 0x000df6 ] } , - BigNum { limbs: [ 0x3dc46688b5e11768cc0c58459f155b, 0x0457c83a7d9c5aea51f540eb0c0496, 0x002c7e ] } , - BigNum { limbs: [ 0x7fdf9c77487ae79733f3a6ba60eaa6, 0xa2fb6162ffabd84f8612c8b6cc00bd, 0x00476f ] } , - BigNum { limbs: [ 0xe943612401899720d4ed194fccfeb9, 0xda18a9d30564a8f0cfd2438f018c01, 0x005303 ] } , - BigNum { limbs: [ 0xd460a1dbfcd267df2b12e5b0330148, 0xcd3a7fca77e38a490835c612d67951, 0x0020e9 ] } , - BigNum { limbs: [ 0x317ae6451bb89de69679532ae1234c, 0x237e58fcced486fa69d8e4e48506e3, 0x000461 ] } , - BigNum { limbs: [ 0x8c291cbae2a361196986abd51edcb5, 0x83d4d0a0ae73ac3f6e2f24bd52fe70, 0x006f8c ] } , - BigNum { limbs: [ 0x593d6ff6dab086ee5bcecc4e7773cb, 0xb16caf96816fa3a95d2d4016e2bd45, 0x00047c ] } , - BigNum { limbs: [ 0x6466930923ab7811a43132b1888c36, 0xf5e67a06fbd88f907adac98af5480e, 0x006f70 ] } , - BigNum { limbs: [ 0xa6d195014b641082e68bc0bc50a88f, 0x5bb8ed54ae00468b04010fa5c79f62, 0x0056f3 ] } , - BigNum { limbs: [ 0x16d26dfeb2f7ee7d19743e43af5772, 0x4b9a3c48cf47ecaed406f9fc1065f1, 0x001cfa ] } , - BigNum { limbs: [ 0x452d43f6d5756f51cb57e0e3035d15, 0xb9c6e6797777851425ea12dcacdae7, 0x001579 ] } , - BigNum { limbs: [ 0x7876bf0928e68fae34a81e1cfca2ec, 0xed8c432405d0ae25b21df6c52b2a6c, 0x005e73 ] } , - BigNum { limbs: [ 0x967f4be2f951558140d032f0a9ee53, 0x6345ec055e4d14a1e27164d8fdbd2d, 0x0045af ] } , - BigNum { limbs: [ 0x2724b71d050aa97ebf2fcc0f5611ae, 0x440d3d981efb1e97f596a4c8da4826, 0x002e3e ] } , - BigNum { limbs: [ 0xf20a6f5e1709899ddf46bac40ac8e4, 0x300e9079af0b916f129332ba2dfc0b, 0x0028eb ] } , - BigNum { limbs: [ 0xcb9993a1e752756220b9443bf5371d, 0x77449923ce3ca1cac574d6e7aa0947, 0x004b02 ] } , - BigNum { limbs: [ 0xdc0ae311f00af48469ef4d246b6883, 0xad6a79b61c1a71d544f7800a7e4ae4, 0x005391 ] } , - BigNum { limbs: [ 0xe1991fee0e510a7b9610b1db94977e, 0xf9e8afe7612dc1649310899759ba6e, 0x00205b ] } , - BigNum { limbs: [ 0x2e4312e6011bf5d941e9338fb466f7, 0x0520cdfb5d9d6c54cb86cdf73e9123, 0x0044ed ] } , - BigNum { limbs: [ 0x8f60f019fd400926be16cb704b990a, 0xa2325ba21faac6e50c813baa997430, 0x002f00 ] } , - BigNum { limbs: [ 0x12abf7f3a89e7acf065a270f3c324f, 0x64fb4536c4fcf6ad66524f0376d9e4, 0x0054fa ] } , - BigNum { limbs: [ 0xaaf80b0c55bd8430f9a5d7f0c3cdb2, 0x4257e466b84b3c8c71b5ba9e612b6f, 0x001ef3 ] } , - BigNum { limbs: [ 0x2a70a615d0b8e4d2fc5e69ac5db47f, 0x40ac57f86f5e293b1d67bc8de5d9a1, 0x000e48 ] } , - BigNum { limbs: [ 0x93335cea2da31a2d03a19553a24b82, 0x66a6d1a50dea09febaa04d13f22bb2, 0x0065a5 ] } , - BigNum { limbs: [ 0x1f590ef73ba2bdc0f1357a508e5e7b, 0x00aba73798bfaf59d0fc7261da7291, 0x0058c4 ] } , - BigNum { limbs: [ 0x9e4af408c2b9413f0eca84af71a186, 0xa6a78265e48883e0070b973ffd92c2, 0x001b29 ] } , - BigNum { limbs: [ 0x02e4e461e72e18ddc3b03ea91bc267, 0x785206b5761a878d670fcb570ab3b8, 0x006358 ] } , - BigNum { limbs: [ 0xbabf1e9e172de6223c4fc056e43d9a, 0x2f0122e8072dabac70f83e4acd519b, 0x001095 ] } , - BigNum { limbs: [ 0xc3ebf43c92a949a4593e1acca2cb6c, 0x8adc7bff16bae3ee1645113940cf46, 0x0053c7 ] } , - BigNum { limbs: [ 0xf9b80ec36bb2b55ba6c1e4335d3495, 0x1c76ad9e668d4f4bc1c2f86897360c, 0x002026 ] } , - BigNum { limbs: [ 0xe74ba2b75ca477f44e14739932aa33, 0x508a14adf95959d7d47f20aa9f0259, 0x0037d3 ] } , - BigNum { limbs: [ 0xd6586048a1b7870bb1eb8b66cd55ce, 0x56c914ef83eed9620388e8f73902f9, 0x003c1a ] } , - BigNum { limbs: [ 0x9f1f01e2bbf0ac476e05bf67d4973c, 0xcc64ae610371dcd9ce528178852eaf, 0x005a50 ] } , - BigNum { limbs: [ 0x1e85011d426b52b891fa3f982b68c5, 0xdaee7b3c79d6566009b5882952d6a4, 0x00199c ] } , - BigNum { limbs: [ 0x1ae51df978cc3878f4ee1de45ab2f2, 0x03824bef73c976407b9926e20836d2, 0x006e57 ] } , - BigNum { limbs: [ 0xa2bee506858fc6870b11e11ba54d0f, 0xa3d0ddae097ebcf95c6ee2bfcfce81, 0x000596 ] } , - BigNum { limbs: [ 0x7493f160ce4cb729b4cb21179cfb0e, 0x79931cfdd8947f799cf20f675fde6a, 0x00036b ] } , - BigNum { limbs: [ 0x4910119f300f47d64b34dde86304f3, 0x2dc00c9fa4b3b3c03b15fa3a7826e9, 0x007082 ] } , - BigNum { limbs: [ 0x0664a566a603f98c15c05b1901cef2, 0xed2ec80a4115f20c57f6d7dc953305, 0x000afc ] } , - BigNum { limbs: [ 0xb73f5d9958580573ea3fa3e6fe310f, 0xba2461933c32412d801131c542d24e, 0x0068f0 ] } , - BigNum { limbs: [ 0xe20d3cfc83311c0727b36db1974ef4, 0xd5fd4e2f04c5e7caaba64af676214e, 0x0028c6 ] } , - BigNum { limbs: [ 0xdb96c6037b2ae2f8d84c914e68b10d, 0xd155db6e78824b6f2c61beab61e404, 0x004b26 ] } , - BigNum { limbs: [ 0x36750f231bcd8672d73ebbe97445d5, 0x9ddec7fa8e98e4b5243a8bda7ca378, 0x000fe0 ] } , - BigNum { limbs: [ 0x872ef3dce28e788d28c143168bba2c, 0x097461a2eeaf4e84b3cd7dc75b61db, 0x00640d ] } , - BigNum { limbs: [ 0xd0caac87f5713c5130c2c1660125be, 0x111413588742b7c68b4d7fdd60d098, 0x006898 ] } , - BigNum { limbs: [ 0xecd9567808eac2aecf3d3d99feda43, 0x963f1644f6057b734cba89c47734ba, 0x000b55 ] } , - BigNum { limbs: [ 0x30a34e5e4c7a31a0927a327c751043, 0x983de0110e23413ff88848100458b8, 0x0030d2 ] } , - BigNum { limbs: [ 0x8d00b4a1b1e1cd5f6d85cc838aefbe, 0x0f15498c6f24f1f9df7fc191d3ac9b, 0x00431b ] } , - BigNum { limbs: [ 0x1e0777f7ef73e32ef7664cb2440ed4, 0xf5b7cb3dee5f01fe51c5b744878f5d, 0x00510d ] } , - BigNum { limbs: [ 0x9f9c8b080ee81bd10899b24dbbf12d, 0xb19b5e5f8ee9313b8642525d5075f6, 0x0022df ] } , - BigNum { limbs: [ 0x608393655b6d323eae9752b92f9726, 0x1a173d90ba01c42ee040e5579a63af, 0x0015ae ] } , - BigNum { limbs: [ 0x5d206f9aa2eeccc15168ac46d068db, 0x8d3bec0cc3466f0af7c7244a3da1a4, 0x005e3f ] } , - BigNum { limbs: [ 0x136819ab9c98a27528d588439e5b12, 0x3ae1cc22ee66ae3320a20450eb9bbf, 0x001a8f ] } , - BigNum { limbs: [ 0xaa3be95461c35c8ad72a76bc61a4ef, 0x6c715d7a8ee18506b7660550ec6994, 0x00595e ] } , - BigNum { limbs: [ 0xb0deac619bda2d4000b0b3767c9928, 0x0b00588ed2cf8b98c6ffcd682aa219, 0x0035c6 ] } , - BigNum { limbs: [ 0x0cc5569e6281d1bfff4f4b898366d9, 0x9c52d10eaa78a7a111083c39ad633a, 0x003e27 ] } , - BigNum { limbs: [ 0x95392351a789a318d303a266992f63, 0x6bb22f520df225302664820cb7fbf4, 0x00058e ] } , - BigNum { limbs: [ 0x286adfae56d25be72cfc5c9966d09e, 0x3ba0fa4b6f560e09b1a3879520095f, 0x006e5f ] } , - BigNum { limbs: [ 0x47df05ce549e034eb4bb5cc301906f, 0xace8a4aeb40b597e225a1da4156c04, 0x007144 ] } , - BigNum { limbs: [ 0x75c4fd31a9bdfbb14b44a23cfe6f92, 0xfa6a84eec93cd9bbb5adebfdc2994f, 0x0002a8 ] } , - BigNum { limbs: [ 0x7d9fd5726f6b40ed9fa5c032ec0a23, 0xa72e47136966a4512dec6b0a03377e, 0x005f2f ] } , - BigNum { limbs: [ 0x40042d8d8ef0be12605a3ecd13f5de, 0x0024e28a13e18ee8aa1b9e97d4cdd5, 0x0014be ] } , - BigNum { limbs: [ 0x3accee4e32febaa4f1f87d90884c5a, 0x5f6ba59c3994a84b028e307c93637f, 0x002254 ] } , - BigNum { limbs: [ 0x82d714b1cb5d445b0e07816f77b3a7, 0x47e7840143b38aeed579d92544a1d4, 0x005199 ] } , - BigNum { limbs: [ 0x9fa49ec41505c948af25b254d71df9, 0xdf508052e8d9a67bb3d018ed258f03, 0x006c1c ] } , - BigNum { limbs: [ 0x1dff643be95635b750da4cab28e208, 0xc802a94a946e8cbe2437f0b4b27650, 0x0007d0 ] } , - BigNum { limbs: [ 0x0af27f081250e5bddd6dacba0b1d06, 0x9b0b4fa4971529805a2b04c50efc33, 0x005b75 ] } , - BigNum { limbs: [ 0xb2b183f7ec0b194222925245f4e2fb, 0x0c47d9f8e63309b97ddd04dcc90920, 0x001878 ] } , - BigNum { limbs: [ 0xffeee172f8ac74095e328eda2f8e5c, 0x8571ac60a4ce0468b4bb2b446edda9, 0x002904 ] } , - BigNum { limbs: [ 0xbdb5218d05af8af6a1cd7025d071a5, 0x21e17d3cd87a2ed1234cde5d6927a9, 0x004ae9 ] } , - BigNum { limbs: [ 0xfd4ee83f1b2499dbe21753938adf74, 0x09b8f9797bc1d44db4c7e28c3f15cb, 0x001aa9 ] } , - BigNum { limbs: [ 0xc0551ac0e33765241de8ab6c75208d, 0x9d9a302401865eec2340271598ef87, 0x005944 ] } , - BigNum { limbs: [ 0xfb82877b46d20d3f0ffba2ea149337, 0x83626bca158c398677e14a8cb7e715, 0x005815 ] } , - BigNum { limbs: [ 0xc2217b84b789f1c0f0045c15eb6cca, 0x23f0bdd367bbf9b36026bf15201e3d, 0x001bd8 ] } , - BigNum { limbs: [ 0xf0a42ec0e52a48c009cf2b0763b3d5, 0x72b23615cf703897e487b9c664354a, 0x0054b5 ] } , - BigNum { limbs: [ 0xccffd43f1931b63ff630d3f89c4c2c, 0x34a0f387add7faa1f3804fdb73d008, 0x001f38 ] } , - BigNum { limbs: [ 0xbdbdcad82928c864e8c456229dfdef, 0xd2940967b1a207e780cc7312dd5371, 0x0067ad ] } , - BigNum { limbs: [ 0xffe63827d533369b173ba8dd620212, 0xd4bf2035cba62b52573b968efab1e1, 0x000c3f ] } , - BigNum { limbs: [ 0x4b0f40448ca04c44568101d845f71f, 0x150315161c3e6e8ba6f2374a655d9d, 0x005318 ] } , - BigNum { limbs: [ 0x7294c2bb71bbb2bba97efd27ba08e2, 0x925014876109c4ae3115d25772a7b6, 0x0020d5 ] } , - BigNum { limbs: [ 0xe21a225b58e59f1d3e494f87fd6d91, 0x8bf565feb0f7bdf7f8f0d267d1ae2a, 0x00249a ] } , - BigNum { limbs: [ 0xdb89e0a4a5765fe2c1b6af78029270, 0x1b5dc39ecc507541df17373a065728, 0x004f53 ] } , - BigNum { limbs: [ 0x94a89651aca0ff810d9cff570736e9, 0x46355ac0cbecc13494e5cc0ae758c6, 0x006c43 ] } , - BigNum { limbs: [ 0x28fb6cae51baff7ef262ffa8f8c918, 0x611dcedcb15b720543223d96f0ac8d, 0x0007aa ] } , - BigNum { limbs: [ 0x9486bb67912a2b440dab45cd1fac5b, 0x03d7743e9a0675583bdb136e9f86e1, 0x001a9d ] } , - BigNum { limbs: [ 0x291d47986d31d3bbf254b932e053a6, 0xa37bb55ee341bde19c2cf633387e72, 0x005950 ] } , - BigNum { limbs: [ 0x6fb582ac74db12571ba2fccf28601b, 0xfa8d52f970ba51420be43501370b16, 0x001996 ] } , - BigNum { limbs: [ 0x4dee80538980eca8e45d0230d79fe6, 0xacc5d6a40c8de1f7cc23d4a0a0fa3d, 0x005a56 ] } , - BigNum { limbs: [ 0x8a65bc0f8e4d1ecdd815ee4d942bee, 0xa05ea5c70ef50d10f88231dde2f6e1, 0x003336 ] } , - BigNum { limbs: [ 0x333e46f0700ee03227ea10b26bd413, 0x06f483d66e532628df85d7c3f50e72, 0x0040b7 ] } , - BigNum { limbs: [ 0x56ab6223eff0406e175e44c490cbc0, 0x7a32e902f9e85187145dfaed820595, 0x0059dc ] } , - BigNum { limbs: [ 0x66f8a0dc0e6bbe91e8a1ba3b6f3441, 0x2d20409a835fe1b2c3aa0eb455ffbe, 0x001a11 ] } , - BigNum { limbs: [ 0x4492b6f43bb51eca7dadda50f555e4, 0x9040823a88e7b6a42eb341ff879cb0, 0x006025 ] } , - BigNum { limbs: [ 0x79114c0bc2a6e035825224af0aaa1d, 0x1712a762f4607c95a954c7a25068a3, 0x0013c8 ] } , - BigNum { limbs: [ 0xc85f7efbd6188bb08956f964517062, 0x2b7d27b4c23e09768a7087f0cc2629, 0x001356 ] } , - BigNum { limbs: [ 0xf54484042843734f76a9059bae8f9f, 0x7bd601e8bb0a29c34d9781b10bdf29, 0x006097 ] } , - BigNum { limbs: [ 0xae4a21d39a23bee9dc91a650a90e49, 0x59d76ca02af7f2f3e98766f8c9185c, 0x0016c3 ] } , - BigNum { limbs: [ 0x0f59e12c64384016236e58af56f1b8, 0x4d7bbcfd52504045ee80a2a90eecf7, 0x005d2a ] } , - BigNum { limbs: [ 0xc708b8b84ee699a565af7a806913be, 0x169d8ee087328d16baf2bdd5e94641, 0x002db7 ] } , - BigNum { limbs: [ 0xf69b4a47af75655a9a50847f96ec43, 0x90b59abcf615a6231d154bcbeebf11, 0x004636 ] } , - BigNum { limbs: [ 0xfb135ff413a356d5f57c79b59b2332, 0x73726e9409979c7943d6a33bc39345, 0x0061f2 ] } , - BigNum { limbs: [ 0xc290a30beab8a82a0a83854a64dccf, 0x33e0bb0973b096c09431666614720d, 0x0011fb ] } , - BigNum { limbs: [ 0x71082d2903a1ac633d3e92c7ca8ccf, 0x59c69ed3df9941205e1bb9264c6a7c, 0x003c9f ] } , - BigNum { limbs: [ 0x4c9bd5d6faba529cc2c16c38357332, 0x4d8c8ac99daef21979ec507b8b9ad7, 0x00374e ] } , - BigNum { limbs: [ 0x409954448fd0a2dbcc4af4074489e8, 0xe4668304bec207238a67fd3278fde6, 0x001bce ] } , - BigNum { limbs: [ 0x7d0aaebb6e8b5c2433b50af8bb7619, 0xc2eca698be862c164da00c6f5f076d, 0x00581e ] } , - BigNum { limbs: [ 0x3c9d94a870e33f9df832cfdf2062ef, 0xb766f5943eadc0dcf3788fe23b2f53, 0x001325 ] } , - BigNum { limbs: [ 0x81066e578d78bf6207cd2f20df9d12, 0xefec34093e9a725ce48f79bf9cd600, 0x0060c7 ] } , - BigNum { limbs: [ 0x0865a899e8deff4935bd2f817f694b, 0x4098e2e9f12e6b368121ac0cf4ad0a, 0x004f9b ] } , - BigNum { limbs: [ 0xb53e5a66157cffb6ca42cf7e8096b6, 0x66ba46b38c19c80356e65d94e35849, 0x002452 ] } , - BigNum { limbs: [ 0x505ce32828420562b851e3d2a34df5, 0x0aa154b7afb7604ccbce3186331764, 0x00663d ] } , - BigNum { limbs: [ 0x6d471fd7d619f99d47ae1b2d5cb20c, 0x9cb1d4e5cd90d2ed0c39d81ba4edef, 0x000db0 ] } , - BigNum { limbs: [ 0x39e2b6fbd943d0adc24eba36b7578e, 0x29432977ae6a072570e877993c3d74, 0x005a06 ] } , - BigNum { limbs: [ 0x83c14c0425182e523db144c948a873, 0x7e100025cede2c14671f92089bc7df, 0x0019e7 ] } , - BigNum { limbs: [ 0xcc59c903893ca8829235424bc52016, 0x03442f2fb2879a8a9d78c4fed2b2ba, 0x004d35 ] } , - BigNum { limbs: [ 0xf14a39fc751f567d6dcabcb43adfeb, 0xa40efa6dcac098af3a8f44a3055298, 0x0026b8 ] } , - BigNum { limbs: [ 0x8469e061a1c6905718b817f3ccad48, 0x97adfcf78a922bf7a6f6d02f061235, 0x005335 ] } , - BigNum { limbs: [ 0x393a229e5c956ea8e747e70c3352b9, 0x0fa52ca5f2b6074231113972d1f31e, 0x0020b8 ] } , - BigNum { limbs: [ 0x275f891994324c998731ee0c78437a, 0x57052117e1e151ea52ef08f1e06c38, 0x004ba3 ] } , - BigNum { limbs: [ 0x964479e66a29b26678ce10f387bc87, 0x504e08859b66e14f851900aff7991b, 0x00284a ] } , - BigNum { limbs: [ 0xdcd43dec9acd7108993b54226b7f93, 0x3f58561023a7fa481d537345cf6530, 0x004208 ] } , - BigNum { limbs: [ 0xe0cfc513638e8df766c4aadd94806e, 0x67fad38d59a038f1bab4965c08a022, 0x0031e5 ] } , - BigNum { limbs: [ 0xb309ae850664dec3e268216bdc4a30, 0x6d8cebced82bc53c32396daedbf90a, 0x000c11 ] } , - BigNum { limbs: [ 0x0a9a547af7f7203c1d97dd9423b5d1, 0x39c63dcea51c6dfda5ce9bf2fc0c49, 0x0067dc ] } , - BigNum { limbs: [ 0x10ed5bae398c9c164881d4baa8a72e, 0x37284ec1415dde48a52a93151b352e, 0x004432 ] } , - BigNum { limbs: [ 0xacb6a751c4cf62e9b77e2a455758d3, 0x702adadc3bea54f132dd768cbcd025, 0x002fbb ] } , - BigNum { limbs: [ 0x7fcad29e98164375352d72a0c9539a, 0xe61a3a2a9b39fcf3ec5eda0ddb53a0, 0x0042a2 ] } , - BigNum { limbs: [ 0x3dd930616645bb8acad28c5f36ac67, 0xc138ef72e20e3645eba92f93fcb1b3, 0x00314a ] } , - BigNum { limbs: [ 0x72c833e4cf3499ecbf5d6f01ea2fe8, 0xdb96249a23e969ac30e42135fbc427, 0x00485a ] } , - BigNum { limbs: [ 0x4adbcf1b2f27651340a28ffe15d019, 0xcbbd0503595ec98da723e86bdc412c, 0x002b92 ] } , - BigNum { limbs: [ 0xf67b913ee947b92fef56114b49c75d, 0x15ee4db709aa6e492ff0b0d05658b6, 0x0002b3 ] } , - BigNum { limbs: [ 0xc72871c1151445d010a9edb4b638a4, 0x9164dbe6739dc4f0a81758d181ac9c, 0x00713a ] } , - BigNum { limbs: [ 0x576cd5a085170dfba96832adfa9266, 0x0f08c01d85df59b31745ff67db9e8b, 0x004e34 ] } , - BigNum { limbs: [ 0x66372d5f7944f1045697cc52056d9b, 0x984a697ff768d986c0c20a39fc66c8, 0x0025b9 ] } , - BigNum { limbs: [ 0x0bf5a0bea3c2ee335ab15ecceb6a2d, 0xf883ceaa889c7f2b1554800870c74e, 0x005daf ] } , - BigNum { limbs: [ 0xb1ae62415a9910cca54ea0331495d4, 0xaecf5af2f4abb40ec2b38999673e05, 0x00163d ] } , - BigNum { limbs: [ 0xce26afb69019f7ee3b38a3813633f1, 0xacd7204034884021f50f21b39e1d96, 0x006743 ] } , - BigNum { limbs: [ 0xef7d53496e420711c4c75b7ec9cc10, 0xfa7c095d48bff317e2f8e7ee39e7bc, 0x000ca9 ] } , - BigNum { limbs: [ 0xa0eb428f0d8dccd165b2490ec7254e, 0x4dd24ebf1658766f71f92679eccdd9, 0x000959 ] } , - BigNum { limbs: [ 0x1cb8c070f0ce322e9a4db5f138dab3, 0x5980dade66efbcca660ee327eb377a, 0x006a94 ] } , - BigNum { limbs: [ 0x8df3051d69e220022193b333c3b855, 0x287007cdc98e2e1a54f5ed6dac0e6e, 0x003683 ] } , - BigNum { limbs: [ 0x2fb0fde29479defdde6c4bcc3c47ac, 0x7ee321cfb3ba051f83121c342bf6e5, 0x003d6a ] } , - BigNum { limbs: [ 0xafcb31434545d82efcfdaf4e265ab7, 0xb48988b9dbae9a54b1f2bebcea8bca, 0x002fb2 ] } , - BigNum { limbs: [ 0x0dd8d1bcb91626d103024fb1d9a54a, 0xf2c9a0e3a19998e526154ae4ed7989, 0x00443a ] } , - BigNum { limbs: [ 0x730e303c173e1c090bcdd715521bb1, 0x7940ac524648faaf9f04b421b462f2, 0x0046aa ] } , - BigNum { limbs: [ 0x4a95d2c3e71de2f6f43227eaade450, 0x2e127d4b36ff388a3903558023a261, 0x002d43 ] } , - BigNum { limbs: [ 0xa69d8f42e2c25b26dd05e4c4aec099, 0x5a6d7f643b5a2dee35b6cf12739eaf, 0x003dc4 ] } , - BigNum { limbs: [ 0x170673bd1b99a3d922fa1a3b513f68, 0x4ce5aa3941ee054ba2513a8f6466a4, 0x003629 ] } , - BigNum { limbs: [ 0x3d29335383e69a148277eef8c0a297, 0x64192e295d851bd07fc9fc34abead9, 0x00328f ] } , - BigNum { limbs: [ 0x807acfac7a7564eb7d8810073f5d6a, 0x4339fb741fc31769583e0d6d2c1a7a, 0x00415e ] } , - BigNum { limbs: [ 0x2c84f3154125602cabadec2fe322b8, 0xda59a33dcbf232a732ae1a3b0aef75, 0x002e95 ] } , - BigNum { limbs: [ 0x911f0feabd369ed3545212d01cdd49, 0xccf9865fb1560092a559ef66cd15de, 0x004557 ] } , - BigNum { limbs: [ 0x7570b00fca5c9a520c8c4d748fb509, 0x55665267f0974b35861cb1da153a8b, 0x003d06 ] } , - BigNum { limbs: [ 0x483352f033ff64adf373b18b704af8, 0x51ecd7358cb0e80451eb57c7c2cac8, 0x0036e7 ] } , - BigNum { limbs: [ 0x330977b7a8bfe99ca730e689c0bf9e, 0x7d2fce8520d1f5109fa0d7553d937a, 0x0000aa ] } , - BigNum { limbs: [ 0x8a9a8b48559c156358cf18763f4063, 0x2a235b185c763e293867324c9a71d9, 0x007343 ] } , - BigNum { limbs: [ 0x4628b567af1bb4e3d5dbe0d2f73e41, 0xb74a12568801be1e72f2066186fa64, 0x006eca ] } , - BigNum { limbs: [ 0x777b4d984f404a1c2a241e2d08c1c0, 0xf0091746f546751b65160340510aef, 0x000522 ] } , - BigNum { limbs: [ 0x5f56946340fdfc3b2bcdccf1ec7b16, 0x9e7e1c0691a3bae4d7a5261114f26f, 0x0055e2 ] } , - BigNum { limbs: [ 0x5e4d6e9cbd5e02c4d432320e1384eb, 0x08d50d96eba478550062e390c312e4, 0x001e0b ] } , - BigNum { limbs: [ 0x01cd8bef1b22603e16064aa9a77770, 0x214dfb1c37d97fb60b67a741a4eee4, 0x006635 ] } , - BigNum { limbs: [ 0xbbd67710e3399ec1e9f9b456588891, 0x86052e81456eb383cca0626033166f, 0x000db8 ] } , - BigNum { limbs: [ 0xab3ea313c630b6754ceec2fde25881, 0x29cbca5aa4231b2b2fbdb88c0832f1, 0x002043 ] } , - BigNum { limbs: [ 0x12655fec382b488ab3113c021da780, 0x7d875f42d925180ea84a5115cfd262, 0x0053aa ] } , - BigNum { limbs: [ 0x54e5045f96bdb5b46b6df596ba6ecf, 0xd3064ba6d18615e83527ce053b131c, 0x0055e9 ] } , - BigNum { limbs: [ 0x68befea0679e494b94920969459132, 0xd44cddf6abc21d51a2e03b9c9cf237, 0x001e03 ] } , - BigNum { limbs: [ 0x54642678ea64b7408a86452d1142b4, 0x14a479d7e1869cfafd436d7b412b06, 0x005c62 ] } , - BigNum { limbs: [ 0x693fdc8713f747bf7579b9d2eebd4d, 0x92aeafc59bc1963edac49c2696da4d, 0x00178b ] } , - BigNum { limbs: [ 0x771d65b2ee56d3198a034b1e705c0e, 0x117113c5d5a3e04369454396c3893c, 0x00255c ] } , - BigNum { limbs: [ 0x46869d4d10052be675fcb3e18fa3f3, 0x95e215d7a7a452f66ec2c60b147c17, 0x004e91 ] } , - BigNum { limbs: [ 0xc93f37bda7b84b0c06f42c4fa19fd3, 0xbb72051a32b8635dba604a48d7ba10, 0x003d0b ] } , - BigNum { limbs: [ 0xf464cb4256a3b3f3f90bd2b05e602e, 0xebe124834a8fcfdc1da7bf59004b42, 0x0036e1 ] } , - BigNum { limbs: [ 0x7d52a475e8ce1152a4c44c49a49f1e, 0x1bd32e1843bc1a3ef55558b56d6d42, 0x006dee ] } , - BigNum { limbs: [ 0x40515e8a158dedad5b3bb2b65b60e3, 0x8b7ffb85398c18fae2b2b0ec6a9811, 0x0005ff ] } , - BigNum { limbs: [ 0x4ef4c6bf3fe0c6c7ea608db8cd652c, 0x7ca6fc96f67ff5389b96856be8b140, 0x001df5 ] } , - BigNum { limbs: [ 0x6eaf3c40be7b3838159f7147329ad5, 0x2aac2d0686c83e013c718435ef5413, 0x0055f8 ] } , - BigNum { limbs: [ 0x38cc4f07468cebd78b1ef5748164e7, 0x56c04012bb93b8a0671498f387398d, 0x005e68 ] } , - BigNum { limbs: [ 0x84d7b3f8b7cf132874e1098b7e9b1a, 0x5092e98ac1b47a9970f370ae50cbc6, 0x001585 ] } , - BigNum { limbs: [ 0x6041cee0c4bdac8586e7bf3217bc38, 0x75545a9dcb2faf33b868f0e27d4ed6, 0x000a79 ] } , - BigNum { limbs: [ 0x5d62341f399e527a79183fcde843c9, 0x31feceffb21884061f9f18bf5ab67d, 0x006974 ] } , - BigNum { limbs: [ 0x8111d9b58068eda22cb0c0043581b8, 0x5f69535823b4eea87dbd8b3e7293c0, 0x004118 ] } , - BigNum { limbs: [ 0x3c92294a7df3115dd34f3efbca7e49, 0x47e9d645599344915a4a7e63657193, 0x0032d5 ] } , - BigNum { limbs: [ 0x01fb897d05b8538dfcd4912667f55f, 0x2898a7c259a810a20368471f6635e8, 0x0064e3 ] } , - BigNum { limbs: [ 0xbba87982f8a3ab72032b6dd9980aa2, 0x7eba81db23a02297d49fc28271cf6b, 0x000f0a ] } , - BigNum { limbs: [ 0x6cbfc87f549eb20f15758baad3fcf4, 0x7eef82a73dc4782fd931be0cba8ab0, 0x0018e1 ] } , - BigNum { limbs: [ 0x50e43a80a9bd4cf0ea8a73552c030d, 0x2863a6f63f83bb09fed64b951d7aa3, 0x005b0c ] } , - BigNum { limbs: [ 0x04a2294bb265301622dd5a6889a8e8, 0x0e0589dd793aa51bfee012ab18ba91, 0x00362f ] } , - BigNum { limbs: [ 0xb901d9b44bf6cee9dd22a497765719, 0x994d9fc0040d8e1dd927f6f6bf4ac2, 0x003dbe ] } , - BigNum { limbs: [ 0x1b8dd0e729d15d3f10f3a9abb257e1, 0x83b64fd60550e6c6e2fafbc3c935b1, 0x003718 ] } , - BigNum { limbs: [ 0xa2163218d48aa1c0ef0c55544da820, 0x239cd9c777f74c72f50d0dde0ecfa2, 0x003cd5 ] } , - BigNum { limbs: [ 0xc59162052451257675b5beeb6153ca, 0x7850ce28f03eea18ac2f59bed4eb36, 0x004405 ] } , - BigNum { limbs: [ 0xf812a0fada0ad9898a4a40149eac37, 0x2f025b748d0949212bd8afe3031a1c, 0x002fe8 ] } , - BigNum { limbs: [ 0x80f5ffdc6ac2e316a9e3e795d08887, 0xba2e026f2459a189d7e4af45dab593, 0x000688 ] } , - BigNum { limbs: [ 0x3cae032393991be9561c176a2f777a, 0xed25272e58ee91b000235a5bfd4fc0, 0x006d64 ] } , - BigNum { limbs: [ 0x78af6ba70b7705f1af8f454525fd66, 0xb1110b25238c7d7128741250354861, 0x004c33 ] } , - BigNum { limbs: [ 0x44f49758f2e4f90e5070b9bada029b, 0xf6421e7859bbb5c8af93f751a2bcf2, 0x0027b9 ] } , - BigNum { limbs: [ 0x3ec884963a020ab3e6eed5afa1109b, 0xced439e3c7897f5870bc08c4081661, 0x005db4 ] } , - BigNum { limbs: [ 0x7edb7e69c459f44c191129505eef66, 0xd87eefb9b5beb3e1674c00ddcfeef2, 0x001638 ] } , - BigNum { limbs: [ 0xffa1a105df6b8a7429c1fa7a88c247, 0xe1cbced44b4c46145a561c41e22acf, 0x000701 ] } , - BigNum { limbs: [ 0xbe0261fa1ef0748bd63e0485773dba, 0xc5875ac931fbed257db1ed5ff5da83, 0x006ceb ] } , - BigNum { limbs: [ 0x72266b93838c16cd4b696e7ea423f1, 0x1336b5ca226c34c543b8647ce9de4c, 0x000c72 ] } , - BigNum { limbs: [ 0x4b7d976c7acfe832b49690815bdc10, 0x941c73d35adbfe74944fa524ee2707, 0x00677b ] } , - BigNum { limbs: [ 0x6a4f579172314a0ff8423daf2fdb50, 0xfcd83aa5a469524e3a763bb50b0994, 0x0054c0 ] } , - BigNum { limbs: [ 0x5354ab6e8c2ab4f007bdc150d024b1, 0xaa7aeef7d8dee0eb9d91cdecccfbbf, 0x001f2c ] } , - BigNum { limbs: [ 0x2feb30d6711c70e95f38660e9d1536, 0xd7d20dac46ed6eae360ede81eba8db, 0x000832 ] } , - BigNum { limbs: [ 0x8db8d2298d3f8e16a0c798f162eacb, 0xcf811bf1365ac48ba1f92b1fec5c78, 0x006bba ] } , - BigNum { limbs: [ 0x0e24ef2f570c8a24438957b3e25619, 0x0e58dcdd8ce7f82295c732d111a2b2, 0x001a66 ] } , - BigNum { limbs: [ 0xaf7f13d0a74f74dbbc76a74c1da9e8, 0x98fa4cbff0603b174240d6d0c662a1, 0x005987 ] } , - BigNum { limbs: [ 0xa33e0d6b4dc2d87ee857bf1f253512, 0x8b55856bf49320c8b3bf4746e7abf6, 0x004877 ] } , - BigNum { limbs: [ 0x1a65f594b099268117a83fe0dacaef, 0x1bfda43188b512712448c25af0595d, 0x002b76 ] } , - BigNum { limbs: [ 0x1764ae9a77652c25c83bb50749f0af, 0x7bc7ac9a877903f012dba811a16818, 0x005e0b ] } , - BigNum { limbs: [ 0xa63f546586f6d2da37c449f8b60f52, 0x2b8b7d02f5cf2f49c52c6190369d3b, 0x0015e2 ] } , - BigNum { limbs: [ 0xca8e5c4d2dc5ffd2878366fcec15ba, 0x702dd52769aebdb6bf288d790d89bd, 0x005d19 ] } , - BigNum { limbs: [ 0xf315a6b2d095ff2d787c980313ea47, 0x372554761399758318df7c28ca7b95, 0x0016d4 ] } , - BigNum { limbs: [ 0x3d7e9803ec74e17a030cc2de5db52b, 0xdbf168716b60e5789556beff8edeb6, 0x001d12 ] } , - BigNum { limbs: [ 0x80256afc11e71d85fcf33c21a24ad6, 0xcb61c12c11e74dc142b14aa249269d, 0x0056da ] } , - BigNum { limbs: [ 0x7d166d26d7d13fef678c866ccd32d7, 0x1642c7524b471810c6122bee51ba89, 0x00725d ] } , - BigNum { limbs: [ 0x408d95d9268abf109873789332cd2a, 0x9110624b32011b2911f5ddb3864aca, 0x000190 ] } , - BigNum { limbs: [ 0x03788dd25be1b072994949fe8dda46, 0x315227033bb160f1e69f8f0320b088, 0x00622c ] } , - BigNum { limbs: [ 0xba2b752da27a4e8d66b6b5017225bb, 0x7601029a4196d247f1687a9eb754cb, 0x0011c1 ] } , - BigNum { limbs: [ 0x785fd8b3542a38a4a7a41d55234864, 0x2b04f3a711b74789f746a17afd9bde, 0x00241f ] } , - BigNum { limbs: [ 0x45442a4caa31c65b585be1aadcb79d, 0x7c4e35f66b90ebafe0c16826da6975, 0x004fce ] } , - BigNum { limbs: [ 0xbff88c0b7e4246f003cd6e73efb611, 0x0fdde70e992d0cc516e3bb219c82aa, 0x00146d ] } , - BigNum { limbs: [ 0xfdab76f48019b80ffc32908c1049f0, 0x9775428ee41b2674c1244e803b82a8, 0x005f80 ] } , - BigNum { limbs: [ 0x40e7eb01aad13b85caa34fd9b2b6ce, 0xb1d9346b1f74337b8c94b4e3a208e5, 0x007275 ] } , - BigNum { limbs: [ 0x7cbc17fe538ac37a355caf264d4933, 0xf579f5325dd3ffbe4b7354be35fc6e, 0x000177 ] } , - BigNum { limbs: [ 0x679941d7e3344ac1f99b485bb67d21, 0xd9e4727786c36067482e2d9445f9ef, 0x005aef ] } , - BigNum { limbs: [ 0x560ac1281b27b43e0664b6a44982e0, 0xcd6eb725f684d2d28fd9dc0d920b64, 0x0018fd ] } , - BigNum { limbs: [ 0xda7cb26fe41c7fe6b19f0b5eadf9cb, 0x1c67b10780e18ea3e9254dbb27ead7, 0x001c02 ] } , - BigNum { limbs: [ 0xe32750901a3f7f194e60f3a1520636, 0x8aeb7895fc66a495eee2bbe6b01a7b, 0x0057eb ] } , - BigNum { limbs: [ 0xafd9f0df88a27eefe8ef07b5048efa, 0x742370737a124164b50a572c9c65ee, 0x000ad7 ] } , - BigNum { limbs: [ 0x0dca122075b980101710f74afb7107, 0x332fb92a0335f1d522fdb2753b9f65, 0x006916 ] } , - BigNum { limbs: [ 0xde4d06174139246cfaf4c817c13fe6, 0x0e1ec7a28bb857f5f1a3b50f2b7f30, 0x0000c5 ] } , - BigNum { limbs: [ 0xdf56fce8bd22da93050b36e83ec01b, 0x993461faf18fdb43e6645492ac8622, 0x007328 ] } , - BigNum { limbs: [ 0x42551c91b1af3382fe7994226a7881, 0x30fb21510ba3cb52d65ec3b820f174, 0x005b33 ] } , - BigNum { limbs: [ 0x7b4ee66e4caccb7d01866add958780, 0x7658084c71a467e701a945e9b713df, 0x0018ba ] } , - BigNum { limbs: [ 0x97168a3a6000fe4541b8ff2ee0434e, 0x66525526a65439feec240d80689fd6, 0x000951 ] } , - BigNum { limbs: [ 0x268d78c59e5b00babe46ffd11fbcb3, 0x4100d476d6f3f93aebe3fc216f657d, 0x006a9c ] } , - BigNum { limbs: [ 0xa07e9cbe5a10af2a5e7b785841a1da, 0xb67ad287bb0f9589c90d5aa47634ea, 0x00668d ] } , - BigNum { limbs: [ 0x1d256641a44b4fd5a18486a7be5e27, 0xf0d85715c2389db00efaaefd61d069, 0x000d5f ] } , - BigNum { limbs: [ 0x6c91b560c5b82c9b2ee1a0bf112931, 0xdc55e43f779e0eace99e48f3d3cad6, 0x00243a ] } , - BigNum { limbs: [ 0x51124d9f38a3d264d11e5e40eed6d0, 0xcafd455e05aa248cee69c0ae043a7d, 0x004fb2 ] } , - BigNum { limbs: [ 0x424f00b1a2b32fa0eaaaa3583a6b80, 0x91a1889c6ab2045e7a34773491a611, 0x003362 ] } , - BigNum { limbs: [ 0x7b55024e5ba8cf5f15555ba7c59481, 0x15b1a10112962edb5dd3926d465f42, 0x00408b ] } , - BigNum { limbs: [ 0x0c078154d7c539a4c94125ad9dc176, 0x0931b15c62562ce4ba2c4bf31f353e, 0x006905 ] } , - BigNum { limbs: [ 0xb19c81ab2696c55b36bed952623e8b, 0x9e2178411af206551ddbbdaeb8d015, 0x000ae8 ] } , - BigNum { limbs: [ 0x9ad324193961627372e26d5720949f, 0x2ca6312ad70d5e3ab4ed8e1c3483aa, 0x0004a4 ] } , - BigNum { limbs: [ 0x22d0dee6c4fa9c8c8d1d91a8df6b62, 0x7aacf872a63ad4ff231a7b85a381a9, 0x006f49 ] } , - BigNum { limbs: [ 0xdf8723cf6834a9b16c92903c30681c, 0x7af602a41b0e4a7055b0fa4b32af44, 0x002a33 ] } , - BigNum { limbs: [ 0xde1cdf309627554e936d6ec3cf97e5, 0x2c5d26f96239e8c982570f56a5560e, 0x0049ba ] } , - BigNum { limbs: [ 0xa005008f5fa2fe6cd888c85ca05ae9, 0xeeb1a28cdf1a91ecc533285f28b4ad, 0x001b61 ] } , - BigNum { limbs: [ 0x1d9f02709eb90093277736a35fa518, 0xb8a187109e2da14d12d4e142af50a6, 0x00588b ] } , - BigNum { limbs: [ 0xec083a342b6152dc6c5431b7a01194, 0x444efe927bc8a141881064cd54d304, 0x002aaf ] } , - BigNum { limbs: [ 0xd19bc8cbd2faac2393abcd485fee6d, 0x63042b0b017f91f84ff7a4d483324e, 0x00493e ] } , - BigNum { limbs: [ 0xbf1d8539e5c50b799bd1773c3aadf2, 0xd6eec90f1e192c0cc5b558b3509c77, 0x00455e ] } , - BigNum { limbs: [ 0xfe867dc61896f386642e87c3c5520f, 0xd064608e5f2f072d1252b0ee8768db, 0x002e8e ] } , - BigNum { limbs: [ 0x4148b024d3ffa61cfd232fb7ac2d01, 0x8edaee2eeaed1ac42c62e56cb955a3, 0x0058ad ] } , - BigNum { limbs: [ 0x7c5b52db2a5c58e302dccf4853d300, 0x18783b6e925b1875aba524351eafb0, 0x001b40 ] } , - BigNum { limbs: [ 0x8bf3cd9093c0a2b6e7d38c824464d3, 0x5f24ab69299e82782d7daff3118923, 0x00223a ] } , - BigNum { limbs: [ 0x31b0356f6a9b5c49182c727dbb9b2e, 0x482e7e3453a9b0c1aa8a59aec67c30, 0x0051b3 ] } , - BigNum { limbs: [ 0xd0cb7ff2325177578545b4e64baae6, 0x86f9eb22d5720a288c1ac768fd31db, 0x00344b ] } , - BigNum { limbs: [ 0xecd8830dcc0a87a87aba4a19b4551b, 0x20593e7aa7d629114bed4238dad377, 0x003fa2 ] } , - BigNum { limbs: [ 0x49071f297def3c20da606ff4a3ba2b, 0x096ad9987ad9cbf93d062b4fda502a, 0x0072bf ] } , - BigNum { limbs: [ 0x749ce3d6806cc2df259f8f0b5c45d6, 0x9de85005026e67409b01de51fdb529, 0x00012e ] } , - BigNum { limbs: [ 0x9d3446b5219ed92c78c12b5913ffa2, 0x02082ceecbc03f01ab9eac85850baf, 0x0049e6 ] } , - BigNum { limbs: [ 0x206fbc4adcbd25d3873ed3a6ec005f, 0xa54afcaeb187f4382c695d1c52f9a4, 0x002a07 ] } , - BigNum { limbs: [ 0xb7b50e5693aeb64287ce1144fcf019, 0x4f3eb4931089c5be3aa28cfc810120, 0x00352c ] } , - BigNum { limbs: [ 0x05eef4a96aad48bd7831edbb030fe8, 0x5814750a6cbe6d7b9d657ca5570433, 0x003ec1 ] } , - BigNum { limbs: [ 0x30d9ac186fc5451f5753e3ccc4922e, 0x33f624c17d074b024c21cfa2302540, 0x0041ae ] } , - BigNum { limbs: [ 0x8cca56e78e96b9e0a8ac1b333b6dd3, 0x735d04dc0040e8378be639ffa7e013, 0x00323f ] } , - BigNum { limbs: [ 0x4de56daf67ef102318f1f6844036ac, 0x01b7108f6c67604297e1df5b7fe9fe, 0x007097 ] } , - BigNum { limbs: [ 0x6fbe9550966ceedce70e087bbfc955, 0xa59c190e10e0d2f740262a46581b55, 0x000356 ] } , - BigNum { limbs: [ 0xdc15bbb51c14b8bde69ad1be866e28, 0x4d702f536f1aef56d22dab86198a12, 0x005741 ] } , - BigNum { limbs: [ 0xe18e474ae247464219652d417991d9, 0x59e2fa4a0e2d43e305da5e1bbe7b40, 0x001cac ] } , - BigNum { limbs: [ 0x148b46fc8a9536b994f7e88da69099, 0xc54dedb0dd5c00f2b6fdeb2434990d, 0x0054a9 ] } , - BigNum { limbs: [ 0xa918bc0373c6c8466b081672596f68, 0xe2053bec9fec3247210a1e7da36c46, 0x001f43 ] } , - BigNum { limbs: [ 0xe0344c49d79b66f214cc49a9ca287b, 0x7bd852e497f37956c16f3a78ae28ee, 0x0051ec ] } , - BigNum { limbs: [ 0xdd6fb6b626c0980deb33b55635d786, 0x2b7ad6b8e554b9e31698cf2929dc64, 0x002201 ] } , - BigNum { limbs: [ 0x29e9208281d2988e92a08175236817, 0x8c4fc8876304b7701b97622a206b2e, 0x000f79 ] } , - BigNum { limbs: [ 0x93bae27d7c8966716d5f7d8adc97ea, 0x1b0361161a437bc9bc70a777b79a25, 0x006474 ] } , - BigNum { limbs: [ 0x2d67a18dc838277b51fa789fe811c1, 0x6d59e26f95d8df3b80de686838f4c0, 0x00420a ] } , - BigNum { limbs: [ 0x903c61723623d784ae05866017ee40, 0x39f9472de76f53fe5729a1399f1093, 0x0031e3 ] } , - BigNum { limbs: [ 0x98ce89ad3c4462f52172b7909c822f, 0x0f6f20aebd433bab579958add5d563, 0x000238 ] } , - BigNum { limbs: [ 0x24d57952c2179c0ade8d476f637dd2, 0x97e408eec004f78e806eb0f4022ff0, 0x0071b5 ] } , - BigNum { limbs: [ 0xad8bd407c8c41c02e2f94cd781d69e, 0xec60d8a45e9d074f9aa0ec1140c136, 0x0017c1 ] } , - BigNum { limbs: [ 0x10182ef83597e2fd1d06b2287e2963, 0xbaf250f91eab2bea3d671d9097441d, 0x005c2b ] } , - BigNum { limbs: [ 0x0d246202280193fea7c33496a345f2, 0xbad21bb26cbe0156dd6f2d56b9c192, 0x0059a2 ] } , - BigNum { limbs: [ 0xb07fa0fdd65a6b01583cca695cba0f, 0xec810deb108a31e2fa98dc4b1e43c1, 0x001a4a ] } , - BigNum { limbs: [ 0xb9bbd9b0a3590b2ee4c0317b41459b, 0x8c1a3548e372b5c82a603c67a3a3ba, 0x0016fd ] } , - BigNum { limbs: [ 0x03e8294f5b02f3d11b3fcd84beba66, 0x1b38f45499d57d71ada7cd3a346199, 0x005cf0 ] } , - BigNum { limbs: [ 0xc58a0b042cd4dc35d1ae71abd0a54d, 0x72419d80770cd6be007959cfa1c61b, 0x001793 ] } , - BigNum { limbs: [ 0xf819f7fbd18722ca2e518d542f5ab4, 0x35118c1d063b5c7bd78eafd2363f37, 0x005c5a ] } , - BigNum { limbs: [ 0x712f65dddcac5339a8f2d056a4027d, 0x8447f4db2f2599713674356834f476, 0x0059ac ] } , - BigNum { limbs: [ 0x4c749d2221afabc6570d2ea95bfd84, 0x230b34c24e2299c8a193d439a310dd, 0x001a41 ] } , - BigNum { limbs: [ 0x620b99aa201e9b7554cb01f596606f, 0x550e339064cc77fc010ff1bb87e048, 0x0000de ] } , - BigNum { limbs: [ 0x5b986955de3d638aab34fd0a699f92, 0x5244f60d187bbb3dd6f817e650250b, 0x00730f ] } , - BigNum { limbs: [ 0x7feef21aa1455b1985e5010d1e28f9, 0xf7d7a6997c064a244131970ee26e59, 0x005cf3 ] } , - BigNum { limbs: [ 0x3db510e55d16a3e67a1afdf2e1d708, 0xaf7b83040141e91596d67292f596fa, 0x0016f9 ] } , - BigNum { limbs: [ 0xef0eef02e9618bbf1b369c0a8445b6, 0x330063d404e1d74a7534d0a5cfbcaf, 0x006be4 ] } , - BigNum { limbs: [ 0xce9513fd14fa7340e4c962f57bba4b, 0x7452c5c978665bef62d338fc0848a3, 0x000809 ] } , - BigNum { limbs: [ 0x42f05b2dd0efa96d4b3d6d88b9ec49, 0x2dcdcaf325db8a076a0804aaf03d6b, 0x005a7e ] } , - BigNum { limbs: [ 0x7ab3a7d22d6c5592b4c291774613b8, 0x79855eaa576ca9326e0004f6e7c7e8, 0x00196f ] } , - BigNum { limbs: [ 0x278442906cdcb997c7058ee0f32403, 0x15d0bc7ed9cb8c826031662df9e760, 0x006c7a ] } , - BigNum { limbs: [ 0x961fc06f917f456838fa701f0cdbfe, 0x91826d1ea37ca6b777d6a373de1df3, 0x000773 ] } , - BigNum { limbs: [ 0x81b9b0030fff9b9dc2b95bda888cc3, 0x66c29c0c4d935f8efca0709e9fdc07, 0x004f0a ] } , - BigNum { limbs: [ 0x3bea52fcee5c63623d46a32577733e, 0x40908d912fb4d3aadb67990338294c, 0x0024e3 ] } , - BigNum { limbs: [ 0xb13e62a6404a74daf6c1cc2b79b805, 0x1db2c4fc40430e536c4bf821b25948, 0x002e8d ] } , - BigNum { limbs: [ 0x0c65a059be118a25093e32d48647fc, 0x89a064a13d0524e66bbc118025ac0b, 0x004560 ] } , - BigNum { limbs: [ 0x4ad0183cb4d23e3b9f40dc39226ef2, 0xbb8a5f91996cc7e207d405cec60f24, 0x004c63 ] } , - BigNum { limbs: [ 0x72d3eac34989c0c460bf22c6dd910f, 0xebc8ca0be3db6b57d03403d311f62f, 0x002789 ] } , - BigNum { limbs: [ 0x1d4b203d557fd3d0bd794485b1cd59, 0xff0465d7945d6b0fd286dc1624d8de, 0x001a8d ] } , - BigNum { limbs: [ 0xa058e2c2a8dc2b2f4286ba7a4e32a8, 0xa84ec3c5e8eac82a05812d8bb32c75, 0x00595f ] } , - BigNum { limbs: [ 0x7f4e7f70ec86ac05e2e6cb0db28404, 0x71b2bcbcebb0e07032ac4dd9f48655, 0x00222d ] } , - BigNum { limbs: [ 0x3e55838f11d552fa1d1933f24d7bfd, 0x35a06ce0919752c9a55bbbc7e37efe, 0x0051c0 ] } , - BigNum { limbs: [ 0x31d6a3b689584dd2f0f5e5e994ff3a, 0x98eed454988b6dee792e47fe9ebe96, 0x003268 ] } , - BigNum { limbs: [ 0x8bcd5f497503b12d0f0a19166b00c7, 0x0e645548e4bcc54b5ed9c1a33946bd, 0x004185 ] } , - BigNum { limbs: [ 0xd1a69ef390c21d4a865bf20d7fe4ff, 0x7ca7fee6f701be6bd1e602f93f1e7a, 0x000a60 ] } , - BigNum { limbs: [ 0xebfd640c6d99e1b579a40cf2801b02, 0x2aab2ab6864674ce062206a898e6d8, 0x00698d ] } , - BigNum { limbs: [ 0x62a8e248a5873997ef4c4862dac48b, 0x5edd0c55c21a756db007d73ddfd82b, 0x000083 ] } , - BigNum { limbs: [ 0x5afb20b758d4c56810b3b69d253b76, 0x48761d47bb2dbdcc28003263f82d28, 0x00736a ] } , - BigNum { limbs: [ 0xfbf6b6977f335ccc7ee15d01f39a0d, 0x40eb8f3ff496463dea24c6c2f0113d, 0x005839 ] } , - BigNum { limbs: [ 0xc1ad4c687f28a233811ea1fe0c65f4, 0x66679a5d88b1ecfbede342dee7f415, 0x001bb4 ] } , - BigNum { limbs: [ 0xa998918baa4ee01f8dc38c14a70a7d, 0x9a0c8d46e5c1431b68c23ab353eb5a, 0x00529a ] } , - BigNum { limbs: [ 0x140b7174540d1ee0723c72eb58f584, 0x0d469c569786f01e6f45ceee8419f9, 0x002153 ] } , - BigNum { limbs: [ 0xf5f8fb1cfd35bf416d25664132e681, 0xacd15cff4a085d468a777ba29478a8, 0x0063a1 ] } , - BigNum { limbs: [ 0xc7ab07e301263fbe92da98becd1980, 0xfa81cc9e333fd5f34d908dff438caa, 0x00104b ] } , - BigNum { limbs: [ 0xa148a069f07e83085c098a064e640d, 0x1d433b70d20df332844e948cea8ef0, 0x0059bd ] } , - BigNum { limbs: [ 0x1c5b62960ddd7bf7a3f674f9b19bf4, 0x8a0fee2cab3a400753b97514ed7663, 0x001a30 ] } , - BigNum { limbs: [ 0x323eed0b7541f7626cf66312dc75d4, 0xf0cfc53f02ad2cff5e64aca06bfdc0, 0x000521 ] } , - BigNum { limbs: [ 0x8b6515f4891a079d93099bed238a2d, 0xb683645e7a9b063a79a35d016c0793, 0x006ecb ] } , - BigNum { limbs: [ 0x6d33f723b2c096edd01d1e9965d339, 0xe5c62447e6c5b903259bd01c07a223, 0x007091 ] } , - BigNum { limbs: [ 0x50700bdc4b9b68122fe2e0669a2cc8, 0xc18d055596827a36b26c3985d06330, 0x00035b ] } , - BigNum { limbs: [ 0xced4862f3112b54a33b4ca4fa500d5, 0xe64e6e329643ccb9d7408ba4ad4f77, 0x0046d5 ] } , - BigNum { limbs: [ 0xeecf7cd0cd4949b5cc4b34b05aff2c, 0xc104bb6ae704668000c77dfd2ab5db, 0x002d17 ] } , - BigNum { limbs: [ 0xa7edc3eeb1ea0f3cd3d2e1c03a844c, 0xc7495e0793b32f9ded387ed31cf4f1, 0x001257 ] } , - BigNum { limbs: [ 0x15b63f114c71efc32c2d1d3fc57bb5, 0xe009cb95e995039beacf8acebb1062, 0x006195 ] } , - BigNum { limbs: [ 0xca9f6f63c7ee570593110cdd147867, 0x0c5a1acc4e039943b8c1f1c32bb124, 0x006d19 ] } , - BigNum { limbs: [ 0xf304939c366da7fa6ceef222eb879a, 0x9af90ed12f4499f61f4617deac542e, 0x0006d4 ] } , - BigNum { limbs: [ 0xa3138bbc3a874b460e884790b8c345, 0x8a70e4c6426c457a1f0b6f25f22f8b, 0x0049a9 ] } , - BigNum { limbs: [ 0x1a907743c3d4b3b9f177b76f473cbc, 0x1ce244d73adbedbfb8fc9a7be5d5c8, 0x002a44 ] } , - BigNum { limbs: [ 0x1169992c0dfff849ad9eda3ab2596b, 0xed13f5196adafec2c1e6f695673957, 0x006c32 ] } , - BigNum { limbs: [ 0xac3a69d3f05c06b6526124c54da696, 0xba3f3484126d34771621130c70cbfc, 0x0007ba ] } , - BigNum { limbs: [ 0x55a2ee5f896a4409af8f18266456c5, 0xac223b8b00a756b079736230d8d1e0, 0x005356 ] } , - BigNum { limbs: [ 0x680114a074f1baf65070e6d99ba93c, 0xfb30ee127ca0dc895e94a770ff3373, 0x002096 ] } , - BigNum { limbs: [ 0x2b4bfeb55dfba683a202b9605bdc7f, 0xcd834da0dfe13d24b851b6e0e2940a, 0x005b37 ] } , - BigNum { limbs: [ 0x9258044aa060587c5dfd459fa42382, 0xd9cfdbfc9d66f6151fb652c0f57149, 0x0018b5 ] } , - BigNum { limbs: [ 0x95ffdf3831c932ebf8ff080a52e66f, 0x9145a9d644ccae7ba896e4494d8bb6, 0x00364c ] } , - BigNum { limbs: [ 0x27a423c7cc92cc140700f6f5ad1992, 0x160d7fc7387b84be2f7125588a799d, 0x003da1 ] } , - BigNum { limbs: [ 0x548acb6d790da51557c2f3467bd1ca, 0x515b1711e6667471e199a39130b996, 0x0006b9 ] } , - BigNum { limbs: [ 0x69193792854e59eaa83d0bb9842e37, 0x55f8128b96e1bec7f66e6610a74bbd, 0x006d34 ] } , - BigNum { limbs: [ 0x0352b62f3f203eb38d064ea8444127, 0xfa03ad3c8255023718eed874887b51, 0x005aee ] } , - BigNum { limbs: [ 0xba514cd0bf3bc04c72f9b057bbbeda, 0xad4f7c60faf33102bf19312d4f8a02, 0x0018fe ] } , - BigNum { limbs: [ 0x6d63f8b28503442b436d7a469e3045, 0xd3a13151f5da0c095cf1e33152987a, 0x004c75 ] } , - BigNum { limbs: [ 0x50400a4d7958bad4bc9284b961cfbc, 0xd3b1f84b876e27307b162670856cd9, 0x002777 ] } , - BigNum { limbs: [ 0x62f6b763e08ab37846d9e1c754b5dc, 0x4af774526aa008078f5f1149b3a08b, 0x00327c ] } , - BigNum { limbs: [ 0x5aad4b9c1dd14b87b9261d38ab4a25, 0x5c5bb54b12a82b3248a8f8582464c8, 0x004171 ] } , - BigNum { limbs: [ 0xe5fdb63351c0ec536a984065c92adf, 0xe30b5b7bc5bd438d2dbf46dd5590f9, 0x000898 ] } , - BigNum { limbs: [ 0xd7a64cccac9b12ac9567be9a36d522, 0xc447ce21b78aefacaa48c2c4827459, 0x006b54 ] } , - BigNum { limbs: [ 0x2db53007db7808cb26d9489265bf28, 0x370156cdae5227f2d34b0ee0bab27b, 0x006103 ] } , - BigNum { limbs: [ 0x8feed2f822e3f634d926b66d9a40d9, 0x7051d2cfcef60b4704bcfac11d52d8, 0x0012ea ] } , - BigNum { limbs: [ 0xe92a5ff656e571e252f6a3681e0665, 0x48279a4d32928213bbd737bf0e62fa, 0x0067b7 ] } , - BigNum { limbs: [ 0xd479a309a7768d1dad095b97e1f99c, 0x5f2b8f504ab5b1261c30d1e2c9a258, 0x000c36 ] } , - BigNum { limbs: [ 0x4a3619fc303084522303685af9251f, 0xec39741c1ee0841ec896cf8d6b71cc, 0x003f80 ] } , - BigNum { limbs: [ 0x736de903ce2b7aaddcfc96a506dae2, 0xbb19b5815e67af1b0f713a146c9387, 0x00346c ] } , - BigNum { limbs: [ 0x09b29d2aaa46f58fde839c9b10f95a, 0xf481668a98cc916653ef8ee10c3160, 0x000b47 ] } , - BigNum { limbs: [ 0xb3f165d554150970217c6264ef06a7, 0xb2d1c312e47ba1d384187ac0cbd3f3, 0x0068a5 ] } , - BigNum { limbs: [ 0x8d4f7d4f608b27831af13e1a684e43, 0xeabd406c3a9d1aaa8bc17630875b9a, 0x002669 ] } , - BigNum { limbs: [ 0x305485b09dd0d77ce50ec0e597b1be, 0xbc95e93142ab188f4c46937150a9b9, 0x004d83 ] } , - BigNum { limbs: [ 0x5f59426e561ac3a0d046361160c87d, 0xf67c9a365f924184a3278cbac76cf6, 0x001e28 ] } , - BigNum { limbs: [ 0x5e4ac091a8413b5f2fb9c8ee9f3784, 0xb0d68f671db5f1b534e07ce710985d, 0x0055c4 ] } , - BigNum { limbs: [ 0xb504c88bc20bd7cd2b2f4c41dff3cb, 0x1dab874c3d6a7726f871b0da235e08, 0x00698f ] } , - BigNum { limbs: [ 0x089f3a743c502732d4d0b2be200c36, 0x89a7a2513fddbc12df9658c7b4a74b, 0x000a5e ] } , - BigNum { limbs: [ 0x5f34977fa341337055b514a4510f6a, 0x373ad66cee9842076ef74d0b719d55, 0x005dd7 ] } , - BigNum { limbs: [ 0x5e6f6b805b1acb8faa4aea5baef097, 0x701853308eaff1326910bc966667fe, 0x001616 ] } , - BigNum { limbs: [ 0x6c461ae56f072df424341daddcab5d, 0x0d96bee11ebb5204f44088385855a8, 0x004aa1 ] } , - BigNum { limbs: [ 0x515de81a8f54d10bdbcbe1522354a4, 0x99bc6abc5e8ce134e3c781697fafab, 0x00294c ] } , - BigNum { limbs: [ 0x0e8aaa2c0adab646add4de51661716, 0x17a81ec992dbd332c8edcb31b9c532, 0x006f8c ] } , - BigNum { limbs: [ 0xaf1958d3f38148b9522b20ae99e8eb, 0x8fab0ad3ea6c60070f1a3e701e4021, 0x000461 ] } , - BigNum { limbs: [ 0x966df282c99da1552407971d6a01b3, 0xc4a1e86297dd1f72eaf592b1a5e37c, 0x001064 ] } , - BigNum { limbs: [ 0x2736107d34be5daadbf867e295fe4e, 0xe2b1413ae56b13c6ed1276f03221d7, 0x006388 ] } , - BigNum { limbs: [ 0xdf55fe0e814040452ccd3a84afddff, 0xc0bccf122cf17f89e05099b9346eb4, 0x004fc3 ] } , - BigNum { limbs: [ 0xde4e04f17d1bbebad332c47b502202, 0xe6965a8b5056b3aff7b76fe8a3969e, 0x002429 ] } , - BigNum { limbs: [ 0x9025299f9d89f8b0a40e557f4b46ae, 0xb7cf8d35960d07e1837d2ec951dce4, 0x000c0e ] } , - BigNum { limbs: [ 0x2d7ed96060d2064f5bf1a980b4b953, 0xef839c67e73b2b58548adad886286f, 0x0067de ] } , - BigNum { limbs: [ 0x627ca6b51d001a6f9d0064fac7137d, 0xba9652521c23efdb2f0828054b7fb3, 0x006f56 ] } , - BigNum { limbs: [ 0x5b275c4ae15be49062ff9a0538ec84, 0xecbcd74b6124435ea8ffe19c8c85a0, 0x000496 ] } , - BigNum { limbs: [ 0x57c9facced7b915f66134727f54889, 0xc12d8a6f82133cf6cd1d9efc7c146e, 0x006c0e ] } , - BigNum { limbs: [ 0x65da083310e06da099ecb7d80ab778, 0xe6259f2dfb34f6430aea6aa55bf0e5, 0x0007de ] } , - BigNum { limbs: [ 0x339834601eaf9df9b5ad7e3464f5a5, 0x51053381165e056f4fd9e2e5174451, 0x00510f ] } , - BigNum { limbs: [ 0x8a0bce9fdfac61064a5280cb9b0a5c, 0x564df61c66ea2dca882e26bcc0c102, 0x0022de ] } , - BigNum { limbs: [ 0xea1b243740a635ed1c6473b3e31cf7, 0x6e5ee340acc503a56cc8813aa331a6, 0x0022c3 ] } , - BigNum { limbs: [ 0xd388dec8bdb5c912e39b8b4c1ce30a, 0x38f4465cd0832f946b3f886734d3ac, 0x00512a ] } , - BigNum { limbs: [ 0xa5a037f31901964ec74d66ce5ce51d, 0xd1a16317e2eef74564930e6096c055, 0x006852 ] } , - BigNum { limbs: [ 0x1803cb0ce55a68b138b29831a31ae4, 0xd5b1c6859a593bf47374fb414144fe, 0x000b9a ] } , - BigNum { limbs: [ 0x5b9ca898999be0e41960cc8f7cf554, 0x10c103e349beeebdfa4d46a48617eb, 0x001be6 ] } , - BigNum { limbs: [ 0x62075a6764c01e1be69f3270830aad, 0x969225ba3389447bddbac2fd51ed68, 0x005807 ] } , - BigNum { limbs: [ 0xc9e646f0bc30f46b1ac0499b422b78, 0x36685571ebe59efaac6d4efab2f7a2, 0x00178c ] } , - BigNum { limbs: [ 0xf3bdbc0f422b0a94e53fb564bdd489, 0x70ead42b9162943f2b9abaa7250db0, 0x005c61 ] } , - BigNum { limbs: [ 0x468edeb6787ad5963a9c566e8bd6b5, 0x92e90312698626747ffd80262ac35f, 0x003dfd ] } , - BigNum { limbs: [ 0x7715244985e12969c563a89174294c, 0x146a268b13c20cc5580a897bad41f4, 0x0035f0 ] } , - BigNum { limbs: [ 0xa1f0d04b158d7aa271966e405dcffd, 0xeac8ef44b61d5e3ddfac65da256f88, 0x00378f ] } , - BigNum { limbs: [ 0x1bb332b4e8ce845d8e6990bfa23004, 0xbc8a3a58c72ad4fbf85ba3c7b295cb, 0x003c5d ] } , - BigNum { limbs: [ 0x719dedc145d3ee4580dba9fc46a574, 0x8c3a3826d76773a54de6e95a9de480, 0x00102b ] } , - BigNum { limbs: [ 0x4c06153eb88810ba7f245503b95a8d, 0x1b18f176a5e0bf948a2120473a20d3, 0x0063c2 ] } , - BigNum { limbs: [ 0x6d85a7faf7c62885336974811c697a, 0xbda65519ec38a6266415c4d6ced228, 0x003b35 ] } , - BigNum { limbs: [ 0x501e5b050695d67acc968a7ee39687, 0xe9acd483910f8d1373f244cb09332b, 0x0038b7 ] } , - BigNum { limbs: [ 0x510ebfb4543a3efb350dbef02a116e, 0xa56e80f82b2df675522e37ad4eca1c, 0x001907 ] } , - BigNum { limbs: [ 0x6c95434baa21c004caf2400fd5ee93, 0x01e4a8a5521a3cc485d9d1f4893b37, 0x005ae6 ] } , - BigNum { limbs: [ 0x1102eb66f6fce55e501a6aa6138595, 0x8e203415456536060cc57d5ad557ea, 0x006d3d ] } , - BigNum { limbs: [ 0xaca11799075f19a1afe59459ec7a6c, 0x1932f58837e2fd33cb428c4702ad69, 0x0006b0 ] } , - BigNum { limbs: [ 0x7dea6029017fdc9dac7b409d585d19, 0xc0e6aaf7c2d906dbeaab1ad525575d, 0x00634f ] } , - BigNum { limbs: [ 0x3fb9a2d6fcdc22625384be62a7a2e8, 0xe66c7ea5ba6f2c5ded5ceeccb2adf6, 0x00109d ] } , - BigNum { limbs: [ 0x3764a3ff5f912e67cf9ca3e9f5b1b1, 0xbee4fcf836297cc088f970ebac3ad3, 0x005f20 ] } , - BigNum { limbs: [ 0x863f5f009ecad09830635b160a4e50, 0xe86e2ca5471eb6794f0e98b62bca80, 0x0014cc ] } , - BigNum { limbs: [ 0x738f0e49608f7fec3894fdbbc5e597, 0x6831b2c665dce522dc0df640392d0a, 0x002e91 ] } , - BigNum { limbs: [ 0x4a14f4b69dcc7f13c76b01443a1a6a, 0x3f2176d7176b4e16fbfa13619ed849, 0x00455c ] } , - BigNum { limbs: [ 0xb1cebef9a7dbaf187a081bc020c9e9, 0x49dce1168ed72eb22d78a01a149188, 0x0048c6 ] } , - BigNum { limbs: [ 0x0bd5440656804fe785f7e33fdf3618, 0x5d764886ee710487aa8f6987c373cb, 0x002b27 ] } , - BigNum { limbs: [ 0x786c05f26d2d14072fff623d593acc, 0x4567920d7fbdd5ad1e34af8ba8297e, 0x004b0f ] } , - BigNum { limbs: [ 0x4537fd0d912eeaf8d0009cc2a6c535, 0x61eb978ffd8a5d8cb9d35a162fdbd5, 0x0028de ] } , - BigNum { limbs: [ 0xa08916e4882ed38e69d125b2613b98, 0x2412402056b9c587252e3f738f0291, 0x00154d ] } , - BigNum { limbs: [ 0x1d1aec1b762d2b71962ed94d9ec469, 0x8340e97d268e6db2b2d9ca2e4902c2, 0x005ea0 ] } , - BigNum { limbs: [ 0xa44a292b2e5b2982758592725b5677, 0x3df3d2c48682ef7088ae62b6a01241, 0x004c5f ] } , - BigNum { limbs: [ 0x1959d9d4d000d57d8a7a6c8da4a98a, 0x695f56d8f6c543c94f59a6eb37f312, 0x00278e ] } , - BigNum { limbs: [ 0x3dc049317117871848f2442fea2cc8, 0x6e34562bbc52e204d5dce884424849, 0x002cb0 ] } , - BigNum { limbs: [ 0x7fe3b9ce8d4477e7b70dbad015d339, 0x391ed371c0f55135022b211d95bd0a, 0x00473d ] } , - BigNum { limbs: [ 0xd2201ed10a653f0612b0fb6cc1107c, 0xcba74f737371896fb6a2fbba8ee922, 0x006c1b ] } , - BigNum { limbs: [ 0xeb83e42ef3f6bff9ed4f03933eef85, 0xdbabda2a09d6a9ca21650de7491c30, 0x0007d1 ] } , - BigNum { limbs: [ 0xdf8a6e25303f2fd0c13b83274f45b0, 0xbb2eb5bc528c11781b3e716a0f505e, 0x002bdd ] } , - BigNum { limbs: [ 0xde1994dace1ccf2f3ec47bd8b0ba51, 0xec2473e12abc21c1bcc99837c8b4f4, 0x00480f ] } , - BigNum { limbs: [ 0xd22b0908293b435d970e0b0666e0d8, 0x0683301968fdb44d3b688f8492460a, 0x005b03 ] } , - BigNum { limbs: [ 0xeb78f9f7d520bba268f1f3f9991f29, 0xa0cff984144a7eec9c9f7a1d45bf48, 0x0018ea ] } , - BigNum { limbs: [ 0xc5922e39ae0bf92ae6e2c121bfc3c3, 0x9e36de006c054af1a2d79a24d27ae1, 0x007000 ] } , - BigNum { limbs: [ 0xf811d4c6505005d5191d3dde403c3e, 0x091c4b9d1142e84835306f7d058a71, 0x0003ed ] } , - BigNum { limbs: [ 0xe63a729649cca628f1221a8298a060, 0xe2fcb84cd789855a08d1b96d6c46b4, 0x001272 ] } , - BigNum { limbs: [ 0xd7699069b48f58d70edde47d675fa1, 0xc4567150a5beaddfcf3650346bbe9e, 0x00617a ] } , - BigNum { limbs: [ 0x5fe456e0de774541fed1c1f077470a, 0xef9cfd0d5b9c3c011284ce2c0a5ae6, 0x0058ea ] } , - BigNum { limbs: [ 0x5dbfac1f1fe4b9be012e3d0f88b8f7, 0xb7b62c9021abf738c5833b75cdaa6d, 0x001b02 ] } , - BigNum { limbs: [ 0x4e7bab3c93dde164936d794ecac754, 0x8efcbc9ffba397e292677efe6e684b, 0x00192d ] } , - BigNum { limbs: [ 0x6f2857c36a7e1d9b6c9285b13538ad, 0x18566cfd81a49b5745a08aa3699d08, 0x005ac0 ] } , - BigNum { limbs: [ 0xf39aabdcbb7d0745a8d91e955983d1, 0xed933c287503e05891c9ff9c3987d4, 0x00075d ] } , - BigNum { limbs: [ 0xca09572342def7ba5726e06aa67c30, 0xb9bfed75084452e1463e0a059e7d7e, 0x006c8f ] } , - BigNum { limbs: [ 0x04d8e25880e9cee1d977e545af710b, 0x5fb6453833c4c973f8fca82606c27d, 0x00527d ] } , - BigNum { limbs: [ 0xb8cb20a77d72301e268819ba508ef6, 0x479ce465498369c5df0b617bd142d6, 0x002170 ] } , - BigNum { limbs: [ 0x9741e455322d312856121a533306a0, 0xd41c2b82dcc6b2dd9a95731e9ccfab, 0x005d63 ] } , - BigNum { limbs: [ 0x26621eaacc2ecdd7a9ede4acccf961, 0xd336fe1aa081805c3d7296833b35a8, 0x001689 ] } , - BigNum { limbs: [ 0x9d89aade182224f825d2b60a32f87a, 0x4aec85b8f956e027a83558a1fa00b9, 0x001df4 ] } , - BigNum { limbs: [ 0x201a5821e639da07da2d48f5cd0787, 0x5c66a3e483f153122fd2b0ffde049a, 0x0055f9 ] } , - BigNum { limbs: [ 0x2d7dae9287cd043df47cf236da17e9, 0xf534d4599079c579b994cbef0c2ce9, 0x001306 ] } , - BigNum { limbs: [ 0x9026546d768efac20b830cc925e818, 0xb21e5543ecce6dc01e733db2cbd86a, 0x0060e6 ] } , - BigNum { limbs: [ 0xcbb1bd356f80cdcf2c53214fca9316, 0xe397c114f8f36fa873d6002f921fda, 0x003495 ] } , - BigNum { limbs: [ 0xf1f245ca8edb3130d3acddb0356ceb, 0xc3bb68888454c3916432097245e578, 0x003f57 ] } , - BigNum { limbs: [ 0x62629752f7b4ac743e6cd3f2d8b5e4, 0xb727404262a9c24956b7927d30eacb, 0x001874 ] } , - BigNum { limbs: [ 0x5b416bad06a7528bc1932b0d274a1d, 0xf02be95b1a9e70f081507724a71a88, 0x005b78 ] } , - BigNum { limbs: [ 0x0cfc2a8e76963e1cfb5b8201d3c611, 0xdbab8b1811260a0955d20478e94671, 0x0038a2 ] } , - BigNum { limbs: [ 0xb0a7d87187c5c0e304a47cfe2c39f0, 0xcba79e856c22293082360528eebee2, 0x003b4a ] } , - BigNum { limbs: [ 0x501d116ae74916c40d56452b59c640, 0x823696c820865acd8b4a64b679a2e3, 0x0032e8 ] } , - BigNum { limbs: [ 0x6d86f1951712e83bf2a9b9d4a639c1, 0x251c92d55cc1d86c4cbda4eb5e6270, 0x004105 ] } , - BigNum { limbs: [ 0x9d714edf2c5d73e9fd3487793e0a1e, 0x777daecfbc8bf776f0b322161a54eb, 0x000c02 ] } , - BigNum { limbs: [ 0x2032b420d1fe8b1602cb7786c1f5e3, 0x2fd57acdc0bc3bc2e754e78bbdb068, 0x0067eb ] } , - BigNum { limbs: [ 0xa019a046396b882f67888351b3aed0, 0x4490a807026fab8427037d4aaef513, 0x0000df ] } , - BigNum { limbs: [ 0x1d8a62b9c4f076d098777bae4c5131, 0x62c281967ad887b5b1048c57291040, 0x00730e ] } , - BigNum { limbs: [ 0xb7da58c5251abce7c952e4bd7af7d4, 0x42944aa32bee278a8c2e3d1fd8e115, 0x005e85 ] } , - BigNum { limbs: [ 0x05c9aa3ad941421836ad1a4285082d, 0x64bedefa515a0baf4bd9cc81ff243e, 0x001568 ] } , - BigNum { limbs: [ 0xb169206b7f3154077d390dd7d05b42, 0x0a68359a3f51e5084aaf8797a96f5e, 0x004197 ] } , - BigNum { limbs: [ 0x0c3ae2947f2aaaf882c6f1282fa4bf, 0x9ceaf4033df64e318d58820a2e95f5, 0x003256 ] } , - BigNum { limbs: [ 0x3c05a40dd7360af2be473f9f510696, 0x85d44e308ee97c96515b1b38427a7c, 0x004f02 ] } , - BigNum { limbs: [ 0x819e5ef22725f40d41b8bf60aef96b, 0x217edb6cee5eb6a386acee69958ad7, 0x0024eb ] } , - BigNum { limbs: [ 0xc01d3617a563363c520c2b1a297a42, 0x1b34b95dfdc7a5455416cfcec9c93f, 0x0057d1 ] } , - BigNum { limbs: [ 0xfd86cce858f8c8c3adf3d3e5d685bf, 0x8c1e703f7f808df483f139d30e3c13, 0x001c1c ] } , - BigNum { limbs: [ 0xd04289be4d5845428c9fe880b696f2, 0xefc99d37fe721eb3867a7d42417bfd, 0x003337 ] } , - BigNum { limbs: [ 0xed617941b103b9bd7360167f49690f, 0xb7898c657ed61486518d8c5f968955, 0x0040b5 ] } , - BigNum { limbs: [ 0x471747bfef212bcdcd38d6f117f52f, 0x873a1f951adfb6548e4a26c46cf637, 0x00260e ] } , - BigNum { limbs: [ 0x768cbb400f3ad33232c7280ee80ad2, 0x20190a0862687ce549bde2dd6b0f1c, 0x004ddf ] } , - BigNum { limbs: [ 0x1bd60176f653694582bcb64c16195c, 0xf7a2a21cae9a8382c4cf78190afc04, 0x0045c6 ] } , - BigNum { limbs: [ 0xa1ce0189080895ba7d4348b3e9e6a5, 0xafb08780ceadafb713389188cd094f, 0x002e26 ] } , - BigNum { limbs: [ 0x12d6dbc4da70eb9281ca5182004249, 0x6ee71fba800af7b5bc01b47b0c0cc1, 0x00524f ] } , - BigNum { limbs: [ 0xaacd273b23eb136d7e35ad7dffbdb8, 0x386c09e2fd3d3b841c065526cbf892, 0x00219e ] } , - BigNum { limbs: [ 0xdd88120258390fcf4a24368337be6a, 0xbc58cb5eb5c44cc9ff4bf19abce5bb, 0x0030e1 ] } , - BigNum { limbs: [ 0xe01bf0fda622ef30b5dbc87cc84197, 0xeafa5e3ec783e66fd8bc18071b1f97, 0x00430b ] } , - BigNum { limbs: [ 0xa959dcb76fe5390c0871ffc19b100f, 0xce8ba2c48aa4894506e8611524fe2a, 0x002f73 ] } , - BigNum { limbs: [ 0x144a26488e76c5f3f78dff3e64eff2, 0xd8c786d8f2a3a9f4d11fa88cb30729, 0x004479 ] } , - BigNum { limbs: [ 0x73882ea6ce7aa9e15b2a94a295c9ad, 0x7fb3c3230d556d15603c30cffb92d1, 0x003d74 ] } , - BigNum { limbs: [ 0x4a1bd4592fe1551ea4d56a5d6a3654, 0x279f667a6ff2c62477cbd8d1dc7282, 0x003679 ] } , - BigNum { limbs: [ 0xf7ba1663b31d0376fd4001b4f824c8, 0x46853ef9fa574485c4aa168e870ab3, 0x006fbe ] } , - BigNum { limbs: [ 0xc5e9ec9c4b3efb8902bffd4b07db39, 0x60cdeaa382f0eeb4135df31350fa9f, 0x00042f ] } , - BigNum { limbs: [ 0x0119a77a9a472b1f0256b78db57e18, 0xf68db38f4a7b27a0943532cbc2db68, 0x00474c ] } , - BigNum { limbs: [ 0xbc8a5b856414d3e0fda947724a81e9, 0xb0c5760e32cd0b9943d2d6d61529eb, 0x002ca0 ] } , - BigNum { limbs: [ 0x1592642caef3e5a869ecf2cc0d850a, 0xd792bef1368d6e952e48357708336a, 0x004164 ] } , - BigNum { limbs: [ 0xa8119ed34f68195796130c33f27af7, 0xcfc06aac46bac4a4a9bfd42acfd1e9, 0x003288 ] } , - BigNum { limbs: [ 0xea563e74aa3185e99ab4b0ce6c0c7c, 0xcb7ba7a1102bab1c2cbe2844a0ddd5, 0x00098b ] } , - BigNum { limbs: [ 0xd34dc48b542a7916654b4e3193f385, 0xdbd781fc6d1c881dab49e15d37277d, 0x006a61 ] } , - BigNum { limbs: [ 0x437f9626fc085e3c28d666a5c2d854, 0xb5c3debf77a18f4de02c0f776af3ea, 0x00325d ] } , - BigNum { limbs: [ 0x7a246cd90253a0c3d729985a3d27ad, 0xf18f4ade05a6a3ebf7dbfa2a6d1169, 0x00418f ] } , - BigNum { limbs: [ 0x042bde9573c4ad1ff95ac74f4dd55e, 0xf518291d3e252d00a5be2412a997b6, 0x0050c8 ] } , - BigNum { limbs: [ 0xb978246a8a9751e006a537b0b22aa3, 0xb23b00803f2306393249e58f2e6d9d, 0x002324 ] } , - BigNum { limbs: [ 0xd42ce812d4161a128568bfed36d2d6, 0x61d6a24bc012a01a09222bf9650bd9, 0x006524 ] } , - BigNum { limbs: [ 0xe9771aed2a45e4ed7a973f12c92d2b, 0x457c8751bd35931fcee5dda872f979, 0x000ec9 ] } , - BigNum { limbs: [ 0x4eea3f60d8ba48352b5233bf7ba901, 0x9a5b87438c07220bc79e6b495d459f, 0x003304 ] } , - BigNum { limbs: [ 0x6eb9c39f25a1b6cad4adcb40845700, 0x0cf7a259f141112e10699e587abfb4, 0x0040e9 ] } , - BigNum { limbs: [ 0x67db8f3cd65da7c8f54ccb3906df6e, 0x385ab3740f1d0a08b8806bf140116a, 0x003ff0 ] } , - BigNum { limbs: [ 0x55c873c327fe57370ab333c6f92093, 0x6ef876296e2b29311f879db097f3e9, 0x0033fd ] } , - BigNum { limbs: [ 0x10f133fcb8fede5de6afb9568b79d7, 0x555d2abe285e02fca0c6b9bfafb5fd, 0x00149f ] } , - BigNum { limbs: [ 0xacb2cf03455d20a2195045a974862a, 0x51f5fedf54ea303d37414fe2284f56, 0x005f4e ] } , - BigNum { limbs: [ 0xb769a52be75f80a78adc4c393f40fb, 0x8cf482eda4eaeba7fb8a7fa58fc5d9, 0x0007f3 ] } , - BigNum { limbs: [ 0x063a5dd416fc7e587523b2c6c0bf06, 0x1a5ea6afd85d4791dc7d89fc483f7a, 0x006bfa ] } , - BigNum { limbs: [ 0x1d3d048e2bae51fb8bf031847f0368, 0x7d0f0c1d7fa06092d03a32cfcbe1a7, 0x004b4f ] } , - BigNum { limbs: [ 0xa066fe71d2adad04740fcd7b80fc99, 0x2a441d7ffda7d2a707cdd6d20c23ac, 0x00289e ] } , - BigNum { limbs: [ 0xcfc07ba26779319d6862e69abec349, 0x7fd1ffada9fb7ce80043e235fce4b6, 0x0027a5 ] } , - BigNum { limbs: [ 0xede3875d96e2cd62979d1865413cb8, 0x278129efd34cb651d7c4276bdb209c, 0x004c48 ] } , - BigNum { limbs: [ 0x2b9280b02b0f38389490a19470e8d1, 0x662f4b3bf7dd4a6b4b7925d178b97c, 0x00006c ] } , - BigNum { limbs: [ 0x9211824fd34cc6c76b6f5d6b8f1730, 0x4123de61856ae8ce8c8ee3d05f4bd7, 0x007381 ] } , - BigNum { limbs: [ 0x626ce47a1970433653bbc394e0194f, 0x0ed3d812e1900c2d1e5df0ba7ba08d, 0x001b07 ] } , - BigNum { limbs: [ 0x5b371e85e4ebbbc9ac443b6b1fe6b2, 0x987f518a9bb8270cb9aa18e75c64c6, 0x0058e6 ] } , - BigNum { limbs: [ 0xbf59d5e64bbfa343aac380bd084cf0, 0xe70b5e0ee5d8a20cb37113cdf8a9af, 0x00534e ] } , - BigNum { limbs: [ 0xfe4a2d19b29c5bbc553c7e42f7b311, 0xc047cb8e976f912d2496f5d3df5ba3, 0x00209e ] } , - BigNum { limbs: [ 0x597b23df05312f8c2af61a8141cd2a, 0x0fd36013a65e8edf76cab18f8a37c7, 0x0008f6 ] } , - BigNum { limbs: [ 0x6428df20f92acf73d509e47ebe32d7, 0x977fc989d6e9a45a613d58124dcd8c, 0x006af7 ] } , - BigNum { limbs: [ 0x18d8297cc221bdb5e7ec7507841320, 0x300ff31bf898416efa2f23e851d93e, 0x00315f ] } , - BigNum { limbs: [ 0xa4cbd9833c3a414a181389f87bece1, 0x7743368184aff1caddd8e5b9862c15, 0x00428e ] } , - BigNum { limbs: [ 0xb9cfa13c9e7075a60c85450b7b2f47, 0x6723c0c73b43c6b58ce353a65ae24f, 0x000185 ] } , - BigNum { limbs: [ 0x03d461c35feb8959f37ab9f484d0ba, 0x402f68d642046c844b24b5fb7d2304, 0x007268 ] } , - BigNum { limbs: [ 0x4aa8865b38d3fe56375852f503eab6, 0x0a59d3076a69a11bab9cdb76c9aa34, 0x002e1d ] } , - BigNum { limbs: [ 0x72fb7ca4c58800a9c8a7ac0afc154b, 0x9cf9569612de921e2c6b2e2b0e5b1f, 0x0045d0 ] } , - BigNum { limbs: [ 0x2f158931e7234f34277686b037a511, 0x36a53627e337d86327fa50db777aaf, 0x003bff ] } , - BigNum { limbs: [ 0x8e8e79ce1738afcbd889784fc85af0, 0x70adf3759a105ad6b00db8c6608aa4, 0x0037ee ] } , - BigNum { limbs: [ 0x5b11f7e8d7950307379aa242bef13a, 0x854d6e4b49d1a48d5cc9eb4b326da6, 0x003cd9 ] } , - BigNum { limbs: [ 0x62920b1726c6fbf8c8655cbd410ec7, 0x2205bb5233768eac7b3e1e56a597ad, 0x003714 ] } , - BigNum { limbs: [ 0x74c9b15c2f6c8157b9d269efd0d9fd, 0x43d2741d83a4ffa6a4d8853dc711ed, 0x00349a ] } , - BigNum { limbs: [ 0x48da51a3ceef7da8462d95102f2604, 0x6380b57ff9a33393332f846410f366, 0x003f53 ] } , - BigNum { limbs: [ 0x922dc33e3981ed211c46be69369843, 0x792481d33f84533665b7ea0775febc, 0x004a34 ] } , - BigNum { limbs: [ 0x2b763fc1c4da11dee3b94096c967be, 0x2e2ea7ca3dc3e00372501f9a620697, 0x0029b9 ] } , - BigNum { limbs: [ 0x6fa92e866fdb2fb08e0577296c2a24, 0xadb60d8a7bf7640ac08abd3c0874ce, 0x00699a ] } , - BigNum { limbs: [ 0x4dfad4798e80cf4f71fa87d693d5dd, 0xf99d1c130150cf2f177d4c65cf9085, 0x000a52 ] } , - BigNum { limbs: [ 0x10bc93086722d6faa75e2409644896, 0x0d36010c2912e9b9971968377e8f23, 0x0045cc ] } , - BigNum { limbs: [ 0xace76ff79739280558a1daf69bb76b, 0x9a1d28915435498040eea16a597630, 0x002e21 ] } , - BigNum { limbs: [ 0x12974aa30cb0dbc3ad07b8488f216a, 0x599a73b32821076027ac452fa314e7, 0x0027f8 ] } , - BigNum { limbs: [ 0xab0cb85cf1ab233c52f846b770de97, 0x4db8b5ea55272bd9b05bc47234f06c, 0x004bf5 ] } , - BigNum { limbs: [ 0x07c23f803514299fe2121c20b86988, 0xb000d89ab17c3ca13436f849d0c5b7, 0x0052a3 ] } , - BigNum { limbs: [ 0xb5e1c37fc947d5601dede2df479679, 0xf7525102cbcbf698a3d11158073f9c, 0x002149 ] } , - BigNum { limbs: [ 0x54efb0bc8d997ff0498fbd3aed65cf, 0xb926e96be027edd2c44927ecd41b3a, 0x0021f9 ] } , - BigNum { limbs: [ 0x68b4524370c27f0fb67041c5129a32, 0xee2c40319d20456713bee1b503ea19, 0x0051f3 ] } , - BigNum { limbs: [ 0xc33eff3b2e005d15c92e1aac022f7a, 0x03f06c32134406419d72de2d04da5c, 0x0038dd ] } , - BigNum { limbs: [ 0xfa6503c4d05ba1ea36d1e453fdd087, 0xa362bd6b6a042cf83a952b74d32af6, 0x003b10 ] } , - BigNum { limbs: [ 0x35e832d903d52910fc77c70f6789eb, 0x025cc14be0ad31420245361de9b12f, 0x00575f ] } , - BigNum { limbs: [ 0x87bbd026fa86d5ef038837f0987616, 0xa4f668519c9b01f7d5c2d383ee5424, 0x001c8e ] } , - BigNum { limbs: [ 0xb7ab8507f3920122be1a8aba702c85, 0x25e3c9a4ab06a671d938712e096896, 0x0058b6 ] } , - BigNum { limbs: [ 0x05f87df80ac9fddd41e574458fd37c, 0x816f5ff8d2418cc7fecf9873ce9cbd, 0x001b37 ] } , - BigNum { limbs: [ 0x69be7aef4c8d1ef94c14f22139573f, 0x6f3cc7d42821defa95e48ec5f0df7f, 0x004e12 ] } , - BigNum { limbs: [ 0x53e58810b1cee006b3eb0cdec6a8c2, 0x381661c95526543f42237adbe725d4, 0x0025db ] } , - BigNum { limbs: [ 0x743ad6e2d471f5c5266f7287443e47, 0x5f70d71d12f4ac20bd03516e01a536, 0x002adc ] } , - BigNum { limbs: [ 0x49692c1d29ea093ad9908c78bbc1ba, 0x47e252806a5387191b04b833d6601d, 0x004911 ] } , - BigNum { limbs: [ 0x2c25c55d44a0cda2c7312172f024d5, 0x856c0c995405fcbdc0f7c531d5529a, 0x004d16 ] } , - BigNum { limbs: [ 0x917e3da2b9bb315d38cedd8d0fdb2c, 0x21e71d042942367c1710447002b2b9, 0x0026d7 ] } , - BigNum { limbs: [ 0x223e998d178fb680440e833ea39b55, 0x42b69828825b5da8aa10fae01e8c0c, 0x00181c ] } , - BigNum { limbs: [ 0x9b656972e6cc487fbbf17bc15c64ac, 0x649c9174faecd5912df70ec1b97947, 0x005bd1 ] } , - BigNum { limbs: [ 0x10989d7476cf2bc1bf28a8007ab548, 0xeb7d5ee5004ffc6c81de8478b8e220, 0x002099 ] } , - BigNum { limbs: [ 0xad0b658b878cd33e40d756ff854ab9, 0xbbd5cab87cf836cd562985291f2333, 0x005353 ] } , - BigNum { limbs: [ 0x96d79f8a3e8e0b93b28aebc303f074, 0xc9102a942d517007277851e8aec9ea, 0x0024db ] } , - BigNum { limbs: [ 0x26cc6375bfcdf36c4d75133cfc0f8d, 0xde42ff094ff6c332b08fb7b9293b69, 0x004f11 ] } , - BigNum { limbs: [ 0x472415b0f60defaa8f3f7b31a9d713, 0x5bb263c0e75edaf8ea26346303cc91, 0x00406e ] } , - BigNum { limbs: [ 0x767fed4f084e0f5570c083ce5628ee, 0x4ba0c5dc95e95840ede1d53ed438c2, 0x00337f ] } , - BigNum { limbs: [ 0x22c16ba307dd3aa0d0db6053a9a3e0, 0xe0b7bf8e8c0fd7bcbd2b9d03b8b2db, 0x000042 ] } , - BigNum { limbs: [ 0x9ae2975cf67ec45f2f249eac565c21, 0xc69b6a0ef1385b7d1adc6c9e1f5278, 0x0073aa ] } , - BigNum { limbs: [ 0xd8f9f506885a4f1784febbb03b452f, 0xd0cbdf62af6ec9809d68741ff12a30, 0x000d36 ] } , - BigNum { limbs: [ 0xe4aa0df97601afe87b01434fc4bad2, 0xd6874a3acdd969b93a9f9581e6db22, 0x0066b6 ] } , - BigNum { limbs: [ 0x657d647e701c3bc1294eb7f2f2f66d, 0x076752b9400f5ae617b0fcc5dbf9ca, 0x002887 ] } , - BigNum { limbs: [ 0x58269e818e3fc33ed6b1470d0d0994, 0x9febd6e43d38d853c0570cdbfc0b89, 0x004b66 ] } , - BigNum { limbs: [ 0xf3dc40acfe2b7256cfcec9c01c3ffe, 0xdab0be5128d795d19d03d8fd323cf7, 0x0068f0 ] } , - BigNum { limbs: [ 0xc9c7c25300308ca93031353fe3c003, 0xcca26b4c54709d683b0430a4a5c85b, 0x000afc ] } , - BigNum { limbs: [ 0x39c74778c695afde09673bab61e898, 0xdf77f041dc9735c1728a223969d1ee, 0x0013c8 ] } , - BigNum { limbs: [ 0x83dcbb8737c64f21f698c3549e1769, 0xc7db395ba0b0fd78657de7686e3365, 0x006024 ] } , - BigNum { limbs: [ 0x16c96bf3f6890a98d0402a397d3074, 0xa203d88e626925ff7d17d595046f32, 0x0057df ] } , - BigNum { limbs: [ 0xa6da970c07d2f4672fbfd4c682cf8d, 0x054f510f1adf0d3a5af0340cd39621, 0x001c0e ] } , - BigNum { limbs: [ 0xd286c9c7b2f3fd967bc7d5bce1a804, 0xdd564bbe5d15ce91a6d6efc2c7ca96, 0x007073 ] } , - BigNum { limbs: [ 0xeb1d39384b680169843829431e57fd, 0xc9fcdddf203264a8313119df103abc, 0x000379 ] } , - BigNum { limbs: [ 0xe540b9c586fcea58550848d0259347, 0xba723ff8c505df9d9a8301247105a2, 0x00046c ] } , - BigNum { limbs: [ 0xd863493a775f14a7aaf7b62fda6cba, 0xece0e9a4b842539c3d85087d66ffb0, 0x006f80 ] } , - BigNum { limbs: [ 0x97ac9b42b5bc323c3e9892b876b461, 0xd6151fc5ce2e0c824958cba91b6f97, 0x001128 ] } , - BigNum { limbs: [ 0x25f767bd489fccc3c1676c47894ba0, 0xd13e09d7af1a26b78eaf3df8bc95bc, 0x0062c4 ] } , - BigNum { limbs: [ 0xe306b538773eb4b850d2a3eabf958f, 0x7355217fce074c0bb60b247d0d6499, 0x0033dc ] } , - BigNum { limbs: [ 0xda9d4dc7871d4a47af2d5b15406a72, 0x33fe081daf40e72e21fce524caa0b9, 0x004011 ] } , - BigNum { limbs: [ 0xd5081bd50bfe8c49ab063c9866233a, 0x8d40c2ef982f0174fd293ff31fa487, 0x00546f ] } , - BigNum { limbs: [ 0xe89be72af25d72b654f9c26799dcc7, 0x1a1266ade51931c4dadec9aeb860cb, 0x001f7e ] } , - BigNum { limbs: [ 0xd4dd6fb2dd1c1cec4a327b5d6681f3, 0x978bf9dde4f2a890bb7866fb5680a5, 0x00421a ] } , - BigNum { limbs: [ 0xe8c6934d213fe213b5cd83a2997e0e, 0x0fc72fbf98558aa91c8fa2a68184ad, 0x0031d3 ] } , - BigNum { limbs: [ 0x46e6e574bb0264650613937dec903a, 0xc4fdd5553c2b935c9c3ce1c6e9f013, 0x0004e9 ] } , - BigNum { limbs: [ 0x76bd1d8b43599a9af9ec6b82136fc7, 0xe2555448411c9fdd3bcb27daee1540, 0x006f03 ] } , - BigNum { limbs: [ 0x967c6423a55ee21c6f641f5ca11dfc, 0x2962daeacf09aac3e29a57a5f0d8ef, 0x0000f1 ] } , - BigNum { limbs: [ 0x27279edc58fd1ce3909bdfa35ee205, 0x7df04eb2ae3e8875f56db1fbe72c64, 0x0072fc ] } , - BigNum { limbs: [ 0xa48d852fc35b7c3556faf3eba03702, 0x7d9f742f652cb5537e7ab5699d8e10, 0x000a28 ] } , - BigNum { limbs: [ 0x19167dd03b0082caa9050b145fc8ff, 0x29b3b56e181b7de6598d54383a7743, 0x0069c5 ] } , - BigNum { limbs: [ 0x4ece6e79d374f7694d7d44aa42aaf2, 0x25830d537d2afc0117e00180409d8d, 0x005c98 ] } , - BigNum { limbs: [ 0x6ed594862ae70796b282ba55bd550f, 0x81d01c4a001d3738c02808219767c6, 0x001755 ] } , - BigNum { limbs: [ 0xb02312ec12eeec6e8f66fbf9b79cc1, 0xb52abbca218662fa4f9250a0361b14, 0x002c94 ] } , - BigNum { limbs: [ 0x0d80f013eb6d129170990306486340, 0xf2286dd35bc1d03f8875b901a1ea3f, 0x004758 ] } , - BigNum { limbs: [ 0x06b58844f30ad2b5006d3e54988604, 0x08e682580ff68a3ffa39d11f260543, 0x0051cb ] } , - BigNum { limbs: [ 0xb6ee7abb0b512c4aff92c0ab6779fd, 0x9e6ca7456d51a8f9ddce3882b20010, 0x002222 ] } , - BigNum { limbs: [ 0x07e8ac00ccd608596a75b117ddfba0, 0x1c78170c4872ed5d290fa2d313f10c, 0x0021a0 ] } , - BigNum { limbs: [ 0xb5bb56ff3185f6a6958a4de8220461, 0x8adb129134d545dcaef866cec41447, 0x00524d ] } , - BigNum { limbs: [ 0x309873a10967a45beb4be6840f3104, 0xdee51318c6e47085da8a68d064ea95, 0x005b93 ] } , - BigNum { limbs: [ 0x8d0b8f5ef4f45aa414b4187bf0cefd, 0xc86e1684b663c2b3fd7da0d1731abe, 0x001859 ] } , - BigNum { limbs: [ 0x6bccfd4eb9f5f9bac25779bd028d08, 0x4c188b40510d4553ed07dd76774c14, 0x00204e ] } , - BigNum { limbs: [ 0x51d705b1446605453da88542fd72f9, 0x5b3a9e5d2c3aede5eb002c2b60b93f, 0x00539f ] } , - BigNum { limbs: [ 0x9cde21536c74fac14aa34c68accbfa, 0xacabe5adc2561160383ee23ed3ba6d, 0x0017a9 ] } , - BigNum { limbs: [ 0x20c5e1ac91e7043eb55cb297533407, 0xfaa743efbaf221d99fc92763044ae6, 0x005c43 ] } , - BigNum { limbs: [ 0x0e05ddcf13a22fbd9b29beb5d8cc55, 0x7f61fc62e2a94bc3a5672aa39e4215, 0x000c58 ] } , - BigNum { limbs: [ 0xaf9e2530eab9cf4264d6404a2733ac, 0x27f12d3a9a9ee77632a0defe39c33e, 0x006795 ] } , - BigNum { limbs: [ 0x375b2142604d30f4d7712a9f7e571c, 0xcab5043cc4f48ad290c1186b578186, 0x005b3c ] } , - BigNum { limbs: [ 0x8648e1bd9e0ece0b288ed46081a8e5, 0xdc9e2560b853a8674746f1368083cd, 0x0018b0 ] } , - BigNum { limbs: [ 0x0d311f3cdb74b04dc26f175eaf57e2, 0x9930e7bfc55513a31b5c3e627cc654, 0x00000d ] } , - BigNum { limbs: [ 0xb072e3c322e74eb23d90e7a150a81f, 0x0e2241ddb7f31f96bcabcb3f5b3eff, 0x0073e0 ] } , - BigNum { limbs: [ 0x0a9c3e533dc34f63482f5e6ac7f5ee, 0x67bf56026f1264f3c71a7fc4285c1b, 0x001ef8 ] } , - BigNum { limbs: [ 0xb307c4acc098af9cb7d0a095380a13, 0x3f93d39b0e35ce4610ed89ddafa938, 0x0054f5 ] } , - BigNum { limbs: [ 0xf4363b42e95eb239d9acde14fb20e2, 0xa43cfc49003d2e82c238e01af647d6, 0x0034fe ] } , - BigNum { limbs: [ 0xc96dc7bd14fd4cc6265320eb04df1f, 0x03162d547d0b04b715cf2986e1bd7c, 0x003eef ] } , - BigNum { limbs: [ 0x537def6e0f30f92345e2553f15b27d, 0x399fdefa8ddc87f3c352e16c5500fb, 0x005ae6 ] } , - BigNum { limbs: [ 0x6a261391ef2b05dcba1da9c0ea4d84, 0x6db34aa2ef6bab4614b52835830458, 0x001907 ] } , - BigNum { limbs: [ 0x2f5049b1d0e187821f241ffda547a5, 0x8f3a988966e051b31982d33b68de07, 0x000c4e ] } , - BigNum { limbs: [ 0x8e53b94e2d7a777de0dbdf025ab85c, 0x181891141667e186be8536666f274c, 0x00679f ] } , - BigNum { limbs: [ 0x0f2fa24cca7e118a23f8184f67be53, 0x33bf9e5c6e898b6d5abad78fbbc311, 0x005a94 ] } , - BigNum { limbs: [ 0xae7460b333dded75dc07e6b09841ae, 0x73938b410ebea7cc7d4d32121c4242, 0x001959 ] } , - BigNum { limbs: [ 0x58b769fd60bae85dd0ba3600c21ea9, 0xcba700d5638da68d1e587fd67f193c, 0x00442a ] } , - BigNum { limbs: [ 0x64ec99029da116a22f45c8ff3de158, 0xdbac28c819ba8cacb9af89cb58ec17, 0x002fc2 ] } , - BigNum { limbs: [ 0x49a4ab02e82f769ee500f647f7d43b, 0xb7446f10658c06ede0897762f302e9, 0x003cc1 ] } , - BigNum { limbs: [ 0x73ff57fd162c88611aff08b8082bc6, 0xf00eba8d17bc2c4bf77e923ee5026a, 0x00372b ] } , - BigNum { limbs: [ 0x511800ae1cf2a898a5dc3fa6a50014, 0x687779a20ce0b1eeadb86ec0a240a1, 0x000f9d ] } , - BigNum { limbs: [ 0x6c8c0251e16956675a23bf595affed, 0x3edbaffb7067814b2a4f9ae135c4b2, 0x006450 ] } , - BigNum { limbs: [ 0xa29e201b732f6dad4c4a46f5409741, 0xb39452ab3a4709599704eba189b706, 0x0017f3 ] } , - BigNum { limbs: [ 0x1b05e2e48b2c9152b3b5b80abf68c0, 0xf3bed6f2430129e041031e004e4e4d, 0x005bf9 ] } , - BigNum { limbs: [ 0x8c90ec812879e1589db18082632470, 0x0d64d5746e14f108e29cdc4cf25ab0, 0x000bd7 ] } , - BigNum { limbs: [ 0x3113167ed5e21da7624e7e7d9cdb91, 0x99ee54290f334230f56b2d54e5aaa3, 0x006816 ] } , - BigNum { limbs: [ 0xe820d586118b4a5213a84b62a68904, 0x52bba176b0cf4add1ac0d9aa0cc9d8, 0x0046e3 ] } , - BigNum { limbs: [ 0xd5832d79ecd0b4adec57b39d5976fd, 0x54978826cc78e85cbd472ff7cb3b7a, 0x002d0a ] } , - BigNum { limbs: [ 0x285991341c908ed897ab600af26a9f, 0x4729896b3e93c2aeac62b2b1175d52, 0x006743 ] } , - BigNum { limbs: [ 0x954a71cbe1cb702768549ef50d9562, 0x6029a0323eb4708b2ba556f0c0a801, 0x000caa ] } , - BigNum { limbs: [ 0xee64f977b0bc8213b864a44525e8e4, 0x576fae62c2747e9d59a9016efb44e8, 0x001b4d ] } , - BigNum { limbs: [ 0xcf3f09884d9f7cec479b5abada171d, 0x4fe37b3abad3b49c7e5f0832dcc06a, 0x0058a0 ] } , - BigNum { limbs: [ 0xbb530e72b7bfc3855fca21c045e849, 0x249e0bfc4d51cc64d8b824c354c377, 0x0023d3 ] } , - BigNum { limbs: [ 0x0250f48d469c3b7aa035dd3fba17b8, 0x82b51da12ff666d4ff4fe4de8341dc, 0x00501a ] } , - BigNum { limbs: [ 0x82849fa29e943275fe4524a3df9914, 0x4787c92fb6003ec786b72669f55ce5, 0x00043f ] } , - BigNum { limbs: [ 0x3b1f635d5fc7cc8a01bada5c2066ed, 0x5fcb606dc747f4725150e337e2a86e, 0x006fae ] } , - BigNum { limbs: [ 0x6b6f86bf14aefcc2338ad83cdfa657, 0xb53f58ce81940a859ee7dfedce98f1, 0x005c9d ] } , - BigNum { limbs: [ 0x52347c40e9ad023dcc7526c32059aa, 0xf213d0cefbb428b4392029b4096c62, 0x00174f ] } , - BigNum { limbs: [ 0xdcf47128786d2189831ce42c6138b3, 0x498eb85e702360db58e449ef2a892a, 0x0003f6 ] } , - BigNum { limbs: [ 0xe0af91d785eedd767ce31ad39ec74e, 0x5dc4713f0d24d25e7f23bfb2ad7c28, 0x006ff7 ] } , - BigNum { limbs: [ 0xf89acd6211e66705b59d4d67e78267, 0x51a561f4691450c8d1e120be501af7, 0x003dde ] } , - BigNum { limbs: [ 0xc509359dec7597fa4a62b198187d9a, 0x55adc7a91433e2710626e8e387ea5b, 0x00360f ] } , - BigNum { limbs: [ 0x5c622bba78e96e62ad6e618cd63fc9, 0xe604e2122797b4fc5b308c0f64c4b1, 0x006f1b ] } , - BigNum { limbs: [ 0x6141d7458572909d52919d7329c038, 0xc14e478b55b07e3d7cd77d927340a2, 0x0004d1 ] } , - BigNum { limbs: [ 0x7e9861925f3c85728b638faa490c47, 0x8f85d4bb9c9568fd174cc19863a83f, 0x001590 ] } , - BigNum { limbs: [ 0x3f0ba16d9f1f798d749c6f55b6f3ba, 0x17cd54e1e0b2ca3cc0bb4809745d14, 0x005e5d ] } , - BigNum { limbs: [ 0x5cc1b32b2a1950ab93f25b2906d21a, 0x69a09d5aa6587cf3f6638899a0097e, 0x00671e ] } , - BigNum { limbs: [ 0x60e24fd4d442ae546c0da3d6f92de7, 0x3db28c42d6efb645e1a4810837fbd5, 0x000ccf ] } , - BigNum { limbs: [ 0xc8f5dd633013028cfda586295ea84b, 0x7cce960c7027f14b86bb7c12055e83, 0x003da0 ] } , - BigNum { limbs: [ 0xf4ae259cce48fc73025a78d6a157b6, 0x2a8493910d2041ee514c8d8fd2a6cf, 0x00364d ] } , - BigNum { limbs: [ 0x71d0d9c1e612bd99b980c752953536, 0x26c472d9a268f3d2329d2bd130b8e7, 0x005126 ] } , - BigNum { limbs: [ 0x4bd3293e18494166467f37ad6acacb, 0x808eb6c3dadf3f67a56addd0a74c6c, 0x0022c7 ] } , - BigNum { limbs: [ 0x735dfec23461fb447108a871678206, 0x593fb2d1e4796f84312c4cd1ae75c2, 0x000d82 ] } , - BigNum { limbs: [ 0x4a46043dc9fa03bb8ef7568e987dfb, 0x4e1376cb98cec3b5a6dbbcd0298f91, 0x00666b ] } , - BigNum { limbs: [ 0x29130b18a08ed66bb7b793ab94d67d, 0xd9b87eff068a96987520a4a84e5315, 0x006d86 ] } , - BigNum { limbs: [ 0x9490f7e75dcd289448486b546b2984, 0xcd9aaa9e76bd9ca162e764f989b23e, 0x000666 ] } , - BigNum { limbs: [ 0xefd6b0570bf109d58a5af42d010ff9, 0xb09858f43cef3ed6d55a6350721d79, 0x002f27 ] } , - BigNum { limbs: [ 0xcdcd52a8f26af52a75a50ad2fef008, 0xf6bad0a94058f46302ada65165e7d9, 0x0044c5 ] } , - BigNum { limbs: [ 0x977360b30175c52dbb2cf227158434, 0x2fe0ca12c0b44b70ca6708f3104867, 0x002318 ] } , - BigNum { limbs: [ 0x2630a24cfce639d244d30cd8ea7bcd, 0x77725f8abc93e7c90da100aec7bcec, 0x0050d5 ] } , - BigNum { limbs: [ 0x835c9ca817ed357b3354fe4df74d21, 0xa535477e1384fba967880c356fda5d, 0x006d52 ] } , - BigNum { limbs: [ 0x3a476657e66ec984ccab00b208b2e0, 0x021de21f69c33790707ffd6c682af6, 0x00069b ] } , - BigNum { limbs: [ 0x62f50c1fa01a6ebf12d1967f5228c6, 0xcccb86887bc1090ea1eafe6cd3d6f0, 0x0021c7 ] } , - BigNum { limbs: [ 0x5aaef6e05e419040ed2e6880add73b, 0xda87a31501872a2b361d0b35042e63, 0x005225 ] } , - BigNum { limbs: [ 0x783e184f0f10da4ad463040bfa6b96, 0x89d9a062ba8ff6e0797726f231b176, 0x004b12 ] } , - BigNum { limbs: [ 0x4565eab0ef4b24b52b9cfaf405946b, 0x1d79893ac2b83c595e90e2afa653dd, 0x0028db ] } , - BigNum { limbs: [ 0x7fcbf22df21291ca782131084255da, 0xb49750ddb83253aa8f5c166504001b, 0x002164 ] } , - BigNum { limbs: [ 0x3dd810d20c496d3587decdf7bdaa27, 0xf2bbd8bfc515df8f48abf33cd40538, 0x005288 ] } , - BigNum { limbs: [ 0xeea8827f4e9ec602b926b27753b127, 0xfbbd7f20c3ced966ea577b468e20b9, 0x004f0e ] } , - BigNum { limbs: [ 0xcefb8080afbd38fd46d94c88ac4eda, 0xab95aa7cb97959d2edb08e5b49e499, 0x0024de ] } , - BigNum { limbs: [ 0xa933db67c24c70716d094756b66d63, 0x1aa615b346f8ebad67ddc10c732ae8, 0x0004d2 ] } , - BigNum { limbs: [ 0x147027983c0f8e8e92f6b7a949929e, 0x8cad13ea364f478c702a489564da6b, 0x006f1b ] } , - BigNum { limbs: [ 0xf79311d4603ebe660cb35a9fa42972, 0xdb65a3240463f4216b3d286b5f60ee, 0x000b7b ] } , - BigNum { limbs: [ 0xc610f12b9e1d4099f34ca4605bd68f, 0xcbed867978e43f186ccae13678a464, 0x006871 ] } , - BigNum { limbs: [ 0xafc701df2ef92f02a3555fc5ee25f7, 0x471ca69edd738a2bb3e93d180d6310, 0x004751 ] } , - BigNum { limbs: [ 0x0ddd0120cf62cffd5caa9f3a11da0a, 0x603682fe9fd4a90e241ecc89caa243, 0x002c9c ] } , - BigNum { limbs: [ 0x83b10a7188a75be4d08b3a9bd95dc2, 0xc0e837c5ea1d5fd7929a9439bb000a, 0x0012c1 ] } , - BigNum { limbs: [ 0x39f2f88e75b4a31b2f74c46426a23f, 0xe66af1d7932ad362456d75681d0549, 0x00612b ] } , - BigNum { limbs: [ 0x40d6987940175aa503ad6c44bc5ff8, 0xb1e6bfb9702607fd3c97042f2373a4, 0x005a03 ] } , - BigNum { limbs: [ 0x7ccd6a86be44a45afc5292bb43a009, 0xf56c69e40d222b3c9b710572b491af, 0x0019e9 ] } , - BigNum { limbs: [ 0x9c55f6ffe871ea5ddbbc4e9b6615b8, 0x0415d906203d93cbbee466fd232897, 0x00005c ] } , - BigNum { limbs: [ 0x214e0c0015ea14a22443b06499ea49, 0xa33d50975d0a9f6e1923a2a4b4dcbc, 0x007391 ] } , - BigNum { limbs: [ 0xd30122c843684408d2342a11db2c67, 0xe20c7f6c968c5058ca294459777599, 0x002c14 ] } , - BigNum { limbs: [ 0xeaa2e037baf3baf72dcbd4ee24d39a, 0xc546aa30e6bbe2e10ddec548608fb9, 0x0047d8 ] } , - BigNum { limbs: [ 0xcf9853c5492f70dbe2b6ae6a65e380, 0x4b4b630bd746efffb256ee28750441, 0x000c94 ] } , - BigNum { limbs: [ 0xee0baf3ab52c8e241d4950959a1c81, 0x5c07c691a601433a25b11b79630111, 0x006759 ] } , - BigNum { limbs: [ 0xa240a2a069113c159a067743cae6c5, 0xeb7f91a0d0a7f1d0c3c19d09cf9306, 0x00585a ] } , - BigNum { limbs: [ 0x1b63605f954ac2ea65f987bc35193c, 0xbbd397fcaca0416914466c9808724d, 0x001b92 ] } , - BigNum { limbs: [ 0xc301f4f32087447899594a115b42ec, 0xa53a04150fa19233a27cfafd0e6ca8, 0x002e4c ] } , - BigNum { limbs: [ 0xfaa20e0cddd4ba8766a6b4eea4bd15, 0x021925886da6a106358b0ea4c998aa, 0x0045a1 ] } , - BigNum { limbs: [ 0xb12fefba555a4c968b0decdd5c8bff, 0xbdc683722a25b401681bc0a21dae2e, 0x001c50 ] } , - BigNum { limbs: [ 0x0c741345a901b26974f21222a37402, 0xe98ca62b53227f386fec48ffba5725, 0x00579c ] } , - BigNum { limbs: [ 0xefb15e20ddffa892cbd498b8ae4748, 0x2ca691fde3753d113105a6f6224cab, 0x0037a8 ] } , - BigNum { limbs: [ 0xcdf2a4df205c566d342b664751b8b9, 0x7aac979f99d2f628a70262abb5b8a7, 0x003c45 ] } , - BigNum { limbs: [ 0xde6c81def05707ddd48b53c0632b7f, 0xb79237478ed134868d055a78d4d127, 0x006482 ] } , - BigNum { limbs: [ 0xdf3781210e04f7222b74ab3f9cd482, 0xefc0f255ee76feb34b02af2903342b, 0x000f6a ] } , - BigNum { limbs: [ 0x905e68e892d76597534a53351aeb21, 0xc2b7e09e88cf54c6bcf61242906281, 0x001c1b ] } , - BigNum { limbs: [ 0x2d459a176b849968acb5abcae514e0, 0xe49b48fef478de731b11f75f47a2d2, 0x0057d1 ] } , - BigNum { limbs: [ 0x3059b2dacb997091e05fa34880ee67, 0xb79d4996ad5169ae844074894dab48, 0x002374 ] } , - BigNum { limbs: [ 0x8d4a502532c28e6e1fa05bb77f119a, 0xefb5e006cff6c98b53c795188a5a0b, 0x005078 ] } , - BigNum { limbs: [ 0x81a6284dfcdcdb79aca024dfa3bea6, 0x4cf83a91c028b44b584b898ea2487e, 0x0032af ] } , - BigNum { limbs: [ 0x3bfddab2017f2386535fda205c415b, 0x5a5aef0bbd1f7eee7fbc801335bcd5, 0x00413e ] } , - BigNum { limbs: [ 0xe255d810db7c7ba57428937e370687, 0x2e7f20b138794741d7afe1d1739af4, 0x004cf7 ] } , - BigNum { limbs: [ 0xdb4e2aef22df835a8bd76b81c8f97a, 0x78d408ec44ceebf8005827d0646a5e, 0x0026f6 ] } , - BigNum { limbs: [ 0x2a36904e65334d504798a56d84b81b, 0x4e6452d677424619a91495c55a387a, 0x001963 ] } , - BigNum { limbs: [ 0x936d72b19928b1afb86759927b47e6, 0x58eed6c70605ed202ef373dc7dccd9, 0x005a8a ] } , - BigNum { limbs: [ 0x892679c5bf83b3bedbfaac558c8d18, 0xe9ac49520d3dc9997bf03a451a6630, 0x003754 ] } , - BigNum { limbs: [ 0x347d893a3ed84b41240552aa7372e9, 0xbda6e04b700a69a05c17cf5cbd9f23, 0x003c98 ] } , - BigNum { limbs: [ 0xf254f66ae5ee531c14292bf0255fd5, 0x1effcfc73d5c86252263d4232859d9, 0x00526e ] } , - BigNum { limbs: [ 0xcb4f0c95186dabe3ebd6d30fdaa02c, 0x885359d63febad14b5a4357eafab79, 0x00217f ] } , - BigNum { limbs: [ 0xe17e99d8256761f9a5ad12c1f3853f, 0x36423bc3f0fae23f188a9a547b7d01, 0x006a6d ] } , - BigNum { limbs: [ 0xdc256927d8f49d065a52ec3e0c7ac2, 0x7110edd98c4d50fabf7d6f4d5c8851, 0x000980 ] } , - BigNum { limbs: [ 0x306689091abed321eed5418571ac33, 0x92d95a4ef11d7cddd189d0ec4d20a0, 0x000e3d ] } , - BigNum { limbs: [ 0x8d3d79f6e39d2bde112abd7a8e53ce, 0x1479cf4e8c2ab65c067e38b58ae4b3, 0x0065b0 ] } , - BigNum { limbs: [ 0x3d1d54f8f2982de43fdb36bf47bcc3, 0xba63f2b18adc6f2e9e0b45136d4f1c, 0x006efb ] } , - BigNum { limbs: [ 0x8086ae070bc3d11bc024c840b8433e, 0xecef36ebf26bc40b39fcc48e6ab637, 0x0004f1 ] } , - BigNum { limbs: [ 0x902f381368c0b10a873d6c9d82cbdd, 0x7b0015a2d0fe32712683cabe07344f, 0x0050ee ] } , - BigNum { limbs: [ 0x2d74caec959b4df578c292627d3424, 0x2c5313faac4a00c8b1843ee3d0d104, 0x0022ff ] } , - BigNum { limbs: [ 0xee61519e282a1877ab619f936cb9e1, 0xf2c40c622d5c14a79f3664b930f42d, 0x002e62 ] } , - BigNum { limbs: [ 0xcf42b161d631e688549e5f6c934620, 0xb48f1d3b4fec1e9238d1a4e8a71125, 0x00458a ] } , - BigNum { limbs: [ 0xc4dccaecd1fbf5e4f8b0b094a83cb3, 0xa8ec3ef066195ec440a4e3fd2ea14c, 0x000539 ] } , - BigNum { limbs: [ 0xf8c738132c60091b074f4e6b57c34e, 0xfe66eaad172ed475976325a4a96406, 0x006eb3 ] } , - BigNum { limbs: [ 0xea27b86283f69cf28211eacc0710ff, 0x0a61fb4687169578008f160eb02032, 0x0016a8 ] } , - BigNum { limbs: [ 0xd37c4a9d7a65620d7dee1433f8ef02, 0x9cf12e56f6319dc1d778f39327e520, 0x005d45 ] } , - BigNum { limbs: [ 0x53ec9a4a2ac078308183f53cba4097, 0x9444ba3d2df9d017f9d3a6beb55f1f, 0x004fb9 ] } , - BigNum { limbs: [ 0x69b768b5d39b86cf7e7c09c345bf6a, 0x130e6f604f4e6321de3462e322a634, 0x002434 ] } , - BigNum { limbs: [ 0xd20df595f39f2afdc2fcf153ad903c, 0x2ece77c82d2c0c03b16ef100307a6e, 0x000d33 ] } , - BigNum { limbs: [ 0xeb960d6a0abcd4023d030dac526fc5, 0x7884b1d5501c2736269918a1a78ae4, 0x0066ba ] } , - BigNum { limbs: [ 0x0ac6a330a41421f54ee691e0643777, 0x4f96d2ac9b3923c8d9e9259802f7d7, 0x002194 ] } , - BigNum { limbs: [ 0xb2dd5fcf5a47dd0ab1196d1f9bc88a, 0x57bc56f0e20f0f70fe1ee409d50d7c, 0x005259 ] } , - BigNum { limbs: [ 0x0e3d52802ba363eb2b24461b367723, 0x0dba5e260f57ac9e3e8ba3ed80a750, 0x006e68 ] } , - BigNum { limbs: [ 0xaf66b07fd2b89b14d4dbb8e4c988de, 0x9998cb776df0869b997c65b4575e03, 0x000585 ] } , - BigNum { limbs: [ 0xc786c39e8d76c168070ff63089758b, 0x4bf2fd4556aba449afd09e0b523b9a, 0x0047cd ] } , - BigNum { limbs: [ 0xf61d3f6170e53d97f8f008cf768a76, 0x5b602c58269c8ef028376b9685c9b8, 0x002c20 ] } , - BigNum { limbs: [ 0x5b740bab2ae626b3a288e56cbe6ba2, 0x2ec9ee1056d93f5bdf1610b8e02c02, 0x0061be ] } , - BigNum { limbs: [ 0x622ff754d375d84c5d77199341945f, 0x78893b8d266ef3ddf8f1f8e8f7d951, 0x00122f ] } , - BigNum { limbs: [ 0xb2b4506b58821b9782d98e09dd2095, 0x1180e4201fdd09faded963276eda9c, 0x001717 ] } , - BigNum { limbs: [ 0x0aefb294a5d9e3687d2670f622df6c, 0x95d2457d5d6b293ef92ea67a692ab7, 0x005cd6 ] } , - BigNum { limbs: [ 0x59d09e36445b2c8d76f7be4ffbdf0c, 0x7d907dfec3418f3e53c99a199f8fa5, 0x005deb ] } , - BigNum { limbs: [ 0x63d364c9ba00d272890840b00420f5, 0x29c2ab9eba06a3fb843e6f883875ae, 0x001602 ] } , - BigNum { limbs: [ 0x5abe13ab2a152efe228225b0b37c11, 0x78ed18c25162b9575235ed65ee9b01, 0x005681 ] } , - BigNum { limbs: [ 0x62e5ef54d446d001dd7dd94f4c83f0, 0x2e6610db2be579e285d21c3be96a52, 0x001d6c ] } , - BigNum { limbs: [ 0xd8c7e12991d3593a7478c980a80dcd, 0xb7a1c70a28635fea4420d98de0ddff, 0x00077f ] } , - BigNum { limbs: [ 0xe4dc21d66c88a5c58b87357f57f234, 0xefb1629354e4d34f93e73013f72753, 0x006c6d ] } , - BigNum { limbs: [ 0xbe7f08f42eb31a40103db7fbe67596, 0x76187ee6c6269fbef78669ab90d7d8, 0x005cb3 ] } , - BigNum { limbs: [ 0xff24fa0bcfa8e4bfefc24704198a6b, 0x313aaab6b721937ae0819ff6472d7a, 0x00173a ] } , - BigNum { limbs: [ 0x1234f45f84b51a2458759b86aa9b46, 0xbce4857298de5aa7436a8e41578bef, 0x001ade ] } , - BigNum { limbs: [ 0xab6f0ea079a6e4dba78a63795564bb, 0xea6ea42ae469d892949d7b60807964, 0x00590e ] } , - BigNum { limbs: [ 0xe8cb30c74f3496a5de0a8cb929b435, 0x7142c749358132565e4a3f276dddcf, 0x00263d ] } , - BigNum { limbs: [ 0xd4d8d238af27685a21f57246d64bcc, 0x3610625447c700e379bdca7a6a2783, 0x004db0 ] } , - BigNum { limbs: [ 0xc06812fcc08500e1b3a80d3dc99e5a, 0xde2bae7c6bb687328292c58f0914fc, 0x000a7a ] } , - BigNum { limbs: [ 0xfd3bf0033dd6fe1e4c57f1c23661a7, 0xc9277b211191ac0755754412cef056, 0x006972 ] } , - BigNum { limbs: [ 0xc8b17cc28f5b5914730aa651dc14c6, 0x0a2862c6b0aa7e00857f06f8f13093, 0x001dca ] } , - BigNum { limbs: [ 0xf4f2863d6f00a5eb8cf558ae23eb3b, 0x9d2ac6d6cc9db539528902a8e6d4bf, 0x005623 ] } , - BigNum { limbs: [ 0x1230bc0e387e9558bd52e8fdf0f3fa, 0x0e85c8adf888bf4821c2f7e1d5e5bb, 0x003755 ] } , - BigNum { limbs: [ 0xab7346f1c5dd69a742ad16020f0c07, 0x98cd60ef84bf73f1b64511c0021f98, 0x003c98 ] } , - BigNum { limbs: [ 0xe24941616914e7ad110ef96d2c8b89, 0x2f2b1ea09b86b3e9ced3336c9ff439, 0x001bbc ] } , - BigNum { limbs: [ 0xdb5ac19e95471752eef10592d37478, 0x78280afce1c17f500934d635381119, 0x005831 ] } , - BigNum { limbs: [ 0xb530ecbcf382bb730881f99cce2b05, 0x97b86edc1c02dfa201d28456bec63b, 0x00008a ] } , - BigNum { limbs: [ 0x087316430ad9438cf77e056331d4fc, 0x0f9abac161455397d635854b193f18, 0x007363 ] } , - BigNum { limbs: [ 0xa7275730b5b11515f4e3caddb042a0, 0xf0a1a79dc567185006d5ff757c19fe, 0x0056c8 ] } , - BigNum { limbs: [ 0x167cabcf48aae9ea0b1c34224fbd61, 0xb6b181ffb7e11ae9d1320a2c5beb55, 0x001d24 ] } , - BigNum { limbs: [ 0x61b6a2481f0bc6f89b6e4cc3f8a8d9, 0xcbcfbfa6e1cac504800176c799853b, 0x005048 ] } , - BigNum { limbs: [ 0x5bed60b7df5038076491b23c075728, 0xdb8369f69b7d6e35580692da3e8018, 0x0023a4 ] } , - BigNum { limbs: [ 0x65dd758be92292d21af29fac91cf26, 0xf5feecd35328814b1382cf67a22cc2, 0x00503f ] } , - BigNum { limbs: [ 0x57c68d7415396c2de50d5f536e30db, 0xb1543cca2a1fb1eec4853a3a35d891, 0x0023ad ] } , - BigNum { limbs: [ 0x1f5a7f98a0d41d2fb01e7994ae9e07, 0x266275af949d1efef1ea963a619c6d, 0x007145 ] } , - BigNum { limbs: [ 0x9e4983675d87e1d04fe1856b5161fa, 0x80f0b3ede8ab143ae61d73677668e6, 0x0002a8 ] } , - BigNum { limbs: [ 0x8d78320cf0b1dc0bf6682a1f324c98, 0xd95c3d037697cca953c9a7d7135772, 0x004e04 ] } , - BigNum { limbs: [ 0x302bd0f30daa22f40997d4e0cdb369, 0xcdf6ec9a06b06690843e61cac4ade1, 0x0025e8 ] } , - BigNum { limbs: [ 0xab429c42218eea9d1a8d0cdf05b3f5, 0xba420ebae0ca2485088dcd0eedfd0f, 0x004571 ] } , - BigNum { limbs: [ 0x126166bddccd1462e572f220fa4c0c, 0xed111ae29c7e0eb4cf7a3c92ea0844, 0x002e7b ] } , - BigNum { limbs: [ 0x8a07f9f945e0a8a970b4f3f6820606, 0xc78bdc342aafc2989b69d7031f283b, 0x003573 ] } , - BigNum { limbs: [ 0x339c0906b87b56568f4b0b097df9fb, 0xdfc74d69529870a13c9e329eb8dd18, 0x003e79 ] } , - BigNum { limbs: [ 0x17df56d813171c551a3d49cec26fff, 0xd46e142d366d1862d870c69ea23d3b, 0x0034df ] } , - BigNum { limbs: [ 0xa5c4ac27eb44e2aae5c2b5313d9002, 0xd2e5157046db1ad6ff97430335c818, 0x003f0d ] } , - BigNum { limbs: [ 0x71280f074d1440d341280e40f6ff69, 0x493dd2c18195b3d4f002ab14fce7d7, 0x003657 ] } , - BigNum { limbs: [ 0x4c7bf3f8b147be2cbed7f0bf090098, 0x5e1556dbfbb27f64e8055e8cdb1d7c, 0x003d96 ] } , - BigNum { limbs: [ 0x7d5dfa3a479c8e611337171217a856, 0x8a69cc191d70c9bffed16f4a90e9b9, 0x0023f6 ] } , - BigNum { limbs: [ 0x404608c5b6bf709eecc8e7ede857ab, 0x1ce95d845fd76979d9369a57471b9a, 0x004ff7 ] } , - BigNum { limbs: [ 0x2297d77e27dabdc088bdd905a55f21, 0xe5ba74ab8f7b7943135dbd04ce91ce, 0x000ec6 ] } , - BigNum { limbs: [ 0x9b0c2b81d681413f774225fa5aa0e0, 0xc198b4f1edccb9f6c4aa4c9d097385, 0x006526 ] } , - BigNum { limbs: [ 0x1780f66062d06efdbc5c8f8076051c, 0xff129029040c12f30d72abc32d1510, 0x002214 ] } , - BigNum { limbs: [ 0xa6230c9f9b8b900243a36f7f89fae5, 0xa8409974793c2046ca955ddeaaf043, 0x0051d8 ] } , - BigNum { limbs: [ 0xff74fc1738cfd4e640defe9c3d1988, 0x5f9a2cb148576539d6e7048fb70e71, 0x002be5 ] } , - BigNum { limbs: [ 0xbe2f06e8c58c2a19bf210063c2e679, 0x47b8fcec34f0ce000121051220f6e1, 0x004808 ] } , - BigNum { limbs: [ 0xfee0e9919be7eb242860ad1233361d, 0x51765816dd0870c5f64dfff44c0fe1, 0x005251 ] } , - BigNum { limbs: [ 0xbec3196e627413dbd79f51edccc9e4, 0x55dcd186a03fc273e1ba09ad8bf571, 0x00219c ] } , - BigNum { limbs: [ 0x1d417ac2d72f8681deb3aea33c8449, 0xf5bec7ef45efbf9de97916504aabd2, 0x002801 ] } , - BigNum { limbs: [ 0xa062883d272c787e214c505cc37bb8, 0xb19461ae3758739bee8ef3518d5981, 0x004beb ] } , - BigNum { limbs: [ 0xffd9cd43748cd07e797c34f167e1ae, 0xfb8721c1baed95f9167176d30171d8, 0x0032d0 ] } , - BigNum { limbs: [ 0xbdca35bc89cf2e818683ca0e981e53, 0xabcc07dbc25a9d40c19692ced6937a, 0x00411c ] } , - BigNum { limbs: [ 0x46efcbd5cbd25bcdea20340e865edc, 0x5cf7ea7460e71bb5ebece92e50178a, 0x003bbb ] } , - BigNum { limbs: [ 0x76b4372a3289a33215dfcaf179a125, 0x4a5b3f291c611783ec1b207387edc9, 0x003832 ] } , - BigNum { limbs: [ 0x1acd98fa4e19e15adb37a5ea82fe43, 0x64500bde4ae6b522fed010b950c90d, 0x0039b7 ] } , - BigNum { limbs: [ 0xa2d66a05b0421da524c859157d01be, 0x43031dbf32617e16d937f8e8873c46, 0x003a36 ] } , - BigNum { limbs: [ 0xf97bf1fe6c26fcec89f106fb90245c, 0xcc7b13e9ecf1b6504cd2a95cc231ba, 0x00707c ] } , - BigNum { limbs: [ 0xc428110192350213760ef8046fdba5, 0xdad815b390567ce98b35604515d398, 0x000370 ] } , - BigNum { limbs: [ 0xb40031a396daed1d58d36d2887248a, 0xefd47eb0b490fb4b5fe309008ffb30, 0x0025d6 ] } , - BigNum { limbs: [ 0x09a3d15c678111e2a72c91d778db77, 0xb77eaaecc8b737ee782500a1480a23, 0x004e16 ] } , - BigNum { limbs: [ 0xb896192a36d9e94f4e49f4db97e1d9, 0x2ffe51ef6ac663a47e046c9d5d166c, 0x003fd0 ] } , - BigNum { limbs: [ 0x050de9d5c78215b0b1b60a24681e28, 0x7754d7ae1281cf955a039d047aeee7, 0x00341d ] } , - BigNum { limbs: [ 0x3c79d13bd65d4193ca2d1bc7fd9263, 0x66ae43c4c3c56831575a9d83a15eb2, 0x003933 ] } , - BigNum { limbs: [ 0x812a31c427febd6c35d2e338026d9e, 0x40a4e5d8b982cb0880ad6c1e36a6a1, 0x003aba ] } , - BigNum { limbs: [ 0x8534756de28ddf9c097282f8518c00, 0x2e85cd535086081a5545bd583161c8, 0x005fc4 ] } , - BigNum { limbs: [ 0x386f8d921bce1f63f68d7c07ae7401, 0x78cd5c4a2cc22b1f82c24c49a6a38b, 0x001429 ] } , - BigNum { limbs: [ 0x7ad52f8a5c627be96a0110191444de, 0xd5d6f7db3f4f0f669bb5886c3af4cb, 0x000753 ] } , - BigNum { limbs: [ 0x42ced375a1f9831695feeee6ebbb23, 0xd17c31c23df923d33c5281359d1088, 0x006c99 ] } , - BigNum { limbs: [ 0xfcbf4084f4f9b2c30b3c3647dd9723, 0x82a49d6b5c74782c1cd532b1b61313, 0x002b73 ] } , - BigNum { limbs: [ 0xc0e4c27b09624c3cf4c3c8b82268de, 0x24ae8c3220d3bb0dbb32d6f021f23f, 0x00487a ] } , - BigNum { limbs: [ 0x5167b6e1c6e7094e396cf2c8808fc1, 0x2b3fd45a67f93cbcdfb94554c90356, 0x00403c ] } , - BigNum { limbs: [ 0x6c3c4c1e3774f5b1c6930c377f7040, 0x7c135543154ef67cf84ec44d0f01fd, 0x0033b1 ] } , - BigNum { limbs: [ 0xaad9d1e07e8ad1c6704a19b8498e4c, 0x9a8e6f552967166e1d63d16fa4191b, 0x002cfc ] } , - BigNum { limbs: [ 0x12ca311f7fd12d398fb5e547b671b5, 0x0cc4ba4853e11ccbbaa4383233ec38, 0x0046f1 ] } , - BigNum { limbs: [ 0xa6f095c3e393ea78bad60fe8295af1, 0x51570dd9c749cd846dedf76d82d68e, 0x0018f1 ] } , - BigNum { limbs: [ 0x16b36d3c1ac814874529ef17d6a510, 0x55fc1bc3b5fe65b56a1a1234552ec5, 0x005afc ] } , - BigNum { limbs: [ 0xd4799a1030031151641d355ed74859, 0xa82ef937f7a8184e37dc8531cf3300, 0x005c33 ] } , - BigNum { limbs: [ 0xe92a68efce58edae9be2c9a128b7a8, 0xff24306585a01aeba02b847008d252, 0x0017b9 ] } , - BigNum { limbs: [ 0x9183dce28ef8014fe8d6d7c4afe0a9, 0xcfdf2f836149018debf684e68567f3, 0x002b70 ] } , - BigNum { limbs: [ 0x2c20261d6f63fdb01729273b501f58, 0xd773fa1a1bff31abec1184bb529d60, 0x00487c ] } , - BigNum { limbs: [ 0x78921f813dbb183c71a7402ec2eed5, 0x4ad5a9709b098e4630618320a9220e, 0x0034ff ] } , - BigNum { limbs: [ 0x4511e37ec0a0e6c38e58bed13d112c, 0x5c7d802ce23ea4f3a7a686812ee345, 0x003eee ] } , - BigNum { limbs: [ 0xb104627af5b12aeb15f8b2e0dc45d1, 0xafb9f051dae05d758652dede4d953e, 0x005765 ] } , - BigNum { limbs: [ 0x0c9fa08508aad414ea074c1f23ba30, 0xf799394ba267d5c451b52ac38a7015, 0x001c87 ] } , - BigNum { limbs: [ 0x076c47c5c2c17969253d44de1e4d00, 0x18e25537e45a543a827b37d2ebc611, 0x000970 ] } , - BigNum { limbs: [ 0xb637bb3a3b9a8596dac2ba21e1b301, 0x8e70d46598eddeff558cd1ceec3f42, 0x006a7d ] } , - BigNum { limbs: [ 0x1a77c155967b404f527ffbb148e55b, 0x124a85c2aa3222dad195f08db8c103, 0x004820 ] } , - BigNum { limbs: [ 0xa32c41aa67e0beb0ad80034eb71aa6, 0x9508a3dad316105f067219141f4450, 0x002bcd ] } , - BigNum { limbs: [ 0x526ac238e5a0c5a70265e120dec41a, 0xb91dbc2c171b610f40689e8bdb7e85, 0x0054a2 ] } , - BigNum { limbs: [ 0x6b3940c718bb3958fd9a1ddf213be7, 0xee356d71662cd22a979f6b15fc86ce, 0x001f4a ] } , - BigNum { limbs: [ 0xbc3f5982e5d13e52ac9853b184617d, 0xcfe5971c4e6c2818670f0f6e1efe30, 0x005db5 ] } , - BigNum { limbs: [ 0x0164a97d188ac0ad5367ab4e7b9e84, 0xd76d92812edc0b2170f8fa33b90723, 0x001637 ] } , - BigNum { limbs: [ 0xea190ee72171b5bf96906be310d83a, 0xb49f8ab5bb56e6d4fddaed19d920a7, 0x005edc ] } , - BigNum { limbs: [ 0xd38af418dcea4940696f931cef27c7, 0xf2b39ee7c1f14c64da2d1c87fee4ab, 0x001510 ] } , - BigNum { limbs: [ 0x1ca7fc06a7652dce89d9caeca2788e, 0x41484cc523db20e2ed344c1f0d27dc, 0x006fb2 ] } , - BigNum { limbs: [ 0xa0fc06f956f6d131762634135d8773, 0x660adcd8596d1256ead3bd82cadd77, 0x00043b ] } , - BigNum { limbs: [ 0x24ee69f08086a145b0c011142f943c, 0xbc8be1039af2e00b5ea72b0ce3cc51, 0x002f6b ] } , - BigNum { limbs: [ 0x98b5990f7dd55dba4f3fedebd06bc5, 0xeac74899e255532e7960de94f43902, 0x004481 ] } , - BigNum { limbs: [ 0x4e43d7d4c8cc800c599e831e62b8d6, 0xfe6e13f0c70ec64b7d75ada9bc94dc, 0x0020c6 ] } , - BigNum { limbs: [ 0x6f602b2b358f7ef3a6617be19d472b, 0xa8e515acb6396cee5a925bf81b7077, 0x005326 ] } , - BigNum { limbs: [ 0xa4cf29a5781cc8b8f0b1427b5e42f8, 0x14f60f00b7cfd56abdc480f96f516e, 0x001acf ] } , - BigNum { limbs: [ 0x18d4d95a863f36470f4ebc84a1bd09, 0x925d1a9cc5785dcf1a4388a868b3e5, 0x00591e ] } , - BigNum { limbs: [ 0x860ca3e0b0c8cd0d2607b31e34bf62, 0x39b5bc3017ffbab6734e04debb058b, 0x0046b3 ] } , - BigNum { limbs: [ 0x37975f1f4d9331f2d9f84be1cb409f, 0x6d9d6d6d6548788364ba04c31cffc8, 0x002d3a ] } , - BigNum { limbs: [ 0xaa0aa405432df6ef7fba47f56fb3d8, 0x3e710294f33c1a7756ed868ab15142, 0x005dc7 ] } , - BigNum { limbs: [ 0x13995efabb2e08108045b70a904c29, 0x68e227088a0c18c2811a831726b411, 0x001626 ] } , - BigNum { limbs: [ 0xe49f3bc59065cd5a9925b13969600f, 0x8418db7c8f6c07faa3df067d96a234, 0x0062b2 ] } , - BigNum { limbs: [ 0xd904c73a6df631a566da4dc6969ff2, 0x233a4e20eddc2b3f3429032441631e, 0x00113b ] } , - BigNum { limbs: [ 0x08f69bb5a34d7a4d4166e5018414f8, 0x0bd90a98a833477c49bd9f429e3221, 0x006bd5 ] } , - BigNum { limbs: [ 0xb4ad674a5b0e84b2be9919fe7beb09, 0x9b7a1f04d514ebbd8e4a6a5f39d332, 0x000818 ] } , - BigNum { limbs: [ 0x858e55d4b05011c65654cc6e143494, 0x5f38c3c0928bc650a7b8aabc2c90b0, 0x00637a ] } , - BigNum { limbs: [ 0x3815ad2b4e0bed39a9ab3291ebcb6d, 0x481a65dceabc6ce9304f5ee5ab74a3, 0x001073 ] } , - BigNum { limbs: [ 0x56451a0f2e97031e3ac422a3bebfce, 0x375f4d14b97ee1c87bd168b412c9dc, 0x0007ce ] } , - BigNum { limbs: [ 0x675ee8f0cfc4fbe1c53bdc5c414033, 0x6ff3dc88c3c951715c36a0edc53b77, 0x006c1f ] } , - BigNum { limbs: [ 0x203872ef16ad220269e1371ad9a322, 0x6fbb53c9f81b01ac67d632538bc740, 0x00731a ] } , - BigNum { limbs: [ 0x9d6b9010e7aedcfd961ec7e5265cdf, 0x3797d5d3852d318d7031d74e4c3e13, 0x0000d3 ] } , - BigNum { limbs: [ 0x46ca8e879475036676bb13db1cfdd7, 0xb14784ed9323b84e3224c2e800f6bf, 0x0044df ] } , - BigNum { limbs: [ 0x76d9747869e6fb998944eb24e3022a, 0xf60ba4afea247aeba5e346b9d70e94, 0x002f0d ] } , - BigNum { limbs: [ 0x3f2f1cdac0bdd61490fae57a7c33a7, 0xe357b3f96e6d94c1b71405e3140b1f, 0x001189 ] } , - BigNum { limbs: [ 0x7e74e6253d9e28eb6f05198583cc5a, 0xc3fb75a40eda9e7820f403bec3fa34, 0x006263 ] } , - BigNum { limbs: [ 0x55ed36483309549cee4813c5113cae, 0x623b190ab7ecc0e1424947746063b4, 0x006bbf ] } , - BigNum { limbs: [ 0x67b6ccb7cb52aa6311b7eb3aeec353, 0x45181092c55b725895bec22d77a19f, 0x00082e ] } , - BigNum { limbs: [ 0x1b0f77f0d55ea106e039f68e5ab3dd, 0x860235a7434baffb53bd6eab1fa801, 0x003664 ] } , - BigNum { limbs: [ 0xa2948b0f28fd5df91fc60871a54c24, 0x2150f3f639fc833e844a9af6b85d52, 0x003d89 ] } , - BigNum { limbs: [ 0xe78026be2d5e7457717af258d76b50, 0xdacf4627bc5be4665ae77a4160334d, 0x000eeb ] } , - BigNum { limbs: [ 0xd623dc41d0fd8aa88e850ca72894b1, 0xcc83e375c0ec4ed37d208f6077d205, 0x006501 ] } , - BigNum { limbs: [ 0x67bb8c3c1db6ea8505ca50e03d6419, 0x9cbef4cf3ede358ff43badf4f95a4a, 0x004340 ] } , - BigNum { limbs: [ 0x55e876c3e0a5147afa35ae1fc29be8, 0x0a9434ce3e69fda9e3cc5bacdeab09, 0x0030ad ] } , - BigNum { limbs: [ 0x5f6b1fce35a767a42cef3b59936aca, 0x330034910c6106697712ede6bda93f, 0x006c0d ] } , - BigNum { limbs: [ 0x5e38e331c8b4975bd310c3a66c9537, 0x7452f50c70e72cd060f51bbb1a5c14, 0x0007e0 ] } , - BigNum { limbs: [ 0x3a056f49df88978ecfab339e06cb5b, 0x2071f73b29bb76665151b4cb89bba9, 0x000d56 ] } , - BigNum { limbs: [ 0x839e93b61ed367713054cb61f934a6, 0x86e13262538cbcd386b654d64e49aa, 0x006697 ] } , - BigNum { limbs: [ 0xef2c4c46e3ffffcb692d0528f44414, 0xacccb9468e3c4282dc4972a3cca5fb, 0x0005ca ] } , - BigNum { limbs: [ 0xce77b6b91a5bff3496d2f9d70bbbed, 0xfa867056ef0bf0b6fbbe96fe0b5f57, 0x006e22 ] } , - BigNum { limbs: [ 0x881eea9a94f19f18bb67ac498bb306, 0xdd3a18e8bc717109bb87546c7be526, 0x001055 ] } , - BigNum { limbs: [ 0x35851865696a5fe7449852b6744cfb, 0xca1910b4c0d6c2301c80b5355c202d, 0x006397 ] } , - BigNum { limbs: [ 0xa7f2c626b2e4def707a2d2027625b3, 0x9b9923940fc900b3afc1442ae9abaf, 0x006fa1 ] } , - BigNum { limbs: [ 0x15b13cd94b772008f85d2cfd89da4e, 0x0bba06096d7f32862846c576ee59a4, 0x00044c ] } , - BigNum { limbs: [ 0x10558d9aa509ab0e5ae9a70d5d061a, 0xc356d0de01d48ff79d5e980fce6409, 0x004e6f ] } , - BigNum { limbs: [ 0xad4e7565595253f1a51657f2a2f9e7, 0xe3fc58bf7b73a3423aa9719209a14a, 0x00257d ] } , - BigNum { limbs: [ 0x23c188df7ce263b135c7a97914d377, 0x39349820411f5fc93aca2333a367b1, 0x0031d6 ] } , - BigNum { limbs: [ 0x99e27a2081799b4eca385586eb2c8a, 0x6e1e917d3c28d3709d3de66e349da2, 0x004217 ] } , - BigNum { limbs: [ 0x6246eaafa91200119436ea05caedb2, 0xfe0d05b931869a29e30166d46cc7b6, 0x004b5e ] } , - BigNum { limbs: [ 0x5b5d18505549feee6bc914fa35124f, 0xa94623e44bc1990ff506a2cd6b3d9d, 0x00288e ] } , - BigNum { limbs: [ 0x9d99175038716628f47d40e82d15bd, 0x093fd8cc8c196a702485b38d5808f4, 0x00713d ] } , - BigNum { limbs: [ 0x200aebafc5ea98d70b82be17d2ea44, 0x9e1350d0f12ec8c9b38256147ffc5f, 0x0002b0 ] } , - BigNum { limbs: [ 0xeb780345d8d48e768d55926c7e753e, 0x99ddf792e5371ad4958bc9e7000449, 0x005664 ] } , - BigNum { limbs: [ 0xd22bffba2587708972aa6c93818ac3, 0x0d75320a98111865427c3fbad80109, 0x001d89 ] } , - BigNum { limbs: [ 0x252bfa132081f9d0568f04b84b2a00, 0x3359a03f722a55433db658105171ca, 0x00726e ] } , - BigNum { limbs: [ 0x987808ecddda052fa970fa47b4d601, 0x73f9895e0b1dddf69a51b191869389, 0x00017f ] } , - BigNum { limbs: [ 0x4430904a87ce25144f897786ee3fb6, 0x09193ddd55abe3de5d7d83eacc3d55, 0x002f75 ] } , - BigNum { limbs: [ 0x797372b5768dd9ebb076877911c04b, 0x9e39ebc0279c4f5b7a8a85b70bc7fe, 0x004478 ] } , - BigNum { limbs: [ 0xe4fb2dcb4d9f1a4a9ebdd727b87a2e, 0x2b3e89f62de6e60238fe7599d7ec10, 0x0062ab ] } , - BigNum { limbs: [ 0xd8a8d534b0bce4b5614227d84785d3, 0x7c149fa74f614d379f099408001942, 0x001142 ] } , - BigNum { limbs: [ 0xd620293ae0ef1d9da284bedb2f43d0, 0x180a5114016f798c9348185b0382e2, 0x003b69 ] } , - BigNum { limbs: [ 0xe783d9c51d6ce1625d7b4024d0bc31, 0x8f48d8897bd8b9ad44bff146d48270, 0x003884 ] } , - BigNum { limbs: [ 0x6e4a6abf88d933719ae8985de5540a, 0x852ff0a7b43ffbb7a8b0d7b33af34c, 0x002eae ] } , - BigNum { limbs: [ 0x4f5998407582cb8e651766a21aabf7, 0x222338f5c90837822f5731ee9d1207, 0x00453f ] } , - BigNum { limbs: [ 0xcc886ec1f3ffe0d1b7b97da44a349a, 0x156b1645203e0188cbbb016cf2efe2, 0x006934 ] } , - BigNum { limbs: [ 0xf11b943e0a5c1e2e4846815bb5cb67, 0x91e813585d0a31b10c4d0834e51570, 0x000ab9 ] } , - BigNum { limbs: [ 0xa3311e69461863c932b24d441a3598, 0x4a6827f60d795efd1735c252faeb40, 0x0061aa ] } , - BigNum { limbs: [ 0x1a72e496b8439b36cd4db1bbe5ca69, 0x5ceb01a76fced43cc0d2474edd1a13, 0x001243 ] } , - BigNum { limbs: [ 0x82345ac27d7e4868b67310ef09a9cb, 0x92f702edb6d0f2507c5f193db6176b, 0x00110f ] } , - BigNum { limbs: [ 0x3b6fa83d80ddb697498cee10f65636, 0x145c26afc67740e95ba8f06421ede8, 0x0062de ] } , - BigNum { limbs: [ 0xdb0f7c98858057112f96e2b0f9b3dd, 0x58e0c574d4f3d63057d2ac2decc1c8, 0x001a68 ] } , - BigNum { limbs: [ 0xe294866778dba7eed0691c4f064c24, 0x4e726428a8545d0980355d73eb438a, 0x005985 ] } , - BigNum { limbs: [ 0x8c7c2afe21b8d4c669d39e6258ef1e, 0x02a17e71df56bfb88204fb95d7509b, 0x001696 ] } , - BigNum { limbs: [ 0x3127d801dca32a39962c609da710e3, 0xa4b1ab2b9df1738156030e0c00b4b8, 0x005d57 ] } , - BigNum { limbs: [ 0x4b6eef836791e9f54098590590f97a, 0x18a877b7ab1d7cfa546e4bac4497c4, 0x002a75 ] } , - BigNum { limbs: [ 0x7235137c96ca150abf67a5fa6f0687, 0x8eaab1e5d22ab63f8399bdf5936d8f, 0x004978 ] } , - BigNum { limbs: [ 0xda57a2483dd819a0521ef18aeb112b, 0x741f3f8e164dd0c49746d9253f440e, 0x005928 ] } , - BigNum { limbs: [ 0xe34c60b7c083e55fade10d7514eed6, 0x3333ea0f66fa627540c1307c98c144, 0x001ac5 ] } , - BigNum { limbs: [ 0x6d9efa01c14d946eb5dc3197a8ef92, 0x93e8f9bde758fed2674d81d6135835, 0x001439 ] } , - BigNum { limbs: [ 0x500508fe3d0e6a914a23cd6857106f, 0x136a2fdf95ef346770ba87cbc4ad1e, 0x005fb4 ] } , - BigNum { limbs: [ 0x6b343de16bed11f7715c2b59ea6e61, 0x4bd44428726e555938660d5f1259af, 0x003451 ] } , - BigNum { limbs: [ 0x526fc51e926eed088ea3d3a61591a0, 0x5b7ee5750ad9dde09fa1fc42c5aba4, 0x003f9c ] } , - BigNum { limbs: [ 0xd7adea656c88ebe1c73198fced09ec, 0x858f3343b72247e4ce45ae3b842b6b, 0x0004ba ] } , - BigNum { limbs: [ 0xe5f6189a91d3131e38ce660312f615, 0x21c3f659c625eb5509c25b6653d9e7, 0x006f33 ] } , - BigNum { limbs: [ 0x4396812497c58b3d6e0eb2267582d7, 0x19f1fc6fe5a19f799a4ac31e134aad, 0x00342f ] } , - BigNum { limbs: [ 0x7a0d81db669673c291f14cd98a7d2a, 0x8d612d2d97a693c03dbd4683c4baa6, 0x003fbe ] } , - BigNum { limbs: [ 0x330ac33976577896e7cd165be118af, 0x513188184d1e47fe7c0925272dc385, 0x006c00 ] } , - BigNum { limbs: [ 0x8a993fc6880486691832e8a41ee752, 0x5621a1853029eb3b5bfee47aaa41ce, 0x0007ed ] } , - BigNum { limbs: [ 0xb422e761321f21d09645fe30b61c23, 0x9970ea51b0e6b23e7b35ed24a1e5c7, 0x00395c ] } , - BigNum { limbs: [ 0x09811b9ecc3cdd2f69ba00cf49e3de, 0x0de23f4bcc6180fb5cd21c7d361f8c, 0x003a91 ] } , - BigNum { limbs: [ 0x0b160cf2d6797490f41560b245b067, 0xffc2ee6b0313ed07699a98a0e39141, 0x004a5a ] } , - BigNum { limbs: [ 0xb28df60d27e28a6f0bea9e4dba4f9a, 0xa7903b327a3446326e6d7100f47412, 0x002992 ] } , - BigNum { limbs: [ 0xaba6e2d7d140d91f7cc4829e8423a4, 0xb6b450e6f2baafc992e5de759fc13a, 0x002110 ] } , - BigNum { limbs: [ 0x11fd20282d1b25e0833b7c617bdc5d, 0xf09ed8b68a8d837045222b2c384419, 0x0052dc ] } , - BigNum { limbs: [ 0xa01148af98688c508dd3077d60548f, 0x935af62d62298775e60c31411c7d36, 0x0013e9 ] } , - BigNum { limbs: [ 0x1d92ba5065f372af722cf7829fab72, 0x13f833701b1eabc3f1fbd860bb881d, 0x006004 ] } , - BigNum { limbs: [ 0xc7276b0e0087cc7eb1318aca4306de, 0x43d57eb232ec56fb40f6e0bf66906e, 0x004451 ] } , - BigNum { limbs: [ 0xf67c97f1fdd432814ece7435bcf923, 0x637daaeb4a5bdc3e971128e27174e4, 0x002f9c ] } , - BigNum { limbs: [ 0xeba7f573b3b0edb038298303139ae1, 0xe4ce8328676baf6a10b22f3eda88c1, 0x001629 ] } , - BigNum { limbs: [ 0xd1fc0d8c4aab114fc7d67bfcec6520, 0xc284a67515dc83cfc755da62fd7c91, 0x005dc3 ] } , - BigNum { limbs: [ 0x9bcab0951254eec1d795605c9454e1, 0x4f1ed5f3daea6d94451f7d62139849, 0x0030d1 ] } , - BigNum { limbs: [ 0x21d9526aec07103e286a9ea36bab20, 0x583453a9a25dc5a592e88c3fc46d0a, 0x00431c ] } , - BigNum { limbs: [ 0x015a142b676f214fde7e2d7a559fd3, 0x6fb6de21ab8a003f81fccd9c6817e5, 0x00083d ] } , - BigNum { limbs: [ 0xbc49eed496ecddb02181d185aa602e, 0x379c4b7bd1be32fa560b3c056fed6e, 0x006bb0 ] } , - BigNum { limbs: [ 0xb05750b0757d9b1b525693c4fdf276, 0xa020a192f58550d8f5fae982ba3ffb, 0x006226 ] } , - BigNum { limbs: [ 0x0d4cb24f88de63e4ada96b3b020d8b, 0x0732880a87c2e260e20d201f1dc558, 0x0011c7 ] } , - BigNum { limbs: [ 0x9589c6d02e429124ca49ae2654cfed, 0x93b1dca7fd1456679d9af60081e614, 0x000055 ] } , - BigNum { limbs: [ 0x281a3c2fd0196ddb35b650d9ab3014, 0x13a14cf58033dcd23a6d13a1561f3f, 0x007398 ] } , - BigNum { limbs: [ 0xe5f85ddf3c1b5cb31a1acd9d26ce3c, 0x0c64c68dd203f81ab9316428dff763, 0x003505 ] } , - BigNum { limbs: [ 0xd7aba520c240a24ce5e53162d931c5, 0x9aee630fab443b1f1ed6a578f80def, 0x003ee8 ] } , - BigNum { limbs: [ 0xaa559c25a323066982caeaed4863fd, 0x51ff3b932efd9f1ca45610bea15005, 0x000405 ] } , - BigNum { limbs: [ 0x134e66da5b38f8967d351412b79c04, 0x5553ee0a4e4a941d33b1f8e336b54e, 0x006fe8 ] } , - BigNum { limbs: [ 0x7c55cac91b46847d77398fb0253409, 0x54aa601bd20e14bc524e83f5dfdf0a, 0x0018aa ] } , - BigNum { limbs: [ 0x414e3836e3157a8288c66f4fdacbf8, 0x52a8c981ab3a1e7d85b985abf82649, 0x005b43 ] } , - BigNum { limbs: [ 0x72ebfd53689d24efb99d766acb5fd5, 0x53b4e3288a76fc3f7b8a3bd7c507c1, 0x0018af ] } , - BigNum { limbs: [ 0x4ab805ac95beda104662889534a02c, 0x539e4674f2d136fa5c7dcdca12fd92, 0x005b3e ] } , - BigNum { limbs: [ 0xfd1bdd35d3c9d1c6cbff4af2be3916, 0x1e437926a687585966d8d7855d16d5, 0x00274d ] } , - BigNum { limbs: [ 0xc08825ca2a922d393400b40d41c6eb, 0x890fb076d6c0dae0712f321c7aee7d, 0x004ca0 ] } , - BigNum { limbs: [ 0xb77311aa5733c02e36541e5c44ddc4, 0xf70a9c158f6fb5fca7743791401f4b, 0x00649c ] } , - BigNum { limbs: [ 0x0630f155a7283ed1c9abe0a3bb223d, 0xb0488d87edd87d3d3093d21097e608, 0x000f50 ] } , - BigNum { limbs: [ 0xbec17bd32d28f964b877880b7bd162, 0x1c8e1645a812d561eb297d716c3f6e, 0x004732 ] } , - BigNum { limbs: [ 0xfee2872cd133059b478876f4842e9f, 0x8ac51357d5355dd7ecde8c306bc5e4, 0x002cbb ] } , - BigNum { limbs: [ 0x4b9abc640df6a92392180523c30faa, 0xccb911dcb1ae544edf064df058b8a6, 0x000b8b ] } , - BigNum { limbs: [ 0x7209469bf06555dc6de7f9dc3cf057, 0xda9a17c0cb99deeaf901bbb17f4cad, 0x006861 ] } , - BigNum { limbs: [ 0x43fba07004bb352fb97ddcbb685b7e, 0xfb15e4fc1addd4df8ea0dd402af30b, 0x0016aa ] } , - BigNum { limbs: [ 0x79a8628ff9a0c9d04682224497a483, 0xac3d44a1626a5e5a49672c61ad1248, 0x005d42 ] } , - BigNum { limbs: [ 0x56e2bbfada26463ad32c3398b4cb0a, 0xf0957745c50282acff8e98d64e22c9, 0x003095 ] } , - BigNum { limbs: [ 0x66c147052435b8c52cd3cb674b34f7, 0xb6bdb257b845b08cd87970cb89e28a, 0x004357 ] } , - BigNum { limbs: [ 0x31dfefa8056f0bb4ad409f0a9afc82, 0x9150327c8a8167c605fb4aa50a4642, 0x002e81 ] } , - BigNum { limbs: [ 0x8bc41357f8ecf34b52bf5ff565037f, 0x1602f720f2c6cb73d20cbefccdbf11, 0x00456c ] } , - BigNum { limbs: [ 0xe90e9f0a64c08bc2c919362a37a2f5, 0x90bdf40839f0ea8ca59fb662da9e1f, 0x003872 ] } , - BigNum { limbs: [ 0xd49563f5999b733d36e6c8d5c85d0c, 0x16953595435748ad3268533efd6733, 0x003b7b ] } , - BigNum { limbs: [ 0x071011023ca1f11813365f2e4dd33f, 0x63d9876c3af1054103abfd750fa7e3, 0x0073d8 ] } , - BigNum { limbs: [ 0xb693f1fdc1ba0de7ecc99fd1b22cc2, 0x4379a23142572df8d45c0c2cc85d70, 0x000015 ] } , - BigNum { limbs: [ 0x694ee83ae27a47bed39a0919fadbc3, 0x4a3b47df5caa2bdad7b86e55e1c1cc, 0x0030e6 ] } , - BigNum { limbs: [ 0x54551ac51be1b7412c65f5e605243e, 0x5d17e1be209e075f004f9b4bf64387, 0x004307 ] } , - BigNum { limbs: [ 0x5e55696d530d23c829d3b1ec72d08f, 0xc09602866dfdcaae5a41e711829dab, 0x003c1e ] } , - BigNum { limbs: [ 0x5f4e9992ab4edb37d62c4d138d2f72, 0xe6bd27170f4a688b7dc622905567a8, 0x0037ce ] } , - BigNum { limbs: [ 0x288cf2ea23bfefa96caf3ac3f8ba22, 0xb3275950a9f9c4441b6584b2104f8d, 0x00719f ] } , - BigNum { limbs: [ 0x95171015da9c0f569350c43c0745df, 0xf42bd04cd34e6ef5bca284efc7b5c6, 0x00024d ] } , - BigNum { limbs: [ 0x8bc3b8285c996dbad4d376d1513768, 0x7256e5b76cb3175f0352ab72b4f874, 0x005ebd ] } , - BigNum { limbs: [ 0x31e04ad7a1c291452b2c882eaec899, 0x34fc43e610951bdad4b55e2f230cdf, 0x001530 ] } , - BigNum { limbs: [ 0x894a39cb116c525af67e8ae5be1bb2, 0x8c6cd36c4d58e020f6ea3ff00d743a, 0x00625d ] } , - BigNum { limbs: [ 0x3459c934ecefaca50981741a41e44f, 0x1ae656312fef5318e11dc9b1ca9119, 0x001190 ] } , - BigNum { limbs: [ 0x25e1a5766d24382bb250f695030649, 0xd5ae6d99265b8f18e758585cbb43c1, 0x005977 ] } , - BigNum { limbs: [ 0x97c25d899137c6d44daf086afcf9b8, 0xd1a4bc0456eca420f0afb1451cc192, 0x001a75 ] } , - BigNum { limbs: [ 0x108a14b7c70a6ad26c4075ed336c51, 0x0b039e7a6793034fce3be69716022a, 0x0041dd ] } , - BigNum { limbs: [ 0xad19ee483751942d93bf8912cc93b0, 0x9c4f8b2315b52fea09cc230ac20329, 0x003210 ] } , - BigNum { limbs: [ 0x73d08bc76ccf5ba34807979b0215f8, 0x672456cb0e4d663c27a5ae14f1c97c, 0x006b48 ] } , - BigNum { limbs: [ 0x49d37738918ca35cb7f86764fdea09, 0x402ed2d26efaccfdb0625b8ce63bd7, 0x0008a5 ] } , - BigNum { limbs: [ 0xb194d22c9353d04f23e87d934f1f96, 0xd299fff47a28674a00d694f09259c6, 0x006a55 ] } , - BigNum { limbs: [ 0x0c0f30d36b082eb0dc17816cb0e06b, 0xd4b929a9031fcbefd73174b145ab8d, 0x000997 ] } , - BigNum { limbs: [ 0xe60667a30dabcfb52e13c743b9975c, 0x9bbee3ad9bc81a5f72c6f875ee7602, 0x001460 ] } , - BigNum { limbs: [ 0xd79d9b5cf0b02f4ad1ec37bc4668a5, 0x0b9445efe18018da6541112be98f50, 0x005f8d ] } , - BigNum { limbs: [ 0xab86dadb989e51f0cbebe282c25f67, 0x985bbe50fcdf18c268a03833d98497, 0x0007a0 ] } , - BigNum { limbs: [ 0x121d282465bdad0f34141c7d3da09a, 0x0ef76b4c80691a776f67d16dfe80bc, 0x006c4d ] } , - BigNum { limbs: [ 0xda7702676dea396d79c4d11332d72d, 0x2e7430a3a2a093042049534a4e9515, 0x004eda ] } , - BigNum { limbs: [ 0xe32d00989071c592863b2deccd28d4, 0x78def8f9daa7a035b7beb65789703d, 0x002513 ] } , - BigNum { limbs: [ 0x3fea587c4affedc04f2ce41153449c, 0x22a7edcf8fa76606557aaa616f7f58, 0x003eaa ] } , - BigNum { limbs: [ 0x7db9aa83b35c113fb0d31aeeacbb65, 0x84ab3bcdeda0cd33828d5f406885fb, 0x003543 ] } , - BigNum { limbs: [ 0xd6197d6c736880f50cd1a8e4c2db19, 0x175965785290878d175aaf9256fc91, 0x003bdf ] } , - BigNum { limbs: [ 0xe78a85938af37e0af32e561b3d24e8, 0x8ff9c4252ab7abacc0ad5a0f8108c1, 0x00380e ] } , - BigNum { limbs: [ 0xd541ba86f98b53e4a9ecb7395b88da, 0xdd06325810ac9f0db723ad6706b7b6, 0x002288 ] } , - BigNum { limbs: [ 0xe862487904d0ab1b561347c6a47727, 0xca4cf7456c9b942c20e45c3ad14d9c, 0x005164 ] } , - BigNum { limbs: [ 0xea6811be9c622d4a838b5d59cd79e5, 0x1f1b5c49c83409f1ca610a08f16655, 0x006d03 ] } , - BigNum { limbs: [ 0xd33bf14161f9d1b57c74a1a632861c, 0x8837cd53b51429480da6ff98e69efd, 0x0006ea ] } , - BigNum { limbs: [ 0x4e1e3ba38d57fa7de6ee5fb11c8691, 0xc39cc1085e035b0395f3cb50c20339, 0x000d8b ] } , - BigNum { limbs: [ 0x6f85c75c7104048219119f4ee37970, 0xe3b668951f44d83642143e5116021a, 0x006661 ] } , - BigNum { limbs: [ 0x11bb5ed43415b6eaa3a247fac9045c, 0x8ce61b57c643fab4ad0b6127b0bdf5, 0x006200 ] } , - BigNum { limbs: [ 0xabe8a42bca4648155c5db70536fba5, 0x1a6d0e45b70438852afca87a27475e, 0x0011ed ] } , - BigNum { limbs: [ 0x66edf951391e017027b8876a00b1dd, 0x16bac381fe479a73369f5b7b9fbd66, 0x00269e ] } , - BigNum { limbs: [ 0x56b609aec53dfd8fd8477795ff4e24, 0x9098661b7f0098c6a168ae263847ed, 0x004d4f ] } , - BigNum { limbs: [ 0x8d3bda72fe32ac556446a1e4c8b12c, 0xdecdc861cdd2ba3c1894e10b47bb26, 0x0070a1 ] } , - BigNum { limbs: [ 0x3068288d002952aa9bb95d1b374ed5, 0xc885613baf7578fdbf732896904a2d, 0x00034b ] } , - BigNum { limbs: [ 0xc2aede9421fa9e20d9bfae30c1dd53, 0x261192cf65c5eb82149a7ac5fda4ff, 0x0041af ] } , - BigNum { limbs: [ 0xfaf5246bdc6160df264050cf3e22ae, 0x814196ce178247b7c36d8edbda6053, 0x00323e ] } , - BigNum { limbs: [ 0x39f3a6db6531cdca1cb78883b5501f, 0x26227262918465175978507ae3f87a, 0x00650f ] } , - BigNum { limbs: [ 0x83b05c24992a3135e348767c4aafe2, 0x8130b73aebc3ce227e8fb926f40cd9, 0x000ede ] } , - BigNum { limbs: [ 0xc37dd45f1728e7f0d65f4eb1657ebb, 0xcbf627e693d811320caaca8a58a05a, 0x005d7a ] } , - BigNum { limbs: [ 0xfa262ea0e733170f29a0b04e9a8146, 0xdb5d01b6e9702207cb5d3f177f64f8, 0x001672 ] } , - BigNum { limbs: [ 0xf0213a7d775a248c5cb6eb5617be18, 0x3d8529f4a57d3684ca197cb9b2697e, 0x0032a6 ] } , - BigNum { limbs: [ 0xcd82c8828701da73a34913a9e841e9, 0x69cdffa8d7cafcb50dee8ce8259bd4, 0x004147 ] } , - BigNum { limbs: [ 0x28b34e361f477916846a9d93c59012, 0x68771297c5f5cab5e5b78e6a8640e0, 0x000bb8 ] } , - BigNum { limbs: [ 0x94f0b4c9df1485e97b95616c3a6fef, 0x3edc1705b7526883f2507b3751c473, 0x006835 ] } , - BigNum { limbs: [ 0x2fcc7b4c5132e44eade4f1a131233d, 0x24993436058950f7e263c54ee6a9b5, 0x0053e3 ] } , - BigNum { limbs: [ 0x8dd787b3ad291ab1521b0d5ecedcc4, 0x82b9f56777bee241f5a44452f15b9e, 0x00200a ] } , - BigNum { limbs: [ 0xe3b4dbe22b4392311d3304db643695, 0x6c675105ced67e07f5abd08cc0fb81, 0x00118c ] } , - BigNum { limbs: [ 0xd9ef271dd3186ccee2ccfa249bc96c, 0x3aebd897ae71b531e25c39151709d1, 0x006261 ] } , - BigNum { limbs: [ 0xf11efe066d096281a3dfb44cd7d165, 0x9692bcbb22f340a207f615ad60750f, 0x003157 ] } , - BigNum { limbs: [ 0xcc8504f991529c7e5c204ab3282e9c, 0x10c06ce25a54f297d011f3f4779043, 0x004296 ] } , - BigNum { limbs: [ 0xdcb69c52a4e2ed82c4a6de94c8bf96, 0xadb5b738776bd7f6723b1e2ff13929, 0x0005c6 ] } , - BigNum { limbs: [ 0xe0ed66ad5979117d3b59206b37406b, 0xf99d726505dc5b4365cceb71e6cc29, 0x006e26 ] } , - BigNum { limbs: [ 0xbdddcc8bf7cd9ed4857eba4432963c, 0xae7241f1a002af8f5d5d7f44857a7f, 0x001987 ] } , - BigNum { limbs: [ 0xffc63674068e602b7a8144bbcd69c5, 0xf8e0e7abdd4583aa7aaa8a5d528ad3, 0x005a65 ] } , - BigNum { limbs: [ 0x403fec5dd82b2b02f99d83bd109f22, 0xad7b8eb369ebc5844282de960e20ea, 0x004e19 ] } , - BigNum { limbs: [ 0x7d6416a22630d3fd06627b42ef60df, 0xf9d79aea135c6db595852b0bc9e469, 0x0025d3 ] } , - BigNum { limbs: [ 0x667871334f5a17c81450fbaf4bac63, 0x8c39463268f3eff98a4b7b39d85563, 0x0054d1 ] } , - BigNum { limbs: [ 0x572b91ccaf01e737ebaf0350b4539e, 0x1b19e36b145443404dbc8e67ffaff0, 0x001f1c ] } , - BigNum { limbs: [ 0xe5f786d3627dca98b3217a2417eb91, 0x2b1650a62e0d01d8396db702f1cebe, 0x007322 ] } , - BigNum { limbs: [ 0xd7ac7c2c9bde34674cde84dbe81470, 0x7c3cd8f74f3b31619e9a529ee63694, 0x0000cb ] } , - BigNum { limbs: [ 0x14442a81d5dacf112f0e1c1ea12f87, 0x8dc193c234980989fd6dc601cf00dc, 0x0039df ] } , - BigNum { limbs: [ 0xa95fd87e28812feed0f1e2e15ed07a, 0x199195db48b029afda9a43a0090477, 0x003a0e ] } , - BigNum { limbs: [ 0x921cee975fa0e584ce4ae1e892a3c5, 0xc62efbed2b5cecef70db4531b7f32d, 0x000c2f ] } , - BigNum { limbs: [ 0x2b8714689ebb197b31b51d176d5c3c, 0xe1242db051eb464a672cc470201226, 0x0067bd ] } , - BigNum { limbs: [ 0x80e62a591e130ddff868f0a741ce9b, 0x73617687ce3861a1cbdaf40353ac4d, 0x005d2b ] } , - BigNum { limbs: [ 0x3cbdd8a6e048f12007970e58be3166, 0x33f1b315af0fd1980c2d159e845906, 0x0016c2 ] } , - BigNum { limbs: [ 0xbebbfef511cfe3de78900fcc779e4b, 0x5e5d2d844e5ab78ecd7e8bbf2f114f, 0x004cc8 ] } , - BigNum { limbs: [ 0xfee8040aec8c1b21876fef338861b6, 0x48f5fc192eed7bab0a897de2a8f403, 0x002725 ] } , - BigNum { limbs: [ 0xfb644fa915d933a7364690463b8c5a, 0x3da87aae9f28ef0fa6840d0fb03214, 0x0035f4 ] } , - BigNum { limbs: [ 0xc23fb356e882cb58c9b96eb9c473a7, 0x69aaaeeede1f442a3183fc9227d33e, 0x003df9 ] } , - BigNum { limbs: [ 0x291078c0516e965d1f8871ac8e55dd, 0xd8a29031fa3b19ae5ba085ac0ef4a6, 0x005a92 ] } , - BigNum { limbs: [ 0x94938a3faced68a2e0778d5371aa24, 0xceb0996b830d198b7c6783f5c910ad, 0x00195a ] } , - BigNum { limbs: [ 0xbe569a3a31f165c75c815f425cadf6, 0x91d2ea1bb63a6725ce5bff1ee40056, 0x003c67 ] } , - BigNum { limbs: [ 0xff4d68c5cc6a9938a37e9fbda3520b, 0x15803f81c70dcc1409ac0a82f404fc, 0x003786 ] } , - BigNum { limbs: [ 0xd4e8f014ba143af233e178fcd9035e, 0x187a05e3c16ef03e7c1f872a7e3d16, 0x007309 ] } , - BigNum { limbs: [ 0xe8bb12eb4447c40dcc1e860326fca3, 0x8ed923b9bbd942fb5be8827759c83c, 0x0000e4 ] } , - BigNum { limbs: [ 0x72c83deac35889a527d24cb6033b6d, 0x8dae310a1c6ed27159d1f41e8ecf38, 0x002a77 ] } , - BigNum { limbs: [ 0x4adbc5153b03755ad82db249fcc494, 0x19a4f89360d960c87e36158349361b, 0x004976 ] } , - BigNum { limbs: [ 0xed383bd6c47164f0f4a28beafd4b05, 0xfe95f6cd1c5ae51f8b3c2f31b064ca, 0x004b19 ] } , - BigNum { limbs: [ 0xd06bc72939ea9a0f0b5d731502b4fc, 0xa8bd32d060ed4e1a4ccbda7027a088, 0x0028d3 ] } , - BigNum { limbs: [ 0xc2af4e8c17ec9b12d6d2603dee0fe2, 0xaffd6163c6457b489fed890fd8e5be, 0x0055b0 ] } , - BigNum { limbs: [ 0xfaf4b473e66f63ed292d9ec211f01f, 0xf755c839b702b7f1381a8091ff1f94, 0x001e3c ] } , - BigNum { limbs: [ 0x9902e6b674cd83c44a9dee0b94bba2, 0xe168decf4b8ed4289398be82882966, 0x001896 ] } , - BigNum { limbs: [ 0x24a11c49898e7b3bb56210f46b445f, 0xc5ea4ace31b95f11446f4b1f4fdbed, 0x005b56 ] } , - BigNum { limbs: [ 0x4e45ae2b0e3452a4529d1d508d95fc, 0x7722bad2894e16b2203d6eb58db41f, 0x0033f1 ] } , - BigNum { limbs: [ 0x6f5e54d4f027ac5bad62e1af726a05, 0x30306ecaf3fa1c87b7ca9aec4a5134, 0x003ffc ] } , - BigNum { limbs: [ 0x37da9fd247b74cb41071ef7f2aea85, 0x217231241ba8cb044aeeeef2e88ea4, 0x003467 ] } , - BigNum { limbs: [ 0x85c9632db6a4b24bef8e0f80d5157c, 0x85e0f879619f68358d191aaeef76af, 0x003f86 ] } , - BigNum { limbs: [ 0x3f627cef182bf8f6139aa4696affcb, 0x10ac5d53a149416469b17618f6a047, 0x005364 ] } , - BigNum { limbs: [ 0x7e418610e6300609ec655a96950036, 0x96a6cc49dbfef1d56e569388e1650c, 0x002089 ] } , - BigNum { limbs: [ 0x7e981b72650bfeff3159bca6f143eb, 0xfc526f7aaa2242fa324ea12a7d5c51, 0x0011d4 ] } , - BigNum { limbs: [ 0x3f0be78d99500000cea642590ebc16, 0xab00ba22d325f03fa5b968775aa902, 0x006218 ] } , - BigNum { limbs: [ 0xd355e9996feaa77dfbd1f922488ad7, 0xb0058ff22890469a4cefef1ddd319e, 0x005848 ] } , - BigNum { limbs: [ 0xea4e19668e715782042e05ddb7752a, 0xf74d99ab54b7ec9f8b181a83fad3b4, 0x001ba4 ] } , - BigNum { limbs: [ 0x71709889e0167d409fadc1390c215b, 0x74aa326c7001fa831c8ac096dad4f9, 0x00693f ] } , - BigNum { limbs: [ 0x4c336a761e4581bf60523dc6f3dea6, 0x32a8f7310d4638b6bb7d490afd305a, 0x000aae ] } , - BigNum { limbs: [ 0x7f3c55e68a9ebe67f8591eaace97e5, 0x36a927134e53d5de7528fa90299f94, 0x000767 ] } , - BigNum { limbs: [ 0x3e67ad1973bd409807a6e05531681c, 0x70aa028a2ef45d5b62df0f11ae65bf, 0x006c86 ] } , - BigNum { limbs: [ 0xd68c4e218d617df86a5774c5ddad45, 0x3791051adf2dcf04d9abd55a75fca8, 0x00056b ] } , - BigNum { limbs: [ 0xe717b4de70fa810795a88a3a2252bc, 0x6fc224829e1a6434fe5c34476208aa, 0x006e82 ] } , - BigNum { limbs: [ 0x7b2013f325133a921b388995bea7fd, 0x97cf9f1de049dea2d37f97aa42f19b, 0x001305 ] } , - BigNum { limbs: [ 0x4283ef0cd948c46de4c7756a415804, 0x0f838a7f9cfe5497048871f79513b8, 0x0060e8 ] } , - BigNum { limbs: [ 0x8ab8dd1277fe748ac4ce96c05922c8, 0x10e56eefef4251ebd9d921306ed45a, 0x005d42 ] } , - BigNum { limbs: [ 0x32eb25ed865d8a753b31683fa6dd39, 0x966dbaad8e05e14dfe2ee8716930f9, 0x0016ab ] } , - BigNum { limbs: [ 0x0a4f7342f02550b7dd369ee24a4b2c, 0xfee53953c53b0cfcf5e4fb20e3fa23, 0x0006c4 ] } , - BigNum { limbs: [ 0xb3548fbd0e36ae4822c9601db5b4d5, 0xa86df049b80d263ce2230e80f40b30, 0x006d28 ] } , - BigNum { limbs: [ 0x7d50a297e01b9f76128ae4a4ec03cc, 0x48ee592217168094228f05f9a5f7b1, 0x0003cd ] } , - BigNum { limbs: [ 0x405360681e405f89ed751a5b13fc35, 0x5e64d07b6631b2a5b57903a8320da2, 0x007020 ] } , - BigNum { limbs: [ 0x15ef3ee3ffc51b88fd3eb853540a9b, 0x0703b0d3a24c6f57d8c0bf34a21c9a, 0x001d2d ] } , - BigNum { limbs: [ 0xa7b4c41bfe96e37702c146acabf566, 0xa04f78c9dafbc3e1ff474a6d35e8b9, 0x0056c0 ] } , - BigNum { limbs: [ 0xa0e87e3224359144dd54d2b5c75587, 0x4ac46b49ad06003051d8ebe9cfeefb, 0x003126 ] } , - BigNum { limbs: [ 0x1cbb84cdda266dbb22ab2c4a38aa7a, 0x5c8ebe53d0423309862f1db8081658, 0x0042c7 ] } , - BigNum { limbs: [ 0x8b986d29b33eb5f0def2eff45786de, 0xc59e71fd63b2bf1d7ff3348ecd758b, 0x0040be ] } , - BigNum { limbs: [ 0x320b95d64b1d490f210d0f0ba87923, 0xe1b4b7a01995741c5814d5130a8fc8, 0x00332e ] } , - BigNum { limbs: [ 0x99b19c7bca6174d7162d9719890f64, 0x9b45fa34b0b61f0b2d8c094d642020, 0x003b30 ] } , - BigNum { limbs: [ 0x23f2668433fa8a28e9d267e676f09d, 0x0c0d2f68cc92142eaa7c005473e533, 0x0038bd ] } , - BigNum { limbs: [ 0xd107902335e8b13bda35e579e11aaf, 0x059e6e34b922e5757ecbd6781b5e62, 0x002ec2 ] } , - BigNum { limbs: [ 0xec9c72dcc8734dc425ca19861ee552, 0xa1b4bb68c4254dc4593c3329bca6f0, 0x00452b ] } , - BigNum { limbs: [ 0x9e3c15394e6e1b208b52545e33565a, 0x494ae6fc135c86b8d15bf3d84bec66, 0x00191b ] } , - BigNum { limbs: [ 0x1f67edc6afede3df74adaaa1cca9a7, 0x5e0842a169ebac8106ac15c98c18ed, 0x005ad2 ] } , - BigNum { limbs: [ 0x7d4b44384d28349ae50103d6566c65, 0x9d381a6230d31aa9d7cb35b628a6c7, 0x0057ad ] } , - BigNum { limbs: [ 0x4058bec7b133ca651afefb29a9939c, 0x0a1b0f3b4c751890003cd3ebaf5e8c, 0x001c40 ] } , - BigNum { limbs: [ 0x86f87457e8d83a3e453abe1c7e3711, 0x8ca8ab8a88de4e6c5a7b26d84725a4, 0x005162 ] } , - BigNum { limbs: [ 0x36ab8ea81583c4c1bac540e381c8f0, 0x1aaa7e12f469e4cd7d8ce2c990dfaf, 0x00228b ] } , - BigNum { limbs: [ 0xf1a3f8ee19dbd5ae0de328241583d7, 0xf540ec8a19daeeda67854d1fd03c74, 0x00330b ] } , - BigNum { limbs: [ 0xcc000a11e4802951f21cd6dbea7c2a, 0xb2123d13636d445f7082bc8207c8de, 0x0040e1 ] } , - BigNum { limbs: [ 0x7f4a71e8149069d29f8a66433e17c6, 0x9b28721e8abbc3e8f9d6b214dd6309, 0x001c12 ] } , - BigNum { limbs: [ 0x3e599117e9cb952d607598bcc1e83b, 0x0c2ab77ef28c6f50de31578cfaa24a, 0x0057db ] } , - BigNum { limbs: [ 0xa60a12a7fafe3326945a8982257a8c, 0x56b1edc476b1082be230899d88c0b8, 0x002d3f ] } , - BigNum { limbs: [ 0x1799f058035dcbd96ba5757dda8575, 0x50a13bd906972b0df5d780044f449b, 0x0046ae ] } , - BigNum { limbs: [ 0xeb5269e06340da74ad6f23b8331b7d, 0x812e1d221ea3c3d27fdf06de69822a, 0x00081d ] } , - BigNum { limbs: [ 0xd251991f9b1b248b5290db47cce484, 0x26250c7b5ea46f67582902c36e8328, 0x006bd0 ] } , - BigNum { limbs: [ 0x5d72906ae5974656402311a3c88c0d, 0x20bdebb8c529b77a75fbc3e63a6bd7, 0x0060c5 ] } , - BigNum { limbs: [ 0x6031729518c4b8a9bfdced5c3773f4, 0x86953de4b81e7bbf620c45bb9d997c, 0x001328 ] } , - BigNum { limbs: [ 0x8ae0d36eaa8ceeb0ec520770f54dd3, 0x051ba804583083d632fb1caac7277b, 0x005e0e ] } , - BigNum { limbs: [ 0x32c32f9153cf104f13adf78f0ab22e, 0xa23781992517af63a50cecf710ddd8, 0x0015df ] } , - BigNum { limbs: [ 0x70ca1a6b232d5316951ae5ab0e6a4c, 0x0e9a156bfcdfe7a10eedb8e7072c92, 0x000599 ] } , - BigNum { limbs: [ 0x4cd9e894db2eabe96ae51954f195b5, 0x98b9143180684b98c91a50bad0d8c1, 0x006e54 ] } , - BigNum { limbs: [ 0x0f8c6a786fe9e866941a14b23a4155, 0x871fec91df9e50d66999b7f71ecb85, 0x00260d ] } , - BigNum { limbs: [ 0xae1798878e7216996be5ea4dc5beac, 0x20333d0b9da9e2636e6e51aab939ce, 0x004de0 ] } , - BigNum { limbs: [ 0x728f805725223905648a06d5bf4779, 0x9f15f40745862c463c0f6c15f45234, 0x000eac ] } , - BigNum { limbs: [ 0x4b1482a8d939c5fa9b75f82a40b888, 0x083d359637c206f39bf89d8be3b31f, 0x006541 ] } , - BigNum { limbs: [ 0xb10938a76e2590378e47a78cb232a2, 0x99c93e92dfca58c7a298d7828572ca, 0x000550 ] } , - BigNum { limbs: [ 0x0c9aca5890366ec871b857734dcd5f, 0x0d89eb0a9d7dda72356f321f529289, 0x006e9d ] } , - BigNum { limbs: [ 0xe83b231555ac35ead6a82181c19293, 0xa2397a7ac4814435fb53a4ff017529, 0x001f23 ] } , - BigNum { limbs: [ 0xd568dfeaa8afc9152957dd7e3e6d6e, 0x0519af22b8c6ef03dcb464a2d69029, 0x0054ca ] } , - BigNum { limbs: [ 0x6f49efba092206bec4af45a3dd836a, 0x8a349d98ba5804e0a5947115d93a2f, 0x005569 ] } , - BigNum { limbs: [ 0x4e5a1345f539f8413b50b95c227c97, 0x1d1e8c04c2f02e593273988bfecb24, 0x001e84 ] } , - BigNum { limbs: [ 0x1b702ad51911966e554ba438256c09, 0x4d7122d117efeb680de72cff169011, 0x006daa ] } , - BigNum { limbs: [ 0xa233d82ae54a6891aab45ac7da93f8, 0x59e206cc655847d1ca20dca2c17542, 0x000643 ] } , - BigNum { limbs: [ 0x3bc1e33db1fabde67e9726e2110a9f, 0x5bf26247526e599fab5a4a1e19cff4, 0x0047a4 ] } , - BigNum { limbs: [ 0x81e21fc24c6141198168d81deef562, 0x4b60c7562ad9d99a2cadbf83be355f, 0x002c49 ] } , - BigNum { limbs: [ 0x92dc9c9ab9a192a42416165d386af9, 0x2e6ad1aa805d875c182d7bfe77cc17, 0x0035b9 ] } , - BigNum { limbs: [ 0x2ac7666544ba6c5bdbe9e8a2c79508, 0x78e857f2fceaabddbfda8da360393c, 0x003e34 ] } , - BigNum { limbs: [ 0xdbf9d401389e118356c2dfd4542a7e, 0x1beb3356e7eac8b5c49358e42cc261, 0x005d40 ] } , - BigNum { limbs: [ 0xe1aa2efec5bded7ca93d1f2babd583, 0x8b67f646955d6a841374b0bdab42f1, 0x0016ad ] } , - BigNum { limbs: [ 0xde093f86dc82aee638c24bfb618f3f, 0xcc695696e15f33b6703722957141dc, 0x004b57 ] } , - BigNum { limbs: [ 0xdf9ac37921d95019c73db3049e70c2, 0xdae9d3069be8ff8367d0e70c66c376, 0x002895 ] } , - BigNum { limbs: [ 0x43cf43b8a4fea9a6910d41d80997d6, 0xb89955f3ac075693ab26c50bb8772e, 0x001b0a ] } , - BigNum { limbs: [ 0x79d4bf47595d55596ef2bd27f6682b, 0xeeb9d3a9d140dca62ce144961f8e25, 0x0058e2 ] } , - BigNum { limbs: [ 0x6df74788bfddf547809a0593c52c29, 0x6e3537a8223b30a23b5534d53e7afc, 0x004be8 ] } , - BigNum { limbs: [ 0x4facbb773e7e09b87f65f96c3ad3d8, 0x391df1f55b0d02979cb2d4cc998a57, 0x002805 ] } , - BigNum { limbs: [ 0xecbebc0bb2bede8728abb983c104a2, 0xd259c48b91eaa8064226f6054683bc, 0x003083 ] } , - BigNum { limbs: [ 0xd0e546f44b9d2078d754457c3efb5f, 0xd4f96511eb5d8b3395e1139c918196, 0x004369 ] } , - BigNum { limbs: [ 0xd37ff2a87babb380c6c92288db9ca6, 0x72a1f9cd89124eb06d927e27a3fd9e, 0x007289 ] } , - BigNum { limbs: [ 0xea24105782b04b7f3936dc7724635b, 0x34b12fcff435e4896a758b7a3407b4, 0x000164 ] } , - BigNum { limbs: [ 0x3a7585c54ec264e3ee86325ff52f02, 0x34796ea0382b31d08ef46443e548e5, 0x000b97 ] } , - BigNum { limbs: [ 0x832e7d3aaf999a1c1179cca00ad0ff, 0x72d9bafd451d01694913a55df2bc6e, 0x006856 ] } , - BigNum { limbs: [ 0x83611805de11188d9fc12803667dbf, 0xd8489d9b1d2b7d981b5cc7400d058a, 0x00668c ] } , - BigNum { limbs: [ 0x3a42eafa204ae672603ed6fc998242, 0xcf0a8c02601cb5a1bcab4261caffc9, 0x000d60 ] } , - BigNum { limbs: [ 0x6ace9eee636cfea106cdd2093221c4, 0x25a27aaf423e560d8375b9f57ddb5f, 0x004164 ] } , - BigNum { limbs: [ 0x52d564119aef005ef9322cf6cdde3d, 0x81b0aeee3b09dd2c54924fac5a29f4, 0x003289 ] } , - BigNum { limbs: [ 0x804da7679b1f2ab1d8a86c599c1125, 0x37ea83b297acb4d4cac9a82e460d7a, 0x000562 ] } , - BigNum { limbs: [ 0x3d565b98633cd44e275792a663eedc, 0x6f68a5eae59b7e650d3e617391f7d9, 0x006e8b ] } , - BigNum { limbs: [ 0xac81ba0e9f27289accbc94269dcfed, 0xca7fe2354d973f2d66f302fd0a4109, 0x006288 ] } , - BigNum { limbs: [ 0x112248f15f34d66533436ad9623014, 0xdcd347682fb0f40c711506a4cdc44a, 0x001164 ] } , - BigNum { limbs: [ 0xaa925bcaf595931a976cec0c95430e, 0xf19446ee388087b66e87e6421ad7f4, 0x006e17 ] } , - BigNum { limbs: [ 0x1311a73508c66be5689312f36abcf3, 0xb5bee2af44c7ab836980235fbd2d5f, 0x0005d5 ] } , - BigNum { limbs: [ 0x7eebd047cbc2e51c5ec124a724f5d0, 0xf253594888ee9a00b7f8aae9ee446d, 0x0029f1 ] } , - BigNum { limbs: [ 0x3eb832b8329919e3a13eda58db0a31, 0xb4ffd054f4599939200f5eb7e9c0e6, 0x0049fb ] } , - BigNum { limbs: [ 0xc3721ea6c79959350ce6a6828af90a, 0x65e4d3674be8111f4ebbffa0ac1554, 0x003f1a ] } , - BigNum { limbs: [ 0xfa31e45936c2a5caf319587d7506f7, 0x416e56363160221a894c0a012beffe, 0x0034d3 ] } , - BigNum { limbs: [ 0xc955e365e603ea58bb2d6aa83247db, 0xdb61407a6cf482dcb6fbe1f248d57f, 0x006323 ] } , - BigNum { limbs: [ 0xf44e1f9a185814a744d29457cdb826, 0xcbf1e9231053b05d210c27af8f2fd3, 0x0010c9 ] } , - BigNum { limbs: [ 0x78a3d2d41320a58a91e7a363e4bf29, 0xf65a022ccf82e082eced9e4db37053, 0x004043 ] } , - BigNum { limbs: [ 0x4500302beb3b59756e185b9c1b40d8, 0xb0f92770adc552b6eb1a6b54249500, 0x0033a9 ] } , - BigNum { limbs: [ 0x51110b4d802457efc0e95192098448, 0x204ab0d2a8638e24584004aba6faa2, 0x001d4a ] } , - BigNum { limbs: [ 0x6c92f7b27e37a7103f16ad6df67bb9, 0x870878cad4e4a5157fc804f6310ab1, 0x0056a3 ] } , - BigNum { limbs: [ 0xa76cbd7137e6f47e6e58015540096f, 0x17e3d47a499280db319a950d9b3877, 0x0024f7 ] } , - BigNum { limbs: [ 0x1637458ec6750a8191a7fdaabff692, 0x8f6f552333b5b25ea66d74943cccdc, 0x004ef6 ] } , - BigNum { limbs: [ 0x46cc3132ae68b8a5f2cc3b6ce6684c, 0xaeefe26d6d67ed111551f5aecd91b5, 0x006694 ] } , - BigNum { limbs: [ 0x76d7d1cd4ff3465a0d33c3931997b5, 0xf86347300fe04628c2b613f30a739e, 0x000d58 ] } , - BigNum { limbs: [ 0x356ebb9037c6036cf0c644e1105fba, 0xe6ce8ff225aa86da51c04c9130a03f, 0x005271 ] } , - BigNum { limbs: [ 0x8835476fc695fb930f39ba1eefa047, 0xc08499ab579dac5f8647bd10a76514, 0x00217b ] } , - BigNum { limbs: [ 0x71972107f75956b53875e0be421d2a, 0xbd4090207fe16c1f9ade683c154e89, 0x0071bc ] } , - BigNum { limbs: [ 0x4c0ce1f80702a84ac78a1e41bde2d7, 0xea12997cfd66c71a3d29a165c2b6ca, 0x000230 ] } , - BigNum { limbs: [ 0x62cc3eb2ba6bc6f7b5e5dc5beed42f, 0x4302c5125319ab5b6b747430015857, 0x0067d1 ] } , - BigNum { limbs: [ 0x5ad7c44d43f038084a1a22a4112bd2, 0x6450648b2a2e87de6c939571d6acfc, 0x000c1c ] } , - BigNum { limbs: [ 0x4ded5e86515588409b42a1c622af82, 0xc18924c9ff6195534d6b669470a21f, 0x006db9 ] } , - BigNum { limbs: [ 0x6fb6a479ad0676bf64bd5d39dd507f, 0xe5ca04d37de69de68a9ca30d676334, 0x000633 ] } , - BigNum { limbs: [ 0xf940aaef199513b2942e1e96335b6e, 0x9fb0976b417260510ce0bd3d0820c3, 0x004908 ] } , - BigNum { limbs: [ 0xc4635810e4c6eb4d6bd1e069cca493, 0x07a292323bd5d2e8cb274c64cfe48f, 0x002ae5 ] } , - BigNum { limbs: [ 0x99f96384bc107506288c5822ce5a85, 0x472aaaaaf10a84bbb7015543f86105, 0x0031a4 ] } , - BigNum { limbs: [ 0x23aa9f7b424b89f9d773a6dd31a57c, 0x60287ef28c3dae7e2106b45ddfa44e, 0x004249 ] } , - BigNum { limbs: [ 0x380fc7606ef68763087e889370beba, 0xa48e895f4d79a04b607cacfddcb934, 0x0058be ] } , - BigNum { limbs: [ 0x85943b9f8f65779cf781766c8f4147, 0x02c4a03e2fce92ee778b5ca3fb4c1f, 0x001b2f ] } , - BigNum { limbs: [ 0x0d0e018ef12219eb96289ab55ac431, 0x583bb90996d418302d24d1f9482095, 0x0033d6 ] } , - BigNum { limbs: [ 0xb09601710d39e51469d7644aa53bd0, 0x4f177093e6741b09aae337a88fe4be, 0x004017 ] } , - BigNum { limbs: [ 0x720ee1ef0d377d0671c39b05d1219c, 0x0e3c672a9e17fe930bc21be24ae73d, 0x002bb2 ] } , - BigNum { limbs: [ 0x4b952110f12481f98e3c63fa2ede65, 0x9916c272df3034a6cc45edbf8d1e16, 0x00483b ] } , - BigNum { limbs: [ 0x8f937d589f241863fb1675b6ea931b, 0x1c2179e9ba67fb96c016aa69f8fe7b, 0x0010f3 ] } , - BigNum { limbs: [ 0x2e1085a75f37e69c04e98949156ce6, 0x8b31afb3c2e037a317f15f37df06d8, 0x0062fa ] } , - BigNum { limbs: [ 0x56e00d5f1e00882902252fc85dc59c, 0x3e901ee55f3ead151e1a9ffea6d1e0, 0x0020d7 ] } , - BigNum { limbs: [ 0x66c3f5a0e05b76d6fddacf37a23a65, 0x68c30ab81e098624b9ed69a3313373, 0x005316 ] } , - BigNum { limbs: [ 0xbc23b54455eb4351ac2ebbbbf58f0f, 0x9056fb6c09d687252eb8459705938c, 0x001765 ] } , - BigNum { limbs: [ 0x01804dbba870bbae53d143440a70f2, 0x16fc2e317371ac14a94fc40ad271c7, 0x005c88 ] } , - BigNum { limbs: [ 0x93c6b06754a128dff1056cfd5ec865, 0xf74df5e016d7a53f6b08885f52e784, 0x005e2a ] } , - BigNum { limbs: [ 0x29dd5298a9bad6200efa9202a1379c, 0xb00533bd66708dfa6cff8142851dcf, 0x0015c2 ] } , - BigNum { limbs: [ 0x41d2f6c7f8a9395717a8e61423c05b, 0x3d0053a77263e322f86bf6d0dc3924, 0x0048ae ] } , - BigNum { limbs: [ 0x7bd10c3805b2c5a8e85718ebdc3fa6, 0x6a52d5f60ae45016df9c12d0fbcc2f, 0x002b3f ] } , - BigNum { limbs: [ 0x709eafc06c4ff19ad80a4b7b416ac5, 0x298eec226cfaea1765007c50fae425, 0x0031fc ] } , - BigNum { limbs: [ 0x4d05533f920c0d6527f5b384be953c, 0x7dc43d7b104d492273078d50dd212e, 0x0041f1 ] } , - BigNum { limbs: [ 0x69099c2b782691822141c76792a203, 0x0bdedfe0d19fff137b4c5c01b22f1a, 0x003789 ] } , - BigNum { limbs: [ 0x549a66d486356d7ddebe37986d5dfe, 0x9b7449bcaba834265cbbada025d639, 0x003c64 ] } , - BigNum { limbs: [ 0x09b329fa1577ff554c99286208dfee, 0x6776f189910ff3a606914c38247b25, 0x005a7f ] } , - BigNum { limbs: [ 0xb3f0d905e8e3ffaab366d69df72013, 0x3fdc3813ec383f93d176bd69b38a2e, 0x00196e ] } , - BigNum { limbs: [ 0x24accfa767b8cf3d2cac8d90592e9c, 0xb0bff695f8bb1988ea48d61b0adbd7, 0x002e0c ] } , - BigNum { limbs: [ 0x98f7335896a32fc2d353716fa6d165, 0xf6933307848d19b0edbf3386cd297c, 0x0045e0 ] } , - BigNum { limbs: [ 0x1c7ac41146f49ac18f962c2f958a43, 0x307fb2724e316afbbe1c20bf199667, 0x0065d9 ] } , - BigNum { limbs: [ 0xa1293eeeb767643e7069d2d06a75be, 0x76d3772b2f16c83e19ebe8e2be6eec, 0x000e14 ] } , - BigNum { limbs: [ 0xcd5e72e6bcb06297c78f3489f706ea, 0x1ed60f08ce06aadbb17ef22557b500, 0x005a6f ] } , - BigNum { limbs: [ 0xf045901941ab9c683870ca7608f917, 0x887d1a94af41885e2689177c805052, 0x00197e ] } , - BigNum { limbs: [ 0xe6b7a3bfecde634244d4514c7912ad, 0x0cb7e84409d6c970aa662616e8b847, 0x0037f5 ] } , - BigNum { limbs: [ 0xd6ec5f40117d9bbdbb2badb386ed54, 0x9a9b4159737169c92da1e38aef4d0b, 0x003bf8 ] } , - BigNum { limbs: [ 0x209b1c1b82cb497c47ca08d92d3855, 0x585dfc3bb27bf4ec94f6914ed44415, 0x000f94 ] } , - BigNum { limbs: [ 0x9d08e6e47b90b583b835f626d2c7ac, 0x4ef52d61cacc3e4d4311785303c13e, 0x006459 ] } , - BigNum { limbs: [ 0x0c3761f18348336e42f959081acdf7, 0xc7e6d1ada8b1413bf7a2546e4b2a2c, 0x0025f0 ] } , - BigNum { limbs: [ 0xb16ca10e7b13cb91bd06a5f7e5320a, 0xdf6c57efd496f1fde065b5338cdb27, 0x004dfc ] } , - BigNum { limbs: [ 0xbd040be90c1f098bdfa8f11646bfd6, 0x43d46fcb1be37348df13ad0c2a5b55, 0x0010e9 ] } , - BigNum { limbs: [ 0x009ff716f23cf57420570de9b9402b, 0x637eb9d26164bff0f8f45c95ada9fe, 0x006304 ] } , - BigNum { limbs: [ 0x1d9aa77779df363215065a4e6c2abd, 0xc6a057415d04ff53233bd8fbdd0586, 0x004fa4 ] } , - BigNum { limbs: [ 0xa0095b88847cc8cdeaf9a4b193d544, 0xe0b2d25c204333e6b4cc30a5faffcd, 0x002448 ] } , - BigNum { limbs: [ 0x9cb31f0b9200b0648ac18a60c7b419, 0xedbddad8c9ed9ccc28ba8ce12efb12, 0x001deb ] } , - BigNum { limbs: [ 0x20f0e3f46c5b4e9b753e749f384be8, 0xb9954ec4b35a966daf4d7cc0a90a41, 0x005601 ] } , - BigNum { limbs: [ 0x2e713efdc506192c3fd2500d74ed6a, 0xf5c94a9135d4738d8393fd1f618fcf, 0x005a3e ] } , - BigNum { limbs: [ 0x8f32c4023955e5d3c02daef28b1297, 0xb189df0c4773bfac54740c82767584, 0x0019ae ] } , - BigNum { limbs: [ 0x019f2521aea11163fdb1347e6d3c9b, 0xa3738160674ee6d82b9f88354b2359, 0x0015f0 ] } , - BigNum { limbs: [ 0xbc04ddde4fbaed9c024eca8192c366, 0x03dfa83d15f94c61ac68816c8ce1fa, 0x005dfd ] } , - BigNum { limbs: [ 0x92fda99d579539f60c1d8e32539eed, 0x186ff76aea8fd621c79e7166b7c3ef, 0x004354 ] } , - BigNum { limbs: [ 0x2aa65962a6c6c509f3e270cdac6114, 0x8ee3323292b85d181069983b204164, 0x003099 ] } , - BigNum { limbs: [ 0x4724fc91e126a038f88846a27a42f1, 0x67d8299d6a032639726942cb41b3ab, 0x006903 ] } , - BigNum { limbs: [ 0x767f066e1d355ec70777b85d85bd10, 0x3f7b000013450d00659ec6d69651a8, 0x000aea ] } , - BigNum { limbs: [ 0x36b2bbef5d95fb7d47e495b596c9e9, 0x7f053989ebbecb783501b9ec0fc922, 0x0073b2 ] } , - BigNum { limbs: [ 0x86f14710a0c60382b81b694a693618, 0x284df013918967c1a3064fb5c83c31, 0x00003b ] } , - BigNum { limbs: [ 0xb23ca83d927621d3100b451544eeb2, 0xab0cf321b5b87b7be0e951d31d980f, 0x0001eb ] } , - BigNum { limbs: [ 0x0b675ac26be5dd2ceff4b9eabb114f, 0xfc46367bc78fb7bdf71eb7ceba6d44, 0x007201 ] } , - BigNum { limbs: [ 0x55d00501e227d8804bf625d398d145, 0x32372fc6312f124acc1f42547e59ea, 0x005032 ] } , - BigNum { limbs: [ 0x67d3fdfe1c34267fb409d92c672ebc, 0x751bf9d74c1920ef0be8c74d59ab69, 0x0023bb ] } , - BigNum { limbs: [ 0x179e352fd65140abe985536de528a4, 0xcebd48220fe6df7882f59ab9abc5a7, 0x000597 ] } , - BigNum { limbs: [ 0xa605cdd0280abe54167aab921ad75d, 0xd895e17b6d6153c155126ee82c3fac, 0x006e55 ] } , - BigNum { limbs: [ 0x6468c1fc0bd98bc3f6e8b28be3db63, 0x7ef3b4556ef6d679aecad160dc2576, 0x00313f ] } , - BigNum { limbs: [ 0x593b4103f282733c09174c741c249e, 0x285f75480e515cc0293d3840fbdfdd, 0x0042ae ] } , - BigNum { limbs: [ 0x13470f1ab3da1ef5d61e450be78a51, 0x2f1becd5cc2934506a82aac78647b9, 0x000c05 ] } , - BigNum { limbs: [ 0xaa5cf3e54a81e00a29e1b9f41875b0, 0x78373cc7b11efee96d855eda51bd9a, 0x0067e8 ] } , - BigNum { limbs: [ 0x661c5aa57383f79b12c70a99339b94, 0x46dd8726ce03b8415b884acecaf444, 0x001319 ] } , - BigNum { limbs: [ 0x5787a85a8ad80764ed38f466cc646d, 0x6075a276af447af87c7fbed30d110f, 0x0060d4 ] } , - BigNum { limbs: [ 0xce5f9885b2f745bfa666b56d5a311a, 0x2668128e4a2bc83ba98b6857538716, 0x000a71 ] } , - BigNum { limbs: [ 0xef446a7a4b64b94059994992a5cee7, 0x80eb170f331c6afe2e7ca14a847e3c, 0x00697c ] } , - BigNum { limbs: [ 0x6aed1a564c146832d3560d5be17df8, 0x52d64d9b5c2fa87d62e7251e9f9727, 0x006b68 ] } , - BigNum { limbs: [ 0x52b6e8a9b24796cd2ca9f1a41e8209, 0x547cdc0221188abc7520e483386e2c, 0x000885 ] } , - BigNum { limbs: [ 0xd812068ac8f3657b45e33be2652de0, 0x309990b78e6f19be2ed4aae8454f92, 0x00411b ] } , - BigNum { limbs: [ 0xe591fc7535689984ba1cc31d9ad221, 0x76b998e5eed9197ba9335eb992b5c0, 0x0032d2 ] } , - BigNum { limbs: [ 0xbd51462129070533c31b718832f5e8, 0x19426e03b06186e1de604ed007c9b0, 0x006903 ] } , - BigNum { limbs: [ 0x0052bcded554f9cc3ce48d77cd0a19, 0x8e10bb99cce6ac57f9a7bad1d03ba3, 0x000aea ] } , - BigNum { limbs: [ 0x55d8768e908ff925fd2d98cb6dbbee, 0x8db0c855debd836ab3062d9fa9d8d9, 0x00547a ] } , - BigNum { limbs: [ 0x67cb8c716dcc05da02d26634924413, 0x19a261479e8aafcf2501dc022e2c7a, 0x001f73 ] } , - BigNum { limbs: [ 0x8e0ba527eca417365149025f015d1e, 0xc3152df73f24a32669617e74f15ae1, 0x0070fc ] } , - BigNum { limbs: [ 0x2f985dd811b7e7c9aeb6fca0fea2e3, 0xe43dfba63e2390136ea68b2ce6aa72, 0x0002f0 ] } , - BigNum { limbs: [ 0x8275c394add2deae53a0e275fd0cf4, 0x7b2aeb5230fa2c195afbea2192bd19, 0x00702f ] } , - BigNum { limbs: [ 0x3b2e3f6b50892051ac5f1c8a02f30d, 0x2c283e4b4c4e07207d0c1f8045483a, 0x0003be ] } , - BigNum { limbs: [ 0xb3c3d1d51852439775462cfb15928e, 0x5b03ee8a9e0c240a6ba7523bd51940, 0x00068f ] } , - BigNum { limbs: [ 0x09e0312ae609bb688ab9d204ea6d73, 0x4c4f3b12df3c0f2f6c60b76602ec13, 0x006d5e ] } , - BigNum { limbs: [ 0x2b5f0db0dd8f62428bf3d065323436, 0x3195598a28d8092bd18a7ee24d2161, 0x0001e3 ] } , - BigNum { limbs: [ 0x9244f54f20cc9cbd740c2e9acdcbcb, 0x75bdd01354702a0e067d8abf8ae3f2, 0x00720a ] } , - BigNum { limbs: [ 0x9df86f28195171f1fe341312f98924, 0x54eb6b36c54b9602ae7a61023ae791, 0x0031b3 ] } , - BigNum { limbs: [ 0x1fab93d7e50a8d0e01cbebed0676dd, 0x5267be66b7fc9d37298da89f9d1dc2, 0x00423a ] } , - BigNum { limbs: [ 0x32e14ea5c65fd882f06ddfe57fb749, 0xa4854293013e6b346b4a4b01e810da, 0x00109a ] } , - BigNum { limbs: [ 0x8ac2b45a37fc267d0f921f1a8048b8, 0x02cde70a7c09c8056cbdbe9feff479, 0x006353 ] } , - BigNum { limbs: [ 0x423c71ad2b0dfa572131cee36007fa, 0x33b9c1df4ffd1b118bfbe33bd251a0, 0x001467 ] } , - BigNum { limbs: [ 0x7b679152d34e04a8dece301c9ff807, 0x739967be2d4b18284c0c266605b3b3, 0x005f86 ] } , - BigNum { limbs: [ 0x4312ad66d4b7e90d2b6da17aab81c3, 0xe4da640bbaac82fcb1b1e258caf7f7, 0x00218a ] } , - BigNum { limbs: [ 0x7a91559929a415f2d4925d85547e3e, 0xc278c591c29bb03d265627490d0d5c, 0x005262 ] } , - BigNum { limbs: [ 0x7b3c07432c4bb846d7751759b82258, 0xbcb86c65c99f9735bdebf5628898ac, 0x00653a ] } , - BigNum { limbs: [ 0x4267fbbcd21046b9288ae7a647dda9, 0xea9abd37b3a89c041a1c143f4f6ca7, 0x000eb2 ] } , - BigNum { limbs: [ 0x9ce7c297ab8d54db615b721e6888d5, 0x889f6574f553a2a6da1423fa9a8a78, 0x002313 ] } , - BigNum { limbs: [ 0x20bc406852ceaa249ea48ce197772c, 0x1eb3c42887f49092fdf3e5a73d7adb, 0x0050da ] } , - BigNum { limbs: [ 0x73546ee70933efffe30ef5a9528edd, 0x0e58e6c6cf02feb911dc3dad3a3bad, 0x0054bc ] } , - BigNum { limbs: [ 0x4a4f9418f5280f001cf10956ad7124, 0x98fa42d6ae453480c62bcbf49dc9a6, 0x001f31 ] } , - BigNum { limbs: [ 0x4b743731d6de69caf95626573b849e, 0x7b4eac93969def71980219544f4fd8, 0x0017e4 ] } , - BigNum { limbs: [ 0x722fcbce277d953506a9d8a8c47b63, 0x2c047d09e6aa43c84005f04d88b57b, 0x005c09 ] } , - BigNum { limbs: [ 0x76809182ba32c095d44706ae689c0c, 0xa9f46ae7f49b8041bad9d23de711f3, 0x0070d4 ] } , - BigNum { limbs: [ 0x4723717d44293e6a2bb8f8519763f5, 0xfd5ebeb588acb2f81d2e3763f0f360, 0x000318 ] } , - BigNum { limbs: [ 0x4311151b41f2e4a8b188dd1a6a4bf6, 0x66fd2e6a621ba27d46e4e6ebaaab28, 0x002920 ] } , - BigNum { limbs: [ 0x7a92ede4bc691a574e7721e595b40b, 0x4055fb331b2c90bc912322b62d5a2b, 0x004acd ] } , - BigNum { limbs: [ 0x5cb240f458a0411af937dd7884b5bd, 0x5c392742ebcb8eda0f11c5920ab794, 0x004c46 ] } , - BigNum { limbs: [ 0x60f1c20ba5bbbde506c821877b4a44, 0x4b1a025a917ca45fc8f6440fcd4dbf, 0x0027a7 ] } , - BigNum { limbs: [ 0x6b26bf3a5b9cedc4de75f89a010b97, 0x7787223bc8fc5a52f2e3933f823d47, 0x006a5b ] } , - BigNum { limbs: [ 0x527d43c5a2bf113b218a0665fef46a, 0x2fcc0761b44bd8e6e524766255c80c, 0x000992 ] } , - BigNum { limbs: [ 0x906daf54262b5a6d913c8a21d61a14, 0xfd20ce3f8b5ded02bf205d2103eac1, 0x00646e ] } , - BigNum { limbs: [ 0x2d3653abd830a4926ec374de29e5ed, 0xaa325b5df1ea463718e7ac80d41a92, 0x000f7e ] } , - BigNum { limbs: [ 0xd3fa076900a2701dc2e8ce1a0001e5, 0x8a061c5504e40c9c6d744ce76f9570, 0x004bae ] } , - BigNum { limbs: [ 0xe9a9fb96fdb98ee23d1730e5fffe1c, 0x1d4d0d487864269d6a93bcba686fe2, 0x00283f ] } , - BigNum { limbs: [ 0x841ffb42a9153d71f0aca0022c86e0, 0x0b4a3128782aad8b75eeb88658b3d3, 0x002b1f ] } , - BigNum { limbs: [ 0x398407bd5546c18e0f535efdd37921, 0x9c08f875051d85ae6219511b7f5180, 0x0048ce ] } , - BigNum { limbs: [ 0x328f11d9cdf877394e8363ac674b29, 0xfea00f8d24bf97d28a6cca10529e21, 0x004b21 ] } , - BigNum { limbs: [ 0x8b14f126306387c6b17c9b5398b4d8, 0xa8b31a1058889b674d9b3f91856732, 0x0028cb ] } , - BigNum { limbs: [ 0x535ba390e22a934f2887da7a4613ac, 0x146fc82c471d6006a526adeef61511, 0x005d2c ] } , - BigNum { limbs: [ 0x6a485f6f1c316bb0d7782485b9ec55, 0x92e36171362ad33332e15bb2e1f042, 0x0016c1 ] } , - BigNum { limbs: [ 0xe632049f8464426c8b9b2bf815aad7, 0x48ccf85251fc944d705267aef07995, 0x002fe5 ] } , - BigNum { limbs: [ 0xd771fe6079f7bc937464d307ea552a, 0x5e86314b2b4b9eec67b5a1f2e78bbd, 0x004408 ] } , - BigNum { limbs: [ 0xe3f58397fa59ca7ee8c97459708936, 0x49b450f7e1001fbfe1fc8d8a0d5fe7, 0x007294 ] } , - BigNum { limbs: [ 0xd9ae7f680402348117368aa68f76cb, 0x5d9ed8a59c481379f60b7c17caa56b, 0x000159 ] } , - BigNum { limbs: [ 0x9de328231391765bc4f547e17fae04, 0x7ae3db865ba7714dcc8e32350736c2, 0x002d93 ] } , - BigNum { limbs: [ 0x1fc0dadceaca88a43b0ab71e8051fd, 0x2c6f4e1721a0c1ec0b79d76cd0ce91, 0x00465a ] } , - BigNum { limbs: [ 0x99e982481eb187c638ab874c146c0a, 0x850021892f6b10f3be96e9d4669892, 0x001b04 ] } , - BigNum { limbs: [ 0x23ba80b7dfaa7739c75477b3eb93f7, 0x225308144ddd224619711fcd716cc1, 0x0058e9 ] } , - BigNum { limbs: [ 0x22968828352a6e3f4bf52554d38e6f, 0xf1c7a7718e251607c0636d7990d68f, 0x00262a ] } , - BigNum { limbs: [ 0x9b0d7ad7c93190c0b40ad9ab2c7192, 0xb58b822bef231d3217a49c28472ec4, 0x004dc2 ] } , - BigNum { limbs: [ 0x19d4b2a482d2fbc23c6ee8ac5a4aaf, 0xc9aafb60bcbac15b96d0a2f553f4e4, 0x002d95 ] } , - BigNum { limbs: [ 0xa3cf505b7b89033dc3911653a5b552, 0xdda82e3cc08d71de413766ac84106f, 0x004657 ] } , - BigNum { limbs: [ 0x9ac76eb653b8077d5feb370589ddcd, 0x1cea5e2d9df0734149137047b1786e, 0x003b8c ] } , - BigNum { limbs: [ 0x22dc9449aaa3f782a014c7fa762234, 0x8a68cb6fdf57bff88ef4995a268ce5, 0x003861 ] } , - BigNum { limbs: [ 0x6ea99bee92c793b2126ee2e55d5b7b, 0x532503b950c74c9db999b77bc95b13, 0x006efd ] } , - BigNum { limbs: [ 0x4efa67116b946b4ded911c1aa2a486, 0x542e25e42c80e69c1e6e52260eaa40, 0x0004f0 ] } , - BigNum { limbs: [ 0x4abd405dd655c9caba576e317c51c0, 0x5b7f47d7e3dde00b481b539b58b533, 0x006e5f ] } , - BigNum { limbs: [ 0x72e6c2a22806353545a890ce83ae41, 0x4bd3e1c5996a532e8fecb6067f5020, 0x00058e ] } , - BigNum { limbs: [ 0x231f19c71e8773da6453c4f956b91c, 0x019aedcb1f56b52853da3777fcc872, 0x000eaf ] } , - BigNum { limbs: [ 0x9a84e938dfd48b259bac3a06a946e5, 0xa5b83bd25df17e11842dd229db3ce1, 0x00653e ] } , - BigNum { limbs: [ 0x19668a6e56d866fa44b2cf5ea9ce3e, 0x3a4b78ab5c819959f3c1dbce24dcb2, 0x00567a ] } , - BigNum { limbs: [ 0xa43d7891a7839805bb4d2fa15631c3, 0x6d07b0f220c699dfe4462dd3b328a1, 0x001d73 ] } , - BigNum { limbs: [ 0x8fc3ecb74d2370818a195b4030b82d, 0xda607fd657b1ecc589fe94d902934c, 0x002c8e ] } , - BigNum { limbs: [ 0x2de01648b1388e7e75e6a3bfcf47d4, 0xccf2a9c7259646744e0974c8d57207, 0x00475e ] } , - BigNum { limbs: [ 0x8586ae1f584b84c709f7cddb49aefe, 0x9d29782d7022884ec5a8cd2669f7cc, 0x0019fa ] } , - BigNum { limbs: [ 0x381d54e0a6107a38f6083124b65103, 0x0a29b1700d25aaeb125f3c7b6e0d87, 0x0059f3 ] } , - BigNum { limbs: [ 0x97551d7eb479316903092c74d1b363, 0xc0dfcf0eae86c2b3ee68881b3131e8, 0x004b0e ] } , - BigNum { limbs: [ 0x264ee58149e2cd96fcf6d28b2e4c9e, 0xe6735a8ecec17085e99f8186a6d36b, 0x0028de ] } , - BigNum { limbs: [ 0x8f79025062832db2e14ff671c966ca, 0x39d976a5cc746815ff2c5df25e4c4b, 0x00500c ] } , - BigNum { limbs: [ 0x2e2b00af9bd8d14d1eb0088e369937, 0x6d79b2f7b0d3cb23d8dbabaf79b908, 0x0023e1 ] } , - BigNum { limbs: [ 0x9d16dab72c6ea893501f19a2ae9b40, 0x9285f4b67ba0714fb14e35f116982e, 0x003c74 ] } , - BigNum { limbs: [ 0x208d2848d1ed566cafe0e55d5164c1, 0x14cd34e701a7c1ea26b9d3b0c16d25, 0x003779 ] } , - BigNum { limbs: [ 0x376a86c53fbaa0e7b0f84cf1693a6c, 0xd3d2ca0f2c04501eff841f6ad00440, 0x005f25 ] } , - BigNum { limbs: [ 0x86397c3abea15e184f07b20e96c595, 0xd3805f8e5143e31ad883ea37080113, 0x0014c7 ] } , - BigNum { limbs: [ 0xcfc741b88a6d90351e7a72117b4660, 0xbefa63943b3c9fb623bd7d8f468827, 0x00235e ] } , - BigNum { limbs: [ 0xeddcc14773ee6ecae1858cee84b9a1, 0xe858c609420b9383b44a8c12917d2b, 0x00508e ] } , - BigNum { limbs: [ 0x73d6ebd3f2d04ebd818c79e9b418c3, 0xa89d6917cf356fb52776257e47f6bd, 0x006d9c ] } , - BigNum { limbs: [ 0x49cd172c0b8bb0427e7385164be73e, 0xfeb5c085ae12c384b091e423900e96, 0x000650 ] } , - BigNum { limbs: [ 0xcbed26a10189725865f49cae84c1f0, 0x51abf2ff1a7ac214f8af079281e8c2, 0x001c89 ] } , - BigNum { limbs: [ 0xf1b6dc5efcd28ca79a0b62517b3e11, 0x55a7369e62cd7124df59020f561c90, 0x005764 ] } , - BigNum { limbs: [ 0x5c2a2517ea29380d784d83532d58a4, 0xe5bdc2f376ef3fbfaf7cf36c98f23c, 0x002acb ] } , - BigNum { limbs: [ 0x6179dde81432c6f287b27bacd2a75d, 0xc19566aa0658f37a288b16353f1317, 0x004921 ] } , - BigNum { limbs: [ 0x0c396a9fa67ea67e2a604403076877, 0xa9395cb8d476fab39024f46a4961d9, 0x003334 ] } , - BigNum { limbs: [ 0xb16a986057dd5881d59fbafcf8978a, 0xfe19cce4a8d1388647e315378ea37a, 0x0040b8 ] } , - BigNum { limbs: [ 0x659be0bb7e781e96ab11c20e5ad151, 0xbf9e4612a7a04b853daeb5686a7f1f, 0x005f0e ] } , - BigNum { limbs: [ 0x580822447fe3e06954ee3cf1a52eb0, 0xe7b4e38ad5a7e7b49a5954396d8634, 0x0014de ] } , - BigNum { limbs: [ 0x34af14b61e0abe74a1f6718c130477, 0x7a8bca252472eb674a1a620890d7a5, 0x004352 ] } , - BigNum { limbs: [ 0x88f4ee49e051408b5e098d73ecfb8a, 0x2cc75f7858d547d28deda799472dae, 0x00309b ] } , - BigNum { limbs: [ 0x986d4f948654a8ddccfd2991cb1cc7, 0x529d1d76d858cc6ba0596eae27c4e4, 0x003b18 ] } , - BigNum { limbs: [ 0x2536b36b780756223302d56e34e33a, 0x54b60c26a4ef66ce37ae9af3b0406f, 0x0038d5 ] } , - BigNum { limbs: [ 0x9da80dc7ef9f0f200b5775cb7c7f34, 0xada04d5e74819262a96d0a5549b5f1, 0x000679 ] } , - BigNum { limbs: [ 0x1ffbf5380ebcefdff4a889348380cd, 0xf9b2dc3f08c6a0d72e9aff4c8e4f62, 0x006d73 ] } , - BigNum { limbs: [ 0x8076a04042fa6a4ae23d4887732cc7, 0x84efe7a91e54c20ba6c40efc806c85, 0x005327 ] } , - BigNum { limbs: [ 0x3d2d62bfbb6194b51dc2b6788cd33a, 0x226341f45ef3712e3143faa55798ce, 0x0020c6 ] } , - BigNum { limbs: [ 0xad338dc96b53f06d9bd93caef95435, 0x46d16b0ded487a772571e97d5605ea, 0x004ac4 ] } , - BigNum { limbs: [ 0x1070753693080e926426c25106abcc, 0x6081be8f8fffb8c2b296202481ff69, 0x002929 ] } , - BigNum { limbs: [ 0x640ded94a2153f4f3cf1b82d878f30, 0x620c501b6d5b34b1fe426ba069ee6f, 0x000904 ] } , - BigNum { limbs: [ 0x5996156b5c46bfb0c30e46d27870d1, 0x4546d9820fecfe87d9c59e016e16e4, 0x006ae9 ] } , - BigNum { limbs: [ 0x3fcc8fbece3ff36832c0e6cf2383d0, 0xb5ed3c6c5168d7a5b570137a2c4e8f, 0x0030a3 ] } , - BigNum { limbs: [ 0x7dd77341301c0b97cd3f1830dc7c31, 0xf165ed312bdf5b942297f627abb6c4, 0x004349 ] } , - BigNum { limbs: [ 0x950b898168358f10a2ea8dd9532d0b, 0x3fa6331dc12669b74e8a5f93d55dda, 0x0043a1 ] } , - BigNum { limbs: [ 0x2898797e96266fef5d157126acd2f6, 0x67acf67fbc21c982897daa0e02a779, 0x00304c ] } , - BigNum { limbs: [ 0x87dd867c2846dfcc3b7f324100ce0b, 0xdd9346337dff0ec770162a016a73c0, 0x000934 ] } , - BigNum { limbs: [ 0x35c67c83d6151f33c480ccbeff31f6, 0xc9bfe369ff49247267f1dfa06d9193, 0x006ab8 ] } , - BigNum { limbs: [ 0xea948838d3a59e714fe5f9a319f08b, 0xd9b9e9bc0a45bca442260d0f5cc781, 0x0019ff ] } , - BigNum { limbs: [ 0xd30f7ac72ab6608eb01a055ce60f76, 0xcd993fe17302769595e1fc927b3dd1, 0x0059ed ] } , - BigNum { limbs: [ 0x42eaa33c21a6c3f8e855b7ca48e223, 0x2a883802cf8d5e7aadc120761b2157, 0x001430 ] } , - BigNum { limbs: [ 0x7ab95fc3dcb53b0717aa4735b71dde, 0x7ccaf19aadbad4bf2a46e92bbce3fc, 0x005fbd ] } , - BigNum { limbs: [ 0xea26e3e861e9a6f03205e4801f0670, 0x521b43809c6f413f091a0442fe3b0a, 0x0057e2 ] } , - BigNum { limbs: [ 0xd37d1f179c72580fcdfa1a7fe0f991, 0x5537e61ce0d8f1faceee055ed9ca48, 0x001c0b ] } , - BigNum { limbs: [ 0x888aca5f2cf18937eb9c08a6bad0a5, 0xb368c1bd3ec3d9a4667dbe97b7466b, 0x006c24 ] } , - BigNum { limbs: [ 0x351938a0d16a75c81463f659452f5c, 0xf3ea67e03e845995718a4b0a20bee8, 0x0007c8 ] } , - BigNum { limbs: [ 0xca463738abfdcceae6f7f2c97f6ddc, 0x37a8bdb046c980f6c206144132a757, 0x0053ca ] } , - BigNum { limbs: [ 0xf35dcbc7525e321519080c36809225, 0x6faa6bed367eb2431601f560a55dfb, 0x002023 ] } , - BigNum { limbs: [ 0x33e248bb1c34f3d3daea56ba7f16a9, 0xf0818c66f93206930810c8ebd7cf6f, 0x002c56 ] } , - BigNum { limbs: [ 0x89c1ba44e2270b2c2515a84580e958, 0xb6d19d3684162ca6cff740b60035e4, 0x004796 ] } , - BigNum { limbs: [ 0xfa342f2e54d35b3efaf03e1f4c23a5, 0x4ed170bf21bac2867ad9bd62474fc4, 0x00426e ] } , - BigNum { limbs: [ 0xc36fd3d1a988a3c1050fc0e0b3dc5c, 0x5881b8de5b8d70b35d2e4c3f90b58e, 0x00317f ] } , - BigNum { limbs: [ 0xee7464cc2693acc7f2b0c7f97d0157, 0xcd54ee73a12d5a25364bab696dd707, 0x0044f2 ] } , - BigNum { limbs: [ 0xcf2f9e33d7c852380d4f370682feaa, 0xd9fe3b29dc1ad914a1bc5e386a2e4b, 0x002efa ] } , - BigNum { limbs: [ 0x09bb3a7eed94b5ee1cb6e72b82c6d1, 0x2cf9a0599655f39dd358a82382f466, 0x002a3b ] } , - BigNum { limbs: [ 0xb3e8c88110c74911e34917d47d3930, 0x7a598943e6f23f9c04af617e5510ed, 0x0049b2 ] } , - BigNum { limbs: [ 0xded1798f001c83984bae2ba9e576ec, 0x56ee3af2ac38ca85bda4670d2c2307, 0x000975 ] } , - BigNum { limbs: [ 0xded28970fe3f7b67b451d3561a8915, 0x5064eeaad10f68b41a63a294abe24b, 0x006a78 ] } , - BigNum { limbs: [ 0x4dc75cbe09f501a0b24ec3dca1f2ce, 0x3112ac902e13ee36737d3869b66204, 0x0031e6 ] } , - BigNum { limbs: [ 0x6fdca641f466fd5f4db13b235e0d33, 0x76407d0d4f344503648ad13821a34f, 0x004207 ] } , - BigNum { limbs: [ 0x156add501a1c6937b11e308bf0abc8, 0x363da95355ccf81be9d7b571ce05b1, 0x003e29 ] } , - BigNum { limbs: [ 0xa83925afe43f95c84ee1ce740f5439, 0x7115804a277b3b1dee30543009ffa2, 0x0035c4 ] } , - BigNum { limbs: [ 0xb50c83fd1f5c0dcd6dcd1e8a6d2938, 0x647da03f2b3cd52856ab58c24f30f6, 0x0025ad ] } , - BigNum { limbs: [ 0x08977f02defff1329232e07592d6c9, 0x42d5895e520b5e11815cb0df88d45d, 0x004e40 ] } , - BigNum { limbs: [ 0xa73479f853c1eb8d14b4edec527670, 0x6dce2e5ec6630aa522414c846da37a, 0x001450 ] } , - BigNum { limbs: [ 0x166f8907aa9a1372eb4b1113ad8991, 0x3984fb3eb6e52894b5c6bd1d6a61d9, 0x005f9d ] } , - BigNum { limbs: [ 0xd15d8f0976f55e06f8ee5e9777964d, 0x95ea54b09d10987f4e2ce1b79388c1, 0x00413d ] } , - BigNum { limbs: [ 0xec4673f68766a0f90711a0688869b4, 0x1168d4ece0379aba89db27ea447c91, 0x0032b0 ] } , - BigNum { limbs: [ 0xb6afda9637ccb788a3d4bd18e66da6, 0x518219806ce2d8c3dd1ccbc1b529ec, 0x005581 ] } , - BigNum { limbs: [ 0x06f42869c68f47775c2b41e719925b, 0x55d1101d10655a75faeb3de022db67, 0x001e6c ] } , - BigNum { limbs: [ 0x991b24aa25db0e40861b826cace87f, 0x5ee79ca9436b6c1feffb1c216f70a6, 0x007149 ] } , - BigNum { limbs: [ 0x2488de55d880f0bf79e47c93531782, 0x486b8cf439dcc719e80ced806894ad, 0x0002a4 ] } , - BigNum { limbs: [ 0xfb90de5161d3aa0e4f9e5a6854836c, 0x7730aabeaf2707d3acaf7b7234937b, 0x000453 ] } , - BigNum { limbs: [ 0xc21324ae9c8854f1b061a497ab7c95, 0x30227edece212b662b588e2fa371d7, 0x006f9a ] } , - BigNum { limbs: [ 0x514cd4e04272c008e2fb108e12e22a, 0x80e1938cd09c9a3ae5427d8e18cb54, 0x000fe6 ] } , - BigNum { limbs: [ 0x6c572e1fbbe93ef71d04ee71ed1dd7, 0x26719610acab98fef2c58c13bf39ff, 0x006407 ] } , - BigNum { limbs: [ 0xad623bf3402bd57a9634b25637c216, 0x449c6a67b9ed93981376c9cd141418, 0x003869 ] } , - BigNum { limbs: [ 0x1041c70cbe30298569cb4ca9c83deb, 0x62b6bf35c35a9fa1c4913fd4c3f13b, 0x003b84 ] } , - BigNum { limbs: [ 0xc2dfa82313ad493a3e1a7aa260077d, 0xbce2aa1625f8acb62f7f17837a2577, 0x001c25 ] } , - BigNum { limbs: [ 0xfac45adceaaeb5c5c1e5845d9ff884, 0xea707f87574f8683a888f21e5ddfdb, 0x0057c7 ] } , - BigNum { limbs: [ 0x1db465016aecf09e6f74084c8e85a6, 0xf3dd5bee9b24bd298bcb9b46025a18, 0x006cbe ] } , - BigNum { limbs: [ 0x9fef9dfe936f0e61908bf6b3717a5b, 0xb375cdaee22376104c3c6e5bd5ab3b, 0x00072e ] } , - BigNum { limbs: [ 0x07ba425b194f3be868c32a5b94f4e5, 0x27101520c4b2e11d3393b8d009aa2c, 0x000eba ] } , - BigNum { limbs: [ 0xb5e9c0a4e50cc317973cd4a46b0b1c, 0x8043147cb895521ca47450d1ce5b27, 0x006533 ] } , - BigNum { limbs: [ 0xe5eebb2c61bfc76d8878e6c92c1964, 0x3ea3f96c0440f88cd53e4cee2d698d, 0x00507c ] } , - BigNum { limbs: [ 0xd7b547d39c9c379277871836d3e69d, 0x68af303179073aad02c9bcb3aa9bc5, 0x002371 ] } , - BigNum { limbs: [ 0xcaef2e1b379cbd65f21f6521b5ffe3, 0xb92efbacec2085f75cd0394e7e1493, 0x004c10 ] } , - BigNum { limbs: [ 0xf2b4d4e4c6bf419a0de099de4a001e, 0xee242df09127ad427b37d05359f0bf, 0x0027dc ] } , - BigNum { limbs: [ 0x5a90d8902f34ee2ffffbac2e990b32, 0x85e3496a299b1a2b4aad24d743792b, 0x0042ce ] } , - BigNum { limbs: [ 0x63132a6fcf2710d0000452d166f4cf, 0x216fe03353ad190e8d5ae4ca948c28, 0x00311f ] } , - BigNum { limbs: [ 0xb5b47bb725cda97ed4be029bd47ddd, 0x6e0bba848829e2af1b87209c0c0556, 0x0072af ] } , - BigNum { limbs: [ 0x07ef8748d88e55812b41fc642b8224, 0x39476f18f51e508abc80e905cbfffd, 0x00013e ] } , - BigNum { limbs: [ 0x2bafd544a199a3fe213ce3f40c2fa1, 0x01cdf2ff819eb174b778fe8e29f421, 0x00158b ] } , - BigNum { limbs: [ 0x91f42dbb5cc25b01dec31b0bf3d060, 0xa585369dfba981c5208f0b13ae1132, 0x005e62 ] } , - BigNum { limbs: [ 0xe7f96676286b47c433afe4d106b43d, 0x310d4f00fee0175ca29996af2afe4e, 0x004b52 ] } , - BigNum { limbs: [ 0xd5aa9c89d5f0b73bcc501a2ef94bc4, 0x7645da9c7e681bdd356e72f2ad0704, 0x00289b ] } , - BigNum { limbs: [ 0xca2c4fd11289ccc9f8090ae9106aaf, 0x72623392274a8b3b1472c4aac7b30c, 0x00586f ] } , - BigNum { limbs: [ 0xf377b32eebd2323607f6f416ef9552, 0x34f0f60b55fda7fec39544f7105246, 0x001b7e ] } , - BigNum { limbs: [ 0xddcb3aae11b4f6a83569dad6cd41e9, 0xa2a0e40b14ad3ac082ec036858c652, 0x0042cb ] } , - BigNum { limbs: [ 0xdfd8c851eca70857ca96242932be18, 0x04b24592689af879551c06397f3f00, 0x003122 ] } , - BigNum { limbs: [ 0xa633eb2bd252b8f338d1145bbf0bd5, 0x83fc39549f77c4b5af9e6def1f5a2e, 0x006953 ] } , - BigNum { limbs: [ 0x177017d42c09460cc72eeaa440f42c, 0x2356f048ddd06e8428699bb2b8ab25, 0x000a9a ] } , - BigNum { limbs: [ 0xcd97301b698d332256b524d8b89e8b, 0x754e6966f69b3071acf3d7805a5c41, 0x004f5b ] } , - BigNum { limbs: [ 0xf00cd2e494cecbdda94ada27476176, 0x3204c03686ad02c82b1432217da911, 0x002492 ] } , - BigNum { limbs: [ 0x85f998168289ca7f2423392adae5b9, 0xd7a8d381273c1b290213873ae175d7, 0x004fd7 ] } , - BigNum { limbs: [ 0x37aa6ae97bd23480dbdcc5d5251a48, 0xcfaa561c560c1810d5f48266f68f7c, 0x002415 ] } , - BigNum { limbs: [ 0x461c33c1a0f0b758be078a66b064a1, 0xe1a1f2cc7087dc66f4b808f364646b, 0x0037f4 ] } , - BigNum { limbs: [ 0x7787cf3e5d6b47a741f874994f9b60, 0xc5b136d10cc056d2e35000ae73a0e8, 0x003bf8 ] } , - BigNum { limbs: [ 0x10344b217e61bd034fe540f385a129, 0x7149c0f9efc012a497e72294fe0d1b, 0x000151 ] } , - BigNum { limbs: [ 0xad6fb7de7ffa41fcb01abe0c7a5ed8, 0x360968a38d8820954020e70cd9f838, 0x00729c ] } , - BigNum { limbs: [ 0xaa12dad03920b780c10f21710ecb97, 0x2c08ab0d493cb63fc62f04e5adaf87, 0x0038b5 ] } , - BigNum { limbs: [ 0x1391282fc53b477f3ef0dd8ef1346a, 0x7b4a7e90340b7cfa11d904bc2a55cc, 0x003b38 ] } , - BigNum { limbs: [ 0xc9785e4b1a161953a535350d483019, 0x62ff5bf8d281fb472b23db94f42d8e, 0x00420b ] } , - BigNum { limbs: [ 0xf42ba4b4e445e5ac5acac9f2b7cfe8, 0x4453cda4aac637f2ace42e0ce3d7c4, 0x0031e2 ] } , - BigNum { limbs: [ 0xf91bc8feb9b112808f505c45cb015c, 0x917dc58e99c00d615843aba8be67e6, 0x00109e ] } , - BigNum { limbs: [ 0xc4883a0144aaec7f70afa2ba34fea5, 0x15d5640ee38825d87fc45df9199d6c, 0x00634f ] } , - BigNum { limbs: [ 0xa0b2c8a4a7bc2e69a5eae3e0a37475, 0x723faf835210730c75680995aa200f, 0x006fb5 ] } , - BigNum { limbs: [ 0x1cf13a5b569fd0965a151b1f5c8b8c, 0x35137a1a2b37c02d62a0000c2de544, 0x000438 ] } , - BigNum { limbs: [ 0x5cf9ee56a0d33e35042724c5b436bb, 0xc0eebcb1f4772ef461072f445e70e7, 0x00080e ] } , - BigNum { limbs: [ 0x60aa14a95d88c0cafbd8da3a4bc946, 0xe6646ceb88d104457700da5d79946c, 0x006bde ] } , - BigNum { limbs: [ 0xe4ef4d5372d2492e81ced8221f9f8a, 0x1efd37f7f7e0769798bf3a5553980d, 0x0060b7 ] } , - BigNum { limbs: [ 0xd8b4b5ac8b89b5d17e3126dde06077, 0x8855f1a58567bca23f48cf4c846d45, 0x001336 ] } , - BigNum { limbs: [ 0xc6252dbf1b326892f4d9b3220826cd, 0xfeab6ca661472557041d93d5177942, 0x0013b1 ] } , - BigNum { limbs: [ 0xf77ed540e329966d0b264bddf7d934, 0xa8a7bcf71c010de2d3ea75ccc08c10, 0x00603b ] } , - BigNum { limbs: [ 0x9b851d08727d4269878537a09ab251, 0xe2b20f3384ec13ab948f2be0c4358d, 0x005366 ] } , - BigNum { limbs: [ 0x221ee5f78bdebc96787ac75f654db0, 0xc4a11a69f85c1f8e4378ddc113cfc6, 0x002086 ] } , - BigNum { limbs: [ 0x97fa6b553424bce61ba1af6202359a, 0x62790c9ec5709483ded871817d0f54, 0x0027cf ] } , - BigNum { limbs: [ 0x25a997aaca374219e45e4f9dfdca67, 0x44da1cfeb7d79eb5f92f98205af5ff, 0x004c1e ] } , - BigNum { limbs: [ 0xc62920e6caa9f8f2292b77ec6944b7, 0x17e308d1480c85fddad45ca496fc0c, 0x006ddc ] } , - BigNum { limbs: [ 0xf77ae21933b2060dd6d4871396bb4a, 0x8f7020cc353bad3bfd33acfd410946, 0x000611 ] } , - BigNum { limbs: [ 0xcc6493ffad656f51eae331d45e4567, 0x9478a2d01333d6a928516c6c492af2, 0x0048b3 ] } , - BigNum { limbs: [ 0xf13f6f0050f68fae151ccd2ba1ba9a, 0x12da86cd6a145c90afb69d358eda60, 0x002b3a ] } , - BigNum { limbs: [ 0xa4b9a7d9b44f7d6609134c8fd05714, 0xef733c2089cf6b37fc2d2bce9a49f6, 0x006304 ] } , - BigNum { limbs: [ 0x18ea5b264a0c8199f6ecb2702fa8ed, 0xb7dfed7cf378c801dbdaddd33dbb5d, 0x0010e8 ] } , - BigNum { limbs: [ 0x01287aa8e28eee99c2146c444e519a, 0xaa852cf69d9898ecff7fc2e04b67ab, 0x0025ea ] } , - BigNum { limbs: [ 0xbc7b88571bcd10663deb92bbb1ae67, 0xfccdfca6dfaf9a4cd88846c18c9da8, 0x004e02 ] } , - BigNum { limbs: [ 0x6c05295b5fb41cb8d6b4ecef99c9e8, 0x71a09ca75e9ecf0144808af6112ecb, 0x001783 ] } , - BigNum { limbs: [ 0x519ed9a49ea7e247294b1210663619, 0x35b28cf61ea9643893877eabc6d688, 0x005c6a ] } , - BigNum { limbs: [ 0x0dab4c4a2a63ad2369ef864781d95e, 0x2f7c6017a94f9b01da56279eb5d9e5, 0x003cd1 ] } , - BigNum { limbs: [ 0xaff8b6b5d3f851dc961078b87e26a3, 0x77d6c985d3f89837fdb1e203222b6e, 0x00371c ] } , - BigNum { limbs: [ 0xfbbf05605e22049088086fe345cf99, 0x9962d49e98f824a86f10b7e39f2849, 0x004955 ] } , - BigNum { limbs: [ 0xc1e4fd9fa039fa6f77f78f1cba3068, 0x0df054fee4500e9168f751be38dd09, 0x002a98 ] } , - BigNum { limbs: [ 0x6ea85e98587c4a13068409bc82e244, 0x73eb7bcba57289a774bf888a996f9c, 0x0052c7 ] } , - BigNum { limbs: [ 0x4efba467a5dfb4ecf97bf5437d1dbd, 0x3367add1d7d5a992634881173e95b7, 0x002126 ] } , - BigNum { limbs: [ 0x15a25c56a25116ef4661cf681ac890, 0x122395c63dc1d8108a1f42d3561429, 0x000157 ] } , - BigNum { limbs: [ 0xa801a6a95c0ae810b99e2f97e53771, 0x952f93d73f865b294de8c6ce81f12a, 0x007296 ] } , - BigNum { limbs: [ 0xfa85c091fab993f2d6a61c264bba11, 0xc9de3a5deb69cc970bd5f2e6c815a4, 0x005469 ] } , - BigNum { limbs: [ 0xc31e426e03a26b0d2959e2d9b445f0, 0xdd74ef3f91de66a2cc3216bb0fefae, 0x001f83 ] } , - BigNum { limbs: [ 0x9cf7f79590474d5947ce0ad319cdc7, 0xe9425e38ffcc78b5a5b93d41590f4b, 0x0054d9 ] } , - BigNum { limbs: [ 0x20ac0b6a6e14b1a6b831f42ce6323a, 0xbe10cb647d7bba84324ecc607ef608, 0x001f13 ] } , - BigNum { limbs: [ 0x059903e0524868e55b60810a7f877b, 0xe6dafe0adda151ded54695836adc05, 0x006bea ] } , - BigNum { limbs: [ 0xb80aff1fac13961aa49f7df5807886, 0xc0782b929fa6e15b02c1741e6d294e, 0x000802 ] } , - BigNum { limbs: [ 0xe617879a72d893b66d13df0b850d61, 0x14ed7cb17771b59db72419438d24fd, 0x002e07 ] } , - BigNum { limbs: [ 0xd78c7b658b836b4992ec1ff47af2a0, 0x9265acec05d67d9c20e3f05e4ae055, 0x0045e6 ] } , - BigNum { limbs: [ 0xe4824fbac5f8e7a21ac44df3477076, 0x4574e3442ee136aebb2396bd4f09d5, 0x0062b3 ] } , - BigNum { limbs: [ 0xd921b3453863175de53bb10cb88f8b, 0x61de46594e66fc8b1ce472e488fb7d, 0x00113a ] } , - BigNum { limbs: [ 0xb8ecee197d9af0e3712b897f88b4d1, 0x00c45b561179be483f87c82a93f63f, 0x001a16 ] } , - BigNum { limbs: [ 0x04b714e680c10e1c8ed47580774b30, 0xa68ece476bce74f198804177440f14, 0x0059d7 ] } , - BigNum { limbs: [ 0x94ef84e6b7b995a1041f9488f68dae, 0x2ec1fc6138bd21f6d173aa046fe4ca, 0x0026c6 ] } , - BigNum { limbs: [ 0x28b47e1946a2695efbe06a77097253, 0x78912d3c448b114306945f9d682089, 0x004d27 ] } , - BigNum { limbs: [ 0x6d56a1d006b6372fac4dd82e55e945, 0x85187afb65a3c87c53ce3f7a76569b, 0x004129 ] } , - BigNum { limbs: [ 0x504d612ff7a5c7d053b226d1aa16bc, 0x223aaea217a46abd8439ca2761aeb8, 0x0032c4 ] } , - BigNum { limbs: [ 0x63ef45ad4908e6f172f93272aef9c6, 0xa5933f9d639627bceabba9c13bcb9a, 0x0011b5 ] } , - BigNum { limbs: [ 0x59b4bd52b553180e8d06cc8d51063b, 0x01bfea0019b20b7ced4c5fe09c39b9, 0x006238 ] } , - BigNum { limbs: [ 0x435d45df81fc513e24cf88d26d14bd, 0x4e82e0a4d4c5a66c4465ffe15f6be2, 0x00628f ] } , - BigNum { limbs: [ 0x7a46bd207c5fadc1db30762d92eb44, 0x58d048f8a8828ccd93a209c0789971, 0x00115e ] } , - BigNum { limbs: [ 0x5755762ed0dc2e1fda0410c4e4d674, 0x48feadc8d91349f2892deb1068f424, 0x0025ff ] } , - BigNum { limbs: [ 0x664e8cd12d7fd0e025fbee3b1b298d, 0x5e547bd4a434e9474eda1e916f112f, 0x004dee ] } , - BigNum { limbs: [ 0x976a04577e50444bc5e118fb425b35, 0xe8512409c3857773b21c8454d0d6c7, 0x001273 ] } , - BigNum { limbs: [ 0x2639fea8800bbab43a1ee604bda4cc, 0xbf020593b9c2bbc625eb854d072e8c, 0x006179 ] } , - BigNum { limbs: [ 0x4fb65d28974f6792018eab205ac3e1, 0x8d26543a3a60f8147ec78eec0ecf24, 0x006da6 ] } , - BigNum { limbs: [ 0x6deda5d7670c976dfe7153dfa53c20, 0x1a2cd56342e73b2559407ab5c9362f, 0x000647 ] } , - BigNum { limbs: [ 0x98fe6b6879e3c225a29005376888d7, 0x028e0bf569fd1c2b22c48fbf68ae2d, 0x000ebb ] } , - BigNum { limbs: [ 0x24a5979784783cda5d6ff9c897772a, 0xa4c51da8134b170eb54379e26f5726, 0x006532 ] } , - BigNum { limbs: [ 0x5c491d95facfe2393b548d4204a51f, 0xc40edecaced7de301cf8986c431565, 0x0020c0 ] } , - BigNum { limbs: [ 0x615ae56a038c1cc6c4ab71bdfb5ae2, 0xe3444ad2ae705509bb0f713594efee, 0x00532c ] } , - BigNum { limbs: [ 0xad139cafdaa772d6e616c9c1421c9e, 0x0a3d1e68f810578306d723b212c53f, 0x00348b ] } , - BigNum { limbs: [ 0x1090665023b48c2919e9353ebde363, 0x9d160b348537dbb6d130e5efc54014, 0x003f62 ] } , - BigNum { limbs: [ 0x700a79da2ac3c6085f76ac583f79a0, 0x140bc42b07da6b95d0e40b88b4ff01, 0x002e99 ] } , - BigNum { limbs: [ 0x4d998925d39838f7a08952a7c08661, 0x93476572756dc7a40723fe19230652, 0x004554 ] } , - BigNum { limbs: [ 0x81818041738bf1e847f9433776feb1, 0x0ebca8a36a05a5b6c8dde49bad804f, 0x00290a ] } , - BigNum { limbs: [ 0x3c2282be8ad00d17b806bbc8890150, 0x989680fa13428d830f2a25062a8504, 0x004ae3 ] } , - BigNum { limbs: [ 0x309e790e65064e32306af340c1db2d, 0x686764a69972d87fb06401dd4ca805, 0x000bd0 ] } , - BigNum { limbs: [ 0x8d0589f19955b0cdcf950bbf3e24d4, 0x3eebc4f6e3d55aba27a407c48b5d4e, 0x00681d ] } , - BigNum { limbs: [ 0xde5b52cfa56e5ef9702d02ce6b3081, 0xdded4361edc32293b4da09077a31d3, 0x001395 ] } , - BigNum { limbs: [ 0xdf48b03058eda0068fd2fc3194cf80, 0xc965e63b8f8510a6232e009a5dd37f, 0x006057 ] } , - BigNum { limbs: [ 0x3a7a3a30e164ebf89184cfc722bd9f, 0x110afa3cec1ecf530b2c40345efea5, 0x000c0f ] } , - BigNum { limbs: [ 0x8329c8cf1cf713076e7b2f38dd4262, 0x96482f60912963e6ccdbc96d7906ae, 0x0067de ] } , - BigNum { limbs: [ 0x82c7aa2f50c6718c98f99408577a27, 0x59b976e328f1826addffd2285db4e5, 0x002059 ] } , - BigNum { limbs: [ 0x3adc58d0ad958d7367066af7a885da, 0x4d99b2ba5456b0cefa0837797a506e, 0x005394 ] } , - BigNum { limbs: [ 0x8fd7eef9244cb298fb4636446409e3, 0x01c7ef28e18206ab7288252332b360, 0x004783 ] } , - BigNum { limbs: [ 0x2dcc1406da0f4c6704b9c8bb9bf61e, 0xa58b3a749bc62c8e657fe47ea551f3, 0x002c6a ] } , - BigNum { limbs: [ 0x32aeceebd86026c4febf0b91c6806d, 0xa560942c6498c9107c1635743781d4, 0x0012a7 ] } , - BigNum { limbs: [ 0x8af5341425fbd83b0140f36e397f94, 0x01f2957118af6a295bf1d42da0837f, 0x006146 ] } , - BigNum { limbs: [ 0x1d7f2bc75be4ac1b670bcfcf1f849a, 0x509f02a10d5b316a6fe11176b0f9a8, 0x003c30 ] } , - BigNum { limbs: [ 0xa024d738a27752e498f42f30e07b67, 0x56b426fc6fed01cf6826f82b270bab, 0x0037bd ] } , - BigNum { limbs: [ 0xafa9321aff17c9004c5e11eb9505f9, 0x07f5cae1a195084571c7ab7696e4c1, 0x002e99 ] } , - BigNum { limbs: [ 0x0dfad0e4ff4435ffb3a1ed146afa08, 0x9f5d5ebbdbb32af466405e2b412092, 0x004554 ] } , - BigNum { limbs: [ 0x292d24283ac6fa129eee3f986b8455, 0x05c46d5e39f3855c0d1a0fb582e60a, 0x003852 ] } , - BigNum { limbs: [ 0x9476ded7c39504ed6111bf67947bac, 0xa18ebc3f4354adddcaedf9ec551f49, 0x003b9b ] } , - BigNum { limbs: [ 0xff6d043f13d90de781a5b5ae382857, 0xc1f34621fa6d9a2287d5f9220e2fb7, 0x003caa ] } , - BigNum { limbs: [ 0xbe36fec0ea82f1187e5a4951c7d7aa, 0xe55fe37b82da99175032107fc9d59b, 0x003742 ] } , - BigNum { limbs: [ 0x36a4cdd6c52bf66dea2db07aecfb2c, 0xb07666086a21dc850dde1ba420a978, 0x00081f ] } , - BigNum { limbs: [ 0x86ff35293930089215d24e851304d5, 0xf6dcc395132656b4ca29edfdb75bdb, 0x006bcd ] } , - BigNum { limbs: [ 0xcff89970e84a2fd43576dcf6601f6a, 0x95fd98daca15ee47fe04bc7132137e, 0x0020d0 ] } , - BigNum { limbs: [ 0xedab698f1611cf2bca8922099fe097, 0x115590c2b33244f1da034d30a5f1d4, 0x00531d ] } , - BigNum { limbs: [ 0x4bf510cf7c7c8c9e768704f04e2b80, 0x2d1b75a1ffc63094c7611bdd129b82, 0x002527 ] } , - BigNum { limbs: [ 0x71aef23081df72618978fa0fb1d481, 0x7a37b3fb7d8202a510a6edc4c569d1, 0x004ec6 ] } , - BigNum { limbs: [ 0xc766da81eb5f3a10cba8cca132a4af, 0x9895da559f7bcc1f97abceafe390c3, 0x002aef ] } , - BigNum { limbs: [ 0xf63d287e12fcc4ef3457325ecd5b52, 0x0ebd4f47ddcc671a405c3af1f4748f, 0x0048fe ] } , - BigNum { limbs: [ 0x77ccfd0e68f45d81c3ad1e35f68aa0, 0x04249a2841514c8df7a0b2153271d0, 0x007214 ] } , - BigNum { limbs: [ 0x45d705f19567a17e3c52e0ca097561, 0xa32e8f753bf6e6abe067578ca59383, 0x0001d9 ] } , - BigNum { limbs: [ 0xe42b3486654278312cda878efea016, 0x69b4cb4cf4fafbed3003ef8c3a813e, 0x001cc7 ] } , - BigNum { limbs: [ 0xd978ce79991986ced3257771015feb, 0x3d9e5e50884d374ca8041a159d8414, 0x005726 ] } , - BigNum { limbs: [ 0xdc08ba88d180d93188d4192bcfb84d, 0xa6db496e5b977354760383a269ab6e, 0x001e05 ] } , - BigNum { limbs: [ 0xe19b48772cdb25ce772be5d43047b4, 0x0077e02f21b0bfe5620485ff6e59e4, 0x0055e8 ] } , - BigNum { limbs: [ 0x9617aa98504fbcdf57909bea0a2da4, 0x5272602dee9b726a2311ddae84a49a, 0x005643 ] } , - BigNum { limbs: [ 0x278c5867ae0c4220a86f6315f5d25d, 0x54e0c96f8eacc0cfb4f62bf35360b9, 0x001daa ] } , - BigNum { limbs: [ 0x74a072f75e1eafc6b7ae4cbe9918df, 0x0ca1fa1ca2ce7bd130433636e1f719, 0x003963 ] } , - BigNum { limbs: [ 0x49039008a03d4f394851b24166e722, 0x9ab12f80da79b768a7c4d36af60e3a, 0x003a8a ] } , - BigNum { limbs: [ 0x0e4544b75517c16711866509b0117e, 0x8e613f107412f75f355eb5219f4d29, 0x005860 ] } , - BigNum { limbs: [ 0xaf5ebe48a9443d98ee7999f64fee83, 0x18f1ea8d09353bdaa2a9548038b82a, 0x001b8d ] } , - BigNum { limbs: [ 0x6b2362c6e3206af330c75237fd3287, 0xcf9dbeeb7a113d432c185eaed41723, 0x003918 ] } , - BigNum { limbs: [ 0x5280a0391b3b940ccf38acc802cd7a, 0xd7b56ab20336f5f6abefaaf303ee30, 0x003ad4 ] } , - BigNum { limbs: [ 0xfe6141c56e87705d1a4de431b14902, 0xb6f79972f279436a9109526def19bc, 0x000611 ] } , - BigNum { limbs: [ 0xbf42c13a8fd48ea2e5b21ace4eb6ff, 0xf05b902a8aceefcf46feb733e8eb96, 0x006ddb ] } , - BigNum { limbs: [ 0x771ac41ed853a25780bbfe03ec55d5, 0xa563d5b51c810b94291b65dd88b855, 0x000bf6 ] } , - BigNum { limbs: [ 0x46893ee126085ca87f4400fc13aa2c, 0x01ef53e860c727a5aeeca3c44f4cfe, 0x0067f7 ] } , - BigNum { limbs: [ 0x3ef3285a12e45cc86a0ebf672f9539, 0x73a1f676d8115d3e5f439eda2e7ab2, 0x001b27 ] } , - BigNum { limbs: [ 0x7eb0daa5eb77a23795f13f98d06ac8, 0x33b13326a536d5fb78c46ac7a98aa1, 0x0058c6 ] } , - BigNum { limbs: [ 0x078bb4a345264200b56e295c87eb31, 0x8d23be8445a567589623fdf89c7c4c, 0x002c63 ] } , - BigNum { limbs: [ 0xb6184e5cb935bcff4a91d5a37814d0, 0x1a2f6b1937a2cbe141e40ba93b8907, 0x00478a ] } , - BigNum { limbs: [ 0xc428f8a2654518b52166440df9b688, 0x3d89e044cc6c8191cc5fd4eb468731, 0x002ec4 ] } , - BigNum { limbs: [ 0xf97b0a5d9916e64ade99baf2064979, 0x69c94958b0dbb1a80ba834b6917e21, 0x004529 ] } , - BigNum { limbs: [ 0x356a0242c49b8fb3212df6a0e2db64, 0x410905166866b24236a3c7e932fe37, 0x004cde ] } , - BigNum { limbs: [ 0x883a00bd39c06f4cded2085f1d249d, 0x664a248714e180f7a16441b8a5071c, 0x00270f ] } , - BigNum { limbs: [ 0x4a92da52332af0b26f1f6b19b802a2, 0x903bb1db99afcd62607b6d2f5a7aed, 0x005ee5 ] } , - BigNum { limbs: [ 0x731128adcb310e4d90e093e647fd5f, 0x171777c1e39865d7778c9c727d8a66, 0x001508 ] } , - BigNum { limbs: [ 0x34b261df65292e9ebf6443bba0f2ed, 0x19bd16418157f24ce6e76cd2d04b7e, 0x0060b4 ] } , - BigNum { limbs: [ 0x88f1a1209932d061409bbb445f0d14, 0x8d96135bfbf040ecf1209ccf07b9d5, 0x001339 ] } , - BigNum { limbs: [ 0x3654f0611097c6b6a28c1f1914c201, 0x62bf4cb52ef4097fce3915c694a5c5, 0x004e30 ] } , - BigNum { limbs: [ 0x874f129eedc438495d73dfe6eb3e00, 0x4493dce84e5429ba09cef3db435f8e, 0x0025bd ] } , - BigNum { limbs: [ 0xa053141f7d3d7cf9065e7bcadcfc19, 0xb655d0e63d59e74dac8f8f64831f8c, 0x006be1 ] } , - BigNum { limbs: [ 0x1d50eee0811e8206f9a183352303e8, 0xf0fd58b73fee4bec2b787a3d54e5c7, 0x00080b ] } , - BigNum { limbs: [ 0x1211542079c63a04b57a388ce6c261, 0x7bac5f90a18bb38f7e83bd6db07800, 0x00699e ] } , - BigNum { limbs: [ 0xab92aedf8495c4fb4a85c673193da0, 0x2ba6ca0cdbbc7faa59844c34278d53, 0x000a4f ] } , - BigNum { limbs: [ 0x0ee0c64f8b7ac1ff7ba2024a37b7bb, 0x93e4697b1d9ce0c431b6db18076ff9, 0x000834 ] } , - BigNum { limbs: [ 0xaec33cb072e13d00845dfcb5c84846, 0x136ec0225fab5275a6512e89d0955a, 0x006bb9 ] } , - BigNum { limbs: [ 0x01fa182468ba7c595e445abe442dca, 0x879144d0fcd2fcc9670838442647e3, 0x0051e8 ] } , - BigNum { limbs: [ 0xbba9eadb95a182a6a1bba441bbd237, 0x1fc1e4cc8075367070ffd15db1bd70, 0x002205 ] } , - BigNum { limbs: [ 0x9afd4618c5e1bc80afccf22a6f8a52, 0x1540ac49fb06bbc6c6b9a9fc918afb, 0x005101 ] } , - BigNum { limbs: [ 0x22a6bce7387a427f50330cd59075af, 0x92127d5382417773114e5fa5467a58, 0x0022ec ] } , - BigNum { limbs: [ 0x1ee525b1ec67d1c5c9581135a7ab68, 0x30ea2e1c440d8b23d1f54cdf1fae7b, 0x00349e ] } , - BigNum { limbs: [ 0x9ebedd4e11f42d3a36a7edca585499, 0x7668fb81393aa8160612bcc2b856d8, 0x003f4f ] } , - BigNum { limbs: [ 0xae2ac8e1522fb525497b14298a9c76, 0x29bc131a89602fe31e0bda03eafb9b, 0x005ebe ] } , - BigNum { limbs: [ 0x0f793a1eac2c49dab684ead675638b, 0x7d971682f3e80356b9fc2f9ded09b8, 0x00152f ] } , - BigNum { limbs: [ 0x5b2f702a43d37b7ab8dac27f3e254c, 0x42d5471bc24662632562d7c80a5369, 0x0064a9 ] } , - BigNum { limbs: [ 0x627492d5ba88838547253c80c1dab5, 0x647de281bb01d0d6b2a531d9cdb1ea, 0x000f44 ] } , - BigNum { limbs: [ 0x77c91e81814f8b58eef8ea01b32225, 0xbbcf1c263cfc2d486a35143271ee7d, 0x003ea3 ] } , - BigNum { limbs: [ 0x45dae47e7d0c73a7110714fe4cdddc, 0xeb840d77404c05f16dd2f56f6616d6, 0x003549 ] } , - BigNum { limbs: [ 0x7e33d54601da6d389208e6356979ab, 0xc09b9fa4dfb218819428c8056d1d39, 0x0028c1 ] } , - BigNum { limbs: [ 0x3f702db9fc8191c76df718ca968656, 0xe6b789f89d961ab843df419c6ae81a, 0x004b2b ] } , - BigNum { limbs: [ 0xa5905736c46ea4c5475b119e356265, 0xd098fc0f8207b6faf0e0d74f7a1025, 0x00690b ] } , - BigNum { limbs: [ 0x1813abc939ed5a3ab8a4ed61ca9d9c, 0xd6ba2d8dfb407c3ee72732525df52e, 0x000ae1 ] } , - BigNum { limbs: [ 0xc3720c7bf19f0c42aa886429513423, 0xef4adbfcd69d77f7f625dacb9ddb3b, 0x0045eb ] } , - BigNum { limbs: [ 0xfa31f6840cbcf2bd55779ad6aecbde, 0xb8084da0a6aabb41e1e22ed63a2a17, 0x002e01 ] } , - BigNum { limbs: [ 0xd1b9212b65bf214e921640c47a0a45, 0xd6554ec4fbad86e639ebf267f538dd, 0x00278f ] } , - BigNum { limbs: [ 0xebeae1d4989cddb16de9be3b85f5bc, 0xd0fddad8819aac539e1c1739e2cc75, 0x004c5d ] } , - BigNum { limbs: [ 0x0c31c44ac745f527c512ff22e85c3a, 0x2e4cd97518258238f206e24c0b1c2b, 0x002cbc ] } , - BigNum { limbs: [ 0xb1723eb5371609d83aecffdd17a3c7, 0x790650286522b100e6012755cce928, 0x004731 ] } , - BigNum { limbs: [ 0x9989268429206117d51008e47afac8, 0x2c5a3a4f9c6aeb6b7a036c657da412, 0x001856 ] } , - BigNum { limbs: [ 0x241adc7bd53b9de82aeff61b850539, 0x7af8ef4de0dd47ce5e049d3c5a6141, 0x005b97 ] } , - BigNum { limbs: [ 0x3c1bffa488ae4c91a9d99c561db4f3, 0x5df95918a808d3a4931256f1413ddf, 0x002162 ] } , - BigNum { limbs: [ 0x8188035b75adb26e562662a9e24b0e, 0x4959d084d53f5f9544f5b2b096c774, 0x00528b ] } , - BigNum { limbs: [ 0xfb570516b5e5cefc96ef08c768f7bb, 0x202424aab720e62747593b3d0256dd, 0x004ae0 ] } , - BigNum { limbs: [ 0xc24cfde9487630036910f638970846, 0x872f04f2c6274d1290aece64d5ae75, 0x00290d ] } , - BigNum { limbs: [ 0x6d477b956af945571da68e63a7c767, 0xa9008ab58c52c373a0f84872096ba6, 0x005eed ] } , - BigNum { limbs: [ 0x505c876a9362b9a8e259709c58389a, 0xfe529ee7f0f56fc6370fc12fce99ad, 0x0014ff ] } , - BigNum { limbs: [ 0xc5dd2ae9e83d223d69281ae1af9955, 0x35a347e2e5a7d5bf621e6cdc1ff837, 0x00668d ] } , - BigNum { limbs: [ 0xf7c6d816161edcc296d7e41e5066ac, 0x71afe1ba97a05d7a75e99cc5b80d1b, 0x000d60 ] } , - BigNum { limbs: [ 0xba0324468f865128736875d438f2d6, 0x73380eda1d3ba312905b71fb212d57, 0x001dae ] } , - BigNum { limbs: [ 0x03a0deb96ed5add78c97892bc70d2b, 0x341b1ac3600c902747ac97a6b6d7fc, 0x00563f ] } , - BigNum { limbs: [ 0x5e326a7b6d1553fd517bb125e87aa6, 0xbdab877991b02c465a03f89c87977d, 0x000c40 ] } , - BigNum { limbs: [ 0x5f7198849146ab02ae844dda17855b, 0xe9a7a223eb9806f37e041105506dd6, 0x0067ac ] } , - BigNum { limbs: [ 0x5b47aa7fc702df407a3035875afd49, 0xa961d2308993234e4002f9a199a5c3, 0x004f00 ] } , - BigNum { limbs: [ 0x625c588037591fbf85cfc978a502b8, 0xfdf1576cf3b50feb980510003e5f90, 0x0024ec ] } , - BigNum { limbs: [ 0xfb9dc693cfbdcbd6d7b660f42ebdf7, 0xe8ad2baf59d5de4ac442c8ffc9599c, 0x004111 ] } , - BigNum { limbs: [ 0xc2063c6c2e9e332928499e0bd1420a, 0xbea5fdee237254ef13c540a20eabb6, 0x0032db ] } , - BigNum { limbs: [ 0x14d71f3d115d480b10922f5983b2e8, 0x80c524bd040ea27554f6cda2dd8143, 0x0046bf ] } , - BigNum { limbs: [ 0xa8cce3c2ecfeb6f4ef6dcfa67c4d19, 0x268e04e0793990c483113bfefa8410, 0x002d2e ] } , - BigNum { limbs: [ 0x8a4ccd5a8ffdaea479ce0adf737d2c, 0x281fc9738b6acf6a3c9e3de03c4b9f, 0x0057b4 ] } , - BigNum { limbs: [ 0x335735a56e5e505b8631f4208c82d5, 0x7f336029f1dd63cf9b69cbc19bb9b4, 0x001c39 ] } , - BigNum { limbs: [ 0xfa9da9aea7b7a807f3949ff7497ac4, 0x94e273230bc82fa52c43468bc2cb46, 0x0067d1 ] } , - BigNum { limbs: [ 0xc306595156a456f80c6b5f08b6853d, 0x1270b67a71800394abc4c316153a0c, 0x000c1c ] } , - BigNum { limbs: [ 0xf90efcf7889498c0fa84462b5be3f9, 0x506cf5b4ad5c5dfa071dbcb2f776a7, 0x004583 ] } , - BigNum { limbs: [ 0xc495060875c7663f057bb8d4a41c08, 0x56e633e8cfebd53fd0ea4ceee08eab, 0x002e6a ] } , - BigNum { limbs: [ 0x4bd6bd4ae9ab1cba6dbc0d400aabca, 0x020cfd306c1de084a51cd4d6f9f64b, 0x00678e ] } , - BigNum { limbs: [ 0x71cd45b514b0e2459243f1bff55437, 0xa5462c6d112a52b532eb34cade0f08, 0x000c5f ] } , - BigNum { limbs: [ 0xadc30be0afecd9400809b932c038e7, 0x6d07fcafce4a9a767be86caf30f381, 0x0063a0 ] } , - BigNum { limbs: [ 0x0fe0f71f4e6f25bff7f645cd3fc71a, 0x3a4b2cedaefd98c35c1f9cf2a711d2, 0x00104d ] } , - BigNum { limbs: [ 0xfe8d47e5eb3bac52f1982243ace47a, 0xd6124eee8fcbbcf665d106968cdd39, 0x0039da ] } , - BigNum { limbs: [ 0xbf16bb1a132052ad0e67dcbc531b87, 0xd140daaeed7c76437237030b4b2819, 0x003a12 ] } , - BigNum { limbs: [ 0x8b5ce291f218c9dd74958e6cca1c43, 0x7e5763a2583ce605c2850effefc8c8, 0x00144b ] } , - BigNum { limbs: [ 0x3247206e0c4335228b6a709335e3be, 0x28fbc5fb250b4d341582faa1e83c8b, 0x005fa2 ] } , - BigNum { limbs: [ 0x2e5e696f842cffe144608f74eaac1b, 0x8fb393a3ab78c209cb769b65fa1ebe, 0x0030f6 ] } , - BigNum { limbs: [ 0x8f4599907a2eff1ebb9f6f8b1553e6, 0x179f95f9d1cf71300c916e3bdde695, 0x0042f7 ] } , - BigNum { limbs: [ 0xa5b8d3dda353e8a443e6dbbea71c3d, 0x4da2acaeebdd573de9e05c005ca05c, 0x003e26 ] } , - BigNum { limbs: [ 0x17eb2f225b08165bbc19234158e3c4, 0x59b07cee916adbfbee27ada17b64f7, 0x0035c7 ] } , - BigNum { limbs: [ 0x78b65b0a65311a96bd8776dcb3a3de, 0x40eea7b1a760a3c8fb7b4ca1b1ceb3, 0x000c7f ] } , - BigNum { limbs: [ 0x44eda7f5992ae469427888234c5c23, 0x666481ebd5e78f70dc8cbd002636a0, 0x00676e ] } , - BigNum { limbs: [ 0xdc89a891d9f52411e9aa243ff64fb7, 0xf8687719af42f436be5744d2fd476f, 0x0005fd ] } , - BigNum { limbs: [ 0xe11a5a6e2466daee1655dac009b04a, 0xaeeab283ce053f0319b0c4cedabde3, 0x006def ] } , - BigNum { limbs: [ 0xa76a4d12a65a59e004a8616ad310f0, 0xdcd7f3e6f15ec6c4f5b601e21ff0d9, 0x0016c4 ] } , - BigNum { limbs: [ 0x1639b5ed5801a51ffb579d952cef11, 0xca7b35b68be96c74e25207bfb8147a, 0x005d28 ] } , - BigNum { limbs: [ 0x0467bb084c964790407b4446e144b0, 0x40ff209302f1e88adcdbbfcc7732aa, 0x004269 ] } , - BigNum { limbs: [ 0xb93c47f7b1c5b76fbf84bab91ebb51, 0x6654090a7a564aaefb2c49d560d2a9, 0x003184 ] } , - BigNum { limbs: [ 0x7f89984e1f494bd58aa66bb4834fd9, 0xf85ceb431b3e231aa97f1b81adbf24, 0x000a1c ] } , - BigNum { limbs: [ 0x3e1a6ab1df12b32a7559934b7cb028, 0xaef63e5a620a101f2e88ee202a462f, 0x0069d0 ] } , - BigNum { limbs: [ 0x6e71b10378df567095602a91bfeb57, 0x333f31a2b277845fe7e2ace6ee7a68, 0x0068bf ] } , - BigNum { limbs: [ 0x4f3251fc857ca88f6a9fd46e4014aa, 0x7413f7facad0aed9f0255cbae98aeb, 0x000b2e ] } , - BigNum { limbs: [ 0x72e12d4ef7b1bc1d048d5e4c8f92d5, 0x1919c9e42d245edfec475cd95fd90c, 0x0006dd ] } , - BigNum { limbs: [ 0x4ac2d5b106aa42e2fb72a0b3706d2c, 0x8e395fb95023d459ebc0acc8782c47, 0x006d10 ] } , - BigNum { limbs: [ 0xa6caeec0019cce89f8a28c04b02908, 0x4254d49cb10f9468da4449c73ffa3f, 0x002507 ] } , - BigNum { limbs: [ 0x16d9143ffcbf3076075d72fb4fd6f9, 0x64fe5500cc389ed0fdc3bfda980b14, 0x004ee6 ] } , - BigNum { limbs: [ 0x7678b48bb1db8fb4bd8e160157197c, 0x9af535ae0e253b310b396831542a11, 0x004279 ] } , - BigNum { limbs: [ 0x472b4e744c806f4b4271e8fea8e685, 0x0c5df3ef6f22f808cccea17083db42, 0x003174 ] } , - BigNum { limbs: [ 0xc281a93aef62e96137a691be2497f9, 0xd3cb28a3b5a16588627f08e73b1b20, 0x004bab ] } , - BigNum { limbs: [ 0xfb2259c50ef9159ec8596d41db6808, 0xd38800f9c7a6cdb1758900ba9cea32, 0x002841 ] } , - BigNum { limbs: [ 0xf4c10059af274ee2cc0434baf3e2fb, 0xd18546fdbca8764eb4562d580122db, 0x001aec ] } , - BigNum { limbs: [ 0xc8e302a64f34b01d33fbca450c1d06, 0xd5cde29fc09fbceb23b1dc49d6e277, 0x005900 ] } , - BigNum { limbs: [ 0x2d6fb35a5cecb4467864c0e822f4f6, 0x40d594cfa384a9b31eb7a0574d1a1c, 0x001a4b ] } , - BigNum { limbs: [ 0x90344fa5a16f4ab9879b3e17dd0b0b, 0x667d94cdd9c38986b950694a8aeb37, 0x0059a2 ] } , - BigNum { limbs: [ 0x0048cde3a189929b8c6581b7a57bb6, 0xc9c6a859b493283d27539aa3079e7e, 0x001a9f ] } , - BigNum { limbs: [ 0xbd5b351c5cd26c64739a7d485a844b, 0xdd8c8143c8b50afcb0b46efed066d5, 0x00594d ] } , - BigNum { limbs: [ 0x901f632ec9e7867e4f0728f664f220, 0x29d3d7d78713ff0e7a5f644cc3151a, 0x00256e ] } , - BigNum { limbs: [ 0x2d849fd134747881b0f8d6099b0de1, 0x7d7f51c5f634342b5da8a55514f039, 0x004e7f ] } , - BigNum { limbs: [ 0x8f4de46dd12913aa9ae8a21f3d3b2a, 0xc598ec5b2425c7cd9306078735756a, 0x006528 ] } , - BigNum { limbs: [ 0x2e561e922d32eb5565175ce0c2c4d7, 0xe1ba3d4259226b6c4502021aa28fe9, 0x000ec4 ] } , - BigNum { limbs: [ 0x13ba7565944c5b1543c85450272199, 0xf3850c2463a95f9cce23d45411857f, 0x00207f ] } , - BigNum { limbs: [ 0xa9e98d9a6a0fa3eabc37aaafd8de68, 0xb3ce1d79199ed39d09e4354dc67fd4, 0x00536d ] } , - BigNum { limbs: [ 0x46eb57ea4ac470f442b205efee0514, 0x43f88c427dfaf9484c246f79adca12, 0x00333c ] } , - BigNum { limbs: [ 0x76b8ab15b3978e0bbd4df91011faed, 0x635a9d5aff4d39f18be39a282a3b41, 0x0040b1 ] } , - BigNum { limbs: [ 0xd2b436f50932afdcd4eae782b30688, 0x64dd8e54b387f9512866d3f7d41f14, 0x000837 ] } , - BigNum { limbs: [ 0xeaefcc0af5294f232b15177d4cf979, 0x42759b48c9c039e8afa135aa03e63e, 0x006bb6 ] } , - BigNum { limbs: [ 0x99d9214c68d624dc714980be571087, 0x9f73e4a877e46ea11c8dfdfe84358b, 0x001f19 ] } , - BigNum { limbs: [ 0x23cae1b39585da238eb67e41a8ef7a, 0x07df44f50563c498bb7a0ba353cfc8, 0x0054d4 ] } , - BigNum { limbs: [ 0x399fcbaaa521a98ea8afae00d170ae, 0x373c48aa371fc73ef01e4237d0cd62, 0x004d0a ] } , - BigNum { limbs: [ 0x84043755593a5571575050ff2e8f53, 0x7016e0f346286bfae7e9c76a0737f1, 0x0026e3 ] } , - BigNum { limbs: [ 0x500eb02ee2d9b63e9fe4a0fd9609b0, 0x23d941e9787714e54cb0055d4e79e0, 0x0034ae ] } , - BigNum { limbs: [ 0x6d9552d11b8248c1601b5e0269f651, 0x8379e7b404d11e548b580444898b73, 0x003f3f ] } , - BigNum { limbs: [ 0x352480fa0142bbab3354b95ae621bc, 0x5126bd58cd82930f5e8f92bf19b8f0, 0x000cc6 ] } , - BigNum { limbs: [ 0x887f8205fd194354ccab45a519de45, 0x562c6c44afc5a02a797876e2be4c63, 0x006727 ] } , - BigNum { limbs: [ 0x62ded52fd700885ee20c0dd1b4a838, 0x1c067801129b35ed2aecb3a3c45a67, 0x00368a ] } , - BigNum { limbs: [ 0x5ac52dd0275b76a11df3f12e4b57c9, 0x8b4cb19c6aacfd4cad1b55fe13aaec, 0x003d63 ] } , - BigNum { limbs: [ 0x66e7055dd8b9a9362010e8b6f2fca0, 0xb1192af8a686ae9351a4b09f45cf52, 0x006626 ] } , - BigNum { limbs: [ 0x56bcfda225a255c9dfef16490d0361, 0xf639fea4d6c184a686635902923601, 0x000dc6 ] } , - BigNum { limbs: [ 0x829fa9756239065149e6b135daad43, 0x1d92c648e00ac9797442364e2a520c, 0x0042df ] } , - BigNum { limbs: [ 0x3b04598a9c22f8aeb6194dca2552be, 0x89c063549d3d69c063c5d353adb347, 0x00310e ] } , - BigNum { limbs: [ 0x039c93ab01de8dc45d6a0ee42c235e, 0xe9a05d32ae0c342f0b767f189f73b8, 0x005802 ] } , - BigNum { limbs: [ 0xba076f54fc7d713ba295f01bd3dca3, 0xbdb2cc6acf3bff0acc918a8938919b, 0x001bea ] } , - BigNum { limbs: [ 0x607690dcfab6e9e6e915abaf97bc2d, 0x7a3834c2b60b8fa3fe5f9b3c8ae049, 0x000023 ] } , - BigNum { limbs: [ 0x5d2d722303a5151916ea53506843d4, 0x2d1af4dac73ca395d9a86e654d250a, 0x0073ca ] } , - BigNum { limbs: [ 0xf7e8d06558cc09c2361a9ef0904d55, 0xcd45c3e35c09548b704bd2ae612416, 0x003a9d ] } , - BigNum { limbs: [ 0xc5bb329aa58ff53dc9e5600f6fb2ac, 0xda0d65ba213edeae67bc36f376e13c, 0x00394f ] } , - BigNum { limbs: [ 0x366ec9858bbf6c69998015cfb618f9, 0x55e541519389f820338273189ec513, 0x0070c9 ] } , - BigNum { limbs: [ 0x8735397a729c9296667fe93049e708, 0x516de84be9be3b19a4859689394040, 0x000324 ] } , - BigNum { limbs: [ 0x991a8549b179952dfc1c048b1eebba, 0x4c4e68daaf27eca0d4a90b42cef9db, 0x002fd7 ] } , - BigNum { limbs: [ 0x24897db64ce269d203e3fa74e11447, 0x5b04c0c2ce204699035efe5f090b78, 0x004416 ] } , - BigNum { limbs: [ 0xaa6d581ed2c4bd1bfec4e31db595da, 0x7d5b0ed096e4303bd342e46dae0b30, 0x000674 ] } , - BigNum { limbs: [ 0x1336aae12b9741e4013b1be24a6a27, 0x29f81acce66402fe04c5253429fa23, 0x006d79 ] } , - BigNum { limbs: [ 0x81e1b366348d59d5008b415742cf2c, 0x1de08c44b05c5f9615ada1567cea0f, 0x001a24 ] } , - BigNum { limbs: [ 0x3bc24f99c9cea52aff74bda8bd30d5, 0x89729d58ccebd3a3c25a684b5b1b44, 0x0059c9 ] } , - BigNum { limbs: [ 0xe75b2f9b862e777f2812860a5e7bf6, 0x603dcb33a8f035c2af174b0de333ac, 0x002fce ] } , - BigNum { limbs: [ 0xd648d364782d8780d7ed78f5a1840b, 0x47155e69d457fd7728f0be93f4d1a6, 0x00441f ] } , - BigNum { limbs: [ 0x192102577134b3fe804b693688c917, 0x152542076b192914da850aa8c1ca1b, 0x003d77 ] } , - BigNum { limbs: [ 0xa48300a88d274b017fb495c97736ea, 0x922de796122f0a24fd82fef9163b38, 0x003676 ] } , - BigNum { limbs: [ 0xf4bccd99cb9046c44608878e56b18d, 0xe4da84bd62fbae9aa110d4844095c6, 0x001266 ] } , - BigNum { limbs: [ 0xc8e7356632cbb83bb9f77771a94e74, 0xc278a4e01a4c849f36f7351d976f8c, 0x006186 ] } , - BigNum { limbs: [ 0x311fa027a0f568823cb99f2c17bdcd, 0xf7cf11927e6353a2ae829e2dd36e96, 0x0072d2 ] } , - BigNum { limbs: [ 0x8c8462d85d66967dc3465fd3e84234, 0xaf84180afee4df9729856b740496bd, 0x00011a ] } , - BigNum { limbs: [ 0x5c255fec426d8cdc8023c433014b7a, 0x1125fb8d170db8f63036640b7cfca4, 0x005ec0 ] } , - BigNum { limbs: [ 0x617ea313bbee72237fdc3accfeb487, 0x962d2e10663a7a43a7d1a5965b08af, 0x00152d ] } , - BigNum { limbs: [ 0x234cc83e129d05cac696b0e5c3fcac, 0xfeb419a46ea5fcd501b9c2cf437010, 0x001c0a ] } , - BigNum { limbs: [ 0x9a573ac1ebbef93539694e1a3c0355, 0xa89f0ff90ea23664d64e46d2949543, 0x0057e2 ] } , - BigNum { limbs: [ 0xe716e0f033f72b72498848fbc00998, 0xd0588d6029adaf665203abefaf0457, 0x001323 ] } , - BigNum { limbs: [ 0xd68d220fca64d38db677b6043ff669, 0xd6fa9c3d539a83d386045db22900fb, 0x0060c9 ] } , - BigNum { limbs: [ 0xa69c5cb7b5339c8b28202568c1191a, 0x7473aec107d89fd3fc0a318afa7228, 0x0010f4 ] } , - BigNum { limbs: [ 0x1707a64849286274d7dfd9973ee6e7, 0x32df7adc756f9365dbfdd816dd932b, 0x0062f9 ] } , - BigNum { limbs: [ 0x181f2d5d9e2a131245b9b503b948f7, 0x10fc1f1f45c512e78cf448f8beafff, 0x004bab ] } , - BigNum { limbs: [ 0xa584d5a26031ebedba4649fc46b70a, 0x96570a7e378320524b13c0a9195554, 0x002842 ] } , - BigNum { limbs: [ 0x899c749fdaf665bc1548facb7b03c5, 0xc7d005315cea488effc435dd9245f1, 0x0047e6 ] } , - BigNum { limbs: [ 0x34078e6023659943eab7043484fc3c, 0xdf83246c205deaaad843d3c445bf62, 0x002c06 ] } , - BigNum { limbs: [ 0x980680010107783cd0d52868bd62f1, 0xff4f2394b51c1d27378dd579388bb1, 0x001b6d ] } , - BigNum { limbs: [ 0x259d82fefd5486c32f2ad697429d10, 0xa8040608c82c1612a07a34289f79a2, 0x00587f ] } , - BigNum { limbs: [ 0x0fda5051a37d3acd0cf163f403c594, 0x25d07b49a277db8a3197f6667f0a7c, 0x000aa3 ] } , - BigNum { limbs: [ 0xadc9b2ae5adec432f30e9b0bfc3a6d, 0x8182ae53dad057afa670133b58fad7, 0x00694a ] } , - BigNum { limbs: [ 0xc4daee200c52605c067d108a5ba95a, 0x92c2bf28e2003a96940c094299dc62, 0x002976 ] } , - BigNum { limbs: [ 0xf8c914dff2099ea3f982ee75a456a7, 0x14906a749b47f8a343fc005f3e28f0, 0x004a77 ] } , - BigNum { limbs: [ 0xde75070be93e05f8f3ba3d42f36d2c, 0xd5e4479c8df0ecb3f50fb0f21337d1, 0x002414 ] } , - BigNum { limbs: [ 0xdf2efbf4151df9070c45c1bd0c92d5, 0xd16ee200ef574685e2f858afc4cd81, 0x004fd8 ] } , - BigNum { limbs: [ 0xf7bca4242070fcbc79729bfc181d87, 0xb15ea032d2eb3432303860656bc2eb, 0x004e23 ] } , - BigNum { limbs: [ 0xc5e75edbddeb0243868d6303e7e27a, 0xf5f4896aaa5cff07a7cfa93c6c4267, 0x0025c9 ] } , - BigNum { limbs: [ 0x5ef5e86046408143a898fb31c9c4ee, 0x91addd75800726e4c08df8991f67a0, 0x0056bd ] } , - BigNum { limbs: [ 0x5eae1a9fb81b7dbc576703ce363b13, 0x15a54c27fd410c55177a1108b89db3, 0x001d30 ] } , - BigNum { limbs: [ 0x6e588415ecaa66b136effd3f67e4f0, 0xd8fd7bb9852f096506fcb28d9b7cf6, 0x0038ce ] } , - BigNum { limbs: [ 0x4f4b7eea11b1984ec91001c0981b11, 0xce55ade3f81929d4d10b57143c885d, 0x003b1e ] } , - BigNum { limbs: [ 0x8f36cb9e84d1b1630642f16c936994, 0xe75a382cbf2e02f0663c969124c698, 0x0067dc ] } , - BigNum { limbs: [ 0x2e6d3761798a4d9cf9bd0d936c966d, 0xbff8f170be1a304971cb7310b33ebb, 0x000c10 ] } , - BigNum { limbs: [ 0xc391a44d095efb7975e7721deb1be9, 0xd069b7229003170842e6e017c538ea, 0x001403 ] } , - BigNum { limbs: [ 0xfa125eb2f4fd03868a188ce214e418, 0xd6e9727aed451c319521298a12cc68, 0x005fe9 ] } , - BigNum { limbs: [ 0x51d7689baf0f40f6c18c8d1ea26560, 0xb6ddd5775cb0f1982c73f8102e9d6d, 0x001b19 ] } , - BigNum { limbs: [ 0x6bcc9a644f4cbe093e7371e15d9aa1, 0xf0755426209741a1ab941191a967e6, 0x0058d3 ] } , - BigNum { limbs: [ 0xb10ea7a313f73e11fa377f6160c3e7, 0xf76f040b0a89bed4581761f087904e, 0x00346e ] } , - BigNum { limbs: [ 0x0c955b5cea64c0ee05c87f9e9f3c1a, 0xafe4259272be74657ff0a7b1507505, 0x003f7e ] } , - BigNum { limbs: [ 0xd73d5d3d1ebf4c2b27692f9d97b929, 0xc253a232e71502e1414cf60bcb7626, 0x004dd4 ] } , - BigNum { limbs: [ 0xe666a5c2df9cb2d4d896cf626846d8, 0xe4ff876a9633305896bb13960c8f2c, 0x002618 ] } , - BigNum { limbs: [ 0x01ab792405734124e37d7512d665de, 0x4efd72d699b6ad23b531fa5e728f48, 0x00502a ] } , - BigNum { limbs: [ 0xbbf889dbf8e8bddb1c8289ed299a23, 0x5855b6c6e391861622d60f4365760b, 0x0023c3 ] } , - BigNum { limbs: [ 0x04625fcd552eb47e4f18a74d8f0ffc, 0x74e27cad0a2c5df5679e2874a63c51, 0x001b14 ] } , - BigNum { limbs: [ 0xb941a332a92d4a81b0e757b270f005, 0x3270acf0731bd5447069e12d31c902, 0x0058d9 ] } , - BigNum { limbs: [ 0x128954af94fd14686873f8ebe729d3, 0xaf07783cd487ebc8683b74daafca98, 0x0067d2 ] } , - BigNum { limbs: [ 0xab1aae50695eea97978c061418d62e, 0xf84bb160a8c047716fcc94c7283abb, 0x000c1a ] } , - BigNum { limbs: [ 0x39c3bd751f2997989a8b21cb4b1481, 0xb14019f2da1c4b94376b4bf82d9ec8, 0x001e87 ] } , - BigNum { limbs: [ 0x83e0458adf3267676574dd34b4eb80, 0xf6130faaa32be7a5a09cbda9aa668b, 0x005565 ] } , - BigNum { limbs: [ 0x224e8044fb9b302d358051fe142663, 0x7e5dd2080df78bfe971e712d186e0a, 0x0041ee ] } , - BigNum { limbs: [ 0x9b5582bb02c0ced2ca7fad01ebd99e, 0x28f557956f50a73b40e99874bf9749, 0x0031ff ] } , - BigNum { limbs: [ 0x266e7302d6261ee8604ef138481f67, 0x4af099edb3d6b0bba73275b4fd222d, 0x003fb0 ] } , - BigNum { limbs: [ 0x97358ffd2835e0179fb10dc7b7e09a, 0x5c628fafc971827e30d593ecdae326, 0x00343d ] } , - BigNum { limbs: [ 0xcd04d4f26b49a51297254297f78ee1, 0x396fe69b76655402529839aa08e182, 0x0029a6 ] } , - BigNum { limbs: [ 0xf09f2e0d931259ed68dabc68087120, 0x6de3430206e2df37856fcff7cf23d0, 0x004a47 ] } , - BigNum { limbs: [ 0x9a0420135c1e74d004fced7127bbd0, 0xfdaea9b84859439bb05a2196d21ca9, 0x006730 ] } , - BigNum { limbs: [ 0x239fe2eca23d8a2ffb03118ed84431, 0xa9a47fe534eeef9e27ade80b05e8aa, 0x000cbc ] } , - BigNum { limbs: [ 0x9389ca095aa500706ae67706c752d6, 0x240d9f9006949ad4f83cf67b6dbbbc, 0x00710a ] } , - BigNum { limbs: [ 0x2a1a38f6a3b6fe8f951987f938ad2b, 0x83458a0d76b39864dfcb13266a4997, 0x0002e3 ] } , - BigNum { limbs: [ 0x3128560305c8ef5a2396bbf9697fb6, 0xccabef53799b1e88e1d0d1f0dc5dc7, 0x003bc4 ] } , - BigNum { limbs: [ 0x8c7bacfcf8930fa5dc69430696804b, 0xdaa73a4a03ad14b0f63737b0fba78c, 0x003828 ] } , - BigNum { limbs: [ 0x7bdee41758cacac6c8da15682a43ad, 0xa255a42715a228e1ce9a9398792771, 0x0061ed ] } , - BigNum { limbs: [ 0x41c51ee8a59134393725e997d5bc54, 0x04fd857667a60a58096d76095edde2, 0x001200 ] } , - BigNum { limbs: [ 0x36460c54463cd8f3645a8d9dd0449e, 0xc5e63ebd7c87a1375287bdfc69b2e7, 0x005f7a ] } , - BigNum { limbs: [ 0x875df6abb81f260c9ba571622fbb63, 0xe16ceae000c0920285804ba56e526c, 0x001472 ] } , - BigNum { limbs: [ 0xe527d3c618bd91111135e45e927581, 0x651a3c71c35b24f44b3cbdee5bb69e, 0x0034e9 ] } , - BigNum { limbs: [ 0xd87c2f39e59e6deeeeca1aa16d8a80, 0x4238ed2bb9ed0e458ccb4bb37c4eb4, 0x003f04 ] } , - BigNum { limbs: [ 0x14bad0bf6f6300650f9beee20b5515, 0xe269c37d4d8412f381403b89980ee9, 0x00217b ] } , - BigNum { limbs: [ 0xa8e932408ef8fe9af064101df4aaec, 0xc4e966202fc4204656c7ce183ff66a, 0x005271 ] } , - BigNum { limbs: [ 0x762a4c86bee8123a5f306e81360e77, 0x7337cf2dbc5743ce881218684db954, 0x0009e9 ] } , - BigNum { limbs: [ 0x4779b6793f73ecc5a0cf907ec9f18a, 0x341b5a6fc0f0ef6b4ff5f1398a4bff, 0x006a04 ] } , - BigNum { limbs: [ 0x9937ed82cb4a9fc76cd46491730168, 0xdc87d269cdd4133553ee41427fca0f, 0x001f19 ] } , - BigNum { limbs: [ 0x246c157d33115f38932b9a6e8cfe99, 0xcacb5733af7420048419c85f583b44, 0x0054d3 ] } , - BigNum { limbs: [ 0x56d7ccb64bbb09a91f10acaa57449b, 0x3d85d572d287a73bb732faaf08a75a, 0x004c45 ] } , - BigNum { limbs: [ 0x66cc3649b2a0f556e0ef5255a8bb66, 0x69cd542aaac08bfe20d50ef2cf5df9, 0x0027a8 ] } , - BigNum { limbs: [ 0x6f93db2578f813a18e4c1292f11cf2, 0x1640b859af326965abb4bbaf508f24, 0x003059 ] } , - BigNum { limbs: [ 0x4e1027da8563eb5e71b3ec6d0ee30f, 0x91127143ce15c9d42c534df287762f, 0x004394 ] } , - BigNum { limbs: [ 0x60ca413c1470f069cd62c92c7d3417, 0x0c87494cf671479a275b158a6c0d06, 0x006c26 ] } , - BigNum { limbs: [ 0x5cd9c1c3e9eb0e96329d35d382cbea, 0x9acbe05086d6eb9fb0acf4176bf84d, 0x0007c7 ] } , - BigNum { limbs: [ 0xb124828724cb9e6154c10541689b3b, 0x28ea95e4e4c038654cd2bddea77d27, 0x005169 ] } , - BigNum { limbs: [ 0x0c7f8078d990609eab3ef9be9764c6, 0x7e6893b89887fad48b354bc330882c, 0x002284 ] } , - BigNum { limbs: [ 0xd65e0a886ccc459e92185783bbf588, 0xf9623fbe85bf577afaa3b0aa4366e4, 0x003525 ] } , - BigNum { limbs: [ 0xe745f877918fb9616de7a77c440a79, 0xadf0e9def788dbbedd6458f7949e6e, 0x003ec7 ] } , - BigNum { limbs: [ 0x39b33948d004277c7c788388618a21, 0xd5d37bc89361ba87d73f16df38f517, 0x00166f ] } , - BigNum { limbs: [ 0x83f0c9b72e57d78383877b779e75e0, 0xd17fadd4e9e678b200c8f2c29f103c, 0x005d7d ] } , - BigNum { limbs: [ 0x0184807cbb3ccd17563741f5395c61, 0x191d96a87bdcf9bfabd2f465302102, 0x002917 ] } , - BigNum { limbs: [ 0xbc1f8283431f31e8a9c8bd0ac6a3a0, 0x8e3592f5016b397a2c35153ca7e451, 0x004ad6 ] } , - BigNum { limbs: [ 0x70b480ff3c8ada180c9ea7df3e2e1c, 0xb24c47cd173318b38cd42c7775b82f, 0x006df1 ] } , - BigNum { limbs: [ 0x4cef8200c1d124e7f3615720c1d1e5, 0xf506e1d066151a864b33dd2a624d24, 0x0005fb ] } , - BigNum { limbs: [ 0xe0618f7723728fadfafe11076f83fb, 0xb65b78377562265e0e278de1545148, 0x0033f7 ] } , - BigNum { limbs: [ 0xdd427388dae96f520501edf8907c06, 0xf0f7b16607e60cdbc9e07bc083b40a, 0x003ff5 ] } , - BigNum { limbs: [ 0xe5d866c41107068d880fd835f7e59c, 0xfd30fb91fe1846ee4785af0c016f5e, 0x000ff9 ] } , - BigNum { limbs: [ 0xd7cb9c3bed54f87277f026ca081a65, 0xaa222e0b7f2fec4b90825a95d695f4, 0x0063f3 ] } , - BigNum { limbs: [ 0xb426361576c9da4906585ea02264ed, 0x7eb308dc00235023c5a79a89d2bbdf, 0x0032a6 ] } , - BigNum { limbs: [ 0x097dccea879224b6f9a7a05fdd9b14, 0x28a020c17d24e31612606f18054974, 0x004147 ] } , - BigNum { limbs: [ 0xa8b71686c297c367949e884db344bf, 0xdc7f753c1d55d80c7e16600602f704, 0x00100d ] } , - BigNum { limbs: [ 0x14ecec793bc43b986b6176b24cbb42, 0xcad3b4615ff25b2d59f1a99bd50e4f, 0x0063df ] } , - BigNum { limbs: [ 0xc575ec1a329a5541f33ede3b9f9399, 0x7826ed24369781fc49d19b208571ff, 0x002b29 ] } , - BigNum { limbs: [ 0xf82e16e5cbc1a9be0cc120c4606c68, 0x2f2c3c7946b0b13d8e366e81529353, 0x0048c4 ] } , - BigNum { limbs: [ 0xd485c1f50cc769de0283afe1cb6584, 0x56553e601b81d52738de72cd45e191, 0x005dda ] } , - BigNum { limbs: [ 0xe91e410af1949521fd7c4f1e349a7d, 0x50fdeb3d61c65e129f2996d49223c1, 0x001613 ] } , - BigNum { limbs: [ 0x1fe5a5c8cfa8db155697e920b8c870, 0x4ccf3a7b715b6346c4d279d010a3a4, 0x000160 ] } , - BigNum { limbs: [ 0x9dbe5d372eb323eaa96815df473791, 0x5a83ef220beccff313358fd1c761af, 0x00728d ] } , - BigNum { limbs: [ 0x99795435ca67fef6cc5689c1f540e1, 0x2cd7cfa083667322f2be809c88ff9b, 0x001572 ] } , - BigNum { limbs: [ 0x242aaeca33f4000933a9753e0abf20, 0x7a7b59fcf9e1c016e54989054f05b8, 0x005e7b ] } , - BigNum { limbs: [ 0xba3d2b430423bbd2fee202f8577732, 0x8b74a34e54522dfa0d10e94de8286c, 0x002fb5 ] } , - BigNum { limbs: [ 0x0366d7bcfa38432d011dfc07a888cf, 0x1bde864f28f6053fcaf72053efdce7, 0x004438 ] } , - BigNum { limbs: [ 0xdbc3b2b164561896ce8e2e452c03e9, 0x67d41c98b8fa9829526ed6eec7578b, 0x0043ec ] } , - BigNum { limbs: [ 0xe1e0504e9a05e6693171d0bad3fc18, 0x3f7f0d04c44d9b10859932b310adc7, 0x003001 ] } , - BigNum { limbs: [ 0x3a3bcba4e33b5f6e7f2a73337c97eb, 0xb18d510dd282977c9c840d057bc4a8, 0x0012ad ] } , - BigNum { limbs: [ 0x8368375b1b209f9180d58bcc836816, 0xf5c5d88faac59bbd3b83fc9c5c40ab, 0x00613f ] } , - BigNum { limbs: [ 0x546f42d2f2136ab70c1a97d4a5a28b, 0x519305a6a34d00a54824fbd3c944df, 0x0032b8 ] } , - BigNum { limbs: [ 0x6934c02d0c489448f3e5672b5a5d76, 0x55c023f6d9fb32948fe30dce0ec074, 0x004135 ] } , - BigNum { limbs: [ 0x565938c72e8dc88dd6a6cbf1ff3e4a, 0xdbdc2c56cc7d4b28d83b2561c2568a, 0x002e17 ] } , - BigNum { limbs: [ 0x674aca38cfce36722959330e00c1b7, 0xcb76fd46b0cae810ffcce44015aec9, 0x0045d5 ] } , - BigNum { limbs: [ 0x77ba8dbe3dfb062809456c05e23c98, 0x14671281b8a4b1b3a9be35f3271afe, 0x001935 ] } , - BigNum { limbs: [ 0x45e97541c060f8d7f6ba92fa1dc369, 0x92ec171bc4a381862e49d3aeb0ea55, 0x005ab8 ] } , - BigNum { limbs: [ 0x1096f45046dd52a99f6a0d133d06aa, 0x861a7b23584626170d92377f7b5e79, 0x004ed7 ] } , - BigNum { limbs: [ 0xad0d0eafb77eac566095f1ecc2f957, 0x2138ae7a25020d22ca75d2225ca6da, 0x002516 ] } , - BigNum { limbs: [ 0xe1ab1e5b93f822d0b94eb237110d9f, 0x5fa125e49db89d2655af277ba7868c, 0x0069f2 ] } , - BigNum { limbs: [ 0xdbf8e4a46a63dc2f46b14cc8eef262, 0x47b203b8df8f96138258e226307ec6, 0x0009fb ] } , - BigNum { limbs: [ 0x6db8fecb665fa64c727ae95a4f1504, 0x4de5de9d149d0992379cc3665e3b80, 0x006d5c ] } , - BigNum { limbs: [ 0x4feb043497fc58b38d8515a5b0eafd, 0x596d4b0068ab29a7a06b463b79c9d3, 0x000691 ] } , - BigNum { limbs: [ 0x62eebd2d2d03301254d2facb9c65ec, 0x9789160e7b8c0fe7473fe43df5ffa2, 0x000707 ] } , - BigNum { limbs: [ 0x5ab545d2d158ceedab2d0434639a15, 0x0fca138f01bc235290c82563e205b1, 0x006ce6 ] } , - BigNum { limbs: [ 0x34fabfe22bf195070a40826b0a8a22, 0x496805d716afcfe47a545cdc549868, 0x0045de ] } , - BigNum { limbs: [ 0x88a9431dd26a69f8f5bf7c94f575df, 0x5deb23c6669863555db3acc5836ceb, 0x002e0f ] } , - BigNum { limbs: [ 0x8e36a4f207ed7934afa23e4d664fb9, 0xe13b38a0e39adb1535f05011c0f97d, 0x001f5f ] } , - BigNum { limbs: [ 0x2f6d5e0df66e85cb505dc0b299b048, 0xc617f0fc99ad5824a217b990170bd6, 0x00548d ] } , - BigNum { limbs: [ 0x0efba3add1439fcda6025fcec5f85e, 0x23e39e3bddb85c5f7c6f1f39bb4a43, 0x004172 ] } , - BigNum { limbs: [ 0xaea85f522d185f3259fd9f313a07a3, 0x836f8b619f8fd6da5b98ea681cbb10, 0x00327b ] } , - BigNum { limbs: [ 0x50fd367a04217a99f8b35c4feecc72, 0x3aeef6d281f2894bb176dc6c03beb7, 0x0000fa ] } , - BigNum { limbs: [ 0x6ca6cc85fa3a8466074ca2b011338f, 0x6c6432cafb55a9ee26912d35d4469c, 0x0072f3 ] } , - BigNum { limbs: [ 0x3abeed94b4f1634be87dab9013c5e6, 0x7c84cd1b601bec56a6760508dcf493, 0x002bd5 ] } , - BigNum { limbs: [ 0x82e5156b496a9bb41782536fec3a1b, 0x2ace5c821d2c46e331920498fb10c0, 0x004818 ] } , - BigNum { limbs: [ 0x8726c067a90bbe12024f89b257ee62, 0x2e08318aeeacb408378170769053cb, 0x006b7e ] } , - BigNum { limbs: [ 0x367d4298555040edfdb0754da8119f, 0x794af8128e9b7f31a086992b47b188, 0x00086f ] } , - BigNum { limbs: [ 0xd18fa289732f688a5ee031a9245ad3, 0xbc0e64c9d219a8d562efc8186a2d24, 0x002969 ] } , - BigNum { limbs: [ 0xec1460768b2c9675a11fcd56dba52e, 0xeb44c4d3ab2e8a64751841896dd82e, 0x004a83 ] } , - BigNum { limbs: [ 0x427c3d5132b42adb5bf0d17886f914, 0x1b7bf18b694222c41c5896457592c9, 0x0009bb ] } , - BigNum { limbs: [ 0x7b27c5aecba7d424a40f2d877906ed, 0x8bd7381214061075bbaf735c62728a, 0x006a32 ] } , - BigNum { limbs: [ 0xf4a328d6df60c441d4d6f8a6035ba1, 0x0e4e224ed50ccd12172874ef649f75, 0x0015ff ] } , - BigNum { limbs: [ 0xc900da291efb3abe2b290659fca460, 0x9905074ea83b6627c0df94b27365dd, 0x005dee ] } , - BigNum { limbs: [ 0x32eadeb2eaebb63bfd3383d2361246, 0xc05b04c9044fc6c5f0964c53353c45, 0x004c30 ] } , - BigNum { limbs: [ 0x8ab9244d137048c402cc7b2dc9edbb, 0xe6f824d478f86c73e771bd4ea2c90e, 0x0027bc ] } , - BigNum { limbs: [ 0xe64e1a0d2e560d6e1499e715bda543, 0x278c6eed86f45ec8092b13ec8a7ecd, 0x00484d ] } , - BigNum { limbs: [ 0xd755e8f2d005f191eb6617ea425abe, 0x7fc6baaff653d471cedcf5b54d8685, 0x002ba0 ] } , - BigNum { limbs: [ 0xa2a69107b6a980b482447428fa23ee, 0x7561de37d95e60cd66c57736477daa, 0x001a2c ] } , - BigNum { limbs: [ 0x1afd71f847b27e4b7dbb8ad705dc13, 0x31f14b65a3e9d26c7142926b9087a9, 0x0059c1 ] } , - BigNum { limbs: [ 0x34a8335508915c9da5d0cc12724318, 0x78fad28e89573fde62c6b46b658a0f, 0x00242c ] } , - BigNum { limbs: [ 0x88fbcfaaf5caa2625a2f32ed8dbce9, 0x2e58570ef3f0f35b75415536727b44, 0x004fc1 ] } , - BigNum { limbs: [ 0xd771dbf6e9599e6ae672da7b46fa2c, 0x3a0e0347179ccc16de33046dedfd4f, 0x005276 ] } , - BigNum { limbs: [ 0xe632270915026095198d2484b905d5, 0x6d45265665ab6722f9d50533ea0803, 0x002177 ] } , - BigNum { limbs: [ 0x50f41a25187433d5401e0e3fd3cfc1, 0x51bd4c910d3fe33c91024f7a8e43e3, 0x006e98 ] } , - BigNum { limbs: [ 0x6cafe8dae5e7cb2abfe1f0c02c3040, 0x5595dd0c70084ffd4705ba2749c170, 0x000555 ] } , - BigNum { limbs: [ 0x693136244c47d39006fed3cdaa0066, 0xa274da64baa96fb21ab194d4741dbd, 0x00004a ] } , - BigNum { limbs: [ 0x5472ccdbb2142b6ff9012b3255ff9b, 0x04de4f38c29ec387bd5674cd63e796, 0x0073a3 ] } , - BigNum { limbs: [ 0x960d51bf6ae6f4e4ab5ac48f2bd9a6, 0x11dd7971e55a4d99e7da903c25f117, 0x006584 ] } , - BigNum { limbs: [ 0x2796b14093750a1b54a53a70d4265b, 0x9575b02b97ede59ff02d7965b2143c, 0x000e69 ] } , - BigNum { limbs: [ 0x60c1d07e6eeefc87b5eac39c929ac3, 0xe6212869277b67c6ec8885a28cd25a, 0x005d5f ] } , - BigNum { limbs: [ 0x5ce232818f6d02784a153b636d653e, 0xc132013455cccb72eb7f83ff4b32f9, 0x00168d ] } , - BigNum { limbs: [ 0xddf56e2cd4099acf38136ebca02c29, 0xac21cd03c9f223c6493f18cca8f69b, 0x003a40 ] } , - BigNum { limbs: [ 0xdfae94d32a526430c7ec90435fd3d8, 0xfb315c99b3560f738ec8f0d52f0eb7, 0x0039ac ] } , - BigNum { limbs: [ 0x02b232af695bcf227fe83d53c1ddee, 0x912d964c2baf45393450556cb92530, 0x006af1 ] } , - BigNum { limbs: [ 0xbaf1d05095002fdd8017c1ac3e2213, 0x162593515198ee00a3b7b4351ee023, 0x0008fc ] } , - BigNum { limbs: [ 0xa642214f0552fce5dcbdb1a601c023, 0xc5389b8a77563adc60186611634372, 0x001ccb ] } , - BigNum { limbs: [ 0x1761e1b0f909021a23424d59fe3fde, 0xe21a8e1305f1f85d77efa39074c1e1, 0x005721 ] } , - BigNum { limbs: [ 0x62c16e272104bf004be4bfd097d114, 0xef816bc349c995e8b12f9a81eaa16a, 0x003adb ] } , - BigNum { limbs: [ 0x5ae294d8dd573fffb41b3f2f682eed, 0xb7d1bdda337e9d5126d86f1fed63e9, 0x003911 ] } , - BigNum { limbs: [ 0xe4c9e2213e75a9aea4435a94a73592, 0x7bacf43b42c5ad0303a3834b35fc71, 0x005f05 ] } , - BigNum { limbs: [ 0xd8da20debfe655515bbca46b58ca6f, 0x2ba635623a828636d4648656a208e1, 0x0014e8 ] } , - BigNum { limbs: [ 0xaea472d254c55dee3ac1bc2e985d0e, 0x481c5fd3e525670a5d517f05737bda, 0x005dc7 ] } , - BigNum { limbs: [ 0x0eff902da996a111c53e42d167a2f3, 0x5f36c9c99822cc2f7ab68a9c648979, 0x001626 ] } , - BigNum { limbs: [ 0x95714916b52a44a1d1b433c6d47388, 0xf72b124899b39b47aca9f79b77ff22, 0x000957 ] } , - BigNum { limbs: [ 0x2832b9e94931ba5e2e4bcb392b8c79, 0xb0281754e39497f22b5e1206600631, 0x006a95 ] } , - BigNum { limbs: [ 0x3dab9667fd8d6bc0b912fc6ebb6b4d, 0xa957470b3b35b9ebd8849e767d8f1a, 0x00723d ] } , - BigNum { limbs: [ 0x7ff86c9800ce933f46ed02914494b4, 0xfdfbe2924212794dff836b2b5a7639, 0x0001af ] } , - BigNum { limbs: [ 0x1a6dd107013e8f532cb2e6d8d5aba7, 0x5fb4f46a87242dcbdd1d919b4e16c6, 0x004c9c ] } , - BigNum { limbs: [ 0xa33631f8fd1d6facd34d18272a545a, 0x479e3532f624056dfaea780689ee8d, 0x002751 ] } , - BigNum { limbs: [ 0xdefdd5e0a986ed1c437a27915897ce, 0x95170c6c7a701e40b397a45127173a, 0x0043fb ] } , - BigNum { limbs: [ 0xdea62d1f54d511e3bc85d76ea76833, 0x123c1d3102d814f924706550b0ee18, 0x002ff2 ] } , - BigNum { limbs: [ 0xbba69476fa5eda3561bfd6c71847fd, 0xc0f1216b6c3e53e37f41765245dfb3, 0x003b35 ] } , - BigNum { limbs: [ 0x01fd6e8903fd24ca9e402838e7b804, 0xe66208321109df5658c6934f9225a0, 0x0038b7 ] } , - BigNum { limbs: [ 0x1e4f3c2848bde33792a0704d7f3d5c, 0xa41db4f4117fa6964523fbe0428afd, 0x0028ea ] } , - BigNum { limbs: [ 0x9f54c6d7b59e1bc86d5f8eb280c2a5, 0x033574a96bc88ca392e40dc1957a56, 0x004b03 ] } , - BigNum { limbs: [ 0x499179728f96587b47364abb902a7f, 0x06969e493afaf1cae603a9624c7f48, 0x0026cb ] } , - BigNum { limbs: [ 0x7412898d6ec5a684b8c9b4446fd582, 0xa0bc8b54424d416ef204603f8b860b, 0x004d22 ] } , - BigNum { limbs: [ 0x2eab334af1e1da6d7b0ac353e2e894, 0xc71899852062fc6ecc48d2fcc38796, 0x0034e7 ] } , - BigNum { limbs: [ 0x8ef8cfb50c7a249284f53bac1d176d, 0xe03a90185ce536cb0bbf36a5147dbd, 0x003f05 ] } , - BigNum { limbs: [ 0xbaaa75d37ac780d245d76b67f27d60, 0x6941c2658187de20aaf30c6e820a8f, 0x0009bf ] } , - BigNum { limbs: [ 0x02f98d2c83947e2dba2893980d82a1, 0x3e116737fbc055192d14fd3355fac4, 0x006a2e ] } , - BigNum { limbs: [ 0x4d58135e5084d45283c7e8f859236e, 0xd03359beb3ea94caca1076aabb329a, 0x002fc3 ] } , - BigNum { limbs: [ 0x704befa1add72aad7c381607a6dc93, 0xd71fcfdec95d9e6f0df792f71cd2b9, 0x004429 ] } , - BigNum { limbs: [ 0x10e5e09d4a435c9c77c878f2bb8464, 0xf72162824b43a150ed4182d6c5cc71, 0x0021a4 ] } , - BigNum { limbs: [ 0xacbe2262b418a2638837860d447b9d, 0xb031c71b320491e8eac686cb1238e2, 0x005248 ] } , - BigNum { limbs: [ 0xf51d82b4bab62433c15d109a2b1351, 0xc51b3151c9ef8fa6d009cc1e058c1f, 0x000714 ] } , - BigNum { limbs: [ 0xc886804b43a5dacc3ea2ee65d4ecb0, 0xe237f84bb358a39307fe3d83d27933, 0x006cd8 ] } , - BigNum { limbs: [ 0x34ef3e831e2ed58ba307e4e30ab1d4, 0x08d18af837ce39c12f6fd503a491da, 0x006d88 ] } , - BigNum { limbs: [ 0x88b4c47ce02d29745cf81a1cf54e2d, 0x9e819ea54579f978a898349e337379, 0x000665 ] } , - BigNum { limbs: [ 0x336da7150fc15dddd56ac9a7dc56c7, 0x7d5317cd6abce54817f7fd9bdce46e, 0x004011 ] } , - BigNum { limbs: [ 0x8a365beaee9aa1222a95355823a93a, 0x2a0011d0128b4df1c0100c05fb20e5, 0x0033dc ] } , - BigNum { limbs: [ 0x6ec9d66ed0d05112d7c36272dfa403, 0xc5d21eec1555ed81ca1bbc982e7922, 0x001ec1 ] } , - BigNum { limbs: [ 0x4eda2c912d8baded283c9c8d205bfe, 0xe1810ab167f245b80dec4d09a98c31, 0x00552b ] } , - BigNum { limbs: [ 0xfa8f9106dce56dec7ec96011f79a3c, 0x1ac2f79b05e28225f2afe1f417c2c5, 0x0052ee ] } , - BigNum { limbs: [ 0xc31471f92176911381369eee0865c5, 0x8c9032027765b113e55827adc0428d, 0x0020ff ] } , - BigNum { limbs: [ 0x088b2b3a9aec775d554ddf3121ab7d, 0xfa53f3c7787f73c5ee3d79f317d56d, 0x00357f ] } , - BigNum { limbs: [ 0xb518d7c5636f87a2aab21fcede5484, 0xacff35d604c8bf73e9ca8faec02fe6, 0x003e6d ] } , - BigNum { limbs: [ 0xab1d2a69326150035433bf5ab27518, 0x9450acd956d2d3e5beb3e22dd68c4c, 0x0011d9 ] } , - BigNum { limbs: [ 0x1286d896cbfaaefcabcc3fa54d8ae9, 0x13027cc426755f5419542774017907, 0x006214 ] } , - BigNum { limbs: [ 0xb422d75c3d666f868f9ace7f0c05ad, 0x08fa0da5731b7a4f6bf340fd338d21, 0x003186 ] } , - BigNum { limbs: [ 0x09812ba3c0f58f7970653080f3fa54, 0x9e591bf80a2cb8ea6c14c8a4a47832, 0x004267 ] } , - BigNum { limbs: [ 0xa13ca9ab7aec628d9e085dbcf627b3, 0x2ceae6375943e17d761d599629634f, 0x0061f7 ] } , - BigNum { limbs: [ 0x1c675954836f9c7261f7a14309d84e, 0x7a684366240451bc61eab00baea204, 0x0011f6 ] } , - BigNum { limbs: [ 0x5a435445e20ad1603533d63a46811e, 0x107acd46e6ead73902c051a4f47a89, 0x001099 ] } , - BigNum { limbs: [ 0x6360aeba1c512d9fcacc28c5b97ee3, 0x96d85c56965d5c00d547b7fce38aca, 0x006354 ] } , - BigNum { limbs: [ 0x0f556c7dd965c9e662abd652bab712, 0x2868b33df772d83728a650fec1696a, 0x0039ae ] } , - BigNum { limbs: [ 0xae4e968224f635199d5428ad4548ef, 0x7eea765f85d55b02af61b8a3169be9, 0x003a3f ] } , - BigNum { limbs: [ 0x095888daa8cfdbbb8cc4d2edbd46d3, 0xae4dd751366cffd24594deb8870dde, 0x0007e3 ] } , - BigNum { limbs: [ 0xb44b7a25558c2344733b2c1242b92e, 0xf905524c46db336792732ae950f775, 0x006c09 ] } , - BigNum { limbs: [ 0x5aeccb05e4e36060803fc8de4668e8, 0x193723dba47ad8cbb8d047f3a39b0c, 0x00414b ] } , - BigNum { limbs: [ 0x62b737fa19789e9f7fc03621b99719, 0x8e1c05c1d8cd5a6e1f37c1ae346a47, 0x0032a2 ] } , - BigNum { limbs: [ 0x1853b4ee0a8f23056507ef2eaa6a09, 0x0a90ca49d553e549f2ee40567332ca, 0x002d21 ] } , - BigNum { limbs: [ 0xa5504e11f3ccdbfa9af80fd15595f8, 0x9cc25f53a7f44defe519c94b64d289, 0x0046cc ] } , - BigNum { limbs: [ 0x2624f47a7cc3c3863217230f4471f9, 0xa98b3d9bb1a86d72e5e027b600ea16, 0x00382c ] } , - BigNum { limbs: [ 0x977f0e8581983b79cde8dbf0bb8e08, 0xfdc7ec01cb9fc5c6f227e1ebd71b3d, 0x003bc0 ] } , - BigNum { limbs: [ 0x833c9a0c4b5810f5b4c6b50487ae1f, 0x21f3bb92f58d494135cedd7cc2a033, 0x001be4 ] } , - BigNum { limbs: [ 0x3a6768f3b303ee0a4b3949fb7851e2, 0x855f6e0a87bae9f8a2392c25156520, 0x005809 ] } , - BigNum { limbs: [ 0xf382d2cf899e1c66a46ab4699489c6, 0xcabaccd26113e0b7a9efc26faa9532, 0x002803 ] } , - BigNum { limbs: [ 0xca21303074bde2995b954a966b763b, 0xdc985ccb1c3452822e1847322d7020, 0x004be9 ] } , - BigNum { limbs: [ 0x6910d639aefe17754b6a53fddc4c94, 0x88cd7576b823f47dfc583fe631a439, 0x0021d0 ] } , - BigNum { limbs: [ 0x54932cc64f5de78ab495ab0223b36d, 0x1e85b426c5243ebbdbafc9bba6611a, 0x00521d ] } , - BigNum { limbs: [ 0x0d613cc36bfa358f848821e4356469, 0x09516722769df28de6c16bb4bbee36, 0x002f2b ] } , - BigNum { limbs: [ 0xb042c63c9261c9707b77dd1bca9b98, 0x9e01c27b06aa40abf1469ded1c171d, 0x0044c2 ] } , - BigNum { limbs: [ 0x75d2d8c194a702ae113bb568e33c3c, 0xfd9bbe2b455b567ce9424c694ca7ba, 0x00596e ] } , - BigNum { limbs: [ 0x47d12a3e69b4fc51eec449971cc3c5, 0xa9b76b7237ecdcbceec5bd388b5d99, 0x001a7e ] } , - BigNum { limbs: [ 0xd67644ecb1ec23b5e2c92f7207066f, 0x3669f0b510aff120489b258ca13d29, 0x000c90 ] } , - BigNum { limbs: [ 0xe72dbe134c6fdb4a1d36cf8df8f992, 0x70e938e86c9842198f6ce41536c829, 0x00675d ] } , - BigNum { limbs: [ 0xc313287b50ee6ceb107d107792e331, 0xf5f496036dda75d6467e78880bd899, 0x001f92 ] } , - BigNum { limbs: [ 0xfa90da84ad6d9214ef82ee886d1cd0, 0xb15e939a0f6dbd6391899119cc2cb9, 0x00545a ] } , - BigNum { limbs: [ 0x0bd4e6a7e888998588ec8712bbb533, 0xc466e9f46b9b99b02b0d0da9e471ba, 0x003367 ] } , - BigNum { limbs: [ 0xb1cf1c5815d3657a771377ed444ace, 0xe2ec3fa911ac9989acfafbf7f39399, 0x004085 ] } , - BigNum { limbs: [ 0x3be97480c55418f45dadfa7ab57531, 0xea964384940530c5e2bc37a1533ac3, 0x0066b4 ] } , - BigNum { limbs: [ 0x81ba8e7f3907e60ba25204854a8ad0, 0xbcbce618e9430273f54bd20084ca90, 0x000d38 ] } , - BigNum { limbs: [ 0xc2430643e8182d35323eec80747457, 0xfcbdae14d82de463155db41faca3da, 0x006021 ] } , - BigNum { limbs: [ 0xfb60fcbc1643d1cacdc1127f8b8baa, 0xaa957b88a51a4ed6c2aa55822b6178, 0x0013cb ] } , - BigNum { limbs: [ 0xc7a2c8ab4cebe3229d28add06fa1a0, 0x36b466b8ceec2076b2987fe06886b8, 0x001769 ] } , - BigNum { limbs: [ 0xf6013a54b1701bdd62d7512f905e61, 0x709ec2e4ae5c12c3256f89c16f7e9a, 0x005c84 ] } , - BigNum { limbs: [ 0xd8a879169dd8991a08d5e4e2e01343, 0x192fb0cd079daf0f64a02464f057f6, 0x00679a ] } , - BigNum { limbs: [ 0xe4fb89e9608365e5f72a1a1d1fecbe, 0x8e2378d075aa842a7367e53ce7ad5c, 0x000c53 ] } , - BigNum { limbs: [ 0xb5485481194aefa65b28ed517d4354, 0xde37523e64d4ddbaddb9f90e7d697a, 0x000019 ] } , - BigNum { limbs: [ 0x085bae7ee5110f59a4d711ae82bcad, 0xc91bd75f1873557efa4e10935a9bd9, 0x0073d3 ] } , - BigNum { limbs: [ 0x970eedd0930abc1f41e0a2ec24c764, 0x76aca5cbffa191b659acf68394e8b7, 0x006b2f ] } , - BigNum { limbs: [ 0x2695152f6b5142e0be1f5c13db389d, 0x30a683d17da6a1837e5b131e431c9c, 0x0008be ] } , - BigNum { limbs: [ 0xea426fe3382da5ccd6232e773a7be0, 0xbccf1d2163b24879f55520eec3096c, 0x005fc0 ] } , - BigNum { limbs: [ 0xd361931cc62e593329dcd088c58421, 0xea840c7c1995eabfe2b2e8b314fbe6, 0x00142c ] } , - BigNum { limbs: [ 0x5ded1899239a88898b0554d218a61c, 0xd11ff6f7fa6cbcbe9301f686e86bf9, 0x0044c1 ] } , - BigNum { limbs: [ 0x5fb6ea66dac1767674faaa2de759e5, 0xd63332a582db767b4506131aef995a, 0x002f2b ] } , - BigNum { limbs: [ 0x62a1c1fa6e32aa1b529e40de1d7c4d, 0x5788394251987c11e63de35442f626, 0x0054e6 ] } , - BigNum { limbs: [ 0x5b024105902954e4ad61be21e283b4, 0x4fcaf05b2bafb727f1ca264d950f2d, 0x001f07 ] } , - BigNum { limbs: [ 0x23483beb660aa3126c1c8e445a8a5b, 0x12a22a888026f6f5faa93431d39300, 0x005726 ] } , - BigNum { limbs: [ 0x9a5bc71498515bed93e370bba575a6, 0x94b0ff14fd213c43dd5ed570047253, 0x001cc7 ] } , - BigNum { limbs: [ 0xd34a8629e2a390579464a37d34c01f, 0xe95e089c5912926d173883e9142489, 0x006800 ] } , - BigNum { limbs: [ 0xea597cd61bb86ea86b9b5b82cb3fe2, 0xbdf521012435a0ccc0cf85b8c3e0c9, 0x000bec ] } , - BigNum { limbs: [ 0x12f7a9a2ba4c6f2289841708c47e76, 0x8d51514e6d3ba1fb1ad2f91bea10fe, 0x006c5c ] } , - BigNum { limbs: [ 0xaaac595d440f8fdd767be7f73b818b, 0x1a01d84f100c913ebd351085edf455, 0x000791 ] } , - BigNum { limbs: [ 0x1084d1e459c2644faaa91388ae574d, 0xed8c43ec33b5e17e82746da5a2b076, 0x0047d7 ] } , - BigNum { limbs: [ 0xad1f311ba4999ab05556eb7751a8b4, 0xb9c6e5b1499251bb55939bfc3554dd, 0x002c15 ] } , - BigNum { limbs: [ 0xf9870d09b49934594ef32abcf775b9, 0xd339e9bdd168c902e32bba607579dc, 0x00220b ] } , - BigNum { limbs: [ 0xc41cf5f649c2caa6b10cd443088a48, 0xd4193fdfabdf6a36f4dc4f41628b76, 0x0051e1 ] } , - BigNum { limbs: [ 0xba5587cee31ba92218afc24fb3fb6d, 0x26f47becfa9260ab9a24e417ab6e2a, 0x00010c ] } , - BigNum { limbs: [ 0x034e7b311b4055dde7503cb04c0494, 0x805eadb082b5d28e3de3258a2c9729, 0x0072e1 ] } , - BigNum { limbs: [ 0xb1101b4a6a67fce5fb1ba223a764f8, 0x59b150561c08ee82c31d8e145688a9, 0x001f99 ] } , - BigNum { limbs: [ 0x0c93e7b593f4021a04e45cdc589b09, 0x4da1d947613f44b714ea7b8d817caa, 0x005454 ] } , - BigNum { limbs: [ 0x33e7e7f45b14fb3783b2614bebb0c2, 0x6a09c6e30dc4df9d916b36a30c5404, 0x006136 ] } , - BigNum { limbs: [ 0x89bc1b0ba34703c87c4d9db4144f3f, 0x3d4962ba6f83539c469cd2fecbb14f, 0x0012b7 ] } , - BigNum { limbs: [ 0x3eb77e93fdfad62d5d0f5c33535fd6, 0x31fb8102066d8296d9a9c6a10e2512, 0x006457 ] } , - BigNum { limbs: [ 0x7eec846c006128d2a2f0a2ccaca02b, 0x7557a89b76dab0a2fe5e4300c9e041, 0x000f96 ] } , - BigNum { limbs: [ 0x8fd58359d39d07910b8b9b66684add, 0x7d8c49ec4fb7f6900d91db7be189f1, 0x005363 ] } , - BigNum { limbs: [ 0x2dce7fa62abef76ef474639997b524, 0x29c6dfb12d903ca9ca762e25f67b62, 0x00208a ] } , - BigNum { limbs: [ 0x5b9ae4008d73829ab0eaa775faa012, 0x76e29080b50f1cd896a4b3705edc8a, 0x004256 ] } , - BigNum { limbs: [ 0x62091eff70e87c654f15578a055fef, 0x3070991cc8391661416356317928c9, 0x003197 ] } , - BigNum { limbs: [ 0x5415c7e32b57d8f14c6ea5a428c753, 0x2871d8bbf1938804b57eba0c7f48b2, 0x005ea3 ] } , - BigNum { limbs: [ 0x698e3b1cd304260eb391595bd738ae, 0x7ee150e18bb4ab3522894f9558bca1, 0x00154a ] } , - BigNum { limbs: [ 0x454cc072521a80dee4982fe73f0476, 0xc15b4cc4b5699059b96ae5d8e22ca0, 0x002ec1 ] } , - BigNum { limbs: [ 0x7857428dac417e211b67cf18c0fb8b, 0xe5f7dcd8c7dea2e01e9d23c8f5d8b3, 0x00452b ] } , - BigNum { limbs: [ 0x6a4174f9d391c3c1bc0e2e75444e71, 0xd2c2aeff4f7c1033a694607d9089ee, 0x00585f ] } , - BigNum { limbs: [ 0x53628e062aca3b3e43f1d08abbb190, 0xd4907a9e2dcc23063173a924477b65, 0x001b8d ] } , - BigNum { limbs: [ 0x077fb2af5f3968498cb1c004d751da, 0x9f9a7567a04fcef4eeac0deb62a9e2, 0x002f41 ] } , - BigNum { limbs: [ 0xb62450509f2296b6734e3efb28ae27, 0x07b8b435dcf86444e95bfbb6755b71, 0x0044ac ] } , - BigNum { limbs: [ 0x7f4b22ee86c90c6e3bf01c498740f6, 0xc509aec45575756fdf33240b9eb8c2, 0x004322 ] } , - BigNum { limbs: [ 0x3e58e0117792f291c40fe2b678bf0b, 0xe2497ad927d2bdc9f8d4e596394c91, 0x0030ca ] } , - BigNum { limbs: [ 0x62ff60cc15dea0c8e2dd3ed107d499, 0x0cdd9173bbfd3e8c95924f0548cbe5, 0x004c1c ] } , - BigNum { limbs: [ 0x5aa4a233e87d5e371d22c02ef82b68, 0x9a759829c14af4ad4275ba9c8f396e, 0x0027d1 ] } , - BigNum { limbs: [ 0xc9f9aa166bf26bc0797107b1cb3124, 0x3826c895df7f4b00e4140110a4aed7, 0x001896 ] } , - BigNum { limbs: [ 0xf3aa58e99269933f868ef74e34cedd, 0x6f2c61079dc8e838f3f4089133567b, 0x005b57 ] } , - BigNum { limbs: [ 0x6b1f176bbbafe77f0e8114b6a0d047, 0xe6b5bd56753f2c848ff6620f2d19a0, 0x0021fa ] } , - BigNum { limbs: [ 0x5284eb9442ac1780f17eea495f2fba, 0xc09d6c47080906b54811a792aaebb3, 0x0051f2 ] } , - BigNum { limbs: [ 0x24dfe0eff265eeb9f443beec8e4a98, 0xd12f488a4f008dde048d37f34632d0, 0x006ab6 ] } , - BigNum { limbs: [ 0x98c422100bf610460bbc401371b569, 0xd623e1132e47a55bd37ad1ae91d283, 0x000936 ] } , - BigNum { limbs: [ 0x89389d045ecd85912bd03df9174127, 0x5678784bdd314b69773fb25cf78088, 0x0009e9 ] } , - BigNum { limbs: [ 0x346b65fb9f8e796ed42fc106e8beda, 0x50dab151a016e7d060c85744e084cb, 0x006a04 ] } , - BigNum { limbs: [ 0xb2c43c2678b650937dff33b29a7067, 0x10012f49cbdbb0c057cfa5a042c808, 0x0032f6 ] } , - BigNum { limbs: [ 0x0adfc6d985a5ae6c8200cb4d658f9a, 0x9751fa53b16c827980386401953d4b, 0x0040f7 ] } , - BigNum { limbs: [ 0x89db099f5aa3d61cf9c8103c36f106, 0x04026adc48a1cb249422c0b1923c84, 0x00420f ] } , - BigNum { limbs: [ 0x33c8f960a3b828e30637eec3c90efb, 0xa350bec134a6681543e548f045c8cf, 0x0031de ] } , - BigNum { limbs: [ 0x131960517113c6aa3f1fa1135a9163, 0xb023314a82dbfe42fdcdc306e96f61, 0x006fbc ] } , - BigNum { limbs: [ 0xaa8aa2ae8d483855c0e05deca56e9e, 0xf72ff852fa6c34f6da3a469aee95f2, 0x000430 ] } , - BigNum { limbs: [ 0xa8dfb2d95d08eebad594175ea0777d, 0xd15d1348757839ea78d5ebd557ac68, 0x000fa5 ] } , - BigNum { limbs: [ 0x14c45026a15310452a6be7a15f8884, 0xd5f6165507cff94f5f321dcc8058eb, 0x006447 ] } , - BigNum { limbs: [ 0xb49eae14ca61adfb5a74bbf196694f, 0x78e42eccf77a299af2a89d3d9a9503, 0x0004a5 ] } , - BigNum { limbs: [ 0x090554eb33fa5104a58b430e6996b2, 0x2e6efad085ce099ee55f6c643d7050, 0x006f48 ] } , - BigNum { limbs: [ 0xc57c7aae3c5d192fc39139d30accaa, 0x6a37e78478720ac2b9a3a71bc6dee6, 0x0052ff ] } , - BigNum { limbs: [ 0xf8278851c1fee5d03c6ec52cf53357, 0x3d1b421904d628771e64628611266c, 0x0020ee ] } , - BigNum { limbs: [ 0xbfe4d04bc3af5abd41931e6ad8fbc4, 0xb4226f2d37b4092596aa02af41df19, 0x0052df ] } , - BigNum { limbs: [ 0xfdbf32b43aaca442be6ce09527043d, 0xf330ba7045942a14415e06f2962639, 0x00210d ] } , - BigNum { limbs: [ 0x5d4c8253345fc0da9862bcfa4152a5, 0xb67b052567d36d907e855e18e24fe2, 0x001666 ] } , - BigNum { limbs: [ 0x605780acc9fc3e25679d4205bead5c, 0xf0d824781574c5a95982ab88f5b571, 0x005d86 ] } , - BigNum { limbs: [ 0x2a6b489ba9d4071dd477a1a8fb9943, 0x2f1ccbe3e2f477c805e7d68aa60033, 0x0057e3 ] } , - BigNum { limbs: [ 0x9338ba645487f7e22b885d570466be, 0x78365db99a53bb71d2203317320520, 0x001c0a ] } , - BigNum { limbs: [ 0x1ab551c326a152b58257bb2e5d71db, 0xbc560f4a92e069085360a46e5262e7, 0x004bf9 ] } , - BigNum { limbs: [ 0xa2eeb13cd7baac4a7da843d1a28e26, 0xeafd1a52ea67ca3184a7653385a26c, 0x0027f3 ] } , - BigNum { limbs: [ 0x58997c0bcf1c7ec8ed5cac7b9d2bac, 0xb301523084ffbb94572c1757cd8070, 0x001998 ] } , - BigNum { limbs: [ 0x650a86f42f3f803712a3528462d455, 0xf451d76cf84877a580dbf24a0a84e3, 0x005a54 ] } , - BigNum { limbs: [ 0xbf85946a2dad3bd8b9c1884f38f043, 0x2e2d253894999a00ad991d57396878, 0x000645 ] } , - BigNum { limbs: [ 0xfe1e6e95d0aec327463e76b0c70fbe, 0x79260464e8ae99392a6eec4a9e9cda, 0x006da8 ] } , - BigNum { limbs: [ 0x79d0abcc6b92776cfd5fd90654dc47, 0x92b5ba1dbfdb4e6157ba4c1415819b, 0x001b33 ] } , - BigNum { limbs: [ 0x43d3573392c9879302a025f9ab23ba, 0x149d6f7fbd6ce4d8804dbd8dc283b8, 0x0058ba ] } , - BigNum { limbs: [ 0x68d3d308f6af752367d21449c614fb, 0x7acb9966a71884d4224a351c246aaa, 0x001e8c ] } , - BigNum { limbs: [ 0x54d02ff707ac89dc982deab639eb06, 0x2c879036d62fae65b5bdd485b39aa9, 0x005561 ] } , - BigNum { limbs: [ 0xd1347b378fbf96e206da11a5d36306, 0x0a11a0f704f4fc3e8acfe0f8245f0a, 0x00564c ] } , - BigNum { limbs: [ 0xec6f87c86e9c681df925ed5a2c9cfb, 0x9d4188a6785336fb4d3828a9b3a648, 0x001da1 ] } , - BigNum { limbs: [ 0xad4b8238fb15a2cd5f7b9753dbc950, 0x8876214b5ea64b7394e9aacb5a271f, 0x002bb6 ] } , - BigNum { limbs: [ 0x105880c703465c32a08467ac2436b1, 0x1edd08521ea1e7c6431e5ed67dde34, 0x004837 ] } , - BigNum { limbs: [ 0x63fff9337fecd313c7c03ef17a2033, 0xabee7c028923cc0affedaf37b5bb4e, 0x001c39 ] } , - BigNum { limbs: [ 0x59a409cc7e6f2bec383fc00e85dfce, 0xfb64ad9af424672ed81a5a6a224a05, 0x0057b3 ] } , - BigNum { limbs: [ 0x91a1faeb4b36d5cc2201b834e74a04, 0x8f5b87d7a05090eb099e349e17639b, 0x00605b ] } , - BigNum { limbs: [ 0x2c020814b3252933ddfe46cb18b5fd, 0x17f7a1c5dcf7a24ece69d503c0a1b8, 0x001392 ] } , - BigNum { limbs: [ 0xa2df4d8921e8aff1867882e0b9cae8, 0xcb41966a5661788743c7818f06051d, 0x0006f3 ] } , - BigNum { limbs: [ 0x1ac4b576dc734f0e79877c1f463519, 0xdc11933326e6bab294408812d20036, 0x006cf9 ] } , - BigNum { limbs: [ 0x5c5d4be5b92c7b5ab670793f534c85, 0x7f1658569f752082ae264b6ae7cc8d, 0x003a09 ] } , - BigNum { limbs: [ 0x6146b71a452f83a5498f85c0acb37c, 0x283cd146ddd312b729e1be36f038c6, 0x0039e4 ] } , - BigNum { limbs: [ 0x6736009fa130119f9a06a539dcc7bd, 0xf5a12bf093b927ab9acee22625ab94, 0x005351 ] } , - BigNum { limbs: [ 0x566e02605d2bed6065f959c6233844, 0xb1b1fdace98f0b8e3d39277bb259bf, 0x00209b ] } , - BigNum { limbs: [ 0x24c2fd6a62162b6b37d19f83bb87e0, 0xac8524669b3262d47d6f3069a6b4a9, 0x002146 ] } , - BigNum { limbs: [ 0x98e105959c45d394c82e5f7c447821, 0xface0536e215d0655a98d9383150aa, 0x0052a6 ] } , - BigNum { limbs: [ 0xa24a9bd470cd67ca0a0220aec02fa4, 0x3ba7dfb14308007b0e472badec8d39, 0x0057e0 ] } , - BigNum { limbs: [ 0x1b59672b8d8e9735f5fdde513fd05d, 0x6bab49ec3a4032bec9c0ddf3eb781a, 0x001c0d ] } , - BigNum { limbs: [ 0xbf80d6881dc2190c850dd65aaaaefa, 0x4708ac66bf63479ddf15c7b33589c3, 0x001bab ] } , - BigNum { limbs: [ 0xfe232c77e099e5f37af228a5555107, 0x604a7d36bde4eb9bf8f241eea27b8f, 0x005842 ] } , - BigNum { limbs: [ 0xd6c764f82602a7228bc1c0e7e3fdf5, 0x4cef0ca52f27785009eb7e7ecdaa03, 0x000658 ] } , - BigNum { limbs: [ 0xe6dc9e07d85957dd743e3e181c020c, 0x5a641cf84e20bae9ce1c8b230a5b4f, 0x006d95 ] } , - BigNum { limbs: [ 0x74957c1d2728744430911d2ef02d6c, 0x00c1a3aeef45073c6cb1200432d367, 0x00688a ] } , - BigNum { limbs: [ 0x490e86e2d7338abbcf6ee1d10fd295, 0xa69185ee8e032bfd6b56e99da531ec, 0x000b63 ] } , - BigNum { limbs: [ 0xb39fb2d51ad78d473ea412a309a77c, 0x9915614f3901e5434787eb246e5cea, 0x003d3d ] } , - BigNum { limbs: [ 0x0a04502ae38471b8c15bec5cf65885, 0x0e3dc84e44464df690801e7d69a869, 0x0036b0 ] } , - BigNum { limbs: [ 0x7203a676aa3fae360419ba7b4a732f, 0x208bd4a64316c3de999d9c5ccf8954, 0x00200d ] } , - BigNum { limbs: [ 0x4ba05c89541c50c9fbe64484b58cd2, 0x86c754f73a316f5b3e6a6d45087bff, 0x0053e0 ] } , - BigNum { limbs: [ 0xcb18f70b1666477b49fff1eb1daf38, 0x4e933af6252c6dc58e41cd427dbe5f, 0x00009c ] } , - BigNum { limbs: [ 0xf28b0bf4e7f5b784b6000d14e250c9, 0x58bfeea7581bc57449c63c5f5a46f3, 0x007351 ] } , - BigNum { limbs: [ 0x4567cac5c777f44c56fb3866d3a809, 0xffb392002a5b378787829b9e0abd13, 0x0067b3 ] } , - BigNum { limbs: [ 0x783c383a36e40ab3a904c6992c57f8, 0xa79f979d52ecfbb250856e03cd4840, 0x000c39 ] } , - BigNum { limbs: [ 0xdca0ae49bc978f29ebf33886000c8a, 0xabc5b7c03be4cc772df2b06be7d8d7, 0x0053d7 ] } , - BigNum { limbs: [ 0xe10354b641c46fd6140cc679fff377, 0xfb8d71dd416366c2aa155935f02c7b, 0x002015 ] } , - BigNum { limbs: [ 0x940867fad3080cff61da335d218c69, 0x9d4a6f36bb328011781ae2eb8338e5, 0x00596a ] } , - BigNum { limbs: [ 0x299b9b052b53f2009e25cba2de7398, 0x0a08ba66c215b3285fed26b654cc6e, 0x001a83 ] } , - BigNum { limbs: [ 0x542b67f83c49199e3ccb8dd576b0f5, 0xadb736656798954b937d9da775086a, 0x004a41 ] } , - BigNum { limbs: [ 0x69789b07c212e561c334712a894f0c, 0xf99bf33815af9dee448a6bfa62fce9, 0x0029ab ] } , - BigNum { limbs: [ 0x76cfa8688aad937936281d725764c6, 0xda887f345f79f45562e9505e5e255d, 0x005b21 ] } , - BigNum { limbs: [ 0x46d45a9773ae6b86c9d7e18da89b3b, 0xcccaaa691dce3ee4751eb94379dff6, 0x0018cb ] } , - BigNum { limbs: [ 0xeafd87bcdafda8cb6a70e04f526a21, 0x340846157bd5c13b498f50314635ca, 0x0029d8 ] } , - BigNum { limbs: [ 0xd2a67b43235e5634958f1eb0ad95e0, 0x734ae388017271fe8e78b97091cf88, 0x004a15 ] } , - BigNum { limbs: [ 0x1da259503de1389ec8f2d00aa19cc2, 0xbf6ff47ecf4640000ffa7ee6b74af1, 0x002250 ] } , - BigNum { limbs: [ 0xa001a9afc07ac661370d2ef55e633f, 0xe7e3351eae01f339c80d8abb20ba62, 0x00519c ] } , - BigNum { limbs: [ 0x03dab19044e968a5e53cecd36dabb8, 0xfcab3ad741ebc624a6bf28c35e8472, 0x00592e ] } , - BigNum { limbs: [ 0xb9c9516fb972965a1ac3122c925449, 0xaaa7eec63b5c6d153148e0de7980e1, 0x001abe ] } , - BigNum { limbs: [ 0x9d5d562fb82e29d6e0934f96c7a283, 0x5287a19abf3c4b844ced5de375e7cb, 0x0009c6 ] } , - BigNum { limbs: [ 0x2046acd0462dd5291f6caf69385d7e, 0x54cb8802be0be7b58b1aabbe621d88, 0x006a27 ] } , - BigNum { limbs: [ 0x726517ced91929d4910b491b0f88ae, 0x5ec1c5949c07f55d7b47c3dbbb90a2, 0x0010c6 ] } , - BigNum { limbs: [ 0x4b3eeb312542d52b6ef4b5e4f07753, 0x48916408e1403ddc5cc045c61c74b1, 0x006327 ] } , - BigNum { limbs: [ 0x93ecc4fa926abf15507909d573d669, 0x2ddbb6673ea3ae29036141e291016e, 0x00394a ] } , - BigNum { limbs: [ 0x29b73e056bf13feaaf86f52a8c2998, 0x797773363ea48510d4a6c7bf4703e5, 0x003aa3 ] } , - BigNum { limbs: [ 0xdb8c0f19e4d5789314520692a107bf, 0x559da0d834d894ef9b74b96b0020a5, 0x006d5b ] } , - BigNum { limbs: [ 0xe217f3e61986866cebadf86d5ef842, 0x51b588c5486f9e4a3c935036d7e4ad, 0x000692 ] } , - BigNum { limbs: [ 0x4ce9d6b7ae56c76a7878b810d6b679, 0xd0cbecb1569285bfd4bf0aae06bd36, 0x004ed8 ] } , - BigNum { limbs: [ 0x70ba2c4850053795878746ef294988, 0xd6873cec26b5ad7a0348fef3d1481d, 0x002514 ] } , - BigNum { limbs: [ 0x9a7d5bdaf34775fa3f8e60a92902ec, 0x7e6ad59835800491be3e124c5646a5, 0x0052a2 ] } , - BigNum { limbs: [ 0x2326a7250b148905c0719e56d6fd15, 0x28e8540547c82ea819c9f75581beae, 0x00214b ] } , - BigNum { limbs: [ 0x930a3974130cf21f0bf5b12e2ad57b, 0xa88d3bb843f1e59a0efbb9fbdaac29, 0x003f00 ] } , - BigNum { limbs: [ 0x2a99c98beb4f0ce0f40a4dd1d52a86, 0xfec5ede539564d9fc90c4fa5fd592a, 0x0034ec ] } , - BigNum { limbs: [ 0x0ca2ec307a54e23de675002a1dc598, 0xeaab319d871b6f8272abdf5878899b, 0x001327 ] } , - BigNum { limbs: [ 0xb10116cf84071cc2198afed5e23a69, 0xbca7f7fff62cc3b7655c2a495f7bb8, 0x0060c5 ] } , - BigNum { limbs: [ 0x7b78bbf9fcf6ac1a8ce009481b06f4, 0xcd295c0ef9e69f7e9ea74befd40aec, 0x00681c ] } , - BigNum { limbs: [ 0x422b4706016552e5731ff5b7e4f90d, 0xda29cd8e836193bb3960bdb203fa67, 0x000bd0 ] } , - BigNum { limbs: [ 0x684c6a14b706e6a4e458d205940a65, 0xb4baeca30de2fa564db1db4df55ad5, 0x00160f ] } , - BigNum { limbs: [ 0x555798eb4755185b1ba72cfa6bf59c, 0xf2983cfa6f6538e38a562e53e2aa7e, 0x005ddd ] } , - BigNum { limbs: [ 0x357125c09f65d2f6bc04f1ccc8a05b, 0x75ece38b6b216509c259b1a0a550a2, 0x002e7a ] } , - BigNum { limbs: [ 0x8832dd3f5ef62c0943fb0d33375fa6, 0x316646121226ce3015ae580132b4b1, 0x004573 ] } , - BigNum { limbs: [ 0x21340434d0af3d0e2bce377d6c3748, 0x53137d74125bb90512b69f97c1abe0, 0x003162 ] } , - BigNum { limbs: [ 0x9c6ffecb2dacc1f1d431c78293c8b9, 0x543fac296aec7a34c5516a0a165973, 0x00428b ] } , - BigNum { limbs: [ 0xb75ebf1fa6a848f2dcd7de352e7812, 0xfa066178e33c85eb74ae061ea0c95e, 0x005b88 ] } , - BigNum { limbs: [ 0x064543e057b3b60d232820cad187ef, 0xad4cc8249a0bad4e635a0383373bf5, 0x001864 ] } , - BigNum { limbs: [ 0x7841ddfd61aa748afd27280b1d26d5, 0xb5dc03165af6d7e53ad367a6de9eee, 0x004736 ] } , - BigNum { limbs: [ 0x456225029cb18a7502d8d6f4e2d92c, 0xf177268722515b549d34a1faf96665, 0x002cb6 ] } , - BigNum { limbs: [ 0xa3fca4c95e97ef62e4bc4334d24aa2, 0x970f33b7a49db81d211727eccfa32c, 0x00148a ] } , - BigNum { limbs: [ 0x19a75e369fc40f9d1b43bbcb2db55f, 0x1043f5e5d8aa7b1cb6f0e1b5086227, 0x005f63 ] } , - BigNum { limbs: [ 0x1af71607b2c66dfea4a56081023372, 0xb346b11ea91175e3dbeb28007ad97d, 0x0036e2 ] } , - BigNum { limbs: [ 0xa2acecf84b9591015b5a9e7efdcc8f, 0xf40c787ed436bd55fc1ce1a15d2bd6, 0x003d0a ] } , - BigNum { limbs: [ 0xd98e5d422c5d1b27ff824c52dca1d0, 0x28e8851cb172fab2b64503252a7def, 0x004e8f ] } , - BigNum { limbs: [ 0xe415a5bdd1fee3d8007db2ad235e31, 0x7e6aa480cbd5388721c3067cad8763, 0x00255e ] } , - BigNum { limbs: [ 0x47a42d475447363d44f03d6a565b97, 0xbe856f6bbf1c5d54f3a81142092b09, 0x005168 ] } , - BigNum { limbs: [ 0x75ffd5b8aa14c8c2bb0fc195a9a46a, 0xe8cdba31be2bd5e4e45ff85fceda4a, 0x002284 ] } , - BigNum { limbs: [ 0x31d674997b53dae2b092cec051cab3, 0x4c464e1891f0c3c830738958768167, 0x001f64 ] } , - BigNum { limbs: [ 0x8bcd8e668308241d4f6d303fae354e, 0x5b0cdb84eb576f71a79480496183ec, 0x005489 ] } , - BigNum { limbs: [ 0xa86a543b84b81418e39ed00f0fb9e9, 0x2c67e97367ce5c3e6671824479d465, 0x003d75 ] } , - BigNum { limbs: [ 0x1539aec479a3eae71c612ef0f04618, 0x7aeb402a1579d6fb7196875d5e30ee, 0x003678 ] } , - BigNum { limbs: [ 0x8378bf20f973c70da3b463586d4b7b, 0xcdaeaa9b7abf7cc0ce06072e27a588, 0x003aa6 ] } , - BigNum { limbs: [ 0x3a2b43df04e837f25c4b9ba792b486, 0xd9a47f020288b6790a020273b05fcb, 0x003946 ] } , - BigNum { limbs: [ 0x010585e07a712c0b6729335818e69a, 0x2bac15e611d6564ae36561f30c5d45, 0x00369d ] } , - BigNum { limbs: [ 0xbc9e7d1f83ead2f498d6cba7e71967, 0x7ba713b76b71dceef4a2a7aecba80e, 0x003d50 ] } , - BigNum { limbs: [ 0xa526579d681c965a90ff08490bfddc, 0x09f9fa970046d8d2e1418a37800c8a, 0x0027ad ] } , - BigNum { limbs: [ 0x187dab62963f68a56f00f6b6f40225, 0x9d592f067d015a66f6c67f6a57f8c9, 0x004c40 ] } , - BigNum { limbs: [ 0x203f88cbdc4471948cb801db257f24, 0xa39c71e06fdf474e1e622995bbb22e, 0x000088 ] } , - BigNum { limbs: [ 0x9d647a3422178d6b7347fd24da80dd, 0x03b6b7bd0d68ebebb9a5e00c1c5325, 0x007365 ] } , - BigNum { limbs: [ 0xd9640467b89b62bb3664bc5da730c0, 0xf25d387914b42e95a8ce3dab9495f8, 0x00070c ] } , - BigNum { limbs: [ 0xe43ffe9845c09c44c99b42a258cf41, 0xb4f5f124689404a42f39cbf6436f5a, 0x006ce0 ] } , - BigNum { limbs: [ 0xcb1c4c78afeecd4318a4cc529de646, 0x8ab180b6121766d0fbf770c619f590, 0x006722 ] } , - BigNum { limbs: [ 0xf287b6874e6d31bce75b32ad6219bb, 0x1ca1a8e76b30cc68dc1098dbbe0fc2, 0x000ccb ] } , - BigNum { limbs: [ 0xf232337ef6eba4549c3333d5cdae87, 0x1b7d643dcbb06052961d233134d2bd, 0x001131 ] } , - BigNum { limbs: [ 0xcb71cf8107705aab63cccb2a32517a, 0x8bd5c55fb197d2e741eae670a33295, 0x0062bc ] } , - BigNum { limbs: [ 0xd2a6543bf0a923b8baa3c5f39511a9, 0xfaafbd50344cd931eb4e7d8227c6d9, 0x0033f1 ] } , - BigNum { limbs: [ 0xeafdaec40db2db47455c390c6aee58, 0xaca36c4d48fb5a07ecb98c1fb03e79, 0x003ffb ] } , - BigNum { limbs: [ 0x1777ae6de43c3bcc3cf45503a26bf9, 0x4930044f66d8675907d64a5c2feb97, 0x005605 ] } , - BigNum { limbs: [ 0xa62c54921a1fc333c30ba9fc5d9408, 0x5e23254e166fcbe0d031bf45a819bc, 0x001de8 ] } , - BigNum { limbs: [ 0x7664eaa2d713a5c7b1b0deaf488dc0, 0xdecc5a66647f9784a0b1a526c1fc01, 0x00040b ] } , - BigNum { limbs: [ 0x473f185d274859384e4f2050b77241, 0xc886cf3718c89bb53756647b160952, 0x006fe1 ] } , - BigNum { limbs: [ 0xadbc1a2c46fc2c8d7616ca9a1232dd, 0x417472eed79049a3167cfffc90e27f, 0x0057d6 ] } , - BigNum { limbs: [ 0x0fe7e8d3b75fd27289e93465edcd24, 0x65deb6aea5b7e996c18b09a54722d4, 0x001c17 ] } , - BigNum { limbs: [ 0xfa62bbbbd6b631a42d6916ba23404c, 0x404b2b3e80406629c6836b11a80e95, 0x001e1a ] } , - BigNum { limbs: [ 0xc341474427a5cd5bd296e845dcbfb5, 0x6707fe5efd07cd1011849e902ff6bd, 0x0055d3 ] } , - BigNum { limbs: [ 0xd481d0bb6911548cb29e5f68cdc81a, 0xaaa3d798d21e94dadff55c6cbfdb7f, 0x00630e ] } , - BigNum { limbs: [ 0xe9223244954aaa734d619f973237e7, 0xfcaf5204ab299e5ef812ad351829d3, 0x0010de ] } , - BigNum { limbs: [ 0x030f7af2e756bfa10792d623ec078b, 0xaf53a7f8913c194caac36ab9b39ee1, 0x001fef ] } , - BigNum { limbs: [ 0xba94880d17053f5ef86d28dc13f876, 0xf7ff81a4ec0c19ed2d449ee8246672, 0x0053fd ] } , - BigNum { limbs: [ 0xca4d3655b7f65a7a73df2ecd0e2030, 0x7518b9fd3554c0f19a67641063833c, 0x004b1d ] } , - BigNum { limbs: [ 0xf356ccaa4665a4858c20d032f1dfd1, 0x323a6fa047f372483da0a591748216, 0x0028d0 ] } , - BigNum { limbs: [ 0xd3049773ed303c881867a03315f5d3, 0x2b4acc7c704c4f38a455be37d321ba, 0x0048b5 ] } , - BigNum { limbs: [ 0xea9f6b8c112bc277e7985eccea0a2e, 0x7c085d210cfbe40133b24b6a04e398, 0x002b38 ] } , - BigNum { limbs: [ 0xc2d66725116e6c0e39c5c0deac938d, 0x7b09d8722543e50d1ed404838c3942, 0x003c85 ] } , - BigNum { limbs: [ 0xfacd9bdaeced92f1c63a3e21536c74, 0x2c49512b58044e2cb934051e4bcc10, 0x003768 ] } , - BigNum { limbs: [ 0xc4f44254bfe3f098c01ebb90ee775e, 0x6d9caec03381a9ee3c0868e70f5777, 0x0043bc ] } , - BigNum { limbs: [ 0xf8afc0ab3e780e673fe1436f1188a3, 0x39b67add49c6894b9bffa0bac8addb, 0x003031 ] } , - BigNum { limbs: [ 0xfddd235c7a98ac608be7900aae3100, 0xa244819154424d60ebf9f5ac99f13f, 0x005cb7 ] } , - BigNum { limbs: [ 0xbfc6dfa383c3529f74186ef551cf01, 0x050ea80c2905e5d8ec0e13f53e1413, 0x001736 ] } , - BigNum { limbs: [ 0x4a0fd486334f79d808d5c0d3ae1f12, 0x9daab2457724a2a6708e58d280c315, 0x005ac9 ] } , - BigNum { limbs: [ 0x73942e79cb0c8527f72a3e2c51e0ef, 0x09a87758062390936779b0cf57423e, 0x001924 ] } , - BigNum { limbs: [ 0xea8c83047a0348092bc156145ae3be, 0x6498d3d08cd0b43f4591e262934f10, 0x001299 ] } , - BigNum { limbs: [ 0xd3177ffb8458b6f6d43ea8eba51c43, 0x42ba55ccf0777efa9276273f44b642, 0x006154 ] } , - BigNum { limbs: [ 0xc9e71e9ad981f3f9bee777f505a670, 0xa66cf5599656047e8cec0c7be22c07, 0x0015ed ] } , - BigNum { limbs: [ 0xf3bce46524da0b064118870afa5991, 0x00e63443e6f22ebb4b1bfd25f5d94b, 0x005e00 ] } , - BigNum { limbs: [ 0xaa95c116471933d23a4a114812d636, 0x1521f33b59d5e1255a25981421ff14, 0x0052c0 ] } , - BigNum { limbs: [ 0x130e41e9b742cb2dc5b5edb7ed29cb, 0x92313662237252147de2718db6063f, 0x00212d ] } , - BigNum { limbs: [ 0xd54a83f5ca1be3e25cfe9c39fa442b, 0xf39fdb8f4cc1ff72289a55de1ef66f, 0x003042 ] } , - BigNum { limbs: [ 0xe8597f0a34401b1da30162c605bbd6, 0xb3b34e0e308633c7af6db3c3b90ee3, 0x0043aa ] } , - BigNum { limbs: [ 0x6df133f7321a25f20ce8d579e35cee, 0xa3f774f19f1ff7a8b04d2828931d48, 0x0018c6 ] } , - BigNum { limbs: [ 0x4fb2cf08cc41d90df31729861ca313, 0x035bb4abde283b9127bae17944e80b, 0x005b27 ] } , - BigNum { limbs: [ 0x0f9d3b81d8d23eded4a5f256a9c7fa, 0xe84cc460e97596051ddbd646a327cd, 0x00211d ] } , - BigNum { limbs: [ 0xae06c77e2589c0212b5a0ca9563807, 0xbf06653c93d29d34ba2c335b34dd86, 0x0052cf ] } , - BigNum { limbs: [ 0x6d32c4bc785ddf8f84dcc764345e6f, 0x440f93c3062bad415ce2d67286aaff, 0x005d3d ] } , - BigNum { limbs: [ 0x50713e4385fe1f707b23379bcba192, 0x634395da771c85f87b25332f515a54, 0x0016b0 ] } , - BigNum { limbs: [ 0x65f7f950b8ea85342030e7ba39b3a6, 0x509b496b983f565de17858f422f2df, 0x002b01 ] } , - BigNum { limbs: [ 0x57ac09af457179cbdfcf1745c64c5b, 0x56b7e031e508dcdbf68fb0adb51274, 0x0048ec ] } , - BigNum { limbs: [ 0x0cf136ceac4b7be81282d9762849c5, 0x475dcfa943c0ac10e91b6361e98f4d, 0x004e05 ] } , - BigNum { limbs: [ 0xb0b2cc3152108317ed7d2589d7b63c, 0x5ff559f439878728eeeca63fee7606, 0x0025e8 ] } , - BigNum { limbs: [ 0xf5a38f02d0d9e3f6e035ff20282882, 0x92eb3eb00addf10be3c3f4a15ce3d9, 0x004f48 ] } , - BigNum { limbs: [ 0xc80073fd2d821b091fc9ffdfd7d77f, 0x1467eaed726a422df44415007b2179, 0x0024a5 ] } , - BigNum { limbs: [ 0x15abe4dc2aec8fda060609b2b47d85, 0x138145182f544c8a68d80bcba67af2, 0x0069de ] } , - BigNum { limbs: [ 0xa7f81e23d36f6f25f9f9f54d4b827c, 0x93d1e4854df3e6af6f2ffdd6318a61, 0x000a0f ] } , - BigNum { limbs: [ 0x1876aef7cc205e21ae42d827deca30, 0x6f29f2073a63626669c7c06691d161, 0x0010c7 ] } , - BigNum { limbs: [ 0xa52d5408323ba0de51bd26d82135d1, 0x3829379642e4d0d36e40493b4633f2, 0x006326 ] } , - BigNum { limbs: [ 0xd8e98cba8c851f53dbcceebb1aec4c, 0x7da509b2c067c30ab0c323dcd93343, 0x005edb ] } , - BigNum { limbs: [ 0xe4ba764571d6dfac24331044e513b5, 0x29ae1feabce0702f2744e5c4fed20f, 0x001512 ] } , - BigNum { limbs: [ 0x34466bd37b654e75fbe2738ef6ec21, 0xf7bdf6d2576613871ea55580a605e5, 0x002f9e ] } , - BigNum { limbs: [ 0x895d972c82f6b08a041d8b710913e0, 0xaf9532cb25e21fb2b962b42131ff6e, 0x00444e ] } , - BigNum { limbs: [ 0xe3d5c95963601cef87c9f995096338, 0x788108ad69a5b53f9e776978ee912d, 0x0022c0 ] } , - BigNum { limbs: [ 0xd9ce39a69afbe2107836056af69cc9, 0x2ed220f013a27dfa3990a028e97425, 0x00512d ] } , - BigNum { limbs: [ 0xa52764195066cb368bf892d23cfbea, 0x4ffc4e3af3f346bc2d29fe6ef3b600, 0x0000a1 ] } , - BigNum { limbs: [ 0x187c9ee6adf533c974076c2dc30417, 0x5756db628954ec7daade0b32e44f53, 0x00734c ] } , - BigNum { limbs: [ 0xe7644948035d564c122ce446b3b25c, 0xf7e46fad681a2e91cb91310e85e484, 0x003e4b ] } , - BigNum { limbs: [ 0xd63fb9b7fafea8b3edd31ab94c4da5, 0xaf6eb9f0152e04a80c76d8935220ce, 0x0035a1 ] } , - BigNum { limbs: [ 0xf2d9bfd5140d699cc42e43382e70a4, 0x083148cb1058349ee0fb910de629c0, 0x001bdd ] } , - BigNum { limbs: [ 0xcaca432aea4e95633bd1bbc7d18f5d, 0x9f21e0d26ceffe9af70c7893f1db92, 0x005810 ] } , - BigNum { limbs: [ 0xff8a227dfd1dec38fa67bcd4f84471, 0xbd7da7f332978a73656310ab4c6c08, 0x0066e4 ] } , - BigNum { limbs: [ 0xbe19e082013e12c70598422b07bb90, 0xe9d581aa4ab0a8c672a4f8f68b994a, 0x000d08 ] } , - BigNum { limbs: [ 0xdac5574c6b36285f26172cbdae7696, 0x467880c3870fe5f29a8023d2eb1261, 0x001a74 ] } , - BigNum { limbs: [ 0xe2deabb39325d6a0d9e8d24251896b, 0x60daa8d9f6384d473d87e5ceecf2f1, 0x005979 ] } , - BigNum { limbs: [ 0x092a39c6a48f459c533e348b6eff5f, 0x1db7d0376a78528b2ecd3ea8ae6c56, 0x0011e5 ] } , - BigNum { limbs: [ 0xb479c93959ccb963acc1ca749100a2, 0x899b596612cfe0aea93acaf92998fd, 0x006208 ] } , - BigNum { limbs: [ 0x209c683b1f1277f13eb4a91bb6a4f8, 0xdb28617d36ba715ec5ec903e27b135, 0x0051e8 ] } , - BigNum { limbs: [ 0x9d079ac4df49870ec14b55e4495b09, 0xcc2ac820468dc1db121b7963b0541e, 0x002204 ] } , - BigNum { limbs: [ 0x39d9bec3468ebe119a0380eb0bbdd4, 0xf5fcf2b2518e4d3d9ef4fd3ca74c1a, 0x00493d ] } , - BigNum { limbs: [ 0x83ca443cb7cd40ee65fc7e14f4422d, 0xb15636eb2bb9e5fc39130c6530b939, 0x002aaf ] } , - BigNum { limbs: [ 0xc036c97cdeccdb1309e8f8e477af4b, 0x633fec31a36e9a52920637cefbb3a0, 0x0053b9 ] } , - BigNum { limbs: [ 0xfd6d39831f8f23ecf617061b8850b6, 0x44133d6bd9d998e74601d1d2dc51b2, 0x002034 ] } , - BigNum { limbs: [ 0xb83acfc8e1fc9f12f727121ee0964a, 0x4d4c275307f975b7d7ce0cb29b36bc, 0x0017fa ] } , - BigNum { limbs: [ 0x056933371c5f5fed08d8ece11f69b7, 0x5a07024a754ebd820039fcef3cce97, 0x005bf3 ] } , - BigNum { limbs: [ 0x59be7af6c293cfd283f3b304941cef, 0x20f7ffe182d1e66aa095c3e85fc919, 0x0072b6 ] } , - BigNum { limbs: [ 0x63e588093bc82f2d7c0c4bfb6be312, 0x865b29bbfa764ccf377245b9783c3a, 0x000137 ] } , - BigNum { limbs: [ 0x03249c8429f87e6844532496014769, 0xf040e1fdfca4b40f89ddd68b08bfde, 0x000116 ] } , - BigNum { limbs: [ 0xba7f667bd4638097bbacda69feb898, 0xb712479f80a37f2a4e2a3316cf4575, 0x0072d6 ] } , - BigNum { limbs: [ 0x9356da41aa6f8f02e7836bb3ab600d, 0x64c674e3478a1a81fdfbfaf9e23819, 0x00690f ] } , - BigNum { limbs: [ 0x2a4d28be53ec6ffd187c934c549ff4, 0x428cb4ba35be18b7da0c0ea7f5cd3a, 0x000ade ] } , - BigNum { limbs: [ 0xcf83fe0ae1e6a534ea9661ff26117d, 0xfe13068acf76d38555ddf2b6be9f66, 0x005e47 ] } , - BigNum { limbs: [ 0xee2004f51c7559cb15699d00d9ee84, 0xa9402312add15fb4822a16eb1965ec, 0x0015a5 ] } , - BigNum { limbs: [ 0xad1740d605853de7454aa702a3c258, 0x76c88e274f02c447c149769ccad950, 0x0000a0 ] } , - BigNum { limbs: [ 0x108cc229f8d6c118bab557fd5c3da9, 0x308a9b762e456ef216be93050d2c03, 0x00734d ] } , - BigNum { limbs: [ 0xaec3d9a57ccd3297472f2054fecfd5, 0xb9661959f10d1a81eafd4497a5304a, 0x0054dd ] } , - BigNum { limbs: [ 0x0ee0295a818ecc68b8d0deab01302c, 0xeded10438c3b18b7ed0ac50a32d509, 0x001f0f ] } , - BigNum { limbs: [ 0xd7652e15e99c4fa549c326bd5ec839, 0x7e6d3b984ce333a79fcc2c033c1a9e, 0x0029e0 ] } , - BigNum { limbs: [ 0xe63ed4ea14bfaf5ab63cd842a137c8, 0x28e5ee053064ff92383bdd9e9beab4, 0x004a0d ] } , - BigNum { limbs: [ 0x4c88ff93efa64a2f0a407c5295fb98, 0xfac010dea4409740b7a0a0fd537819, 0x005882 ] } , - BigNum { limbs: [ 0x711b036c0eb5b4d0f5bf82ad6a0469, 0xac9318bed9079bf9206768a4848d3a, 0x001b6a ] } , - BigNum { limbs: [ 0x5e84d56af0f9ca4f7f8d52f0dc3992, 0x3119b933616cdbe1801187d7696ce6, 0x001772 ] } , - BigNum { limbs: [ 0x5f1f2d950d6234b08072ac0f23c66f, 0x7639706a1bdb575857f681ca6e986d, 0x005c7b ] } , - BigNum { limbs: [ 0x1f60d0941e92cd6a0c566da29d6b4e, 0x36ed69e2548982af2ca67090f30a51, 0x0007ca ] } , - BigNum { limbs: [ 0x9e43326bdfc93195f3a9915d6294b3, 0x7065bfbb28beb08aab619910e4fb02, 0x006c23 ] } , - BigNum { limbs: [ 0xe983b035dd777461db389f0c72ef67, 0xaaa63a9561e15c725eab59b885b4dc, 0x000a23 ] } , - BigNum { limbs: [ 0xd42052ca20e48a9e24c75ff38d109a, 0xfcacef081b66d6c7795cafe9525076, 0x0069c9 ] } , - BigNum { limbs: [ 0x1026bb7cc4a92cb1a5916f0c03c77e, 0x52872cea0502fba135f7b61b767f8b, 0x00673d ] } , - BigNum { limbs: [ 0xad7d478339b2d24e5a6e8ff3fc3883, 0x54cbfcb378453798a21053866185c8, 0x000cb0 ] } , - BigNum { limbs: [ 0xcc96ca4f8ddbb2b42b0658a8edfb6b, 0x43de3052b6648a3783538c1c28ad2f, 0x005c9c ] } , - BigNum { limbs: [ 0xf10d38b070804c4bd4f9a657120496, 0x6374f94ac6e3a90254b47d85af5823, 0x001751 ] } , - BigNum { limbs: [ 0xf152a3c0f1c231ff49725a1870375c, 0xf7d3c4edc935ffc2941254837a46d2, 0x006b82 ] } , - BigNum { limbs: [ 0xcc515f3f0c99cd00b68da4e78fc8a5, 0xaf7f64afb412337743f5b51e5dbe80, 0x00086a ] } , - BigNum { limbs: [ 0x9f913cac2cc77977ee6e82bfd3a1f9, 0xad1a0314eff2961eaed1c485488a76, 0x00706e ] } , - BigNum { limbs: [ 0x1e12c653d194858811917c402c5e08, 0xfa3926888d559d1b2936451c8f7add, 0x00037e ] } , - BigNum { limbs: [ 0x2ae97a5238177d86f50a21463dd536, 0x89498b4a364c53f06d7099b29ccb04, 0x004723 ] } , - BigNum { limbs: [ 0x92ba88adc64481790af5ddb9c22acb, 0x1e099e5346fbdf496a976fef3b3a4f, 0x002cca ] } , - BigNum { limbs: [ 0xb3b215b2a1cb8a7d5e2afb958221be, 0xa16e424912fc4b00c302811881c325, 0x0021e9 ] } , - BigNum { limbs: [ 0x09f1ed4d5c907482a1d5036a7dde43, 0x05e4e7546a4be8391505888956422e, 0x005204 ] } , - BigNum { limbs: [ 0x4e85ecd63f5c377a6298c0d8230e4f, 0x740ddd00e10d2b0611c4592c433219, 0x0062fa ] } , - BigNum { limbs: [ 0x6f1e1629beffc7859d673e27dcf1b2, 0x33454c9c9c3b0833c643b07594d33a, 0x0010f3 ] } , - BigNum { limbs: [ 0xe9678b025e60f28b161ada6afe9538, 0xf7a59a09cbe80551530ffb9aa031dd, 0x0027b8 ] } , - BigNum { limbs: [ 0xd43c77fd9ffb0c74e9e52495016ac9, 0xafad8f93b1602de884f80e0737d375, 0x004c34 ] } , - BigNum { limbs: [ 0x7ff15c409eef5bc3a92ef2ca3fd8cc, 0xfb4c9980bb944a5586179e02d5dc88, 0x004869 ] } , - BigNum { limbs: [ 0x3db2a6bf5f6ca33c56d10c35c02735, 0xac06901cc1b3e8e451f06b9f0228cb, 0x002b83 ] } , - BigNum { limbs: [ 0x85709d15b42a3e0c14b9b4139f47cc, 0xb392702c989dd317c3b03bc4cc00cc, 0x006104 ] } , - BigNum { limbs: [ 0x383365ea4a31c0f3eb464aec60b835, 0xf3c0b970e4aa60221457cddd0c0487, 0x0012e8 ] } , - BigNum { limbs: [ 0xd0d4498d8b5ced307b71c0af325c62, 0x9d954e4bc32d2071129882629c2840, 0x00278e ] } , - BigNum { limbs: [ 0xeccfb97272ff11cf848e3e50cda39f, 0x09bddb51ba1b12c8c56f873f3bdd12, 0x004c5f ] } , - BigNum { limbs: [ 0x525b7e8ba1b24d98d86a7929758ccd, 0x15da7d5d01b023f671701bbd40ca3b, 0x006b5e ] } , - BigNum { limbs: [ 0x6b4884745ca9b167279585d68a7334, 0x9178ac407b980f436697ede4973b18, 0x00088f ] } , - BigNum { limbs: [ 0x908e545d34e2793c0867a94b248b6c, 0x7d213aed98fd4b3905264a3e4317e5, 0x006bcc ] } , - BigNum { limbs: [ 0x2d15aea2c97985c3f79855b4db7495, 0x2a31eeafe44ae800d2e1bf6394ed6e, 0x000821 ] } , - BigNum { limbs: [ 0xc94cff0b73a8b9be2ad0a5f63874ba, 0xed38e13513aa7562ef27c3910418f9, 0x0056f9 ] } , - BigNum { limbs: [ 0xf45703f48ab34541d52f5909c78b47, 0xba1a4868699dbdd6e8e04610d3ec59, 0x001cf3 ] } , - BigNum { limbs: [ 0x36fe219d2f1ca32551d25163a57d86, 0xa592c8e79d78eb4ed97a2ea201b711, 0x002f18 ] } , - BigNum { limbs: [ 0x86a5e162cf3f5bdaae2dad9c5a827b, 0x01c060b5dfcf47eafe8ddaffd64e42, 0x0044d5 ] } , - BigNum { limbs: [ 0xa4784e5cefc9be2e1b980e4cafe433, 0x577770c381e5cbe1a229495b4b99c7, 0x0042db ] } , - BigNum { limbs: [ 0x192bb4a30e9240d1e467f0b3501bce, 0x4fdbb8d9fb62675835dec0468c6b8c, 0x003112 ] } , - BigNum { limbs: [ 0xb3c2c92942824865084a31ecb924fa, 0x2a1ecf656d32a30763627a6886702e, 0x001c62 ] } , - BigNum { limbs: [ 0x09e139d6bbd9b69af7b5cd1346db07, 0x7d345a381015903274a58f39519525, 0x00578b ] } , - BigNum { limbs: [ 0x3d902f03551049f127d7c393e202c0, 0xf9cfd3370d6c944417a9fc1f8cfeb5, 0x00056b ] } , - BigNum { limbs: [ 0x8013d3fca94bb50ed8283b6c1dfd41, 0xad8356666fdb9ef5c05e0d824b069e, 0x006e81 ] } , - BigNum { limbs: [ 0x4ba5d295058ca307a2b4097373ef5a, 0x85b55ab26d8ac390432f293555e2ba, 0x001d20 ] } , - BigNum { limbs: [ 0x71fe306af8cf5bf85d4bf58c8c10a7, 0x219dceeb0fbd6fa994d8e06c822299, 0x0056cd ] } , - BigNum { limbs: [ 0xc2c4351645ca60d00d8e28e597ebb9, 0x937f818d465e2b8a21cbde1084c7d2, 0x0019b8 ] } , - BigNum { limbs: [ 0xfadfcde9b8919e2ff271d61a681448, 0x13d3a81036ea07afb63c2b91533d80, 0x005a35 ] } , - BigNum { limbs: [ 0x449d265c117b30c24ac967f93d8b01, 0xb6bfa3edb16c0360158fd6702a37e9, 0x00141f ] } , - BigNum { limbs: [ 0x7906dca3ece0ce3db5369706c27500, 0xf09385afcbdc2fd9c2783331adcd6a, 0x005fcd ] } , - BigNum { limbs: [ 0x3651759b44053677b99f0eca393e84, 0xa01b180d7fc3a4c3b9f74a56ca0543, 0x00077b ] } , - BigNum { limbs: [ 0x87528d64ba56c8884660f035c6c17d, 0x0738118ffd848e761e10bf4b0e0010, 0x006c72 ] } , - BigNum { limbs: [ 0x5c324df87197f007401cd383ea6433, 0x19ddb92d997b13b0e0ff9f159f428e, 0x006b23 ] } , - BigNum { limbs: [ 0x6171b5078cc40ef8bfe32b7c159bce, 0x8d75706fe3cd1f88f7086a8c38c2c5, 0x0008ca ] } , - BigNum { limbs: [ 0xa3ed8c7d553c366294367b3eef0647, 0x6b11dbd832ff1fb4c9583417520f25, 0x0008b2 ] } , - BigNum { limbs: [ 0x19b67682a91fc89d6bc983c110f9ba, 0x3c414dc54a4913850eafd58a85f62e, 0x006b3b ] } , - BigNum { limbs: [ 0x9f779c216532e9654dff9acfc27353, 0xbb20340e48cb13a9b86723f41d63bd, 0x002365 ] } , - BigNum { limbs: [ 0x1e2c66de9929159ab20064303d8cae, 0xec32f58f347d1f901fa0e5adbaa196, 0x005087 ] } , - BigNum { limbs: [ 0x4badbde5b349d3512f0d5b5d19ba24, 0x6365555433d7803a1a95d55fc37552, 0x004e56 ] } , - BigNum { limbs: [ 0x71f6451a4b122baed0f2a3a2e645dd, 0x43edd4494970b2ffbd723442149001, 0x002597 ] } , - BigNum { limbs: [ 0x0acf4a881882c49d95b848783baff6, 0x6ef4daa39a3398ecd2bc6003abf49e, 0x004b0e ] } , - BigNum { limbs: [ 0xb2d4b877e5d93a626a47b687c4500b, 0x385e4ef9e3149a4d054ba99e2c10b5, 0x0028df ] } , - BigNum { limbs: [ 0xff7db1e208ca5762d37d2f50142c1d, 0x1798ccc9781075e48186a0f936f2f9, 0x00655b ] } , - BigNum { limbs: [ 0xbe26511df591a79d2c82cfafebd3e4, 0x8fba5cd40537bd55568168a8a11259, 0x000e92 ] } , - BigNum { limbs: [ 0xe4385aa59379304eb87f06f3052074, 0xb8a802a174ea379ba1457efc2e2881, 0x0011f9 ] } , - BigNum { limbs: [ 0xd96ba85a6ae2ceb14780f80cfadf8d, 0xeeab26fc085dfb9e36c28aa5a9dcd1, 0x0061f3 ] } , - BigNum { limbs: [ 0xec510028ee108633efbda071957818, 0x8ee91d8b9f540e171f160493e14fee, 0x0003a1 ] } , - BigNum { limbs: [ 0xd15302d7104b78cc10425e8e6a87e9, 0x186a0c11ddf42522b8f2050df6b564, 0x00704c ] } , - BigNum { limbs: [ 0xa7bbb5ec527557ba4fa14e54bbedf6, 0x417cb0e82b9ffd191ef6acc3e59f9d, 0x000c5e ] } , - BigNum { limbs: [ 0x15e84d13abe6a745b05eb0ab44120b, 0x65d678b551a83620b9115cddf265b6, 0x00678f ] } , - BigNum { limbs: [ 0xc024153f96227a1683c9b2579ec673, 0x898d8eda40f85e2f7f8a626b1f2011, 0x0035fc ] } , - BigNum { limbs: [ 0xfd7fedc0683984e97c364ca861398e, 0x1dc59ac33c4fd50a587da736b8e541, 0x003df1 ] } , - BigNum { limbs: [ 0xe952a25430c3b9c15e92b69fb876f2, 0x4d58a5b97c0d1ffa0fefe7651f7418, 0x004a57 ] } , - BigNum { limbs: [ 0xd45160abcd98453ea16d486047890f, 0x59fa83e4013b133fc818223cb8913a, 0x002996 ] } , - BigNum { limbs: [ 0xc16e47ee9344e623a5a02af7352846, 0x1570af1eaed89534129c442b9b50b0, 0x0039b2 ] } , - BigNum { limbs: [ 0xfc35bb116b1718dc5a5fd408cad7bb, 0x91e27a7ece6f9e05c56bc5763cb4a2, 0x003a3b ] } , - BigNum { limbs: [ 0xc9ff6bc17ee0c0300dcd481613376a, 0xf4786d303126047688651a184c8190, 0x003750 ] } , - BigNum { limbs: [ 0xf3a4973e7f7b3ecff232b6e9ecc897, 0xb2dabc6d4c222ec34fa2ef898b83c2, 0x003c9c ] } , - BigNum { limbs: [ 0xe47938602798ee2feabcab1eb5c580, 0x8bd6fa1e279cd00145595a25cf22fa, 0x000af4 ] } , - BigNum { limbs: [ 0xd92aca9fd6c310d0154353e14a3a81, 0x1b7c2f7f55ab633892aeaf7c08e258, 0x0068f9 ] } , - BigNum { limbs: [ 0x82450dbe073be8162efe65f1c2b990, 0xe506ed3420bd548b26494c5a621e78, 0x002335 ] } , - BigNum { limbs: [ 0x3b5ef541f72016e9d101990e3d4671, 0xc24c3c695c8adeaeb1bebd4775e6db, 0x0050b7 ] } , - BigNum { limbs: [ 0x1a903d8f52d2a90dff66838d9c7fbd, 0x8a08974d8c1bf1ec877e19a187e39b, 0x004c87 ] } , - BigNum { limbs: [ 0xa313c570ab8955f200997b72638044, 0x1d4a924ff12c414d5089f0005021b8, 0x002766 ] } , - BigNum { limbs: [ 0x96c3746709260726d987fa9e3bbed3, 0xa27be85055e8b203921cd6971c63e4, 0x004e25 ] } , - BigNum { limbs: [ 0x26e08e98f535f7d926780461c4412e, 0x04d7414d275f813645eb330abba16f, 0x0025c8 ] } , - BigNum { limbs: [ 0xbdee817f227e486819b9b9795c3e0f, 0x00154a61744cbb7789c88db15913ad, 0x000d03 ] } , - BigNum { limbs: [ 0xffb58180dbddb697e6464586a3c1f2, 0xa73ddf3c08fb77c24e3f7bf07ef1a5, 0x0066ea ] } , - BigNum { limbs: [ 0x07a6e79adda5afa3109ba77f2518c7, 0x867bd40a744e3d649126de0af18e82, 0x0063ea ] } , - BigNum { limbs: [ 0xb5fd1b6520b64f5cef645780dae73a, 0x20d7559308f9f5d546e12b96e676d1, 0x001003 ] } , - BigNum { limbs: [ 0x5b78d7ad57b0f38547116436757283, 0xfdd66062acb5a269327c0efa5e5c8c, 0x004514 ] } , - BigNum { limbs: [ 0x622b2b52a6ab0b7ab8ee9ac98a8d7e, 0xa97cc93ad09290d0a58bfaa779a8c7, 0x002ed8 ] } , - BigNum { limbs: [ 0xa56f61a006515a17be1566d99a7483, 0x4f501ad75aad02dac68288140c42da, 0x0043c5 ] } , - BigNum { limbs: [ 0x1834a15ff80aa4e841ea9826658b7e, 0x58030ec6229b305f1185818dcbc279, 0x003028 ] } , - BigNum { limbs: [ 0x065584e021791f1391419338a0badc, 0xe82a30c630237655b39804b4c4a0e3, 0x003951 ] } , - BigNum { limbs: [ 0xb74e7e1fdce2dfec6ebe6bc75f4525, 0xbf28f8d74d24bce4247004ed136470, 0x003a9b ] } , - BigNum { limbs: [ 0xf92ae474cef12d5145aca500592c77, 0x9d1eaf1c0b155b90729187a8961bf7, 0x000c7c ] } , - BigNum { limbs: [ 0xc4791e8b2f6ad1aeba5359ffa6d38a, 0x0a347a817232d7a9657681f941e95b, 0x006771 ] } , - BigNum { limbs: [ 0x97eb526090f342f807dc397d6d14ee, 0x13ef0677dcd750c7a1520e76702560, 0x00627c ] } , - BigNum { limbs: [ 0x25b8b09f6d68bc07f823c58292eb13, 0x93642325a070e27236b5fb2b67dff3, 0x001171 ] } , - BigNum { limbs: [ 0x94ea7f998e3036d6bed2498a5d8638, 0x448b1d5cbea6dfc72166834e512278, 0x003922 ] } , - BigNum { limbs: [ 0x28b98366702bc829412db575a279c9, 0x62c80c40bea15372b6a1865386e2db, 0x003acb ] } , - BigNum { limbs: [ 0xff614331a1c5ee416c0cec37d6d1e3, 0x358697a1948bdde939ccba7d1a0b56, 0x006912 ] } , - BigNum { limbs: [ 0xbe42bfce5c9610be93f312c8292e1e, 0x71cc91fbe8bc55509e3b4f24bdf9fc, 0x000adb ] } , - BigNum { limbs: [ 0xf453443751352cd5ec27c20801dd0c, 0xe39b16faf7c46cc7ac221e46db195c, 0x005428 ] } , - BigNum { limbs: [ 0xc950bec8ad26d22a13d83cf7fe22f5, 0xc3b812a28583c6722be5eb5afcebf6, 0x001fc4 ] } , - BigNum { limbs: [ 0x55db26760dbddac00db50a8b455478, 0xd94bd5ed9311a8d9ff5e4d8aea5817, 0x001b03 ] } , - BigNum { limbs: [ 0x67c8dc89f09e243ff24af474baab89, 0xce0753afea368a5fd8a9bc16edad3c, 0x0058e9 ] } , - BigNum { limbs: [ 0x49b65c7d1fed03f5b384a538296000, 0x7c3942fa7cfd9aed68d099c5eb4e62, 0x006288 ] } , - BigNum { limbs: [ 0x73eda682de6efb0a4c7b59c7d6a001, 0x2b19e6a3004a984c6f376fdbecb6f1, 0x001165 ] } , - BigNum { limbs: [ 0x3a5b42deb5e4c1b66d42eea88ef658, 0xd75572234819e092ac4898119b265f, 0x0020b2 ] } , - BigNum { limbs: [ 0x8348c02148773d4992bd10577109a9, 0xcffdb77a352e52a72bbf71903cdef4, 0x00533a ] } , - BigNum { limbs: [ 0x9789fe6f5e6d87ec21011e1910e3f6, 0xddfe267b290a0c6b6dbfa5a338e877, 0x0062a3 ] } , - BigNum { limbs: [ 0x261a04909fee7713defee0e6ef1c0b, 0xc9550322543e26ce6a4863fe9f1cdc, 0x001149 ] } , - BigNum { limbs: [ 0x4759df07c81cf588e130df905786d7, 0xe1eeb4fc8bcd8ed5ffac85a790ec7a, 0x000af2 ] } , - BigNum { limbs: [ 0x764a23f8363f09771ecf1f6fa8792a, 0xc56474a0f17aa463d85b83fa4718d9, 0x0068fa ] } , - BigNum { limbs: [ 0x5186929cb753ce8a84298fd3ddf34c, 0xba25714e3e69008fab821a3ee08d64, 0x006086 ] } , - BigNum { limbs: [ 0x6c1d7063470830757bd66f2c220cb5, 0xed2db84f3edf32aa2c85ef62f777ef, 0x001366 ] } , - BigNum { limbs: [ 0xe7a0348b8faec254f0afb89d963fea, 0x64ab3a29297f3027fbcec0f933fe6b, 0x003eee ] } , - BigNum { limbs: [ 0xd603ce746ead3cab0f50466269c017, 0x42a7ef7453c90311dc3948a8a406e7, 0x0034ff ] } , - BigNum { limbs: [ 0x3b845b65ff13ce04b81c740d89cb54, 0xd4ceaa3502758601997f45fa4a4b00, 0x0049b8 ] } , - BigNum { limbs: [ 0x821fa799ff4830fb47e38af27634ad, 0xd2847f687ad2ad383e88c3a78dba53, 0x002a34 ] } , - BigNum { limbs: [ 0xe365db905d5bbf2f11ec355270b1d7, 0x6c686f4d606c07c39a15c300ab83e5, 0x004b5f ] } , - BigNum { limbs: [ 0xda3e276fa1003fd0ee13c9ad8f4e2a, 0x3aeaba501cdc2b763df246a12c816d, 0x00288e ] } , - BigNum { limbs: [ 0xe2d540a29e52cd9cab5805fc609431, 0xba317c9334f608b7a43373d7cd3962, 0x006450 ] } , - BigNum { limbs: [ 0xdacec25d6009316354a7f9039f6bd0, 0xed21ad0a48522a8233d495ca0acbf0, 0x000f9c ] } , - BigNum { limbs: [ 0x2b493a84dfb36896b6a5c9464cd413, 0x24db15ec7c17375f6988a630da2245, 0x006eb6 ] } , - BigNum { limbs: [ 0x925ac87b1ea89669495a35b9b32bee, 0x827813b10130fbda6e7f6370fde30e, 0x000537 ] } , - BigNum { limbs: [ 0x9b4d224b0528c83d046a082716bcad, 0x86515fbcd4407b19ef363b2e531257, 0x002064 ] } , - BigNum { limbs: [ 0x2256e0b4f93336c2fb95f6d8e94354, 0x2101c9e0a907b81fe8d1ce7384f2fc, 0x005389 ] } , - BigNum { limbs: [ 0xeb12eb2761d20c77841793f2e1f3bd, 0xf7216cd9a914d05c53c86f28bcf1f1, 0x00683d ] } , - BigNum { limbs: [ 0xd29117d89c89f2887be86b0d1e0c44, 0xb031bcc3d43362dd843f9a791b1361, 0x000baf ] } , - BigNum { limbs: [ 0x8beb6ddae7129a65bf313b1012d3c3, 0x6543cac258cb9e754890fcc1363893, 0x003e2d ] } , - BigNum { limbs: [ 0x31b895251749649a40cec3efed2c3e, 0x420f5edb247c94c48f770ce0a1ccc0, 0x0035c0 ] } , - BigNum { limbs: [ 0xedd3f0704fcd8f277505ba720effe1, 0xa8a8ede82d0fb1e20890ceda6f1723, 0x0043a3 ] } , - BigNum { limbs: [ 0xcfd0128fae8e6fd88afa448df10020, 0xfeaa3bb550388157cf773ac768ee2f, 0x003049 ] } , - BigNum { limbs: [ 0xd1ce9ac4ad54c9e879678fda473b16, 0xae4c1953da0602d3749c19fa0c5093, 0x0056cb ] } , - BigNum { limbs: [ 0xebd5683b5107351786986f25b8c4eb, 0xf9071049a3423066636befa7cbb4bf, 0x001d21 ] } , - BigNum { limbs: [ 0xa589adcd54196cf6b1a5c2e3dca6d2, 0xfd08c1065f9bee4333f2689c749b27, 0x000dba ] } , - BigNum { limbs: [ 0x181a5532aa4292094e5a3c1c23592f, 0xaa4a68971dac44f6a415a105636a2c, 0x006632 ] } , - BigNum { limbs: [ 0x2f8dfa512822d59b3f666708cf6ab9, 0xd0072ac754cfe2a8f07114efb1bbae, 0x002c53 ] } , - BigNum { limbs: [ 0x8e1608aed6392964c09997f7309548, 0xd74bfed628785090e796f4b22649a5, 0x004799 ] } , - BigNum { limbs: [ 0xc31a16ae503a1dbb4d3aef9624f018, 0xe6e12b03a3ac400f72460d090590de, 0x004c37 ] } , - BigNum { limbs: [ 0xfa89ec51ae21e144b2c50f69db0fe9, 0xc071fe99d99bf32a65c1fc98d27474, 0x0027b5 ] } , - BigNum { limbs: [ 0x8cd6fdc62b7832b8bc7c0276b4eb5c, 0x0c57398282e4d2ba7b1aeab16b3187, 0x004445 ] } , - BigNum { limbs: [ 0x30cd0539d2e3cc474383fc894b14a5, 0x9afbf01afa63607f5ced1ef06cd3cc, 0x002fa8 ] } , - BigNum { limbs: [ 0x56f9dc800d97f131c91d435c7c321f, 0xe64eb0a6f68528607cdf9e439ef7d2, 0x00469d ] } , - BigNum { limbs: [ 0x66aa267ff0c40dce36e2bba383cde2, 0xc10478f686c30ad95b286b5e390d81, 0x002d4f ] } , - BigNum { limbs: [ 0x4b10df195a1e62c5f3a1fed8434f96, 0x7b876a5c766a1e9f60b772f6f9d3e6, 0x000afd ] } , - BigNum { limbs: [ 0x729323e6a43d9c3a0c5e0027bcb06b, 0x2bcbbf4106de149a775096aade316d, 0x0068f0 ] } , - BigNum { limbs: [ 0xfbd130f283c5b69e922efa201850aa, 0x6ccf34bf27600b6ce3857940d09152, 0x001f8c ] } , - BigNum { limbs: [ 0xc1d2d20d7a9648616dd104dfe7af57, 0x3a83f4de55e827ccf4829061077400, 0x005461 ] } , - BigNum { limbs: [ 0xa6a757eea27f2fa9af23aa807c2be1, 0x059ee3a1b642e96a613abae5c1d9bc, 0x005306 ] } , - BigNum { limbs: [ 0x16fcab115bdccf5650dc547f83d420, 0xa1b445fbc70549cf76cd4ebc162b97, 0x0020e7 ] } , - BigNum { limbs: [ 0xec67bec93ed7b8fcc288eadc69885e, 0xb2024f06f16a517e48c887951e3cc8, 0x004547 ] } , - BigNum { limbs: [ 0xd13c4436bf8446033d7714239677a3, 0xf550da968bdde1bb8f3f820cb9c88a, 0x002ea5 ] } , - BigNum { limbs: [ 0x2257110db62c1989285663ad98ee1f, 0x5151c6756d96e98d0ff23a9eb5a0ae, 0x0020d4 ] } , - BigNum { limbs: [ 0x9b4cf1f2482fe576d7a99b526711e2, 0x560163280fb149acc815cf032264a5, 0x005319 ] } , - BigNum { limbs: [ 0x0edb74177d38a4ad4cd59e471baa4d, 0x9e2545372c7b28f86f4786ee953296, 0x006cfe ] } , - BigNum { limbs: [ 0xaec88ee881235a52b32a60b8e455b4, 0x092de46650cd0a4168c082b342d2bd, 0x0006ef ] } , - BigNum { limbs: [ 0x412dab573abf941818f477fd67a800, 0x9584c239f193a789079521925a487d, 0x00439b ] } , - BigNum { limbs: [ 0x7c7657a8c39c6ae7e70b8702985801, 0x11ce67638bb48bb0d072e80f7dbcd6, 0x003052 ] } , - BigNum { limbs: [ 0x7f2231c95ebaaa709feba3bd78dc6b, 0xca0f0381c911ddb1b93891f3063039, 0x0057ce ] } , - BigNum { limbs: [ 0x3e81d1369fa1548f60145b42872396, 0xdd44261bb43655881ecf77aed1d51a, 0x001c1e ] } , - BigNum { limbs: [ 0xde10ef35c170a32825b20112cdd5e9, 0xcd1b39a42a351e4dedee0a80e57d26, 0x002bd5 ] } , - BigNum { limbs: [ 0xdf9313ca3ceb5bd7da4dfded322a18, 0xda37eff9531314ebea19ff20f2882c, 0x004817 ] } , - BigNum { limbs: [ 0xdd1684a82174337180d4984f1ebc40, 0x3177280da2870d25a01bec21dfa01e, 0x002abe ] } , - BigNum { limbs: [ 0xe08d7e57dce7cb8e7f2b66b0e143c1, 0x75dc018fdac1261437ec1d7ff86534, 0x00492f ] } , - BigNum { limbs: [ 0x3d7f2a56a5a89fc8a744a668a546f7, 0x302ac56ea9dfeb1198dd3db79ebe10, 0x000a71 ] } , - BigNum { limbs: [ 0x8024d8a958b35f3758bb58975ab90a, 0x7728642ed36848283f2acbea394743, 0x00697c ] } , - BigNum { limbs: [ 0x052f439346a8b05b12288d994b4771, 0xb9bad3328e426f695c45a377ddfd7e, 0x00682e ] } , - BigNum { limbs: [ 0xb874bf6cb7b34ea4edd77166b4b890, 0xed98566aef05c3d07bc26629fa07d5, 0x000bbe ] } , - BigNum { limbs: [ 0xba62b0c4e030ef1f583b87d6ade6f9, 0x014d6c8e9858d2bbd398ad664ee592, 0x002257 ] } , - BigNum { limbs: [ 0x0341523b1e2b0fe0a7c47729521908, 0xa605bd0ee4ef607e046f5c3b891fc1, 0x005196 ] } , - BigNum { limbs: [ 0x21e6561a1920b10c72391c8a1cc159, 0x16faab48860710a81440947ef47c01, 0x0003e6 ] } , - BigNum { limbs: [ 0x9bbdace5e53b4df38dc6e275e33ea8, 0x90587e54f7412291c3c77522e38952, 0x007007 ] } , - BigNum { limbs: [ 0x8aa947145e5a1fec90dd2dde7b5bef, 0x1560147bf3b782cd30aa038c9c0d6a, 0x00520e ] } , - BigNum { limbs: [ 0x32fabbeba001df136f22d12184a412, 0x91f315218990b06ca75e06153bf7e9, 0x0021df ] } , - BigNum { limbs: [ 0x29f6779cbe3cee50df9925dcf2a32c, 0x5c422ae049929893a83fe0e4945804, 0x006de1 ] } , - BigNum { limbs: [ 0x93ad8b63401f10af2066d9230d5cd5, 0x4b10febd33b59aa62fc828bd43ad4f, 0x00060c ] } , - BigNum { limbs: [ 0x1c29ca120a5e788da46467972393bf, 0x37a599bc3caad9f3d4cbc2d492945a, 0x006d29 ] } , - BigNum { limbs: [ 0xa17a38edf3fd86725b9b9768dc6c42, 0x6fad8fe1409d5946033c46cd4570f9, 0x0006c4 ] } , - BigNum { limbs: [ 0x8bdc93a30df3b872ba7cd748c22385, 0x0d6b5a03665f72c462365d4b3dd6b5, 0x0015a8 ] } , - BigNum { limbs: [ 0x31c76f5cf068468d458327b73ddc7c, 0x99e7cf9a16e8c07575d1ac569a2e9e, 0x005e45 ] } , - BigNum { limbs: [ 0x594d11234a23b7fd8eaaee8a4332e5, 0x6bbb0c03c90c1fc1bd3e89411619ec, 0x00539f ] } , - BigNum { limbs: [ 0x6456f1dcb438470271551075bccd1c, 0x3b981d99b43c13781ac98060c1eb67, 0x00204e ] } , - BigNum { limbs: [ 0xbe36f366cdac04fe33f22717ae9a38, 0x1bf270758c7cedda892c24b801fffa, 0x001fcf ] } , - BigNum { limbs: [ 0xff6d0f9930affa01cc0dd7e85165c9, 0x8b60b927f0cb455f4edbe4e9d60558, 0x00541e ] } , - BigNum { limbs: [ 0xa2bc16d1f444dd3d8631f87a66bd9b, 0xb86c4fe25686801afb3bb037c2a2a3, 0x006d81 ] } , - BigNum { limbs: [ 0x1ae7ec2e0a1721c279ce0685994266, 0xeee6d9bb26c1b31edccc596a1562b0, 0x00066b ] } , - BigNum { limbs: [ 0x429fc4b615dc88fbaeb3bdb102cf18, 0x62c9a6820e51c2d5d0d5ef27c7e4d5, 0x003b8b ] } , - BigNum { limbs: [ 0x7b043e49e87f7604514c414efd30e9, 0x4489831b6ef6706407321a7a10207e, 0x003862 ] } , - BigNum { limbs: [ 0xf771c7881bf39e9792c9e792201cec, 0xf49510f16df834c2564b0fa575d528, 0x000708 ] } , - BigNum { limbs: [ 0xc6323b77e26860686d36176ddfe315, 0xb2be18ac0f4ffe7781bcf9fc62302a, 0x006ce4 ] } , - BigNum { limbs: [ 0x032279af1aaeba30316f6a5cbe727c, 0xe71dd75bc2ecd64c8f0c367f618e97, 0x000c66 ] } , - BigNum { limbs: [ 0xba818950e3ad44cfce9094a3418d85, 0xc0355241ba5b5ced48fbd3227676bc, 0x006786 ] } , - BigNum { limbs: [ 0x95285f31f3aad9c2b862b5a29aa404, 0x4aebd7d15d91b9f6a3756239a7394f, 0x005c5c ] } , - BigNum { limbs: [ 0x287ba3ce0ab1253d479d495d655bfd, 0x5c6751cc1fb679433492a76830cc04, 0x001791 ] } , - BigNum { limbs: [ 0x5e256b68b3e8a4cd3a2a932e00323d, 0x168e51f06071676c71539cd85de38c, 0x001e97 ] } , - BigNum { limbs: [ 0x5f7e97974a735a32c5d56bd1ffcdc4, 0x90c4d7ad1cd6cbcd66b46cc97a21c7, 0x005556 ] } , - BigNum { limbs: [ 0x87e437986d307d92538c02aa2f6e16, 0xb672f7fb05252c5e0d6a5b267af071, 0x006080 ] } , - BigNum { limbs: [ 0x35bfcb67912b816dac73fc55d091eb, 0xf0e031a2782306dbca9dae7b5d14e2, 0x00136c ] } , - BigNum { limbs: [ 0x0c2482681b3eecc7d230d176d2502b, 0xd166744e9433dbc0ece48bd069c490, 0x005a31 ] } , - BigNum { limbs: [ 0xb17f8097e31d12382dcf2d892dafd6, 0xd5ecb54ee9145778eb237dd16e40c3, 0x0019bb ] } , - BigNum { limbs: [ 0x86b8b99e949a02a08d6542914ee68a, 0x2a3b847f9576527c4feb08776b8971, 0x001129 ] } , - BigNum { limbs: [ 0x36eb496169c1fc5f729abc6eb11977, 0x7d17a51de7d1e0bd881d012a6c7be2, 0x0062c4 ] } , - BigNum { limbs: [ 0x4dcb7d01ac2baaa6a808ecba9ac50b, 0x596e3a73a678b5b2804924315b5201, 0x002545 ] } , - BigNum { limbs: [ 0x6fd885fe5230545957f71245653af6, 0x4de4ef29d6cf7d8757bee5707cb352, 0x004ea8 ] } , - BigNum { limbs: [ 0xac76cc4049dd79650254e725ec2473, 0x0e33010313dbc8d859f57cc1de01fe, 0x005030 ] } , - BigNum { limbs: [ 0x112d36bfb47e859afdab17da13db8e, 0x9920289a696c6a617e128cdffa0355, 0x0023bd ] } , - BigNum { limbs: [ 0x998959ee6be9e2410139dd5d09fffd, 0xf17cbc4b985729a80acaddf2df26ce, 0x001503 ] } , - BigNum { limbs: [ 0x241aa91192721cbefec621a2f60004, 0xb5d66d51e4f10991cd3d2baef8de85, 0x005ee9 ] } , - BigNum { limbs: [ 0x71139ca7d67729c5bde460a2bdde47, 0x104a66cf8ad94927833498c5a6b856, 0x002bf7 ] } , - BigNum { limbs: [ 0x4c90665827e4d53a421b9e5d4221ba, 0x9708c2cdf26eea1254d370dc314cfd, 0x0047f6 ] } , - BigNum { limbs: [ 0x8b90011d36f27ab1f8b0fada34ec97, 0xa849a2a72f072104cea55f96f8dc55, 0x0036a4 ] } , - BigNum { limbs: [ 0x321401e2c769844e074f0425cb136a, 0xff0986f64e4112350962aa0adf28fe, 0x003d48 ] } , - BigNum { limbs: [ 0xefe96b3eb765c50b865660e5468565, 0xdc08604089a07e4077bf84d06c3ecf, 0x007390 ] } , - BigNum { limbs: [ 0xcdba97c146f639f479a99e1ab97a9c, 0xcb4ac95cf3a7b4f9604884d16bc683, 0x00005c ] } , - BigNum { limbs: [ 0xdefcb7f945a2551e66a066094d7636, 0x02f3870607e14fa3bbdd211d8337d4, 0x004421 ] } , - BigNum { limbs: [ 0xdea74b06b8b9a9e1995f98f6b289cb, 0xa45fa2977566e3961c2ae88454cd7e, 0x002fcc ] } , - BigNum { limbs: [ 0x5822b64e0b9b26373a682660761944, 0xa7eef5328e8818fe26781cf3ff9137, 0x001c36 ] } , - BigNum { limbs: [ 0x65814cb1f2c0d8c8c597d89f89e6bd, 0xff64346aeec01a3bb18fecadd8741c, 0x0057b6 ] } , - BigNum { limbs: [ 0xfb335a0dcf92b2fc5c7a8d9430e9cb, 0xa76183551e88d8097dcb514c5654dd, 0x005f25 ] } , - BigNum { limbs: [ 0xc270a8f22ec94c03a385716bcf1636, 0xfff1a6485ebf5b305a3cb85581b075, 0x0014c7 ] } , - BigNum { limbs: [ 0x31363172d494c26fb839a9faf8188e, 0x2c9f639a3a5ab566a93088cd7eb1c4, 0x006c1a ] } , - BigNum { limbs: [ 0x8c6dd18d29c73c9047c6550507e773, 0x7ab3c60342ed7dd32ed780d459538f, 0x0007d3 ] } , - BigNum { limbs: [ 0xaa1c87567b5903e83915b2035faea7, 0x57b15ac7081ca9b60f8f2c9fb54863, 0x0048b0 ] } , - BigNum { limbs: [ 0x13877ba98302fb17c6ea4cfca0515a, 0x4fa1ced6752b8983c878dd0222bcf0, 0x002b3d ] } , - BigNum { limbs: [ 0xafbb716bbc387cca1310530cc044fa, 0x5601643b2882d8a0074dfb20e2d164, 0x00211f ] } , - BigNum { limbs: [ 0x0de8919442238235ecefabf33fbb07, 0x5151c56254c55a99d0ba0e80f533ef, 0x0052ce ] } , - BigNum { limbs: [ 0x10e1a8f2f64bf41a2ef73c66cbb7c6, 0x8f02f37c8d2455ee9f580df9527030, 0x00173a ] } , - BigNum { limbs: [ 0xacc25a0d08100ae5d108c29934483b, 0x18503620f023dd4b38affba8859523, 0x005cb3 ] } , - BigNum { limbs: [ 0xa6122f655c997c2d3f94e98ca49bbb, 0xde0653949e912e81c1c7698c577526, 0x00143d ] } , - BigNum { limbs: [ 0x1791d39aa1c282d2c06b15735b6446, 0xc94cd608deb704b81640a01580902d, 0x005faf ] } , - BigNum { limbs: [ 0x1124d405bf7aabdf8d55151ef4f9ec, 0xc3c3bed53d882ad9387c916f12854a, 0x002055 ] } , - BigNum { limbs: [ 0xac7f2efa3ee1532072aae9e10b0615, 0xe38f6ac83fc008609f8b7832c58009, 0x005397 ] } , - BigNum { limbs: [ 0x2c74299a10e7c95e09090a764f6390, 0xbfebc2782a92610f3e639653fe3c1c, 0x006efc ] } , - BigNum { limbs: [ 0x912fd965ed7435a1f6f6f489b09c71, 0xe767672552b5d22a99a4734dd9c937, 0x0004f0 ] } , - BigNum { limbs: [ 0x886bbc04a47c4088112f52fe2c4432, 0x3dfdc5b94c147f938adf9e252d8003, 0x006eef ] } , - BigNum { limbs: [ 0x353846fb59dfbe77eed0ac01d3bbcf, 0x695563e43133b3a64d286b7caa8550, 0x0004fe ] } , - BigNum { limbs: [ 0xbd0f5c286ae03a2c5fd0ee29a61068, 0x4b0ce3eea8ca794fdc040507aba85a, 0x003012 ] } , - BigNum { limbs: [ 0x0094a6d7937bc4d3a02f10d659ef99, 0x5c4645aed47db9e9fc04049a2c5cf9, 0x0043db ] } , - BigNum { limbs: [ 0x36b7edd690eb355bbdd1528660c72d, 0x4bd9de921697a1e738e2f329ab8e0b, 0x001152 ] } , - BigNum { limbs: [ 0x86ec15296d70c9a4422eac799f38d4, 0x5b794b0b66b091529f2516782c7748, 0x00629b ] } , - BigNum { limbs: [ 0xd72ad65f46d726783ee4e9030b121d, 0x4f5a2a19f612bc5b54bb9d04899f77, 0x0032ec ] } , - BigNum { limbs: [ 0xe6792ca0b784d887c11b15fcf4ede4, 0x57f8ff83873576de834c6c9d4e65db, 0x004101 ] } , - BigNum { limbs: [ 0xc38dc29ee64919bd5b0d2da1fdb04f, 0xadda3175e8ed6509386b35e64b9e42, 0x005508 ] } , - BigNum { limbs: [ 0xfa1640611812e542a4f2d15e024fb2, 0xf978f827945ace309f9cd3bb8c6710, 0x001ee4 ] } , - BigNum { limbs: [ 0x8e7c5ddb1443d706f0db8c7121f9f3, 0x81191b6befa46edbc381958375eb7d, 0x001666 ] } , - BigNum { limbs: [ 0x2f27a524ea1827f90f24728ede060e, 0x263a0e318da3c45e1486741e6219d6, 0x005d87 ] } , - BigNum { limbs: [ 0x362129fcf80f3a0c35fe1ecc54fea6, 0x7330eb7307e28a976c40c41df52101, 0x00446d ] } , - BigNum { limbs: [ 0x8782d903064cc4f3ca01e033ab015b, 0x34223e2a7565a8a26bc74583e2e452, 0x002f80 ] } , - BigNum { limbs: [ 0x896469b6669563c15ccddff613e6c3, 0x5ad7346c2a74d501f59804e685491d, 0x0045ad ] } , - BigNum { limbs: [ 0x343f994997c69b3ea3321f09ec193e, 0x4c7bf53152d35e37e27004bb52bc36, 0x002e40 ] } , - BigNum { limbs: [ 0x71eca35d5272bc11b2b030ee121117, 0xac36dbd7d8ed6f40d43527acf89d16, 0x004c3a ] } , - BigNum { limbs: [ 0x4bb75fa2abe942ee4d4fce11edeeea, 0xfb1c4dc5a45ac3f903d2e1f4df683d, 0x0027b2 ] } , - BigNum { limbs: [ 0x02b20f5415c8edfd3888c1a912f735, 0x7dd6b49f8d01590557dbc7ff3a72c5, 0x007263 ] } , - BigNum { limbs: [ 0xbaf1f3abe8931102c7773d56ed08cc, 0x297c74fdf046da34802c41a29d928e, 0x00018a ] } , - BigNum { limbs: [ 0x07af22564f84f8f83aecc92580b8aa, 0x5a42aef9c0269ffb74496a8aa8d45f, 0x004f6e ] } , - BigNum { limbs: [ 0xb5f4e0a9aed70607c51335da7f4757, 0x4d107aa3bd21933e63be9f172f30f4, 0x00247f ] } , - BigNum { limbs: [ 0x9c70269bbd114690350f4e3f8df6a5, 0x89e17d7aec42fb14952aba78db9462, 0x0017ca ] } , - BigNum { limbs: [ 0x2133dc64414ab86fcaf0b0c072095c, 0x1d71ac229105382542dd4f28fc70f1, 0x005c23 ] } , - BigNum { limbs: [ 0x5984f698b67a4f84e0147535fc4cc7, 0x9fb480cf1962424ccc9781abb5d4bd, 0x005cc5 ] } , - BigNum { limbs: [ 0x641f0c6747e1af7b1feb89ca03b33a, 0x079ea8ce63e5f0ed0b7087f6223096, 0x001728 ] } , - BigNum { limbs: [ 0xcc3eb7bca53cba14e4436934073cf8, 0xa29cc0a9b176bab082cf14139ca439, 0x000be1 ] } , - BigNum { limbs: [ 0xf1654b43591f44eb1bbc95cbf8c309, 0x04b668f3cbd178895538f58e3b6119, 0x00680c ] } , - BigNum { limbs: [ 0x577ec3fec64b94ffa0768034358069, 0x2f0427377bf2559ffc5a62719e22db, 0x001c74 ] } , - BigNum { limbs: [ 0x66253f0138106a005f897ecbca7f98, 0x784f02660155dd99dbada73039e278, 0x005779 ] } , - BigNum { limbs: [ 0x336422fb2484bea951fae8db934564, 0x8cfc63f4ce5809a7f4331ef665f6ff, 0x002060 ] } , - BigNum { limbs: [ 0x8a3fe004d9d74056ae0516246cba9d, 0x1a56c5a8aef02991e3d4eaab720e54, 0x00538d ] } , - BigNum { limbs: [ 0x2fee58775d07250cdf6a3a35ecf57f, 0x5f739bcb6b817b150a3d799a20a549, 0x001e1e ] } , - BigNum { limbs: [ 0x8db5aa88a154d9f32095c4ca130a82, 0x47df8dd211c6b824cdca9007b7600a, 0x0055cf ] } , - BigNum { limbs: [ 0xacd165ded9ee4bee85bd9f44eadafc, 0x8c66cae96230cc8ca46d95273f8560, 0x0043aa ] } , - BigNum { limbs: [ 0x10d29d21246db3117a425fbb152505, 0x1aec5eb41b1766ad339a747a987ff3, 0x003043 ] } , - BigNum { limbs: [ 0xa62701b792b4b927428087510b4690, 0x4dfbddaa0f7018a5f6c9d6ee753c3a, 0x000c3e ] } , - BigNum { limbs: [ 0x177d01486ba745d8bd7f77aef4b971, 0x59574bf36dd81a93e13e32b362c919, 0x0067af ] } , - BigNum { limbs: [ 0x2bb8a6efad1e27f723ac02bc953aad, 0x19512cc16fca078fe779deb9655e56, 0x0027db ] } , - BigNum { limbs: [ 0x91eb5c10513dd708dc53fc436ac554, 0x8e01fcdc0d7e2ba9f08e2ae872a6fd, 0x004c12 ] } , - BigNum { limbs: [ 0x4b2cfa769fd7090da3400381fcc74e, 0x37ba404a0d987ba20ac46f869f0e03, 0x002a5f ] } , - BigNum { limbs: [ 0x727708895e84f5f25cbffb7e0338b3, 0x6f98e9536fafb797cd439a1b38f750, 0x00498e ] } , - BigNum { limbs: [ 0x4c63965a705ecf9e985c7e18ed3d94, 0x676f45ec4c4be580c83d05f64c7819, 0x00641b ] } , - BigNum { limbs: [ 0x71406ca58dfd2f6167a380e712c26d, 0x3fe3e3b130fc4db90fcb03ab8b8d3a, 0x000fd2 ] } , - BigNum { limbs: [ 0x40a5a6bee95b75b0a24612e823d13d, 0xb243df1e9853a678f914d4d20ec0cd, 0x004d3d ] } , - BigNum { limbs: [ 0x7cfe5c411500894f5db9ec17dc2ec4, 0xf50f4a7ee4f48cc0def334cfc94486, 0x0026af ] } , - BigNum { limbs: [ 0xe486ab9c1d181d325a4c24c7ca7cc7, 0x380a113e0de0bb589129ecd866e89a, 0x0004e7 ] } , - BigNum { limbs: [ 0xd91d5763e143e1cda5b3da3835833a, 0x6f49185f6f6777e146de1cc9711cb8, 0x006f06 ] } , - BigNum { limbs: [ 0xdad8d7196fb3f65c1941863d1168cd, 0x90308f169ce69e837a858ba1f4dbec, 0x0014da ] } , - BigNum { limbs: [ 0xe2cb2be68ea808a3e6be78c2ee9734, 0x17229a86e06194b65d827dffe32966, 0x005f13 ] } , - BigNum { limbs: [ 0x74bd923dc36a592cc0d7becb4f8876, 0x61262f282dcae92f7171df3b47edda, 0x005b1b ] } , - BigNum { limbs: [ 0x48e670c23af1a5d33f284034b0778b, 0x462cfa754f7d4a0a66962a66901779, 0x0018d2 ] } , - BigNum { limbs: [ 0x6d7db0e788ca47358d0356fe5c9dd1, 0x3bf5a632c343afe3c67ccb9bc555d5, 0x004101 ] } , - BigNum { limbs: [ 0x502652187591b7ca72fca801a36230, 0x6b5d836aba048356118b3e0612af7e, 0x0032ec ] } , - BigNum { limbs: [ 0x8478c058ba081aa9a5318b553b5055, 0x204b4d180e5fafaf710124fe64cc2f, 0x00303b ] } , - BigNum { limbs: [ 0x392b42a74453e4565ace73aac4afac, 0x8707dc856ee8838a6706e4a3733924, 0x0043b2 ] } , - BigNum { limbs: [ 0xdedeaa3d44c908d6481057712b62db, 0xae5fdb8f2f3d6ddcbaedc9453e96d0, 0x001bb7 ] } , - BigNum { limbs: [ 0xdec558c2b992f629b7efa78ed49d26, 0xf8f34e0e4e0ac55d1d1a405c996e82, 0x005835 ] } , - BigNum { limbs: [ 0xc6be59ee6c4978fab7b69fb529b7e3, 0x6c09a50cc22023fa498ade54827584, 0x006aeb ] } , - BigNum { limbs: [ 0xf6e5a9119212860548495f4ad6481e, 0x3b498490bb280f3f8e7d2b4d558fce, 0x000902 ] } , - BigNum { limbs: [ 0x8f864a71161064a192553890378d77, 0x17ee086c6e073fd463744dfe796c4c, 0x004698 ] } , - BigNum { limbs: [ 0x2e1db88ee84b9a5e6daac66fc8728a, 0x8f6521310f40f3657493bba35e9907, 0x002d55 ] } , - BigNum { limbs: [ 0x9a9969bef61c7030607eed4e106241, 0xd1f0e3ff52986368034091730c6b9d, 0x000b2c ] } , - BigNum { limbs: [ 0x230a9941083f8ecf9f8111b1ef9dc0, 0xd562459e2aafcfd1d4c7782ecb99b6, 0x0068c0 ] } , - BigNum { limbs: [ 0x507e6d99ae9fb5cf3f5b54b4aec959, 0x04f0408c123beba4f8ff3b7a8c1be7, 0x00027f ] } , - BigNum { limbs: [ 0x6d2595664fbc4930c0a4aa4b5136a8, 0xa262e9116b0c4794df08ce274be96c, 0x00716e ] } , - BigNum { limbs: [ 0xd9ded9e5b846364876072015b5eb65, 0xf33c820d1972523c36cb307c474c66, 0x002c3d ] } , - BigNum { limbs: [ 0xe3c5291a4615c8b789f8deea4a149c, 0xb416a79063d5e0fda13cd92590b8ec, 0x0047af ] } , - BigNum { limbs: [ 0xeb1be306684058ab89474dafefa2eb, 0xad8e0aff72fddd5f394035f10efc55, 0x004171 ] } , - BigNum { limbs: [ 0xd2881ff9961ba65476b8b150105d16, 0xf9c51e9e0a4a55da9ec7d3b0c908fd, 0x00327b ] } , - BigNum { limbs: [ 0x254f5541ef7930a331a41b73f7abaa, 0xc571ec70792379996efebe4f0acfa9, 0x002115 ] } , - BigNum { limbs: [ 0x9854adbe0ee2ce5cce5be38c085457, 0xe1e13d2d0424b9a069094b52cd35aa, 0x0052d7 ] } , - BigNum { limbs: [ 0xb41f6fa66c6185499dc9307637db4e, 0x33aa2adfa3d536b7641585985e553c, 0x000617 ] } , - BigNum { limbs: [ 0x0984935991fa79b66236ce89c824b3, 0x73a8febdd972fc8273f2840979b017, 0x006dd6 ] } , - BigNum { limbs: [ 0xf9ceeec6dcc80182ea775599840a35, 0xfeed9f0db0a00b8ee40fc17a7860b4, 0x00597c ] } , - BigNum { limbs: [ 0xc3d514392193fd7d1588a9667bf5cc, 0xa8658a8fcca827aaf3f848275fa49e, 0x001a70 ] } , - BigNum { limbs: [ 0x7c3afc63865e0d5abea05493f97fa6, 0x8700c692c174b22a86412d8ed07cee, 0x0040a9 ] } , - BigNum { limbs: [ 0x4169069c77fdf1a5415faa6c06805b, 0x2052630abbd3810f51c6dc13078865, 0x003344 ] } , - BigNum { limbs: [ 0x6fce9cfc06ce536b61e1f83655b4f5, 0xd69266a9fcde925a42a6d3f34fed4c, 0x0040d7 ] } , - BigNum { limbs: [ 0x4dd56603f78dab949e1e06c9aa4b0c, 0xd0c0c2f38069a0df956135ae881807, 0x003315 ] } , - BigNum { limbs: [ 0x6da96883a873462ccc2c2cf47c63df, 0x9ad5a4f61993a52471a84bb496a6c3, 0x0007f6 ] } , - BigNum { limbs: [ 0x4ffa9a7c55e8b8d333d3d20b839c22, 0x0c7d84a763b48e15665fbded415e90, 0x006bf7 ] } , - BigNum { limbs: [ 0xcdadabd0b38af56c035d9eab203dbe, 0x7ca455960f91959b712aca7c881bfe, 0x0021b1 ] } , - BigNum { limbs: [ 0xeff6572f4ad10993fca26054dfc243, 0x2aaed4076db69d9e66dd3f254fe954, 0x00523c ] } , - BigNum { limbs: [ 0xe00594924fb402d6cd14fd27e25700, 0x44261676fcc9f3bc3df6273fd94bd1, 0x003186 ] } , - BigNum { limbs: [ 0xdd9e6e6daea7fc2932eb01d81da901, 0x632d1326807e3f7d9a11e261feb981, 0x004267 ] } , - BigNum { limbs: [ 0x0ee7d30e12b23d1ab447818017f222, 0xc6b854445b5ea6798aa04ee79bdb41, 0x0068aa ] } , - BigNum { limbs: [ 0xaebc2ff1eba9c1e54bb87d7fe80ddf, 0xe09ad55921e98cc04d67baba3c2a12, 0x000b42 ] } , - BigNum { limbs: [ 0xfea3e5c0c9365a897755321979df0f, 0x1526811d79ccb36c6e20369d140fc1, 0x00306c ] } , - BigNum { limbs: [ 0xbf001d3f3525a47688aacce68620f2, 0x922ca880037b7fcd69e7d304c3f591, 0x004381 ] } , - BigNum { limbs: [ 0x749a7cd475fcba89e3a03ed602252d, 0x3d4724f28a112be91e58eee71d4355, 0x006a7a ] } , - BigNum { limbs: [ 0x4909862b885f44761c5fc029fddad4, 0x6a0c04aaf3370750b9af1ababac1fe, 0x000973 ] } , - BigNum { limbs: [ 0x0f1173523113cd28d02344081ebd9c, 0x6aa34cdcd1600752f686c03aab1979, 0x0072a9 ] } , - BigNum { limbs: [ 0xae928fadcd4831d72fdcbaf7e14265, 0x3cafdcc0abe82be6e18149672cebda, 0x000144 ] } , - BigNum { limbs: [ 0x19809deb59fb23d7cd720d549ab2eb, 0x7b346cc7e5c436afd1adf36438b891, 0x001f2d ] } , - BigNum { limbs: [ 0xa4236514a460db28328df1ab654d16, 0x2c1ebcd59783fc8a065a163d9f4cc2, 0x0054c0 ] } , - BigNum { limbs: [ 0x61c74f88aecaa3f8518c32a0f5203d, 0x2e03ec6552ab659ae7550d5fbfbdcb, 0x001264 ] } , - BigNum { limbs: [ 0x5bdcb3774f915b07ae73cc5f0adfc4, 0x794f3d382a9ccd9ef0b2fc42184788, 0x006189 ] } , - BigNum { limbs: [ 0x0f7509eb12bf7a12d6b6c03800e954, 0xd14a7eea8bf2615934146cd481131e, 0x006ced ] } , - BigNum { limbs: [ 0xae2ef914eb9c84ed29493ec7ff16ad, 0xd608aab2f155d1e0a3f39ccd56f235, 0x0006ff ] } , - BigNum { limbs: [ 0x5972f0c64c836900ff94c5632452fe, 0xb39695b0958edb6e036992fd59a041, 0x000050 ] } , - BigNum { limbs: [ 0x64311239b1d895ff006b399cdbad03, 0xf3bc93ece7b957cbd49e76a47e6512, 0x00739c ] } , - BigNum { limbs: [ 0x82918a1275e4859be951ce740d7fdb, 0xba9bb0ed7d9163545d0bf99fcaa395, 0x0056d7 ] } , - BigNum { limbs: [ 0x3b1278ed8877796416ae308bf28026, 0xecb778afffb6cfe57afc10020d61be, 0x001d15 ] } , - BigNum { limbs: [ 0x1601a76229c1adfbecb0a04cff1fd5, 0x7a5cdde8aca2e66faae39b39c088f7, 0x00292f ] } , - BigNum { limbs: [ 0xa7a25b9dd49a5104134f5eb300e02c, 0x2cf64bb4d0a54cca2d246e68177c5c, 0x004abe ] } , - BigNum { limbs: [ 0xb612d30c081aabf34e05525f877021, 0x4bfe667932157f92916e86d96b6930, 0x004bf2 ] } , - BigNum { limbs: [ 0x07912ff3f641530cb1faaca0788fe0, 0x5b54c3244b32b3a7469982c86c9c23, 0x0027fb ] } , - BigNum { limbs: [ 0xd5ea380ce32e6b2dd42bd931d880fa, 0xe427c36951f6d473cff7407c6dcfb4, 0x006e88 ] } , - BigNum { limbs: [ 0xe7b9caf31b2d93d22bd425ce277f07, 0xc32b66342b515ec60810c9256a359e, 0x000564 ] } , - BigNum { limbs: [ 0x0f84475022fe939470465bee013097, 0x58bad03c9dbd58155a83a8ea6c3390, 0x002cda ] } , - BigNum { limbs: [ 0xae1fbbafdb5d6b6b8fb9a311fecf6a, 0x4e985960df8adb247d8460b76bd1c3, 0x004713 ] } , - BigNum { limbs: [ 0xa16ef813f31e5f83b68b581d21fd33, 0xd5284c1600d347aae07d7872a6391a, 0x005202 ] } , - BigNum { limbs: [ 0x1c350aec0b3d9f7c4974a6e2de02ce, 0xd22add877c74eb8ef78a912f31cc39, 0x0021ea ] } , - BigNum { limbs: [ 0x48051e0746d4d27634d53c101b484f, 0x274c05b653d0979001b1a9c1802b67, 0x00425b ] } , - BigNum { limbs: [ 0x759ee4f8b7872c89cb2ac2efe4b7b2, 0x800723e729779ba9d6565fe057d9ec, 0x003192 ] } , - BigNum { limbs: [ 0x8503100bf4f456b35f7bf5575c7b23, 0x45cdf7a9ba4cf1bf9c0b78cfea72b9, 0x006f01 ] } , - BigNum { limbs: [ 0x38a0f2f40967a84ca08409a8a384de, 0x618531f3c2fb417a3bfc90d1ed929a, 0x0004ec ] } , - BigNum { limbs: [ 0xf49d1fef18fe446a96b2f8aba94ca5, 0x0381d5637adbe052493f508ebbd64e, 0x005062 ] } , - BigNum { limbs: [ 0xc906e310e55dba95694d065456b35c, 0xa3d1543a026c52e78ec8b9131c2f04, 0x00238b ] } , - BigNum { limbs: [ 0xe70398715625d1fe45dab729efaea5, 0x48d147f9e07b866b74814bbc6fc20e, 0x00284b ] } , - BigNum { limbs: [ 0xd6a06a8ea8362d01ba2547d610515c, 0x5e81e1a39cccacce6386bde5684344, 0x004ba2 ] } , - BigNum { limbs: [ 0x43e19212b8aa4df3a5ad5791a994d8, 0x540c98122505b6ecd0eb892cffb184, 0x000dd3 ] } , - BigNum { limbs: [ 0x79c270ed45b1b10c5a52a76e566b29, 0x5346918b58427c4d071c8074d853cf, 0x00661a ] } , - BigNum { limbs: [ 0x6bc6576070693cb7d4f57ca8e234d2, 0x78031812872bf13558bc3f0560e2d7, 0x00695a ] } , - BigNum { limbs: [ 0x51ddab9f8df2c2482b0a82571dcb2f, 0x2f50118af61c42047f4bca9c77227c, 0x000a93 ] } , - BigNum { limbs: [ 0xfe1703fe711c29b80e538fb0db8eac, 0xdb43a94f5b7bb38f39714deeb1ae8a, 0x0014bd ] } , - BigNum { limbs: [ 0xbf8cff018d3fd547f1ac6f4f247155, 0xcc0f804e21cc7faa9e96bbb32656c8, 0x005f2f ] } , - BigNum { limbs: [ 0x24660d2d313d631f591af96e8a7fee, 0xc197a37224f76ca24d962e9700475f, 0x00347c ] } , - BigNum { limbs: [ 0x993df5d2cd1e9be0a6e50591758013, 0xe5bb862b5850c6978a71db0ad7bdf4, 0x003f70 ] } , - BigNum { limbs: [ 0x88d41415a9d2b7905e2d22cc47814f, 0x81307e7897487efc9679d3ae6717af, 0x0029a4 ] } , - BigNum { limbs: [ 0x34cfeeea5489476fa1d2dc33b87eb2, 0x2622ab24e5ffb43d418e35f370eda4, 0x004a49 ] } , - BigNum { limbs: [ 0xf108e4ee1b6fb6162787b451688c10, 0x962e55e3bd5fbe8f28ffbc2667540c, 0x000c3d ] } , - BigNum { limbs: [ 0xcc9b1e11e2ec48e9d8784aae9773f1, 0x1124d3b9bfe874aaaf084d7b70b146, 0x0067b0 ] } , - BigNum { limbs: [ 0x206cf9748b83dd96d828215664721a, 0xe83969d643cbcec6ec3b08bdf75cb5, 0x006a6b ] } , - BigNum { limbs: [ 0x9d37098b72d8216927d7dda99b8de7, 0xbf19bfc7397c6472ebcd00e3e0a89e, 0x000981 ] } , - BigNum { limbs: [ 0x44895d478fa9ddd1291c9619ff853a, 0x8c88d24405c2e8c071ee884d75d3a4, 0x004ef4 ] } , - BigNum { limbs: [ 0x791aa5b86eb2212ed6e368e6007ac7, 0x1aca575977854a79661981546231af, 0x0024f9 ] } , - BigNum { limbs: [ 0x5a424237cbda19892e38be9f062611, 0x11bc8052d3e3f0c732b4b9a2d2ebd0, 0x000a94 ] } , - BigNum { limbs: [ 0x6361c0c83281e576d1c74060f9d9f0, 0x9596a94aa9644272a5534fff051983, 0x006959 ] } , - BigNum { limbs: [ 0x7d89921705901e5de06a0b012d0243, 0x594fdeb2e307f3e1fb2deb76f3bb71, 0x006c45 ] } , - BigNum { limbs: [ 0x401a70e8f8cbe0a21f95f3fed2fdbe, 0x4e034aea9a403f57dcda1e2ae449e2, 0x0007a8 ] } , - BigNum { limbs: [ 0xa788bc6d17181423c79bd954755494, 0x0481d07a7e9f35032fbef532789ce5, 0x00611b ] } , - BigNum { limbs: [ 0x161b4692e743eadc386425ab8aab6d, 0xa2d15922fea8fe36a849146f5f686e, 0x0012d2 ] } , - BigNum { limbs: [ 0x1653d1c1bc6e308ea22d6694856daa, 0xb4cc459331ab514ca0d0085bb39e9d, 0x005068 ] } , - BigNum { limbs: [ 0xa750313e41edce715dd2986b7a9257, 0xf286e40a4b9ce1ed373801462466b6, 0x002384 ] } , - BigNum { limbs: [ 0x054f3e075b729d81098d794dea5701, 0x6abf41700b9842a65fa559497c8810, 0x004f9d ] } , - BigNum { limbs: [ 0xb854c4f8a2e9617ef67285b215a900, 0x3c93e82d71aff0937862b0585b7d43, 0x002450 ] } , - BigNum { limbs: [ 0x5057d57703f9a87e126235ecd43026, 0x74affe564b7a8b3844deac9ea56431, 0x001736 ] } , - BigNum { limbs: [ 0x6d4c2d88fa625681ed9dc9132bcfdb, 0x32a32b4731cda80193295d0332a122, 0x005cb7 ] } , - BigNum { limbs: [ 0xb47dbca9cae90afbe221bbe8b0070f, 0x1707ef01055ae713812af75c3ce340, 0x006e6d ] } , - BigNum { limbs: [ 0x092646563372f4041dde43174ff8f2, 0x904b3a9c77ed4c2656dd12459b2213, 0x000580 ] } , - BigNum { limbs: [ 0x6f364ee6ca599e2a57e7c2e3829f5d, 0xbff09ddfad632d741d8ddfa5d583ef, 0x0061f4 ] } , - BigNum { limbs: [ 0x4e6db419340260d5a8183c1c7d60a4, 0xe7628bbdcfe505c5ba7a29fc028164, 0x0011f8 ] } , - BigNum { limbs: [ 0x0b303e3b187bfe2d29236b4aba2c30, 0x7d686e321ed7e2bf66e7d85fbbf104, 0x004f5a ] } , - BigNum { limbs: [ 0xb273c4c4e5e000d2d6dc93b545d3d1, 0x29eabb6b5e70507a712031421c144f, 0x002493 ] } , - BigNum { limbs: [ 0x8af5568bee084eafc9284dc5c825b3, 0x1e8cce6557ae443ba5d28686f073a4, 0x001c5b ] } , - BigNum { limbs: [ 0x32aeac741053b05036d7b13a37da4e, 0x88c65b382599eefe3235831ae791af, 0x005792 ] } , - BigNum { limbs: [ 0x7e09e82f1c3e9d4efb199435cf1951, 0x5d7839b1fcfcf9503d8f57a4d6614e, 0x003b14 ] } , - BigNum { limbs: [ 0x3f9a1ad0e21d61b104e66aca30e6b0, 0x49daefeb804b39e99a78b1fd01a405, 0x0038d9 ] } , - BigNum { limbs: [ 0x55d107b1c203eab17bd0bb5bad1182, 0x9c8b5342ec1d44944d3f7324eb7480, 0x001cb9 ] } , - BigNum { limbs: [ 0x67d2fb4e3c58144e842f43a452ee7f, 0x0ac7d65a912aeea58ac8967cec90d3, 0x005734 ] } , - BigNum { limbs: [ 0xcc98e5c7db5187d8c1d40bb10adc59, 0xc0675265fa2dfc519755c087a32876, 0x003c33 ] } , - BigNum { limbs: [ 0xf10b1d38230a77273e2bf34ef523a8, 0xe6ebd737831a36e840b2491a34dcdc, 0x0037b9 ] } , - BigNum { limbs: [ 0xc2ff3e383faedce4a93fcddb1211f4, 0x208ddf82338cb12eca28a2ee1691e3, 0x0035c4 ] } , - BigNum { limbs: [ 0xfaa4c4c7bead221b56c03124edee0d, 0x86c54a1b49bb820b0ddf66b3c1736f, 0x003e29 ] } , - BigNum { limbs: [ 0x770750a3295ce013845fe3e81af4a9, 0x5e069cf1ffd4b20beea0d3d2717cab, 0x0040d6 ] } , - BigNum { limbs: [ 0x469cb25cd4ff1eec7ba01b17e50b58, 0x494c8cab7d73812de96735cf6688a8, 0x003317 ] } , - BigNum { limbs: [ 0x4b6d768688f6163f7aef5a8d5a484b, 0xc4e0a34ac8817ca0911d55cb959127, 0x003367 ] } , - BigNum { limbs: [ 0x72368c797565e8c08510a472a5b7b6, 0xe2728652b4c6b69946eab3d642742c, 0x004085 ] } , - BigNum { limbs: [ 0x0454e65c549e730c28faecaf1e8d22, 0x56b81cdb2573eb5e4c7cc761dd4520, 0x005d92 ] } , - BigNum { limbs: [ 0xb94f1ca3a9bd8bf3d7051250e172df, 0x509b0cc257d447db8b8b423ffac033, 0x00165b ] } , - BigNum { limbs: [ 0x51ee0472a016488c27b766a60882f9, 0x11507fe896a5498eb71d7559be4c99, 0x0052c2 ] } , - BigNum { limbs: [ 0x6bb5fe8d5e45b673d8489859f77d08, 0x9602a9b4e6a2e9ab20ea944819b8ba, 0x00212b ] } , - BigNum { limbs: [ 0xc5bca14681745c76d754972b0417a7, 0x2f86c9d8d39011f0f8130ff3be0f88, 0x0018f0 ] } , - BigNum { limbs: [ 0xf7e761b97ce7a28928ab67d4fbe85a, 0x77cc5fc4a9b82148dff4f9ae19f5ca, 0x005afd ] } , - BigNum { limbs: [ 0x638559361842718ac62a5b6e5ad517, 0x6fb41d42210a721065e2d58541d8ed, 0x004100 ] } , - BigNum { limbs: [ 0x5a1ea9c9e6198d7539d5a391a52aea, 0x379f0c5b5c3dc1297225341c962c66, 0x0032ed ] } , - BigNum { limbs: [ 0x1950751921323a56171b04b937cdaf, 0x937ddeaca07bc012d70246b27dc065, 0x0024ee ] } , - BigNum { limbs: [ 0xa4538de6dd29c4a9e8e4fa46c83252, 0x13d54af0dccc73270105c2ef5a44ee, 0x004eff ] } , - BigNum { limbs: [ 0x2a319f1febe961d72e9ae3be101d4a, 0x9c3f07698480401ec4aa8199861df1, 0x004b05 ] } , - BigNum { limbs: [ 0x937263e012729d28d1651b41efe2b7, 0x0b142233f8c7f31b135d880851e762, 0x0028e8 ] } , - BigNum { limbs: [ 0x6741faefb9fa2d5aa8609bb6978a8a, 0x21978e244f9d146d95e0e0022b3e03, 0x001a07 ] } , - BigNum { limbs: [ 0x566208104461d1a5579f6349687577, 0x85bb9b792dab1ecc4227299facc750, 0x0059e6 ] } , - BigNum { limbs: [ 0x45ddc7c4867210129ed5dca288fdad, 0xda03c2eccc63b00e689f35ee7c4f17, 0x000145 ] } , - BigNum { limbs: [ 0x77c63b3b77e9eeed612a225d770254, 0xcd4f66b0b0e4832b6f68d3b35bb63c, 0x0072a7 ] } , - BigNum { limbs: [ 0xb74b780ee14bd5ffd348ed4368ea6b, 0xe856ea5ac03fc0e50bf8399e8a372b, 0x0030c0 ] } , - BigNum { limbs: [ 0x06588af11d1029002cb711bc971596, 0xbefc3f42bd087254cc0fd0034dce28, 0x00432c ] } , - BigNum { limbs: [ 0xb180cc06183fdc238b0dcafb1476da, 0x9abcdc6fffbff88b8ccd41b6fe9072, 0x006dae ] } , - BigNum { limbs: [ 0x0c2336f9e61c22dc74f23404eb8927, 0x0c964d2d7d883aae4b3ac7ead974e1, 0x00063f ] } , - BigNum { limbs: [ 0xa0aa4b47b65a9aa9b9e943288d1377, 0x1a344d6f5983ebaddafe1ce61a3e55, 0x002139 ] } , - BigNum { limbs: [ 0x1cf9b7b8480164564616bbd772ec8a, 0x8d1edc2e23c4478bfd09ecbbbdc6fe, 0x0052b4 ] } , - BigNum { limbs: [ 0xda2c1965bb0e4df3f081d760a857c1, 0x717dde8a10fab09cc8a6d690d6d975, 0x002b2c ] } , - BigNum { limbs: [ 0xe377e99a434db10c0f7e279f57a840, 0x35d54b136c4d829d0f613311012bdd, 0x0048c1 ] } , - BigNum { limbs: [ 0x4b18da6a0cb40d9f323ea3d74cb3ed, 0xd903bc2a828e0a910beaf7801c3c4a, 0x0068a3 ] } , - BigNum { limbs: [ 0x728b2895f1a7f160cdc15b28b34c14, 0xce4f6d72faba28a8cc1d1221bbc909, 0x000b49 ] } , - BigNum { limbs: [ 0xdbfda03b545ae6d8953347b71b2763, 0x4045701c2afdeb6b10d0ae8fdb6702, 0x004e58 ] } , - BigNum { limbs: [ 0xe1a662c4aa0118276accb748e4d89e, 0x670db981524a47cec7375b11fc9e50, 0x002595 ] } , - BigNum { limbs: [ 0x29f1a50e3889f85141aa86a2a5ecfe, 0xb7b08d8f15ade18c576cea199d2fa8, 0x000189 ] } , - BigNum { limbs: [ 0x93b25df1c5d206aebe55785d5a1303, 0xefa29c0e679a51ad809b1f883ad5ab, 0x007263 ] } , - BigNum { limbs: [ 0xb6ef0eb662097c3848f25bc12e55e5, 0x0f09621ec698c303dcd2525aa8e1d5, 0x00207c ] } , - BigNum { limbs: [ 0x06b4f4499c5282c7b70da33ed1aa1c, 0x9849c77eb6af7035fb35b7472f237e, 0x005371 ] } , - BigNum { limbs: [ 0xfee96131f8a2c92461b61f8c172710, 0x3925f9b4c85b4d19a6dc30bd3cf9de, 0x0034d0 ] } , - BigNum { limbs: [ 0xbebaa1ce05b935db9e49df73e8d8f1, 0x6e2d2fe8b4ece620312bd8e49b0b74, 0x003f1d ] } , - BigNum { limbs: [ 0x141e3d346407c47189304e56429ad5, 0xb91199af6c50c47d1bfcf63d8da28f, 0x0056f5 ] } , - BigNum { limbs: [ 0xa985c5cb9a543a8e76cfb0a9bd652c, 0xee418fee10f76ebcbc0b13644a62c4, 0x001cf7 ] } , - BigNum { limbs: [ 0x8bc773e8f76ec48f6d8cad9a860cd0, 0x8ac912456e1d8865c216fafad6f949, 0x004228 ] } , - BigNum { limbs: [ 0x31dc8f1706ed3a709273516579f331, 0x1c8a17580f2aaad415f10ea7010c0a, 0x0031c5 ] } , - BigNum { limbs: [ 0x0738e3b14d3321adc2f5fb7a0f9779, 0xe3491835bf37c77b9884e9951f09f5, 0x001285 ] } , - BigNum { limbs: [ 0xb66b1f4eb128dd523d0a0385f06888, 0xc40a1167be106bbe3f83200cb8fb5e, 0x006167 ] } , - BigNum { limbs: [ 0xede3c44914fead6b72120c1df2a4b7, 0xe8be4df796d59f6c51b91a1bb80965, 0x0057f2 ] } , - BigNum { limbs: [ 0xcfc03eb6e95d51948dedf2e20d5b4a, 0xbe94dba5e67293cd864eef861ffbed, 0x001bfa ] } , - BigNum { limbs: [ 0x02db433ead26c61eff4e410f51f541, 0xac8c4cf028e96b55b53b85b3aaaf65, 0x004f11 ] } , - BigNum { limbs: [ 0xbac8bfc1513538e100b1bdf0ae0ac0, 0xfac6dcad545ec7e422cc83ee2d55ee, 0x0024db ] } , - BigNum { limbs: [ 0xcdd406650e46c8d98b75fb7861f2ca, 0x7cbfb59eea4ac9eaecdc39624a74d6, 0x00337d ] } , - BigNum { limbs: [ 0xefcffc9af0153626748a03879e0d37, 0x2a9373fe92fd694eeb2bd03f8d907c, 0x004070 ] } , - BigNum { limbs: [ 0xa5bc30f24fec3acc3d6f4f809b0a53, 0x6ed642e8c59a514c846d5f0e44976d, 0x002013 ] } , - BigNum { limbs: [ 0x17e7d20dae6fc433c290af7f64f5ae, 0x387ce6b4b7ade1ed539aaa93936de6, 0x0053da ] } , - BigNum { limbs: [ 0xdeb7a80902a9c5efdf3ccfe8e53a24, 0x1a50f8bb8a7d92a4ae617d426c9358, 0x0070ba ] } , - BigNum { limbs: [ 0xdeec5af6fbb2391020c32f171ac5dd, 0x8d0230e1f2caa09529a68c5f6b71fa, 0x000333 ] } , - BigNum { limbs: [ 0x682f007f22bb81fdd7ada825dfd8e9, 0xba432991de5065a9a51a6b3c1aee25, 0x003c87 ] } , - BigNum { limbs: [ 0x55750280dba07d02285256da202718, 0xed10000b9ef7cd9032ed9e65bd172e, 0x003765 ] } , - BigNum { limbs: [ 0xdc15430c03b1e93f800f008fb12ae6, 0xab089b07419bb6f14d619c69d89866, 0x00665b ] } , - BigNum { limbs: [ 0xe18ebff3faaa15c07ff0fe704ed51b, 0xfc4a8e963bac7c488aa66d37ff6cec, 0x000d91 ] } , - BigNum { limbs: [ 0x9e920fb609ba358d5ceacfe1dffb42, 0x817f573e38be9b763b9e8a078d875c, 0x004094 ] } , - BigNum { limbs: [ 0x1f11f349f4a1c972a3152f1e2004bf, 0x25d3d25f448997c39c697f9a4a7df7, 0x003359 ] } , - BigNum { limbs: [ 0x5f4c56d978347b10decd73542a05fd, 0x12ef8c4b82539a2ef0ffba88222629, 0x005c58 ] } , - BigNum { limbs: [ 0x5e57ac26862783ef21328babd5fa04, 0x94639d51faf4990ae7084f19b5df2a, 0x001795 ] } , - BigNum { limbs: [ 0x1a0584cc517b2805c42dc5891560a9, 0x9d33e7931ce4ecbc30602b356bce70, 0x0016b0 ] } , - BigNum { limbs: [ 0xa39e7e33ace0d6fa3bd23976ea9f58, 0x0a1f420a6063467da7a7de6c6c36e3, 0x005d3d ] } , - BigNum { limbs: [ 0x628e600a788e04ab750b85650ebd1b, 0x45839982795b2e6635a42125b2c691, 0x004faf ] } , - BigNum { limbs: [ 0x5b15a2f585cdfa548af4799af142e6, 0x61cf901b03ed04d3a263e87c253ec2, 0x00243e ] } , - BigNum { limbs: [ 0x5fd0a3184059075334c20cef94dd35, 0x069a3f7275ed6f16b28321f60d75c3, 0x001a8e ] } , - BigNum { limbs: [ 0x5dd35fe7be02f7accb3df2106b22cc, 0xa0b8ea2b075ac4232584e7abca8f90, 0x00595f ] } , - BigNum { limbs: [ 0x5321e5ff1832016c9ec31e57800535, 0x6fde6d9f8cf58100484127999969e6, 0x0058d2 ] } , - BigNum { limbs: [ 0x6a821d00e629fd93613ce0a87ffacc, 0x3774bbfdf052b2398fc6e2083e9b6d, 0x001b1b ] } , - BigNum { limbs: [ 0x24e42aa8d5aec08ce356eec0b581c3, 0x96482f24fb2a6806482acecf123181, 0x004ad6 ] } , - BigNum { limbs: [ 0x98bfd85728ad3e731ca9103f4a7e3e, 0x110afa78821dcb338fdd3ad2c5d3d2, 0x002917 ] } , - BigNum { limbs: [ 0x346f499430ac3e8834e343be816ade, 0x1c7a1e79b28af076c80674fbea502b, 0x003324 ] } , - BigNum { limbs: [ 0x8934b96bcdafc077cb1cbb417e9523, 0x8ad90b23cabd42c3100194a5edb528, 0x0040c9 ] } , - BigNum { limbs: [ 0x57918f034022d6713037f8b64415e9, 0x19fd78f51a8800de167d51cdd33239, 0x0000b2 ] } , - BigNum { limbs: [ 0x661273fcbe39288ecfc80649bbea18, 0x8d55b0a862c0325bc18ab7d404d31a, 0x00733b ] } , - BigNum { limbs: [ 0xf59be099efbbbf1e9ee7f422718376, 0x28cf3247eb4450669afedabf51d50f, 0x006d6b ] } , - BigNum { limbs: [ 0xc80822660ea03fe161180add8e7c8b, 0x7e83f7559203e2d33d092ee2863043, 0x000682 ] } , - BigNum { limbs: [ 0x717496b394e228bde1fcdaa1e27c0c, 0xc92134ed8fe810bde4e31b054a62bd, 0x001f39 ] } , - BigNum { limbs: [ 0x4c2f6c4c6979d6421e03245e1d83f5, 0xde31f4afed60227bf324ee9c8da296, 0x0054b3 ] } , - BigNum { limbs: [ 0x7d09d03af59770f1d0fcc7934e784a, 0xe258d964b59394e25115d08b5a107a, 0x005651 ] } , - BigNum { limbs: [ 0x409a32c508c48e0e2f03376cb187b7, 0xc4fa5038c7b49e5786f239167df4d9, 0x001d9b ] } , - BigNum { limbs: [ 0xaaeb71ec0f716e68b025c69346bf09, 0x88ac099cc542dbc85d2e72f3dee770, 0x0004ca ] } , - BigNum { limbs: [ 0x12b89113eeea90974fda386cb940f8, 0x1ea72000b80557717ad996adf91de3, 0x006f23 ] } , - BigNum { limbs: [ 0x3f0ed736ba61d95846912ad0cd72e8, 0xa976934ab9259ff3085d4c741c88b3, 0x00184a ] } , - BigNum { limbs: [ 0x7e952bc943fa25a7b96ed42f328d19, 0xfddc9652c4229346cfaabd2dbb7ca0, 0x005ba2 ] } , - BigNum { limbs: [ 0x62b291c828ec3ebaf26067815711fc, 0xbb8260b46d2c51e40cbf75a7ee58fd, 0x0062e0 ] } , - BigNum { limbs: [ 0x5af17137d56fc0450d9f977ea8ee05, 0xebd0c8e9101be155cb4893f9e9ac56, 0x00110c ] } , - BigNum { limbs: [ 0xf1944f8062e2362fd7908ad327998c, 0xfae10609ac308c560763e9b339ee02, 0x005d20 ] } , - BigNum { limbs: [ 0xcc0fb37f9b79c8d0286f742cd86675, 0xac722393d117a6e3d0a41fee9e1750, 0x0016cc ] } , - BigNum { limbs: [ 0x238124a0db2fb18fbde3dcc5b9f194, 0x2223c6d14ff1cf5fcb7416a05e18ff, 0x002605 ] } , - BigNum { limbs: [ 0x9a22de5f232c4d70421c223a460e6d, 0x852f62cc2d5663da0c93f30179ec54, 0x004de8 ] } , - BigNum { limbs: [ 0x2f181b14aed10ff6e67eefaeab0cff, 0xa75b010005d75274ac3b3a23333006, 0x004d09 ] } , - BigNum { limbs: [ 0x8e8be7eb4f8aef0919810f5154f302, 0xfff8289d7770e0c52bcccf7ea4d54d, 0x0026e3 ] } , - BigNum { limbs: [ 0x84f64a6ba25a938975fe3c072f5f5c, 0xbd52dee2d5f7a21bae96e51a32d19d, 0x005087 ] } , - BigNum { limbs: [ 0x38adb8945c016b768a01c2f8d0a0a5, 0xea004abaa750911e29712487a533b6, 0x002365 ] } , - BigNum { limbs: [ 0x2ae0e11e73c3f16ca52fc81438540d, 0x08c778383129c0429531c4dd5df66d, 0x001ebd ] } , - BigNum { limbs: [ 0x92c321e18a980d935ad036ebc7abf4, 0x9e8bb1654c1e72f742d644c47a0ee6, 0x005530 ] } , - BigNum { limbs: [ 0xe7fa646df251b192383683e59ecc6a, 0xc7fe5a5827024c14c0e444da9cff88, 0x000ef4 ] } , - BigNum { limbs: [ 0xd5a99e920c0a4d6dc7c97b1a613397, 0xdf54cf455645e7251723c4c73b05ca, 0x0064f8 ] } , - BigNum { limbs: [ 0xeef0bcd91847d841253cc2a928d6be, 0x37718307eb1a9579e0bf9778e20bdc, 0x005a0c ] } , - BigNum { limbs: [ 0xceb34626e61426bedac33c56d72943, 0x6fe1a695922d9dbff7487228f5f976, 0x0019e1 ] } , - BigNum { limbs: [ 0xa701b8e3a721e0fefce536fb906424, 0x78afcd6fbd8fcad332db11efc5f13f, 0x00420e ] } , - BigNum { limbs: [ 0x16a24a1c573a1e01031ac8046f9bdd, 0x2ea35c2dbfb86866a52cf7b2121414, 0x0031df ] } , - BigNum { limbs: [ 0x2703973a98577b707f616b8ee5bc69, 0x35a38c635602c55fbb5a72a5dee0a8, 0x002220 ] } , - BigNum { limbs: [ 0x96a06bc56604838f809e93711a4398, 0x71af9d3a27456dda1cad96fbf924ab, 0x0051cd ] } , - BigNum { limbs: [ 0xd426ce3bc379cebaa02908f78226c1, 0x3b64fc8a8d3697b57a95d72f49a7ec, 0x006531 ] } , - BigNum { limbs: [ 0xe97d34c43ae230455fd6f6087dd940, 0x6bee2d12f0119b845d7232728e5d66, 0x000ebc ] } , - BigNum { limbs: [ 0x1aee8a70a157bc3db5dce28b3ecf15, 0xa940ed13adc86207c5cca3e248bbea, 0x0066a7 ] } , - BigNum { limbs: [ 0xa2b5788f5d0442c24a231c74c130ec, 0xfe123c89cf7fd132123b65bf8f4969, 0x000d45 ] } , - BigNum { limbs: [ 0x8d825a7d11480cdc99619927e24871, 0x40afc2350d54fc80dd3fde8f89eaed, 0x0012b8 ] } , - BigNum { limbs: [ 0x3021a882ed13f223669e65d81db790, 0x66a367686ff336b8fac82b124e1a66, 0x006135 ] } , - BigNum { limbs: [ 0x6d89d1cf521a52f9730ea6ccca6aa9, 0x874736ffd05944b37a5bdf5fc29b8e, 0x00017a ] } , - BigNum { limbs: [ 0x501a3130ac41ac068cf15833359558, 0x200bf29daceeee865dac2a421569c5, 0x007273 ] } , - BigNum { limbs: [ 0x2ebb72dd507ad3e370ae5c9d88c367, 0xcad2981271db38af49782c25cc6a83, 0x002982 ] } , - BigNum { limbs: [ 0x8ee89022ade12b1c8f51a262773c9a, 0xdc80918b0b6cfa8a8e8fdd7c0b9ad0, 0x004a6a ] } , - BigNum { limbs: [ 0x40bb9966258c7e444ef5bf9f9eaf5d, 0x50d0cd0a9c9ad02239843d3a7238d0, 0x00238a ] } , - BigNum { limbs: [ 0x7ce86999d8cf80bbb10a3f606150a4, 0x56825c92e0ad63179e83cc6765cc83, 0x005063 ] } , - BigNum { limbs: [ 0xd860053850eb383390d76bb3f42bd6, 0x4a15cbfaab68c4280ae7caa60cf1aa, 0x003f5e ] } , - BigNum { limbs: [ 0xe543fdc7ad70c6cc6f28934c0bd42b, 0x5d3d5da2d1df6f11cd203efbcb13a8, 0x00348f ] } , - BigNum { limbs: [ 0xaef4419c79da6004e08d670c53a44e, 0xf7bd11fb6ad2133b0600858128f29b, 0x0069fc ] } , - BigNum { limbs: [ 0x0eafc16384819efb1f7297f3ac5bb3, 0xaf9617a212761ffed2078420af12b8, 0x0009f0 ] } , - BigNum { limbs: [ 0x7f907f020a14b917b055c5dfbd2d5c, 0xe05ec31861f5674bdaf8e72b8709a1, 0x006927 ] } , - BigNum { limbs: [ 0x3e1383fdf44745e84faa392042d2a5, 0xc6f466851b52cbedfd0f227650fbb2, 0x000ac5 ] } , - BigNum { limbs: [ 0xebc1bad8e840c2ad13f6bbb95ec8ec, 0xcb2b258381423a47594a3ac9ba80ed, 0x000ba4 ] } , - BigNum { limbs: [ 0xd1e24827161b3c52ec094346a13715, 0xdc280419fc05f8f27ebdced81d8465, 0x006848 ] } , - BigNum { limbs: [ 0x2b07db533eecf717c095e63014ae72, 0x14ee8e4ee0069beb9bd9e5a49c9517, 0x002bbf ] } , - BigNum { limbs: [ 0x929c27acbf6f07e83f6a18cfeb518f, 0x92649b4e9d41974e3c2e23fd3b703c, 0x00482e ] } , - BigNum { limbs: [ 0xfce3f1ae16e1352f27668740f423f4, 0x53b32e18eb883962e4267ad3b836c2, 0x000776 ] } , - BigNum { limbs: [ 0xc0c01151e77ac9d0d89977bf0bdc0d, 0x539ffb8491bff9d6f3e18ece1fce90, 0x006c77 ] } , - BigNum { limbs: [ 0x0cb139b40f4c25efde2d1e3d91bdd7, 0x607ce8d23ffed09655e7bf9bbb56a0, 0x002fac ] } , - BigNum { limbs: [ 0xb0f2c94bef0fd91021d2e0c26e422a, 0x46d640cb3d4962a382204a061caeb3, 0x004441 ] } , - BigNum { limbs: [ 0x9056c4e381145f218592573596e4e9, 0x1da7c6d8816a814bffbf8d20cef142, 0x000e09 ] } , - BigNum { limbs: [ 0x2d4d3e1c7d479fde7a6da7ca691b18, 0x89ab62c4fbddb1edd8487c81091411, 0x0065e4 ] } , - BigNum { limbs: [ 0x85d191ac75223523bb85f2da7f3e51, 0xb26339d05091e20e765bc6522c3d49, 0x0023fb ] } , - BigNum { limbs: [ 0x37d271538939c9dc447a0c2580c1b0, 0xf4efefcd2cb6512b61ac434fabc80a, 0x004ff1 ] } , - BigNum { limbs: [ 0x42dd56d39e955417d408cfe1efe0da, 0x6dd7b2cf3c059a45ee2eabefd88d8d, 0x001286 ] } , - BigNum { limbs: [ 0x7ac6ac2c5fc6aae82bf72f1e101f27, 0x397b76ce414298f3e9d95db1ff77c6, 0x006167 ] } , - BigNum { limbs: [ 0x8ff68b2704622d8db3b98e4423fc50, 0x8734ba95974fe0a610e2a9cc4f55cf, 0x0021c7 ] } , - BigNum { limbs: [ 0x2dad77d8f9f9d1724c4670bbdc03b1, 0x201e6f07e5f85293c7255fd588af84, 0x005226 ] } , - BigNum { limbs: [ 0x8beba55b423887eb9775afe0580eb6, 0xc6493ca6f7bafdd94ab18c03456354, 0x00021f ] } , - BigNum { limbs: [ 0x31b85da4bc237714688a4f1fa7f14b, 0xe109ecf6858d35608d567d9e92a1ff, 0x0071cd ] } , - BigNum { limbs: [ 0xddf65cfc1c7f198f6e446f0ba80111, 0xfc3367b27efadae203a5d04d12b33b, 0x00547e ] } , - BigNum { limbs: [ 0xdfada603e1dce57091bb8ff457fef0, 0xab1fc1eafe4d5857d4623954c55217, 0x001f6e ] } , - BigNum { limbs: [ 0xb2111259c0e6827b9f2d0dfbe1fda0, 0xea46adb91f8909429055d788c6ef35, 0x0045e8 ] } , - BigNum { limbs: [ 0x0b92f0a63d757c8460d2f1041e0261, 0xbd0c7be45dbf29f747b2321911161e, 0x002e04 ] } , - BigNum { limbs: [ 0xd451939d2efc7530d247f9f1b06a9d, 0x723488ddb269aa2a0bb898bac279da, 0x002e0f ] } , - BigNum { limbs: [ 0xe9526f62cf5f89cf2db8050e4f9564, 0x351ea0bfcade890fcc4f70e7158b78, 0x0045de ] } , - BigNum { limbs: [ 0xcdfd800f910da40d61b57cc139d00a, 0x6f4e20fb2f20f36c5be4373da4ad3e, 0x002436 ] } , - BigNum { limbs: [ 0xefa682f06d4e5af29e4a823ec62ff7, 0x380508a24e273fcd7c23d264335814, 0x004fb7 ] } , - BigNum { limbs: [ 0xad59732db132de9f70a3a4625a28a2, 0x30d35a07976b6f22eeb847e6a4c2c5, 0x000455 ] } , - BigNum { limbs: [ 0x104a8fd24d2920608f5c5a9da5d75f, 0x767fcf95e5dcc416e94fc1bb33428e, 0x006f98 ] } , - BigNum { limbs: [ 0xa83f0d64199428796ae7ed987e3031, 0x66c481043d84ce7b5b9a58967a125a, 0x006e11 ] } , - BigNum { limbs: [ 0x1564f59be4c7d6869518116781cfd0, 0x408ea8993fc364be7c6db10b5df2f9, 0x0005dc ] } , - BigNum { limbs: [ 0xfeec51f753cc687c69d6ae5df2c7e5, 0x01672a864c45dae541d1fd7ab0cf3b, 0x00252a ] } , - BigNum { limbs: [ 0xbeb7b108aa8f9683962950a20d381c, 0xa5ebff173102585496360c27273617, 0x004ec3 ] } , - BigNum { limbs: [ 0x3737709114df79354b1b9355e6a54e, 0x4098bda9ad6a6469757c2498b0fd99, 0x006a78 ] } , - BigNum { limbs: [ 0x866c926ee97c85cab4e46baa195ab3, 0x66ba6bf3cfddced0628be5092707ba, 0x000975 ] } , - BigNum { limbs: [ 0x51ed8769fd01bf945fda78a7f367d9, 0x753bf1d2a62039f1517d74049b890e, 0x004fe3 ] } , - BigNum { limbs: [ 0x6bb67b96015a3f6ba02586580c9828, 0x321737cad727f948868a959d3c7c45, 0x00240a ] } , - BigNum { limbs: [ 0x3fe7cabd0b23e5bf705eba460abe55, 0x3151de041923e02a79c24740b9cac2, 0x0008cf ] } , - BigNum { limbs: [ 0x7dbc3842f33819408fa144b9f541ac, 0x76014b996424530f5e45c2611e3a91, 0x006b1e ] } , - BigNum { limbs: [ 0x66c55dea845e4933d0b97dedcbec39, 0xbe534af38fff28cbbe5b58d6539c1a, 0x002362 ] } , - BigNum { limbs: [ 0x56dea51579fdb5cc2f4681123413c8, 0xe8ffdea9ed490a6e19acb0cb846939, 0x00508a ] } , - BigNum { limbs: [ 0xe74ce466f28a996afd86c991620276, 0x6a14aab731397177349c6cb97b7c51, 0x005ffd ] } , - BigNum { limbs: [ 0xd6571e990bd165950279356e9dfd8b, 0x3d3e7ee64c0ec1c2a36b9ce85c8901, 0x0013f0 ] } , - BigNum { limbs: [ 0xfc885d40f73760387ca37368ee6036, 0xfdacb64f6dcef359c6db5d8d487fc5, 0x003810 ] } , - BigNum { limbs: [ 0xc11ba5bf07249ec7835c8b97119fcb, 0xa9a6734e0f793fe0112cac148f858d, 0x003bdc ] } , - BigNum { limbs: [ 0xe66d78cb626cc03ccda280ddf7c676, 0xaa5aa0b483b385f66bd08a1d249b53, 0x006a97 ] } , - BigNum { limbs: [ 0xd7368a349bef3ec3325d7e2208398b, 0xfcf888e8f994ad436c377f84b369ff, 0x000955 ] } , - BigNum { limbs: [ 0xe73f7a50c5aaeb5db85ae6ebfcb38d, 0xbca65083b25f7ee89ab1508940ca94, 0x001c15 ] } , - BigNum { limbs: [ 0xd66488af38b113a247a51814034c74, 0xeaacd919cae8b4513d56b918973abe, 0x0057d7 ] } , - BigNum { limbs: [ 0x3041d38fa295c8677f529da0db3616, 0x61b3e4c04bcf4cc051000148d5479a, 0x006b8b ] } , - BigNum { limbs: [ 0x8d622f705bc6369880ad615f24c9eb, 0x459f44dd3178e6798708085902bdb9, 0x000862 ] } , - BigNum { limbs: [ 0x36ba5d59a1fdb3918b8ff2657cb799, 0x73141aa50ce8e0448856303668e326, 0x001a6f ] } , - BigNum { limbs: [ 0x86e9a5a65c5e4b6e74700c9a834868, 0x343f0ef8705f52f54fb1d96b6f222d, 0x00597e ] } , - BigNum { limbs: [ 0x6ccba57529ef3a2e69b325f8c2d10e, 0x4d647a8586116f35f254c16ac4e2e8, 0x000d42 ] } , - BigNum { limbs: [ 0x50d85d8ad46cc4d1964cd9073d2ef3, 0x59eeaf17f736c403e5b3483713226b, 0x0066ab ] } , - BigNum { limbs: [ 0xd6a430a0bc13faa1c38e986fed60b7, 0xce5eedbb83c74a15db11a3b554b5d3, 0x006858 ] } , - BigNum { limbs: [ 0xe6ffd25f4248045e3c716690129f4a, 0xd8f43be1f980e923fcf665ec834f7f, 0x000b94 ] } , - BigNum { limbs: [ 0xbb69b1e997262c5f8b75eb59322015, 0xada1e5d0b6bf2aca0bb3f1eaef08eb, 0x0038e8 ] } , - BigNum { limbs: [ 0x023a51166735d2a0748a13a6cddfec, 0xf9b143ccc689086fcc5417b6e8fc68, 0x003b04 ] } , - BigNum { limbs: [ 0xb9c653a69df49edefa7c37d09c36a2, 0xadf904b0681b511569231f5f35c687, 0x0049b2 ] } , - BigNum { limbs: [ 0x03ddaf59606760210583c72f63c95f, 0xf95a24ed152ce2246ee4ea42a23ecc, 0x002a3a ] } , - BigNum { limbs: [ 0x544e0eef300ebb6922152d741da680, 0xf4657f7341d681f7a80461466d15fc, 0x00633f ] } , - BigNum { limbs: [ 0x6955f410ce4d4396ddead18be25981, 0xb2edaa2a3b71b1423003a85b6aef57, 0x0010ad ] } , - BigNum { limbs: [ 0x3cb7a69485ca0129ceb6ef8030b2de, 0x6468a2d46ee05d32b857f28457a44c, 0x00702f ] } , - BigNum { limbs: [ 0x80ec5c6b7891fdd631490f7fcf4d23, 0x42ea86c90e67d6071fb0171d806107, 0x0003be ] } , - BigNum { limbs: [ 0x690adce0d4559ad0bab5f02b35aea3, 0x8d7a680f4f615969a24f8e2106f81a, 0x005dc7 ] } , - BigNum { limbs: [ 0x5499261f2a06642f454a0ed4ca515e, 0x19d8c18e2de6d9d035b87b80d10d39, 0x001626 ] } , - BigNum { limbs: [ 0xbf6566f761bbaaa58ea51a15cb2a93, 0xa436bbf70ebc9a481043f60ec7964f, 0x0042fa ] } , - BigNum { limbs: [ 0xfe3e9c089ca0545a715ae4ea34d56e, 0x031c6da66e8b98f1c7c41393106f03, 0x0030f3 ] } , - BigNum { limbs: [ 0x3c61e635e16ea6e68378ad80a7bb00, 0x1824c50aa16fccd46c8c0a5d9be527, 0x004d3d ] } , - BigNum { limbs: [ 0x81421cca1ced58197c87517f584501, 0x8f2e6492dbd866656b7bff443c202c, 0x0026b0 ] } , - BigNum { limbs: [ 0x32055cd6e43a26efe507326576562d, 0x3a3febc19c74e00c852874294fe1a0, 0x006623 ] } , - BigNum { limbs: [ 0x8b9ea6291a21d8101af8cc9a89a9d4, 0x6d133ddbe0d3532d52df95788823b3, 0x000dca ] } , - BigNum { limbs: [ 0x920cdabfd84a8600c41c7ed4c36731, 0xe4e20eda21e3bc795bd8f25ded6ef3, 0x000937 ] } , - BigNum { limbs: [ 0x2b972840261178ff3be3802b3c98d0, 0xc2711ac35b6476c07c2f1743ea9660, 0x006ab5 ] } , - BigNum { limbs: [ 0xca1d8869e45cb67ef2f5436db89ce5, 0x428cd15fec9829f4d52d022a11c056, 0x003d18 ] } , - BigNum { limbs: [ 0xf3867a9619ff48810d0abb9247631c, 0x64c6583d90b0094502db0777c644fc, 0x0036d5 ] } , - BigNum { limbs: [ 0xc512d0ba6e3f20da7810f90a14ed63, 0xe965ba4aab15753bb87fe847a6e84a, 0x001400 ] } , - BigNum { limbs: [ 0xf8913245901cde2587ef05f5eb129e, 0xbded6f52d232bdfe1f88215a311d08, 0x005fec ] } , - BigNum { limbs: [ 0xb385262d0e06a7bf046f046933915c, 0x2fcbe3d8e169f25d115b2909df5fae, 0x0070a5 ] } , - BigNum { limbs: [ 0x0a1edcd2f0555740fb90fa96cc6ea5, 0x778745c49bde40dcc6ace097f8a5a5, 0x000348 ] } , - BigNum { limbs: [ 0x8d607f4ee699ae051d64216ef65230, 0xb7a8f24647997c6daa193db1745c67, 0x003466 ] } , - BigNum { limbs: [ 0x304383b117c250fae29bdd9109add1, 0xefaa375735aeb6cc2deecbf063a8ec, 0x003f86 ] } , - BigNum { limbs: [ 0xd5f7ce03dd2713a624911665fba78b, 0x63171cfd358f14986d8c2b99885009, 0x002862 ] } , - BigNum { limbs: [ 0xe7ac34fc2134eb59db6ee89a045876, 0x443c0ca047b91ea16a7bde084fb549, 0x004b8b ] } , - BigNum { limbs: [ 0xfe70a1a000bdeededa81868d68b00a, 0xd7c52f795ab5a3cbe846b833307b38, 0x0063a9 ] } , - BigNum { limbs: [ 0xbf33615ffd9e1021257e7872974ff7, 0xcf8dfa2422928f6defc1516ea78a1a, 0x001043 ] } , - BigNum { limbs: [ 0xe211b10f8f4244573cc1221781e0bc, 0xa9ee4fed8c9defe5bf47c589849963, 0x0002ca ] } , - BigNum { limbs: [ 0xdb9251f06f19baa8c33edce87e1f45, 0xfd64d9aff0aa435418c04418536bef, 0x007122 ] } , - BigNum { limbs: [ 0x377cbd2bf36fcc3ec268ec688da522, 0x1c5a67a005fe6aef4b6396adfc608c, 0x004310 ] } , - BigNum { limbs: [ 0x862745d40aec32c13d971297725adf, 0x8af8c1fd7749c84a8ca472f3dba4c7, 0x0030dd ] } , - BigNum { limbs: [ 0x258de8ab7c6bf6492d72265c8bb286, 0x12dd6a762ba5433ae5253027a86d6c, 0x001e57 ] } , - BigNum { limbs: [ 0x98161a5481f008b6d28dd8a3744d7b, 0x9475bf2751a2effef2e2d97a2f97e7, 0x005596 ] } , - BigNum { limbs: [ 0xfc6245c2276cfe52b9e2e3d8e363f5, 0x8f91391224f82d1509ea7380eb432e, 0x006724 ] } , - BigNum { limbs: [ 0xc141bd3dd6ef00ad461d1b271c9c0c, 0x17c1f08b58500624ce1d9620ecc224, 0x000cc9 ] } , - BigNum { limbs: [ 0xab98917739772b3fcea5a50aafcbdb, 0x2bbc74577df8687bcc2850f602ddf5, 0x002b9d ] } , - BigNum { limbs: [ 0x120b7188c4e4d3c0315a59f5503426, 0x7b96b545ff4fcabe0bdfb8abd5275e, 0x004850 ] } , - BigNum { limbs: [ 0x59749fab0ea4f5cad4d5192ef12ff5, 0xf00a1aaafd469e2d6961368dca2476, 0x002787 ] } , - BigNum { limbs: [ 0x642f6354efb709352b2ae5d10ed00c, 0xb7490ef28001950c6ea6d3140de0dd, 0x004c65 ] } , - BigNum { limbs: [ 0xc74b9514983765d71e1882e1dd7f28, 0x927973e027868355da437798fef908, 0x00730c ] } , - BigNum { limbs: [ 0xf6586deb66249928e1e77c1e2280d9, 0x14d9b5bd55c1afe3fdc49208d90c4a, 0x0000e1 ] } , - BigNum { limbs: [ 0xe18a0dbf32e81b22ac28512f733ac0, 0x88e2477fbf79aba7460fd9c360ec14, 0x006684 ] } , - BigNum { limbs: [ 0xdc19f540cb73e3dd53d7add08cc541, 0x1e70e21dbdce879291f82fde77193e, 0x000d69 ] } , - BigNum { limbs: [ 0x67f6c836862ed38368bc3ff9fe041d, 0x3f6664ca78be793846d6244234b80d, 0x005e13 ] } , - BigNum { limbs: [ 0x55ad3ac9782d2b7c9743bf0601fbe4, 0x67ecc4d30489ba019131e55fa34d46, 0x0015da ] } , - BigNum { limbs: [ 0x95610ecb9899c53b6ead007648781c, 0xf6f4afb976d236fa3357bfa851e961, 0x0022da ] } , - BigNum { limbs: [ 0x2842f43465c239c49152fe89b787e5, 0xb05e79e40675fc3fa4b049f9861bf2, 0x005112 ] } , - BigNum { limbs: [ 0xaa1b5e34bb77878b236035fa24c486, 0x954412900ed54088745ec1f2c16631, 0x0050d0 ] } , - BigNum { limbs: [ 0x1388a4cb42e47774dc9fc905db3b7b, 0x120f170d6e72f2b163a947af169f22, 0x00231d ] } , - BigNum { limbs: [ 0x8a241be93dc8974e02b11bd3a217c2, 0x84a58f018d4c9b113b0587c1e3580c, 0x005870 ] } , - BigNum { limbs: [ 0x337fe716c09367b1fd4ee32c5de83f, 0x22ad9a9beffb98289d0281dff4ad47, 0x001b7d ] } , - BigNum { limbs: [ 0x8dba7176a3140438e61a2bdb947cfb, 0x7d36756abfa6e6de4760c9223ca35d, 0x006d9b ] } , - BigNum { limbs: [ 0x2fe991895b47fac719e5d3246b8306, 0x2a1cb432bda14c5b90a7407f9b61f6, 0x000652 ] } , - BigNum { limbs: [ 0x7a93ae34c98803cc138ce5decb272f, 0x9d92ac58ff78ea09ac3f1bdf706976, 0x002877 ] } , - BigNum { limbs: [ 0x431054cb34d3fb33ec73192134d8d2, 0x09c07d447dcf49302bc8edc2679bdd, 0x004b76 ] } , - BigNum { limbs: [ 0xf0341a13b3565ad286345e7ac747d6, 0x7c023d791f0bdc6832ada0a4abdbb2, 0x001473 ] } , - BigNum { limbs: [ 0xcd6fe8ec4b05a42d79cba08538b82b, 0x2b50ec245e3c56d1a55a68fd2c29a0, 0x005f7a ] } , - BigNum { limbs: [ 0x4c4fa5f5263d07bfb59bd6f3e3410f, 0x1ddc11c537cbfe3ed86585643677f4, 0x00641b ] } , - BigNum { limbs: [ 0x71545d0ad81ef7404a64280c1cbef2, 0x897717d8457c34faffa2843da18d5f, 0x000fd2 ] } , - BigNum { limbs: [ 0x2144b16886b434df3737d784288d49, 0x98ef059d3185cc257d69e121cd84b3, 0x006755 ] } , - BigNum { limbs: [ 0x9c5f519777a7ca20c8c8277bd772b8, 0x0e6424004bc267145a9e28800a80a0, 0x000c98 ] } , - BigNum { limbs: [ 0xdad8f147195417f8e3b085a77afbf2, 0xd402f8d47177c758c7a4112d4a8bea, 0x003aff ] } , - BigNum { limbs: [ 0xe2cb11b8e507e7071c4f795885040f, 0xd35030c90bd06be11063f8748d7968, 0x0038ed ] } , - BigNum { limbs: [ 0x13b822085973279feb3060dee77336, 0xec04bf19f89eb75b9bf5262d598072, 0x002dd3 ] } , - BigNum { limbs: [ 0xa9ebe0f7a4e8d76014cf9e21188ccb, 0xbb4e6a8384a97bde3c12e3747e84e1, 0x004619 ] } , - BigNum { limbs: [ 0xce316d93c6b00bb50855547902c03e, 0x97ca4d2c7b6a0c1945109c1f1e9c3a, 0x006ce3 ] } , - BigNum { limbs: [ 0xef72956c37abf34af7aaaa86fd3fc3, 0x0f88dc7101de272092f76d82b96918, 0x00070a ] } , - BigNum { limbs: [ 0x694267eeda9311b9bc81d1e5f516e1, 0x5846cd4336b188de7c8b11604d8ff0, 0x006fb0 ] } , - BigNum { limbs: [ 0x54619b1123c8ed46437e2d1a0ae920, 0x4f0c5c5a4696aa5b5b7cf8418a7563, 0x00043d ] } , - BigNum { limbs: [ 0x24f213c919d43d562e491138e601de, 0xe28f29fa7cfa57c3839a0140d9f2bb, 0x0007dd ] } , - BigNum { limbs: [ 0x98b1ef36e487c1a9d1b6edc719fe23, 0xc4c3ffa3004ddb76546e0860fe1298, 0x006c0f ] } , - BigNum { limbs: [ 0x6b7e5ff4d425ec22ae86624a026d8f, 0xf1287fe086b18251211dc7db069146, 0x00583a ] } , - BigNum { limbs: [ 0x5225a30b2a3612dd51799cb5fd9272, 0xb62aa9bcf696b0e8b6ea41c6d1740d, 0x001bb2 ] } , - BigNum { limbs: [ 0x80b253331456f274067e67d28a7bf9, 0xe5fb6401d35e8b476c3d92001ca186, 0x000d83 ] } , - BigNum { limbs: [ 0x3cf1afccea050c8bf981972d758408, 0xc157c59ba9e9a7f26bca77a1bb63cd, 0x006669 ] } , - BigNum { limbs: [ 0xd98dbcb16d6b2bc8c4f400030cd5c1, 0x16f7a347bb978b3074eb9fb6094903, 0x0047b1 ] } , - BigNum { limbs: [ 0xe416464e90f0d3373b0bfefcf32a40, 0x905b8655c1b0a809631c69ebcebc4f, 0x002c3c ] } , - BigNum { limbs: [ 0xb330e761da3be1436d1d98942671d5, 0xa5e3e36a9bf331e93cc37de09f5274, 0x006d89 ] } , - BigNum { limbs: [ 0x0a731b9e24201dbc92e2666bd98e2c, 0x016f4632e15501509b448bc138b2df, 0x000664 ] } , - BigNum { limbs: [ 0x3fb3867287d861038cb90b5f9e2564, 0x2156aa8bb80679fa31d23cd3c210ae, 0x0014ef ] } , - BigNum { limbs: [ 0x7df07c8d76839dfc7346f3a061da9d, 0x85fc7f11c541b93fa635ccce15f4a5, 0x005efe ] } , - BigNum { limbs: [ 0x32317a2cdbea65c58c12f0eb455e6b, 0x4698b9e42244abdd2198bdf7fde562, 0x00244b ] } , - BigNum { limbs: [ 0x8b7288d32271993a73ed0e14baa196, 0x60ba6fb95b03875cb66f4ba9da1ff1, 0x004fa2 ] } , - BigNum { limbs: [ 0x8ed195331b98672808faa3ccaafe7d, 0xa34e6b5142c7e48095cf2e1b9d09fa, 0x00138f ] } , - BigNum { limbs: [ 0x2ed26dcce2c397d7f7055b33550184, 0x0404be4c3a804eb94238db863afb59, 0x00605e ] } , - BigNum { limbs: [ 0x6ce50ce8631ddc37c974247e893e37, 0xbafc2e8182867d9f8711636eb28e84, 0x004348 ] } , - BigNum { limbs: [ 0x50bef6179b3e22c8368bda8176c1ca, 0xec56fb1bfac1b59a50f6a6332576cf, 0x0030a4 ] } , - BigNum { limbs: [ 0xdb3d1d363620c7059279cc46720e88, 0x4bc4b85d0584dfd6b5fa91067e76e4, 0x000d5b ] } , - BigNum { limbs: [ 0xe266e5c9c83b37fa6d8632b98df179, 0x5b8e714077c35363220d789b598e6e, 0x006692 ] } , - BigNum { limbs: [ 0x6ad7cae3c87627c98f6b3a48df5a28, 0xd4863b46a956c8dcee098ed888b038, 0x0029fb ] } , - BigNum { limbs: [ 0x52cc381c35e5d7367094c4b720a5d9, 0xd2ccee56d3f16a5ce9fe7ac94f551b, 0x0049f1 ] } , - BigNum { limbs: [ 0xc9b512172293bb81396ff313d3bb80, 0x1736abd6d04b4739c52b4fabaab4dd, 0x005da9 ] } , - BigNum { limbs: [ 0xf3eef0e8dbc8437ec6900bec2c4481, 0x901c7dc6acfcec0012dcb9f62d5075, 0x001644 ] } , - BigNum { limbs: [ 0x977a45ccd1f4913ff0793ba434977c, 0x8bcb0af58a52192a995975d7064454, 0x003af5 ] } , - BigNum { limbs: [ 0x2629bd332c676dc00f86c35bcb6885, 0x1b881ea7f2f61a0f3eae93cad1c0ff, 0x0038f8 ] } , - BigNum { limbs: [ 0xef2fb42e82a91c3aaf009278b4b454, 0xef630dea07dd87c170f9a2a01856a4, 0x00038b ] } , - BigNum { limbs: [ 0xce744ed17bb2e2c550ff6c874b4bad, 0xb7f01bb3756aab78670e6701bfaeae, 0x007061 ] } , - BigNum { limbs: [ 0xc8e73f1fb0956aac66e8dafc81fe1e, 0x059efabd9ae1387d443ddded77add3, 0x00321c ] } , - BigNum { limbs: [ 0xf4bcc3e04dc69453991724037e01e3, 0xa1b42edfe266fabc93ca2bb460577f, 0x0041d1 ] } , - BigNum { limbs: [ 0x3933c1beda8052e1a0aa54ab584031, 0xe11c874ac1ff523154d2355e4e4176, 0x000605 ] } , - BigNum { limbs: [ 0x8470414123dbac1e5f55aa54a7bfd0, 0xc636a252bb48e1088335d44389c3dd, 0x006de7 ] } , - BigNum { limbs: [ 0x434bad0898bac4640aa66581465d9a, 0xaf57ad62903dde30dfbc088a2d14cc, 0x002840 ] } , - BigNum { limbs: [ 0x7a5855f765a13a9bf559997eb9a267, 0xf7fb7c3aed0a5508f84c0117aaf087, 0x004bac ] } , - BigNum { limbs: [ 0xa295c7dfe550262e424716d6fbaa2d, 0xd989cae69b749be1ba8e713c6bf63c, 0x000224 ] } , - BigNum { limbs: [ 0x1b0e3b20190bd8d1bdb8e8290455d4, 0xcdc95eb6e1d397581d7998656c0f17, 0x0071c8 ] } , - BigNum { limbs: [ 0x027b481a99f8d7f13eed8a7afc59cc, 0x1cc9790e8f2c1db924e35b38caf6b5, 0x00086c ] } , - BigNum { limbs: [ 0xbb28bae56463270ec112748503a635, 0x8a89b08eee1c1580b324ae690d0e9e, 0x006b81 ] } , - BigNum { limbs: [ 0x2f35aea290ac55b604c24be38ed2f2, 0xaa61fc26cd5f4c7a8318ba28706e7c, 0x004bf1 ] } , - BigNum { limbs: [ 0x8e6e545d6dafa949fb3db31c712d0f, 0xfcf12d76afe8e6bf54ef4f796796d7, 0x0027fb ] } , - BigNum { limbs: [ 0x44c8d9317399ddb4c3351d1f85a494, 0x5c08fdb7b5f58ca2789772dc1ee600, 0x00527c ] } , - BigNum { limbs: [ 0x78db29ce8ac2214b3ccae1e07a5b6d, 0x4b4a2be5c752a6975f7096c5b91f53, 0x002171 ] } , - BigNum { limbs: [ 0xacd8c18fd788b79108eb0359f985a8, 0xa5fb219c39b3597fd7cdb7cb9ec359, 0x0020c5 ] } , - BigNum { limbs: [ 0x10cb417026d3476ef714fba6067a59, 0x015808014394d9ba003a51d63941fa, 0x005328 ] } , - BigNum { limbs: [ 0x336e8b0eaa01fdee91311271ee45a3, 0x6b1c12f87566ddd0bf944a8e6d750a, 0x003ee3 ] } , - BigNum { limbs: [ 0x8a3577f1545a01116eceec8e11ba5e, 0x3c3716a507e155691873bf136a9049, 0x00350a ] } , - BigNum { limbs: [ 0x0e3a4a2c1307877112e3fc3d4ace71, 0x75e2c927a7c9d2046ce027a513df74, 0x001ada ] } , - BigNum { limbs: [ 0xaf69b8d3eb54778eed1c02c2b53190, 0x31706075d57e61356b27e1fcc425df, 0x005913 ] } , - BigNum { limbs: [ 0x531d011069710c1aadbdf0d9becb26, 0xfe392258bd3c57b360a745e7386083, 0x005264 ] } , - BigNum { limbs: [ 0x6a8701ef94eaf2e552420e264134db, 0xa91a0744c00bdb867760c3ba9fa4d0, 0x002188 ] } , - BigNum { limbs: [ 0xe9187454698944ac775919154154c1, 0x8c85aab132d3f04ce0af0a60f99468, 0x001dba ] } , - BigNum { limbs: [ 0xd48b8eab94d2ba5388a6e5eabeab40, 0x1acd7eec4a7442ecf758ff40de70ea, 0x005633 ] } , - BigNum { limbs: [ 0x6c1604b24820a3770340790d55dc4c, 0x70485191eb56fc775110f342bec6f3, 0x003e60 ] } , - BigNum { limbs: [ 0x518dfe4db63b5b88fcbf85f2aa23b5, 0x370ad80b91f136c286f7165f193e60, 0x00358d ] } , - BigNum { limbs: [ 0xeafb428e38a30928c22245d72bb2a3, 0xce32f7e962fa2b3e31afd97e204be3, 0x004902 ] } , - BigNum { limbs: [ 0xd2a8c071c5b8f5d73dddb928d44d5e, 0xd92031b41a4e07fba6583023b7b96f, 0x002aea ] } , - BigNum { limbs: [ 0x3a451584a96e0ef35f980490fcc053, 0xd4e5faca74e951f07361d72a49f4b1, 0x00173b ] } , - BigNum { limbs: [ 0x835eed7b54edf00ca067fa6f033fae, 0xd26d2ed3085ee14964a632778e10a2, 0x005cb1 ] } , - BigNum { limbs: [ 0x2e15a71ff3bb6b1793eb9057fda39b, 0x6d1eafc21e45b97be27adfc8bad8f1, 0x00170c ] } , - BigNum { limbs: [ 0x8f8e5be00aa093e86c146ea8025c66, 0x3a3479db5f0279bdf58d29d91d2c62, 0x005ce1 ] } , - BigNum { limbs: [ 0x91a01cb11e1d388fbbb51771aacdbc, 0x5543e381889b38beaaccd6ea72786b, 0x003dcd ] } , - BigNum { limbs: [ 0x2c03e64ee03ec670444ae78e553245, 0x520f461bf4acfa7b2d3b32b7658ce8, 0x003620 ] } , - BigNum { limbs: [ 0x1b2c2bf57e2ffa8bff0d76e779efd8, 0x136e7973448a6e8452d09af6d4fe0b, 0x002579 ] } , - BigNum { limbs: [ 0xa277d70a802c047400f28818861029, 0x93e4b02a38bdc4b585376eab030748, 0x004e74 ] } , - BigNum { limbs: [ 0x965114af80d5f237b8489e744cdb6a, 0x34a8111b5e6c4c02091f65cedfc07a, 0x000798 ] } , - BigNum { limbs: [ 0x2752ee507d860cc847b7608bb32497, 0x72ab18821edbe737cee8a3d2f844d9, 0x006c55 ] } , - BigNum { limbs: [ 0xe7ccd1f49218bcde0a39b54757baf4, 0x55b1570da586ba40c31e363e1506aa, 0x006c6a ] } , - BigNum { limbs: [ 0xd5d7310b6c434221f5c649b8a8450d, 0x51a1d28fd7c178f914e9d363c2fea8, 0x000783 ] } , - BigNum { limbs: [ 0xd75a4c1d0a47bc8a57f67a92771886, 0xf7e713a14f663701ec08b9515cc1d4, 0x00504d ] } , - BigNum { limbs: [ 0xe649b6e2f4144275a809846d88e77b, 0xaf6c15fc2de1fc37ebff50507b437e, 0x00239f ] } , - BigNum { limbs: [ 0x4a6f5157ee66feed092f02034b4427, 0x089313ebbb63ab112c6e47f651c56b, 0x004f80 ] } , - BigNum { limbs: [ 0x7334b1a80ff50012f6d0fcfcb4bbda, 0x9ec015b1c1e48828ab99c1ab863fe8, 0x00246d ] } , - BigNum { limbs: [ 0x960a2dbf6b89282bb928b6c2bc3afc, 0x9de0cb3644273fde5012c262290cdd, 0x000f2b ] } , - BigNum { limbs: [ 0x2799d54092d2d6d446d7483d43c505, 0x09725e673920f35b87f5473faef876, 0x0064c2 ] } , - BigNum { limbs: [ 0xd8f900e407b7f428bce7e30c66a081, 0xa99e4a437b505d95dfd1630242422e, 0x005a1e ] } , - BigNum { limbs: [ 0xe4ab021bf6a40ad743181bf3995f80, 0xfdb4df5a01f7d5a3f836a69f95c324, 0x0019ce ] } , - BigNum { limbs: [ 0x7d648cf9f44e1804ceeaa511f4fae9, 0x69d70232147b3a090bcaa59c776b2b, 0x0041e4 ] } , - BigNum { limbs: [ 0x403f76060a0de6fb311559ee0b0518, 0x3d7c276b68ccf930cc3d6405609a28, 0x003209 ] } , - BigNum { limbs: [ 0x25da2e047033fefbbcff900fcc827f, 0x02ebc6464d846f98cb09f9865d83d0, 0x004d59 ] } , - BigNum { limbs: [ 0x97c9d4fb8e28000443006ef0337d82, 0xa46763572fc3c3a10cfe101b7a8183, 0x002694 ] } , - BigNum { limbs: [ 0xee0ffdf718781e60b137ab482066e4, 0xbc8d78d3c3cc9173a7c9c3c994b807, 0x001459 ] } , - BigNum { limbs: [ 0xcf940508e5e3e09f4ec853b7df991d, 0xeac5b0c9b97ba1c6303e45d8434d4b, 0x005f93 ] } , - BigNum { limbs: [ 0x525bc3d1cd03ba13854305ef54b104, 0x6d82f16d68853bf7bb74b643ac07c9, 0x000956 ] } , - BigNum { limbs: [ 0x6b483f2e315844ec7abcf910ab4efd, 0x39d0383014c2f7421c93535e2bfd8a, 0x006a97 ] } , - BigNum { limbs: [ 0x5e2f10a51b5409e93521dc76f14b89, 0x6a17ed37cedbd2dff79cd54a6ea067, 0x000beb ] } , - BigNum { limbs: [ 0x5f74f25ae307f516cade22890eb478, 0x3d3b3c65ae6c6059e06b34576964ec, 0x006802 ] } , - BigNum { limbs: [ 0x55735e16b82bb0a2073fb0e02a7667, 0x7f1df880e7c227e024663dc027bae4, 0x006a70 ] } , - BigNum { limbs: [ 0x6830a4e946304e5df8c04e1fd5899a, 0x2835311c95860b59b3a1cbe1b04a6f, 0x00097d ] } , - BigNum { limbs: [ 0x3c367ca1d1ffe6e2ae57afb246966b, 0xe0e87f964513f8ddba3c5316c7ec75, 0x0013e7 ] } , - BigNum { limbs: [ 0x816d865e2c5c181d51a84f4db96996, 0xc66aaa0738343a5c1dcbb68b1018de, 0x006005 ] } , - BigNum { limbs: [ 0xb3e11681c510a6dd5a6a3e91095dc7, 0x32d749c30d1dc4895811317d780782, 0x004019 ] } , - BigNum { limbs: [ 0x09c2ec7e394b5822a595c06ef6a23a, 0x747bdfda702a6eb07ff6d8245ffdd1, 0x0033d4 ] } , - BigNum { limbs: [ 0xbd453fb132b4682cdfe9db0ff4374b, 0x9c9a35f12409aee55906ba0e6f2ed2, 0x003225 ] } , - BigNum { limbs: [ 0x005ec34ecba796d3201623f00bc8b6, 0x0ab8f3ac593e84547f014f9368d681, 0x0041c8 ] } , - BigNum { limbs: [ 0xc6f53956b47ef98c1e4633a1e79a90, 0xf8a65c0009dce5d7361d5906eb273a, 0x002444 ] } , - BigNum { limbs: [ 0xf6aec9a949dd0573e1b9cb5e186571, 0xaeaccd9d736b4d62a1eab09aecde18, 0x004fa8 ] } , - BigNum { limbs: [ 0x73a69a942f840ad1d45960e9d626dc, 0xfe77b2223aa587ca2ddd92f73d486e, 0x001875 ] } , - BigNum { limbs: [ 0x49fd686bced7f42e2ba69e1629d925, 0xa8db777b42a2ab6faa2a76aa9abce5, 0x005b77 ] } , - BigNum { limbs: [ 0x880501279a899bcee868ce8587a13b, 0x8f1b04bfd10c7250976724baad776d, 0x0018f1 ] } , - BigNum { limbs: [ 0x359f01d863d263311797307a785ec6, 0x183824ddac3bc0e940a0e4e72a8de6, 0x005afc ] } , - BigNum { limbs: [ 0xb3d3b950311f02a824f0ba9a8f2963, 0x7cb97acb4245d1566d60c3a6ba5720, 0x0036d4 ] } , - BigNum { limbs: [ 0x09d049afcd3cfc57db0f446570d69e, 0x2a99aed23b0261e36aa745fb1dae33, 0x003d19 ] } , - BigNum { limbs: [ 0x8992a0b4aebe62c3176cafbba6ece2, 0x3e3e42733334ed43caff7cac4fa484, 0x005665 ] } , - BigNum { limbs: [ 0x3411624b4f9d9c3ce8934f4459131f, 0x6914e72a4a1345f60d088cf58860cf, 0x001d88 ] } , - BigNum { limbs: [ 0x3e333e731c6d86ea2f0310654c1c69, 0x45e320a61c7930dd4640b8259046fa, 0x0072e0 ] } , - BigNum { limbs: [ 0x7f70c48ce1ee7815d0fcee9ab3e398, 0x617008f760cf025c91c7517c47be59, 0x00010d ] } , - BigNum { limbs: [ 0xb4fac3c927f6e90d16741ca2ea19f3, 0x2ea688ce95690fb3e7765ded195901, 0x005fc4 ] } , - BigNum { limbs: [ 0x08a93f36d66515f2e98be25d15e60e, 0x78aca0cee7df2385f091abb4beac52, 0x001429 ] } , - BigNum { limbs: [ 0x38250aebdfea19439e2c0f3fec014c, 0x0c68a0cd2567ed61c7c501f9cc757c, 0x005f62 ] } , - BigNum { limbs: [ 0x857ef8141e71e5bc61d3efc013feb5, 0x9aea88d057e045d8104307a80b8fd7, 0x00148b ] } , - BigNum { limbs: [ 0x315044d26ab11b7f5d7bffe0b305c8, 0x73d2528c3d883247ea42471dd1c0ed, 0x006381 ] } , - BigNum { limbs: [ 0x8c53be2d93aae380a283ff1f4cfa39, 0x3380d7113fc000f1edc5c284064466, 0x00106c ] } , - BigNum { limbs: [ 0x80ec4b796d3c1fa24716c0654b3fca, 0x7624f7423ea31f36512a3c42e181bd, 0x006902 ] } , - BigNum { limbs: [ 0x3cb7b786911fdf5db8e93e9ab4c037, 0x312e325b3ea5140386ddcd5ef68396, 0x000aeb ] } , - BigNum { limbs: [ 0xd55c9043bd712ec2374a085a04cf77, 0x4dce95290db96dbc6e981c87cc0d39, 0x0039dd ] } , - BigNum { limbs: [ 0xe84772bc40ead03dc8b5f6a5fb308a, 0x598494746f8ec57d696fed1a0bf819, 0x003a10 ] } , - BigNum { limbs: [ 0xbf7472dae4da3860bf9e6bf6e31812, 0xb2cbafa33fb884780e7c68542c3f12, 0x006bd1 ] } , - BigNum { limbs: [ 0xfe2f90251981c69f406193091ce7ef, 0xf48779fa3d8faec1c98ba14dabc640, 0x00081b ] } , - BigNum { limbs: [ 0xdd1b58249906be9ff079ce58af3199, 0xcedb6916a28c6ca682e24066db3c86, 0x001c77 ] } , - BigNum { limbs: [ 0xe088aadb655540600f8630a750ce68, 0xd877c086dabbc6935525c93afcc8cc, 0x005775 ] } , - BigNum { limbs: [ 0xb2c473d5eff1b216b4e9b27e7dd10b, 0x04f3b5c0b97878d28972a2a650511c, 0x0052f6 ] } , - BigNum { limbs: [ 0x0adf8f2a0e6a4ce94b164c81822ef6, 0xa25f73dcc3cfba674e9566fb87b437, 0x0020f7 ] } , - BigNum { limbs: [ 0x8ad7d4ab3b17b51f1f8779e781781b, 0x9112fa9f6cf5817199711eebb68441, 0x00416b ] } , - BigNum { limbs: [ 0x32cc2e54c34449e0e07885187e87e6, 0x16402efe1052b1c83e96eab6218112, 0x003282 ] } , - BigNum { limbs: [ 0x388900a081efcebb6ed1c6d5c49f1c, 0xb4fd14ec51aeca9da4521c768d51ec, 0x001d1d ] } , - BigNum { limbs: [ 0x851b025f7c6c3044912e382a3b60e5, 0xf25614b12b99689c33b5ed2b4ab367, 0x0056cf ] } , - BigNum { limbs: [ 0x7bc9af0716769144464acf1f36c0d2, 0xf594e8c1b0eaeb8fc60143a855ad12, 0x006cdf ] } , - BigNum { limbs: [ 0x41da53f8e7e56dbbb9b52fe0c93f2f, 0xb1be40dbcc5d47aa1206c5f9825841, 0x00070d ] } , - BigNum { limbs: [ 0x9c31869ce1406981ccf144abd15da6, 0x3ce0bc31b687d449f891cf11c7f71e, 0x0032a7 ] } , - BigNum { limbs: [ 0x21727c631d1b957e330eba542ea25b, 0x6a726d6bc6c05eefdf763a90100e35, 0x004146 ] } , - BigNum { limbs: [ 0x3287e1eea50550f6cff67feb0214a3, 0x2edb568a00aaae9ef31c7368529f7b, 0x001469 ] } , - BigNum { limbs: [ 0x8b1c21115956ae0930097f14fdeb5e, 0x7877d3137c9d849ae4eb96398565d8, 0x005f84 ] } , - BigNum { limbs: [ 0x1765e37219c59a01744eaf22f61cd5, 0xa5ee072d800a1ddf4a71f83fdd1ad2, 0x005ac1 ] } , - BigNum { limbs: [ 0xa63e1f8de49664fe8bb14fdd09e32c, 0x0165226ffd3e155a8d961161faea81, 0x00192c ] } , - BigNum { limbs: [ 0x9cafd3f14593be08db6cfdab4f5cbc, 0x28b7d9ee0088d8fd5273b9e4c23a8a, 0x0057b4 ] } , - BigNum { limbs: [ 0x20f42f0eb8c840f724930154b0a345, 0x7e9b4faf7cbf5a3c85944fbd15cac9, 0x001c39 ] } , - BigNum { limbs: [ 0x1d9eb5efde33ed0116fc035b9ef1e4, 0xbde86d834a067c0302160fb86d4f84, 0x00151e ] } , - BigNum { limbs: [ 0xa0054d10202811fee903fba4610e1d, 0xe96abc1a3341b736d5f1f9e96ab5cf, 0x005ece ] } , - BigNum { limbs: [ 0x6855f02b9c14d37b254b4c16aecf49, 0xebabeb3d7ef48c4988b6f7e98663fa, 0x0034ca ] } , - BigNum { limbs: [ 0x554e12d462472b84dab4b2e95130b8, 0xbba73e5ffe53a6f04f5111b851a159, 0x003f22 ] } , - BigNum { limbs: [ 0x018d3725a347a231aef389d1650159, 0xe15e3ad0ea849dd9032a8990ebcab4, 0x00055b ] } , - BigNum { limbs: [ 0xbc16cbda5b145cce510c752e9afea8, 0xc5f4eecc92c39560d4dd8010ec3a9f, 0x006e91 ] } , - BigNum { limbs: [ 0x291cf291adb45adf4f59597e92099f, 0x5f789f1b1294ee932d062fe4dad38d, 0x0016a6 ] } , - BigNum { limbs: [ 0x9487106e50a7a420b0a6a5816df662, 0x47da8a826ab344a6ab01d9bcfd31c6, 0x005d47 ] } , - BigNum { limbs: [ 0x6c7c3031e114547e10569404305b4e, 0x0bfd1bdf8a97e9ebe9b3a7f47018b5, 0x005d66 ] } , - BigNum { limbs: [ 0x5127d2ce1d47aa81efa96afbcfa4b3, 0x9b560dbdf2b0494dee5461ad67ec9e, 0x001687 ] } , - BigNum { limbs: [ 0xd91b48dadb210c247b1a81979f35c0, 0x6ac519183e52453eabbc8a1e13a637, 0x0065d5 ] } , - BigNum { limbs: [ 0xe488ba25233af2db84e57d6860ca41, 0x3c8e10853ef5edfb2c4b7f83c45f1b, 0x000e18 ] } , - BigNum { limbs: [ 0xf9c0f86360276418f827bbe6225400, 0xde0c2c3ab91f997809bf4d6d1952fa, 0x0026db ] } , - BigNum { limbs: [ 0xc3e30a9c9e349ae707d84319ddac01, 0xc946fd62c42899c1ce48bc34beb258, 0x004d11 ] } , - BigNum { limbs: [ 0x80d9b39a09327511be38f00fe0e15b, 0x0ed0b718d075007221b4e63392be47, 0x006b81 ] } , - BigNum { limbs: [ 0x3cca4f65f52989ee41c70ef01f1ea6, 0x98827284acd332c7b653236e45470c, 0x00086c ] } , - BigNum { limbs: [ 0x37d5f8a16c4f0f051e1aa4af01a637, 0x04ef549725e3a992bf6d27f26ad9a0, 0x006706 ] } , - BigNum { limbs: [ 0x85ce0a5e920ceffae1e55a50fe59ca, 0xa263d506576489a7189ae1af6d2bb3, 0x000ce7 ] } , - BigNum { limbs: [ 0xd3148a4e36e3f07250f3cf33f08243, 0x11b3253731a2f1970b62d2eeb13eaf, 0x001c8e ] } , - BigNum { limbs: [ 0xea8f78b1c7780e8daf0c2fcc0f7dbe, 0x95a004664ba541a2cca536b326c6a3, 0x00575f ] } , - BigNum { limbs: [ 0xd921850e3e933c628e568582ec954a, 0x63d8ead24230b1313472e590e57dc9, 0x0010ec ] } , - BigNum { limbs: [ 0xe4827df1bfc8c29d71a9797d136ab7, 0x437a3ecb3b178208a3952410f28789, 0x006301 ] } , - BigNum { limbs: [ 0xca58916c4689cf7045743933f004c4, 0x0c8b650b839487fbfdffef881252a8, 0x0025e5 ] } , - BigNum { limbs: [ 0xf34b7193b7d22f8fba8bc5cc0ffb3d, 0x9ac7c491f9b3ab3dda081a19c5b2aa, 0x004e08 ] } , - BigNum { limbs: [ 0x98a02aabd7ff53948a74e7d72a06cd, 0x3cd150debfd777dd0e7b4cd77e3590, 0x006129 ] } , - BigNum { limbs: [ 0x2503d854265cab6b758b1728d5f934, 0x6a81d8bebd70bb5cc98cbcca59cfc3, 0x0012c4 ] } , - BigNum { limbs: [ 0x8d3c5d8e2ae3c2772ae3260559361e, 0x29d913bae95cd300eb8ed538a67baf, 0x006233 ] } , - BigNum { limbs: [ 0x3067a571d3783c88d51cd8faa6c9e3, 0x7d7a15e293eb6038ec7934693189a4, 0x0011ba ] } , - BigNum { limbs: [ 0x7cb9e132d2958e4a821d18d001905b, 0x4d1e9a0e31c08c8b929e83caa601f1, 0x0042c1 ] } , - BigNum { limbs: [ 0x40ea21cd2bc670b57de2e62ffe6fa6, 0x5a348f8f4b87a6ae456985d7320362, 0x00312c ] } , - BigNum { limbs: [ 0xb6a6109f87dc09a945ddfd3194d6d4, 0x6a5b221a98193db17c13a115ad244a, 0x006b90 ] } , - BigNum { limbs: [ 0x06fdf260767ff556ba2201ce6b292d, 0x3cf80782e52ef5885bf4688c2ae109, 0x00085d ] } , - BigNum { limbs: [ 0xb409a53b4e735b3e20998093f034d1, 0x4132904aebad93d405cac07f33f025, 0x002dcc ] } , - BigNum { limbs: [ 0x099a5dc4afe8a3c1df667e6c0fcb30, 0x66209952919a9f65d23d4922a4152e, 0x004621 ] } , - BigNum { limbs: [ 0x347967c3bc6e57d128b5e565be28ca, 0xd7c469a307201e75fc005a4b76b707, 0x0040d8 ] } , - BigNum { limbs: [ 0x892a9b3c41eda72ed74a199a41d737, 0xcf8ebffa762814c3dc07af56614e4c, 0x003314 ] } , - BigNum { limbs: [ 0xe64499b0d7caec0b00709d16ad9a83, 0xb54c8d72e98d795445bdfc60240f61, 0x00365f ] } , - BigNum { limbs: [ 0xd75f694f269112f4ff8f61e952657e, 0xf2069c2a93bab9e5924a0d41b3f5f1, 0x003d8d ] } , - BigNum { limbs: [ 0xd7a3987f769bcdcca9e87f5a7f1839, 0x28c04a0ebb7cef135ae7b8e3362098, 0x000aaf ] } , - BigNum { limbs: [ 0xe6006a8087c0313356177fa580e7c8, 0x7e92df8ec1cb44267d2050bea1e4ba, 0x00693e ] } , - BigNum { limbs: [ 0x46526f56e933837b9a7281e045bece, 0xca3c7024fc860c906c9a837e1ef6c9, 0x0051c3 ] } , - BigNum { limbs: [ 0x775193a915287b84658d7d1fba4133, 0xdd16b97880c226a96b6d8623b90e8a, 0x002229 ] } , - BigNum { limbs: [ 0x7bf2539257c17e7aad249861212753, 0x694837b9391d085fa60b9f017e7069, 0x0036a0 ] } , - BigNum { limbs: [ 0x41b1af6da69a808552db669eded8ae, 0x3e0af1e4442b2ada31fc6aa05994ea, 0x003d4d ] } , - BigNum { limbs: [ 0x08ab2a2ad21968eec3c5de94bad69d, 0xc186cf00b349406509fe76f63710de, 0x0054c8 ] } , - BigNum { limbs: [ 0xb4f8d8d52c4296113c3a206b452964, 0xe5cc5a9cc9fef2d4ce0992aba0f475, 0x001f24 ] } , - BigNum { limbs: [ 0x944f00370ccf4f13fb91c643fb2d66, 0x95a692611ba92c8972a756f96cb36c, 0x003bbe ] } , - BigNum { limbs: [ 0x295502c8f18cafec046e38bc04d29b, 0x11ac973c619f06b06560b2a86b51e7, 0x00382f ] } , - BigNum { limbs: [ 0x272c6068d63114246a617ab5b1d7c1, 0xc9ed81babb1d1bd763ca4d6bdfd295, 0x005026 ] } , - BigNum { limbs: [ 0x9677a297282aeadb959e844a4e2840, 0xdd65a7e2c22b1762743dbc35f832be, 0x0023c6 ] } , - BigNum { limbs: [ 0x951e797897dba86fdf5cf1dc0d5e2d, 0xeff498b8905fcb05b3a6dd0acdcfa0, 0x00328e ] } , - BigNum { limbs: [ 0x288589876680569020a30d23f2a1d4, 0xb75e90e4ece8683424612c970a35b3, 0x00415e ] } , - BigNum { limbs: [ 0x6c51f4dd49bc1edfaec8846128af8c, 0xec951e59e820a34667352ae9d5dc49, 0x00565e ] } , - BigNum { limbs: [ 0x51520e22b49fe02051377a9ed75075, 0xbabe0b4395278ff370d2deb802290a, 0x001d8e ] } , - BigNum { limbs: [ 0x564a7da1b902e56caf3d28aac9a3c4, 0xb58e63be683db556ce006a3e0689cf, 0x0032f3 ] } , - BigNum { limbs: [ 0x6759855e4559199350c2d655365c3d, 0xf1c4c5df150a7de30a079f63d17b84, 0x0040f9 ] } , - BigNum { limbs: [ 0xc813f4bdbc74d2b530d23b962f2a33, 0xdc158b69f2a11da67680a3c4d0af46, 0x004500 ] } , - BigNum { limbs: [ 0xf5900e4241e72c4acf2dc369d0d5ce, 0xcb3d9e338aa71593618765dd07560c, 0x002eec ] } , - BigNum { limbs: [ 0x5b041f5f9708988f8dae3158baa4f0, 0xfeb5f831eb4b4062055dbcce3169b1, 0x00257e ] } , - BigNum { limbs: [ 0x629fe3a0675366707251cda7455b11, 0xa89d316b91fcf2d7d2aa4cd3a69ba2, 0x004e6e ] } , - BigNum { limbs: [ 0xd87eea1587a122a77fcdb6e01fc805, 0xddb0d6f819ff9a970fd511c11cc817, 0x005111 ] } , - BigNum { limbs: [ 0xe52518ea76badc588032481fe037fc, 0xc9a252a5634898a2c832f7e0bb3d3b, 0x0022db ] } , - BigNum { limbs: [ 0xcbb32eecd136f3bd36b91fbcc4d9b6, 0x5004d39bdc27c60b52058c6a5d992c, 0x0036d5 ] } , - BigNum { limbs: [ 0xf1f0d4132d250b42c946df433b264b, 0x574e5601a1206d2e86027d377a6c26, 0x003d18 ] } , - BigNum { limbs: [ 0x31775507138bf4d55710af424be9d8, 0xced1d9e77067fa868a71c6f77de16d, 0x006ab5 ] } , - BigNum { limbs: [ 0x8c2cadf8ead00a2aa8ef4fbdb41629, 0xd8814fb60ce038b34d9642aa5a23e6, 0x000937 ] } , - BigNum { limbs: [ 0x22be3aea24e089a73c2d0794e42fd6, 0x2e20bfe4966c7b20ecd45027f90dba, 0x002641 ] } , - BigNum { limbs: [ 0x9ae5c815d97b7558c3d2f76b1bd02b, 0x793269b8e6dbb818eb33b979def799, 0x004dac ] } , - BigNum { limbs: [ 0x44e9ca24af3f23db594c625e551d2f, 0xaa708ba0d9387fc2ea6188ea73aeba, 0x005797 ] } , - BigNum { limbs: [ 0x78ba38db4f1cdb24a6b39ca1aae2d2, 0xfce29dfca40fb376eda680b7645699, 0x001c55 ] } , - BigNum { limbs: [ 0x1a389fbb63a04a5f354e65971de4d9, 0x55f4c40d039d403ad68fd45a57b606, 0x00422e ] } , - BigNum { limbs: [ 0xa36b63449abbb4a0cab19968e21b28, 0x515e659079aaf2ff01783547804f4d, 0x0031bf ] } , - BigNum { limbs: [ 0xb6cdeb0f626ed00651b1676d885461, 0x33380951bff039cc3eca9b8f12386f, 0x0033f6 ] } , - BigNum { limbs: [ 0x06d617f09bed2ef9ae4e979277aba0, 0x741b204bbd57f96d993d6e12c5cce4, 0x003ff7 ] } , - BigNum { limbs: [ 0xda6ff3d514cd34f981d24464db09e3, 0x09b0db598773f7ce184aa37ed63aa3, 0x0007f7 ] } , - BigNum { limbs: [ 0xe3340f2ae98eca067e2dba9b24f61e, 0x9da24e43f5d43b6bbfbd662301caaf, 0x006bf6 ] } , - BigNum { limbs: [ 0xd1f0ef63638923521de4c4c32db9ab, 0xbf2f35a097b959e1e80e2b91530396, 0x0021cc ] } , - BigNum { limbs: [ 0xebb3139c9ad2dbade21b3a3cd24656, 0xe823f3fce58ed957eff9de108501bc, 0x005220 ] } , - BigNum { limbs: [ 0xd4938d032e32e3680c16c5a25aa156, 0x3cf7027be69cc607157d64fd6ad8aa, 0x007110 ] } , - BigNum { limbs: [ 0xe91075fcd0291b97f3e9395da55eab, 0x6a5c272196ab6d32c28aa4a46d2ca8, 0x0002dd ] } , - BigNum { limbs: [ 0x49f11bcd26167e652046ce1ccb0b04, 0x0ab5a536a2bc4ae3bc899b9f299d3d, 0x006f24 ] } , - BigNum { limbs: [ 0x73b2e732d845809adfb930e334f4fd, 0x9c9d8466da8be8561b7e6e02ae6816, 0x0004c9 ] } , - BigNum { limbs: [ 0x86d07b2a764c768bf2bded30b49e55, 0x35c886192d15cdecb2b5626ba1982a, 0x001d5e ] } , - BigNum { limbs: [ 0x36d387d5880f88740d4211cf4b61ac, 0x718aa3845032654d2552a736366d29, 0x00568f ] } , - BigNum { limbs: [ 0x741dccc9d3b837864148660c5ff769, 0x674a258c9a5f5df0c9cf432b619672, 0x0044a4 ] } , - BigNum { limbs: [ 0x498636362aa3c779beb798f3a00898, 0x40090410e2e8d5490e38c676766ee1, 0x002f49 ] } , - BigNum { limbs: [ 0xf349c07945e5e0edb443dca4bddafd, 0xb2d557f9bc8f70459aa181f5b2c711, 0x00091a ] } , - BigNum { limbs: [ 0xca5a4286b8761e124bbc225b422504, 0xf47dd1a3c0b8c2f43d6687ac253e41, 0x006ad2 ] } , - BigNum { limbs: [ 0x00d055d2a9b0bc6d8a5054451ad0e3, 0x34fba2e3d54058c59b99b8084fe171, 0x007059 ] } , - BigNum { limbs: [ 0xbcd3ad2d54ab429275afaabae52f1e, 0x725786b9a807da743c6e51998823e2, 0x000394 ] } , - BigNum { limbs: [ 0xdf38bbada9907b5c19b4d0ea2cf552, 0xe3137f39dc7cc1b70fdd68b0c23c3a, 0x0064a0 ] } , - BigNum { limbs: [ 0xde6b475254cb83a3e64b2e15d30aaf, 0xc43faa63a0cb7182c82aa0f115c918, 0x000f4c ] } , - BigNum { limbs: [ 0xf33e0433d82ab9c8eb3ce41f9b3865, 0x856912a85c660aad656ffeb6c2bf63, 0x006c1f ] } , - BigNum { limbs: [ 0xca65fecc2631453714c31ae064c79c, 0x21ea16f520e2288c72980aeb1545ef, 0x0007ce ] } , - BigNum { limbs: [ 0xa761ed7f56302d96809abbf18276db, 0xe1596b71f9bc589a263dde7e697951, 0x005505 ] } , - BigNum { limbs: [ 0x16421580a82bd1697f65430e7d8926, 0xc5f9be2b838bda9fb1ca2b236e8c02, 0x001ee7 ] } , - BigNum { limbs: [ 0x4999895b894e7b3bcce44cd25431fe, 0x099c42c3c3a0f3e1f8c910f610b39b, 0x00349e ] } , - BigNum { limbs: [ 0x740a79a4750d83c4331bb22dabce03, 0x9db6e6d9b9a73f57df3ef8abc751b8, 0x003f4f ] } , - BigNum { limbs: [ 0xef365d8f564d8665d97d20da8a4880, 0x019e35705d3df95a130822cd786187, 0x005d09 ] } , - BigNum { limbs: [ 0xce6da570a80e789a2682de2575b781, 0xa5b4f42d200a39dfc4ffe6d45fa3cb, 0x0016e4 ] } , - BigNum { limbs: [ 0xbc1a689171d2cf978fe23164f37571, 0xf0e9d4f0de132b3dd8b8c5ad4beab0, 0x0073cf ] } , - BigNum { limbs: [ 0x01899a6e8c892f68701dcd9b0c8a90, 0xb66954ac9f3507fbff4f43f48c1aa3, 0x00001d ] } , - BigNum { limbs: [ 0x3ffb8f77520ffff2a23b550a4ab2db, 0x0b24e9dfe12818744d82593f6f34d6, 0x0057cf ] } , - BigNum { limbs: [ 0x7da87388ac4bff0d5dc4a9f5b54d26, 0x9c2e3fbd9c201ac58a85b06268d07d, 0x001c1e ] } , - BigNum { limbs: [ 0x997826bfc8ad389e25e3fe6cef99eb, 0x78749cc708a949a477553bc2f4fc33, 0x000ab3 ] } , - BigNum { limbs: [ 0x242bdc4035aec661da1c0093106616, 0x2ede8cd6749ee99560b2cddee30920, 0x00693a ] } , - BigNum { limbs: [ 0x586184211e1e67d4f1c280878dd156, 0xde92b22d5da44740e70657943af37e, 0x0059db ] } , - BigNum { limbs: [ 0x65427edee03d972b0e3d7e78722eab, 0xc8c077701fa3ebf8f101b20d9d11d5, 0x001a11 ] } , - BigNum { limbs: [ 0xcda463a8d1c74bd10369bd08096f25, 0xee4c927ff242f2211ffa4190c7122f, 0x0005f6 ] } , - BigNum { limbs: [ 0xefff9f572c94b32efc9641f7f690dc, 0xb906971d8b054118b80dc81110f323, 0x006df6 ] } , - BigNum { limbs: [ 0x064b923b363ae2563bf5faa91ed24b, 0xba6d9970e394849ed4fd6170ed5c48, 0x0061b0 ] } , - BigNum { limbs: [ 0xb75870c4c8211ca9c40a0456e12db6, 0xece5902c99b3ae9b030aa830eaa90b, 0x00123c ] } , - BigNum { limbs: [ 0xac287e54e95f83e124da9b67220f6a, 0x9a86ccaef3e24ca64c8224be01c20b, 0x005fe6 ] } , - BigNum { limbs: [ 0x117b84ab14fc7b1edb256398ddf097, 0x0ccc5cee8965e6938b85e4e3d64348, 0x001407 ] } , - BigNum { limbs: [ 0xbdc8bec4ca55090a1159e33226fddc, 0x01452a43350e9ccd0a8ad0d9ab6b1b, 0x004ded ] } , - BigNum { limbs: [ 0xffdb443b3406f5f5eea61bcdd90225, 0xa60dff5a4839966ccd7d38c82c9a37, 0x002600 ] } , - BigNum { limbs: [ 0x5e1c54792bce639cc1766f87d12b83, 0xfc8a65c7f929a997bfdd4f35e3ed22, 0x003339 ] } , - BigNum { limbs: [ 0x5f87ae86d28d9b633e898f782ed47e, 0xaac8c3d5841e89a2182aba6bf41831, 0x0040b3 ] } , - BigNum { limbs: [ 0xa43adf717e6f5462df3334e6f50603, 0x78efac810f398ebea89d164fda7eb5, 0x00194a ] } , - BigNum { limbs: [ 0x1969238e7fecaa9d20ccca190af9fe, 0x2e637d1c6e0ea47b2f6af351fd869e, 0x005aa3 ] } , - BigNum { limbs: [ 0xc24e588eeaf243b62ac02fe31ee32e, 0x8a30a21a1e10ea55f945e2ab111301, 0x004765 ] } , - BigNum { limbs: [ 0xfb55aa711369bb49d53fcf1ce11cd3, 0x1d2287835f3748e3dec226f6c6f251, 0x002c88 ] } , - BigNum { limbs: [ 0xc6c68d42f47a67560dced4fdd1fa58, 0x7540ddef6d67d1f5d35735e4bd5e3b, 0x002f01 ] } , - BigNum { limbs: [ 0xf6dd75bd09e197a9f2312a022e05a9, 0x32124bae0fe0614404b0d3bd1aa717, 0x0044ec ] } , - BigNum { limbs: [ 0xca9e3b165ffd945b504b3bb34e64db, 0x5e2e8b0cfbfa61bd24d49a89618b24, 0x0012ad ] } , - BigNum { limbs: [ 0xf305c7e99e5e6aa4afb4c34cb19b26, 0x49249e90814dd17cb3336f18767a2e, 0x006140 ] } , - BigNum { limbs: [ 0x96f2f1c97a5e1a3a3e804ffc87763e, 0xbb98eb7f7419a70793f2a8652ad8ed, 0x002c07 ] } , - BigNum { limbs: [ 0x26b1113683fde4c5c17faf037889c3, 0xebba3e1e092e8c324415613cad2c66, 0x0047e5 ] } , - BigNum { limbs: [ 0x140327f4c971e021cd8ea769a094a8, 0xaaff762d242c005f3353a3f16a497c, 0x002959 ] } , - BigNum { limbs: [ 0xa9a0db0b34ea1ede327157965f6b59, 0xfc53b370591c32daa4b465b06dbbd7, 0x004a93 ] } , - BigNum { limbs: [ 0x0f71e5bc71e446fdc1747a63ca7ac3, 0x9afc610afa905bd996a93f88b570c4, 0x002c32 ] } , - BigNum { limbs: [ 0xae321d438c77b8023e8b849c35853e, 0x0c56c89282b7d760415eca1922948f, 0x0047bb ] } , - BigNum { limbs: [ 0xf4cfbb63e2c54e74aa45a97409d198, 0x989b5812a14b95b3455dc1fc4ccd45, 0x00472e ] } , - BigNum { limbs: [ 0xc8d4479c1b96b08b55ba558bf62e69, 0x0eb7d18adbfc9d8692aa47a58b380d, 0x002cbf ] } , - BigNum { limbs: [ 0x93cc71925057864dbe0415c94990ca, 0xc088a84a78536f2265c88b14e72ab3, 0x0036e4 ] } , - BigNum { limbs: [ 0x29d7916dae0478b241fbe936b66f37, 0xe6ca815304f4c417723f7e8cf0daa0, 0x003d08 ] } , - BigNum { limbs: [ 0x84298ae8c5a849168f04747c6dd5f6, 0xafa0841de6392d45266b5073cdd55a, 0x002780 ] } , - BigNum { limbs: [ 0x397a781738b3b5e970fb8a83922a0b, 0xf7b2a57f970f05f4b19cb92e0a2ff9, 0x004c6c ] } , - BigNum { limbs: [ 0x3e0b597663520df89d77764e3c697d, 0x98e3d7cffb2883fe05d75d187fb448, 0x000e2d ] } , - BigNum { limbs: [ 0x7f98a9899b09f107628888b1c39684, 0x0e6f51cd821faf3bd230ac8958510b, 0x0065c0 ] } , - BigNum { limbs: [ 0x19ce40ca252a482fa108ef1d9fd883, 0xa5be459b5d08fae658577ea875bd85, 0x0053b2 ] } , - BigNum { limbs: [ 0xa3d5c235d931b6d05ef70fe260277e, 0x0194e402203f38537fb08af96247ce, 0x00203b ] } , - BigNum { limbs: [ 0x8e834b9d101cc30553818f08ec3792, 0x732ccb933eb66f82430836ca2cb22d, 0x002a8a ] } , - BigNum { limbs: [ 0x2f20b762ee3f3bfaac7e6ff713c86f, 0x34265e0a3e91c3b794ffd2d7ab5326, 0x004963 ] } , - BigNum { limbs: [ 0x578c6d4d68ed7dca98bd685bd2aadb, 0xcf54a97840df560670b0af632fe115, 0x0002a8 ] } , - BigNum { limbs: [ 0x661795b2956e8135674296a42d5526, 0xd7fe80253c68dd3367575a3ea8243e, 0x007144 ] } , - BigNum { limbs: [ 0x34d2b570c678cbc0cb94250c958ba6, 0x1552c8b68e2f38b6e13590d0570de6, 0x0025a8 ] } , - BigNum { limbs: [ 0x88d14d8f37e3333f346bd9f36a745b, 0x920060e6ef18fa82f6d278d180f76d, 0x004e45 ] } , - BigNum { limbs: [ 0x1184a5a8c9d0c61c94431cded59c35, 0x120f1f2bdbbd7a988914f8099e95c1, 0x00607e ] } , - BigNum { limbs: [ 0xac1f5d57348b38e36bbce2212a63cc, 0x95440a71a18ab8a14ef31198396f92, 0x00136f ] } , - BigNum { limbs: [ 0xd6fefe5e71e4af3ce5516b5b587650, 0x34b9a353074fe5db498087c0b30bec, 0x002f22 ] } , - BigNum { limbs: [ 0xe6a504a18c774fc31aae93a4a789b1, 0x7299864a75f84d5e8e8781e124f966, 0x0044cb ] } , - BigNum { limbs: [ 0x7afe2f33b2d29c01e3f791190a25d7, 0x177195db06ee6206cad3f8f8edd20f, 0x000ffe ] } , - BigNum { limbs: [ 0x42a5d3cc4b8962fe1c086de6f5da2a, 0x8fe193c27659d1330d3410a8ea3344, 0x0063ef ] } , - BigNum { limbs: [ 0x5406346f9e88c9af3e5868ce1e4fa4, 0xf3250b114352a07bbae29228324286, 0x0037a1 ] } , - BigNum { limbs: [ 0x699dce905fd33550c1a79631e1b05d, 0xb42e1e8c39f592be1d257779a5c2cd, 0x003c4b ] } , - BigNum { limbs: [ 0x32052ccde9b4a9e6681bf64684319d, 0x21267ce32c4122aea787e30b9f31d8, 0x005561 ] } , - BigNum { limbs: [ 0x8b9ed63214a7551997e408b97bce64, 0x862cacba5107108b3080269638d37b, 0x001e8c ] } , - BigNum { limbs: [ 0x7297ee3889650ac76cad1646b4761b, 0x3c8ebc9a02da5d2bc85bcb435da336, 0x00018a ] } , - BigNum { limbs: [ 0x4b0c14c774f6f4389352e8b94b89e6, 0x6ac46d037a6dd60e0fac3e5e7a621d, 0x007263 ] } , - BigNum { limbs: [ 0x254665e6c64ce581eae2c4dce4c189, 0x28fa32bbdcdfe1800790e64116d4ae, 0x006d41 ] } , - BigNum { limbs: [ 0x985d9d19380f197e151d3a231b3e78, 0x7e58f6e1a06851b9d0772360c130a5, 0x0006ac ] } , - BigNum { limbs: [ 0xf3441dca163541a496c81e00ff1276, 0xbde858c524939b5eade1d86f47824f, 0x00678d ] } , - BigNum { limbs: [ 0xca5fe535e826bd5b6937e0ff00ed8b, 0xe96ad0d858b497db2a263132908303, 0x000c5f ] } , - BigNum { limbs: [ 0xe51ebc10b57b63a5e9eab8152b4839, 0xee15d6617551bb90e37cb272360e41, 0x004f8c ] } , - BigNum { limbs: [ 0xd88546ef48e09b5a161546ead4b7c8, 0xb93d533c07f677a8f48b572fa1f711, 0x002460 ] } , - BigNum { limbs: [ 0x22cebc18e0dfea53811fb238fd2814, 0x90a3cef9da73ce6a4f2099a0af14fb, 0x0021bb ] } , - BigNum { limbs: [ 0x9ad546e71d7c14ac7ee04cc702d7ed, 0x16af5aa3a2d464cf88e7700128f058, 0x005232 ] } , - BigNum { limbs: [ 0xfa1af59c87e3c79575577ad3edf1cb, 0x27562b6a9a47cd994218dfd57859ef, 0x00061a ] } , - BigNum { limbs: [ 0xc3890d637678376a8aa8842c120e36, 0x7ffcfe32e30065a095ef29cc5fab63, 0x006dd3 ] } , - BigNum { limbs: [ 0x82dfab906848c79c3c62b3f1e99da1, 0x28bbc7ee1bd43b6c686683ad41bf33, 0x0012d8 ] } , - BigNum { limbs: [ 0x3ac4576f96133763c39d4b0e166260, 0x7e9761af6173f7cd6fa185f4964620, 0x006115 ] } , - BigNum { limbs: [ 0x55abba30f4c41cd573721eba4465da, 0x1de7a6c125e8339bd6dd4c22a7b59c, 0x0014b0 ] } , - BigNum { limbs: [ 0x67f848cf0997e22a8c8de045bb9a27, 0x896b82dc575fff9e012abd7f304fb7, 0x005f3d ] } , - BigNum { limbs: [ 0x2d52cdfd0b98891cc466c414f63fc0, 0x2c10967cc466405960131e7988212b, 0x00237a ] } , - BigNum { limbs: [ 0x90513502f2c375e33b993aeb09c041, 0x7b429320b8e1f2e077f4eb284fe428, 0x005073 ] } , - BigNum { limbs: [ 0x1c1e85d06fe60186a9252bd472f5c3, 0xa8ec47f5c95bf245914235998e63d5, 0x003282 ] } , - BigNum { limbs: [ 0xa1857d2f8e75fd7956dad32b8d0a3e, 0xfe66e1a7b3ec40f446c5d40849a17e, 0x00416a ] } , - BigNum { limbs: [ 0x020c89ecc0849375daa8809864b9c9, 0xcb5137860e4d96b953a9110b8bc722, 0x0047e3 ] } , - BigNum { limbs: [ 0xbb9779133dd76b8a25577e679b4638, 0xdc01f2176efa9c80845ef8964c3e31, 0x002c09 ] } , - BigNum { limbs: [ 0xdc61fcccb02913fc394ee9057469b2, 0x555589c733ab00def2f546ab11bdb3, 0x006841 ] } , - BigNum { limbs: [ 0xe14206334e32eb03c6b115fa8b964f, 0x51fd9fd6499d325ae512c2f6c6479f, 0x000bac ] } , - BigNum { limbs: [ 0x726e23ee95bde2252d6661602d7435, 0x26d40fbaeeb2b594020b8675359421, 0x0060ae ] } , - BigNum { limbs: [ 0x4b35df11689e1cdad2999d9fd28bcc, 0x807f19e28e957da5d5fc832ca27132, 0x00133f ] } , - BigNum { limbs: [ 0x9a0662c6b842dae4bdeee08a005d23, 0x5a11d5a09148a256aa11611dc01ba3, 0x001d34 ] } , - BigNum { limbs: [ 0x239da0394619241b42111e75ffa2de, 0x4d4153fcebff90e32df6a88417e9b0, 0x0056b9 ] } , - BigNum { limbs: [ 0xac53ac97accee001ed731a05753b82, 0x2e90157bd61796b1028e1af5170f0b, 0x000a2c ] } , - BigNum { limbs: [ 0x11505668518d1efe128ce4fa8ac47f, 0x78c31421a7309c88d579eeacc0f648, 0x0069c1 ] } , - BigNum { limbs: [ 0xb6f5ee2e46bfbbca14e7c13bdd9bf7, 0x1801a4e66be3bb20514a762a99af1c, 0x00441c ] } , - BigNum { limbs: [ 0x06ae14d1b79c4335eb183dc422640a, 0x8f5184b71164781986bd93773e5637, 0x002fd1 ] } , - BigNum { limbs: [ 0x439ad148d806a7ccdf8183b63ed567, 0x8c89b8e828873394d984953e9c4dc3, 0x0010e4 ] } , - BigNum { limbs: [ 0x7a0931b726555733207e7b49c12a9a, 0x1ac970b554c0ffa4fe8374633bb790, 0x006309 ] } , - BigNum { limbs: [ 0x3e07bd495b317f1e77078e4a922207, 0x5c0d57961afe92b25ed1032a82f445, 0x0041c9 ] } , - BigNum { limbs: [ 0x7f9c45b6a32a7fe188f870b56dddfa, 0x4b45d2076249a0877937067755110e, 0x003224 ] } , - BigNum { limbs: [ 0x3ab0758cbe037ad272322f2e9b1d0f, 0xce3c4a3cd9a490a6c43e4346125662, 0x000ae3 ] } , - BigNum { limbs: [ 0x82f38d734058842d8dcdcfd164e2f2, 0xd916df60a3a3a29313c9c65bc5aef1, 0x006909 ] } , - BigNum { limbs: [ 0x466a99fb5f7bef1e6017af6230182b, 0x7eb0960434809577da230e2c88260c, 0x0003df ] } , - BigNum { limbs: [ 0x773969049ee00fe19fe84f9dcfe7d6, 0x28a2939948c79dc1fde4fb754fdf47, 0x00700e ] } , - BigNum { limbs: [ 0x6ed968e5c09240096c2d089156eaed, 0x5fefa464baa254d980d9d59b1f65bd, 0x005bb3 ] } , - BigNum { limbs: [ 0x4eca9a1a3dc9bef693d2f66ea91514, 0x47638538c2a5de60572e3406b89f96, 0x00183a ] } , - BigNum { limbs: [ 0x999c758ec8080ab8e9e36ceea971b7, 0x146d0722977916eed0bc549904aba0, 0x002254 ] } , - BigNum { limbs: [ 0x24078d713653f447161c9211568e4a, 0x92e6227ae5cf1c4b074bb508d359b3, 0x005199 ] } , - BigNum { limbs: [ 0x4d72814a2d66d08895e916b75c0586, 0x130e3be6e721dff06413633821356e, 0x0023c2 ] } , - BigNum { limbs: [ 0x703181b5d0f52e776a16e848a3fa7b, 0x9444edb69626534973f4a669b6cfe5, 0x00502b ] } , - BigNum { limbs: [ 0x4f3dcab708c5c68b54a44d5eb5f239, 0xafacdf20a18221d002ebd6d577c87d, 0x004b6e ] } , - BigNum { limbs: [ 0x6e663848f5963874ab5bb1a14a0dc8, 0xf7a64a7cdbc61169d51c32cc603cd6, 0x00287e ] } , - BigNum { limbs: [ 0x3cd85a008ad190414dbdcb15d0dac0, 0x18c3495bb2a9b4c1265d710a862f5f, 0x006749 ] } , - BigNum { limbs: [ 0x80cba8ff738a6ebeb24233ea2f2541, 0x8e8fe041ca9e7e78b1aa989751d5f4, 0x000ca4 ] } , - BigNum { limbs: [ 0xfc5bbb5fe6d85bf135c083512c9fe8, 0xfacd0f29438dc279c735326262a715, 0x00443c ] } , - BigNum { limbs: [ 0xc14847a01783a30eca3f7baed36019, 0xac861a7439ba70c010d2d73f755e3d, 0x002fb0 ] } , - BigNum { limbs: [ 0xddd69a355f5807ccd7ce20289e7057, 0xc73dd7b7381292525534a336790988, 0x0021bd ] } , - BigNum { limbs: [ 0xdfcd68ca9f03f7332831ded7618faa, 0xe01551e64535a0e782d3666b5efbca, 0x00522f ] } , - BigNum { limbs: [ 0x2e72025de4a0c712a4159d38ee7edf, 0x93133a3a6b7193b0142074a447361e, 0x00210f ] } , - BigNum { limbs: [ 0x8f3200a219bb37ed5bea61c7118122, 0x143fef6311d69f89c3e794fd90cf35, 0x0052de ] } , - BigNum { limbs: [ 0x668bb61eabbf26efe8b7c5f4cdbb8a, 0x8055f6f56ceef2a6ba04234203090d, 0x005169 ] } , - BigNum { limbs: [ 0x57184ce1529cd8101748390b324477, 0x26fd32a8105940931e03e65fd4fc46, 0x002284 ] } , - BigNum { limbs: [ 0x151dff81d368d532dbe75201147c74, 0xf563dca47733442fccebb3b272904a, 0x0015aa ] } , - BigNum { limbs: [ 0xa886037e2af329cd2418acfeeb838d, 0xb1ef4cf90614ef0a0b1c55ef657509, 0x005e42 ] } , - BigNum { limbs: [ 0x0a8dbfebab4f06748e13419b319c10, 0x1d7727add9dd135d2ad0956ba98d78, 0x00528e ] } , - BigNum { limbs: [ 0xb3164314530cf88b71ecbd64ce63f1, 0x89dc01efa36b1fdcad3774362e77db, 0x00215f ] } , - BigNum { limbs: [ 0x9f0e6768335b1d2b9a21f44b8839df, 0xcffa24a5ed86e22b586a2e37e5b16a, 0x0039b5 ] } , - BigNum { limbs: [ 0x1e959b97cb00e1d465de0ab477c622, 0xd75904f78fc1510e7f9ddb69f253e9, 0x003a37 ] } , - BigNum { limbs: [ 0xe12f618a02f52636e22842492675f1, 0x1578dddc06904031a5b1f1d0e35a2d, 0x00465a ] } , - BigNum { limbs: [ 0xdc74a175fb66d8c91dd7bcb6d98a10, 0x91da4bc176b7f308325617d0f4ab25, 0x002d93 ] } , - BigNum { limbs: [ 0xfc7593aacae8f0048c998c718b18fa, 0xb132aace436810593938764cd2873c, 0x005e9f ] } , - BigNum { limbs: [ 0xc12e6f5533730efb7366728e74e707, 0xf6207ecf39e022e09ecf9355057e16, 0x00154d ] } , - BigNum { limbs: [ 0x855c98f03e4ec9bbc878488ea71ba8, 0x4f4d80e421236231f3707b9d46a099, 0x005765 ] } , - BigNum { limbs: [ 0x38476a0fc00d35443787b67158e459, 0x5805a8b95c24d107e4978e049164ba, 0x001c88 ] } , - BigNum { limbs: [ 0xa9e6457cbef76d1fccde66fc588d7d, 0x6964e2c2128178dec9a67d6bf69ab1, 0x004c6b ] } , - BigNum { limbs: [ 0x13bdbd833f6491e033219803a77284, 0x3dee46db6ac6ba5b0e618c35e16aa2, 0x002782 ] } , - BigNum { limbs: [ 0x0ab900fdd04ba0c27a1a12d0f2c7b4, 0x958f86d2b38d13cebad18da8de97be, 0x004fe1 ] } , - BigNum { limbs: [ 0xb2eb02022e105e3d85e5ec2f0d384d, 0x11c3a2cac9bb1f6b1d367bf8f96d95, 0x00240c ] } , - BigNum { limbs: [ 0xfec709676525a283ae887be3b065d2, 0x31dc646483ada7ec9b7504f5c08d9a, 0x004ea3 ] } , - BigNum { limbs: [ 0xbedcf99899365c7c5177831c4f9a2f, 0x7576c538f99a8b4d3c9304ac1777b8, 0x00254a ] } , - BigNum { limbs: [ 0x6236400ce1a035463b81e35706dc93, 0x794174efafe9bbb1da00479695453e, 0x0008ab ] } , - BigNum { limbs: [ 0x5b6dc2f31cbbc9b9c47e1ba8f9236e, 0x2e11b4adcd5e7787fe07c20b42c015, 0x006b42 ] } , - BigNum { limbs: [ 0xac3ff58faca4e3edadb1101621f8bf, 0x844c97b849b37e115e7879e5fe85de, 0x003d52 ] } , - BigNum { limbs: [ 0x11640d7051b71b12524eeee9de0742, 0x230691e53394b528798f8fbbd97f75, 0x00369b ] } , - BigNum { limbs: [ 0x7c85bcff563e231e8623e352e51c35, 0xcdffedfad78d5fe87ca61ae9abc08f, 0x002b43 ] } , - BigNum { limbs: [ 0x411e4600a81ddbe179dc1bad1ae3cc, 0xd9533ba2a5bad3515b61eeb82c44c4, 0x0048a9 ] } , - BigNum { limbs: [ 0xa804027c23b9f95376802e91e05be8, 0xe9c4cef6cbefe6c9741d8956584aee, 0x001cdb ] } , - BigNum { limbs: [ 0x15a00083daa205ac897fd06e1fa419, 0xbd8e5aa6b1584c7063ea804b7fba65, 0x005711 ] } , - BigNum { limbs: [ 0x0e0cd54bd4aa61826d2d37f94a447f, 0x63512d6507eff7e74e36ebb406ab4a, 0x0065c6 ] } , - BigNum { limbs: [ 0xaf972db429b19d7d92d2c706b5bb82, 0x4401fc3875583b5289d11dedd15a09, 0x000e27 ] } , - BigNum { limbs: [ 0x1d8f59d2e0d8f517d1f555defa4965, 0xce0a6cf41e04d1f37da3193dc2f7e1, 0x000e39 ] } , - BigNum { limbs: [ 0xa014a92d1d8309e82e0aa92105b69c, 0xd948bca95f4361465a64f064150d72, 0x0065b3 ] } , - BigNum { limbs: [ 0xe9debb01a73a7d2d2fd8f2b8879fa4, 0x9ddf450c9503f6d1e86fff13f87f5a, 0x0010af ] } , - BigNum { limbs: [ 0xd3c547fe572181d2d0270c4778605d, 0x0973e490e8443c67ef980a8ddf85f8, 0x00633e ] } , - BigNum { limbs: [ 0x82a869b076061adec6750f6279f487, 0xe06fd1d55ed610877582a2642dfdc9, 0x0052c8 ] } , - BigNum { limbs: [ 0x3afb994f8855e421398aef9d860b7a, 0xc6e357c81e7222b26285673daa078a, 0x002124 ] } , - BigNum { limbs: [ 0xcd0477f8b300e2e8072dcdffa22a4b, 0x0427dc1ed46b959d6213b9fb9ca34b, 0x006cfb ] } , - BigNum { limbs: [ 0xf09f8b074b5b1c17f8d231005dd5b6, 0xa32b4d7ea8dc9d9c75f44fa63b6207, 0x0006f2 ] } , - BigNum { limbs: [ 0x6e9b05922fb4ca4db6496c5f476610, 0x7f60ea83e3914376d6422502433719, 0x004ee5 ] } , - BigNum { limbs: [ 0x4f08fd6dcea734b249b692a0b899f1, 0x27f23f1999b6efc301c5e49f94ce3a, 0x002508 ] } , - BigNum { limbs: [ 0xa62fc0089b634dbf2aac25d7d75fee, 0xdb944f0c588276cb7f8865b7d9ba3e, 0x0035ed ] } , - BigNum { limbs: [ 0x177442f762f8b140d553d92828a013, 0xcbbeda9124c5bc6e587fa3e9fe4b15, 0x003dff ] } , - BigNum { limbs: [ 0x98290aa8b6ad53f2043aa3f401dfdc, 0x09673fc03acedd09ac836e1ca7736a, 0x0053e1 ] } , - BigNum { limbs: [ 0x257af85747aeab0dfbc55b0bfe2025, 0x9debe9dd427956302b849b853091e9, 0x00200c ] } , - BigNum { limbs: [ 0x647448c7b0afb7ec1c61775ab7abdd, 0x889ebec7d61b637217c82c971d9e4f, 0x005239 ] } , - BigNum { limbs: [ 0x592fba384dac4713e39e87a5485424, 0x1eb46ad5a72ccfc7c03fdd0aba6704, 0x0021b4 ] } , - BigNum { limbs: [ 0xfdccab18b6ef1df95145ce9d220f41, 0xae5fde2b4f5827052bda8626455524, 0x0033b2 ] } , - BigNum { limbs: [ 0xbfd757e7476ce106aeba3062ddf0c0, 0xf8f34b722df00c34ac2d837b92b02e, 0x00403a ] } , - BigNum { limbs: [ 0x48364c6d02ded0006ae02ab74add69, 0x07e0704b0c97aead5c4e44e64375c3, 0x000c8d ] } , - BigNum { limbs: [ 0x756db692fb7d2eff951fd448b52298, 0x9f72b95270b0848c7bb9c4bb948f90, 0x006760 ] } , - BigNum { limbs: [ 0x0fa82de7378c5647041bcb6bd46fcc, 0x5e373ec8ee1bbc8c8f5360d1f7b0e5, 0x00450a ] } , - BigNum { limbs: [ 0xadfbd518c6cfa8b8fbe433942b9035, 0x491bead48f2c76ad48b4a8cfe0546e, 0x002ee3 ] } , - BigNum { limbs: [ 0xd7924989f5052ba483ec3b98206641, 0xa817449255ff6eb0398da5372b4151, 0x0008d0 ] } , - BigNum { limbs: [ 0xe611b9760956d35b7c13c367df99c0, 0xff3be50b2748c4899e7a646aacc401, 0x006b1c ] } , - BigNum { limbs: [ 0xcaad5df72cd49bbe86414d32e186de, 0xdad728f81f15d7ed9ff23c94d4b3e1, 0x00493c ] } , - BigNum { limbs: [ 0xf2f6a508d187634179beb1cd1e7923, 0xcc7c00a55e325b4c3815cd0d035171, 0x002ab0 ] } , - BigNum { limbs: [ 0x1247f31227b7d49e32a2c19d55f8d3, 0xded3eebc215ddeea461ee0cd7d94d6, 0x001f0e ] } , - BigNum { limbs: [ 0xab5c0fedd6a42a61cd5d3d62aa072e, 0xc87f3ae15bea544f91e928d45a707d, 0x0054de ] } , - BigNum { limbs: [ 0xdc89075d67ed7e317050f884ca576b, 0x281b92bda8a01a3a778c086ff4e1ad, 0x0001ed ] } , - BigNum { limbs: [ 0xe11afba2966e80ce8faf067b35a896, 0x7f3796dfd4a818ff607c0131e323a5, 0x007200 ] } , - BigNum { limbs: [ 0xcdb87cb712877e0bf60e7c63c2437b, 0x4efb2363ab2f1ff78cb0023480e8f9, 0x001a6f ] } , - BigNum { limbs: [ 0xefeb8648ebd480f409f1829c3dbc86, 0x58580639d21913424b58076d571c59, 0x00597e ] } , - BigNum { limbs: [ 0xd45c8361c9f7297117194176b34fcd, 0xabbd11933f13d0bd028d2df1d8d2ea, 0x00657c ] } , - BigNum { limbs: [ 0xe9477f9e3464d58ee8e6bd894cb034, 0xfb96180a3e34627cd57adbafff3268, 0x000e70 ] } , - BigNum { limbs: [ 0xf77a7bafa8af3673a70628281b1030, 0x37b660a6007a671cd104321d3da423, 0x00523d ] } , - BigNum { limbs: [ 0xc629875055acc88c58f9d6d7e4efd1, 0x6f9cc8f77ccdcc1d0703d7849a612f, 0x0021b0 ] } , - BigNum { limbs: [ 0xa5adf88739a7bd9d7f8fd7d5e17d4c, 0xa451b990fd38ff18af03ba072d922e, 0x0030ed ] } , - BigNum { limbs: [ 0x17f60a78c4b441628070272a1e82b5, 0x0301700c800f342129044f9aaa7325, 0x004300 ] } , - BigNum { limbs: [ 0xd55f49d6b5a1fa4a715cef814e4239, 0x8cd22f924921ab164cf3cbcd563e6d, 0x005b3b ] } , - BigNum { limbs: [ 0xe844b92948ba04b58ea30f7eb1bdc8, 0x1a80fa0b342688238b143dd481c6e5, 0x0018b2 ] } , - BigNum { limbs: [ 0xaa756712f2bc015611aad4215f6c1d, 0x446d71965b3a8e20c5aa738a332574, 0x001a1a ] } , - BigNum { limbs: [ 0x132e9bed0b9ffda9ee552adea093e4, 0x62e5b807220da519125d9617a4dfdf, 0x0059d3 ] } , - BigNum { limbs: [ 0xdf1a3727fd721d20a3252151ac98a0, 0x0d63de7126601d7386b1d14b886090, 0x001c40 ] } , - BigNum { limbs: [ 0xde89cbd800e9e1df5cdaddae536761, 0x99ef4b2c56e815c6515638564fa4c2, 0x0057ad ] } , - BigNum { limbs: [ 0xfb22b17b1b8fce193fef7af0333d31, 0x8d54f1ac8eda45244257bc7eed74d0, 0x001373 ] } , - BigNum { limbs: [ 0xc2815184e2cc30e6c010840fccc2d0, 0x19fe37f0ee6dee1595b04d22ea9082, 0x00607a ] } , - BigNum { limbs: [ 0xd94eb86ff1ed3c7833cda901f237d1, 0x6cac58e7d4d227ece7306d1ad0f73b, 0x003446 ] } , - BigNum { limbs: [ 0xe4554a900c6ec287cc3255fe0dc830, 0x3aa6d0b5a8760b4cf0d79c87070e17, 0x003fa7 ] } , - BigNum { limbs: [ 0x0a0b6dc3344e9740aa98279de1d272, 0x396f0bbba2006c10dffbc6e2ccfd1f, 0x0043ce ] } , - BigNum { limbs: [ 0xb398953cca0d67bf5567d7621e2d8f, 0x6de41de1db47c728f80c42bf0b0834, 0x00301f ] } , - BigNum { limbs: [ 0x2774aacbd8e5410e990b7ea6099539, 0x0ff19575c66a5d823a24eadcf44034, 0x00013a ] } , - BigNum { limbs: [ 0x962f58342576bdf166f48059f66ac8, 0x97619427b6ddd5b79de31ec4e3c51f, 0x0072b3 ] } , - BigNum { limbs: [ 0x98cfc228cdac64c0f4b12f26fbee10, 0x608230bf89f522f30a822df80cebab, 0x006bbe ] } , - BigNum { limbs: [ 0x24d440d730af9a3f0b4ecfd90411f1, 0x46d0f8ddf3531046cd85dba9cb19a8, 0x00082f ] } , - BigNum { limbs: [ 0xfcae5ba09e0c9e7936dad504dd20d8, 0xd14ad990c5d94abc61794fedbb7b37, 0x0004fd ] } , - BigNum { limbs: [ 0xc0f5a75f604f6086c92529fb22df29, 0xd608500cb76ee87d768eb9b41c8a1b, 0x006eef ] } , - BigNum { limbs: [ 0x2dd2cd0d439bf99df86a7b583e6a7a, 0x334ff56b12c0fe4d544102494ce813, 0x000313 ] } , - BigNum { limbs: [ 0x8fd135f2bac00562079583a7c19587, 0x740334326a8734ec83c707588b1d40, 0x0070da ] } , - BigNum { limbs: [ 0x012acc92ab4930bd516cd62ba82664, 0xc77d512a5bc54b53c2020e1531be45, 0x0008b1 ] } , - BigNum { limbs: [ 0xbc79366d5312ce42ae9328d457d99d, 0xdfd5d8732182e7e61605fb8ca6470e, 0x006b3b ] } , - BigNum { limbs: [ 0xa0896f1080c1eee49d3bc9f665878a, 0x46f8c3bf1cc0a4b9f13d221641f726, 0x0029aa ] } , - BigNum { limbs: [ 0x1d1a93ef7d9a101b62c435099a7877, 0x605a65de60878e7fe6cae78b960e2d, 0x004a43 ] } , - BigNum { limbs: [ 0x53929cdf5d53f68046a0338d19eb21, 0x4ecf71c935ff0ddb58cba88e385eb4, 0x00701c ] } , - BigNum { limbs: [ 0x6a116620a108087fb95fcb72e614e0, 0x5883b7d44749255e7f3c61139fa69f, 0x0003d1 ] } , - BigNum { limbs: [ 0x4d116daf42538b08c8845e74a76e3c, 0x3df169bd66227d167a1aa89fd1bf92, 0x006073 ] } , - BigNum { limbs: [ 0x70929550bc0873f7377ba08b5891c5, 0x6961bfe01725b6235ded61020645c1, 0x00137a ] } , - BigNum { limbs: [ 0x7ec84bcbd1676791088fac0c4f9032, 0x2f32a44ea3b5e5353491392eb969f1, 0x004928 ] } , - BigNum { limbs: [ 0x3edbb7342cf4976ef77052f3b06fcf, 0x7820854ed9924e04a376d0731e9b62, 0x002ac5 ] } , - BigNum { limbs: [ 0x9fefa0239bcb3e8a28db7c68591369, 0xab965ee2dd62dc7f696be9aa0ec978, 0x0028e0 ] } , - BigNum { limbs: [ 0x1db462dc6290c075d7248297a6ec98, 0xfbbccaba9fe556ba6e9c1ff7c93bdb, 0x004b0c ] } , - BigNum { limbs: [ 0xb1df0d7f11055f353f8e344469d5db, 0xee2957ec3250ae111cfbdc4970ab0d, 0x006a85 ] } , - BigNum { limbs: [ 0x0bc4f580ed569fcac071cabb962a26, 0xb929d1b14af78528bb0c2d58675a46, 0x000967 ] } , - BigNum { limbs: [ 0xcaf14f19ed7d03a0f0d6fddf65ab78, 0x1d09b8983f31effc399a99a0f0774b, 0x001ce3 ] } , - BigNum { limbs: [ 0xf2b2b3e610defb5f0f2901209a5489, 0x8a4971053e16433d9e6d7000e78e07, 0x00570a ] } , - BigNum { limbs: [ 0x0eb926614be1a588cdfcb063137ed0, 0xde7ab1959c4bc6a2ed06d37f167a03, 0x00407f ] } , - BigNum { limbs: [ 0xaeeadc9eb27a597732034e9cec8131, 0xc8d87807e0fc6c96eb013622c18b50, 0x00336d ] } , - BigNum { limbs: [ 0x7ea24c2e5ec8f8aa638667dde3590d, 0x5373bf1e91d9fef178082e44ecc0c7, 0x002ce4 ] } , - BigNum { limbs: [ 0x3f01b6d19f9306559c7997221ca6f4, 0x53df6a7eeb6e34485fffdb5ceb448c, 0x004709 ] } , - BigNum { limbs: [ 0x908be130f926723ad61f87d207308f, 0xd1772f77e6a8eea341e88434f19304, 0x004a4c ] } , - BigNum { limbs: [ 0x2d1821cf05358cc529e0772df8cf72, 0xd5dbfa25969f4496961f856ce6724f, 0x0029a0 ] } , - BigNum { limbs: [ 0xe8222d4428fff63a9a7c5389c73e8f, 0x6f9d1eeb0abdf3bac4d64a36538a64, 0x007363 ] } , - BigNum { limbs: [ 0xd581d5bbd55c08c56583ab7638c172, 0x37b60ab2728a3f7f1331bf6b847aee, 0x00008a ] } , - BigNum { limbs: [ 0x931b5f8b6cbdcc7974730b5c3ba924, 0x64469d1accc8fc62eef966d0253b7f, 0x003675 ] } , - BigNum { limbs: [ 0x2a88a374919e32868b8cf3a3c456dd, 0x430c8c82b07f36d6e90ea2d1b2c9d4, 0x003d78 ] } , - BigNum { limbs: [ 0x67e34e22abef508c9d7369401c9ce9, 0x6cd186a4d1bf23bfab53572bc8e62a, 0x007179 ] } , - BigNum { limbs: [ 0x55c0b4dd526cae73628c95bfe36318, 0x3a81a2f8ab890f7a2cb4b2760f1f29, 0x000274 ] } , - BigNum { limbs: [ 0x523efd9a4034293bcb639a86de8161, 0x70e5bd7314ec89710171d3095acded, 0x002dc3 ] } , - BigNum { limbs: [ 0x6b650565be27d5c4349c6479217ea0, 0x366d6c2a685ba9c8d69636987d3766, 0x00462a ] } , - BigNum { limbs: [ 0xdc86cb3ee5aeda0dc44788191c6694, 0x85025f6fc6b635ee1289a4af9cc708, 0x000a03 ] } , - BigNum { limbs: [ 0xe11d37c118ad24f23bb876e6e3996d, 0x2250ca2db691fd4bc57e64f23b3e4a, 0x0069ea ] } , - BigNum { limbs: [ 0xfb20b8ec99d14e44d969247a3b9ea0, 0x8d984cf2bbe3e84864fbbaf6ca1a19, 0x003a17 ] } , - BigNum { limbs: [ 0xc2834a13648ab0bb2696da85c46161, 0x19badcaac1644af1730c4eab0deb39, 0x0039d6 ] } , - BigNum { limbs: [ 0x3e4ce9b0b4d29e8ddb46c387d94289, 0x9c0f10c48a5ee2c04f5308e4117c29, 0x006e01 ] } , - BigNum { limbs: [ 0x7f57194f4989607224b93b7826bd78, 0x0b4418d8f2e9507988b500bdc6892a, 0x0005ec ] } , - BigNum { limbs: [ 0x0843767d0372343f1f18f7ffc6877b, 0x6f733cc9941e4d1f292459f8fcb93b, 0x000f19 ] } , - BigNum { limbs: [ 0xb5608c82fae9cac0e0e70700397886, 0x37dfecd3e929e61aaee3afa8db4c18, 0x0064d4 ] } , - BigNum { limbs: [ 0x88b0025d0d21897a73822ebdcd10f4, 0xad7c3cd1771ded6b0d595d2df89be8, 0x00255b ] } , - BigNum { limbs: [ 0x34f400a2f13a75858c7dd04232ef0d, 0xf9d6eccc062a45cecaaeac73df696b, 0x004e91 ] } , - BigNum { limbs: [ 0x33a0cc91de22b00210a61427617e32, 0xf107893997a09e1935feb8328692f2, 0x003e5f ] } , - BigNum { limbs: [ 0x8a03366e20394efdef59ead89e81cf, 0xb64ba063e5a79520a209516f517261, 0x00358d ] } , - BigNum { limbs: [ 0xaba4806747cbbb3ed3c6695778c414, 0x6b7fc7d64506fd4c8ab2f0d9a0c2ef, 0x001fd5 ] } , - BigNum { limbs: [ 0x11ff8298b69043c12c3995a8873bed, 0x3bd361c7384135ed4d5518c8374264, 0x005418 ] } , - BigNum { limbs: [ 0x9793cdc553268fdb8c8c9df25f113f, 0xc8b8a6bed3ce2e4295f13884893e82, 0x00569a ] } , - BigNum { limbs: [ 0x2610353aab356f247373610da0eec2, 0xde9a82dea97a04f74216d11d4ec6d1, 0x001d52 ] } , - BigNum { limbs: [ 0x48c725f84f95c141afaf92fc44c150, 0x2ec90d8645b8541c402b6099de87a6, 0x006430 ] } , - BigNum { limbs: [ 0x74dcdd07aec63dbe50506c03bb3eb1, 0x788a1c17378fdf1d97dca907f97dad, 0x000fbd ] } , - BigNum { limbs: [ 0x3d298b3fdcee949d23158904db414e, 0x5b2f0cdcb97b5ef4890c09efc1b9e8, 0x002c4a ] } , - BigNum { limbs: [ 0x807a77c0216d6a62dcea75fb24beb3, 0x4c241cc0c3ccd4454efbffb2164b6b, 0x0047a3 ] } , - BigNum { limbs: [ 0x54bc8d5e005d10a64eed6a5818a4bf, 0x165bdc32edd97d8cc8889c8a298881, 0x005ab7 ] } , - BigNum { limbs: [ 0x68e775a1fdfeee59b11294a7e75b42, 0x90f74d6a8f6eb5ad0f7f6d17ae7cd2, 0x001936 ] } , - BigNum { limbs: [ 0x5d543983bbd49126324200928abe0a, 0x82d48a57fa1bf0d2b13a179c103085, 0x005e68 ] } , - BigNum { limbs: [ 0x604fc97c42876dd9cdbdfe6d7541f7, 0x247e9f45832c426726cdf205c7d4ce, 0x001585 ] } , - BigNum { limbs: [ 0x4959e25753f8727e4cddf5bbcf9e2e, 0x0e9ae069d4854261fc6d52cd9f472f, 0x001c9a ] } , - BigNum { limbs: [ 0x744a20a8aa638c81b32209443061d3, 0x98b84933a8c2f0d7db9ab6d438be24, 0x005753 ] } , - BigNum { limbs: [ 0xfb52a4a4084049b64635a1fca37cd4, 0x97060617002b139d9e55125fd6a0da, 0x0006a1 ] } , - BigNum { limbs: [ 0xc2515e5bf61bb549b9ca5d035c832d, 0x104d23867d1d1f9c39b2f742016478, 0x006d4c ] } , - BigNum { limbs: [ 0x46b757d37646ad5f6ed9d54ebc7dfd, 0x115e1973082b57191cb038744d3fda, 0x0059ad ] } , - BigNum { limbs: [ 0x76ecab2c881551a0912629b1438204, 0x95f5102a751cdc20bb57d12d8ac579, 0x001a40 ] } , - BigNum { limbs: [ 0x3a3fdb27ce4620c9037884585beeed, 0x7ba852c1b35fd6ee452a97c16ac388, 0x004c29 ] } , - BigNum { limbs: [ 0x836427d83015de36fc877aa7a41114, 0x2baad6dbc9e85c4b92dd71e06d41cb, 0x0027c4 ] } , - BigNum { limbs: [ 0x5007e38c90bf5a1406a9e74470eb1c, 0x2d7256bac7644923c535f42197488e, 0x0059a7 ] } , - BigNum { limbs: [ 0x6d9c1f736d9ca4ebf95617bb8f14e5, 0x79e0d2e2b5e3ea1612d2158040bcc5, 0x001a46 ] } , - BigNum { limbs: [ 0x58596cd9180f6351eeda0bf1f9d15c, 0xdbac48ffd83b5b50fba542ee045f2d, 0x000cc1 ] } , - BigNum { limbs: [ 0x654a9626e64c9bae1125f30e062ea5, 0xcba6e09da50cd7e8dc62c6b3d3a626, 0x00672b ] } , - BigNum { limbs: [ 0xda385259825e8ff7de74762844b59b, 0x8d1d32ee41ea7fa57c0bb07ba2861e, 0x004a07 ] } , - BigNum { limbs: [ 0xe36bb0a67bfd6f08218b88d7bb4a66, 0x1a35f6af3b5db3945bfc5926357f34, 0x0029e6 ] } , - BigNum { limbs: [ 0x663b19281ecf204a13c9090a5de344, 0x6cb1b8029d0f4ea7520a9e1f45fed2, 0x000264 ] } , - BigNum { limbs: [ 0x5768e9d7df8cdeb5ec36f5f5a21cbd, 0x3aa1719ae038e49285fd6b82920681, 0x007189 ] } , - BigNum { limbs: [ 0x424c5b7c97a6d27d1881b7fb2a11e6, 0x8b263946eb224cb0fea682711f56cf, 0x000526 ] } , - BigNum { limbs: [ 0x7b57a78366b52c82e77e4704d5ee1b, 0x1c2cf0569225e688d9618730b8ae84, 0x006ec7 ] } , - BigNum { limbs: [ 0xbf61c5f3d0832796c52d21fbc61f0f, 0xb379c9183ffc813bcf1073aceca325, 0x000ef4 ] } , - BigNum { limbs: [ 0xfe423d0c2dd8d7693ad2dd0439e0f2, 0xf3d960853d4bb1fe08f795f4eb622d, 0x0064f8 ] } , - BigNum { limbs: [ 0xe3a6cd55d29c43736afc498dd8c1d1, 0xa19828da9aab0564b5a8d1072ba42b, 0x00445e ] } , - BigNum { limbs: [ 0xd9fd35aa2bbfbb8c9503b572273e30, 0x05bb00c2e29d2dd5225f389aac6127, 0x002f8f ] } , - BigNum { limbs: [ 0xead8a0448ecebabcdf1235752b0ef3, 0xe8ee9237909732d4a06d7aa57eb71b, 0x006bcb ] } , - BigNum { limbs: [ 0xd2cb62bb6f8d444320edc98ad4f10e, 0xbe649765ecb10065379a8efc594e37, 0x000821 ] } , - BigNum { limbs: [ 0x4119ad873614884d66efb4fed2279a, 0xd9900b7ae25a95dfadf106e3f002de, 0x005ae6 ] } , - BigNum { limbs: [ 0x7c8a5578c84776b299104a012dd867, 0xcdc31e229aed9d5a2a1702bde80275, 0x001906 ] } , - BigNum { limbs: [ 0xb4f7967f7e42a5fda4841718420054, 0x2f3fb51cf0a715d27b6251fc311c17, 0x0062fb ] } , - BigNum { limbs: [ 0x08ac6c80801959025b7be7e7bdffad, 0x781374808ca11d675ca5b7a5a6e93c, 0x0010f2 ] } , - BigNum { limbs: [ 0x180e0e8b24f12309f239f760b82267, 0xba636d174692ad5a534045625d9514, 0x0058c3 ] } , - BigNum { limbs: [ 0xa595f474d96adbf60dc6079f47dd9a, 0xecefbc8636b585df84c7c43f7a703f, 0x001b29 ] } , - BigNum { limbs: [ 0xc7e8901137ff0153a93b55b4fea0eb, 0xc4a69476d9fc4bb6f34c1c58a0568e, 0x000e7c ] } , - BigNum { limbs: [ 0xf5bb72eec65cfdac56c4a94b015f16, 0xe2ac9526a34be782e4bbed4937aec4, 0x006570 ] } , - BigNum { limbs: [ 0x72a5c3f51c283524eb6f79660ba729, 0x4cc8ec848f9932f96660e46b8b0362, 0x00548e ] } , - BigNum { limbs: [ 0x4afe3f0ae233c9db14908599f458d8, 0x5a8a3d18edaf004071a725364d01f1, 0x001f5f ] } , - BigNum { limbs: [ 0xb69e5da3889e1b2613fb0ba0d0c8b9, 0x48f2bdc1f969a35750fccdbd565adc, 0x0045f4 ] } , - BigNum { limbs: [ 0x0705a55c75bde3d9ec04f35f2f3748, 0x5e606bdb83de8fe2870b3be481aa77, 0x002df9 ] } , - BigNum { limbs: [ 0xeeae11e7bccf3f082cf84eeb77b539, 0xd3cae75d7dcbb02266098876489699, 0x006a92 ] } , - BigNum { limbs: [ 0xcef5f118418cbff7d307b014884ac8, 0xd388423fff7c831771fe812b8f6eb9, 0x00095a ] } , - BigNum { limbs: [ 0x9edcfa443aea1905a885cb88412fc6, 0x71fcb801d5d5172aa6aa52827f4c0e, 0x00140c ] } , - BigNum { limbs: [ 0x1ec708bbc371e5fa577a3377bed03b, 0x3556719ba7731c0f315db71f58b945, 0x005fe1 ] } , - BigNum { limbs: [ 0x2c95af5bc18faa930fa010bc171746, 0x7dc1d3176b166ae305e12c0d0f3845, 0x003659 ] } , - BigNum { limbs: [ 0x910e53a43ccc546cf05fee43e8e8bb, 0x299156861231c856d226dd94c8cd0e, 0x003d94 ] } , - BigNum { limbs: [ 0x85a508df2452feef976635fc779c0c, 0x54744d4336448dd7a2cb1fe4cabc60, 0x00509e ] } , - BigNum { limbs: [ 0x37fefa20da0900106899c9038863f5, 0x52dedc5a4703a562353ce9bd0d48f3, 0x00234f ] } , - BigNum { limbs: [ 0x2a457ac1b1515e66caf0bfe0dc71bd, 0xde54f97535615e9a245b3b982d893b, 0x007033 ] } , - BigNum { limbs: [ 0x935e883e4d0aa099350f3f1f238e44, 0xc8fe302847e6d49fb3acce09aa7c18, 0x0003b9 ] } , - BigNum { limbs: [ 0xe681ffa04fd14425cd201433440674, 0xde62396f17618541eba544010dc6e2, 0x0031d2 ] } , - BigNum { limbs: [ 0xd722035fae8abada32dfeaccbbf98d, 0xc8f0f02e65e6adf7ec62c5a0ca3e70, 0x00421a ] } , - BigNum { limbs: [ 0x52dc972de8dd1ae0ef5504d0804371, 0xd7d00aa6d47ea06254fd521a05e75b, 0x0063c3 ] } , - BigNum { limbs: [ 0x6ac76bd2157ee41f10aafa2f7fbc90, 0xcf831ef6a8c992d7830ab787d21df8, 0x001029 ] } , - BigNum { limbs: [ 0x4804de0259a52492093ce6634374ea, 0x74a1cf96403463f289036f16b94858, 0x002037 ] } , - BigNum { limbs: [ 0x759f24fda4b6da6df6c3189cbc8b17, 0x32b15a073d13cf474f049a8b1ebcfb, 0x0053b6 ] } , - BigNum { limbs: [ 0x0b4a6523f47a1ff8e0b04c3b1af356, 0x83b623d916a3ad6c4c7ac3494271a8, 0x005a8d ] } , - BigNum { limbs: [ 0xb2599ddc09e1df071f4fb2c4e50cab, 0x239d05c466a485cd8b8d46589593ab, 0x001960 ] } , - BigNum { limbs: [ 0x3acd5edbf5700358a7bfe4303c5b1e, 0xb52b913e7460fc8fc271fb692c97c4, 0x0021a2 ] } , - BigNum { limbs: [ 0x82d6a42408ebfba758401acfc3a4e3, 0xf227985f08e736aa15960e38ab6d8f, 0x00524a ] } , - BigNum { limbs: [ 0x751f4f8dda18c726694b3c0708989b, 0x74e808084266d6dc71af08a18e5f03, 0x000d2f ] } , - BigNum { limbs: [ 0x4884b372244337d996b4c2f8f76766, 0x326b21953ae15c5d6659010049a650, 0x0066be ] } , - BigNum { limbs: [ 0x4d9b4898d2ec0030ad1815af2831cb, 0xb9b40807616a9227838f3a3ed300cf, 0x003d4c ] } , - BigNum { limbs: [ 0x7008ba672b6ffecf52e7e950d7ce36, 0xed9f21961bdda1125478cf63050484, 0x0036a0 ] } , - BigNum { limbs: [ 0x5661caa9b88f7bc99c409c32cbe93c, 0x81febdfe94276a8aad8807a5d7050b, 0x006767 ] } , - BigNum { limbs: [ 0x6742385645cc833663bf62cd3416c5, 0x25546b9ee920c8af2a8001fc010048, 0x000c86 ] } , - BigNum { limbs: [ 0xe1b8db4b0c6ea3ab3dcd74abc0acc5, 0x518f26f7d15431ab14182ee5361144, 0x003309 ] } , - BigNum { limbs: [ 0xdbeb27b4f1ed5b54c2328a543f533c, 0x55c402a5abf4018ec3efdabca1f40e, 0x0040e4 ] } , - BigNum { limbs: [ 0xef2afdb60852031c3f34a887d3c3e1, 0xcb3506e60a81f0394c93a42b5b72e9, 0x00064c ] } , - BigNum { limbs: [ 0xce790549f609fbe3c0cb56782c3c20, 0xdc1e22b772c643008b7465767c9269, 0x006da0 ] } , - BigNum { limbs: [ 0x8cdb76a42676ccb187cd4b5130698f, 0x41db3bd37280e077b68e7eab756cb8, 0x006959 ] } , - BigNum { limbs: [ 0x30c88c5bd7e5324e7832b3aecf9672, 0x6577edca0ac752c221798af662989b, 0x000a94 ] } , - BigNum { limbs: [ 0xb80be01829aa6e6b4e1dd7a6e41adf, 0x6de1daf8905fb9f70b105865f3b1cf, 0x004c84 ] } , - BigNum { limbs: [ 0x059822e7d4b19094b1e227591be522, 0x39714ea4ece87942ccf7b13be45384, 0x002769 ] } , - BigNum { limbs: [ 0xcad3633089749adf4e63d01af609aa, 0x0be46010a6b28fce2e90dce28a6db3, 0x003d3e ] } , - BigNum { limbs: [ 0xf2d09fcf74e76420b19c2ee509f657, 0x9b6ec98cd695a36ba9772cbf4d979f, 0x0036af ] } , - BigNum { limbs: [ 0x3fe56d15f19fd9d3a88f9769d85682, 0xa2628ede060eab8f2d5800a8be3b0f, 0x006281 ] } , - BigNum { limbs: [ 0x7dbe95ea0cbc252c5770679627a97f, 0x04f09abf773987aaaab008f919ca44, 0x00116c ] } , - BigNum { limbs: [ 0x33b77d2d66205cd6436789acd58a6a, 0x0e51924a73f486c6d515c6dbbd56d8, 0x00661d ] } , - BigNum { limbs: [ 0x89ec85d2983ba229bc9875532a7597, 0x990197530953ac7302f242c61aae7b, 0x000dd0 ] } , - BigNum { limbs: [ 0xbbd52b782f347dae0408970b4aab1a, 0x678caa916b48f296454a57be9a3dd2, 0x000554 ] } , - BigNum { limbs: [ 0x01ced787cf278151fbf767f4b554e7, 0x3fc67f0c11ff40a392bdb1e33dc781, 0x006e99 ] } , - BigNum { limbs: [ 0x7fe07d8d824b70a6b05f18a33c32b1, 0x4018a4fba9970315f7d6239cfdfbbe, 0x004ea9 ] } , - BigNum { limbs: [ 0x3dc385727c108e594fa0e65cc3cd50, 0x673a84a1d3b13023e031e604da0995, 0x002544 ] } , - BigNum { limbs: [ 0x50bf4dbafd02920d87e416425a1f5b, 0x43b8831183496fc9fedba1ca177ecf, 0x004c47 ] } , - BigNum { limbs: [ 0x6ce4b54501596cf2781be8bda5e0a6, 0x639aa68bf9fec36fd92c67d7c08684, 0x0027a6 ] } , - BigNum { limbs: [ 0x9c92782418d9a6f68d125f81344d2e, 0x3ae417d106a4752a779731a01e141a, 0x0005a4 ] } , - BigNum { limbs: [ 0x21118adbe582580972ed9f7ecbb2d3, 0x6c6f11cc76a3be0f6070d801b9f139, 0x006e49 ] } , - BigNum { limbs: [ 0xa9568098dc13297c139a093efa1190, 0x1f8538db87179f115b32fd34f9e257, 0x0044e7 ] } , - BigNum { limbs: [ 0x144d82672248d583ec65f5c105ee71, 0x87cdf0c1f63094287cd50c6cde22fc, 0x002f06 ] } , - BigNum { limbs: [ 0xdb59a295eea1fad891f7ce48c338da, 0x0bc19af45832cd3e67ec475459da28, 0x001a56 ] } , - BigNum { limbs: [ 0xe24a606a0fba04276e0830b73cc727, 0x9b918ea9251565fb701bc24d7e2b2a, 0x005997 ] } , - BigNum { limbs: [ 0x7cc816a910521c8f7f77012d9d64d2, 0xfd5789c0e146b081e9cf98bbfed9d6, 0x00483a ] } , - BigNum { limbs: [ 0x40dbec56ee09e2708088fdd2629b2f, 0xa9fb9fdc9c0182b7ee3870e5d92b7d, 0x002bb2 ] } , - BigNum { limbs: [ 0xc356be3d0f029aa409d9ee00585213, 0xb147452598293eb810c81a72553cb7, 0x0025b3 ] } , - BigNum { limbs: [ 0xfa4d44c2ef59645bf62610ffa7adee, 0xf60be477e51ef481c73fef2f82c89b, 0x004e39 ] } , - BigNum { limbs: [ 0xb871097a9f0c6f53f1742ce989b5a2, 0xdd8280effb6326d76b58b9434f6ec5, 0x00686f ] } , - BigNum { limbs: [ 0x0532f9855f4f8fac0e8bd216764a5f, 0xc9d0a8ad81e50c626caf505e88968e, 0x000b7d ] } , - BigNum { limbs: [ 0x1a129e137f0039c2fcba24fbaa6740, 0xaf9519ca80d68d67bc688c2a21ffa8, 0x0046ea ] } , - BigNum { limbs: [ 0xa39164ec7f5bc53d0345da045598c1, 0xf7be0fd2fc71a5d21b9f7d77b605ab, 0x002d02 ] } , - BigNum { limbs: [ 0x077dddb5761a734e2a017e4ffb6836, 0xe1e4f08eb7ec1e23d4338ba1fdbc33, 0x00099a ] } , - BigNum { limbs: [ 0xb626254a88418bb1d5fe80b00497cb, 0xc56e390ec55c151603d47dffda4920, 0x006a52 ] } , - BigNum { limbs: [ 0xc00f384e56df5ab098af553e858ddc, 0x772639e0f2e0bdf93ce28c12b17e9a, 0x003d4d ] } , - BigNum { limbs: [ 0xfd94cab1a77ca44f6750a9c17a7225, 0x302cefbc8a6775409b257d8f2686b8, 0x0036a0 ] } , - BigNum { limbs: [ 0xbbcd0457572ea4ba6f047a391e07cd, 0xdb9969605428e20283d330193c8c22, 0x00227d ] } , - BigNum { limbs: [ 0x01d6fea8a72d5a4590fb84c6e1f834, 0xcbb9c03d291f51375434d9889b7931, 0x00516f ] } , - BigNum { limbs: [ 0x3d78a715d35e675f5607600ebe8e85, 0x45bcd7037c97ac5bec5d064c7b2fa1, 0x0068c0 ] } , - BigNum { limbs: [ 0x802b5bea2afd97a0a9f89ef141717c, 0x6196529a00b086ddebab03555cd5b2, 0x000b2d ] } , - BigNum { limbs: [ 0x5255f97b2f5f8a3aab39c40d504e47, 0x3931c4e8a3365aa19c692fd480ceff, 0x0022e9 ] } , - BigNum { limbs: [ 0x6b4e0984cefc74c554c63af2afb1ba, 0x6e2164b4da11d8983b9ed9cd573654, 0x005104 ] } , - BigNum { limbs: [ 0xe8628b87c4717f74298e4f1f6b05b8, 0x86ffd6389f469bbcecee7941985189, 0x006d89 ] } , - BigNum { limbs: [ 0xd541777839ea7f8bd671afe094fa49, 0x20535364de01977ceb1990603fb3c9, 0x000664 ] } , - BigNum { limbs: [ 0xc4b3dde8d99b1da59b819134b83579, 0x3f3b319dd1b9a8cc0754083d8a76de, 0x001476 ] } , - BigNum { limbs: [ 0xf8f0251724c0e15a647e6dcb47ca88, 0x6817f7ffab8e8a6dd0b401644d8e74, 0x005f77 ] } , - BigNum { limbs: [ 0x5e5d72ca14bf355b2c4072b03330aa, 0xfcb9bed9a1d0c039e6a24828a4d111, 0x0044cb ] } , - BigNum { limbs: [ 0x5f469035e99cc9a4d3bf8c4fcccf57, 0xaa996ac3db7772fff165c179333442, 0x002f21 ] } , - BigNum { limbs: [ 0xa6b76707616830fca70889363d0810, 0x474a16a937608616f4669de6d37aa6, 0x004100 ] } , - BigNum { limbs: [ 0x16ec9bf89cf3ce0358f775c9c2f7f1, 0x600912f445e7ad22e3a16bbb048aad, 0x0032ed ] } , - BigNum { limbs: [ 0x034ce5f2a0e16cc71a57258e59e205, 0x4a3b69d18144f376ca920c31a41df2, 0x005d4a ] } , - BigNum { limbs: [ 0xba571d0d5d7a9238e5a8d971a61dfc, 0x5d17bfcbfc033fc30d75fd7033e761, 0x0016a3 ] } , - BigNum { limbs: [ 0x479c06b64c620e54913a5fad66493e, 0xe8eccb401e43ab35fb17c2ef06e1ff, 0x004f0e ] } , - BigNum { limbs: [ 0x7607fc49b1f9f0ab6ec59f5299b6c3, 0xbe665e5d5f048803dcf046b2d12354, 0x0024de ] } , - BigNum { limbs: [ 0x8301162f9b026bdf8f0a899f9ee419, 0x8d97e4ea5441615140b6e155e9ab76, 0x001aa6 ] } , - BigNum { limbs: [ 0x3aa2ecd06359932070f57560611be8, 0x19bb44b32906d1e89751284bee59dd, 0x005947 ] } , - BigNum { limbs: [ 0x9c1028848c11d02b0801fe4d03f4b3, 0xddace4e38717b5fc4d667f921f06b3, 0x001110 ] } , - BigNum { limbs: [ 0x2193da7b724a2ed4f7fe00b2fc0b4e, 0xc9a644b9f6307d3d8aa18a0fb8fea0, 0x0062dc ] } , - BigNum { limbs: [ 0x3288fa993675c6b000ebfccd728a11, 0x3393fe4edec850a6b9493521aaddad, 0x006be2 ] } , - BigNum { limbs: [ 0x8b1b0866c7e6384fff1402328d75f0, 0x73bf2b4e9e7fe2931ebed4802d27a6, 0x00080b ] } , - BigNum { limbs: [ 0x199a38673d1c784644f6e6d10cdb65, 0x5763a14834a7853a33904d076ea499, 0x0005fe ] } , - BigNum { limbs: [ 0xa409ca98c13f86b9bb09182ef3249c, 0x4fef885548a0adffa477bc9a6960ba, 0x006def ] } , - BigNum { limbs: [ 0x50d9ce6be8ab7e9afd17ae1c79b3cc, 0x6f3c81d65abe294532501559ab8009, 0x003e12 ] } , - BigNum { limbs: [ 0x6cca349415b0806502e850e3864c35, 0x3816a7c7228a09f4a5b7f4482c854a, 0x0035db ] } , - BigNum { limbs: [ 0x2086a26309099ab289450a2c8c785c, 0x78639fbbfa1a19c8f6a5547ef0cb37, 0x005cae ] } , - BigNum { limbs: [ 0x9d1d609cf552644d76baf4d37387a5, 0x2eef89e1832e1970e162b522e73a1c, 0x00173f ] } , - BigNum { limbs: [ 0x726a6f11fd5d1e41a26186d0f7d95a, 0x480ded0b0a2522ed236d0d4ec5e8bf, 0x005b39 ] } , - BigNum { limbs: [ 0x4b3993ee00fee0be5d9e782f0826a7, 0x5f453c927323104cb49afc53121c94, 0x0018b4 ] } , - BigNum { limbs: [ 0xac9edb793129a56d2a3526d2c2e46a, 0x40f093ad57bc107ae64b724aae15f9, 0x006831 ] } , - BigNum { limbs: [ 0x11052786cd325992d5cad82d3d1b97, 0x666295f0258c22bef1bc975729ef5a, 0x000bbc ] } , - BigNum { limbs: [ 0x6a7dd7ea6053089d718125b7898a67, 0xf96ecc6b5153abf178d66922bda5cb, 0x005b3c ] } , - BigNum { limbs: [ 0x53262b159e08f6628e7ed94876759a, 0xade45d322bf487485f31a07f1a5f88, 0x0018b0 ] } , - BigNum { limbs: [ 0xa04848fde48575abf74fde099c325f, 0x7857f96a44b11675db3747d3d791a7, 0x003395 ] } , - BigNum { limbs: [ 0x1d5bba0219d6895408b020f663cda2, 0x2efb303338971cc3fcd0c1ce0073ac, 0x004058 ] } , - BigNum { limbs: [ 0x69b1ce32ce51fbe4282ad9e2553334, 0x6ea21fc2a195c87adc4b385e8304b6, 0x005bd0 ] } , - BigNum { limbs: [ 0x53f234cd300a031bd7d5251daacccd, 0x38b109dadbb26abefbbcd14355009d, 0x00181d ] } , - BigNum { limbs: [ 0x5f6c03f0f179646b0b935e5c78f259, 0x287edbd07e2b04b4c968ebc0152690, 0x005995 ] } , - BigNum { limbs: [ 0x5e37ff0f0ce29a94f46ca0a3870da8, 0x7ed44dccff1d2e850e9f1de1c2dec3, 0x001a58 ] } , - BigNum { limbs: [ 0x5ed2cf19172e412e59452c2173c6ea, 0xb895c01840aecfda8e31c5ff001739, 0x005656 ] } , - BigNum { limbs: [ 0x5ed133e6e72dbdd1a6bad2de8c3917, 0xeebd69853c99635f49d643a2d7ee1a, 0x001d96 ] } , - BigNum { limbs: [ 0x9dcb7f92ea6a9b8d444a5beec3aaaf, 0x07e606bceb10c1d6263b3c797138ff, 0x00654d ] } , - BigNum { limbs: [ 0x1fd8836d13f16372bbb5a3113c5552, 0x9f6d22e092377163b1cccd2866cc54, 0x000ea0 ] } , - BigNum { limbs: [ 0xb9b3a0749e60cb8768c9f875b63680, 0x291981e1a6ffd922ef4010fd623046, 0x003a9e ] } , - BigNum { limbs: [ 0x03f0628b5ffb33789736068a49c981, 0x7e39a7bbd6485a16e8c7f8a475d50d, 0x00394f ] } , - BigNum { limbs: [ 0xf2172bc7473892459629b66ba900be, 0xeb28f1112e24ae07a577ed5adb9833, 0x003ec2 ] } , - BigNum { limbs: [ 0xcb8cd738b7236cba69d6489456ff43, 0xbc2a388c4f23853232901c46fc6d1f, 0x00352a ] } , - BigNum { limbs: [ 0x6c73629eb540ea3f9554aa5ac511e9, 0xba428345abaac34c773123acc36bcc, 0x004a8a ] } , - BigNum { limbs: [ 0x5130a061491b14c06aab54a53aee18, 0xed10a657d19d6fed60d6e5f5149987, 0x002962 ] } , - BigNum { limbs: [ 0xd2b29f89691c73686d7450c33d5a33, 0x95c67b9ea2efa1729a4994ac329b4c, 0x0057b5 ] } , - BigNum { limbs: [ 0xeaf16376953f8b97928bae3cc2a5ce, 0x118cadfeda5891c73dbe74f5a56a06, 0x001c38 ] } , - BigNum { limbs: [ 0x0da05f62a2205a038764a74650d0c5, 0x264ed896f8869866cb67d02650f974, 0x00192c ] } , - BigNum { limbs: [ 0xb003a39d5c3ba4fc789b57b9af2f3c, 0x8104510684c19ad30ca0397b870bdf, 0x005ac1 ] } , - BigNum { limbs: [ 0x07f2b8fe1b995c6f51caab160744d9, 0x45b7ef86f69047659707080c8273d8, 0x00724c ] } , - BigNum { limbs: [ 0xb5b14a01e2c2a290ae3553e9f8bb28, 0x619b3a1686b7ebd44101019555917b, 0x0001a1 ] } , - BigNum { limbs: [ 0xe6a93079ee7cccc934e486ecc125c0, 0x355dce7eaf368f76379c2c28653e10, 0x002031 ] } , - BigNum { limbs: [ 0xd6fad2860fdf3236cb1b78133eda41, 0x71f55b1ece11a3c3a06bdd7972c742, 0x0053bc ] } , - BigNum { limbs: [ 0xf79fc3d741bf226521696c6179297c, 0x9ae2c216552207600419c3f6115aeb, 0x0063bc ] } , - BigNum { limbs: [ 0xc6043f28bc9cdc9ade96929e86d685, 0x0c70678728262bd9d3ee45abc6aa67, 0x001031 ] } , - BigNum { limbs: [ 0xc4ded9ffbba24056e5deedda27244b, 0x8f8601768ac3bbb9b61429944d0c24, 0x00213e ] } , - BigNum { limbs: [ 0xf8c5290042b9bea91a211125d8dbb6, 0x17cd2826f284778021f3e00d8af92e, 0x0052af ] } , - BigNum { limbs: [ 0xf518b492651ba347ad66c74d7bca64, 0x5064e14b100a32e73c0848a259cce0, 0x004409 ] } , - BigNum { limbs: [ 0xc88b4e6d99405bb8529937b284359d, 0x56ee48526d3e00529bffc0ff7e3872, 0x002fe4 ] } , - BigNum { limbs: [ 0x31564fda741ade70b774835f62ee3c, 0x1ce4194322964607884498bbcb8c71, 0x001e85 ] } , - BigNum { limbs: [ 0x8c4db3258a41208f488b7ba09d11c5, 0x8a6f105a5ab1ed324fc370e60c78e2, 0x005568 ] } , - BigNum { limbs: [ 0xddec933364680fd1c931b0f7188c6e, 0x2e92d9ce55819bcfd2af02a07aa006, 0x000456 ] } , - BigNum { limbs: [ 0xdfb76fcc99f3ef2e36ce4e08e77393, 0x78c04fcf27c6976a055907015d654c, 0x006f97 ] } , - BigNum { limbs: [ 0x960fc9c499955198e1e535f0666860, 0x5f24e19b3eee4df7efe5f71e0abf44, 0x0054a5 ] } , - BigNum { limbs: [ 0x2794393b64c6ad671e1ac90f9997a1, 0x482e48023e59e541e8221283cd460f, 0x001f48 ] } , - BigNum { limbs: [ 0x1bc63ba1f12ba86a96e7321bc04210, 0x5ec81887c4f43e877567664189754e, 0x0045df ] } , - BigNum { limbs: [ 0xa1ddc75e0d3056956918cce43fbdf1, 0x488b1115b853f4b262a0a3604e9005, 0x002e0e ] } , - BigNum { limbs: [ 0x7c81ae1d87699d225d35c86477d58b, 0x400e38958dc7f5783bcc2a7ca18b18, 0x004293 ] } , - BigNum { limbs: [ 0x412254e276f261dda2ca369b882a76, 0x6744f107ef803dc19c3bdf25367a3b, 0x00315a ] } , - BigNum { limbs: [ 0x2611cec67dd54be518be27e7093f4e, 0x9743b4e0d46958698576f11c4a2e78, 0x0011ea ] } , - BigNum { limbs: [ 0x979234398086b31ae741d718f6c0b3, 0x100f74bca8dedad0529118858dd6db, 0x006203 ] } , - BigNum { limbs: [ 0x0223751b720a0cf2dab1c8c4a189ff, 0xdcb7690555b9127b1606420ade2a86, 0x002ac9 ] } , - BigNum { limbs: [ 0xbb808de48c51f20d254e363b5e7602, 0xca9bc098278f20bec201c796f9dacd, 0x004923 ] } , - BigNum { limbs: [ 0xa5dd527cd71fb7976ac7f5f6c72a88, 0x6117fe37a234a60a47cec5cb1a85e6, 0x001f1c ] } , - BigNum { limbs: [ 0x17c6b083273c47689538090938d579, 0x463b2b65db138d2f903943d6bd7f6d, 0x0054d1 ] } , - BigNum { limbs: [ 0x8b12057546a348bd571c059c104014, 0xb61776734f89d0fc55508e07bb7098, 0x00699c ] } , - BigNum { limbs: [ 0x3291fd8ab7b8b642a8e3f963efbfed, 0xf13bb32a2dbe623d82b77b9a1c94bb, 0x000a50 ] } , - BigNum { limbs: [ 0x9e8b72db6f1e2653fd29142d3819a2, 0xd3f9439750aa38a37afc68b0fafae2, 0x0054a1 ] } , - BigNum { limbs: [ 0x1f1890248f3dd8ac02d6ead2c7e65f, 0xd359e6062c9dfa965d0ba0f0dd0a71, 0x001f4b ] } , - BigNum { limbs: [ 0xd7c1a278ec608700a9be0299817ca4, 0x55532c1abbaf9ef11dfefbb02e5e62, 0x0007a0 ] } , - BigNum { limbs: [ 0xe5e2608711fb77ff5641fc667e835d, 0x51fffd82c1989448ba090df1a9a6f0, 0x006c4d ] } , - BigNum { limbs: [ 0x1fd547be4b6ce2b275fb29418f4c5d, 0x428c158ed643f84e55b954bddacbef, 0x003076 ] } , - BigNum { limbs: [ 0x9dcebb41b2ef1c4d8a04d5be70b3a4, 0x64c7140ea7043aeb824eb4e3fd3964, 0x004377 ] } , - BigNum { limbs: [ 0xc86ad30700ce774a3b8d2e0f596020, 0xba2fd3948857eb766ca2207244f211, 0x006a3e ] } , - BigNum { limbs: [ 0xf5392ff8fd8d87b5c472d0f0a69fe1, 0xed235608f4f047c36b65e92f931341, 0x0009ae ] } , - BigNum { limbs: [ 0x855177336fb60fdca2ca5cd99ce3c3, 0xe0d6b37e59679e533b9248389fa8c1, 0x00324a ] } , - BigNum { limbs: [ 0x38528bcc8ea5ef235d35a226631c3e, 0xc67c761f23e094e69c75c169385c92, 0x0041a2 ] } , - BigNum { limbs: [ 0xa947be6ae0adca67112eaf34e9f6be, 0x377e8099fa46465283e47a582918fe, 0x001b23 ] } , - BigNum { limbs: [ 0x145c44951dae3498eed14fcb160943, 0x6fd4a9038301ece754238f49aeec55, 0x0058ca ] } , - BigNum { limbs: [ 0x1d79c870ba25b6c9e1715651f94edb, 0xe6471ba2107df5f9703e00bf2460a7, 0x002bbe ] } , - BigNum { limbs: [ 0xa02a3a8f443648361e8ea8ae06b126, 0xc10c0dfb6cca3d4067ca08e2b3a4ac, 0x00482e ] } , - BigNum { limbs: [ 0x180a97607b7b75ee0a9b7720fe18ea, 0x61caaccddcb331fc82977997ab4493, 0x003441 ] } , - BigNum { limbs: [ 0xa5996b9f82e08911f56487df01e717, 0x45887ccfa095013d5570900a2cc0c0, 0x003fac ] } , - BigNum { limbs: [ 0x7a4cdd8c345f311415ae6f648ca4c4, 0x11970ddf05c3476edefa503afd9c0a, 0x0017ae ] } , - BigNum { limbs: [ 0x43572573c9fccdebea518f9b735b3d, 0x95bc1bbe7784ebcaf90db966da6949, 0x005c3f ] } , - BigNum { limbs: [ 0x2431336dffbd3ff302032d443d58d3, 0xda94c4d882d868bd470adc88c0ecd8, 0x0026c2 ] } , - BigNum { limbs: [ 0x9972cf91fe9ebf0cfdfcd1bbc2a72e, 0xccbe64c4fa6fca7c90fd2d1917187b, 0x004d2a ] } , - BigNum { limbs: [ 0x8b73877a32f62bdfe96721a6cd7b3e, 0x0231915bdd4603e21d77f00f7c14ae, 0x004f5b ] } , - BigNum { limbs: [ 0x32307b85cb65d3201698dd593284c3, 0xa5219841a0022f57ba9019925bf0a5, 0x002492 ] } , - BigNum { limbs: [ 0xe566e43fbfb3adcaa4621ab46a4d30, 0xe4c6b3243876efd27177d6ce56ad87, 0x00583a ] } , - BigNum { limbs: [ 0xd83d1ec03ea851355b9de44b95b2d1, 0xc28c767944d14367669032d38157cb, 0x001bb2 ] } , - BigNum { limbs: [ 0x7e23dd40142c5f9422d2c34101124c, 0x9b8792f6512f934f79299c50142c3d, 0x0024ea ] } , - BigNum { limbs: [ 0x3f8025bfea2f9f6bdd2d3bbefeedb5, 0x0bcb96a72c189fea5ede6d51c3d916, 0x004f03 ] } , - BigNum { limbs: [ 0xec9c0406a08f265cce2c30333b187f, 0x6ca4e92bd0ad946fec5826cc03719d, 0x000206 ] } , - BigNum { limbs: [ 0xd107fef95dccd8a331d3ceccc4e782, 0x3aae4071ac9a9ec9ebafe2d5d493b5, 0x0071e7 ] } , - BigNum { limbs: [ 0x7f3449b8bd93686beadab96405ae3a, 0x1ab61fc3015bf5412a443f8e57f148, 0x003965 ] } , - BigNum { limbs: [ 0x3e6fb94740c896941525459bfa51c7, 0x8c9d09da7bec3df8adc3ca1380140b, 0x003a88 ] } , - BigNum { limbs: [ 0xd9c57133e56dfad3ea280c5f782f2b, 0xead5a7d140e1e3fff1c4cd5cae127b, 0x0024c2 ] } , - BigNum { limbs: [ 0xe3de91cc18ee042c15d7f2a087d0d6, 0xbc7d81cc3c664f39e6433c4529f2d7, 0x004f2a ] } , - BigNum { limbs: [ 0xa7fbcbd8c1ce86f75167878ef4c2b7, 0x118566730cb78c4efcd85ee6395889, 0x007110 ] } , - BigNum { limbs: [ 0x15a837273c8d7808ae9877710b3d4a, 0x95cdc32a7090a6eadb2faabb9eacca, 0x0002dd ] } , - BigNum { limbs: [ 0x1ffcba3c12bc2b9ee90b3d11c2dd21, 0x102ef837861bde2c7551f9dff19445, 0x0006b7 ] } , - BigNum { limbs: [ 0x9da748c3eb9fd36116f4c1ee3d22e0, 0x97243165f72c550d62b60fc1e6710e, 0x006d36 ] } , - BigNum { limbs: [ 0xd017e31cf0cb08eef8f30684ce9026, 0x8d3c8185d7d529293c2d54cc37eba5, 0x00519e ] } , - BigNum { limbs: [ 0xed8c1fe30d90f611070cf87b316fdb, 0x1a16a817a5730a109bdab4d5a019ad, 0x00224f ] } , - BigNum { limbs: [ 0x7a986565c2a5d1c9be282a115f3af5, 0x9b7c85ec9ffed0759691f8350bcf77, 0x002dfe ] } , - BigNum { limbs: [ 0x430b9d9a3bb62d3641d7d4eea0c50c, 0x0bd6a3b0dd4962c44176116ccc35dc, 0x0045ef ] } , - BigNum { limbs: [ 0xa9e37a3c78a6f03c5e8cd07ac27967, 0xa77bf4482596c40e6ea7ec15f1e470, 0x006957 ] } , - BigNum { limbs: [ 0x13c088c385b50ec3a1732e853d869a, 0xffd7355557b16f2b69601d8be620e3, 0x000a95 ] } , - BigNum { limbs: [ 0xda1d1c2ae95f6ed46bc78329689a4e, 0xd3feed71abf08747974362d7998504, 0x005f55 ] } , - BigNum { limbs: [ 0xe386e6d514fc902b94387bd69765b3, 0xd3543c2bd157abf240c4a6ca3e804e, 0x001497 ] } , - BigNum { limbs: [ 0xdc7f318ce3896129a67c58c11af270, 0x33b32d96101f50bdf12f11ba2ba3f6, 0x004407 ] } , - BigNum { limbs: [ 0xe124d1731ad29dd65983a63ee50d91, 0x739ffc076d28e27be6d8f7e7ac615c, 0x002fe6 ] } , - BigNum { limbs: [ 0x277cbb3e7a777eeeb008d78b019434, 0xfbfe7fba4f67c98d9a4ba421a74a5e, 0x006892 ] } , - BigNum { limbs: [ 0x962747c183e480114ff72774fe6bcd, 0xab54a9e32de069ac3dbc658030baf5, 0x000b5a ] } , - BigNum { limbs: [ 0x20997b1fdd66bd53ec18ed560e5c0c, 0x74a3e7e4ae661be49858d07f3e273d, 0x000bdf ] } , - BigNum { limbs: [ 0x9d0a87e020f541ac13e711a9f1a3f5, 0x32af41b8cee217553faf392299de16, 0x00680e ] } , - BigNum { limbs: [ 0xe792ae1b302effd0b0f21e5dd18de6, 0x1d8cfff841ef8c787035f36a072656, 0x0051d1 ] } , - BigNum { limbs: [ 0xd61154e4ce2cff2f4f0de0a22e721b, 0x89c629a53b58a6c167d21637d0defc, 0x00221c ] } , - BigNum { limbs: [ 0x1a01cc28fefe11f643be94ebcf7272, 0x3a3286fa30c54b3fe9256008c92553, 0x00491c ] } , - BigNum { limbs: [ 0xa3a236d6ff5ded09bc416a14308d8f, 0x6d20a2a34c82e7f9eee2a9990ee000, 0x002ad1 ] } , - BigNum { limbs: [ 0x3fdeea97c6fe196470728429de50e2, 0x0a1474f2943817443ffa79edc2405a, 0x003edc ] } , - BigNum { limbs: [ 0x7dc51868375de59b8f8d7ad621af1f, 0x9d3eb4aae9101bf5980d8fb415c4f9, 0x003511 ] } , - BigNum { limbs: [ 0xeaa5fd91eb8ad60697528e66468f8b, 0xf542a4cb0e56a928854e7f46c10779, 0x0037ca ] } , - BigNum { limbs: [ 0xd2fe056e12d128f968ad7099b97076, 0xb21084d26ef18a1152b98a5b16fdd9, 0x003c22 ] } , - BigNum { limbs: [ 0x13924feb1eeca0f1045bd496c219a4, 0x1bdcc7a762a7a1e2d45135ad7c1cf7, 0x000303 ] } , - BigNum { limbs: [ 0xaa11b314df6f5e0efba42a693de65d, 0x8b7661f61aa0915703b6d3f45be85c, 0x0070ea ] } , - BigNum { limbs: [ 0x4daa4a99dbb5b03fbacc5e6dc71317, 0x8eb4ab2df85240fdd323261f47b06d, 0x002bbf ] } , - BigNum { limbs: [ 0x6ff9b86622a64ec04533a09238ecea, 0x189e7e6f84f5f23c04e4e3829054e6, 0x00482e ] } , - BigNum { limbs: [ 0x6af2a3df55476564cabfb80ccdf965, 0xa8bb5dc5e43d9aaa551e3cb295f125, 0x006bfb ] } , - BigNum { limbs: [ 0x52b15f20a914999b354046f332069c, 0xfe97cbd7990a988f82e9ccef42142e, 0x0007f1 ] } , - BigNum { limbs: [ 0x57cb9f5410cdb13e4972bf66f482c6, 0x0a0c78d1f4e98c45d4e61e2afaf2e3, 0x006534 ] } , - BigNum { limbs: [ 0x65d863abed8e4dc1b68d3f990b7d3b, 0x9d46b0cb885ea6f40321eb76dd1270, 0x000eb9 ] } , - BigNum { limbs: [ 0x47df7ab3dcb27be44ecf3b78cfad97, 0x5daa7c9b91da67e2903db4b2328356, 0x000cb4 ] } , - BigNum { limbs: [ 0x75c4884c21a9831bb130c38730526a, 0x49a8ad01eb6dcb5747ca54efa581fd, 0x006739 ] } , - BigNum { limbs: [ 0x335495b3e381a61803b5a2380d0d30, 0xdc57672d00970d536c25c56fe7a60f, 0x0021d1 ] } , - BigNum { limbs: [ 0x8a4f6d4c1ada58e7fc4a5cc7f2f2d1, 0xcafbc2707cb125e66be24431f05f44, 0x00521b ] } , - BigNum { limbs: [ 0xb619876811f53367d96ac4dec2a7c5, 0x205c599f30a57bf990ec45bb4a8b69, 0x003ef1 ] } , - BigNum { limbs: [ 0x078a7b97ec66cb9826953a213d583c, 0x86f6cffe4ca2b740471bc3e68d79ea, 0x0034fc ] } , - BigNum { limbs: [ 0x41e2dc3cbcaa821d94f28bd2c67835, 0x1f70aeb2ebcd2b0325dad02c36de2e, 0x0014b9 ] } , - BigNum { limbs: [ 0x7bc126c341b17ce26b0d732d3987cc, 0x87e27aea917b0836b22d3975a12725, 0x005f34 ] } , - BigNum { limbs: [ 0x4afcc358f070656798b57cfe3321aa, 0xf69b92ab6fc454e75abe206844831d, 0x001654 ] } , - BigNum { limbs: [ 0x72a73fa70deb9998674a8201ccde57, 0xb0b796f20d83de527d49e939938236, 0x005d98 ] } , - BigNum { limbs: [ 0xb646d5a9ae7de4fb27d64d21924534, 0x29fc62fee1ef3730c5466a640457fe, 0x003c13 ] } , - BigNum { limbs: [ 0x075d2d564fde1a04d829b1de6dbacd, 0x7d56c69e9b58fc0912c19f3dd3ad55, 0x0037da ] } , - BigNum { limbs: [ 0x89d821e1ae06b63c3d590cd42f742e, 0x63ad8b42d73f52437581fc31b4cb3b, 0x0045cb ] } , - BigNum { limbs: [ 0x33cbe11e505548c3c2a6f22bd08bd3, 0x43a59e5aa608e0f662860d70233a18, 0x002e22 ] } , - BigNum { limbs: [ 0xd7c6c5de7c9c7598942eff1093543f, 0x475a4ded008f25944c39b09897e604, 0x006e29 ] } , - BigNum { limbs: [ 0xe5dd3d2181bf89676bd0ffef6cabc2, 0x5ff8dbb07cb90da58bce5909401f4e, 0x0005c4 ] } , - BigNum { limbs: [ 0xac5823be4c981f8af00971a8493ef2, 0x1d363d4b2f15805a9b50ec0d2d83c6, 0x003175 ] } , - BigNum { limbs: [ 0x114bdf41b1c3df750ff68d57b6c10f, 0x8a1cec524e32b2df3cb71d94aa818d, 0x004278 ] } , - BigNum { limbs: [ 0x9f60bd799619a78b235e378dc9fa7c, 0x81e948ae5bc5fe101b8c580f1b2242, 0x0067b0 ] } , - BigNum { limbs: [ 0x1e43458668425774dca1c772360585, 0x2569e0ef21823529bc7bb192bce311, 0x000c3d ] } , - BigNum { limbs: [ 0xee8492ee3da22ff3e3e1962f75a6b8, 0x5dd7ff6f5999d3d22736d22e5d8107, 0x0073d3 ] } , - BigNum { limbs: [ 0xcf1f7011c0b9cf0c1c1e68d08a5949, 0x497b2a2e23ae5f67b0d137737a844b, 0x00001a ] } , - BigNum { limbs: [ 0xcec740fed7840e6dbad9a23e72f81c, 0xb9a5d59ea6535f2fce20817a78d7c3, 0x004785 ] } , - BigNum { limbs: [ 0xeedcc20126d7f09245265cc18d07e5, 0xedad53fed6f4d40a09e788275f2d8f, 0x002c67 ] } , - BigNum { limbs: [ 0x069ac76165652518b66c7d8e84b7fb, 0x6824377d54128a64cca9517059cf6b, 0x0033f1 ] } , - BigNum { limbs: [ 0xb7093b9e98f6d9e7499381717b4806, 0x3f2ef2202935a8d50b5eb8317e35e8, 0x003ffc ] } , - BigNum { limbs: [ 0x0ecd974f2a3b506efed909666fe227, 0x79afbe389bf399a8cb100ba938f0ea, 0x005eac ] } , - BigNum { limbs: [ 0xaed66bb0d420ae910126f599901dda, 0x2da36b64e15499910cf7fdf89f1469, 0x001541 ] } , - BigNum { limbs: [ 0x010631e01cbc9f572cb84cf2c5ba09, 0x861b644b42c375aa55f89169d7ad93, 0x005b59 ] } , - BigNum { limbs: [ 0xbc9dd11fe19f5fa8d347b20d3a45f8, 0x2137c5523a84bd8f820f78380057c0, 0x001894 ] } , - BigNum { limbs: [ 0x036aeea430a057753ed7c94fb0eeb9, 0x421b969856edaeada54c5497aad2cf, 0x002aa4 ] } , - BigNum { limbs: [ 0xba39145bcdbba78ac12835b04f1148, 0x65379305265a848c32bbb50a2d3284, 0x004949 ] } , - BigNum { limbs: [ 0x27f1e0971010d57a3c81696a211fdf, 0xa91f129e2638b0ee8a91eb8b9e25cb, 0x0065f1 ] } , - BigNum { limbs: [ 0x95b22268ee4b2985c37e9595dee022, 0xfe3416ff570f824b4d761e1639df88, 0x000dfb ] } , - BigNum { limbs: [ 0xb6b627c983a9d2e73458ac79b074ee, 0x26f9a1f2fb63a902b699f27a42bda3, 0x0066ae ] } , - BigNum { limbs: [ 0x06eddb367ab22c18cba752864f8b13, 0x805987aa81e48a37216e17279547b0, 0x000d3f ] } , - BigNum { limbs: [ 0x2345c5177d051a336503a91e97e5d7, 0xe82a9d82d223e607676361fe30e365, 0x002b64 ] } , - BigNum { limbs: [ 0x9a5e3de88156e4cc9afc55e1681a2a, 0xbf288c1aab244d3270a4a7a3a721ee, 0x004888 ] } , - BigNum { limbs: [ 0xb5d08955ff9e20e0480ab0fd9a31fa, 0x67c5369459aa472ce39066e706af49, 0x005bf5 ] } , - BigNum { limbs: [ 0x07d379a9febdde1fb7f54e0265ce07, 0x3f8df309239dec0cf477a2bad1560a, 0x0017f8 ] } , - BigNum { limbs: [ 0x21a614ccdb8d0356d6ec5ed1e118ad, 0x4cbaa9097311544f0b99685cfd7fc2, 0x003715 ] } , - BigNum { limbs: [ 0x9bfdee3322cefba92913a02e1ee754, 0x5a9880940a36deeacc6ea144da8591, 0x003cd8 ] } , - BigNum { limbs: [ 0x4004660ebbfc8136ef495f9fe8668d, 0xd2acd3b1314f047d8c5e8e943d7b0f, 0x00158c ] } , - BigNum { limbs: [ 0x7d9f9cf1425f7dc910b69f60179974, 0xd4a655ec4bf92ebc4ba97b0d9a8a44, 0x005e60 ] } , - BigNum { limbs: [ 0xef7cb95c169e236f344925d273570b, 0xed4d89397e65a1e265fc1fb2d6cb41, 0x0039d6 ] } , - BigNum { limbs: [ 0xce2749a3e7bddb90cbb6d92d8ca8f6, 0xba05a063fee29157720be9ef013a11, 0x003a16 ] } , - BigNum { limbs: [ 0xbfd8fb21c9bc312aafa84a8f32c4c3, 0x725ed9887c0d76a737cfb9ec903271, 0x006fd9 ] } , - BigNum { limbs: [ 0xfdcb07de349fcdd55057b470cd3b3e, 0x34f45015013abc92a0384fb547d2e1, 0x000414 ] } , - BigNum { limbs: [ 0xac5555ad914c92614850e921b50b55, 0x888e1bc2c0f01f01546fd8631e66e8, 0x0027fc ] } , - BigNum { limbs: [ 0x114ead526d0f6c9eb7af15de4af4ac, 0x1ec50ddabc5814388398313eb99e6b, 0x004bf1 ] } , - BigNum { limbs: [ 0x54fbc08c604c0bc827edff9f54ca63, 0xdddc6facd3a427840b4f6a4b3ffe3c, 0x0000cc ] } , - BigNum { limbs: [ 0x68a842739e0ff337d811ff60ab359e, 0xc976b9f0a9a40bb5ccb89f56980717, 0x007320 ] } , - BigNum { limbs: [ 0xf4f876d5d1189994dd945218bdbbc2, 0xfb376ec72a786796c6567f5b161232, 0x005e8f ] } , - BigNum { limbs: [ 0xc8ab8c2a2d43656b226bace742443f, 0xac1bbad652cfcba311b18a46c1f320, 0x00155d ] } , - BigNum { limbs: [ 0x33fc05de37b96a5c092cddae2df4ca, 0x946abc676c5ed913df0b62773d4fbd, 0x000822 ] } , - BigNum { limbs: [ 0x89a7fd21c6a294a3f6d32151d20b37, 0x12e86d3610e95a25f8fca72a9ab596, 0x006bcb ] } , - BigNum { limbs: [ 0x9d80b5ada11a750907a4e8b7d58e6a, 0x3c12226705777b23957d3889bcbf4d, 0x005b5e ] } , - BigNum { limbs: [ 0x20234d525d4189f6f85b16482a7197, 0x6b41073677d0b816428ad1181b4606, 0x00188f ] } , - BigNum { limbs: [ 0xdeb374606e7481ab9cb369c352cef9, 0x386f0661f1a7f25ded5a7525beba19, 0x0030c6 ] } , - BigNum { limbs: [ 0xdef08e9f8fe77d54634c953cad3108, 0x6ee4233b8ba040dbeaad947c194b39, 0x004327 ] } , - BigNum { limbs: [ 0x5b1a2164b6dd1896e6c704e507a68c, 0xa11049970467d95853e14bf970d3fc, 0x00736a ] } , - BigNum { limbs: [ 0x6289e19b477ee6691938fa1af85975, 0x0642e00678e059e18426bda8673157, 0x000083 ] } , - BigNum { limbs: [ 0xa0c3b85cc1625c18889dbb4c8fc93f, 0x554ad434a3a77303d14549438829dd, 0x002db8 ] } , - BigNum { limbs: [ 0x1ce04aa33cf9a2e7776243b37036c2, 0x52085568d9a0c03606c2c05e4fdb76, 0x004635 ] } , - BigNum { limbs: [ 0x495a3f68e907e71bb3e6377c8ca828, 0x42dcd31ae38aaeeb020aab9a427042, 0x00136d ] } , - BigNum { limbs: [ 0x7449c397155417e44c19c7837357d9, 0x6476568299bd844ed5fd5e07959511, 0x006080 ] } , - BigNum { limbs: [ 0x03fca33ae80a7fc83b37a3b9e12e68, 0x42747c135aee51c1f421f069545a96, 0x0016f8 ] } , - BigNum { limbs: [ 0xb9a75fc516517f37c4c85b461ed199, 0x64dead8a2259e177e3e6193883aabd, 0x005cf5 ] } , - BigNum { limbs: [ 0x2e14681c99205c3efbab2e58a9a902, 0xd98628e0476857354101f90fd89fc1, 0x002975 ] } , - BigNum { limbs: [ 0x8f8f9ae3653ba2c10454d0a75656ff, 0xcdcd00bd35dfdc0497061091ff6592, 0x004a77 ] } , - BigNum { limbs: [ 0x8b8205eb6bd64213c2c46305798d57, 0xc8a83119f25dcd4785621a77f02003, 0x0029a8 ] } , - BigNum { limbs: [ 0x3221fd149285bcec3d3b9bfa8672aa, 0xdeaaf8838aea65f252a5ef29e7e550, 0x004a44 ] } , - BigNum { limbs: [ 0x3a7975240c453467f53af052532623, 0x65af92d4f70159b29ee57bf65f7f96, 0x00622b ] } , - BigNum { limbs: [ 0x832a8ddbf216ca980ac50eadacd9de, 0x41a396c88646d98739228dab7885bd, 0x0011c2 ] } , - BigNum { limbs: [ 0x63e200e9d8e2e5305f74f884460d5a, 0xf96b57d1fb5374dfde2f880fa03f19, 0x0023a8 ] } , - BigNum { limbs: [ 0x59c20216257919cfa08b067bb9f2a7, 0xade7d1cb81f4be59f9d8819237c63a, 0x005044 ] } , - BigNum { limbs: [ 0xe6f3a7aa7aa027d5ef58fc555a6545, 0xc3a26d8d2d0b63363c75ac7b61fa06, 0x001efe ] } , - BigNum { limbs: [ 0xd6b05b5583bbd72a10a702aaa59abc, 0xe3b0bc10503cd0039b925d26760b4c, 0x0054ee ] } , - BigNum { limbs: [ 0x8cc4e59271bc254675e44de9acb089, 0x90622d1b33952336df41aa60d8fd88, 0x002a16 ] } , - BigNum { limbs: [ 0x30df1d6d8c9fd9b98a1bb116534f78, 0x16f0fc8249b31002f8c65f40ff07cb, 0x0049d7 ] } , - BigNum { limbs: [ 0x5a4984bd3033326a314c573c060e79, 0x4308610110d950309e5d6881371a44, 0x00251f ] } , - BigNum { limbs: [ 0x635a7e42ce28cc95ceb3a7c3f9f188, 0x644ac89c6c6ee30939aaa120a0eb0f, 0x004ece ] } , - BigNum { limbs: [ 0x6261dae436c20e1ae655f9c67cb4ee, 0x22db31ab8d36fc199e379693433fef, 0x00590d ] } , - BigNum { limbs: [ 0x5b42281bc799f0e519aa0539834b13, 0x8477f7f1f011372039d0730e94c564, 0x001ae0 ] } , - BigNum { limbs: [ 0x97df7b82540d7f520fa375ce78b879, 0xd257d52cc247f82e1823a6a0a604df, 0x0013e4 ] } , - BigNum { limbs: [ 0x25c4877daa4e7fadf05c8931874788, 0xd4fb5470bb003b0bbfe46301320074, 0x006008 ] } , - BigNum { limbs: [ 0x27e28d07b063a01ddcc828594b2606, 0x18800771dd7f441b5c5cba7e08c60a, 0x006e7a ] } , - BigNum { limbs: [ 0x95c175f84df85ee22337d6a6b4d9fb, 0x8ed3222b9fc8ef1e7bab4f23cf3f49, 0x000573 ] } , - BigNum { limbs: [ 0x122a6bda001d781a1d628b12064a8f, 0xbef1ee380b4c3884583970d8ed1f28, 0x000d69 ] } , - BigNum { limbs: [ 0xab799725fe3e86e5e29d73edf9b572, 0xe8613b6571fbfab57fce98c8eae62b, 0x006683 ] } , - BigNum { limbs: [ 0x4109d826db2ff20301669f731697cb, 0xefe5327bd2b34713d04cbf2d404699, 0x005999 ] } , - BigNum { limbs: [ 0x7c9a2ad9232c0cfcfe995f8ce96836, 0xb76df721aa94ec2607bb4a7497beba, 0x001a53 ] } , - BigNum { limbs: [ 0x279b87d2e6b387fcf5fe3b045dd181, 0x1fd88f51bc49ee62c37382b0353690, 0x004f16 ] } , - BigNum { limbs: [ 0x96087b2d17a877030a01c3fba22e80, 0x877a9a4bc0fe44d7149486f1a2cec3, 0x0024d7 ] } , - BigNum { limbs: [ 0xb5d2af6411c8553712b61b70f50fdc, 0xfef871d9d6648a833323701f1e4282, 0x003dba ] } , - BigNum { limbs: [ 0x07d1539bec93a9c8ed49e38f0af025, 0xa85ab7c3a6e3a8b6a4e49982b9c2d1, 0x003632 ] } , - BigNum { limbs: [ 0x15c80f017c9aa2a069d1dc9b7042bc, 0xa5269bf2095fdaa09ca8fc7421e5f7, 0x0019e0 ] } , - BigNum { limbs: [ 0xa7dbf3fe81c15c5f962e22648fbd45, 0x022c8dab73e858993b5f0d2db61f5c, 0x005a0d ] } , - BigNum { limbs: [ 0x62db18feb3e506f88c9f388c0677df, 0x3b9eaedc5bb79b6f2492431540cb08, 0x005385 ] } , - BigNum { limbs: [ 0x5ac8ea014a76f8077360c673f98822, 0x6bb47ac1219097cab375c68c973a4b, 0x002068 ] } , - BigNum { limbs: [ 0x655490bf2eb5c842ba9cf6eeeeae9b, 0xd2474b10f54a9e3e5c6ba11db18f5c, 0x003d7f ] } , - BigNum { limbs: [ 0x584f7240cfa636bd45630811115166, 0xd50bde8c87fd94fb7b9c68842675f7, 0x00366d ] } , - BigNum { limbs: [ 0xdbd2559a884245d72951864d8fa8da, 0x1375b8c0af7b737efcd5f01ebdb95c, 0x001fb6 ] } , - BigNum { limbs: [ 0xe1d1ad657619b928d6ae78b2705727, 0x93dd70dccdccbfbadb3219831a4bf6, 0x005437 ] } , - BigNum { limbs: [ 0x5879432fea7a51222aedd803cfa5cb, 0x4886f803ad1dad27b4014dedfaed14, 0x001b15 ] } , - BigNum { limbs: [ 0x652abfd013e1adddd51226fc305a36, 0x5ecc3199d02a86122406bbb3dd183f, 0x0058d8 ] } , - BigNum { limbs: [ 0xc99defc2a29159bca5d0ce219b4711, 0x7214004ab09d69632374d00f8a2e91, 0x001737 ] } , - BigNum { limbs: [ 0xf406133d5bcaa5435a2f30de64b8f0, 0x353f2952ccaac9d6b49339924dd6c1, 0x005cb6 ] } , - BigNum { limbs: [ 0x4901bbd26428fd3608266993cc1060, 0xf73cd3a330df9a39086a6948da8562, 0x004f39 ] } , - BigNum { limbs: [ 0x74a2472d9a3301c9f7d9956c33efa1, 0xb01655fa4c689900cf9da058fd7ff1, 0x0024b3 ] } , - BigNum { limbs: [ 0x077d669930bd57b515ba906dbfc129, 0x63cbfdc3672250f2476c3902b234c3, 0x0025eb ] } , - BigNum { limbs: [ 0xb6269c66cd9ea74aea456e92403ed8, 0x43872bda1625e247909bd09f25d090, 0x004e02 ] } , - BigNum { limbs: [ 0x63a3ef0a0dc0eda56e5338c1cb228f, 0x4dcd2085462924021dd09c3abc78e7, 0x003d7c ] } , - BigNum { limbs: [ 0x5a0013f5f09b115a91acc63e34dd72, 0x59860918371f0f37ba376d671b8c6c, 0x003671 ] } , - BigNum { limbs: [ 0x17f78b09396083ed9be33e30f62aaa, 0xb650aa0b473d0bd9e6a77fb9d5d6ca, 0x007369 ] } , - BigNum { limbs: [ 0xa5ac77f6c4fb7b12641cc0cf09d557, 0xf1027f92360b275ff16089e8022e89, 0x000083 ] } , - BigNum { limbs: [ 0xb3ac610f977e33a5d11204dfbed99d, 0xbb4b42cf1f3a9b0feb4704453bb48b, 0x0046df ] } , - BigNum { limbs: [ 0x09f7a1f066ddcb5a2eedfa20412664, 0xec07e6ce5e0d9829ecc1055c9c50c8, 0x002d0d ] } , - BigNum { limbs: [ 0x55ad625c181f556065bcd7a01c30f2, 0x781a7c2239ae887a36503010401e36, 0x004f5b ] } , - BigNum { limbs: [ 0x67f6a0a3e63ca99f9a43275fe3cf0f, 0x2f38ad7b4399aabfa1b7d99197e71d, 0x002492 ] } , - BigNum { limbs: [ 0x41edb4801671b387553452e7d61777, 0xd29ba4c63ee76548d5a502b249e7f1, 0x006dc9 ] } , - BigNum { limbs: [ 0x7bb64e7fe7ea4b78aacbac1829e88a, 0xd4b784d73e60cdf1026306ef8e1d62, 0x000623 ] } , - BigNum { limbs: [ 0xc3fa6b12b3b74ec8b70acd9cf0d865, 0x2c1755de706dc08e3aa03315ca7a63, 0x003b64 ] } , - BigNum { limbs: [ 0xf9a997ed4aa4b03748f531630f279c, 0x7b3bd3bf0cda72ab9d67d68c0d8aef, 0x003889 ] } , - BigNum { limbs: [ 0xef690241dfa3963ce8fa61277fed1a, 0x4b9f0b721eb1bf8908719fe1ec6949, 0x005e90 ] } , - BigNum { limbs: [ 0xce3b00be1eb868c317059dd88012e7, 0x5bb41e2b5e9673b0cf9669bfeb9c09, 0x00155d ] } , - BigNum { limbs: [ 0xe791c9632c5ea306ce63b513ad4ce0, 0xe3baa6b4f02c0689adb2f9082fb65f, 0x004e36 ] } , - BigNum { limbs: [ 0xd612399cd1fd5bf9319c49ec52b321, 0xc39882e88d1c2cb02a551099a84ef3, 0x0025b6 ] } , - BigNum { limbs: [ 0x0cde3a17cbf71e5f622b1f50d9fdd2, 0x2cf1d0e1dadb041561a5e218abee3e, 0x002002 ] } , - BigNum { limbs: [ 0xb0c5c8e83264e0a09dd4dfaf26022f, 0x7a6158bba26d2f24766227892c1715, 0x0053eb ] } , - BigNum { limbs: [ 0x537e43d8e58b2372f85bc98bc40e5a, 0xeaa7d4663a5035d056852237c9d923, 0x002481 ] } , - BigNum { limbs: [ 0x6a25bf2718d0db8d07a435743bf1a7, 0xbcab553742f7fd698182e76a0e2c30, 0x004f6b ] } , - BigNum { limbs: [ 0x47b2f144954b140bbd1890bb6705e7, 0xff7adae82fa6558f5be8e50b86a696, 0x001707 ] } , - BigNum { limbs: [ 0x75f111bb6910eaf442e76e4498fa1a, 0xa7d84eb54da1ddaa7c1f2496515ebd, 0x005ce5 ] } , - BigNum { limbs: [ 0xe680f5dafc6153a131aa10fd632e00, 0x134c2edfd8640e2f577d0ff387b8a5, 0x005ff3 ] } , - BigNum { limbs: [ 0xd7230d2501faab5ece55ee029cd201, 0x9406fabda4e4250a808af9ae504cad, 0x0013fa ] } , - BigNum { limbs: [ 0x52d122bd538957e4cb00352c21f113, 0x6b967a02c84b89d12a87006d579ea1, 0x0027d8 ] } , - BigNum { limbs: [ 0x6ad2e042aad2a71b34ffc9d3de0eee, 0x3bbcaf9ab4fca968ad8109348066b2, 0x004c15 ] } , - BigNum { limbs: [ 0x6069bbc672bcd63fc6e7f37a5b26a1, 0x12f82c0988ef81ca254da703f317b7, 0x002c4a ] } , - BigNum { limbs: [ 0x5d3a47398b9f28c039180b85a4d960, 0x945afd93f458b16fb2ba629de4ed9c, 0x0047a3 ] } , - BigNum { limbs: [ 0x550d70148336689facaa64d3610ad5, 0x07745a6b893c3d980cdab38ca1760a, 0x0002f8 ] } , - BigNum { limbs: [ 0x689692eb7b25966053559a2c9ef52c, 0x9fdecf31f40bf5a1cb2d5615368f49, 0x0070f5 ] } , - BigNum { limbs: [ 0xca0410a1c9a10a62c107092a653563, 0x89b5205c01ad36eb0ad3b74e021dec, 0x002aa8 ] } , - BigNum { limbs: [ 0xf39ff25e34baf49d3ef8f5d59aca9e, 0x1d9e09417b9afc4ecd345253d5e766, 0x004945 ] } , - BigNum { limbs: [ 0x0607c9bc523c31742ddf5eef4d4eaa, 0x891e1db52597a9c0b4d6e6ac40094a, 0x00155d ] } , - BigNum { limbs: [ 0xb79c3943ac1fcd8bd220a010b2b157, 0x1e350be857b08979233122f597fc09, 0x005e90 ] } , - BigNum { limbs: [ 0xdadda702f99ca6235747e7245ca8f3, 0x989c317709ce3761dca398879864ee, 0x0067f5 ] } , - BigNum { limbs: [ 0xe2c65bfd04bf58dca8b817dba3570e, 0x0eb6f8267379fbd7fb64711a3fa064, 0x000bf8 ] } , - BigNum { limbs: [ 0x26cb392f9cd37aa223717637b2a39a, 0x7bac12ba0cc14923b1de5d054ff5cd, 0x0008ac ] } , - BigNum { limbs: [ 0x96d8c9d06188845ddc8e88c84d5c67, 0x2ba716e37086ea162629ac9c880f86, 0x006b41 ] } , - BigNum { limbs: [ 0xcc5d3b6c2f14c021e5adbdd7b45b67, 0xa957448e60fb4ed489c94adbeee64a, 0x004438 ] } , - BigNum { limbs: [ 0xf146c793cf473ede1a5241284ba49a, 0xfdfbe50f1c4ce4654e3ebec5e91f08, 0x002fb4 ] } , - BigNum { limbs: [ 0xbd422a206f6b6a21a0019cde8aa342, 0x4dfd3ba86f2050548384249ecf71c4, 0x00178c ] } , - BigNum { limbs: [ 0x0061d8df8ef094de5ffe6221755cbf, 0x5955edf50e27e2e55483e50308938f, 0x005c61 ] } , - BigNum { limbs: [ 0xcc4b7382a961c6042cdc510b610c75, 0x371b67e5b1e369b3acd7001093f4a1, 0x00431e ] } , - BigNum { limbs: [ 0xf1588f7d54fa38fbd323adf49ef38c, 0x7037c1b7cb64c9862b3109914410b1, 0x0030cf ] } , - BigNum { limbs: [ 0x6fd201e8f5cc40a3afe5b2094fc128, 0xfe671be7bb3770be381d1d554a5b40, 0x0018bf ] } , - BigNum { limbs: [ 0x4dd20117088fbe5c501a4cf6b03ed9, 0xa8ec0db5c210c27b9feaec4c8daa13, 0x005b2d ] } , - BigNum { limbs: [ 0xf025db383b07030c5949b99fe0cf18, 0x293af972bc06e684d71edb9b48c8fb, 0x005514 ] } , - BigNum { limbs: [ 0xcd7e27c7c354fbf3a6b645601f30e9, 0x7e18302ac1414cb500e92e068f3c57, 0x001ed9 ] } , - BigNum { limbs: [ 0x3562ca05a2228a61650d680b8a6595, 0x9add509bfeb324c70882829c954881, 0x003f8f ] } , - BigNum { limbs: [ 0x884138fa5c39749e9af296f4759a6c, 0x0c75d9017e950e72cf85870542bcd2, 0x00345e ] } , - BigNum { limbs: [ 0x6b3c313aa95aee82f6451c0ffd9e4b, 0x6d8766a0943a502e6324c3508a3d5d, 0x001de8 ] } , - BigNum { limbs: [ 0x5267d1c55501107d09bae2f00261b6, 0x39cbc2fce90de30b74e346514dc7f6, 0x005605 ] } , - BigNum { limbs: [ 0x654ce80fe96082a1e43aaa7b821ea8, 0xf72b923064c0be698f7263e18fd0b9, 0x002cc7 ] } , - BigNum { limbs: [ 0x58571af014fb7c5e1bc554847de159, 0xb027976d188774d04895a5c048349a, 0x004725 ] } , - BigNum { limbs: [ 0x54ae98f2436032489a67c9866dd8ad, 0xe4d12bf37061256021f248c7908c5b, 0x005e75 ] } , - BigNum { limbs: [ 0x68f56a0dbafbccb765983579922754, 0xc281fdaa0ce70dd9b615c0da4778f8, 0x001577 ] } , - BigNum { limbs: [ 0x8497fcc49d0aa40b429d38e35259ba, 0x99a26cd1eb74403a1340a2d6a1bb64, 0x003475 ] } , - BigNum { limbs: [ 0x390c063b61515af4bd62c61cada647, 0x0db0bccb91d3f2ffc4c766cb3649ef, 0x003f78 ] } , - BigNum { limbs: [ 0x3be6ce0d94c6fa2af3b166edf32104, 0xdd86f64b2b584cdc6ccbf204e89982, 0x00386c ] } , - BigNum { limbs: [ 0x81bd34f2699504d50c4e98120cdefd, 0xc9cc335251efe65d6b3c179cef6bd1, 0x003b80 ] } , - BigNum { limbs: [ 0xfe230845799344541d2d22e8741f95, 0xb81eac8a6b93f11de21f95fdc20639, 0x0019a3 ] } , - BigNum { limbs: [ 0xbf80faba84c8baabe2d2dc178be06c, 0xef347d1311b4421bf5e873a415ff19, 0x005a49 ] } , - BigNum { limbs: [ 0xfe8d642079b117e2b984147df9fa0c, 0x54602f81f7daddb4495985ce8faabc, 0x00268a ] } , - BigNum { limbs: [ 0xbf169edf84aae71d467bea820605f5, 0x52f2fa1b856d55858eae83d3485a96, 0x004d63 ] } , - BigNum { limbs: [ 0xac10045770c08b8c60ff7cd1cb44b7, 0x548cbf1cc89059674f9cea35a7984c, 0x002455 ] } , - BigNum { limbs: [ 0x1193fea88d9b73739f00822e34bb4a, 0x52c66a80b4b7d9d2886b1f6c306d07, 0x004f98 ] } , - BigNum { limbs: [ 0x3682e1dd8e09eea1bf6608e5f02061, 0x4966d963f03feefe5024fc878e21d5, 0x007052 ] } , - BigNum { limbs: [ 0x872121227052105e4099f61a0fdfa0, 0x5dec50398d08443b87e30d1a49e37e, 0x00039b ] } , - BigNum { limbs: [ 0x2e052cb748d5c0c04adf434b4e09ff, 0xf2bbe685dbe29aa1cac699a261938d, 0x00218a ] } , - BigNum { limbs: [ 0x8f9ed648b5863e3fb520bbb4b1f602, 0xb4974317a16598980d416fff7671c6, 0x005262 ] } , - BigNum { limbs: [ 0x6d28a175fac82773be83cb00213581, 0x05a1a5d4698d5ee9e090bc999a0261, 0x002710 ] } , - BigNum { limbs: [ 0x507b618a0393d78c417c33ffdeca80, 0xa1b183c913bad44ff7774d083e02f2, 0x004cdd ] } , - BigNum { limbs: [ 0xc71ad10f1cb57ed38797c866a2d324, 0x5a3fce4392a5b6641cef26ddbb1e10, 0x00543a ] } , - BigNum { limbs: [ 0xf68931f0e1a6802c786836995d2cdd, 0x4d135b59eaa27cd5bb18e2c41ce742, 0x001fb3 ] } , - BigNum { limbs: [ 0x3b0e7eef22839ee457f3a8335b7c95, 0x7dc08530f7efe3a32515bfe9049360, 0x000a3e ] } , - BigNum { limbs: [ 0x82958410dbd8601ba80c56cca4836c, 0x2992a46c85584f96b2f249b8d371f3, 0x0069af ] } , - BigNum { limbs: [ 0x010d11ad78e67deb7dbe225750689c, 0xc1ce8fe57512b096e947760ffd71d2, 0x001478 ] } , - BigNum { limbs: [ 0xbc96f152857581148241dca8af9765, 0xe58499b8083582a2eec09391da9381, 0x005f74 ] } , - BigNum { limbs: [ 0x0d7b400461dcb7a69e3537d4ebbcf1, 0xf8671d4058336373dcdb72a544f8c7, 0x000aab ] } , - BigNum { limbs: [ 0xb028c2fb9c7f475961cac72b144310, 0xaeec0c5d2514cfc5fb2c96fc930c8c, 0x006941 ] } , - BigNum { limbs: [ 0xbcb5780f8ed96932b18098666562a4, 0xbd71f2c2ea600d38d4f3d4ea6f549f, 0x004256 ] } , - BigNum { limbs: [ 0x00ee8af06f8295cd4e7f66999a9d5d, 0xe9e136da92e82601031434b768b0b4, 0x003196 ] } , - BigNum { limbs: [ 0x38d17454846f3841f49d74735570ea, 0x165fbd58c5a8755dc5938773609f0e, 0x0003ed ] } , - BigNum { limbs: [ 0x84d28eab79ecc6be0b628a8caa8f17, 0x90f36c44b79fbddc1274822e776645, 0x007000 ] } , - BigNum { limbs: [ 0xfcb916c626e0e9bc29f6173ab70b65, 0x3d073a9c55cdd85ea2235bfe4d4804, 0x005b5b ] } , - BigNum { limbs: [ 0xc0eaec39d77b1543d609e7c548f49c, 0x6a4bef01277a5adb35e4ada38abd4e, 0x001892 ] } , - BigNum { limbs: [ 0xc37b9a1dfaaf4193724cef26d4b27a, 0x9c2994f61e115e9f0991476ba4f346, 0x004ae3 ] } , - BigNum { limbs: [ 0xfa2868e203acbd6c8db30fd92b4d87, 0x0b2994a75f36d49ace76c23633120c, 0x00290a ] } , - BigNum { limbs: [ 0x377a276c1c5329c1018e5e8284261e, 0xd80ac1ce9fe1755c33da05a269c910, 0x0053fd ] } , - BigNum { limbs: [ 0x8629db93e208d53efe71a07d7bd9e3, 0xcf4867cedd66bddda42e03ff6e3c43, 0x001fef ] } , - BigNum { limbs: [ 0x45dc24dbfdb880c6163bc865dd8bfa, 0x904b30cf1672d3253aaf3beeedf700, 0x0032fe ] } , - BigNum { limbs: [ 0x77c7de2400a37e39e9c4369a227407, 0x1707f8ce66d560149d58cdb2ea0e53, 0x0040ef ] } , - BigNum { limbs: [ 0xba16207a4ed9735b36b24c6dd788a9, 0x460aee018137df4643f06e17e34196, 0x001af7 ] } , - BigNum { limbs: [ 0x038de285af828ba4c94db292287758, 0x61483b9bfc1053f394179b89f4c3bd, 0x0058f6 ] } , - BigNum { limbs: [ 0x5051b124a48d44acceb7bbce4cc395, 0x49a9f4f29b3a002bc0adb6fdc0f664, 0x006fcb ] } , - BigNum { limbs: [ 0x6d5251db59ceba5331484331b33c6c, 0x5da934aae20e330e175a52a4170eef, 0x000422 ] } , - BigNum { limbs: [ 0xdce6f23222f777c94bdd9d3ac706d2, 0x815b057415a7e25cd2e9271b27153d, 0x000455 ] } , - BigNum { limbs: [ 0xe0bd10cddb648736b42261c538f92f, 0x25f8242967a050dd051ee286b0f015, 0x006f98 ] } , - BigNum { limbs: [ 0x66373acc16d886ceddaf21e77fc517, 0xa9919ec5166a85cf008f30e27fbec0, 0x0010b0 ] } , - BigNum { limbs: [ 0x576cc833e78378312250dd18803aea, 0xfdc18ad866ddad6ad778d8bf584693, 0x00633c ] } , - BigNum { limbs: [ 0xcf5dfbcdebe183e6e206d7bdffab49, 0x14f3cf6874649b5de195f3b709f16f, 0x000d09 ] } , - BigNum { limbs: [ 0xee460732127a7b191df927420054b8, 0x925f5a3508e397dbf67215eace13e3, 0x0066e4 ] } , - BigNum { limbs: [ 0x620e2e04af3cb774d607ae86c135cd, 0x379a5ac72106a7f3d9eeeea2803ed8, 0x002032 ] } , - BigNum { limbs: [ 0x5b95d4fb4f1f478b29f850793eca34, 0x6fb8ced65c418b45fe191aff57c67b, 0x0053bb ] } , - BigNum { limbs: [ 0xbe8983b787f09a3fda16b703ae79d7, 0xc42675dd613b3489b26bb21f6c258f, 0x0056da ] } , - BigNum { limbs: [ 0xff1a7f48766b64c025e947fc51862a, 0xe32cb3c01c0cfeb0259c57826bdfc3, 0x001d12 ] } , - BigNum { limbs: [ 0x4e939154c03c580acc2b5ef5216f61, 0x9334769b3974daaf8d6debc056151e, 0x001ead ] } , - BigNum { limbs: [ 0x6f1071ab3e1fa6f533d4a00ade90a0, 0x141eb30243d3588a4a9a1de181f035, 0x005540 ] } , - BigNum { limbs: [ 0x6b31e32115dd92996c19a5568c67f4, 0x5347f1132f4d1e57fcce6b05f90380, 0x0036c7 ] } , - BigNum { limbs: [ 0x52721fdee87e6c6693e659a973980d, 0x540b388a4dfb14e1db399e9bdf01d3, 0x003d26 ] } , - BigNum { limbs: [ 0xf2bdccb70a6ef709cbca5b7a65aab2, 0xbd04f7f6b469d3ddff14a41bbd9dd2, 0x0036f1 ] } , - BigNum { limbs: [ 0xcae63648f3ed07f63435a3859a554f, 0xea4e31a6c8de5f5bd8f365861a6780, 0x003cfb ] } , - BigNum { limbs: [ 0x66f13b1ab5685cd8cdc7146b807204, 0x9469afda287a4012a1a3ae0c60acc9, 0x004fd2 ] } , - BigNum { limbs: [ 0x56b2c7e548f3a2273238ea947f8dfd, 0x12e979c354cdf32736645b9577588a, 0x00241b ] } , - BigNum { limbs: [ 0x7853b66b61d5200372e53f548f8ce3, 0x87ce2ad498442d5e019288a337976e, 0x003b03 ] } , - BigNum { limbs: [ 0x45504c949c86defc8d1abfab70731e, 0x1f84fec8e50405dbd67580fea06de5, 0x0038ea ] } , - BigNum { limbs: [ 0x70bff3af461bc0ca31c421a753efa0, 0xa63dfd84ffaec090ac87917778335b, 0x0056b5 ] } , - BigNum { limbs: [ 0x4ce40f50b8403e35ce3bdd58ac1061, 0x01152c187d9972a92b80782a5fd1f8, 0x001d38 ] } , - BigNum { limbs: [ 0xc5373ec9c8343b1e4ca4d8ce229e36, 0x5d229a04387d9c5d5a214d0488f0ef, 0x00455e ] } , - BigNum { limbs: [ 0xf86cc4363627c3e1b35b2631dd61cb, 0x4a308f9944ca96dc7de6bc9d4f1463, 0x002e8f ] } , - BigNum { limbs: [ 0x5dcdee102c3ba87f2f48f3eb5d88d3, 0xa72bf8109fde405a5c49fdd0824580, 0x0013de ] } , - BigNum { limbs: [ 0x5fd614efd2205680d0b70b14a2772e, 0x0027318cdd69f2df7bbe0bd155bfd3, 0x00600f ] } , - BigNum { limbs: [ 0xd2826073fe1c3d9541142e4bebfa33, 0x8b9ab81f31622738fb770b6f7db0fd, 0x006321 ] } , - BigNum { limbs: [ 0xeb21a28c003fc16abeebd0b41405ce, 0x1bb8717e4be60c00dc90fe325a5455, 0x0010cc ] } , - BigNum { limbs: [ 0x2655a4f2a71153bc164249c8f6ae4c, 0xed9f7c0b36665bc1b21db066728eec, 0x00230a ] } , - BigNum { limbs: [ 0x974e5e0d574aab43e9bdb5370951b5, 0xb9b3ad9246e1d77825ea593b657667, 0x0050e2 ] } , - BigNum { limbs: [ 0x47c28ba9fd6add445358152fe9e30e, 0x4d75bff8bc844cda745819c6a69193, 0x000182 ] } , - BigNum { limbs: [ 0x75e1775600f121bbaca7e9d0161cf3, 0x59dd69a4c0c3e65f63afefdb3173c0, 0x00726b ] } , - BigNum { limbs: [ 0xeccbd814da06896454b1247b57539e, 0xde70f6f89e7b9b7862421542c6ade1, 0x002cc2 ] } , - BigNum { limbs: [ 0xd0d82aeb2455759bab4eda84a8ac63, 0xc8e232a4decc97c175c5f45f115771, 0x00472a ] } , - BigNum { limbs: [ 0x94d9614b087f3c1980045ae4b78723, 0xd97a1ce103e07e6e65b246bd533015, 0x0044dd ] } , - BigNum { limbs: [ 0x28caa1b4f5dcc2e67ffba41b4878de, 0xcdd90cbc7967b4cb7255c2e484d53e, 0x002f0f ] } , - BigNum { limbs: [ 0x51fbc98b29ffba9c5a4354bbba58aa, 0x3cb2c5f57ea5b26b1d49f27a08e557, 0x003f3d ] } , - BigNum { limbs: [ 0x6ba83974d45c4463a5bcaa4445a757, 0x6aa063a7fea280cebabe1727cf1ffc, 0x0034b0 ] } , - BigNum { limbs: [ 0x61db1d1b9c0b08cb773551758ecaa4, 0xe37eb8a506acf1f91c7b55db3a8be4, 0x00593a ] } , - BigNum { limbs: [ 0x5bc8e5e46250f63488caad8a71355d, 0xc3d470f8769b4140bb8cb3c69d796f, 0x001ab2 ] } , - BigNum { limbs: [ 0x444d8a302c8da96e37bfb94751e58e, 0x6690ae243ef976f6b24227dd5cb253, 0x005ec0 ] } , - BigNum { limbs: [ 0x795678cfd1ce5591c84045b8ae1a73, 0x40c27b793e4ebc4325c5e1c47b5300, 0x00152d ] } , - BigNum { limbs: [ 0x3dfdc600984107cda32780a77f8f5f, 0xa1529986e0edb5dd9e2d3dd12687a9, 0x002eb2 ] } , - BigNum { limbs: [ 0x7fa63cff661af7325cd87e588070a2, 0x060090169c5a7d5c39dacbd0b17daa, 0x00453b ] } , - BigNum { limbs: [ 0x2489344a456b47cae21e3bd7150af7, 0xea05243f47f6f7db687fb68d902acb, 0x005750 ] } , - BigNum { limbs: [ 0x991aceb5b8f0b7351de1c328eaf50a, 0xbd4e055e35513b5e6f88531447da88, 0x001c9c ] } , - BigNum { limbs: [ 0xca05a65a819a818d65f283960c64f6, 0xfcc67803f85a9d91f530887530a761, 0x004c36 ] } , - BigNum { limbs: [ 0xf39e5ca57cc17d729a0d7b69f39b0b, 0xaa8cb19984ed95a7e2d7812ca75df1, 0x0027b6 ] } , - BigNum { limbs: [ 0x5c3a002f47ebc42d07692bea45f396, 0xa5fa42eabba5613a5c9f9b3231c3b6, 0x007192 ] } , - BigNum { limbs: [ 0x616a02d0b6703ad2f896d315ba0c6b, 0x0158e6b2c1a2d1ff7b686e6fa6419d, 0x00025b ] } , - BigNum { limbs: [ 0xeceaad029bec7ce943f9b1660bb1a9, 0x59ff4eddaac6fee6711ca11606eba0, 0x001658 ] } , - BigNum { limbs: [ 0xd0b955fd626f8216bc064d99f44e58, 0x4d53dabfd281345366eb688bd119b2, 0x005d95 ] } , - BigNum { limbs: [ 0x218f1dd4394b56b4953e423b9c04e0, 0x87019792e16ae4979dbd6023b97478, 0x004970 ] } , - BigNum { limbs: [ 0x9c14e52bc510a84b6ac1bcc463fb21, 0x2051920a9bdd4ea23a4aa97e1e90db, 0x002a7d ] } , - BigNum { limbs: [ 0x37f73343b719ecede15ecd60b3df65, 0x624c06087cb6ad30ccd8f447ed080a, 0x0059ba ] } , - BigNum { limbs: [ 0x85accfbc474212121ea1319f4c209c, 0x45072395009186090b2f1559eafd49, 0x001a33 ] } , - BigNum { limbs: [ 0x467cc6e972110032c5ece8b055e8a9, 0x62d2f2b315a015393dcc435c95bf3a, 0x000274 ] } , - BigNum { limbs: [ 0x77273c168c4afecd3a13164faa1758, 0x448036ea67a81e009a3bc645424619, 0x007179 ] } , - BigNum { limbs: [ 0xc2941dbdeb3eff86bbc2821a7c954d, 0x4e5fe188f49e4f87f802ec2872f93e, 0x0043c8 ] } , - BigNum { limbs: [ 0xfb0fe542131cff79443d7ce5836ab4, 0x58f3481488a9e3b1e0051d79650c14, 0x003025 ] } , - BigNum { limbs: [ 0x5315b31507ceb8d2aa93f770b9c8e1, 0x9106ee3a43fd12880e5eefdbae2ab6, 0x004b9b ] } , - BigNum { limbs: [ 0x6a8e4feaf68d462d556c078f463720, 0x164c3b63394b20b1c9a919c629da9d, 0x002852 ] } , - BigNum { limbs: [ 0xcbd2211181fe944077e77ff3104df5, 0xaa51988e575837557c3b5ebdfea8e8, 0x0060c6 ] } , - BigNum { limbs: [ 0xf1d1e1ee7c5d6abf88187f0cefb20c, 0xfd01910f25effbe45bccaae3d95c6a, 0x001326 ] } , - BigNum { limbs: [ 0xe7ea60eb7cbec10bffa78086fdf997, 0xf61c4bca67ebd5e3fdd1c6dc2cea86, 0x005f7c ] } , - BigNum { limbs: [ 0xd5b9a214819d3df400587e7902066a, 0xb136ddd3155c5d55da3642c5ab1acc, 0x001470 ] } , - BigNum { limbs: [ 0xade32f51e3b92db7b324b4eaa555a9, 0xf91f5315f9552e1b95e6b724cde4ee, 0x0008b5 ] } , - BigNum { limbs: [ 0x0fc0d3ae1aa2d1484cdb4a155aaa58, 0xae33d68783f3051e4221527d0a2065, 0x006b37 ] } , - BigNum { limbs: [ 0xf8a4660d27320008b429fd878ffa9e, 0x7d7b53ab5425e3b013ebe22d4afdb4, 0x003702 ] } , - BigNum { limbs: [ 0xc4ff9cf2d729fef74bd60178700563, 0x29d7d5f229224f89c41c27748d079e, 0x003ceb ] } , - BigNum { limbs: [ 0xd3a1081b7dc34879cad7e40b802754, 0xb1694de1defdc9b305be4031baafd7, 0x004d4c ] } , - BigNum { limbs: [ 0xea02fae48098b68635281af47fd8ad, 0xf5e9dbbb9e4a6986d249c9701d557b, 0x0026a0 ] } , - BigNum { limbs: [ 0xbb4de382da6cec9b679276f6e92cd5, 0x81b1b3b9f48d763ed728d201436845, 0x004de2 ] } , - BigNum { limbs: [ 0x02561f7d23ef1264986d880916d32c, 0x25a175e388babcfb00df37a0949d0e, 0x00260b ] } , - BigNum { limbs: [ 0xfea794c0e0d6b46940f19dbc185b43, 0xe9cede62c18b938f1b083fb184c56e, 0x000168 ] } , - BigNum { limbs: [ 0xbefc6e3f1d854a96bf0e6143e7a4be, 0xbd844b3abbbc9faabcffc9f0533fe4, 0x007284 ] } , - BigNum { limbs: [ 0xadf465bebef8ccebfad58878130b3d, 0xc395d5f911b303cec6f905265aae1a, 0x00446a ] } , - BigNum { limbs: [ 0x0faf9d413f633214052a7687ecf4c4, 0xe3bd53a46b952f6b110f047b7d5739, 0x002f82 ] } , - BigNum { limbs: [ 0x9f1ddab1d4fa82932aebc0965a4202, 0xf36fa2b47ddb5a73c6e65398047a50, 0x000364 ] } , - BigNum { limbs: [ 0x1e86284e29617c6cd5143e69a5bdff, 0xb3e386e8ff6cd8c61121b609d38b03, 0x007088 ] } , - BigNum { limbs: [ 0xc769faa4402f293c314964fd4408c9, 0x849c98537bacc5b2f69cad1dade64b, 0x00177b ] } , - BigNum { limbs: [ 0xf63a085bbe2cd5c3ceb69a02bbf738, 0x22b6914a019b6d86e16b5c842a1f07, 0x005c72 ] } , - BigNum { limbs: [ 0x79365f811d5769926a3c0cfe4005c3, 0x79a31835c7e2ccb2e5196d0deb2ba5, 0x003864 ] } , - BigNum { limbs: [ 0x446da37ee104956d95c3f201bffa3e, 0x2db01167b5656686f2ee9c93ecd9ae, 0x003b89 ] } , - BigNum { limbs: [ 0x6df44639124f2ba81be6d8edda7638, 0x668413c019df4374af12eabf982893, 0x006f87 ] } , - BigNum { limbs: [ 0x4fafbcc6ec0cd357e41926122589c9, 0x40cf15dd6368efc528f51ee23fdcc0, 0x000466 ] } , - BigNum { limbs: [ 0x43a907c09f060427d329827aa98fff, 0xb856c1b52cf9492d043c2e74cf231b, 0x00354b ] } , - BigNum { limbs: [ 0x79fafb3f5f55fad82cd67c85567002, 0xeefc67e8504eea0cd3cbdb2d08e238, 0x003ea1 ] } , - BigNum { limbs: [ 0xb9bf92bae7e7fe896a2d7f2d01187c, 0x0f53d6c54c0941a9861e5c72b0d523, 0x000277 ] } , - BigNum { limbs: [ 0x03e470451674007695d27fd2fee785, 0x97ff52d8313ef19051e9ad2f273030, 0x007176 ] } , - BigNum { limbs: [ 0x1b0da0ac3997d798ff94a498f96017, 0x732533ddaf1a10b0beb4fee8a1769d, 0x006801 ] } , - BigNum { limbs: [ 0xa2966253c4c42767006b5a67069fea, 0x342df5bfce2e228919530ab9368eb6, 0x000bec ] } , - BigNum { limbs: [ 0x26c30fdbf9ba3500c4ee9032afcc94, 0x105c8329a6955caccf15dda0d8ad03, 0x002fff ] } , - BigNum { limbs: [ 0x96e0f32404a1c9ff3b116ecd50336d, 0x96f6a673d6b2d68d08f22c00ff5850, 0x0043ee ] } , - BigNum { limbs: [ 0x236a92397b76349a0f0a5f9fbb73b7, 0x6e8046dfa7d7b0dba6fd299e303d1d, 0x000cc2 ] } , - BigNum { limbs: [ 0x9a3970c682e5ca65f0f59f60448c4a, 0x38d2e2bdd570825e310ae003a7c836, 0x00672b ] } , - BigNum { limbs: [ 0x3b84c03955634d9dafd3593bc10665, 0x7aa88f051d3d6e47e7481dbd70b738, 0x004f3a ] } , - BigNum { limbs: [ 0x821f42c6a8f8b162502ca5c43ef99c, 0x2caa9a98600ac4f1f0bfebe4674e1b, 0x0024b3 ] } , - BigNum { limbs: [ 0x0a98ca924c9853cdf99d946705e265, 0xb82069c37ab55ff8776e9d4b000112, 0x002b67 ] } , - BigNum { limbs: [ 0xb30b386db1c3ab3206626a98fa1d9c, 0xef32bfda0292d34160996c56d80441, 0x004885 ] } , - BigNum { limbs: [ 0x50631ef088678db03b789302413b7c, 0xcd6afbf40e773e053844b1d7c4c0ec, 0x00455e ] } , - BigNum { limbs: [ 0x6d40e40f75f4714fc4876bfdbec485, 0xd9e82da96ed0f5349fc357ca134467, 0x002e8e ] } , - BigNum { limbs: [ 0x1279da43e3f45b1ede5de981ebf8f8, 0xce9f04a28d115ecc4f16874611b142, 0x000db4 ] } , - BigNum { limbs: [ 0xab2a28bc1a67a3e121a2157e140709, 0xd8b424faf036d46d88f1825bc65411, 0x006638 ] } , - BigNum { limbs: [ 0x91e47e376c2e5b6ff7d691b3198b23, 0xe821190696fc5d6ecc9a8405e05629, 0x005133 ] } , - BigNum { limbs: [ 0x2bbf84c8922da39008296d4ce674de, 0xbf321096e64bd5cb0b6d859bf7af2a, 0x0022b9 ] } , - BigNum { limbs: [ 0xc528e11bb8f362bbb3efec893f294f, 0x10302a2f39be6d2099caa9324c56d8, 0x005679 ] } , - BigNum { limbs: [ 0xf87b21e445689c444c101276c0d6b2, 0x9722ff6e4389c6193e3d606f8bae7a, 0x001d74 ] } , - BigNum { limbs: [ 0xd83c84ed265e50977e9c4587dfe508, 0x739e84003bec789aed56b517a468ea, 0x000076 ] } , - BigNum { limbs: [ 0xe5677e12d7fdae688163b978201af9, 0x33b4a59d415bba9eeab1548a339c68, 0x007377 ] } , - BigNum { limbs: [ 0x235c660dcd47d87bf14d05ce8047ea, 0xef848d536f6afc0071a614f0a4770c, 0x00643c ] } , - BigNum { limbs: [ 0x9a479cf2311426840eb2f9317fb817, 0xb7ce9c4a0ddd37396661f4b1338e47, 0x000fb0 ] } , - BigNum { limbs: [ 0x7f1ed0313f9e0fe150bea48f8d1dea, 0xe117dc9238c29fb9c14a0e4d763a00, 0x0024c9 ] } , - BigNum { limbs: [ 0x3e8532cebebdef1eaf415a7072e217, 0xc63b4d0b4485938016bdfb5461cb53, 0x004f23 ] } , - BigNum { limbs: [ 0x81791f3a6308454c51bb17349f0783, 0xe041d03cc117b367e019a720931783, 0x001d2d ] } , - BigNum { limbs: [ 0x3c2ae3c59b53b9b3ae44e7cb60f87e, 0xc7115960bc307fd1f7ee628144edd0, 0x0056bf ] } , - BigNum { limbs: [ 0xc3ba13d252c0e88f18500f83965a8e, 0x641539037f771f1b83b02e67527a4d, 0x0055b6 ] } , - BigNum { limbs: [ 0xf9e9ef2dab9b1670e7afef7c69a573, 0x433df099fdd1141e5457db3a858b05, 0x001e37 ] } , - BigNum { limbs: [ 0x5502a77ae6332fa6600254a7d754be, 0x4cdc36f88410f5d7bfef36de3b7834, 0x00027e ] } , - BigNum { limbs: [ 0x68a15b851828cf599ffdaa5828ab43, 0x5a76f2a4f9373d621818d2c39c8d1f, 0x00716f ] } , - BigNum { limbs: [ 0x8d41cd7ab1753ea7303c63152c1640, 0x4a2297423679aee4b37190faa6c7d5, 0x004f91 ] } , - BigNum { limbs: [ 0x306235854ce6c058cfc39bead3e9c1, 0x5d30925b46ce8455249678a7313d7e, 0x00245c ] } , - BigNum { limbs: [ 0x87cba345c1658b64271241619da532, 0x46ae7297a21a8f4310cd2220399c88, 0x0037d2 ] } , - BigNum { limbs: [ 0x35d85fba3cf6739bd8edbd9e625acf, 0x60a4b705db2da3f6c73ae7819e68cb, 0x003c1b ] } , - BigNum { limbs: [ 0x2651d853c9eca95343e645167ee188, 0x1331dca429aad2f2eb5255c656c902, 0x00258b ] } , - BigNum { limbs: [ 0x97522aac346f55acbc19b9e9811e79, 0x94214cf9539d6046ecb5b3db813c51, 0x004e62 ] } , - BigNum { limbs: [ 0x5390d0e60bdfb3b93907b7592ea586, 0xe4164e07f2ab58063db3959fe0ef23, 0x003596 ] } , - BigNum { limbs: [ 0x6a133219f27c4b46c6f847a6d15a7b, 0xc33cdb958a9cdb339a547401f71630, 0x003e56 ] } , - BigNum { limbs: [ 0xb8b209e98b7e0f2fa61198c7de7bd4, 0x75e0a5e4145fb34bad5f4e9cfdb6f3, 0x003811 ] } , - BigNum { limbs: [ 0x04f1f91672ddefd059ee663821842d, 0x317283b968e87fee2aa8bb04da4e60, 0x003bdc ] } , - BigNum { limbs: [ 0x6e76cf4f775ba9242cce972bd82d65, 0x812b15a0625c3583f1f0c36ae9d2f5, 0x0011d0 ] } , - BigNum { limbs: [ 0x4f2d33b0870055dbd33167d427d29c, 0x262813fd1aebfdb5e6174636ee325e, 0x00621d ] } , - BigNum { limbs: [ 0x7524de9c02b81cf5045a21462659cf, 0x5fa6f3c3db8efc130759d8cd8c1f9d, 0x0017bf ] } , - BigNum { limbs: [ 0x487f2463fba3e20afba5ddb9d9a632, 0x47ac35d9a1b93726d0ae30d44be5b6, 0x005c2e ] } , - BigNum { limbs: [ 0x66175e422e5e04509c353c559ce0e4, 0xc2a34bbcc1de81c01f6a38e43c7150, 0x0028ff ] } , - BigNum { limbs: [ 0x578ca4bdcffdfaaf63cac2aa631f1d, 0xe4afdde0bb69b179b89dd0bd9b9403, 0x004aed ] } , - BigNum { limbs: [ 0xc17fed2efa16c0bf255236c073301f, 0x95c68591a521990ffbee982e626b47, 0x00713f ] } , - BigNum { limbs: [ 0xfc2415d104453e40daadc83f8ccfe2, 0x118ca40bd8269a29dc197173759a0b, 0x0002ae ] } , - BigNum { limbs: [ 0x37692cb91745a591e0a5ec1dbb4517, 0x2b1236ce1f78bd6f986d418b46797f, 0x006418 ] } , - BigNum { limbs: [ 0x863ad646e716596e1f5a12e244baea, 0x7c40f2cf5dcf75ca3f9ac816918bd4, 0x000fd5 ] } , - BigNum { limbs: [ 0x743adadff7878293e97ac2c7bf5f23, 0x47fe2645c3ccca5cf55c4cee43e80b, 0x005d20 ] } , - BigNum { limbs: [ 0x4969282006d47c6c16853c3840a0de, 0x5f550357b97b68dce2abbcb3941d48, 0x0016cd ] } , - BigNum { limbs: [ 0x1f5b434515524094eb42b26bd7cec8, 0x5d84c1e11520848c1259d579deff61, 0x006ae4 ] } , - BigNum { limbs: [ 0x9e48bfbae909be6b14bd4c94283139, 0x49ce67bc6827aeadc5ae3427f905f2, 0x000909 ] } , - BigNum { limbs: [ 0x7a83f4b3620a8bc1ab543280174b65, 0x4fe4101d764247b839b40665b9ab31, 0x004d4e ] } , - BigNum { limbs: [ 0x43200e4c9c51733e54abcc7fe8b49c, 0x576f19800705eb819e54033c1e5a22, 0x00269f ] } , - BigNum { limbs: [ 0x16e6f88f393313659ed34f1ba7c758, 0x479f6d036dbe156e6d5f1cd1d95835, 0x004f05 ] } , - BigNum { limbs: [ 0xa6bd0a70c528eb9a612cafe45838a9, 0x5fb3bc9a0f8a1dcb6aa8eccffead1e, 0x0024e8 ] } , - BigNum { limbs: [ 0xb4744f8cf411c654449ec24eff1d4a, 0xae41472c7c0e590ce3fe74cee9cc36, 0x0061df ] } , - BigNum { limbs: [ 0x092fb3730a4a38abbb613cb100e2b7, 0xf911e2710139da2cf40994d2ee391d, 0x00120d ] } , - BigNum { limbs: [ 0x1b7ec3a436588065b8118cdf67b4c8, 0x457a8a468be812b6b2973fbcaa7c77, 0x003d49 ] } , - BigNum { limbs: [ 0xa2253f5bc8037e9a47ee7220984b39, 0x61d89f56f16020832570c9e52d88dc, 0x0036a4 ] } , - BigNum { limbs: [ 0x3412c9cd2a9b3731e9ab2413ce6403, 0x8dc1af53e39e07ae39bf50998fa407, 0x004686 ] } , - BigNum { limbs: [ 0x89913932d3c0c7ce1654daec319bfe, 0x19917a4999aa2b8b9e48b90848614c, 0x002d67 ] } , - BigNum { limbs: [ 0x89c1bd2dd357cf20f00f1e8819ff37, 0x2f0c9a6585b33115765c3d23d4949e, 0x003fb7 ] } , - BigNum { limbs: [ 0x33e245d22b042fdf0ff0e077e600ca, 0x78468f37f795022461abcc7e0370b5, 0x003436 ] } , - BigNum { limbs: [ 0xdd464b1c886d78042cef5c92e33195, 0x557b73b7e48b242355a680b717f586, 0x0025de ] } , - BigNum { limbs: [ 0xe05db7e375ee86fbd310a26d1cce6c, 0x51d7b5e598bd0f16826188eac00fcc, 0x004e0f ] } , - BigNum { limbs: [ 0xedf499ef3076be4475c4d42b7a4b38, 0x602954fc0ca6ba46042c3d326406d9, 0x0054de ] } , - BigNum { limbs: [ 0xcfaf6910cde540bb8a3b2ad485b4c9, 0x4729d4a170a178f3d3dbcc6f73fe79, 0x001f0f ] } , - BigNum { limbs: [ 0xfcd31b702dd686c47e6812cda15c19, 0xf2d45a69922bb0a0d0c53a6b502bef, 0x005861 ] } , - BigNum { limbs: [ 0xc0d0e78fd085783b8197ec325ea3e8, 0xb47ecf33eb1c82990742cf3687d963, 0x001b8b ] } , - BigNum { limbs: [ 0x8425612ae7e671237bffd304e4fe50, 0xf9f2176adc1d48e923008e61d9c58e, 0x004067 ] } , - BigNum { limbs: [ 0x397ea1d516758ddc84002bfb1b01b1, 0xad611232a12aea50b5077b3ffe3fc5, 0x003385 ] } , - BigNum { limbs: [ 0xba411117fb1be0bb14f4f365c1b600, 0x58bcb55478df34740bade3183ade28, 0x000335 ] } , - BigNum { limbs: [ 0x0362f1e803401e44eb0b0b9a3e4a01, 0x4e9674490468fec5cc5a26899d272b, 0x0070b8 ] } , - BigNum { limbs: [ 0x9fcc4cdb6f0c10a87049c0b5897879, 0x9424325317c08c97b1f14e6a7312cd, 0x006329 ] } , - BigNum { limbs: [ 0x1dd7b6248f4fee578fb63e4a768788, 0x132ef74a6587a6a22616bb3764f286, 0x0010c4 ] } , - BigNum { limbs: [ 0x9f899703062de0d3baa1acb4e5b0f5, 0x090a68110f9092a633fc64cef521ba, 0x0065eb ] } , - BigNum { limbs: [ 0x1e1a6bfcf82e1e2c455e524b1a4f0c, 0x9e48c18c6db7a093a40ba4d2e2e399, 0x000e02 ] } , - BigNum { limbs: [ 0xd96ff2cd8b2f2e472cb619daac4bd2, 0x0f2dbc497381f411d51f076e4466de, 0x00573a ] } , - BigNum { limbs: [ 0xe4341032732cd0b8d349e52553b42f, 0x98256d5409c63f2802e90233939e74, 0x001cb3 ] } , - BigNum { limbs: [ 0xb84c544876a9c789aa8cb2686396ce, 0xa3313c8414b9bdb48d3a72566086b0, 0x006dbc ] } , - BigNum { limbs: [ 0x0557aeb787b2377655734c979c6933, 0x0421ed19688e75854acd974b777ea3, 0x000631 ] } , - BigNum { limbs: [ 0xe7613894a9b5c86333defbe1eafec8, 0xecb3aff7822dc90fd38cadbdeab57e, 0x0051a0 ] } , - BigNum { limbs: [ 0xd642ca6b54a6369ccc21031e150139, 0xba9f79a5fb1a6a2a047b5be3ed4fd4, 0x00224c ] } , - BigNum { limbs: [ 0xbd99d6f7d72c9825c9330c166c32b6, 0x656984a80d04d77f485529026c165c, 0x0008f3 ] } , - BigNum { limbs: [ 0x000a2c08272f66da36ccf2e993cd4b, 0x41e9a4f570435bba8fb2e09f6beef7, 0x006afa ] } , - BigNum { limbs: [ 0x00ac7d231f0dcc77f716ad84ec3f4e, 0x66b749227bc79c2b526b533ce6736d, 0x001236 ] } , - BigNum { limbs: [ 0xbcf785dcdf4e328808e9517b13c0b3, 0x409be07b0180970e859cb664f191e6, 0x0061b7 ] } , - BigNum { limbs: [ 0x44df453062977b35a87e2790b1aa63, 0x70a52543032792c60337c3de194e28, 0x004ca4 ] } , - BigNum { limbs: [ 0x78c4bdcf9bc483ca5781d76f4e559e, 0x36ae045a7a20a073d4d045c3beb72b, 0x002749 ] } , - BigNum { limbs: [ 0x009c43f83b178b774638c79cf5dc1f, 0x3f6e8235ecae3905159358e0d38ebb, 0x0010c4 ] } , - BigNum { limbs: [ 0xbd07bf07c3447388b9c737630a23e2, 0x67e4a7679099fa34c274b0c1047698, 0x006329 ] } , - BigNum { limbs: [ 0x2a876351c2a2215759eb2f01eda387, 0xcb3d2bb78a0443275a5062c289ae5a, 0x0051ae ] } , - BigNum { limbs: [ 0x931c9fae3bb9dda8a614cffe125c7a, 0xdc15fde5f343f0127db7a6df4e56f9, 0x00223e ] } , - BigNum { limbs: [ 0xa8a3a7f2912453021ed75861bf15b2, 0xb5e368fea545ec1883b4b3c9abedbf, 0x0052cb ] } , - BigNum { limbs: [ 0x15005b0d6d37abfde128a69e40ea4f, 0xf16fc09ed8024721545355d82c1794, 0x002121 ] } , - BigNum { limbs: [ 0x99bf3cadf47500466419f0acda4132, 0x0fab03bda4f931faf27e04e17cf31b, 0x004831 ] } , - BigNum { limbs: [ 0x23e4c65209e6feb99be60e5325becf, 0x97a825dfd84f013ee58a04c05b1238, 0x002bbc ] } , - BigNum { limbs: [ 0x2af33beac6f68086ebdd53f2e05b8c, 0x18dfadf4968e6c38c06e52f5b19228, 0x003f52 ] } , - BigNum { limbs: [ 0x92b0c71537657e791422ab0d1fa475, 0x8e737ba8e6b9c7011799b6ac26732b, 0x00349b ] } , - BigNum { limbs: [ 0x532ae018561e10623432bc97e66621, 0x7d758178f8009d3d7a7ff033103d20, 0x003c40 ] } , - BigNum { limbs: [ 0x6a7922e7a83dee9dcbcd42681999e0, 0x29dda824854795fc5d88196ec7c833, 0x0037ad ] } , - BigNum { limbs: [ 0x5fdb8562ecaee38095506aaf2ed4e8, 0x40fa9e92971b3b44484802d2908ee1, 0x005327 ] } , - BigNum { limbs: [ 0x5dc87d9d11ad1b7f6aaf9450d12b19, 0x66588b0ae62cf7f58fc006cf477672, 0x0020c6 ] } , - BigNum { limbs: [ 0xc00587548157407cc2c1b551422388, 0x2433aacc79664fd54b05535ed75859, 0x0006c4 ] } , - BigNum { limbs: [ 0xfd9e7bab7d04be833d3e49aebddc79, 0x831f7ed103e1e3648d02b64300acf9, 0x006d29 ] } , - BigNum { limbs: [ 0xabf9af77e7e83655b9012175a8cc3b, 0xe87fd6b51c9c4226a334d73bebcb2b, 0x000b72 ] } , - BigNum { limbs: [ 0x11aa53881673c8aa46fedd8a5733c6, 0xbed352e860abf11334d33265ec3a28, 0x00687a ] } , - BigNum { limbs: [ 0x1fbcdb53444abbab0181bccc152b72, 0xedc455355287c6bf314728f7672064, 0x0068e3 ] } , - BigNum { limbs: [ 0x9de727acba114354fe7e4233ead48f, 0xb98ed4682ac06c7aa6c0e0aa70e4ef, 0x000b09 ] } , - BigNum { limbs: [ 0x5603226dcddca5147d1e72d2b5d06e, 0xc12baea83c091f5a39e548082c8807, 0x0064a3 ] } , - BigNum { limbs: [ 0x67a0e092307f59eb82e18c2d4a2f93, 0xe6277af5413f13df9e22c199ab7d4c, 0x000f49 ] } , - BigNum { limbs: [ 0x2ed8500386c76648c8e50cb39616ec, 0xef6739da92bc569aa8da7c3ebc2a85, 0x005a31 ] } , - BigNum { limbs: [ 0x8ecbb2fc779498b7371af24c69e915, 0xb7ebefc2ea8bdc9f2f2d8d631bdace, 0x0019bb ] } , - BigNum { limbs: [ 0xfe3a2e7b95c6469630cf3b08b533d4, 0x2a8f2e2a85919ad23e75d282b2d3b6, 0x006802 ] } , - BigNum { limbs: [ 0xbf69d4846895b869cf30c3f74acc2d, 0x7cc3fb72f7b698679992371f25319c, 0x000beb ] } , - BigNum { limbs: [ 0xcae90dfb3c0064c6123fa45fb28c2e, 0xd4cb52a34e3d7519670d09634336d4, 0x0023ce ] } , - BigNum { limbs: [ 0xf2baf504c25b9a39edc05aa04d73d3, 0xd287d6fa2f0abe2070fb003e94ce7e, 0x00501e ] } , - BigNum { limbs: [ 0x5ca0f385906331980144927341bf91, 0xe145a4a45855dd7ae283294477734f, 0x006964 ] } , - BigNum { limbs: [ 0x61030f7a6df8cd67febb6c8cbe4070, 0xc60d84f924f255bef584e05d609204, 0x000a88 ] } , - BigNum { limbs: [ 0xa47df0bc824e8ea22755dfe7bb9750, 0xfb32f90ffda0d607ced8ce69bc11a9, 0x0046cf ] } , - BigNum { limbs: [ 0x192612437c0d705dd8aa1f184468b1, 0xac20308d7fa75d32092f3b381bf3aa, 0x002d1d ] } , - BigNum { limbs: [ 0xec958cdc54a63cc7a96c1c03278845, 0x14461e4a1131fa3b366dda348f3893, 0x000791 ] } , - BigNum { limbs: [ 0xd10e7623a9b5c2385693e2fcd877bc, 0x930d0b536c1638fea19a2f6d48ccbf, 0x006c5c ] } , - BigNum { limbs: [ 0xb5abf8c3e544b7cec40dd9d4019abd, 0xe3e21a204627ca43fa39cf3715caad, 0x002b0f ] } , - BigNum { limbs: [ 0x07f80a3c191747313bf2252bfe6544, 0xc3710f7d372068f5ddce3a6ac23aa6, 0x0048dd ] } , - BigNum { limbs: [ 0x40722db5a2fdf30997af02bca933c9, 0x56c300383c82d6ab35ba4d5db3f1f7, 0x00688a ] } , - BigNum { limbs: [ 0x7d31d54a5b5e0bf66850fc4356cc38, 0x5090296540c55c8ea24dbc4424135c, 0x000b63 ] } , - BigNum { limbs: [ 0x564fcbc247d6d6ac9cc344a8cfff5a, 0xeb803c23772e9c6afb16ff55ea304f, 0x004b12 ] } , - BigNum { limbs: [ 0x6754373db6852853633cba573000a7, 0xbbd2ed7a061996cedcf10a4bedd504, 0x0028da ] } , - BigNum { limbs: [ 0xcdd1364d8cfacb93f88bc67b7b3721, 0x665f2b83a6deb7fdceb13345570e65, 0x0022a4 ] } , - BigNum { limbs: [ 0xefd2ccb27161336c0774388484c8e0, 0x40f3fe19d6697b3c0956d65c80f6ed, 0x005149 ] } , - BigNum { limbs: [ 0x0e9d35b6ed76adf7713ef284c069ff, 0xcf43948b469bcd431486dfe074f000, 0x002d69 ] } , - BigNum { limbs: [ 0xaf06cd4910e551088ec10c7b3f9602, 0xd80f951236ac65f6c38129c1631553, 0x004683 ] } , - BigNum { limbs: [ 0x67d80e0380c9dd297e9abd55f848ed, 0x70bfd3999432941131a1638c47aaf6, 0x002ffb ] } , - BigNum { limbs: [ 0x55cbf4fc7d9221d6816541aa07b714, 0x36935603e9159f28a666a615905a5d, 0x0043f2 ] } , - BigNum { limbs: [ 0x8032cefe4d368500c64cd40384f439, 0xe7910a9571c7e580abd9bdea663091, 0x001d7f ] } , - BigNum { limbs: [ 0x3d713401b12579ff39b32afc7b0bc8, 0xbfc21f080b804db92c2e4bb771d4c2, 0x00566d ] } , - BigNum { limbs: [ 0x121d901c68c49123c031d18d8c2649, 0xd8bc987365098ce1593a825ad83ef5, 0x006fc8 ] } , - BigNum { limbs: [ 0xab8672e395976ddc3fce2d7273d9b8, 0xce96912a183ea6587ecd8746ffc65e, 0x000424 ] } , - BigNum { limbs: [ 0xe9d91c5935fd49f4b6cc71968e9630, 0xab942a7f28f2aeb5acc56ef4dd0686, 0x003414 ] } , - BigNum { limbs: [ 0xd3cae6a6c85eb50b49338d697169d1, 0xfbbeff1e545584842b429aacfafecc, 0x003fd8 ] } , - BigNum { limbs: [ 0x40d3a6dad17cfb58253c958a750acb, 0xd11e6709e3150b19cc92362eeaac79, 0x00503d ] } , - BigNum { limbs: [ 0x7cd05c252cdf03a7dac369758af536, 0xd634c2939a3328200b75d372ed58da, 0x0023af ] } , - BigNum { limbs: [ 0x25871b96c0742e75161473966a53f7, 0x032dedb0b892480e75bd26e4e2ccb3, 0x000e42 ] } , - BigNum { limbs: [ 0x981ce7693de7d08ae9eb8b6995ac0a, 0xa4253becc4b5eb2b624ae2bcf538a0, 0x0065ab ] } , - BigNum { limbs: [ 0x309054dce40022360156e8b623013e, 0xbaeda02a6ff092a7ec5a61b18bafed, 0x003381 ] } , - BigNum { limbs: [ 0x8d13ae231a5bdcc9fea91649dcfec3, 0xec6589730d57a091ebada7f04c5566, 0x00406b ] } , - BigNum { limbs: [ 0xa9d4bab0b502dd86edbea447c942d5, 0x0a33a25ac40a26f8483151cc7c8088, 0x0060a2 ] } , - BigNum { limbs: [ 0x13cf484f4959217912415ab836bd2c, 0x9d1f8742b93e0c418fd6b7d55b84cb, 0x00134b ] } , - BigNum { limbs: [ 0x269bddbc2b9df4ce9a534745bfd613, 0xeb58904936dbdf2b8960761678b86c, 0x001fa4 ] } , - BigNum { limbs: [ 0x97082543d2be0a3165acb7ba4029ee, 0xbbfa9954466c540e4ea7938b5f4ce7, 0x005448 ] } , - BigNum { limbs: [ 0xc4c8739d4475765bf0e8fec7a9af22, 0xd3a3929c4bb36342213767f33397b9, 0x002c4c ] } , - BigNum { limbs: [ 0xf8db8f62b9e688a40f1700385650df, 0xd3af97013194cff7b6d0a1aea46d99, 0x0047a0 ] } , - BigNum { limbs: [ 0x8c7a99da8938647073084001146f23, 0x948861351141f0f5093f56be4518ad, 0x000b04 ] } , - BigNum { limbs: [ 0x3129692575239a8f8cf7befeeb90de, 0x12cac8686c064244cec8b2e392eca6, 0x0068e9 ] } , - BigNum { limbs: [ 0xab88365b6035748de74346b283c145, 0xa824ff74aa74280674d32da105c40d, 0x004f97 ] } , - BigNum { limbs: [ 0x121bcca49e268a7218bcb84d7c3ebc, 0xff2e2a28d2d40b336334dc00d24146, 0x002455 ] } , - BigNum { limbs: [ 0x76d28a9be629fb69e5dad127abcc9f, 0x7efc6393c8cfe857780d4fc57e7f03, 0x003ad2 ] } , - BigNum { limbs: [ 0x46d17864183203961a252dd8543362, 0x2856c609b4784ae25ffab9dc598650, 0x00391b ] } +pub global LOG_FIELDS_PER_BLOB: u32 = 12; +pub global EXTRA_FIELDS_PER_BLOB: u32 = 16; // 16 = floor(4096 FIELDS_PER_BLOB / 254 noir_field_bits), wasting only 32 bits. +pub global NOIR_FIELDS_PER_BLOB: u32 = FIELDS_PER_BLOB + EXTRA_FIELDS_PER_BLOB; +pub global FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB: u32 = EXTRA_FIELDS_PER_BLOB * 254; // EXTRA_FIELDS_PER_BLOB * 254 = 4064. So the first 4064 bls Fr fields in the blob will carry an extra bit in their 255th bit position, that will be used to reconstitute 16 extra fields. +pub global D: F = BigNum { limbs: [4096, 0, 0] }; +pub global D_INV: F = + BigNum { limbs: [0x686828bfce5c19400fffff00100001, 0x6878b46ae3705eb6a46a89213de7d3, 0x73e6] }; + +pub global ROOTS: [F; FIELDS_PER_BLOB] = [ + BigNum { + limbs: [0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000], + }, + BigNum { + limbs: [0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed], + }, + BigNum { + limbs: [0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000], + }, + BigNum { + limbs: [0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed], + }, + BigNum { + limbs: [0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457], + }, + BigNum { + limbs: [0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96], + }, + BigNum { + limbs: [0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333], + }, + BigNum { + limbs: [0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9], + }, + BigNum { + limbs: [0xbeb312f20b6f7653ea61d87742bcce, 0xce9140267af9dd1c0af834cec32c17, 0x0020b1], + }, + BigNum { + limbs: [0xfef0f00df2ec88ac159e2688bd4333, 0xd8c1e977024e561dcd0fd4d314d93b, 0x00533b], + }, + BigNum { + limbs: [0xf4e672ebc1e1bb95df4b360411fe73, 0x596e753e4fcc6e92a9c460afca4a1e, 0x004f2c], + }, + BigNum { + limbs: [0xc8bd90143c7a436a20b4c8fbee018e, 0x4de4b45f2d7bc4a72e43a8f20dbb34, 0x0024c1], + }, + BigNum { + limbs: [0x7a6b6cfb0faca4807b811a823f728d, 0x919ec91f38ac5ccd4631f16edba496, 0x001edc], + }, + BigNum { + limbs: [0x43389604eeaf5a7f847ee47dc08d74, 0x15b4607e449bd66c91d61832fc60bd, 0x005511], + }, + BigNum { + limbs: [0xbc96af334c36bca1abb31fb37786b9, 0xf2dd7e0c63fccabf643eda8951f257, 0x0038c7], + }, + BigNum { + limbs: [0x010d53ccb225425e544cdf4c887948, 0xb475ab91194b687a73c92f188612fc, 0x003b25], + }, + BigNum { + limbs: [0x6e88fb4c38fb8a360c60997369df4e, 0x903a157988bab4bcd40e22f55448bf, 0x0050e0], + }, + BigNum { + limbs: [0x4f1b07b3c56074c9f39f658c9620b3, 0x17191423f48d7e7d03f9e6ac83bc94, 0x00230d], + }, + BigNum { + limbs: [0xbc7f62d13a6e1c3ec50c9031a36ca3, 0xc5837cb5fca206050b5832d1099726, 0x0065f6], + }, + BigNum { + limbs: [0x0124a02ec3ede2c13af36ece5c935e, 0xe1cface780a62d34ccafd6d0ce6e2d, 0x000df6], + }, + BigNum { + limbs: [0x3dc46688b5e11768cc0c58459f155b, 0x0457c83a7d9c5aea51f540eb0c0496, 0x002c7e], + }, + BigNum { + limbs: [0x7fdf9c77487ae79733f3a6ba60eaa6, 0xa2fb6162ffabd84f8612c8b6cc00bd, 0x00476f], + }, + BigNum { + limbs: [0xe943612401899720d4ed194fccfeb9, 0xda18a9d30564a8f0cfd2438f018c01, 0x005303], + }, + BigNum { + limbs: [0xd460a1dbfcd267df2b12e5b0330148, 0xcd3a7fca77e38a490835c612d67951, 0x0020e9], + }, + BigNum { + limbs: [0x317ae6451bb89de69679532ae1234c, 0x237e58fcced486fa69d8e4e48506e3, 0x000461], + }, + BigNum { + limbs: [0x8c291cbae2a361196986abd51edcb5, 0x83d4d0a0ae73ac3f6e2f24bd52fe70, 0x006f8c], + }, + BigNum { + limbs: [0x593d6ff6dab086ee5bcecc4e7773cb, 0xb16caf96816fa3a95d2d4016e2bd45, 0x00047c], + }, + BigNum { + limbs: [0x6466930923ab7811a43132b1888c36, 0xf5e67a06fbd88f907adac98af5480e, 0x006f70], + }, + BigNum { + limbs: [0xa6d195014b641082e68bc0bc50a88f, 0x5bb8ed54ae00468b04010fa5c79f62, 0x0056f3], + }, + BigNum { + limbs: [0x16d26dfeb2f7ee7d19743e43af5772, 0x4b9a3c48cf47ecaed406f9fc1065f1, 0x001cfa], + }, + BigNum { + limbs: [0x452d43f6d5756f51cb57e0e3035d15, 0xb9c6e6797777851425ea12dcacdae7, 0x001579], + }, + BigNum { + limbs: [0x7876bf0928e68fae34a81e1cfca2ec, 0xed8c432405d0ae25b21df6c52b2a6c, 0x005e73], + }, + BigNum { + limbs: [0x967f4be2f951558140d032f0a9ee53, 0x6345ec055e4d14a1e27164d8fdbd2d, 0x0045af], + }, + BigNum { + limbs: [0x2724b71d050aa97ebf2fcc0f5611ae, 0x440d3d981efb1e97f596a4c8da4826, 0x002e3e], + }, + BigNum { + limbs: [0xf20a6f5e1709899ddf46bac40ac8e4, 0x300e9079af0b916f129332ba2dfc0b, 0x0028eb], + }, + BigNum { + limbs: [0xcb9993a1e752756220b9443bf5371d, 0x77449923ce3ca1cac574d6e7aa0947, 0x004b02], + }, + BigNum { + limbs: [0xdc0ae311f00af48469ef4d246b6883, 0xad6a79b61c1a71d544f7800a7e4ae4, 0x005391], + }, + BigNum { + limbs: [0xe1991fee0e510a7b9610b1db94977e, 0xf9e8afe7612dc1649310899759ba6e, 0x00205b], + }, + BigNum { + limbs: [0x2e4312e6011bf5d941e9338fb466f7, 0x0520cdfb5d9d6c54cb86cdf73e9123, 0x0044ed], + }, + BigNum { + limbs: [0x8f60f019fd400926be16cb704b990a, 0xa2325ba21faac6e50c813baa997430, 0x002f00], + }, + BigNum { + limbs: [0x12abf7f3a89e7acf065a270f3c324f, 0x64fb4536c4fcf6ad66524f0376d9e4, 0x0054fa], + }, + BigNum { + limbs: [0xaaf80b0c55bd8430f9a5d7f0c3cdb2, 0x4257e466b84b3c8c71b5ba9e612b6f, 0x001ef3], + }, + BigNum { + limbs: [0x2a70a615d0b8e4d2fc5e69ac5db47f, 0x40ac57f86f5e293b1d67bc8de5d9a1, 0x000e48], + }, + BigNum { + limbs: [0x93335cea2da31a2d03a19553a24b82, 0x66a6d1a50dea09febaa04d13f22bb2, 0x0065a5], + }, + BigNum { + limbs: [0x1f590ef73ba2bdc0f1357a508e5e7b, 0x00aba73798bfaf59d0fc7261da7291, 0x0058c4], + }, + BigNum { + limbs: [0x9e4af408c2b9413f0eca84af71a186, 0xa6a78265e48883e0070b973ffd92c2, 0x001b29], + }, + BigNum { + limbs: [0x02e4e461e72e18ddc3b03ea91bc267, 0x785206b5761a878d670fcb570ab3b8, 0x006358], + }, + BigNum { + limbs: [0xbabf1e9e172de6223c4fc056e43d9a, 0x2f0122e8072dabac70f83e4acd519b, 0x001095], + }, + BigNum { + limbs: [0xc3ebf43c92a949a4593e1acca2cb6c, 0x8adc7bff16bae3ee1645113940cf46, 0x0053c7], + }, + BigNum { + limbs: [0xf9b80ec36bb2b55ba6c1e4335d3495, 0x1c76ad9e668d4f4bc1c2f86897360c, 0x002026], + }, + BigNum { + limbs: [0xe74ba2b75ca477f44e14739932aa33, 0x508a14adf95959d7d47f20aa9f0259, 0x0037d3], + }, + BigNum { + limbs: [0xd6586048a1b7870bb1eb8b66cd55ce, 0x56c914ef83eed9620388e8f73902f9, 0x003c1a], + }, + BigNum { + limbs: [0x9f1f01e2bbf0ac476e05bf67d4973c, 0xcc64ae610371dcd9ce528178852eaf, 0x005a50], + }, + BigNum { + limbs: [0x1e85011d426b52b891fa3f982b68c5, 0xdaee7b3c79d6566009b5882952d6a4, 0x00199c], + }, + BigNum { + limbs: [0x1ae51df978cc3878f4ee1de45ab2f2, 0x03824bef73c976407b9926e20836d2, 0x006e57], + }, + BigNum { + limbs: [0xa2bee506858fc6870b11e11ba54d0f, 0xa3d0ddae097ebcf95c6ee2bfcfce81, 0x000596], + }, + BigNum { + limbs: [0x7493f160ce4cb729b4cb21179cfb0e, 0x79931cfdd8947f799cf20f675fde6a, 0x00036b], + }, + BigNum { + limbs: [0x4910119f300f47d64b34dde86304f3, 0x2dc00c9fa4b3b3c03b15fa3a7826e9, 0x007082], + }, + BigNum { + limbs: [0x0664a566a603f98c15c05b1901cef2, 0xed2ec80a4115f20c57f6d7dc953305, 0x000afc], + }, + BigNum { + limbs: [0xb73f5d9958580573ea3fa3e6fe310f, 0xba2461933c32412d801131c542d24e, 0x0068f0], + }, + BigNum { + limbs: [0xe20d3cfc83311c0727b36db1974ef4, 0xd5fd4e2f04c5e7caaba64af676214e, 0x0028c6], + }, + BigNum { + limbs: [0xdb96c6037b2ae2f8d84c914e68b10d, 0xd155db6e78824b6f2c61beab61e404, 0x004b26], + }, + BigNum { + limbs: [0x36750f231bcd8672d73ebbe97445d5, 0x9ddec7fa8e98e4b5243a8bda7ca378, 0x000fe0], + }, + BigNum { + limbs: [0x872ef3dce28e788d28c143168bba2c, 0x097461a2eeaf4e84b3cd7dc75b61db, 0x00640d], + }, + BigNum { + limbs: [0xd0caac87f5713c5130c2c1660125be, 0x111413588742b7c68b4d7fdd60d098, 0x006898], + }, + BigNum { + limbs: [0xecd9567808eac2aecf3d3d99feda43, 0x963f1644f6057b734cba89c47734ba, 0x000b55], + }, + BigNum { + limbs: [0x30a34e5e4c7a31a0927a327c751043, 0x983de0110e23413ff88848100458b8, 0x0030d2], + }, + BigNum { + limbs: [0x8d00b4a1b1e1cd5f6d85cc838aefbe, 0x0f15498c6f24f1f9df7fc191d3ac9b, 0x00431b], + }, + BigNum { + limbs: [0x1e0777f7ef73e32ef7664cb2440ed4, 0xf5b7cb3dee5f01fe51c5b744878f5d, 0x00510d], + }, + BigNum { + limbs: [0x9f9c8b080ee81bd10899b24dbbf12d, 0xb19b5e5f8ee9313b8642525d5075f6, 0x0022df], + }, + BigNum { + limbs: [0x608393655b6d323eae9752b92f9726, 0x1a173d90ba01c42ee040e5579a63af, 0x0015ae], + }, + BigNum { + limbs: [0x5d206f9aa2eeccc15168ac46d068db, 0x8d3bec0cc3466f0af7c7244a3da1a4, 0x005e3f], + }, + BigNum { + limbs: [0x136819ab9c98a27528d588439e5b12, 0x3ae1cc22ee66ae3320a20450eb9bbf, 0x001a8f], + }, + BigNum { + limbs: [0xaa3be95461c35c8ad72a76bc61a4ef, 0x6c715d7a8ee18506b7660550ec6994, 0x00595e], + }, + BigNum { + limbs: [0xb0deac619bda2d4000b0b3767c9928, 0x0b00588ed2cf8b98c6ffcd682aa219, 0x0035c6], + }, + BigNum { + limbs: [0x0cc5569e6281d1bfff4f4b898366d9, 0x9c52d10eaa78a7a111083c39ad633a, 0x003e27], + }, + BigNum { + limbs: [0x95392351a789a318d303a266992f63, 0x6bb22f520df225302664820cb7fbf4, 0x00058e], + }, + BigNum { + limbs: [0x286adfae56d25be72cfc5c9966d09e, 0x3ba0fa4b6f560e09b1a3879520095f, 0x006e5f], + }, + BigNum { + limbs: [0x47df05ce549e034eb4bb5cc301906f, 0xace8a4aeb40b597e225a1da4156c04, 0x007144], + }, + BigNum { + limbs: [0x75c4fd31a9bdfbb14b44a23cfe6f92, 0xfa6a84eec93cd9bbb5adebfdc2994f, 0x0002a8], + }, + BigNum { + limbs: [0x7d9fd5726f6b40ed9fa5c032ec0a23, 0xa72e47136966a4512dec6b0a03377e, 0x005f2f], + }, + BigNum { + limbs: [0x40042d8d8ef0be12605a3ecd13f5de, 0x0024e28a13e18ee8aa1b9e97d4cdd5, 0x0014be], + }, + BigNum { + limbs: [0x3accee4e32febaa4f1f87d90884c5a, 0x5f6ba59c3994a84b028e307c93637f, 0x002254], + }, + BigNum { + limbs: [0x82d714b1cb5d445b0e07816f77b3a7, 0x47e7840143b38aeed579d92544a1d4, 0x005199], + }, + BigNum { + limbs: [0x9fa49ec41505c948af25b254d71df9, 0xdf508052e8d9a67bb3d018ed258f03, 0x006c1c], + }, + BigNum { + limbs: [0x1dff643be95635b750da4cab28e208, 0xc802a94a946e8cbe2437f0b4b27650, 0x0007d0], + }, + BigNum { + limbs: [0x0af27f081250e5bddd6dacba0b1d06, 0x9b0b4fa4971529805a2b04c50efc33, 0x005b75], + }, + BigNum { + limbs: [0xb2b183f7ec0b194222925245f4e2fb, 0x0c47d9f8e63309b97ddd04dcc90920, 0x001878], + }, + BigNum { + limbs: [0xffeee172f8ac74095e328eda2f8e5c, 0x8571ac60a4ce0468b4bb2b446edda9, 0x002904], + }, + BigNum { + limbs: [0xbdb5218d05af8af6a1cd7025d071a5, 0x21e17d3cd87a2ed1234cde5d6927a9, 0x004ae9], + }, + BigNum { + limbs: [0xfd4ee83f1b2499dbe21753938adf74, 0x09b8f9797bc1d44db4c7e28c3f15cb, 0x001aa9], + }, + BigNum { + limbs: [0xc0551ac0e33765241de8ab6c75208d, 0x9d9a302401865eec2340271598ef87, 0x005944], + }, + BigNum { + limbs: [0xfb82877b46d20d3f0ffba2ea149337, 0x83626bca158c398677e14a8cb7e715, 0x005815], + }, + BigNum { + limbs: [0xc2217b84b789f1c0f0045c15eb6cca, 0x23f0bdd367bbf9b36026bf15201e3d, 0x001bd8], + }, + BigNum { + limbs: [0xf0a42ec0e52a48c009cf2b0763b3d5, 0x72b23615cf703897e487b9c664354a, 0x0054b5], + }, + BigNum { + limbs: [0xccffd43f1931b63ff630d3f89c4c2c, 0x34a0f387add7faa1f3804fdb73d008, 0x001f38], + }, + BigNum { + limbs: [0xbdbdcad82928c864e8c456229dfdef, 0xd2940967b1a207e780cc7312dd5371, 0x0067ad], + }, + BigNum { + limbs: [0xffe63827d533369b173ba8dd620212, 0xd4bf2035cba62b52573b968efab1e1, 0x000c3f], + }, + BigNum { + limbs: [0x4b0f40448ca04c44568101d845f71f, 0x150315161c3e6e8ba6f2374a655d9d, 0x005318], + }, + BigNum { + limbs: [0x7294c2bb71bbb2bba97efd27ba08e2, 0x925014876109c4ae3115d25772a7b6, 0x0020d5], + }, + BigNum { + limbs: [0xe21a225b58e59f1d3e494f87fd6d91, 0x8bf565feb0f7bdf7f8f0d267d1ae2a, 0x00249a], + }, + BigNum { + limbs: [0xdb89e0a4a5765fe2c1b6af78029270, 0x1b5dc39ecc507541df17373a065728, 0x004f53], + }, + BigNum { + limbs: [0x94a89651aca0ff810d9cff570736e9, 0x46355ac0cbecc13494e5cc0ae758c6, 0x006c43], + }, + BigNum { + limbs: [0x28fb6cae51baff7ef262ffa8f8c918, 0x611dcedcb15b720543223d96f0ac8d, 0x0007aa], + }, + BigNum { + limbs: [0x9486bb67912a2b440dab45cd1fac5b, 0x03d7743e9a0675583bdb136e9f86e1, 0x001a9d], + }, + BigNum { + limbs: [0x291d47986d31d3bbf254b932e053a6, 0xa37bb55ee341bde19c2cf633387e72, 0x005950], + }, + BigNum { + limbs: [0x6fb582ac74db12571ba2fccf28601b, 0xfa8d52f970ba51420be43501370b16, 0x001996], + }, + BigNum { + limbs: [0x4dee80538980eca8e45d0230d79fe6, 0xacc5d6a40c8de1f7cc23d4a0a0fa3d, 0x005a56], + }, + BigNum { + limbs: [0x8a65bc0f8e4d1ecdd815ee4d942bee, 0xa05ea5c70ef50d10f88231dde2f6e1, 0x003336], + }, + BigNum { + limbs: [0x333e46f0700ee03227ea10b26bd413, 0x06f483d66e532628df85d7c3f50e72, 0x0040b7], + }, + BigNum { + limbs: [0x56ab6223eff0406e175e44c490cbc0, 0x7a32e902f9e85187145dfaed820595, 0x0059dc], + }, + BigNum { + limbs: [0x66f8a0dc0e6bbe91e8a1ba3b6f3441, 0x2d20409a835fe1b2c3aa0eb455ffbe, 0x001a11], + }, + BigNum { + limbs: [0x4492b6f43bb51eca7dadda50f555e4, 0x9040823a88e7b6a42eb341ff879cb0, 0x006025], + }, + BigNum { + limbs: [0x79114c0bc2a6e035825224af0aaa1d, 0x1712a762f4607c95a954c7a25068a3, 0x0013c8], + }, + BigNum { + limbs: [0xc85f7efbd6188bb08956f964517062, 0x2b7d27b4c23e09768a7087f0cc2629, 0x001356], + }, + BigNum { + limbs: [0xf54484042843734f76a9059bae8f9f, 0x7bd601e8bb0a29c34d9781b10bdf29, 0x006097], + }, + BigNum { + limbs: [0xae4a21d39a23bee9dc91a650a90e49, 0x59d76ca02af7f2f3e98766f8c9185c, 0x0016c3], + }, + BigNum { + limbs: [0x0f59e12c64384016236e58af56f1b8, 0x4d7bbcfd52504045ee80a2a90eecf7, 0x005d2a], + }, + BigNum { + limbs: [0xc708b8b84ee699a565af7a806913be, 0x169d8ee087328d16baf2bdd5e94641, 0x002db7], + }, + BigNum { + limbs: [0xf69b4a47af75655a9a50847f96ec43, 0x90b59abcf615a6231d154bcbeebf11, 0x004636], + }, + BigNum { + limbs: [0xfb135ff413a356d5f57c79b59b2332, 0x73726e9409979c7943d6a33bc39345, 0x0061f2], + }, + BigNum { + limbs: [0xc290a30beab8a82a0a83854a64dccf, 0x33e0bb0973b096c09431666614720d, 0x0011fb], + }, + BigNum { + limbs: [0x71082d2903a1ac633d3e92c7ca8ccf, 0x59c69ed3df9941205e1bb9264c6a7c, 0x003c9f], + }, + BigNum { + limbs: [0x4c9bd5d6faba529cc2c16c38357332, 0x4d8c8ac99daef21979ec507b8b9ad7, 0x00374e], + }, + BigNum { + limbs: [0x409954448fd0a2dbcc4af4074489e8, 0xe4668304bec207238a67fd3278fde6, 0x001bce], + }, + BigNum { + limbs: [0x7d0aaebb6e8b5c2433b50af8bb7619, 0xc2eca698be862c164da00c6f5f076d, 0x00581e], + }, + BigNum { + limbs: [0x3c9d94a870e33f9df832cfdf2062ef, 0xb766f5943eadc0dcf3788fe23b2f53, 0x001325], + }, + BigNum { + limbs: [0x81066e578d78bf6207cd2f20df9d12, 0xefec34093e9a725ce48f79bf9cd600, 0x0060c7], + }, + BigNum { + limbs: [0x0865a899e8deff4935bd2f817f694b, 0x4098e2e9f12e6b368121ac0cf4ad0a, 0x004f9b], + }, + BigNum { + limbs: [0xb53e5a66157cffb6ca42cf7e8096b6, 0x66ba46b38c19c80356e65d94e35849, 0x002452], + }, + BigNum { + limbs: [0x505ce32828420562b851e3d2a34df5, 0x0aa154b7afb7604ccbce3186331764, 0x00663d], + }, + BigNum { + limbs: [0x6d471fd7d619f99d47ae1b2d5cb20c, 0x9cb1d4e5cd90d2ed0c39d81ba4edef, 0x000db0], + }, + BigNum { + limbs: [0x39e2b6fbd943d0adc24eba36b7578e, 0x29432977ae6a072570e877993c3d74, 0x005a06], + }, + BigNum { + limbs: [0x83c14c0425182e523db144c948a873, 0x7e100025cede2c14671f92089bc7df, 0x0019e7], + }, + BigNum { + limbs: [0xcc59c903893ca8829235424bc52016, 0x03442f2fb2879a8a9d78c4fed2b2ba, 0x004d35], + }, + BigNum { + limbs: [0xf14a39fc751f567d6dcabcb43adfeb, 0xa40efa6dcac098af3a8f44a3055298, 0x0026b8], + }, + BigNum { + limbs: [0x8469e061a1c6905718b817f3ccad48, 0x97adfcf78a922bf7a6f6d02f061235, 0x005335], + }, + BigNum { + limbs: [0x393a229e5c956ea8e747e70c3352b9, 0x0fa52ca5f2b6074231113972d1f31e, 0x0020b8], + }, + BigNum { + limbs: [0x275f891994324c998731ee0c78437a, 0x57052117e1e151ea52ef08f1e06c38, 0x004ba3], + }, + BigNum { + limbs: [0x964479e66a29b26678ce10f387bc87, 0x504e08859b66e14f851900aff7991b, 0x00284a], + }, + BigNum { + limbs: [0xdcd43dec9acd7108993b54226b7f93, 0x3f58561023a7fa481d537345cf6530, 0x004208], + }, + BigNum { + limbs: [0xe0cfc513638e8df766c4aadd94806e, 0x67fad38d59a038f1bab4965c08a022, 0x0031e5], + }, + BigNum { + limbs: [0xb309ae850664dec3e268216bdc4a30, 0x6d8cebced82bc53c32396daedbf90a, 0x000c11], + }, + BigNum { + limbs: [0x0a9a547af7f7203c1d97dd9423b5d1, 0x39c63dcea51c6dfda5ce9bf2fc0c49, 0x0067dc], + }, + BigNum { + limbs: [0x10ed5bae398c9c164881d4baa8a72e, 0x37284ec1415dde48a52a93151b352e, 0x004432], + }, + BigNum { + limbs: [0xacb6a751c4cf62e9b77e2a455758d3, 0x702adadc3bea54f132dd768cbcd025, 0x002fbb], + }, + BigNum { + limbs: [0x7fcad29e98164375352d72a0c9539a, 0xe61a3a2a9b39fcf3ec5eda0ddb53a0, 0x0042a2], + }, + BigNum { + limbs: [0x3dd930616645bb8acad28c5f36ac67, 0xc138ef72e20e3645eba92f93fcb1b3, 0x00314a], + }, + BigNum { + limbs: [0x72c833e4cf3499ecbf5d6f01ea2fe8, 0xdb96249a23e969ac30e42135fbc427, 0x00485a], + }, + BigNum { + limbs: [0x4adbcf1b2f27651340a28ffe15d019, 0xcbbd0503595ec98da723e86bdc412c, 0x002b92], + }, + BigNum { + limbs: [0xf67b913ee947b92fef56114b49c75d, 0x15ee4db709aa6e492ff0b0d05658b6, 0x0002b3], + }, + BigNum { + limbs: [0xc72871c1151445d010a9edb4b638a4, 0x9164dbe6739dc4f0a81758d181ac9c, 0x00713a], + }, + BigNum { + limbs: [0x576cd5a085170dfba96832adfa9266, 0x0f08c01d85df59b31745ff67db9e8b, 0x004e34], + }, + BigNum { + limbs: [0x66372d5f7944f1045697cc52056d9b, 0x984a697ff768d986c0c20a39fc66c8, 0x0025b9], + }, + BigNum { + limbs: [0x0bf5a0bea3c2ee335ab15ecceb6a2d, 0xf883ceaa889c7f2b1554800870c74e, 0x005daf], + }, + BigNum { + limbs: [0xb1ae62415a9910cca54ea0331495d4, 0xaecf5af2f4abb40ec2b38999673e05, 0x00163d], + }, + BigNum { + limbs: [0xce26afb69019f7ee3b38a3813633f1, 0xacd7204034884021f50f21b39e1d96, 0x006743], + }, + BigNum { + limbs: [0xef7d53496e420711c4c75b7ec9cc10, 0xfa7c095d48bff317e2f8e7ee39e7bc, 0x000ca9], + }, + BigNum { + limbs: [0xa0eb428f0d8dccd165b2490ec7254e, 0x4dd24ebf1658766f71f92679eccdd9, 0x000959], + }, + BigNum { + limbs: [0x1cb8c070f0ce322e9a4db5f138dab3, 0x5980dade66efbcca660ee327eb377a, 0x006a94], + }, + BigNum { + limbs: [0x8df3051d69e220022193b333c3b855, 0x287007cdc98e2e1a54f5ed6dac0e6e, 0x003683], + }, + BigNum { + limbs: [0x2fb0fde29479defdde6c4bcc3c47ac, 0x7ee321cfb3ba051f83121c342bf6e5, 0x003d6a], + }, + BigNum { + limbs: [0xafcb31434545d82efcfdaf4e265ab7, 0xb48988b9dbae9a54b1f2bebcea8bca, 0x002fb2], + }, + BigNum { + limbs: [0x0dd8d1bcb91626d103024fb1d9a54a, 0xf2c9a0e3a19998e526154ae4ed7989, 0x00443a], + }, + BigNum { + limbs: [0x730e303c173e1c090bcdd715521bb1, 0x7940ac524648faaf9f04b421b462f2, 0x0046aa], + }, + BigNum { + limbs: [0x4a95d2c3e71de2f6f43227eaade450, 0x2e127d4b36ff388a3903558023a261, 0x002d43], + }, + BigNum { + limbs: [0xa69d8f42e2c25b26dd05e4c4aec099, 0x5a6d7f643b5a2dee35b6cf12739eaf, 0x003dc4], + }, + BigNum { + limbs: [0x170673bd1b99a3d922fa1a3b513f68, 0x4ce5aa3941ee054ba2513a8f6466a4, 0x003629], + }, + BigNum { + limbs: [0x3d29335383e69a148277eef8c0a297, 0x64192e295d851bd07fc9fc34abead9, 0x00328f], + }, + BigNum { + limbs: [0x807acfac7a7564eb7d8810073f5d6a, 0x4339fb741fc31769583e0d6d2c1a7a, 0x00415e], + }, + BigNum { + limbs: [0x2c84f3154125602cabadec2fe322b8, 0xda59a33dcbf232a732ae1a3b0aef75, 0x002e95], + }, + BigNum { + limbs: [0x911f0feabd369ed3545212d01cdd49, 0xccf9865fb1560092a559ef66cd15de, 0x004557], + }, + BigNum { + limbs: [0x7570b00fca5c9a520c8c4d748fb509, 0x55665267f0974b35861cb1da153a8b, 0x003d06], + }, + BigNum { + limbs: [0x483352f033ff64adf373b18b704af8, 0x51ecd7358cb0e80451eb57c7c2cac8, 0x0036e7], + }, + BigNum { + limbs: [0x330977b7a8bfe99ca730e689c0bf9e, 0x7d2fce8520d1f5109fa0d7553d937a, 0x0000aa], + }, + BigNum { + limbs: [0x8a9a8b48559c156358cf18763f4063, 0x2a235b185c763e293867324c9a71d9, 0x007343], + }, + BigNum { + limbs: [0x4628b567af1bb4e3d5dbe0d2f73e41, 0xb74a12568801be1e72f2066186fa64, 0x006eca], + }, + BigNum { + limbs: [0x777b4d984f404a1c2a241e2d08c1c0, 0xf0091746f546751b65160340510aef, 0x000522], + }, + BigNum { + limbs: [0x5f56946340fdfc3b2bcdccf1ec7b16, 0x9e7e1c0691a3bae4d7a5261114f26f, 0x0055e2], + }, + BigNum { + limbs: [0x5e4d6e9cbd5e02c4d432320e1384eb, 0x08d50d96eba478550062e390c312e4, 0x001e0b], + }, + BigNum { + limbs: [0x01cd8bef1b22603e16064aa9a77770, 0x214dfb1c37d97fb60b67a741a4eee4, 0x006635], + }, + BigNum { + limbs: [0xbbd67710e3399ec1e9f9b456588891, 0x86052e81456eb383cca0626033166f, 0x000db8], + }, + BigNum { + limbs: [0xab3ea313c630b6754ceec2fde25881, 0x29cbca5aa4231b2b2fbdb88c0832f1, 0x002043], + }, + BigNum { + limbs: [0x12655fec382b488ab3113c021da780, 0x7d875f42d925180ea84a5115cfd262, 0x0053aa], + }, + BigNum { + limbs: [0x54e5045f96bdb5b46b6df596ba6ecf, 0xd3064ba6d18615e83527ce053b131c, 0x0055e9], + }, + BigNum { + limbs: [0x68befea0679e494b94920969459132, 0xd44cddf6abc21d51a2e03b9c9cf237, 0x001e03], + }, + BigNum { + limbs: [0x54642678ea64b7408a86452d1142b4, 0x14a479d7e1869cfafd436d7b412b06, 0x005c62], + }, + BigNum { + limbs: [0x693fdc8713f747bf7579b9d2eebd4d, 0x92aeafc59bc1963edac49c2696da4d, 0x00178b], + }, + BigNum { + limbs: [0x771d65b2ee56d3198a034b1e705c0e, 0x117113c5d5a3e04369454396c3893c, 0x00255c], + }, + BigNum { + limbs: [0x46869d4d10052be675fcb3e18fa3f3, 0x95e215d7a7a452f66ec2c60b147c17, 0x004e91], + }, + BigNum { + limbs: [0xc93f37bda7b84b0c06f42c4fa19fd3, 0xbb72051a32b8635dba604a48d7ba10, 0x003d0b], + }, + BigNum { + limbs: [0xf464cb4256a3b3f3f90bd2b05e602e, 0xebe124834a8fcfdc1da7bf59004b42, 0x0036e1], + }, + BigNum { + limbs: [0x7d52a475e8ce1152a4c44c49a49f1e, 0x1bd32e1843bc1a3ef55558b56d6d42, 0x006dee], + }, + BigNum { + limbs: [0x40515e8a158dedad5b3bb2b65b60e3, 0x8b7ffb85398c18fae2b2b0ec6a9811, 0x0005ff], + }, + BigNum { + limbs: [0x4ef4c6bf3fe0c6c7ea608db8cd652c, 0x7ca6fc96f67ff5389b96856be8b140, 0x001df5], + }, + BigNum { + limbs: [0x6eaf3c40be7b3838159f7147329ad5, 0x2aac2d0686c83e013c718435ef5413, 0x0055f8], + }, + BigNum { + limbs: [0x38cc4f07468cebd78b1ef5748164e7, 0x56c04012bb93b8a0671498f387398d, 0x005e68], + }, + BigNum { + limbs: [0x84d7b3f8b7cf132874e1098b7e9b1a, 0x5092e98ac1b47a9970f370ae50cbc6, 0x001585], + }, + BigNum { + limbs: [0x6041cee0c4bdac8586e7bf3217bc38, 0x75545a9dcb2faf33b868f0e27d4ed6, 0x000a79], + }, + BigNum { + limbs: [0x5d62341f399e527a79183fcde843c9, 0x31feceffb21884061f9f18bf5ab67d, 0x006974], + }, + BigNum { + limbs: [0x8111d9b58068eda22cb0c0043581b8, 0x5f69535823b4eea87dbd8b3e7293c0, 0x004118], + }, + BigNum { + limbs: [0x3c92294a7df3115dd34f3efbca7e49, 0x47e9d645599344915a4a7e63657193, 0x0032d5], + }, + BigNum { + limbs: [0x01fb897d05b8538dfcd4912667f55f, 0x2898a7c259a810a20368471f6635e8, 0x0064e3], + }, + BigNum { + limbs: [0xbba87982f8a3ab72032b6dd9980aa2, 0x7eba81db23a02297d49fc28271cf6b, 0x000f0a], + }, + BigNum { + limbs: [0x6cbfc87f549eb20f15758baad3fcf4, 0x7eef82a73dc4782fd931be0cba8ab0, 0x0018e1], + }, + BigNum { + limbs: [0x50e43a80a9bd4cf0ea8a73552c030d, 0x2863a6f63f83bb09fed64b951d7aa3, 0x005b0c], + }, + BigNum { + limbs: [0x04a2294bb265301622dd5a6889a8e8, 0x0e0589dd793aa51bfee012ab18ba91, 0x00362f], + }, + BigNum { + limbs: [0xb901d9b44bf6cee9dd22a497765719, 0x994d9fc0040d8e1dd927f6f6bf4ac2, 0x003dbe], + }, + BigNum { + limbs: [0x1b8dd0e729d15d3f10f3a9abb257e1, 0x83b64fd60550e6c6e2fafbc3c935b1, 0x003718], + }, + BigNum { + limbs: [0xa2163218d48aa1c0ef0c55544da820, 0x239cd9c777f74c72f50d0dde0ecfa2, 0x003cd5], + }, + BigNum { + limbs: [0xc59162052451257675b5beeb6153ca, 0x7850ce28f03eea18ac2f59bed4eb36, 0x004405], + }, + BigNum { + limbs: [0xf812a0fada0ad9898a4a40149eac37, 0x2f025b748d0949212bd8afe3031a1c, 0x002fe8], + }, + BigNum { + limbs: [0x80f5ffdc6ac2e316a9e3e795d08887, 0xba2e026f2459a189d7e4af45dab593, 0x000688], + }, + BigNum { + limbs: [0x3cae032393991be9561c176a2f777a, 0xed25272e58ee91b000235a5bfd4fc0, 0x006d64], + }, + BigNum { + limbs: [0x78af6ba70b7705f1af8f454525fd66, 0xb1110b25238c7d7128741250354861, 0x004c33], + }, + BigNum { + limbs: [0x44f49758f2e4f90e5070b9bada029b, 0xf6421e7859bbb5c8af93f751a2bcf2, 0x0027b9], + }, + BigNum { + limbs: [0x3ec884963a020ab3e6eed5afa1109b, 0xced439e3c7897f5870bc08c4081661, 0x005db4], + }, + BigNum { + limbs: [0x7edb7e69c459f44c191129505eef66, 0xd87eefb9b5beb3e1674c00ddcfeef2, 0x001638], + }, + BigNum { + limbs: [0xffa1a105df6b8a7429c1fa7a88c247, 0xe1cbced44b4c46145a561c41e22acf, 0x000701], + }, + BigNum { + limbs: [0xbe0261fa1ef0748bd63e0485773dba, 0xc5875ac931fbed257db1ed5ff5da83, 0x006ceb], + }, + BigNum { + limbs: [0x72266b93838c16cd4b696e7ea423f1, 0x1336b5ca226c34c543b8647ce9de4c, 0x000c72], + }, + BigNum { + limbs: [0x4b7d976c7acfe832b49690815bdc10, 0x941c73d35adbfe74944fa524ee2707, 0x00677b], + }, + BigNum { + limbs: [0x6a4f579172314a0ff8423daf2fdb50, 0xfcd83aa5a469524e3a763bb50b0994, 0x0054c0], + }, + BigNum { + limbs: [0x5354ab6e8c2ab4f007bdc150d024b1, 0xaa7aeef7d8dee0eb9d91cdecccfbbf, 0x001f2c], + }, + BigNum { + limbs: [0x2feb30d6711c70e95f38660e9d1536, 0xd7d20dac46ed6eae360ede81eba8db, 0x000832], + }, + BigNum { + limbs: [0x8db8d2298d3f8e16a0c798f162eacb, 0xcf811bf1365ac48ba1f92b1fec5c78, 0x006bba], + }, + BigNum { + limbs: [0x0e24ef2f570c8a24438957b3e25619, 0x0e58dcdd8ce7f82295c732d111a2b2, 0x001a66], + }, + BigNum { + limbs: [0xaf7f13d0a74f74dbbc76a74c1da9e8, 0x98fa4cbff0603b174240d6d0c662a1, 0x005987], + }, + BigNum { + limbs: [0xa33e0d6b4dc2d87ee857bf1f253512, 0x8b55856bf49320c8b3bf4746e7abf6, 0x004877], + }, + BigNum { + limbs: [0x1a65f594b099268117a83fe0dacaef, 0x1bfda43188b512712448c25af0595d, 0x002b76], + }, + BigNum { + limbs: [0x1764ae9a77652c25c83bb50749f0af, 0x7bc7ac9a877903f012dba811a16818, 0x005e0b], + }, + BigNum { + limbs: [0xa63f546586f6d2da37c449f8b60f52, 0x2b8b7d02f5cf2f49c52c6190369d3b, 0x0015e2], + }, + BigNum { + limbs: [0xca8e5c4d2dc5ffd2878366fcec15ba, 0x702dd52769aebdb6bf288d790d89bd, 0x005d19], + }, + BigNum { + limbs: [0xf315a6b2d095ff2d787c980313ea47, 0x372554761399758318df7c28ca7b95, 0x0016d4], + }, + BigNum { + limbs: [0x3d7e9803ec74e17a030cc2de5db52b, 0xdbf168716b60e5789556beff8edeb6, 0x001d12], + }, + BigNum { + limbs: [0x80256afc11e71d85fcf33c21a24ad6, 0xcb61c12c11e74dc142b14aa249269d, 0x0056da], + }, + BigNum { + limbs: [0x7d166d26d7d13fef678c866ccd32d7, 0x1642c7524b471810c6122bee51ba89, 0x00725d], + }, + BigNum { + limbs: [0x408d95d9268abf109873789332cd2a, 0x9110624b32011b2911f5ddb3864aca, 0x000190], + }, + BigNum { + limbs: [0x03788dd25be1b072994949fe8dda46, 0x315227033bb160f1e69f8f0320b088, 0x00622c], + }, + BigNum { + limbs: [0xba2b752da27a4e8d66b6b5017225bb, 0x7601029a4196d247f1687a9eb754cb, 0x0011c1], + }, + BigNum { + limbs: [0x785fd8b3542a38a4a7a41d55234864, 0x2b04f3a711b74789f746a17afd9bde, 0x00241f], + }, + BigNum { + limbs: [0x45442a4caa31c65b585be1aadcb79d, 0x7c4e35f66b90ebafe0c16826da6975, 0x004fce], + }, + BigNum { + limbs: [0xbff88c0b7e4246f003cd6e73efb611, 0x0fdde70e992d0cc516e3bb219c82aa, 0x00146d], + }, + BigNum { + limbs: [0xfdab76f48019b80ffc32908c1049f0, 0x9775428ee41b2674c1244e803b82a8, 0x005f80], + }, + BigNum { + limbs: [0x40e7eb01aad13b85caa34fd9b2b6ce, 0xb1d9346b1f74337b8c94b4e3a208e5, 0x007275], + }, + BigNum { + limbs: [0x7cbc17fe538ac37a355caf264d4933, 0xf579f5325dd3ffbe4b7354be35fc6e, 0x000177], + }, + BigNum { + limbs: [0x679941d7e3344ac1f99b485bb67d21, 0xd9e4727786c36067482e2d9445f9ef, 0x005aef], + }, + BigNum { + limbs: [0x560ac1281b27b43e0664b6a44982e0, 0xcd6eb725f684d2d28fd9dc0d920b64, 0x0018fd], + }, + BigNum { + limbs: [0xda7cb26fe41c7fe6b19f0b5eadf9cb, 0x1c67b10780e18ea3e9254dbb27ead7, 0x001c02], + }, + BigNum { + limbs: [0xe32750901a3f7f194e60f3a1520636, 0x8aeb7895fc66a495eee2bbe6b01a7b, 0x0057eb], + }, + BigNum { + limbs: [0xafd9f0df88a27eefe8ef07b5048efa, 0x742370737a124164b50a572c9c65ee, 0x000ad7], + }, + BigNum { + limbs: [0x0dca122075b980101710f74afb7107, 0x332fb92a0335f1d522fdb2753b9f65, 0x006916], + }, + BigNum { + limbs: [0xde4d06174139246cfaf4c817c13fe6, 0x0e1ec7a28bb857f5f1a3b50f2b7f30, 0x0000c5], + }, + BigNum { + limbs: [0xdf56fce8bd22da93050b36e83ec01b, 0x993461faf18fdb43e6645492ac8622, 0x007328], + }, + BigNum { + limbs: [0x42551c91b1af3382fe7994226a7881, 0x30fb21510ba3cb52d65ec3b820f174, 0x005b33], + }, + BigNum { + limbs: [0x7b4ee66e4caccb7d01866add958780, 0x7658084c71a467e701a945e9b713df, 0x0018ba], + }, + BigNum { + limbs: [0x97168a3a6000fe4541b8ff2ee0434e, 0x66525526a65439feec240d80689fd6, 0x000951], + }, + BigNum { + limbs: [0x268d78c59e5b00babe46ffd11fbcb3, 0x4100d476d6f3f93aebe3fc216f657d, 0x006a9c], + }, + BigNum { + limbs: [0xa07e9cbe5a10af2a5e7b785841a1da, 0xb67ad287bb0f9589c90d5aa47634ea, 0x00668d], + }, + BigNum { + limbs: [0x1d256641a44b4fd5a18486a7be5e27, 0xf0d85715c2389db00efaaefd61d069, 0x000d5f], + }, + BigNum { + limbs: [0x6c91b560c5b82c9b2ee1a0bf112931, 0xdc55e43f779e0eace99e48f3d3cad6, 0x00243a], + }, + BigNum { + limbs: [0x51124d9f38a3d264d11e5e40eed6d0, 0xcafd455e05aa248cee69c0ae043a7d, 0x004fb2], + }, + BigNum { + limbs: [0x424f00b1a2b32fa0eaaaa3583a6b80, 0x91a1889c6ab2045e7a34773491a611, 0x003362], + }, + BigNum { + limbs: [0x7b55024e5ba8cf5f15555ba7c59481, 0x15b1a10112962edb5dd3926d465f42, 0x00408b], + }, + BigNum { + limbs: [0x0c078154d7c539a4c94125ad9dc176, 0x0931b15c62562ce4ba2c4bf31f353e, 0x006905], + }, + BigNum { + limbs: [0xb19c81ab2696c55b36bed952623e8b, 0x9e2178411af206551ddbbdaeb8d015, 0x000ae8], + }, + BigNum { + limbs: [0x9ad324193961627372e26d5720949f, 0x2ca6312ad70d5e3ab4ed8e1c3483aa, 0x0004a4], + }, + BigNum { + limbs: [0x22d0dee6c4fa9c8c8d1d91a8df6b62, 0x7aacf872a63ad4ff231a7b85a381a9, 0x006f49], + }, + BigNum { + limbs: [0xdf8723cf6834a9b16c92903c30681c, 0x7af602a41b0e4a7055b0fa4b32af44, 0x002a33], + }, + BigNum { + limbs: [0xde1cdf309627554e936d6ec3cf97e5, 0x2c5d26f96239e8c982570f56a5560e, 0x0049ba], + }, + BigNum { + limbs: [0xa005008f5fa2fe6cd888c85ca05ae9, 0xeeb1a28cdf1a91ecc533285f28b4ad, 0x001b61], + }, + BigNum { + limbs: [0x1d9f02709eb90093277736a35fa518, 0xb8a187109e2da14d12d4e142af50a6, 0x00588b], + }, + BigNum { + limbs: [0xec083a342b6152dc6c5431b7a01194, 0x444efe927bc8a141881064cd54d304, 0x002aaf], + }, + BigNum { + limbs: [0xd19bc8cbd2faac2393abcd485fee6d, 0x63042b0b017f91f84ff7a4d483324e, 0x00493e], + }, + BigNum { + limbs: [0xbf1d8539e5c50b799bd1773c3aadf2, 0xd6eec90f1e192c0cc5b558b3509c77, 0x00455e], + }, + BigNum { + limbs: [0xfe867dc61896f386642e87c3c5520f, 0xd064608e5f2f072d1252b0ee8768db, 0x002e8e], + }, + BigNum { + limbs: [0x4148b024d3ffa61cfd232fb7ac2d01, 0x8edaee2eeaed1ac42c62e56cb955a3, 0x0058ad], + }, + BigNum { + limbs: [0x7c5b52db2a5c58e302dccf4853d300, 0x18783b6e925b1875aba524351eafb0, 0x001b40], + }, + BigNum { + limbs: [0x8bf3cd9093c0a2b6e7d38c824464d3, 0x5f24ab69299e82782d7daff3118923, 0x00223a], + }, + BigNum { + limbs: [0x31b0356f6a9b5c49182c727dbb9b2e, 0x482e7e3453a9b0c1aa8a59aec67c30, 0x0051b3], + }, + BigNum { + limbs: [0xd0cb7ff2325177578545b4e64baae6, 0x86f9eb22d5720a288c1ac768fd31db, 0x00344b], + }, + BigNum { + limbs: [0xecd8830dcc0a87a87aba4a19b4551b, 0x20593e7aa7d629114bed4238dad377, 0x003fa2], + }, + BigNum { + limbs: [0x49071f297def3c20da606ff4a3ba2b, 0x096ad9987ad9cbf93d062b4fda502a, 0x0072bf], + }, + BigNum { + limbs: [0x749ce3d6806cc2df259f8f0b5c45d6, 0x9de85005026e67409b01de51fdb529, 0x00012e], + }, + BigNum { + limbs: [0x9d3446b5219ed92c78c12b5913ffa2, 0x02082ceecbc03f01ab9eac85850baf, 0x0049e6], + }, + BigNum { + limbs: [0x206fbc4adcbd25d3873ed3a6ec005f, 0xa54afcaeb187f4382c695d1c52f9a4, 0x002a07], + }, + BigNum { + limbs: [0xb7b50e5693aeb64287ce1144fcf019, 0x4f3eb4931089c5be3aa28cfc810120, 0x00352c], + }, + BigNum { + limbs: [0x05eef4a96aad48bd7831edbb030fe8, 0x5814750a6cbe6d7b9d657ca5570433, 0x003ec1], + }, + BigNum { + limbs: [0x30d9ac186fc5451f5753e3ccc4922e, 0x33f624c17d074b024c21cfa2302540, 0x0041ae], + }, + BigNum { + limbs: [0x8cca56e78e96b9e0a8ac1b333b6dd3, 0x735d04dc0040e8378be639ffa7e013, 0x00323f], + }, + BigNum { + limbs: [0x4de56daf67ef102318f1f6844036ac, 0x01b7108f6c67604297e1df5b7fe9fe, 0x007097], + }, + BigNum { + limbs: [0x6fbe9550966ceedce70e087bbfc955, 0xa59c190e10e0d2f740262a46581b55, 0x000356], + }, + BigNum { + limbs: [0xdc15bbb51c14b8bde69ad1be866e28, 0x4d702f536f1aef56d22dab86198a12, 0x005741], + }, + BigNum { + limbs: [0xe18e474ae247464219652d417991d9, 0x59e2fa4a0e2d43e305da5e1bbe7b40, 0x001cac], + }, + BigNum { + limbs: [0x148b46fc8a9536b994f7e88da69099, 0xc54dedb0dd5c00f2b6fdeb2434990d, 0x0054a9], + }, + BigNum { + limbs: [0xa918bc0373c6c8466b081672596f68, 0xe2053bec9fec3247210a1e7da36c46, 0x001f43], + }, + BigNum { + limbs: [0xe0344c49d79b66f214cc49a9ca287b, 0x7bd852e497f37956c16f3a78ae28ee, 0x0051ec], + }, + BigNum { + limbs: [0xdd6fb6b626c0980deb33b55635d786, 0x2b7ad6b8e554b9e31698cf2929dc64, 0x002201], + }, + BigNum { + limbs: [0x29e9208281d2988e92a08175236817, 0x8c4fc8876304b7701b97622a206b2e, 0x000f79], + }, + BigNum { + limbs: [0x93bae27d7c8966716d5f7d8adc97ea, 0x1b0361161a437bc9bc70a777b79a25, 0x006474], + }, + BigNum { + limbs: [0x2d67a18dc838277b51fa789fe811c1, 0x6d59e26f95d8df3b80de686838f4c0, 0x00420a], + }, + BigNum { + limbs: [0x903c61723623d784ae05866017ee40, 0x39f9472de76f53fe5729a1399f1093, 0x0031e3], + }, + BigNum { + limbs: [0x98ce89ad3c4462f52172b7909c822f, 0x0f6f20aebd433bab579958add5d563, 0x000238], + }, + BigNum { + limbs: [0x24d57952c2179c0ade8d476f637dd2, 0x97e408eec004f78e806eb0f4022ff0, 0x0071b5], + }, + BigNum { + limbs: [0xad8bd407c8c41c02e2f94cd781d69e, 0xec60d8a45e9d074f9aa0ec1140c136, 0x0017c1], + }, + BigNum { + limbs: [0x10182ef83597e2fd1d06b2287e2963, 0xbaf250f91eab2bea3d671d9097441d, 0x005c2b], + }, + BigNum { + limbs: [0x0d246202280193fea7c33496a345f2, 0xbad21bb26cbe0156dd6f2d56b9c192, 0x0059a2], + }, + BigNum { + limbs: [0xb07fa0fdd65a6b01583cca695cba0f, 0xec810deb108a31e2fa98dc4b1e43c1, 0x001a4a], + }, + BigNum { + limbs: [0xb9bbd9b0a3590b2ee4c0317b41459b, 0x8c1a3548e372b5c82a603c67a3a3ba, 0x0016fd], + }, + BigNum { + limbs: [0x03e8294f5b02f3d11b3fcd84beba66, 0x1b38f45499d57d71ada7cd3a346199, 0x005cf0], + }, + BigNum { + limbs: [0xc58a0b042cd4dc35d1ae71abd0a54d, 0x72419d80770cd6be007959cfa1c61b, 0x001793], + }, + BigNum { + limbs: [0xf819f7fbd18722ca2e518d542f5ab4, 0x35118c1d063b5c7bd78eafd2363f37, 0x005c5a], + }, + BigNum { + limbs: [0x712f65dddcac5339a8f2d056a4027d, 0x8447f4db2f2599713674356834f476, 0x0059ac], + }, + BigNum { + limbs: [0x4c749d2221afabc6570d2ea95bfd84, 0x230b34c24e2299c8a193d439a310dd, 0x001a41], + }, + BigNum { + limbs: [0x620b99aa201e9b7554cb01f596606f, 0x550e339064cc77fc010ff1bb87e048, 0x0000de], + }, + BigNum { + limbs: [0x5b986955de3d638aab34fd0a699f92, 0x5244f60d187bbb3dd6f817e650250b, 0x00730f], + }, + BigNum { + limbs: [0x7feef21aa1455b1985e5010d1e28f9, 0xf7d7a6997c064a244131970ee26e59, 0x005cf3], + }, + BigNum { + limbs: [0x3db510e55d16a3e67a1afdf2e1d708, 0xaf7b83040141e91596d67292f596fa, 0x0016f9], + }, + BigNum { + limbs: [0xef0eef02e9618bbf1b369c0a8445b6, 0x330063d404e1d74a7534d0a5cfbcaf, 0x006be4], + }, + BigNum { + limbs: [0xce9513fd14fa7340e4c962f57bba4b, 0x7452c5c978665bef62d338fc0848a3, 0x000809], + }, + BigNum { + limbs: [0x42f05b2dd0efa96d4b3d6d88b9ec49, 0x2dcdcaf325db8a076a0804aaf03d6b, 0x005a7e], + }, + BigNum { + limbs: [0x7ab3a7d22d6c5592b4c291774613b8, 0x79855eaa576ca9326e0004f6e7c7e8, 0x00196f], + }, + BigNum { + limbs: [0x278442906cdcb997c7058ee0f32403, 0x15d0bc7ed9cb8c826031662df9e760, 0x006c7a], + }, + BigNum { + limbs: [0x961fc06f917f456838fa701f0cdbfe, 0x91826d1ea37ca6b777d6a373de1df3, 0x000773], + }, + BigNum { + limbs: [0x81b9b0030fff9b9dc2b95bda888cc3, 0x66c29c0c4d935f8efca0709e9fdc07, 0x004f0a], + }, + BigNum { + limbs: [0x3bea52fcee5c63623d46a32577733e, 0x40908d912fb4d3aadb67990338294c, 0x0024e3], + }, + BigNum { + limbs: [0xb13e62a6404a74daf6c1cc2b79b805, 0x1db2c4fc40430e536c4bf821b25948, 0x002e8d], + }, + BigNum { + limbs: [0x0c65a059be118a25093e32d48647fc, 0x89a064a13d0524e66bbc118025ac0b, 0x004560], + }, + BigNum { + limbs: [0x4ad0183cb4d23e3b9f40dc39226ef2, 0xbb8a5f91996cc7e207d405cec60f24, 0x004c63], + }, + BigNum { + limbs: [0x72d3eac34989c0c460bf22c6dd910f, 0xebc8ca0be3db6b57d03403d311f62f, 0x002789], + }, + BigNum { + limbs: [0x1d4b203d557fd3d0bd794485b1cd59, 0xff0465d7945d6b0fd286dc1624d8de, 0x001a8d], + }, + BigNum { + limbs: [0xa058e2c2a8dc2b2f4286ba7a4e32a8, 0xa84ec3c5e8eac82a05812d8bb32c75, 0x00595f], + }, + BigNum { + limbs: [0x7f4e7f70ec86ac05e2e6cb0db28404, 0x71b2bcbcebb0e07032ac4dd9f48655, 0x00222d], + }, + BigNum { + limbs: [0x3e55838f11d552fa1d1933f24d7bfd, 0x35a06ce0919752c9a55bbbc7e37efe, 0x0051c0], + }, + BigNum { + limbs: [0x31d6a3b689584dd2f0f5e5e994ff3a, 0x98eed454988b6dee792e47fe9ebe96, 0x003268], + }, + BigNum { + limbs: [0x8bcd5f497503b12d0f0a19166b00c7, 0x0e645548e4bcc54b5ed9c1a33946bd, 0x004185], + }, + BigNum { + limbs: [0xd1a69ef390c21d4a865bf20d7fe4ff, 0x7ca7fee6f701be6bd1e602f93f1e7a, 0x000a60], + }, + BigNum { + limbs: [0xebfd640c6d99e1b579a40cf2801b02, 0x2aab2ab6864674ce062206a898e6d8, 0x00698d], + }, + BigNum { + limbs: [0x62a8e248a5873997ef4c4862dac48b, 0x5edd0c55c21a756db007d73ddfd82b, 0x000083], + }, + BigNum { + limbs: [0x5afb20b758d4c56810b3b69d253b76, 0x48761d47bb2dbdcc28003263f82d28, 0x00736a], + }, + BigNum { + limbs: [0xfbf6b6977f335ccc7ee15d01f39a0d, 0x40eb8f3ff496463dea24c6c2f0113d, 0x005839], + }, + BigNum { + limbs: [0xc1ad4c687f28a233811ea1fe0c65f4, 0x66679a5d88b1ecfbede342dee7f415, 0x001bb4], + }, + BigNum { + limbs: [0xa998918baa4ee01f8dc38c14a70a7d, 0x9a0c8d46e5c1431b68c23ab353eb5a, 0x00529a], + }, + BigNum { + limbs: [0x140b7174540d1ee0723c72eb58f584, 0x0d469c569786f01e6f45ceee8419f9, 0x002153], + }, + BigNum { + limbs: [0xf5f8fb1cfd35bf416d25664132e681, 0xacd15cff4a085d468a777ba29478a8, 0x0063a1], + }, + BigNum { + limbs: [0xc7ab07e301263fbe92da98becd1980, 0xfa81cc9e333fd5f34d908dff438caa, 0x00104b], + }, + BigNum { + limbs: [0xa148a069f07e83085c098a064e640d, 0x1d433b70d20df332844e948cea8ef0, 0x0059bd], + }, + BigNum { + limbs: [0x1c5b62960ddd7bf7a3f674f9b19bf4, 0x8a0fee2cab3a400753b97514ed7663, 0x001a30], + }, + BigNum { + limbs: [0x323eed0b7541f7626cf66312dc75d4, 0xf0cfc53f02ad2cff5e64aca06bfdc0, 0x000521], + }, + BigNum { + limbs: [0x8b6515f4891a079d93099bed238a2d, 0xb683645e7a9b063a79a35d016c0793, 0x006ecb], + }, + BigNum { + limbs: [0x6d33f723b2c096edd01d1e9965d339, 0xe5c62447e6c5b903259bd01c07a223, 0x007091], + }, + BigNum { + limbs: [0x50700bdc4b9b68122fe2e0669a2cc8, 0xc18d055596827a36b26c3985d06330, 0x00035b], + }, + BigNum { + limbs: [0xced4862f3112b54a33b4ca4fa500d5, 0xe64e6e329643ccb9d7408ba4ad4f77, 0x0046d5], + }, + BigNum { + limbs: [0xeecf7cd0cd4949b5cc4b34b05aff2c, 0xc104bb6ae704668000c77dfd2ab5db, 0x002d17], + }, + BigNum { + limbs: [0xa7edc3eeb1ea0f3cd3d2e1c03a844c, 0xc7495e0793b32f9ded387ed31cf4f1, 0x001257], + }, + BigNum { + limbs: [0x15b63f114c71efc32c2d1d3fc57bb5, 0xe009cb95e995039beacf8acebb1062, 0x006195], + }, + BigNum { + limbs: [0xca9f6f63c7ee570593110cdd147867, 0x0c5a1acc4e039943b8c1f1c32bb124, 0x006d19], + }, + BigNum { + limbs: [0xf304939c366da7fa6ceef222eb879a, 0x9af90ed12f4499f61f4617deac542e, 0x0006d4], + }, + BigNum { + limbs: [0xa3138bbc3a874b460e884790b8c345, 0x8a70e4c6426c457a1f0b6f25f22f8b, 0x0049a9], + }, + BigNum { + limbs: [0x1a907743c3d4b3b9f177b76f473cbc, 0x1ce244d73adbedbfb8fc9a7be5d5c8, 0x002a44], + }, + BigNum { + limbs: [0x1169992c0dfff849ad9eda3ab2596b, 0xed13f5196adafec2c1e6f695673957, 0x006c32], + }, + BigNum { + limbs: [0xac3a69d3f05c06b6526124c54da696, 0xba3f3484126d34771621130c70cbfc, 0x0007ba], + }, + BigNum { + limbs: [0x55a2ee5f896a4409af8f18266456c5, 0xac223b8b00a756b079736230d8d1e0, 0x005356], + }, + BigNum { + limbs: [0x680114a074f1baf65070e6d99ba93c, 0xfb30ee127ca0dc895e94a770ff3373, 0x002096], + }, + BigNum { + limbs: [0x2b4bfeb55dfba683a202b9605bdc7f, 0xcd834da0dfe13d24b851b6e0e2940a, 0x005b37], + }, + BigNum { + limbs: [0x9258044aa060587c5dfd459fa42382, 0xd9cfdbfc9d66f6151fb652c0f57149, 0x0018b5], + }, + BigNum { + limbs: [0x95ffdf3831c932ebf8ff080a52e66f, 0x9145a9d644ccae7ba896e4494d8bb6, 0x00364c], + }, + BigNum { + limbs: [0x27a423c7cc92cc140700f6f5ad1992, 0x160d7fc7387b84be2f7125588a799d, 0x003da1], + }, + BigNum { + limbs: [0x548acb6d790da51557c2f3467bd1ca, 0x515b1711e6667471e199a39130b996, 0x0006b9], + }, + BigNum { + limbs: [0x69193792854e59eaa83d0bb9842e37, 0x55f8128b96e1bec7f66e6610a74bbd, 0x006d34], + }, + BigNum { + limbs: [0x0352b62f3f203eb38d064ea8444127, 0xfa03ad3c8255023718eed874887b51, 0x005aee], + }, + BigNum { + limbs: [0xba514cd0bf3bc04c72f9b057bbbeda, 0xad4f7c60faf33102bf19312d4f8a02, 0x0018fe], + }, + BigNum { + limbs: [0x6d63f8b28503442b436d7a469e3045, 0xd3a13151f5da0c095cf1e33152987a, 0x004c75], + }, + BigNum { + limbs: [0x50400a4d7958bad4bc9284b961cfbc, 0xd3b1f84b876e27307b162670856cd9, 0x002777], + }, + BigNum { + limbs: [0x62f6b763e08ab37846d9e1c754b5dc, 0x4af774526aa008078f5f1149b3a08b, 0x00327c], + }, + BigNum { + limbs: [0x5aad4b9c1dd14b87b9261d38ab4a25, 0x5c5bb54b12a82b3248a8f8582464c8, 0x004171], + }, + BigNum { + limbs: [0xe5fdb63351c0ec536a984065c92adf, 0xe30b5b7bc5bd438d2dbf46dd5590f9, 0x000898], + }, + BigNum { + limbs: [0xd7a64cccac9b12ac9567be9a36d522, 0xc447ce21b78aefacaa48c2c4827459, 0x006b54], + }, + BigNum { + limbs: [0x2db53007db7808cb26d9489265bf28, 0x370156cdae5227f2d34b0ee0bab27b, 0x006103], + }, + BigNum { + limbs: [0x8feed2f822e3f634d926b66d9a40d9, 0x7051d2cfcef60b4704bcfac11d52d8, 0x0012ea], + }, + BigNum { + limbs: [0xe92a5ff656e571e252f6a3681e0665, 0x48279a4d32928213bbd737bf0e62fa, 0x0067b7], + }, + BigNum { + limbs: [0xd479a309a7768d1dad095b97e1f99c, 0x5f2b8f504ab5b1261c30d1e2c9a258, 0x000c36], + }, + BigNum { + limbs: [0x4a3619fc303084522303685af9251f, 0xec39741c1ee0841ec896cf8d6b71cc, 0x003f80], + }, + BigNum { + limbs: [0x736de903ce2b7aaddcfc96a506dae2, 0xbb19b5815e67af1b0f713a146c9387, 0x00346c], + }, + BigNum { + limbs: [0x09b29d2aaa46f58fde839c9b10f95a, 0xf481668a98cc916653ef8ee10c3160, 0x000b47], + }, + BigNum { + limbs: [0xb3f165d554150970217c6264ef06a7, 0xb2d1c312e47ba1d384187ac0cbd3f3, 0x0068a5], + }, + BigNum { + limbs: [0x8d4f7d4f608b27831af13e1a684e43, 0xeabd406c3a9d1aaa8bc17630875b9a, 0x002669], + }, + BigNum { + limbs: [0x305485b09dd0d77ce50ec0e597b1be, 0xbc95e93142ab188f4c46937150a9b9, 0x004d83], + }, + BigNum { + limbs: [0x5f59426e561ac3a0d046361160c87d, 0xf67c9a365f924184a3278cbac76cf6, 0x001e28], + }, + BigNum { + limbs: [0x5e4ac091a8413b5f2fb9c8ee9f3784, 0xb0d68f671db5f1b534e07ce710985d, 0x0055c4], + }, + BigNum { + limbs: [0xb504c88bc20bd7cd2b2f4c41dff3cb, 0x1dab874c3d6a7726f871b0da235e08, 0x00698f], + }, + BigNum { + limbs: [0x089f3a743c502732d4d0b2be200c36, 0x89a7a2513fddbc12df9658c7b4a74b, 0x000a5e], + }, + BigNum { + limbs: [0x5f34977fa341337055b514a4510f6a, 0x373ad66cee9842076ef74d0b719d55, 0x005dd7], + }, + BigNum { + limbs: [0x5e6f6b805b1acb8faa4aea5baef097, 0x701853308eaff1326910bc966667fe, 0x001616], + }, + BigNum { + limbs: [0x6c461ae56f072df424341daddcab5d, 0x0d96bee11ebb5204f44088385855a8, 0x004aa1], + }, + BigNum { + limbs: [0x515de81a8f54d10bdbcbe1522354a4, 0x99bc6abc5e8ce134e3c781697fafab, 0x00294c], + }, + BigNum { + limbs: [0x0e8aaa2c0adab646add4de51661716, 0x17a81ec992dbd332c8edcb31b9c532, 0x006f8c], + }, + BigNum { + limbs: [0xaf1958d3f38148b9522b20ae99e8eb, 0x8fab0ad3ea6c60070f1a3e701e4021, 0x000461], + }, + BigNum { + limbs: [0x966df282c99da1552407971d6a01b3, 0xc4a1e86297dd1f72eaf592b1a5e37c, 0x001064], + }, + BigNum { + limbs: [0x2736107d34be5daadbf867e295fe4e, 0xe2b1413ae56b13c6ed1276f03221d7, 0x006388], + }, + BigNum { + limbs: [0xdf55fe0e814040452ccd3a84afddff, 0xc0bccf122cf17f89e05099b9346eb4, 0x004fc3], + }, + BigNum { + limbs: [0xde4e04f17d1bbebad332c47b502202, 0xe6965a8b5056b3aff7b76fe8a3969e, 0x002429], + }, + BigNum { + limbs: [0x9025299f9d89f8b0a40e557f4b46ae, 0xb7cf8d35960d07e1837d2ec951dce4, 0x000c0e], + }, + BigNum { + limbs: [0x2d7ed96060d2064f5bf1a980b4b953, 0xef839c67e73b2b58548adad886286f, 0x0067de], + }, + BigNum { + limbs: [0x627ca6b51d001a6f9d0064fac7137d, 0xba9652521c23efdb2f0828054b7fb3, 0x006f56], + }, + BigNum { + limbs: [0x5b275c4ae15be49062ff9a0538ec84, 0xecbcd74b6124435ea8ffe19c8c85a0, 0x000496], + }, + BigNum { + limbs: [0x57c9facced7b915f66134727f54889, 0xc12d8a6f82133cf6cd1d9efc7c146e, 0x006c0e], + }, + BigNum { + limbs: [0x65da083310e06da099ecb7d80ab778, 0xe6259f2dfb34f6430aea6aa55bf0e5, 0x0007de], + }, + BigNum { + limbs: [0x339834601eaf9df9b5ad7e3464f5a5, 0x51053381165e056f4fd9e2e5174451, 0x00510f], + }, + BigNum { + limbs: [0x8a0bce9fdfac61064a5280cb9b0a5c, 0x564df61c66ea2dca882e26bcc0c102, 0x0022de], + }, + BigNum { + limbs: [0xea1b243740a635ed1c6473b3e31cf7, 0x6e5ee340acc503a56cc8813aa331a6, 0x0022c3], + }, + BigNum { + limbs: [0xd388dec8bdb5c912e39b8b4c1ce30a, 0x38f4465cd0832f946b3f886734d3ac, 0x00512a], + }, + BigNum { + limbs: [0xa5a037f31901964ec74d66ce5ce51d, 0xd1a16317e2eef74564930e6096c055, 0x006852], + }, + BigNum { + limbs: [0x1803cb0ce55a68b138b29831a31ae4, 0xd5b1c6859a593bf47374fb414144fe, 0x000b9a], + }, + BigNum { + limbs: [0x5b9ca898999be0e41960cc8f7cf554, 0x10c103e349beeebdfa4d46a48617eb, 0x001be6], + }, + BigNum { + limbs: [0x62075a6764c01e1be69f3270830aad, 0x969225ba3389447bddbac2fd51ed68, 0x005807], + }, + BigNum { + limbs: [0xc9e646f0bc30f46b1ac0499b422b78, 0x36685571ebe59efaac6d4efab2f7a2, 0x00178c], + }, + BigNum { + limbs: [0xf3bdbc0f422b0a94e53fb564bdd489, 0x70ead42b9162943f2b9abaa7250db0, 0x005c61], + }, + BigNum { + limbs: [0x468edeb6787ad5963a9c566e8bd6b5, 0x92e90312698626747ffd80262ac35f, 0x003dfd], + }, + BigNum { + limbs: [0x7715244985e12969c563a89174294c, 0x146a268b13c20cc5580a897bad41f4, 0x0035f0], + }, + BigNum { + limbs: [0xa1f0d04b158d7aa271966e405dcffd, 0xeac8ef44b61d5e3ddfac65da256f88, 0x00378f], + }, + BigNum { + limbs: [0x1bb332b4e8ce845d8e6990bfa23004, 0xbc8a3a58c72ad4fbf85ba3c7b295cb, 0x003c5d], + }, + BigNum { + limbs: [0x719dedc145d3ee4580dba9fc46a574, 0x8c3a3826d76773a54de6e95a9de480, 0x00102b], + }, + BigNum { + limbs: [0x4c06153eb88810ba7f245503b95a8d, 0x1b18f176a5e0bf948a2120473a20d3, 0x0063c2], + }, + BigNum { + limbs: [0x6d85a7faf7c62885336974811c697a, 0xbda65519ec38a6266415c4d6ced228, 0x003b35], + }, + BigNum { + limbs: [0x501e5b050695d67acc968a7ee39687, 0xe9acd483910f8d1373f244cb09332b, 0x0038b7], + }, + BigNum { + limbs: [0x510ebfb4543a3efb350dbef02a116e, 0xa56e80f82b2df675522e37ad4eca1c, 0x001907], + }, + BigNum { + limbs: [0x6c95434baa21c004caf2400fd5ee93, 0x01e4a8a5521a3cc485d9d1f4893b37, 0x005ae6], + }, + BigNum { + limbs: [0x1102eb66f6fce55e501a6aa6138595, 0x8e203415456536060cc57d5ad557ea, 0x006d3d], + }, + BigNum { + limbs: [0xaca11799075f19a1afe59459ec7a6c, 0x1932f58837e2fd33cb428c4702ad69, 0x0006b0], + }, + BigNum { + limbs: [0x7dea6029017fdc9dac7b409d585d19, 0xc0e6aaf7c2d906dbeaab1ad525575d, 0x00634f], + }, + BigNum { + limbs: [0x3fb9a2d6fcdc22625384be62a7a2e8, 0xe66c7ea5ba6f2c5ded5ceeccb2adf6, 0x00109d], + }, + BigNum { + limbs: [0x3764a3ff5f912e67cf9ca3e9f5b1b1, 0xbee4fcf836297cc088f970ebac3ad3, 0x005f20], + }, + BigNum { + limbs: [0x863f5f009ecad09830635b160a4e50, 0xe86e2ca5471eb6794f0e98b62bca80, 0x0014cc], + }, + BigNum { + limbs: [0x738f0e49608f7fec3894fdbbc5e597, 0x6831b2c665dce522dc0df640392d0a, 0x002e91], + }, + BigNum { + limbs: [0x4a14f4b69dcc7f13c76b01443a1a6a, 0x3f2176d7176b4e16fbfa13619ed849, 0x00455c], + }, + BigNum { + limbs: [0xb1cebef9a7dbaf187a081bc020c9e9, 0x49dce1168ed72eb22d78a01a149188, 0x0048c6], + }, + BigNum { + limbs: [0x0bd5440656804fe785f7e33fdf3618, 0x5d764886ee710487aa8f6987c373cb, 0x002b27], + }, + BigNum { + limbs: [0x786c05f26d2d14072fff623d593acc, 0x4567920d7fbdd5ad1e34af8ba8297e, 0x004b0f], + }, + BigNum { + limbs: [0x4537fd0d912eeaf8d0009cc2a6c535, 0x61eb978ffd8a5d8cb9d35a162fdbd5, 0x0028de], + }, + BigNum { + limbs: [0xa08916e4882ed38e69d125b2613b98, 0x2412402056b9c587252e3f738f0291, 0x00154d], + }, + BigNum { + limbs: [0x1d1aec1b762d2b71962ed94d9ec469, 0x8340e97d268e6db2b2d9ca2e4902c2, 0x005ea0], + }, + BigNum { + limbs: [0xa44a292b2e5b2982758592725b5677, 0x3df3d2c48682ef7088ae62b6a01241, 0x004c5f], + }, + BigNum { + limbs: [0x1959d9d4d000d57d8a7a6c8da4a98a, 0x695f56d8f6c543c94f59a6eb37f312, 0x00278e], + }, + BigNum { + limbs: [0x3dc049317117871848f2442fea2cc8, 0x6e34562bbc52e204d5dce884424849, 0x002cb0], + }, + BigNum { + limbs: [0x7fe3b9ce8d4477e7b70dbad015d339, 0x391ed371c0f55135022b211d95bd0a, 0x00473d], + }, + BigNum { + limbs: [0xd2201ed10a653f0612b0fb6cc1107c, 0xcba74f737371896fb6a2fbba8ee922, 0x006c1b], + }, + BigNum { + limbs: [0xeb83e42ef3f6bff9ed4f03933eef85, 0xdbabda2a09d6a9ca21650de7491c30, 0x0007d1], + }, + BigNum { + limbs: [0xdf8a6e25303f2fd0c13b83274f45b0, 0xbb2eb5bc528c11781b3e716a0f505e, 0x002bdd], + }, + BigNum { + limbs: [0xde1994dace1ccf2f3ec47bd8b0ba51, 0xec2473e12abc21c1bcc99837c8b4f4, 0x00480f], + }, + BigNum { + limbs: [0xd22b0908293b435d970e0b0666e0d8, 0x0683301968fdb44d3b688f8492460a, 0x005b03], + }, + BigNum { + limbs: [0xeb78f9f7d520bba268f1f3f9991f29, 0xa0cff984144a7eec9c9f7a1d45bf48, 0x0018ea], + }, + BigNum { + limbs: [0xc5922e39ae0bf92ae6e2c121bfc3c3, 0x9e36de006c054af1a2d79a24d27ae1, 0x007000], + }, + BigNum { + limbs: [0xf811d4c6505005d5191d3dde403c3e, 0x091c4b9d1142e84835306f7d058a71, 0x0003ed], + }, + BigNum { + limbs: [0xe63a729649cca628f1221a8298a060, 0xe2fcb84cd789855a08d1b96d6c46b4, 0x001272], + }, + BigNum { + limbs: [0xd7699069b48f58d70edde47d675fa1, 0xc4567150a5beaddfcf3650346bbe9e, 0x00617a], + }, + BigNum { + limbs: [0x5fe456e0de774541fed1c1f077470a, 0xef9cfd0d5b9c3c011284ce2c0a5ae6, 0x0058ea], + }, + BigNum { + limbs: [0x5dbfac1f1fe4b9be012e3d0f88b8f7, 0xb7b62c9021abf738c5833b75cdaa6d, 0x001b02], + }, + BigNum { + limbs: [0x4e7bab3c93dde164936d794ecac754, 0x8efcbc9ffba397e292677efe6e684b, 0x00192d], + }, + BigNum { + limbs: [0x6f2857c36a7e1d9b6c9285b13538ad, 0x18566cfd81a49b5745a08aa3699d08, 0x005ac0], + }, + BigNum { + limbs: [0xf39aabdcbb7d0745a8d91e955983d1, 0xed933c287503e05891c9ff9c3987d4, 0x00075d], + }, + BigNum { + limbs: [0xca09572342def7ba5726e06aa67c30, 0xb9bfed75084452e1463e0a059e7d7e, 0x006c8f], + }, + BigNum { + limbs: [0x04d8e25880e9cee1d977e545af710b, 0x5fb6453833c4c973f8fca82606c27d, 0x00527d], + }, + BigNum { + limbs: [0xb8cb20a77d72301e268819ba508ef6, 0x479ce465498369c5df0b617bd142d6, 0x002170], + }, + BigNum { + limbs: [0x9741e455322d312856121a533306a0, 0xd41c2b82dcc6b2dd9a95731e9ccfab, 0x005d63], + }, + BigNum { + limbs: [0x26621eaacc2ecdd7a9ede4acccf961, 0xd336fe1aa081805c3d7296833b35a8, 0x001689], + }, + BigNum { + limbs: [0x9d89aade182224f825d2b60a32f87a, 0x4aec85b8f956e027a83558a1fa00b9, 0x001df4], + }, + BigNum { + limbs: [0x201a5821e639da07da2d48f5cd0787, 0x5c66a3e483f153122fd2b0ffde049a, 0x0055f9], + }, + BigNum { + limbs: [0x2d7dae9287cd043df47cf236da17e9, 0xf534d4599079c579b994cbef0c2ce9, 0x001306], + }, + BigNum { + limbs: [0x9026546d768efac20b830cc925e818, 0xb21e5543ecce6dc01e733db2cbd86a, 0x0060e6], + }, + BigNum { + limbs: [0xcbb1bd356f80cdcf2c53214fca9316, 0xe397c114f8f36fa873d6002f921fda, 0x003495], + }, + BigNum { + limbs: [0xf1f245ca8edb3130d3acddb0356ceb, 0xc3bb68888454c3916432097245e578, 0x003f57], + }, + BigNum { + limbs: [0x62629752f7b4ac743e6cd3f2d8b5e4, 0xb727404262a9c24956b7927d30eacb, 0x001874], + }, + BigNum { + limbs: [0x5b416bad06a7528bc1932b0d274a1d, 0xf02be95b1a9e70f081507724a71a88, 0x005b78], + }, + BigNum { + limbs: [0x0cfc2a8e76963e1cfb5b8201d3c611, 0xdbab8b1811260a0955d20478e94671, 0x0038a2], + }, + BigNum { + limbs: [0xb0a7d87187c5c0e304a47cfe2c39f0, 0xcba79e856c22293082360528eebee2, 0x003b4a], + }, + BigNum { + limbs: [0x501d116ae74916c40d56452b59c640, 0x823696c820865acd8b4a64b679a2e3, 0x0032e8], + }, + BigNum { + limbs: [0x6d86f1951712e83bf2a9b9d4a639c1, 0x251c92d55cc1d86c4cbda4eb5e6270, 0x004105], + }, + BigNum { + limbs: [0x9d714edf2c5d73e9fd3487793e0a1e, 0x777daecfbc8bf776f0b322161a54eb, 0x000c02], + }, + BigNum { + limbs: [0x2032b420d1fe8b1602cb7786c1f5e3, 0x2fd57acdc0bc3bc2e754e78bbdb068, 0x0067eb], + }, + BigNum { + limbs: [0xa019a046396b882f67888351b3aed0, 0x4490a807026fab8427037d4aaef513, 0x0000df], + }, + BigNum { + limbs: [0x1d8a62b9c4f076d098777bae4c5131, 0x62c281967ad887b5b1048c57291040, 0x00730e], + }, + BigNum { + limbs: [0xb7da58c5251abce7c952e4bd7af7d4, 0x42944aa32bee278a8c2e3d1fd8e115, 0x005e85], + }, + BigNum { + limbs: [0x05c9aa3ad941421836ad1a4285082d, 0x64bedefa515a0baf4bd9cc81ff243e, 0x001568], + }, + BigNum { + limbs: [0xb169206b7f3154077d390dd7d05b42, 0x0a68359a3f51e5084aaf8797a96f5e, 0x004197], + }, + BigNum { + limbs: [0x0c3ae2947f2aaaf882c6f1282fa4bf, 0x9ceaf4033df64e318d58820a2e95f5, 0x003256], + }, + BigNum { + limbs: [0x3c05a40dd7360af2be473f9f510696, 0x85d44e308ee97c96515b1b38427a7c, 0x004f02], + }, + BigNum { + limbs: [0x819e5ef22725f40d41b8bf60aef96b, 0x217edb6cee5eb6a386acee69958ad7, 0x0024eb], + }, + BigNum { + limbs: [0xc01d3617a563363c520c2b1a297a42, 0x1b34b95dfdc7a5455416cfcec9c93f, 0x0057d1], + }, + BigNum { + limbs: [0xfd86cce858f8c8c3adf3d3e5d685bf, 0x8c1e703f7f808df483f139d30e3c13, 0x001c1c], + }, + BigNum { + limbs: [0xd04289be4d5845428c9fe880b696f2, 0xefc99d37fe721eb3867a7d42417bfd, 0x003337], + }, + BigNum { + limbs: [0xed617941b103b9bd7360167f49690f, 0xb7898c657ed61486518d8c5f968955, 0x0040b5], + }, + BigNum { + limbs: [0x471747bfef212bcdcd38d6f117f52f, 0x873a1f951adfb6548e4a26c46cf637, 0x00260e], + }, + BigNum { + limbs: [0x768cbb400f3ad33232c7280ee80ad2, 0x20190a0862687ce549bde2dd6b0f1c, 0x004ddf], + }, + BigNum { + limbs: [0x1bd60176f653694582bcb64c16195c, 0xf7a2a21cae9a8382c4cf78190afc04, 0x0045c6], + }, + BigNum { + limbs: [0xa1ce0189080895ba7d4348b3e9e6a5, 0xafb08780ceadafb713389188cd094f, 0x002e26], + }, + BigNum { + limbs: [0x12d6dbc4da70eb9281ca5182004249, 0x6ee71fba800af7b5bc01b47b0c0cc1, 0x00524f], + }, + BigNum { + limbs: [0xaacd273b23eb136d7e35ad7dffbdb8, 0x386c09e2fd3d3b841c065526cbf892, 0x00219e], + }, + BigNum { + limbs: [0xdd88120258390fcf4a24368337be6a, 0xbc58cb5eb5c44cc9ff4bf19abce5bb, 0x0030e1], + }, + BigNum { + limbs: [0xe01bf0fda622ef30b5dbc87cc84197, 0xeafa5e3ec783e66fd8bc18071b1f97, 0x00430b], + }, + BigNum { + limbs: [0xa959dcb76fe5390c0871ffc19b100f, 0xce8ba2c48aa4894506e8611524fe2a, 0x002f73], + }, + BigNum { + limbs: [0x144a26488e76c5f3f78dff3e64eff2, 0xd8c786d8f2a3a9f4d11fa88cb30729, 0x004479], + }, + BigNum { + limbs: [0x73882ea6ce7aa9e15b2a94a295c9ad, 0x7fb3c3230d556d15603c30cffb92d1, 0x003d74], + }, + BigNum { + limbs: [0x4a1bd4592fe1551ea4d56a5d6a3654, 0x279f667a6ff2c62477cbd8d1dc7282, 0x003679], + }, + BigNum { + limbs: [0xf7ba1663b31d0376fd4001b4f824c8, 0x46853ef9fa574485c4aa168e870ab3, 0x006fbe], + }, + BigNum { + limbs: [0xc5e9ec9c4b3efb8902bffd4b07db39, 0x60cdeaa382f0eeb4135df31350fa9f, 0x00042f], + }, + BigNum { + limbs: [0x0119a77a9a472b1f0256b78db57e18, 0xf68db38f4a7b27a0943532cbc2db68, 0x00474c], + }, + BigNum { + limbs: [0xbc8a5b856414d3e0fda947724a81e9, 0xb0c5760e32cd0b9943d2d6d61529eb, 0x002ca0], + }, + BigNum { + limbs: [0x1592642caef3e5a869ecf2cc0d850a, 0xd792bef1368d6e952e48357708336a, 0x004164], + }, + BigNum { + limbs: [0xa8119ed34f68195796130c33f27af7, 0xcfc06aac46bac4a4a9bfd42acfd1e9, 0x003288], + }, + BigNum { + limbs: [0xea563e74aa3185e99ab4b0ce6c0c7c, 0xcb7ba7a1102bab1c2cbe2844a0ddd5, 0x00098b], + }, + BigNum { + limbs: [0xd34dc48b542a7916654b4e3193f385, 0xdbd781fc6d1c881dab49e15d37277d, 0x006a61], + }, + BigNum { + limbs: [0x437f9626fc085e3c28d666a5c2d854, 0xb5c3debf77a18f4de02c0f776af3ea, 0x00325d], + }, + BigNum { + limbs: [0x7a246cd90253a0c3d729985a3d27ad, 0xf18f4ade05a6a3ebf7dbfa2a6d1169, 0x00418f], + }, + BigNum { + limbs: [0x042bde9573c4ad1ff95ac74f4dd55e, 0xf518291d3e252d00a5be2412a997b6, 0x0050c8], + }, + BigNum { + limbs: [0xb978246a8a9751e006a537b0b22aa3, 0xb23b00803f2306393249e58f2e6d9d, 0x002324], + }, + BigNum { + limbs: [0xd42ce812d4161a128568bfed36d2d6, 0x61d6a24bc012a01a09222bf9650bd9, 0x006524], + }, + BigNum { + limbs: [0xe9771aed2a45e4ed7a973f12c92d2b, 0x457c8751bd35931fcee5dda872f979, 0x000ec9], + }, + BigNum { + limbs: [0x4eea3f60d8ba48352b5233bf7ba901, 0x9a5b87438c07220bc79e6b495d459f, 0x003304], + }, + BigNum { + limbs: [0x6eb9c39f25a1b6cad4adcb40845700, 0x0cf7a259f141112e10699e587abfb4, 0x0040e9], + }, + BigNum { + limbs: [0x67db8f3cd65da7c8f54ccb3906df6e, 0x385ab3740f1d0a08b8806bf140116a, 0x003ff0], + }, + BigNum { + limbs: [0x55c873c327fe57370ab333c6f92093, 0x6ef876296e2b29311f879db097f3e9, 0x0033fd], + }, + BigNum { + limbs: [0x10f133fcb8fede5de6afb9568b79d7, 0x555d2abe285e02fca0c6b9bfafb5fd, 0x00149f], + }, + BigNum { + limbs: [0xacb2cf03455d20a2195045a974862a, 0x51f5fedf54ea303d37414fe2284f56, 0x005f4e], + }, + BigNum { + limbs: [0xb769a52be75f80a78adc4c393f40fb, 0x8cf482eda4eaeba7fb8a7fa58fc5d9, 0x0007f3], + }, + BigNum { + limbs: [0x063a5dd416fc7e587523b2c6c0bf06, 0x1a5ea6afd85d4791dc7d89fc483f7a, 0x006bfa], + }, + BigNum { + limbs: [0x1d3d048e2bae51fb8bf031847f0368, 0x7d0f0c1d7fa06092d03a32cfcbe1a7, 0x004b4f], + }, + BigNum { + limbs: [0xa066fe71d2adad04740fcd7b80fc99, 0x2a441d7ffda7d2a707cdd6d20c23ac, 0x00289e], + }, + BigNum { + limbs: [0xcfc07ba26779319d6862e69abec349, 0x7fd1ffada9fb7ce80043e235fce4b6, 0x0027a5], + }, + BigNum { + limbs: [0xede3875d96e2cd62979d1865413cb8, 0x278129efd34cb651d7c4276bdb209c, 0x004c48], + }, + BigNum { + limbs: [0x2b9280b02b0f38389490a19470e8d1, 0x662f4b3bf7dd4a6b4b7925d178b97c, 0x00006c], + }, + BigNum { + limbs: [0x9211824fd34cc6c76b6f5d6b8f1730, 0x4123de61856ae8ce8c8ee3d05f4bd7, 0x007381], + }, + BigNum { + limbs: [0x626ce47a1970433653bbc394e0194f, 0x0ed3d812e1900c2d1e5df0ba7ba08d, 0x001b07], + }, + BigNum { + limbs: [0x5b371e85e4ebbbc9ac443b6b1fe6b2, 0x987f518a9bb8270cb9aa18e75c64c6, 0x0058e6], + }, + BigNum { + limbs: [0xbf59d5e64bbfa343aac380bd084cf0, 0xe70b5e0ee5d8a20cb37113cdf8a9af, 0x00534e], + }, + BigNum { + limbs: [0xfe4a2d19b29c5bbc553c7e42f7b311, 0xc047cb8e976f912d2496f5d3df5ba3, 0x00209e], + }, + BigNum { + limbs: [0x597b23df05312f8c2af61a8141cd2a, 0x0fd36013a65e8edf76cab18f8a37c7, 0x0008f6], + }, + BigNum { + limbs: [0x6428df20f92acf73d509e47ebe32d7, 0x977fc989d6e9a45a613d58124dcd8c, 0x006af7], + }, + BigNum { + limbs: [0x18d8297cc221bdb5e7ec7507841320, 0x300ff31bf898416efa2f23e851d93e, 0x00315f], + }, + BigNum { + limbs: [0xa4cbd9833c3a414a181389f87bece1, 0x7743368184aff1caddd8e5b9862c15, 0x00428e], + }, + BigNum { + limbs: [0xb9cfa13c9e7075a60c85450b7b2f47, 0x6723c0c73b43c6b58ce353a65ae24f, 0x000185], + }, + BigNum { + limbs: [0x03d461c35feb8959f37ab9f484d0ba, 0x402f68d642046c844b24b5fb7d2304, 0x007268], + }, + BigNum { + limbs: [0x4aa8865b38d3fe56375852f503eab6, 0x0a59d3076a69a11bab9cdb76c9aa34, 0x002e1d], + }, + BigNum { + limbs: [0x72fb7ca4c58800a9c8a7ac0afc154b, 0x9cf9569612de921e2c6b2e2b0e5b1f, 0x0045d0], + }, + BigNum { + limbs: [0x2f158931e7234f34277686b037a511, 0x36a53627e337d86327fa50db777aaf, 0x003bff], + }, + BigNum { + limbs: [0x8e8e79ce1738afcbd889784fc85af0, 0x70adf3759a105ad6b00db8c6608aa4, 0x0037ee], + }, + BigNum { + limbs: [0x5b11f7e8d7950307379aa242bef13a, 0x854d6e4b49d1a48d5cc9eb4b326da6, 0x003cd9], + }, + BigNum { + limbs: [0x62920b1726c6fbf8c8655cbd410ec7, 0x2205bb5233768eac7b3e1e56a597ad, 0x003714], + }, + BigNum { + limbs: [0x74c9b15c2f6c8157b9d269efd0d9fd, 0x43d2741d83a4ffa6a4d8853dc711ed, 0x00349a], + }, + BigNum { + limbs: [0x48da51a3ceef7da8462d95102f2604, 0x6380b57ff9a33393332f846410f366, 0x003f53], + }, + BigNum { + limbs: [0x922dc33e3981ed211c46be69369843, 0x792481d33f84533665b7ea0775febc, 0x004a34], + }, + BigNum { + limbs: [0x2b763fc1c4da11dee3b94096c967be, 0x2e2ea7ca3dc3e00372501f9a620697, 0x0029b9], + }, + BigNum { + limbs: [0x6fa92e866fdb2fb08e0577296c2a24, 0xadb60d8a7bf7640ac08abd3c0874ce, 0x00699a], + }, + BigNum { + limbs: [0x4dfad4798e80cf4f71fa87d693d5dd, 0xf99d1c130150cf2f177d4c65cf9085, 0x000a52], + }, + BigNum { + limbs: [0x10bc93086722d6faa75e2409644896, 0x0d36010c2912e9b9971968377e8f23, 0x0045cc], + }, + BigNum { + limbs: [0xace76ff79739280558a1daf69bb76b, 0x9a1d28915435498040eea16a597630, 0x002e21], + }, + BigNum { + limbs: [0x12974aa30cb0dbc3ad07b8488f216a, 0x599a73b32821076027ac452fa314e7, 0x0027f8], + }, + BigNum { + limbs: [0xab0cb85cf1ab233c52f846b770de97, 0x4db8b5ea55272bd9b05bc47234f06c, 0x004bf5], + }, + BigNum { + limbs: [0x07c23f803514299fe2121c20b86988, 0xb000d89ab17c3ca13436f849d0c5b7, 0x0052a3], + }, + BigNum { + limbs: [0xb5e1c37fc947d5601dede2df479679, 0xf7525102cbcbf698a3d11158073f9c, 0x002149], + }, + BigNum { + limbs: [0x54efb0bc8d997ff0498fbd3aed65cf, 0xb926e96be027edd2c44927ecd41b3a, 0x0021f9], + }, + BigNum { + limbs: [0x68b4524370c27f0fb67041c5129a32, 0xee2c40319d20456713bee1b503ea19, 0x0051f3], + }, + BigNum { + limbs: [0xc33eff3b2e005d15c92e1aac022f7a, 0x03f06c32134406419d72de2d04da5c, 0x0038dd], + }, + BigNum { + limbs: [0xfa6503c4d05ba1ea36d1e453fdd087, 0xa362bd6b6a042cf83a952b74d32af6, 0x003b10], + }, + BigNum { + limbs: [0x35e832d903d52910fc77c70f6789eb, 0x025cc14be0ad31420245361de9b12f, 0x00575f], + }, + BigNum { + limbs: [0x87bbd026fa86d5ef038837f0987616, 0xa4f668519c9b01f7d5c2d383ee5424, 0x001c8e], + }, + BigNum { + limbs: [0xb7ab8507f3920122be1a8aba702c85, 0x25e3c9a4ab06a671d938712e096896, 0x0058b6], + }, + BigNum { + limbs: [0x05f87df80ac9fddd41e574458fd37c, 0x816f5ff8d2418cc7fecf9873ce9cbd, 0x001b37], + }, + BigNum { + limbs: [0x69be7aef4c8d1ef94c14f22139573f, 0x6f3cc7d42821defa95e48ec5f0df7f, 0x004e12], + }, + BigNum { + limbs: [0x53e58810b1cee006b3eb0cdec6a8c2, 0x381661c95526543f42237adbe725d4, 0x0025db], + }, + BigNum { + limbs: [0x743ad6e2d471f5c5266f7287443e47, 0x5f70d71d12f4ac20bd03516e01a536, 0x002adc], + }, + BigNum { + limbs: [0x49692c1d29ea093ad9908c78bbc1ba, 0x47e252806a5387191b04b833d6601d, 0x004911], + }, + BigNum { + limbs: [0x2c25c55d44a0cda2c7312172f024d5, 0x856c0c995405fcbdc0f7c531d5529a, 0x004d16], + }, + BigNum { + limbs: [0x917e3da2b9bb315d38cedd8d0fdb2c, 0x21e71d042942367c1710447002b2b9, 0x0026d7], + }, + BigNum { + limbs: [0x223e998d178fb680440e833ea39b55, 0x42b69828825b5da8aa10fae01e8c0c, 0x00181c], + }, + BigNum { + limbs: [0x9b656972e6cc487fbbf17bc15c64ac, 0x649c9174faecd5912df70ec1b97947, 0x005bd1], + }, + BigNum { + limbs: [0x10989d7476cf2bc1bf28a8007ab548, 0xeb7d5ee5004ffc6c81de8478b8e220, 0x002099], + }, + BigNum { + limbs: [0xad0b658b878cd33e40d756ff854ab9, 0xbbd5cab87cf836cd562985291f2333, 0x005353], + }, + BigNum { + limbs: [0x96d79f8a3e8e0b93b28aebc303f074, 0xc9102a942d517007277851e8aec9ea, 0x0024db], + }, + BigNum { + limbs: [0x26cc6375bfcdf36c4d75133cfc0f8d, 0xde42ff094ff6c332b08fb7b9293b69, 0x004f11], + }, + BigNum { + limbs: [0x472415b0f60defaa8f3f7b31a9d713, 0x5bb263c0e75edaf8ea26346303cc91, 0x00406e], + }, + BigNum { + limbs: [0x767fed4f084e0f5570c083ce5628ee, 0x4ba0c5dc95e95840ede1d53ed438c2, 0x00337f], + }, + BigNum { + limbs: [0x22c16ba307dd3aa0d0db6053a9a3e0, 0xe0b7bf8e8c0fd7bcbd2b9d03b8b2db, 0x000042], + }, + BigNum { + limbs: [0x9ae2975cf67ec45f2f249eac565c21, 0xc69b6a0ef1385b7d1adc6c9e1f5278, 0x0073aa], + }, + BigNum { + limbs: [0xd8f9f506885a4f1784febbb03b452f, 0xd0cbdf62af6ec9809d68741ff12a30, 0x000d36], + }, + BigNum { + limbs: [0xe4aa0df97601afe87b01434fc4bad2, 0xd6874a3acdd969b93a9f9581e6db22, 0x0066b6], + }, + BigNum { + limbs: [0x657d647e701c3bc1294eb7f2f2f66d, 0x076752b9400f5ae617b0fcc5dbf9ca, 0x002887], + }, + BigNum { + limbs: [0x58269e818e3fc33ed6b1470d0d0994, 0x9febd6e43d38d853c0570cdbfc0b89, 0x004b66], + }, + BigNum { + limbs: [0xf3dc40acfe2b7256cfcec9c01c3ffe, 0xdab0be5128d795d19d03d8fd323cf7, 0x0068f0], + }, + BigNum { + limbs: [0xc9c7c25300308ca93031353fe3c003, 0xcca26b4c54709d683b0430a4a5c85b, 0x000afc], + }, + BigNum { + limbs: [0x39c74778c695afde09673bab61e898, 0xdf77f041dc9735c1728a223969d1ee, 0x0013c8], + }, + BigNum { + limbs: [0x83dcbb8737c64f21f698c3549e1769, 0xc7db395ba0b0fd78657de7686e3365, 0x006024], + }, + BigNum { + limbs: [0x16c96bf3f6890a98d0402a397d3074, 0xa203d88e626925ff7d17d595046f32, 0x0057df], + }, + BigNum { + limbs: [0xa6da970c07d2f4672fbfd4c682cf8d, 0x054f510f1adf0d3a5af0340cd39621, 0x001c0e], + }, + BigNum { + limbs: [0xd286c9c7b2f3fd967bc7d5bce1a804, 0xdd564bbe5d15ce91a6d6efc2c7ca96, 0x007073], + }, + BigNum { + limbs: [0xeb1d39384b680169843829431e57fd, 0xc9fcdddf203264a8313119df103abc, 0x000379], + }, + BigNum { + limbs: [0xe540b9c586fcea58550848d0259347, 0xba723ff8c505df9d9a8301247105a2, 0x00046c], + }, + BigNum { + limbs: [0xd863493a775f14a7aaf7b62fda6cba, 0xece0e9a4b842539c3d85087d66ffb0, 0x006f80], + }, + BigNum { + limbs: [0x97ac9b42b5bc323c3e9892b876b461, 0xd6151fc5ce2e0c824958cba91b6f97, 0x001128], + }, + BigNum { + limbs: [0x25f767bd489fccc3c1676c47894ba0, 0xd13e09d7af1a26b78eaf3df8bc95bc, 0x0062c4], + }, + BigNum { + limbs: [0xe306b538773eb4b850d2a3eabf958f, 0x7355217fce074c0bb60b247d0d6499, 0x0033dc], + }, + BigNum { + limbs: [0xda9d4dc7871d4a47af2d5b15406a72, 0x33fe081daf40e72e21fce524caa0b9, 0x004011], + }, + BigNum { + limbs: [0xd5081bd50bfe8c49ab063c9866233a, 0x8d40c2ef982f0174fd293ff31fa487, 0x00546f], + }, + BigNum { + limbs: [0xe89be72af25d72b654f9c26799dcc7, 0x1a1266ade51931c4dadec9aeb860cb, 0x001f7e], + }, + BigNum { + limbs: [0xd4dd6fb2dd1c1cec4a327b5d6681f3, 0x978bf9dde4f2a890bb7866fb5680a5, 0x00421a], + }, + BigNum { + limbs: [0xe8c6934d213fe213b5cd83a2997e0e, 0x0fc72fbf98558aa91c8fa2a68184ad, 0x0031d3], + }, + BigNum { + limbs: [0x46e6e574bb0264650613937dec903a, 0xc4fdd5553c2b935c9c3ce1c6e9f013, 0x0004e9], + }, + BigNum { + limbs: [0x76bd1d8b43599a9af9ec6b82136fc7, 0xe2555448411c9fdd3bcb27daee1540, 0x006f03], + }, + BigNum { + limbs: [0x967c6423a55ee21c6f641f5ca11dfc, 0x2962daeacf09aac3e29a57a5f0d8ef, 0x0000f1], + }, + BigNum { + limbs: [0x27279edc58fd1ce3909bdfa35ee205, 0x7df04eb2ae3e8875f56db1fbe72c64, 0x0072fc], + }, + BigNum { + limbs: [0xa48d852fc35b7c3556faf3eba03702, 0x7d9f742f652cb5537e7ab5699d8e10, 0x000a28], + }, + BigNum { + limbs: [0x19167dd03b0082caa9050b145fc8ff, 0x29b3b56e181b7de6598d54383a7743, 0x0069c5], + }, + BigNum { + limbs: [0x4ece6e79d374f7694d7d44aa42aaf2, 0x25830d537d2afc0117e00180409d8d, 0x005c98], + }, + BigNum { + limbs: [0x6ed594862ae70796b282ba55bd550f, 0x81d01c4a001d3738c02808219767c6, 0x001755], + }, + BigNum { + limbs: [0xb02312ec12eeec6e8f66fbf9b79cc1, 0xb52abbca218662fa4f9250a0361b14, 0x002c94], + }, + BigNum { + limbs: [0x0d80f013eb6d129170990306486340, 0xf2286dd35bc1d03f8875b901a1ea3f, 0x004758], + }, + BigNum { + limbs: [0x06b58844f30ad2b5006d3e54988604, 0x08e682580ff68a3ffa39d11f260543, 0x0051cb], + }, + BigNum { + limbs: [0xb6ee7abb0b512c4aff92c0ab6779fd, 0x9e6ca7456d51a8f9ddce3882b20010, 0x002222], + }, + BigNum { + limbs: [0x07e8ac00ccd608596a75b117ddfba0, 0x1c78170c4872ed5d290fa2d313f10c, 0x0021a0], + }, + BigNum { + limbs: [0xb5bb56ff3185f6a6958a4de8220461, 0x8adb129134d545dcaef866cec41447, 0x00524d], + }, + BigNum { + limbs: [0x309873a10967a45beb4be6840f3104, 0xdee51318c6e47085da8a68d064ea95, 0x005b93], + }, + BigNum { + limbs: [0x8d0b8f5ef4f45aa414b4187bf0cefd, 0xc86e1684b663c2b3fd7da0d1731abe, 0x001859], + }, + BigNum { + limbs: [0x6bccfd4eb9f5f9bac25779bd028d08, 0x4c188b40510d4553ed07dd76774c14, 0x00204e], + }, + BigNum { + limbs: [0x51d705b1446605453da88542fd72f9, 0x5b3a9e5d2c3aede5eb002c2b60b93f, 0x00539f], + }, + BigNum { + limbs: [0x9cde21536c74fac14aa34c68accbfa, 0xacabe5adc2561160383ee23ed3ba6d, 0x0017a9], + }, + BigNum { + limbs: [0x20c5e1ac91e7043eb55cb297533407, 0xfaa743efbaf221d99fc92763044ae6, 0x005c43], + }, + BigNum { + limbs: [0x0e05ddcf13a22fbd9b29beb5d8cc55, 0x7f61fc62e2a94bc3a5672aa39e4215, 0x000c58], + }, + BigNum { + limbs: [0xaf9e2530eab9cf4264d6404a2733ac, 0x27f12d3a9a9ee77632a0defe39c33e, 0x006795], + }, + BigNum { + limbs: [0x375b2142604d30f4d7712a9f7e571c, 0xcab5043cc4f48ad290c1186b578186, 0x005b3c], + }, + BigNum { + limbs: [0x8648e1bd9e0ece0b288ed46081a8e5, 0xdc9e2560b853a8674746f1368083cd, 0x0018b0], + }, + BigNum { + limbs: [0x0d311f3cdb74b04dc26f175eaf57e2, 0x9930e7bfc55513a31b5c3e627cc654, 0x00000d], + }, + BigNum { + limbs: [0xb072e3c322e74eb23d90e7a150a81f, 0x0e2241ddb7f31f96bcabcb3f5b3eff, 0x0073e0], + }, + BigNum { + limbs: [0x0a9c3e533dc34f63482f5e6ac7f5ee, 0x67bf56026f1264f3c71a7fc4285c1b, 0x001ef8], + }, + BigNum { + limbs: [0xb307c4acc098af9cb7d0a095380a13, 0x3f93d39b0e35ce4610ed89ddafa938, 0x0054f5], + }, + BigNum { + limbs: [0xf4363b42e95eb239d9acde14fb20e2, 0xa43cfc49003d2e82c238e01af647d6, 0x0034fe], + }, + BigNum { + limbs: [0xc96dc7bd14fd4cc6265320eb04df1f, 0x03162d547d0b04b715cf2986e1bd7c, 0x003eef], + }, + BigNum { + limbs: [0x537def6e0f30f92345e2553f15b27d, 0x399fdefa8ddc87f3c352e16c5500fb, 0x005ae6], + }, + BigNum { + limbs: [0x6a261391ef2b05dcba1da9c0ea4d84, 0x6db34aa2ef6bab4614b52835830458, 0x001907], + }, + BigNum { + limbs: [0x2f5049b1d0e187821f241ffda547a5, 0x8f3a988966e051b31982d33b68de07, 0x000c4e], + }, + BigNum { + limbs: [0x8e53b94e2d7a777de0dbdf025ab85c, 0x181891141667e186be8536666f274c, 0x00679f], + }, + BigNum { + limbs: [0x0f2fa24cca7e118a23f8184f67be53, 0x33bf9e5c6e898b6d5abad78fbbc311, 0x005a94], + }, + BigNum { + limbs: [0xae7460b333dded75dc07e6b09841ae, 0x73938b410ebea7cc7d4d32121c4242, 0x001959], + }, + BigNum { + limbs: [0x58b769fd60bae85dd0ba3600c21ea9, 0xcba700d5638da68d1e587fd67f193c, 0x00442a], + }, + BigNum { + limbs: [0x64ec99029da116a22f45c8ff3de158, 0xdbac28c819ba8cacb9af89cb58ec17, 0x002fc2], + }, + BigNum { + limbs: [0x49a4ab02e82f769ee500f647f7d43b, 0xb7446f10658c06ede0897762f302e9, 0x003cc1], + }, + BigNum { + limbs: [0x73ff57fd162c88611aff08b8082bc6, 0xf00eba8d17bc2c4bf77e923ee5026a, 0x00372b], + }, + BigNum { + limbs: [0x511800ae1cf2a898a5dc3fa6a50014, 0x687779a20ce0b1eeadb86ec0a240a1, 0x000f9d], + }, + BigNum { + limbs: [0x6c8c0251e16956675a23bf595affed, 0x3edbaffb7067814b2a4f9ae135c4b2, 0x006450], + }, + BigNum { + limbs: [0xa29e201b732f6dad4c4a46f5409741, 0xb39452ab3a4709599704eba189b706, 0x0017f3], + }, + BigNum { + limbs: [0x1b05e2e48b2c9152b3b5b80abf68c0, 0xf3bed6f2430129e041031e004e4e4d, 0x005bf9], + }, + BigNum { + limbs: [0x8c90ec812879e1589db18082632470, 0x0d64d5746e14f108e29cdc4cf25ab0, 0x000bd7], + }, + BigNum { + limbs: [0x3113167ed5e21da7624e7e7d9cdb91, 0x99ee54290f334230f56b2d54e5aaa3, 0x006816], + }, + BigNum { + limbs: [0xe820d586118b4a5213a84b62a68904, 0x52bba176b0cf4add1ac0d9aa0cc9d8, 0x0046e3], + }, + BigNum { + limbs: [0xd5832d79ecd0b4adec57b39d5976fd, 0x54978826cc78e85cbd472ff7cb3b7a, 0x002d0a], + }, + BigNum { + limbs: [0x285991341c908ed897ab600af26a9f, 0x4729896b3e93c2aeac62b2b1175d52, 0x006743], + }, + BigNum { + limbs: [0x954a71cbe1cb702768549ef50d9562, 0x6029a0323eb4708b2ba556f0c0a801, 0x000caa], + }, + BigNum { + limbs: [0xee64f977b0bc8213b864a44525e8e4, 0x576fae62c2747e9d59a9016efb44e8, 0x001b4d], + }, + BigNum { + limbs: [0xcf3f09884d9f7cec479b5abada171d, 0x4fe37b3abad3b49c7e5f0832dcc06a, 0x0058a0], + }, + BigNum { + limbs: [0xbb530e72b7bfc3855fca21c045e849, 0x249e0bfc4d51cc64d8b824c354c377, 0x0023d3], + }, + BigNum { + limbs: [0x0250f48d469c3b7aa035dd3fba17b8, 0x82b51da12ff666d4ff4fe4de8341dc, 0x00501a], + }, + BigNum { + limbs: [0x82849fa29e943275fe4524a3df9914, 0x4787c92fb6003ec786b72669f55ce5, 0x00043f], + }, + BigNum { + limbs: [0x3b1f635d5fc7cc8a01bada5c2066ed, 0x5fcb606dc747f4725150e337e2a86e, 0x006fae], + }, + BigNum { + limbs: [0x6b6f86bf14aefcc2338ad83cdfa657, 0xb53f58ce81940a859ee7dfedce98f1, 0x005c9d], + }, + BigNum { + limbs: [0x52347c40e9ad023dcc7526c32059aa, 0xf213d0cefbb428b4392029b4096c62, 0x00174f], + }, + BigNum { + limbs: [0xdcf47128786d2189831ce42c6138b3, 0x498eb85e702360db58e449ef2a892a, 0x0003f6], + }, + BigNum { + limbs: [0xe0af91d785eedd767ce31ad39ec74e, 0x5dc4713f0d24d25e7f23bfb2ad7c28, 0x006ff7], + }, + BigNum { + limbs: [0xf89acd6211e66705b59d4d67e78267, 0x51a561f4691450c8d1e120be501af7, 0x003dde], + }, + BigNum { + limbs: [0xc509359dec7597fa4a62b198187d9a, 0x55adc7a91433e2710626e8e387ea5b, 0x00360f], + }, + BigNum { + limbs: [0x5c622bba78e96e62ad6e618cd63fc9, 0xe604e2122797b4fc5b308c0f64c4b1, 0x006f1b], + }, + BigNum { + limbs: [0x6141d7458572909d52919d7329c038, 0xc14e478b55b07e3d7cd77d927340a2, 0x0004d1], + }, + BigNum { + limbs: [0x7e9861925f3c85728b638faa490c47, 0x8f85d4bb9c9568fd174cc19863a83f, 0x001590], + }, + BigNum { + limbs: [0x3f0ba16d9f1f798d749c6f55b6f3ba, 0x17cd54e1e0b2ca3cc0bb4809745d14, 0x005e5d], + }, + BigNum { + limbs: [0x5cc1b32b2a1950ab93f25b2906d21a, 0x69a09d5aa6587cf3f6638899a0097e, 0x00671e], + }, + BigNum { + limbs: [0x60e24fd4d442ae546c0da3d6f92de7, 0x3db28c42d6efb645e1a4810837fbd5, 0x000ccf], + }, + BigNum { + limbs: [0xc8f5dd633013028cfda586295ea84b, 0x7cce960c7027f14b86bb7c12055e83, 0x003da0], + }, + BigNum { + limbs: [0xf4ae259cce48fc73025a78d6a157b6, 0x2a8493910d2041ee514c8d8fd2a6cf, 0x00364d], + }, + BigNum { + limbs: [0x71d0d9c1e612bd99b980c752953536, 0x26c472d9a268f3d2329d2bd130b8e7, 0x005126], + }, + BigNum { + limbs: [0x4bd3293e18494166467f37ad6acacb, 0x808eb6c3dadf3f67a56addd0a74c6c, 0x0022c7], + }, + BigNum { + limbs: [0x735dfec23461fb447108a871678206, 0x593fb2d1e4796f84312c4cd1ae75c2, 0x000d82], + }, + BigNum { + limbs: [0x4a46043dc9fa03bb8ef7568e987dfb, 0x4e1376cb98cec3b5a6dbbcd0298f91, 0x00666b], + }, + BigNum { + limbs: [0x29130b18a08ed66bb7b793ab94d67d, 0xd9b87eff068a96987520a4a84e5315, 0x006d86], + }, + BigNum { + limbs: [0x9490f7e75dcd289448486b546b2984, 0xcd9aaa9e76bd9ca162e764f989b23e, 0x000666], + }, + BigNum { + limbs: [0xefd6b0570bf109d58a5af42d010ff9, 0xb09858f43cef3ed6d55a6350721d79, 0x002f27], + }, + BigNum { + limbs: [0xcdcd52a8f26af52a75a50ad2fef008, 0xf6bad0a94058f46302ada65165e7d9, 0x0044c5], + }, + BigNum { + limbs: [0x977360b30175c52dbb2cf227158434, 0x2fe0ca12c0b44b70ca6708f3104867, 0x002318], + }, + BigNum { + limbs: [0x2630a24cfce639d244d30cd8ea7bcd, 0x77725f8abc93e7c90da100aec7bcec, 0x0050d5], + }, + BigNum { + limbs: [0x835c9ca817ed357b3354fe4df74d21, 0xa535477e1384fba967880c356fda5d, 0x006d52], + }, + BigNum { + limbs: [0x3a476657e66ec984ccab00b208b2e0, 0x021de21f69c33790707ffd6c682af6, 0x00069b], + }, + BigNum { + limbs: [0x62f50c1fa01a6ebf12d1967f5228c6, 0xcccb86887bc1090ea1eafe6cd3d6f0, 0x0021c7], + }, + BigNum { + limbs: [0x5aaef6e05e419040ed2e6880add73b, 0xda87a31501872a2b361d0b35042e63, 0x005225], + }, + BigNum { + limbs: [0x783e184f0f10da4ad463040bfa6b96, 0x89d9a062ba8ff6e0797726f231b176, 0x004b12], + }, + BigNum { + limbs: [0x4565eab0ef4b24b52b9cfaf405946b, 0x1d79893ac2b83c595e90e2afa653dd, 0x0028db], + }, + BigNum { + limbs: [0x7fcbf22df21291ca782131084255da, 0xb49750ddb83253aa8f5c166504001b, 0x002164], + }, + BigNum { + limbs: [0x3dd810d20c496d3587decdf7bdaa27, 0xf2bbd8bfc515df8f48abf33cd40538, 0x005288], + }, + BigNum { + limbs: [0xeea8827f4e9ec602b926b27753b127, 0xfbbd7f20c3ced966ea577b468e20b9, 0x004f0e], + }, + BigNum { + limbs: [0xcefb8080afbd38fd46d94c88ac4eda, 0xab95aa7cb97959d2edb08e5b49e499, 0x0024de], + }, + BigNum { + limbs: [0xa933db67c24c70716d094756b66d63, 0x1aa615b346f8ebad67ddc10c732ae8, 0x0004d2], + }, + BigNum { + limbs: [0x147027983c0f8e8e92f6b7a949929e, 0x8cad13ea364f478c702a489564da6b, 0x006f1b], + }, + BigNum { + limbs: [0xf79311d4603ebe660cb35a9fa42972, 0xdb65a3240463f4216b3d286b5f60ee, 0x000b7b], + }, + BigNum { + limbs: [0xc610f12b9e1d4099f34ca4605bd68f, 0xcbed867978e43f186ccae13678a464, 0x006871], + }, + BigNum { + limbs: [0xafc701df2ef92f02a3555fc5ee25f7, 0x471ca69edd738a2bb3e93d180d6310, 0x004751], + }, + BigNum { + limbs: [0x0ddd0120cf62cffd5caa9f3a11da0a, 0x603682fe9fd4a90e241ecc89caa243, 0x002c9c], + }, + BigNum { + limbs: [0x83b10a7188a75be4d08b3a9bd95dc2, 0xc0e837c5ea1d5fd7929a9439bb000a, 0x0012c1], + }, + BigNum { + limbs: [0x39f2f88e75b4a31b2f74c46426a23f, 0xe66af1d7932ad362456d75681d0549, 0x00612b], + }, + BigNum { + limbs: [0x40d6987940175aa503ad6c44bc5ff8, 0xb1e6bfb9702607fd3c97042f2373a4, 0x005a03], + }, + BigNum { + limbs: [0x7ccd6a86be44a45afc5292bb43a009, 0xf56c69e40d222b3c9b710572b491af, 0x0019e9], + }, + BigNum { + limbs: [0x9c55f6ffe871ea5ddbbc4e9b6615b8, 0x0415d906203d93cbbee466fd232897, 0x00005c], + }, + BigNum { + limbs: [0x214e0c0015ea14a22443b06499ea49, 0xa33d50975d0a9f6e1923a2a4b4dcbc, 0x007391], + }, + BigNum { + limbs: [0xd30122c843684408d2342a11db2c67, 0xe20c7f6c968c5058ca294459777599, 0x002c14], + }, + BigNum { + limbs: [0xeaa2e037baf3baf72dcbd4ee24d39a, 0xc546aa30e6bbe2e10ddec548608fb9, 0x0047d8], + }, + BigNum { + limbs: [0xcf9853c5492f70dbe2b6ae6a65e380, 0x4b4b630bd746efffb256ee28750441, 0x000c94], + }, + BigNum { + limbs: [0xee0baf3ab52c8e241d4950959a1c81, 0x5c07c691a601433a25b11b79630111, 0x006759], + }, + BigNum { + limbs: [0xa240a2a069113c159a067743cae6c5, 0xeb7f91a0d0a7f1d0c3c19d09cf9306, 0x00585a], + }, + BigNum { + limbs: [0x1b63605f954ac2ea65f987bc35193c, 0xbbd397fcaca0416914466c9808724d, 0x001b92], + }, + BigNum { + limbs: [0xc301f4f32087447899594a115b42ec, 0xa53a04150fa19233a27cfafd0e6ca8, 0x002e4c], + }, + BigNum { + limbs: [0xfaa20e0cddd4ba8766a6b4eea4bd15, 0x021925886da6a106358b0ea4c998aa, 0x0045a1], + }, + BigNum { + limbs: [0xb12fefba555a4c968b0decdd5c8bff, 0xbdc683722a25b401681bc0a21dae2e, 0x001c50], + }, + BigNum { + limbs: [0x0c741345a901b26974f21222a37402, 0xe98ca62b53227f386fec48ffba5725, 0x00579c], + }, + BigNum { + limbs: [0xefb15e20ddffa892cbd498b8ae4748, 0x2ca691fde3753d113105a6f6224cab, 0x0037a8], + }, + BigNum { + limbs: [0xcdf2a4df205c566d342b664751b8b9, 0x7aac979f99d2f628a70262abb5b8a7, 0x003c45], + }, + BigNum { + limbs: [0xde6c81def05707ddd48b53c0632b7f, 0xb79237478ed134868d055a78d4d127, 0x006482], + }, + BigNum { + limbs: [0xdf3781210e04f7222b74ab3f9cd482, 0xefc0f255ee76feb34b02af2903342b, 0x000f6a], + }, + BigNum { + limbs: [0x905e68e892d76597534a53351aeb21, 0xc2b7e09e88cf54c6bcf61242906281, 0x001c1b], + }, + BigNum { + limbs: [0x2d459a176b849968acb5abcae514e0, 0xe49b48fef478de731b11f75f47a2d2, 0x0057d1], + }, + BigNum { + limbs: [0x3059b2dacb997091e05fa34880ee67, 0xb79d4996ad5169ae844074894dab48, 0x002374], + }, + BigNum { + limbs: [0x8d4a502532c28e6e1fa05bb77f119a, 0xefb5e006cff6c98b53c795188a5a0b, 0x005078], + }, + BigNum { + limbs: [0x81a6284dfcdcdb79aca024dfa3bea6, 0x4cf83a91c028b44b584b898ea2487e, 0x0032af], + }, + BigNum { + limbs: [0x3bfddab2017f2386535fda205c415b, 0x5a5aef0bbd1f7eee7fbc801335bcd5, 0x00413e], + }, + BigNum { + limbs: [0xe255d810db7c7ba57428937e370687, 0x2e7f20b138794741d7afe1d1739af4, 0x004cf7], + }, + BigNum { + limbs: [0xdb4e2aef22df835a8bd76b81c8f97a, 0x78d408ec44ceebf8005827d0646a5e, 0x0026f6], + }, + BigNum { + limbs: [0x2a36904e65334d504798a56d84b81b, 0x4e6452d677424619a91495c55a387a, 0x001963], + }, + BigNum { + limbs: [0x936d72b19928b1afb86759927b47e6, 0x58eed6c70605ed202ef373dc7dccd9, 0x005a8a], + }, + BigNum { + limbs: [0x892679c5bf83b3bedbfaac558c8d18, 0xe9ac49520d3dc9997bf03a451a6630, 0x003754], + }, + BigNum { + limbs: [0x347d893a3ed84b41240552aa7372e9, 0xbda6e04b700a69a05c17cf5cbd9f23, 0x003c98], + }, + BigNum { + limbs: [0xf254f66ae5ee531c14292bf0255fd5, 0x1effcfc73d5c86252263d4232859d9, 0x00526e], + }, + BigNum { + limbs: [0xcb4f0c95186dabe3ebd6d30fdaa02c, 0x885359d63febad14b5a4357eafab79, 0x00217f], + }, + BigNum { + limbs: [0xe17e99d8256761f9a5ad12c1f3853f, 0x36423bc3f0fae23f188a9a547b7d01, 0x006a6d], + }, + BigNum { + limbs: [0xdc256927d8f49d065a52ec3e0c7ac2, 0x7110edd98c4d50fabf7d6f4d5c8851, 0x000980], + }, + BigNum { + limbs: [0x306689091abed321eed5418571ac33, 0x92d95a4ef11d7cddd189d0ec4d20a0, 0x000e3d], + }, + BigNum { + limbs: [0x8d3d79f6e39d2bde112abd7a8e53ce, 0x1479cf4e8c2ab65c067e38b58ae4b3, 0x0065b0], + }, + BigNum { + limbs: [0x3d1d54f8f2982de43fdb36bf47bcc3, 0xba63f2b18adc6f2e9e0b45136d4f1c, 0x006efb], + }, + BigNum { + limbs: [0x8086ae070bc3d11bc024c840b8433e, 0xecef36ebf26bc40b39fcc48e6ab637, 0x0004f1], + }, + BigNum { + limbs: [0x902f381368c0b10a873d6c9d82cbdd, 0x7b0015a2d0fe32712683cabe07344f, 0x0050ee], + }, + BigNum { + limbs: [0x2d74caec959b4df578c292627d3424, 0x2c5313faac4a00c8b1843ee3d0d104, 0x0022ff], + }, + BigNum { + limbs: [0xee61519e282a1877ab619f936cb9e1, 0xf2c40c622d5c14a79f3664b930f42d, 0x002e62], + }, + BigNum { + limbs: [0xcf42b161d631e688549e5f6c934620, 0xb48f1d3b4fec1e9238d1a4e8a71125, 0x00458a], + }, + BigNum { + limbs: [0xc4dccaecd1fbf5e4f8b0b094a83cb3, 0xa8ec3ef066195ec440a4e3fd2ea14c, 0x000539], + }, + BigNum { + limbs: [0xf8c738132c60091b074f4e6b57c34e, 0xfe66eaad172ed475976325a4a96406, 0x006eb3], + }, + BigNum { + limbs: [0xea27b86283f69cf28211eacc0710ff, 0x0a61fb4687169578008f160eb02032, 0x0016a8], + }, + BigNum { + limbs: [0xd37c4a9d7a65620d7dee1433f8ef02, 0x9cf12e56f6319dc1d778f39327e520, 0x005d45], + }, + BigNum { + limbs: [0x53ec9a4a2ac078308183f53cba4097, 0x9444ba3d2df9d017f9d3a6beb55f1f, 0x004fb9], + }, + BigNum { + limbs: [0x69b768b5d39b86cf7e7c09c345bf6a, 0x130e6f604f4e6321de3462e322a634, 0x002434], + }, + BigNum { + limbs: [0xd20df595f39f2afdc2fcf153ad903c, 0x2ece77c82d2c0c03b16ef100307a6e, 0x000d33], + }, + BigNum { + limbs: [0xeb960d6a0abcd4023d030dac526fc5, 0x7884b1d5501c2736269918a1a78ae4, 0x0066ba], + }, + BigNum { + limbs: [0x0ac6a330a41421f54ee691e0643777, 0x4f96d2ac9b3923c8d9e9259802f7d7, 0x002194], + }, + BigNum { + limbs: [0xb2dd5fcf5a47dd0ab1196d1f9bc88a, 0x57bc56f0e20f0f70fe1ee409d50d7c, 0x005259], + }, + BigNum { + limbs: [0x0e3d52802ba363eb2b24461b367723, 0x0dba5e260f57ac9e3e8ba3ed80a750, 0x006e68], + }, + BigNum { + limbs: [0xaf66b07fd2b89b14d4dbb8e4c988de, 0x9998cb776df0869b997c65b4575e03, 0x000585], + }, + BigNum { + limbs: [0xc786c39e8d76c168070ff63089758b, 0x4bf2fd4556aba449afd09e0b523b9a, 0x0047cd], + }, + BigNum { + limbs: [0xf61d3f6170e53d97f8f008cf768a76, 0x5b602c58269c8ef028376b9685c9b8, 0x002c20], + }, + BigNum { + limbs: [0x5b740bab2ae626b3a288e56cbe6ba2, 0x2ec9ee1056d93f5bdf1610b8e02c02, 0x0061be], + }, + BigNum { + limbs: [0x622ff754d375d84c5d77199341945f, 0x78893b8d266ef3ddf8f1f8e8f7d951, 0x00122f], + }, + BigNum { + limbs: [0xb2b4506b58821b9782d98e09dd2095, 0x1180e4201fdd09faded963276eda9c, 0x001717], + }, + BigNum { + limbs: [0x0aefb294a5d9e3687d2670f622df6c, 0x95d2457d5d6b293ef92ea67a692ab7, 0x005cd6], + }, + BigNum { + limbs: [0x59d09e36445b2c8d76f7be4ffbdf0c, 0x7d907dfec3418f3e53c99a199f8fa5, 0x005deb], + }, + BigNum { + limbs: [0x63d364c9ba00d272890840b00420f5, 0x29c2ab9eba06a3fb843e6f883875ae, 0x001602], + }, + BigNum { + limbs: [0x5abe13ab2a152efe228225b0b37c11, 0x78ed18c25162b9575235ed65ee9b01, 0x005681], + }, + BigNum { + limbs: [0x62e5ef54d446d001dd7dd94f4c83f0, 0x2e6610db2be579e285d21c3be96a52, 0x001d6c], + }, + BigNum { + limbs: [0xd8c7e12991d3593a7478c980a80dcd, 0xb7a1c70a28635fea4420d98de0ddff, 0x00077f], + }, + BigNum { + limbs: [0xe4dc21d66c88a5c58b87357f57f234, 0xefb1629354e4d34f93e73013f72753, 0x006c6d], + }, + BigNum { + limbs: [0xbe7f08f42eb31a40103db7fbe67596, 0x76187ee6c6269fbef78669ab90d7d8, 0x005cb3], + }, + BigNum { + limbs: [0xff24fa0bcfa8e4bfefc24704198a6b, 0x313aaab6b721937ae0819ff6472d7a, 0x00173a], + }, + BigNum { + limbs: [0x1234f45f84b51a2458759b86aa9b46, 0xbce4857298de5aa7436a8e41578bef, 0x001ade], + }, + BigNum { + limbs: [0xab6f0ea079a6e4dba78a63795564bb, 0xea6ea42ae469d892949d7b60807964, 0x00590e], + }, + BigNum { + limbs: [0xe8cb30c74f3496a5de0a8cb929b435, 0x7142c749358132565e4a3f276dddcf, 0x00263d], + }, + BigNum { + limbs: [0xd4d8d238af27685a21f57246d64bcc, 0x3610625447c700e379bdca7a6a2783, 0x004db0], + }, + BigNum { + limbs: [0xc06812fcc08500e1b3a80d3dc99e5a, 0xde2bae7c6bb687328292c58f0914fc, 0x000a7a], + }, + BigNum { + limbs: [0xfd3bf0033dd6fe1e4c57f1c23661a7, 0xc9277b211191ac0755754412cef056, 0x006972], + }, + BigNum { + limbs: [0xc8b17cc28f5b5914730aa651dc14c6, 0x0a2862c6b0aa7e00857f06f8f13093, 0x001dca], + }, + BigNum { + limbs: [0xf4f2863d6f00a5eb8cf558ae23eb3b, 0x9d2ac6d6cc9db539528902a8e6d4bf, 0x005623], + }, + BigNum { + limbs: [0x1230bc0e387e9558bd52e8fdf0f3fa, 0x0e85c8adf888bf4821c2f7e1d5e5bb, 0x003755], + }, + BigNum { + limbs: [0xab7346f1c5dd69a742ad16020f0c07, 0x98cd60ef84bf73f1b64511c0021f98, 0x003c98], + }, + BigNum { + limbs: [0xe24941616914e7ad110ef96d2c8b89, 0x2f2b1ea09b86b3e9ced3336c9ff439, 0x001bbc], + }, + BigNum { + limbs: [0xdb5ac19e95471752eef10592d37478, 0x78280afce1c17f500934d635381119, 0x005831], + }, + BigNum { + limbs: [0xb530ecbcf382bb730881f99cce2b05, 0x97b86edc1c02dfa201d28456bec63b, 0x00008a], + }, + BigNum { + limbs: [0x087316430ad9438cf77e056331d4fc, 0x0f9abac161455397d635854b193f18, 0x007363], + }, + BigNum { + limbs: [0xa7275730b5b11515f4e3caddb042a0, 0xf0a1a79dc567185006d5ff757c19fe, 0x0056c8], + }, + BigNum { + limbs: [0x167cabcf48aae9ea0b1c34224fbd61, 0xb6b181ffb7e11ae9d1320a2c5beb55, 0x001d24], + }, + BigNum { + limbs: [0x61b6a2481f0bc6f89b6e4cc3f8a8d9, 0xcbcfbfa6e1cac504800176c799853b, 0x005048], + }, + BigNum { + limbs: [0x5bed60b7df5038076491b23c075728, 0xdb8369f69b7d6e35580692da3e8018, 0x0023a4], + }, + BigNum { + limbs: [0x65dd758be92292d21af29fac91cf26, 0xf5feecd35328814b1382cf67a22cc2, 0x00503f], + }, + BigNum { + limbs: [0x57c68d7415396c2de50d5f536e30db, 0xb1543cca2a1fb1eec4853a3a35d891, 0x0023ad], + }, + BigNum { + limbs: [0x1f5a7f98a0d41d2fb01e7994ae9e07, 0x266275af949d1efef1ea963a619c6d, 0x007145], + }, + BigNum { + limbs: [0x9e4983675d87e1d04fe1856b5161fa, 0x80f0b3ede8ab143ae61d73677668e6, 0x0002a8], + }, + BigNum { + limbs: [0x8d78320cf0b1dc0bf6682a1f324c98, 0xd95c3d037697cca953c9a7d7135772, 0x004e04], + }, + BigNum { + limbs: [0x302bd0f30daa22f40997d4e0cdb369, 0xcdf6ec9a06b06690843e61cac4ade1, 0x0025e8], + }, + BigNum { + limbs: [0xab429c42218eea9d1a8d0cdf05b3f5, 0xba420ebae0ca2485088dcd0eedfd0f, 0x004571], + }, + BigNum { + limbs: [0x126166bddccd1462e572f220fa4c0c, 0xed111ae29c7e0eb4cf7a3c92ea0844, 0x002e7b], + }, + BigNum { + limbs: [0x8a07f9f945e0a8a970b4f3f6820606, 0xc78bdc342aafc2989b69d7031f283b, 0x003573], + }, + BigNum { + limbs: [0x339c0906b87b56568f4b0b097df9fb, 0xdfc74d69529870a13c9e329eb8dd18, 0x003e79], + }, + BigNum { + limbs: [0x17df56d813171c551a3d49cec26fff, 0xd46e142d366d1862d870c69ea23d3b, 0x0034df], + }, + BigNum { + limbs: [0xa5c4ac27eb44e2aae5c2b5313d9002, 0xd2e5157046db1ad6ff97430335c818, 0x003f0d], + }, + BigNum { + limbs: [0x71280f074d1440d341280e40f6ff69, 0x493dd2c18195b3d4f002ab14fce7d7, 0x003657], + }, + BigNum { + limbs: [0x4c7bf3f8b147be2cbed7f0bf090098, 0x5e1556dbfbb27f64e8055e8cdb1d7c, 0x003d96], + }, + BigNum { + limbs: [0x7d5dfa3a479c8e611337171217a856, 0x8a69cc191d70c9bffed16f4a90e9b9, 0x0023f6], + }, + BigNum { + limbs: [0x404608c5b6bf709eecc8e7ede857ab, 0x1ce95d845fd76979d9369a57471b9a, 0x004ff7], + }, + BigNum { + limbs: [0x2297d77e27dabdc088bdd905a55f21, 0xe5ba74ab8f7b7943135dbd04ce91ce, 0x000ec6], + }, + BigNum { + limbs: [0x9b0c2b81d681413f774225fa5aa0e0, 0xc198b4f1edccb9f6c4aa4c9d097385, 0x006526], + }, + BigNum { + limbs: [0x1780f66062d06efdbc5c8f8076051c, 0xff129029040c12f30d72abc32d1510, 0x002214], + }, + BigNum { + limbs: [0xa6230c9f9b8b900243a36f7f89fae5, 0xa8409974793c2046ca955ddeaaf043, 0x0051d8], + }, + BigNum { + limbs: [0xff74fc1738cfd4e640defe9c3d1988, 0x5f9a2cb148576539d6e7048fb70e71, 0x002be5], + }, + BigNum { + limbs: [0xbe2f06e8c58c2a19bf210063c2e679, 0x47b8fcec34f0ce000121051220f6e1, 0x004808], + }, + BigNum { + limbs: [0xfee0e9919be7eb242860ad1233361d, 0x51765816dd0870c5f64dfff44c0fe1, 0x005251], + }, + BigNum { + limbs: [0xbec3196e627413dbd79f51edccc9e4, 0x55dcd186a03fc273e1ba09ad8bf571, 0x00219c], + }, + BigNum { + limbs: [0x1d417ac2d72f8681deb3aea33c8449, 0xf5bec7ef45efbf9de97916504aabd2, 0x002801], + }, + BigNum { + limbs: [0xa062883d272c787e214c505cc37bb8, 0xb19461ae3758739bee8ef3518d5981, 0x004beb], + }, + BigNum { + limbs: [0xffd9cd43748cd07e797c34f167e1ae, 0xfb8721c1baed95f9167176d30171d8, 0x0032d0], + }, + BigNum { + limbs: [0xbdca35bc89cf2e818683ca0e981e53, 0xabcc07dbc25a9d40c19692ced6937a, 0x00411c], + }, + BigNum { + limbs: [0x46efcbd5cbd25bcdea20340e865edc, 0x5cf7ea7460e71bb5ebece92e50178a, 0x003bbb], + }, + BigNum { + limbs: [0x76b4372a3289a33215dfcaf179a125, 0x4a5b3f291c611783ec1b207387edc9, 0x003832], + }, + BigNum { + limbs: [0x1acd98fa4e19e15adb37a5ea82fe43, 0x64500bde4ae6b522fed010b950c90d, 0x0039b7], + }, + BigNum { + limbs: [0xa2d66a05b0421da524c859157d01be, 0x43031dbf32617e16d937f8e8873c46, 0x003a36], + }, + BigNum { + limbs: [0xf97bf1fe6c26fcec89f106fb90245c, 0xcc7b13e9ecf1b6504cd2a95cc231ba, 0x00707c], + }, + BigNum { + limbs: [0xc428110192350213760ef8046fdba5, 0xdad815b390567ce98b35604515d398, 0x000370], + }, + BigNum { + limbs: [0xb40031a396daed1d58d36d2887248a, 0xefd47eb0b490fb4b5fe309008ffb30, 0x0025d6], + }, + BigNum { + limbs: [0x09a3d15c678111e2a72c91d778db77, 0xb77eaaecc8b737ee782500a1480a23, 0x004e16], + }, + BigNum { + limbs: [0xb896192a36d9e94f4e49f4db97e1d9, 0x2ffe51ef6ac663a47e046c9d5d166c, 0x003fd0], + }, + BigNum { + limbs: [0x050de9d5c78215b0b1b60a24681e28, 0x7754d7ae1281cf955a039d047aeee7, 0x00341d], + }, + BigNum { + limbs: [0x3c79d13bd65d4193ca2d1bc7fd9263, 0x66ae43c4c3c56831575a9d83a15eb2, 0x003933], + }, + BigNum { + limbs: [0x812a31c427febd6c35d2e338026d9e, 0x40a4e5d8b982cb0880ad6c1e36a6a1, 0x003aba], + }, + BigNum { + limbs: [0x8534756de28ddf9c097282f8518c00, 0x2e85cd535086081a5545bd583161c8, 0x005fc4], + }, + BigNum { + limbs: [0x386f8d921bce1f63f68d7c07ae7401, 0x78cd5c4a2cc22b1f82c24c49a6a38b, 0x001429], + }, + BigNum { + limbs: [0x7ad52f8a5c627be96a0110191444de, 0xd5d6f7db3f4f0f669bb5886c3af4cb, 0x000753], + }, + BigNum { + limbs: [0x42ced375a1f9831695feeee6ebbb23, 0xd17c31c23df923d33c5281359d1088, 0x006c99], + }, + BigNum { + limbs: [0xfcbf4084f4f9b2c30b3c3647dd9723, 0x82a49d6b5c74782c1cd532b1b61313, 0x002b73], + }, + BigNum { + limbs: [0xc0e4c27b09624c3cf4c3c8b82268de, 0x24ae8c3220d3bb0dbb32d6f021f23f, 0x00487a], + }, + BigNum { + limbs: [0x5167b6e1c6e7094e396cf2c8808fc1, 0x2b3fd45a67f93cbcdfb94554c90356, 0x00403c], + }, + BigNum { + limbs: [0x6c3c4c1e3774f5b1c6930c377f7040, 0x7c135543154ef67cf84ec44d0f01fd, 0x0033b1], + }, + BigNum { + limbs: [0xaad9d1e07e8ad1c6704a19b8498e4c, 0x9a8e6f552967166e1d63d16fa4191b, 0x002cfc], + }, + BigNum { + limbs: [0x12ca311f7fd12d398fb5e547b671b5, 0x0cc4ba4853e11ccbbaa4383233ec38, 0x0046f1], + }, + BigNum { + limbs: [0xa6f095c3e393ea78bad60fe8295af1, 0x51570dd9c749cd846dedf76d82d68e, 0x0018f1], + }, + BigNum { + limbs: [0x16b36d3c1ac814874529ef17d6a510, 0x55fc1bc3b5fe65b56a1a1234552ec5, 0x005afc], + }, + BigNum { + limbs: [0xd4799a1030031151641d355ed74859, 0xa82ef937f7a8184e37dc8531cf3300, 0x005c33], + }, + BigNum { + limbs: [0xe92a68efce58edae9be2c9a128b7a8, 0xff24306585a01aeba02b847008d252, 0x0017b9], + }, + BigNum { + limbs: [0x9183dce28ef8014fe8d6d7c4afe0a9, 0xcfdf2f836149018debf684e68567f3, 0x002b70], + }, + BigNum { + limbs: [0x2c20261d6f63fdb01729273b501f58, 0xd773fa1a1bff31abec1184bb529d60, 0x00487c], + }, + BigNum { + limbs: [0x78921f813dbb183c71a7402ec2eed5, 0x4ad5a9709b098e4630618320a9220e, 0x0034ff], + }, + BigNum { + limbs: [0x4511e37ec0a0e6c38e58bed13d112c, 0x5c7d802ce23ea4f3a7a686812ee345, 0x003eee], + }, + BigNum { + limbs: [0xb104627af5b12aeb15f8b2e0dc45d1, 0xafb9f051dae05d758652dede4d953e, 0x005765], + }, + BigNum { + limbs: [0x0c9fa08508aad414ea074c1f23ba30, 0xf799394ba267d5c451b52ac38a7015, 0x001c87], + }, + BigNum { + limbs: [0x076c47c5c2c17969253d44de1e4d00, 0x18e25537e45a543a827b37d2ebc611, 0x000970], + }, + BigNum { + limbs: [0xb637bb3a3b9a8596dac2ba21e1b301, 0x8e70d46598eddeff558cd1ceec3f42, 0x006a7d], + }, + BigNum { + limbs: [0x1a77c155967b404f527ffbb148e55b, 0x124a85c2aa3222dad195f08db8c103, 0x004820], + }, + BigNum { + limbs: [0xa32c41aa67e0beb0ad80034eb71aa6, 0x9508a3dad316105f067219141f4450, 0x002bcd], + }, + BigNum { + limbs: [0x526ac238e5a0c5a70265e120dec41a, 0xb91dbc2c171b610f40689e8bdb7e85, 0x0054a2], + }, + BigNum { + limbs: [0x6b3940c718bb3958fd9a1ddf213be7, 0xee356d71662cd22a979f6b15fc86ce, 0x001f4a], + }, + BigNum { + limbs: [0xbc3f5982e5d13e52ac9853b184617d, 0xcfe5971c4e6c2818670f0f6e1efe30, 0x005db5], + }, + BigNum { + limbs: [0x0164a97d188ac0ad5367ab4e7b9e84, 0xd76d92812edc0b2170f8fa33b90723, 0x001637], + }, + BigNum { + limbs: [0xea190ee72171b5bf96906be310d83a, 0xb49f8ab5bb56e6d4fddaed19d920a7, 0x005edc], + }, + BigNum { + limbs: [0xd38af418dcea4940696f931cef27c7, 0xf2b39ee7c1f14c64da2d1c87fee4ab, 0x001510], + }, + BigNum { + limbs: [0x1ca7fc06a7652dce89d9caeca2788e, 0x41484cc523db20e2ed344c1f0d27dc, 0x006fb2], + }, + BigNum { + limbs: [0xa0fc06f956f6d131762634135d8773, 0x660adcd8596d1256ead3bd82cadd77, 0x00043b], + }, + BigNum { + limbs: [0x24ee69f08086a145b0c011142f943c, 0xbc8be1039af2e00b5ea72b0ce3cc51, 0x002f6b], + }, + BigNum { + limbs: [0x98b5990f7dd55dba4f3fedebd06bc5, 0xeac74899e255532e7960de94f43902, 0x004481], + }, + BigNum { + limbs: [0x4e43d7d4c8cc800c599e831e62b8d6, 0xfe6e13f0c70ec64b7d75ada9bc94dc, 0x0020c6], + }, + BigNum { + limbs: [0x6f602b2b358f7ef3a6617be19d472b, 0xa8e515acb6396cee5a925bf81b7077, 0x005326], + }, + BigNum { + limbs: [0xa4cf29a5781cc8b8f0b1427b5e42f8, 0x14f60f00b7cfd56abdc480f96f516e, 0x001acf], + }, + BigNum { + limbs: [0x18d4d95a863f36470f4ebc84a1bd09, 0x925d1a9cc5785dcf1a4388a868b3e5, 0x00591e], + }, + BigNum { + limbs: [0x860ca3e0b0c8cd0d2607b31e34bf62, 0x39b5bc3017ffbab6734e04debb058b, 0x0046b3], + }, + BigNum { + limbs: [0x37975f1f4d9331f2d9f84be1cb409f, 0x6d9d6d6d6548788364ba04c31cffc8, 0x002d3a], + }, + BigNum { + limbs: [0xaa0aa405432df6ef7fba47f56fb3d8, 0x3e710294f33c1a7756ed868ab15142, 0x005dc7], + }, + BigNum { + limbs: [0x13995efabb2e08108045b70a904c29, 0x68e227088a0c18c2811a831726b411, 0x001626], + }, + BigNum { + limbs: [0xe49f3bc59065cd5a9925b13969600f, 0x8418db7c8f6c07faa3df067d96a234, 0x0062b2], + }, + BigNum { + limbs: [0xd904c73a6df631a566da4dc6969ff2, 0x233a4e20eddc2b3f3429032441631e, 0x00113b], + }, + BigNum { + limbs: [0x08f69bb5a34d7a4d4166e5018414f8, 0x0bd90a98a833477c49bd9f429e3221, 0x006bd5], + }, + BigNum { + limbs: [0xb4ad674a5b0e84b2be9919fe7beb09, 0x9b7a1f04d514ebbd8e4a6a5f39d332, 0x000818], + }, + BigNum { + limbs: [0x858e55d4b05011c65654cc6e143494, 0x5f38c3c0928bc650a7b8aabc2c90b0, 0x00637a], + }, + BigNum { + limbs: [0x3815ad2b4e0bed39a9ab3291ebcb6d, 0x481a65dceabc6ce9304f5ee5ab74a3, 0x001073], + }, + BigNum { + limbs: [0x56451a0f2e97031e3ac422a3bebfce, 0x375f4d14b97ee1c87bd168b412c9dc, 0x0007ce], + }, + BigNum { + limbs: [0x675ee8f0cfc4fbe1c53bdc5c414033, 0x6ff3dc88c3c951715c36a0edc53b77, 0x006c1f], + }, + BigNum { + limbs: [0x203872ef16ad220269e1371ad9a322, 0x6fbb53c9f81b01ac67d632538bc740, 0x00731a], + }, + BigNum { + limbs: [0x9d6b9010e7aedcfd961ec7e5265cdf, 0x3797d5d3852d318d7031d74e4c3e13, 0x0000d3], + }, + BigNum { + limbs: [0x46ca8e879475036676bb13db1cfdd7, 0xb14784ed9323b84e3224c2e800f6bf, 0x0044df], + }, + BigNum { + limbs: [0x76d9747869e6fb998944eb24e3022a, 0xf60ba4afea247aeba5e346b9d70e94, 0x002f0d], + }, + BigNum { + limbs: [0x3f2f1cdac0bdd61490fae57a7c33a7, 0xe357b3f96e6d94c1b71405e3140b1f, 0x001189], + }, + BigNum { + limbs: [0x7e74e6253d9e28eb6f05198583cc5a, 0xc3fb75a40eda9e7820f403bec3fa34, 0x006263], + }, + BigNum { + limbs: [0x55ed36483309549cee4813c5113cae, 0x623b190ab7ecc0e1424947746063b4, 0x006bbf], + }, + BigNum { + limbs: [0x67b6ccb7cb52aa6311b7eb3aeec353, 0x45181092c55b725895bec22d77a19f, 0x00082e], + }, + BigNum { + limbs: [0x1b0f77f0d55ea106e039f68e5ab3dd, 0x860235a7434baffb53bd6eab1fa801, 0x003664], + }, + BigNum { + limbs: [0xa2948b0f28fd5df91fc60871a54c24, 0x2150f3f639fc833e844a9af6b85d52, 0x003d89], + }, + BigNum { + limbs: [0xe78026be2d5e7457717af258d76b50, 0xdacf4627bc5be4665ae77a4160334d, 0x000eeb], + }, + BigNum { + limbs: [0xd623dc41d0fd8aa88e850ca72894b1, 0xcc83e375c0ec4ed37d208f6077d205, 0x006501], + }, + BigNum { + limbs: [0x67bb8c3c1db6ea8505ca50e03d6419, 0x9cbef4cf3ede358ff43badf4f95a4a, 0x004340], + }, + BigNum { + limbs: [0x55e876c3e0a5147afa35ae1fc29be8, 0x0a9434ce3e69fda9e3cc5bacdeab09, 0x0030ad], + }, + BigNum { + limbs: [0x5f6b1fce35a767a42cef3b59936aca, 0x330034910c6106697712ede6bda93f, 0x006c0d], + }, + BigNum { + limbs: [0x5e38e331c8b4975bd310c3a66c9537, 0x7452f50c70e72cd060f51bbb1a5c14, 0x0007e0], + }, + BigNum { + limbs: [0x3a056f49df88978ecfab339e06cb5b, 0x2071f73b29bb76665151b4cb89bba9, 0x000d56], + }, + BigNum { + limbs: [0x839e93b61ed367713054cb61f934a6, 0x86e13262538cbcd386b654d64e49aa, 0x006697], + }, + BigNum { + limbs: [0xef2c4c46e3ffffcb692d0528f44414, 0xacccb9468e3c4282dc4972a3cca5fb, 0x0005ca], + }, + BigNum { + limbs: [0xce77b6b91a5bff3496d2f9d70bbbed, 0xfa867056ef0bf0b6fbbe96fe0b5f57, 0x006e22], + }, + BigNum { + limbs: [0x881eea9a94f19f18bb67ac498bb306, 0xdd3a18e8bc717109bb87546c7be526, 0x001055], + }, + BigNum { + limbs: [0x35851865696a5fe7449852b6744cfb, 0xca1910b4c0d6c2301c80b5355c202d, 0x006397], + }, + BigNum { + limbs: [0xa7f2c626b2e4def707a2d2027625b3, 0x9b9923940fc900b3afc1442ae9abaf, 0x006fa1], + }, + BigNum { + limbs: [0x15b13cd94b772008f85d2cfd89da4e, 0x0bba06096d7f32862846c576ee59a4, 0x00044c], + }, + BigNum { + limbs: [0x10558d9aa509ab0e5ae9a70d5d061a, 0xc356d0de01d48ff79d5e980fce6409, 0x004e6f], + }, + BigNum { + limbs: [0xad4e7565595253f1a51657f2a2f9e7, 0xe3fc58bf7b73a3423aa9719209a14a, 0x00257d], + }, + BigNum { + limbs: [0x23c188df7ce263b135c7a97914d377, 0x39349820411f5fc93aca2333a367b1, 0x0031d6], + }, + BigNum { + limbs: [0x99e27a2081799b4eca385586eb2c8a, 0x6e1e917d3c28d3709d3de66e349da2, 0x004217], + }, + BigNum { + limbs: [0x6246eaafa91200119436ea05caedb2, 0xfe0d05b931869a29e30166d46cc7b6, 0x004b5e], + }, + BigNum { + limbs: [0x5b5d18505549feee6bc914fa35124f, 0xa94623e44bc1990ff506a2cd6b3d9d, 0x00288e], + }, + BigNum { + limbs: [0x9d99175038716628f47d40e82d15bd, 0x093fd8cc8c196a702485b38d5808f4, 0x00713d], + }, + BigNum { + limbs: [0x200aebafc5ea98d70b82be17d2ea44, 0x9e1350d0f12ec8c9b38256147ffc5f, 0x0002b0], + }, + BigNum { + limbs: [0xeb780345d8d48e768d55926c7e753e, 0x99ddf792e5371ad4958bc9e7000449, 0x005664], + }, + BigNum { + limbs: [0xd22bffba2587708972aa6c93818ac3, 0x0d75320a98111865427c3fbad80109, 0x001d89], + }, + BigNum { + limbs: [0x252bfa132081f9d0568f04b84b2a00, 0x3359a03f722a55433db658105171ca, 0x00726e], + }, + BigNum { + limbs: [0x987808ecddda052fa970fa47b4d601, 0x73f9895e0b1dddf69a51b191869389, 0x00017f], + }, + BigNum { + limbs: [0x4430904a87ce25144f897786ee3fb6, 0x09193ddd55abe3de5d7d83eacc3d55, 0x002f75], + }, + BigNum { + limbs: [0x797372b5768dd9ebb076877911c04b, 0x9e39ebc0279c4f5b7a8a85b70bc7fe, 0x004478], + }, + BigNum { + limbs: [0xe4fb2dcb4d9f1a4a9ebdd727b87a2e, 0x2b3e89f62de6e60238fe7599d7ec10, 0x0062ab], + }, + BigNum { + limbs: [0xd8a8d534b0bce4b5614227d84785d3, 0x7c149fa74f614d379f099408001942, 0x001142], + }, + BigNum { + limbs: [0xd620293ae0ef1d9da284bedb2f43d0, 0x180a5114016f798c9348185b0382e2, 0x003b69], + }, + BigNum { + limbs: [0xe783d9c51d6ce1625d7b4024d0bc31, 0x8f48d8897bd8b9ad44bff146d48270, 0x003884], + }, + BigNum { + limbs: [0x6e4a6abf88d933719ae8985de5540a, 0x852ff0a7b43ffbb7a8b0d7b33af34c, 0x002eae], + }, + BigNum { + limbs: [0x4f5998407582cb8e651766a21aabf7, 0x222338f5c90837822f5731ee9d1207, 0x00453f], + }, + BigNum { + limbs: [0xcc886ec1f3ffe0d1b7b97da44a349a, 0x156b1645203e0188cbbb016cf2efe2, 0x006934], + }, + BigNum { + limbs: [0xf11b943e0a5c1e2e4846815bb5cb67, 0x91e813585d0a31b10c4d0834e51570, 0x000ab9], + }, + BigNum { + limbs: [0xa3311e69461863c932b24d441a3598, 0x4a6827f60d795efd1735c252faeb40, 0x0061aa], + }, + BigNum { + limbs: [0x1a72e496b8439b36cd4db1bbe5ca69, 0x5ceb01a76fced43cc0d2474edd1a13, 0x001243], + }, + BigNum { + limbs: [0x82345ac27d7e4868b67310ef09a9cb, 0x92f702edb6d0f2507c5f193db6176b, 0x00110f], + }, + BigNum { + limbs: [0x3b6fa83d80ddb697498cee10f65636, 0x145c26afc67740e95ba8f06421ede8, 0x0062de], + }, + BigNum { + limbs: [0xdb0f7c98858057112f96e2b0f9b3dd, 0x58e0c574d4f3d63057d2ac2decc1c8, 0x001a68], + }, + BigNum { + limbs: [0xe294866778dba7eed0691c4f064c24, 0x4e726428a8545d0980355d73eb438a, 0x005985], + }, + BigNum { + limbs: [0x8c7c2afe21b8d4c669d39e6258ef1e, 0x02a17e71df56bfb88204fb95d7509b, 0x001696], + }, + BigNum { + limbs: [0x3127d801dca32a39962c609da710e3, 0xa4b1ab2b9df1738156030e0c00b4b8, 0x005d57], + }, + BigNum { + limbs: [0x4b6eef836791e9f54098590590f97a, 0x18a877b7ab1d7cfa546e4bac4497c4, 0x002a75], + }, + BigNum { + limbs: [0x7235137c96ca150abf67a5fa6f0687, 0x8eaab1e5d22ab63f8399bdf5936d8f, 0x004978], + }, + BigNum { + limbs: [0xda57a2483dd819a0521ef18aeb112b, 0x741f3f8e164dd0c49746d9253f440e, 0x005928], + }, + BigNum { + limbs: [0xe34c60b7c083e55fade10d7514eed6, 0x3333ea0f66fa627540c1307c98c144, 0x001ac5], + }, + BigNum { + limbs: [0x6d9efa01c14d946eb5dc3197a8ef92, 0x93e8f9bde758fed2674d81d6135835, 0x001439], + }, + BigNum { + limbs: [0x500508fe3d0e6a914a23cd6857106f, 0x136a2fdf95ef346770ba87cbc4ad1e, 0x005fb4], + }, + BigNum { + limbs: [0x6b343de16bed11f7715c2b59ea6e61, 0x4bd44428726e555938660d5f1259af, 0x003451], + }, + BigNum { + limbs: [0x526fc51e926eed088ea3d3a61591a0, 0x5b7ee5750ad9dde09fa1fc42c5aba4, 0x003f9c], + }, + BigNum { + limbs: [0xd7adea656c88ebe1c73198fced09ec, 0x858f3343b72247e4ce45ae3b842b6b, 0x0004ba], + }, + BigNum { + limbs: [0xe5f6189a91d3131e38ce660312f615, 0x21c3f659c625eb5509c25b6653d9e7, 0x006f33], + }, + BigNum { + limbs: [0x4396812497c58b3d6e0eb2267582d7, 0x19f1fc6fe5a19f799a4ac31e134aad, 0x00342f], + }, + BigNum { + limbs: [0x7a0d81db669673c291f14cd98a7d2a, 0x8d612d2d97a693c03dbd4683c4baa6, 0x003fbe], + }, + BigNum { + limbs: [0x330ac33976577896e7cd165be118af, 0x513188184d1e47fe7c0925272dc385, 0x006c00], + }, + BigNum { + limbs: [0x8a993fc6880486691832e8a41ee752, 0x5621a1853029eb3b5bfee47aaa41ce, 0x0007ed], + }, + BigNum { + limbs: [0xb422e761321f21d09645fe30b61c23, 0x9970ea51b0e6b23e7b35ed24a1e5c7, 0x00395c], + }, + BigNum { + limbs: [0x09811b9ecc3cdd2f69ba00cf49e3de, 0x0de23f4bcc6180fb5cd21c7d361f8c, 0x003a91], + }, + BigNum { + limbs: [0x0b160cf2d6797490f41560b245b067, 0xffc2ee6b0313ed07699a98a0e39141, 0x004a5a], + }, + BigNum { + limbs: [0xb28df60d27e28a6f0bea9e4dba4f9a, 0xa7903b327a3446326e6d7100f47412, 0x002992], + }, + BigNum { + limbs: [0xaba6e2d7d140d91f7cc4829e8423a4, 0xb6b450e6f2baafc992e5de759fc13a, 0x002110], + }, + BigNum { + limbs: [0x11fd20282d1b25e0833b7c617bdc5d, 0xf09ed8b68a8d837045222b2c384419, 0x0052dc], + }, + BigNum { + limbs: [0xa01148af98688c508dd3077d60548f, 0x935af62d62298775e60c31411c7d36, 0x0013e9], + }, + BigNum { + limbs: [0x1d92ba5065f372af722cf7829fab72, 0x13f833701b1eabc3f1fbd860bb881d, 0x006004], + }, + BigNum { + limbs: [0xc7276b0e0087cc7eb1318aca4306de, 0x43d57eb232ec56fb40f6e0bf66906e, 0x004451], + }, + BigNum { + limbs: [0xf67c97f1fdd432814ece7435bcf923, 0x637daaeb4a5bdc3e971128e27174e4, 0x002f9c], + }, + BigNum { + limbs: [0xeba7f573b3b0edb038298303139ae1, 0xe4ce8328676baf6a10b22f3eda88c1, 0x001629], + }, + BigNum { + limbs: [0xd1fc0d8c4aab114fc7d67bfcec6520, 0xc284a67515dc83cfc755da62fd7c91, 0x005dc3], + }, + BigNum { + limbs: [0x9bcab0951254eec1d795605c9454e1, 0x4f1ed5f3daea6d94451f7d62139849, 0x0030d1], + }, + BigNum { + limbs: [0x21d9526aec07103e286a9ea36bab20, 0x583453a9a25dc5a592e88c3fc46d0a, 0x00431c], + }, + BigNum { + limbs: [0x015a142b676f214fde7e2d7a559fd3, 0x6fb6de21ab8a003f81fccd9c6817e5, 0x00083d], + }, + BigNum { + limbs: [0xbc49eed496ecddb02181d185aa602e, 0x379c4b7bd1be32fa560b3c056fed6e, 0x006bb0], + }, + BigNum { + limbs: [0xb05750b0757d9b1b525693c4fdf276, 0xa020a192f58550d8f5fae982ba3ffb, 0x006226], + }, + BigNum { + limbs: [0x0d4cb24f88de63e4ada96b3b020d8b, 0x0732880a87c2e260e20d201f1dc558, 0x0011c7], + }, + BigNum { + limbs: [0x9589c6d02e429124ca49ae2654cfed, 0x93b1dca7fd1456679d9af60081e614, 0x000055], + }, + BigNum { + limbs: [0x281a3c2fd0196ddb35b650d9ab3014, 0x13a14cf58033dcd23a6d13a1561f3f, 0x007398], + }, + BigNum { + limbs: [0xe5f85ddf3c1b5cb31a1acd9d26ce3c, 0x0c64c68dd203f81ab9316428dff763, 0x003505], + }, + BigNum { + limbs: [0xd7aba520c240a24ce5e53162d931c5, 0x9aee630fab443b1f1ed6a578f80def, 0x003ee8], + }, + BigNum { + limbs: [0xaa559c25a323066982caeaed4863fd, 0x51ff3b932efd9f1ca45610bea15005, 0x000405], + }, + BigNum { + limbs: [0x134e66da5b38f8967d351412b79c04, 0x5553ee0a4e4a941d33b1f8e336b54e, 0x006fe8], + }, + BigNum { + limbs: [0x7c55cac91b46847d77398fb0253409, 0x54aa601bd20e14bc524e83f5dfdf0a, 0x0018aa], + }, + BigNum { + limbs: [0x414e3836e3157a8288c66f4fdacbf8, 0x52a8c981ab3a1e7d85b985abf82649, 0x005b43], + }, + BigNum { + limbs: [0x72ebfd53689d24efb99d766acb5fd5, 0x53b4e3288a76fc3f7b8a3bd7c507c1, 0x0018af], + }, + BigNum { + limbs: [0x4ab805ac95beda104662889534a02c, 0x539e4674f2d136fa5c7dcdca12fd92, 0x005b3e], + }, + BigNum { + limbs: [0xfd1bdd35d3c9d1c6cbff4af2be3916, 0x1e437926a687585966d8d7855d16d5, 0x00274d], + }, + BigNum { + limbs: [0xc08825ca2a922d393400b40d41c6eb, 0x890fb076d6c0dae0712f321c7aee7d, 0x004ca0], + }, + BigNum { + limbs: [0xb77311aa5733c02e36541e5c44ddc4, 0xf70a9c158f6fb5fca7743791401f4b, 0x00649c], + }, + BigNum { + limbs: [0x0630f155a7283ed1c9abe0a3bb223d, 0xb0488d87edd87d3d3093d21097e608, 0x000f50], + }, + BigNum { + limbs: [0xbec17bd32d28f964b877880b7bd162, 0x1c8e1645a812d561eb297d716c3f6e, 0x004732], + }, + BigNum { + limbs: [0xfee2872cd133059b478876f4842e9f, 0x8ac51357d5355dd7ecde8c306bc5e4, 0x002cbb], + }, + BigNum { + limbs: [0x4b9abc640df6a92392180523c30faa, 0xccb911dcb1ae544edf064df058b8a6, 0x000b8b], + }, + BigNum { + limbs: [0x7209469bf06555dc6de7f9dc3cf057, 0xda9a17c0cb99deeaf901bbb17f4cad, 0x006861], + }, + BigNum { + limbs: [0x43fba07004bb352fb97ddcbb685b7e, 0xfb15e4fc1addd4df8ea0dd402af30b, 0x0016aa], + }, + BigNum { + limbs: [0x79a8628ff9a0c9d04682224497a483, 0xac3d44a1626a5e5a49672c61ad1248, 0x005d42], + }, + BigNum { + limbs: [0x56e2bbfada26463ad32c3398b4cb0a, 0xf0957745c50282acff8e98d64e22c9, 0x003095], + }, + BigNum { + limbs: [0x66c147052435b8c52cd3cb674b34f7, 0xb6bdb257b845b08cd87970cb89e28a, 0x004357], + }, + BigNum { + limbs: [0x31dfefa8056f0bb4ad409f0a9afc82, 0x9150327c8a8167c605fb4aa50a4642, 0x002e81], + }, + BigNum { + limbs: [0x8bc41357f8ecf34b52bf5ff565037f, 0x1602f720f2c6cb73d20cbefccdbf11, 0x00456c], + }, + BigNum { + limbs: [0xe90e9f0a64c08bc2c919362a37a2f5, 0x90bdf40839f0ea8ca59fb662da9e1f, 0x003872], + }, + BigNum { + limbs: [0xd49563f5999b733d36e6c8d5c85d0c, 0x16953595435748ad3268533efd6733, 0x003b7b], + }, + BigNum { + limbs: [0x071011023ca1f11813365f2e4dd33f, 0x63d9876c3af1054103abfd750fa7e3, 0x0073d8], + }, + BigNum { + limbs: [0xb693f1fdc1ba0de7ecc99fd1b22cc2, 0x4379a23142572df8d45c0c2cc85d70, 0x000015], + }, + BigNum { + limbs: [0x694ee83ae27a47bed39a0919fadbc3, 0x4a3b47df5caa2bdad7b86e55e1c1cc, 0x0030e6], + }, + BigNum { + limbs: [0x54551ac51be1b7412c65f5e605243e, 0x5d17e1be209e075f004f9b4bf64387, 0x004307], + }, + BigNum { + limbs: [0x5e55696d530d23c829d3b1ec72d08f, 0xc09602866dfdcaae5a41e711829dab, 0x003c1e], + }, + BigNum { + limbs: [0x5f4e9992ab4edb37d62c4d138d2f72, 0xe6bd27170f4a688b7dc622905567a8, 0x0037ce], + }, + BigNum { + limbs: [0x288cf2ea23bfefa96caf3ac3f8ba22, 0xb3275950a9f9c4441b6584b2104f8d, 0x00719f], + }, + BigNum { + limbs: [0x95171015da9c0f569350c43c0745df, 0xf42bd04cd34e6ef5bca284efc7b5c6, 0x00024d], + }, + BigNum { + limbs: [0x8bc3b8285c996dbad4d376d1513768, 0x7256e5b76cb3175f0352ab72b4f874, 0x005ebd], + }, + BigNum { + limbs: [0x31e04ad7a1c291452b2c882eaec899, 0x34fc43e610951bdad4b55e2f230cdf, 0x001530], + }, + BigNum { + limbs: [0x894a39cb116c525af67e8ae5be1bb2, 0x8c6cd36c4d58e020f6ea3ff00d743a, 0x00625d], + }, + BigNum { + limbs: [0x3459c934ecefaca50981741a41e44f, 0x1ae656312fef5318e11dc9b1ca9119, 0x001190], + }, + BigNum { + limbs: [0x25e1a5766d24382bb250f695030649, 0xd5ae6d99265b8f18e758585cbb43c1, 0x005977], + }, + BigNum { + limbs: [0x97c25d899137c6d44daf086afcf9b8, 0xd1a4bc0456eca420f0afb1451cc192, 0x001a75], + }, + BigNum { + limbs: [0x108a14b7c70a6ad26c4075ed336c51, 0x0b039e7a6793034fce3be69716022a, 0x0041dd], + }, + BigNum { + limbs: [0xad19ee483751942d93bf8912cc93b0, 0x9c4f8b2315b52fea09cc230ac20329, 0x003210], + }, + BigNum { + limbs: [0x73d08bc76ccf5ba34807979b0215f8, 0x672456cb0e4d663c27a5ae14f1c97c, 0x006b48], + }, + BigNum { + limbs: [0x49d37738918ca35cb7f86764fdea09, 0x402ed2d26efaccfdb0625b8ce63bd7, 0x0008a5], + }, + BigNum { + limbs: [0xb194d22c9353d04f23e87d934f1f96, 0xd299fff47a28674a00d694f09259c6, 0x006a55], + }, + BigNum { + limbs: [0x0c0f30d36b082eb0dc17816cb0e06b, 0xd4b929a9031fcbefd73174b145ab8d, 0x000997], + }, + BigNum { + limbs: [0xe60667a30dabcfb52e13c743b9975c, 0x9bbee3ad9bc81a5f72c6f875ee7602, 0x001460], + }, + BigNum { + limbs: [0xd79d9b5cf0b02f4ad1ec37bc4668a5, 0x0b9445efe18018da6541112be98f50, 0x005f8d], + }, + BigNum { + limbs: [0xab86dadb989e51f0cbebe282c25f67, 0x985bbe50fcdf18c268a03833d98497, 0x0007a0], + }, + BigNum { + limbs: [0x121d282465bdad0f34141c7d3da09a, 0x0ef76b4c80691a776f67d16dfe80bc, 0x006c4d], + }, + BigNum { + limbs: [0xda7702676dea396d79c4d11332d72d, 0x2e7430a3a2a093042049534a4e9515, 0x004eda], + }, + BigNum { + limbs: [0xe32d00989071c592863b2deccd28d4, 0x78def8f9daa7a035b7beb65789703d, 0x002513], + }, + BigNum { + limbs: [0x3fea587c4affedc04f2ce41153449c, 0x22a7edcf8fa76606557aaa616f7f58, 0x003eaa], + }, + BigNum { + limbs: [0x7db9aa83b35c113fb0d31aeeacbb65, 0x84ab3bcdeda0cd33828d5f406885fb, 0x003543], + }, + BigNum { + limbs: [0xd6197d6c736880f50cd1a8e4c2db19, 0x175965785290878d175aaf9256fc91, 0x003bdf], + }, + BigNum { + limbs: [0xe78a85938af37e0af32e561b3d24e8, 0x8ff9c4252ab7abacc0ad5a0f8108c1, 0x00380e], + }, + BigNum { + limbs: [0xd541ba86f98b53e4a9ecb7395b88da, 0xdd06325810ac9f0db723ad6706b7b6, 0x002288], + }, + BigNum { + limbs: [0xe862487904d0ab1b561347c6a47727, 0xca4cf7456c9b942c20e45c3ad14d9c, 0x005164], + }, + BigNum { + limbs: [0xea6811be9c622d4a838b5d59cd79e5, 0x1f1b5c49c83409f1ca610a08f16655, 0x006d03], + }, + BigNum { + limbs: [0xd33bf14161f9d1b57c74a1a632861c, 0x8837cd53b51429480da6ff98e69efd, 0x0006ea], + }, + BigNum { + limbs: [0x4e1e3ba38d57fa7de6ee5fb11c8691, 0xc39cc1085e035b0395f3cb50c20339, 0x000d8b], + }, + BigNum { + limbs: [0x6f85c75c7104048219119f4ee37970, 0xe3b668951f44d83642143e5116021a, 0x006661], + }, + BigNum { + limbs: [0x11bb5ed43415b6eaa3a247fac9045c, 0x8ce61b57c643fab4ad0b6127b0bdf5, 0x006200], + }, + BigNum { + limbs: [0xabe8a42bca4648155c5db70536fba5, 0x1a6d0e45b70438852afca87a27475e, 0x0011ed], + }, + BigNum { + limbs: [0x66edf951391e017027b8876a00b1dd, 0x16bac381fe479a73369f5b7b9fbd66, 0x00269e], + }, + BigNum { + limbs: [0x56b609aec53dfd8fd8477795ff4e24, 0x9098661b7f0098c6a168ae263847ed, 0x004d4f], + }, + BigNum { + limbs: [0x8d3bda72fe32ac556446a1e4c8b12c, 0xdecdc861cdd2ba3c1894e10b47bb26, 0x0070a1], + }, + BigNum { + limbs: [0x3068288d002952aa9bb95d1b374ed5, 0xc885613baf7578fdbf732896904a2d, 0x00034b], + }, + BigNum { + limbs: [0xc2aede9421fa9e20d9bfae30c1dd53, 0x261192cf65c5eb82149a7ac5fda4ff, 0x0041af], + }, + BigNum { + limbs: [0xfaf5246bdc6160df264050cf3e22ae, 0x814196ce178247b7c36d8edbda6053, 0x00323e], + }, + BigNum { + limbs: [0x39f3a6db6531cdca1cb78883b5501f, 0x26227262918465175978507ae3f87a, 0x00650f], + }, + BigNum { + limbs: [0x83b05c24992a3135e348767c4aafe2, 0x8130b73aebc3ce227e8fb926f40cd9, 0x000ede], + }, + BigNum { + limbs: [0xc37dd45f1728e7f0d65f4eb1657ebb, 0xcbf627e693d811320caaca8a58a05a, 0x005d7a], + }, + BigNum { + limbs: [0xfa262ea0e733170f29a0b04e9a8146, 0xdb5d01b6e9702207cb5d3f177f64f8, 0x001672], + }, + BigNum { + limbs: [0xf0213a7d775a248c5cb6eb5617be18, 0x3d8529f4a57d3684ca197cb9b2697e, 0x0032a6], + }, + BigNum { + limbs: [0xcd82c8828701da73a34913a9e841e9, 0x69cdffa8d7cafcb50dee8ce8259bd4, 0x004147], + }, + BigNum { + limbs: [0x28b34e361f477916846a9d93c59012, 0x68771297c5f5cab5e5b78e6a8640e0, 0x000bb8], + }, + BigNum { + limbs: [0x94f0b4c9df1485e97b95616c3a6fef, 0x3edc1705b7526883f2507b3751c473, 0x006835], + }, + BigNum { + limbs: [0x2fcc7b4c5132e44eade4f1a131233d, 0x24993436058950f7e263c54ee6a9b5, 0x0053e3], + }, + BigNum { + limbs: [0x8dd787b3ad291ab1521b0d5ecedcc4, 0x82b9f56777bee241f5a44452f15b9e, 0x00200a], + }, + BigNum { + limbs: [0xe3b4dbe22b4392311d3304db643695, 0x6c675105ced67e07f5abd08cc0fb81, 0x00118c], + }, + BigNum { + limbs: [0xd9ef271dd3186ccee2ccfa249bc96c, 0x3aebd897ae71b531e25c39151709d1, 0x006261], + }, + BigNum { + limbs: [0xf11efe066d096281a3dfb44cd7d165, 0x9692bcbb22f340a207f615ad60750f, 0x003157], + }, + BigNum { + limbs: [0xcc8504f991529c7e5c204ab3282e9c, 0x10c06ce25a54f297d011f3f4779043, 0x004296], + }, + BigNum { + limbs: [0xdcb69c52a4e2ed82c4a6de94c8bf96, 0xadb5b738776bd7f6723b1e2ff13929, 0x0005c6], + }, + BigNum { + limbs: [0xe0ed66ad5979117d3b59206b37406b, 0xf99d726505dc5b4365cceb71e6cc29, 0x006e26], + }, + BigNum { + limbs: [0xbdddcc8bf7cd9ed4857eba4432963c, 0xae7241f1a002af8f5d5d7f44857a7f, 0x001987], + }, + BigNum { + limbs: [0xffc63674068e602b7a8144bbcd69c5, 0xf8e0e7abdd4583aa7aaa8a5d528ad3, 0x005a65], + }, + BigNum { + limbs: [0x403fec5dd82b2b02f99d83bd109f22, 0xad7b8eb369ebc5844282de960e20ea, 0x004e19], + }, + BigNum { + limbs: [0x7d6416a22630d3fd06627b42ef60df, 0xf9d79aea135c6db595852b0bc9e469, 0x0025d3], + }, + BigNum { + limbs: [0x667871334f5a17c81450fbaf4bac63, 0x8c39463268f3eff98a4b7b39d85563, 0x0054d1], + }, + BigNum { + limbs: [0x572b91ccaf01e737ebaf0350b4539e, 0x1b19e36b145443404dbc8e67ffaff0, 0x001f1c], + }, + BigNum { + limbs: [0xe5f786d3627dca98b3217a2417eb91, 0x2b1650a62e0d01d8396db702f1cebe, 0x007322], + }, + BigNum { + limbs: [0xd7ac7c2c9bde34674cde84dbe81470, 0x7c3cd8f74f3b31619e9a529ee63694, 0x0000cb], + }, + BigNum { + limbs: [0x14442a81d5dacf112f0e1c1ea12f87, 0x8dc193c234980989fd6dc601cf00dc, 0x0039df], + }, + BigNum { + limbs: [0xa95fd87e28812feed0f1e2e15ed07a, 0x199195db48b029afda9a43a0090477, 0x003a0e], + }, + BigNum { + limbs: [0x921cee975fa0e584ce4ae1e892a3c5, 0xc62efbed2b5cecef70db4531b7f32d, 0x000c2f], + }, + BigNum { + limbs: [0x2b8714689ebb197b31b51d176d5c3c, 0xe1242db051eb464a672cc470201226, 0x0067bd], + }, + BigNum { + limbs: [0x80e62a591e130ddff868f0a741ce9b, 0x73617687ce3861a1cbdaf40353ac4d, 0x005d2b], + }, + BigNum { + limbs: [0x3cbdd8a6e048f12007970e58be3166, 0x33f1b315af0fd1980c2d159e845906, 0x0016c2], + }, + BigNum { + limbs: [0xbebbfef511cfe3de78900fcc779e4b, 0x5e5d2d844e5ab78ecd7e8bbf2f114f, 0x004cc8], + }, + BigNum { + limbs: [0xfee8040aec8c1b21876fef338861b6, 0x48f5fc192eed7bab0a897de2a8f403, 0x002725], + }, + BigNum { + limbs: [0xfb644fa915d933a7364690463b8c5a, 0x3da87aae9f28ef0fa6840d0fb03214, 0x0035f4], + }, + BigNum { + limbs: [0xc23fb356e882cb58c9b96eb9c473a7, 0x69aaaeeede1f442a3183fc9227d33e, 0x003df9], + }, + BigNum { + limbs: [0x291078c0516e965d1f8871ac8e55dd, 0xd8a29031fa3b19ae5ba085ac0ef4a6, 0x005a92], + }, + BigNum { + limbs: [0x94938a3faced68a2e0778d5371aa24, 0xceb0996b830d198b7c6783f5c910ad, 0x00195a], + }, + BigNum { + limbs: [0xbe569a3a31f165c75c815f425cadf6, 0x91d2ea1bb63a6725ce5bff1ee40056, 0x003c67], + }, + BigNum { + limbs: [0xff4d68c5cc6a9938a37e9fbda3520b, 0x15803f81c70dcc1409ac0a82f404fc, 0x003786], + }, + BigNum { + limbs: [0xd4e8f014ba143af233e178fcd9035e, 0x187a05e3c16ef03e7c1f872a7e3d16, 0x007309], + }, + BigNum { + limbs: [0xe8bb12eb4447c40dcc1e860326fca3, 0x8ed923b9bbd942fb5be8827759c83c, 0x0000e4], + }, + BigNum { + limbs: [0x72c83deac35889a527d24cb6033b6d, 0x8dae310a1c6ed27159d1f41e8ecf38, 0x002a77], + }, + BigNum { + limbs: [0x4adbc5153b03755ad82db249fcc494, 0x19a4f89360d960c87e36158349361b, 0x004976], + }, + BigNum { + limbs: [0xed383bd6c47164f0f4a28beafd4b05, 0xfe95f6cd1c5ae51f8b3c2f31b064ca, 0x004b19], + }, + BigNum { + limbs: [0xd06bc72939ea9a0f0b5d731502b4fc, 0xa8bd32d060ed4e1a4ccbda7027a088, 0x0028d3], + }, + BigNum { + limbs: [0xc2af4e8c17ec9b12d6d2603dee0fe2, 0xaffd6163c6457b489fed890fd8e5be, 0x0055b0], + }, + BigNum { + limbs: [0xfaf4b473e66f63ed292d9ec211f01f, 0xf755c839b702b7f1381a8091ff1f94, 0x001e3c], + }, + BigNum { + limbs: [0x9902e6b674cd83c44a9dee0b94bba2, 0xe168decf4b8ed4289398be82882966, 0x001896], + }, + BigNum { + limbs: [0x24a11c49898e7b3bb56210f46b445f, 0xc5ea4ace31b95f11446f4b1f4fdbed, 0x005b56], + }, + BigNum { + limbs: [0x4e45ae2b0e3452a4529d1d508d95fc, 0x7722bad2894e16b2203d6eb58db41f, 0x0033f1], + }, + BigNum { + limbs: [0x6f5e54d4f027ac5bad62e1af726a05, 0x30306ecaf3fa1c87b7ca9aec4a5134, 0x003ffc], + }, + BigNum { + limbs: [0x37da9fd247b74cb41071ef7f2aea85, 0x217231241ba8cb044aeeeef2e88ea4, 0x003467], + }, + BigNum { + limbs: [0x85c9632db6a4b24bef8e0f80d5157c, 0x85e0f879619f68358d191aaeef76af, 0x003f86], + }, + BigNum { + limbs: [0x3f627cef182bf8f6139aa4696affcb, 0x10ac5d53a149416469b17618f6a047, 0x005364], + }, + BigNum { + limbs: [0x7e418610e6300609ec655a96950036, 0x96a6cc49dbfef1d56e569388e1650c, 0x002089], + }, + BigNum { + limbs: [0x7e981b72650bfeff3159bca6f143eb, 0xfc526f7aaa2242fa324ea12a7d5c51, 0x0011d4], + }, + BigNum { + limbs: [0x3f0be78d99500000cea642590ebc16, 0xab00ba22d325f03fa5b968775aa902, 0x006218], + }, + BigNum { + limbs: [0xd355e9996feaa77dfbd1f922488ad7, 0xb0058ff22890469a4cefef1ddd319e, 0x005848], + }, + BigNum { + limbs: [0xea4e19668e715782042e05ddb7752a, 0xf74d99ab54b7ec9f8b181a83fad3b4, 0x001ba4], + }, + BigNum { + limbs: [0x71709889e0167d409fadc1390c215b, 0x74aa326c7001fa831c8ac096dad4f9, 0x00693f], + }, + BigNum { + limbs: [0x4c336a761e4581bf60523dc6f3dea6, 0x32a8f7310d4638b6bb7d490afd305a, 0x000aae], + }, + BigNum { + limbs: [0x7f3c55e68a9ebe67f8591eaace97e5, 0x36a927134e53d5de7528fa90299f94, 0x000767], + }, + BigNum { + limbs: [0x3e67ad1973bd409807a6e05531681c, 0x70aa028a2ef45d5b62df0f11ae65bf, 0x006c86], + }, + BigNum { + limbs: [0xd68c4e218d617df86a5774c5ddad45, 0x3791051adf2dcf04d9abd55a75fca8, 0x00056b], + }, + BigNum { + limbs: [0xe717b4de70fa810795a88a3a2252bc, 0x6fc224829e1a6434fe5c34476208aa, 0x006e82], + }, + BigNum { + limbs: [0x7b2013f325133a921b388995bea7fd, 0x97cf9f1de049dea2d37f97aa42f19b, 0x001305], + }, + BigNum { + limbs: [0x4283ef0cd948c46de4c7756a415804, 0x0f838a7f9cfe5497048871f79513b8, 0x0060e8], + }, + BigNum { + limbs: [0x8ab8dd1277fe748ac4ce96c05922c8, 0x10e56eefef4251ebd9d921306ed45a, 0x005d42], + }, + BigNum { + limbs: [0x32eb25ed865d8a753b31683fa6dd39, 0x966dbaad8e05e14dfe2ee8716930f9, 0x0016ab], + }, + BigNum { + limbs: [0x0a4f7342f02550b7dd369ee24a4b2c, 0xfee53953c53b0cfcf5e4fb20e3fa23, 0x0006c4], + }, + BigNum { + limbs: [0xb3548fbd0e36ae4822c9601db5b4d5, 0xa86df049b80d263ce2230e80f40b30, 0x006d28], + }, + BigNum { + limbs: [0x7d50a297e01b9f76128ae4a4ec03cc, 0x48ee592217168094228f05f9a5f7b1, 0x0003cd], + }, + BigNum { + limbs: [0x405360681e405f89ed751a5b13fc35, 0x5e64d07b6631b2a5b57903a8320da2, 0x007020], + }, + BigNum { + limbs: [0x15ef3ee3ffc51b88fd3eb853540a9b, 0x0703b0d3a24c6f57d8c0bf34a21c9a, 0x001d2d], + }, + BigNum { + limbs: [0xa7b4c41bfe96e37702c146acabf566, 0xa04f78c9dafbc3e1ff474a6d35e8b9, 0x0056c0], + }, + BigNum { + limbs: [0xa0e87e3224359144dd54d2b5c75587, 0x4ac46b49ad06003051d8ebe9cfeefb, 0x003126], + }, + BigNum { + limbs: [0x1cbb84cdda266dbb22ab2c4a38aa7a, 0x5c8ebe53d0423309862f1db8081658, 0x0042c7], + }, + BigNum { + limbs: [0x8b986d29b33eb5f0def2eff45786de, 0xc59e71fd63b2bf1d7ff3348ecd758b, 0x0040be], + }, + BigNum { + limbs: [0x320b95d64b1d490f210d0f0ba87923, 0xe1b4b7a01995741c5814d5130a8fc8, 0x00332e], + }, + BigNum { + limbs: [0x99b19c7bca6174d7162d9719890f64, 0x9b45fa34b0b61f0b2d8c094d642020, 0x003b30], + }, + BigNum { + limbs: [0x23f2668433fa8a28e9d267e676f09d, 0x0c0d2f68cc92142eaa7c005473e533, 0x0038bd], + }, + BigNum { + limbs: [0xd107902335e8b13bda35e579e11aaf, 0x059e6e34b922e5757ecbd6781b5e62, 0x002ec2], + }, + BigNum { + limbs: [0xec9c72dcc8734dc425ca19861ee552, 0xa1b4bb68c4254dc4593c3329bca6f0, 0x00452b], + }, + BigNum { + limbs: [0x9e3c15394e6e1b208b52545e33565a, 0x494ae6fc135c86b8d15bf3d84bec66, 0x00191b], + }, + BigNum { + limbs: [0x1f67edc6afede3df74adaaa1cca9a7, 0x5e0842a169ebac8106ac15c98c18ed, 0x005ad2], + }, + BigNum { + limbs: [0x7d4b44384d28349ae50103d6566c65, 0x9d381a6230d31aa9d7cb35b628a6c7, 0x0057ad], + }, + BigNum { + limbs: [0x4058bec7b133ca651afefb29a9939c, 0x0a1b0f3b4c751890003cd3ebaf5e8c, 0x001c40], + }, + BigNum { + limbs: [0x86f87457e8d83a3e453abe1c7e3711, 0x8ca8ab8a88de4e6c5a7b26d84725a4, 0x005162], + }, + BigNum { + limbs: [0x36ab8ea81583c4c1bac540e381c8f0, 0x1aaa7e12f469e4cd7d8ce2c990dfaf, 0x00228b], + }, + BigNum { + limbs: [0xf1a3f8ee19dbd5ae0de328241583d7, 0xf540ec8a19daeeda67854d1fd03c74, 0x00330b], + }, + BigNum { + limbs: [0xcc000a11e4802951f21cd6dbea7c2a, 0xb2123d13636d445f7082bc8207c8de, 0x0040e1], + }, + BigNum { + limbs: [0x7f4a71e8149069d29f8a66433e17c6, 0x9b28721e8abbc3e8f9d6b214dd6309, 0x001c12], + }, + BigNum { + limbs: [0x3e599117e9cb952d607598bcc1e83b, 0x0c2ab77ef28c6f50de31578cfaa24a, 0x0057db], + }, + BigNum { + limbs: [0xa60a12a7fafe3326945a8982257a8c, 0x56b1edc476b1082be230899d88c0b8, 0x002d3f], + }, + BigNum { + limbs: [0x1799f058035dcbd96ba5757dda8575, 0x50a13bd906972b0df5d780044f449b, 0x0046ae], + }, + BigNum { + limbs: [0xeb5269e06340da74ad6f23b8331b7d, 0x812e1d221ea3c3d27fdf06de69822a, 0x00081d], + }, + BigNum { + limbs: [0xd251991f9b1b248b5290db47cce484, 0x26250c7b5ea46f67582902c36e8328, 0x006bd0], + }, + BigNum { + limbs: [0x5d72906ae5974656402311a3c88c0d, 0x20bdebb8c529b77a75fbc3e63a6bd7, 0x0060c5], + }, + BigNum { + limbs: [0x6031729518c4b8a9bfdced5c3773f4, 0x86953de4b81e7bbf620c45bb9d997c, 0x001328], + }, + BigNum { + limbs: [0x8ae0d36eaa8ceeb0ec520770f54dd3, 0x051ba804583083d632fb1caac7277b, 0x005e0e], + }, + BigNum { + limbs: [0x32c32f9153cf104f13adf78f0ab22e, 0xa23781992517af63a50cecf710ddd8, 0x0015df], + }, + BigNum { + limbs: [0x70ca1a6b232d5316951ae5ab0e6a4c, 0x0e9a156bfcdfe7a10eedb8e7072c92, 0x000599], + }, + BigNum { + limbs: [0x4cd9e894db2eabe96ae51954f195b5, 0x98b9143180684b98c91a50bad0d8c1, 0x006e54], + }, + BigNum { + limbs: [0x0f8c6a786fe9e866941a14b23a4155, 0x871fec91df9e50d66999b7f71ecb85, 0x00260d], + }, + BigNum { + limbs: [0xae1798878e7216996be5ea4dc5beac, 0x20333d0b9da9e2636e6e51aab939ce, 0x004de0], + }, + BigNum { + limbs: [0x728f805725223905648a06d5bf4779, 0x9f15f40745862c463c0f6c15f45234, 0x000eac], + }, + BigNum { + limbs: [0x4b1482a8d939c5fa9b75f82a40b888, 0x083d359637c206f39bf89d8be3b31f, 0x006541], + }, + BigNum { + limbs: [0xb10938a76e2590378e47a78cb232a2, 0x99c93e92dfca58c7a298d7828572ca, 0x000550], + }, + BigNum { + limbs: [0x0c9aca5890366ec871b857734dcd5f, 0x0d89eb0a9d7dda72356f321f529289, 0x006e9d], + }, + BigNum { + limbs: [0xe83b231555ac35ead6a82181c19293, 0xa2397a7ac4814435fb53a4ff017529, 0x001f23], + }, + BigNum { + limbs: [0xd568dfeaa8afc9152957dd7e3e6d6e, 0x0519af22b8c6ef03dcb464a2d69029, 0x0054ca], + }, + BigNum { + limbs: [0x6f49efba092206bec4af45a3dd836a, 0x8a349d98ba5804e0a5947115d93a2f, 0x005569], + }, + BigNum { + limbs: [0x4e5a1345f539f8413b50b95c227c97, 0x1d1e8c04c2f02e593273988bfecb24, 0x001e84], + }, + BigNum { + limbs: [0x1b702ad51911966e554ba438256c09, 0x4d7122d117efeb680de72cff169011, 0x006daa], + }, + BigNum { + limbs: [0xa233d82ae54a6891aab45ac7da93f8, 0x59e206cc655847d1ca20dca2c17542, 0x000643], + }, + BigNum { + limbs: [0x3bc1e33db1fabde67e9726e2110a9f, 0x5bf26247526e599fab5a4a1e19cff4, 0x0047a4], + }, + BigNum { + limbs: [0x81e21fc24c6141198168d81deef562, 0x4b60c7562ad9d99a2cadbf83be355f, 0x002c49], + }, + BigNum { + limbs: [0x92dc9c9ab9a192a42416165d386af9, 0x2e6ad1aa805d875c182d7bfe77cc17, 0x0035b9], + }, + BigNum { + limbs: [0x2ac7666544ba6c5bdbe9e8a2c79508, 0x78e857f2fceaabddbfda8da360393c, 0x003e34], + }, + BigNum { + limbs: [0xdbf9d401389e118356c2dfd4542a7e, 0x1beb3356e7eac8b5c49358e42cc261, 0x005d40], + }, + BigNum { + limbs: [0xe1aa2efec5bded7ca93d1f2babd583, 0x8b67f646955d6a841374b0bdab42f1, 0x0016ad], + }, + BigNum { + limbs: [0xde093f86dc82aee638c24bfb618f3f, 0xcc695696e15f33b6703722957141dc, 0x004b57], + }, + BigNum { + limbs: [0xdf9ac37921d95019c73db3049e70c2, 0xdae9d3069be8ff8367d0e70c66c376, 0x002895], + }, + BigNum { + limbs: [0x43cf43b8a4fea9a6910d41d80997d6, 0xb89955f3ac075693ab26c50bb8772e, 0x001b0a], + }, + BigNum { + limbs: [0x79d4bf47595d55596ef2bd27f6682b, 0xeeb9d3a9d140dca62ce144961f8e25, 0x0058e2], + }, + BigNum { + limbs: [0x6df74788bfddf547809a0593c52c29, 0x6e3537a8223b30a23b5534d53e7afc, 0x004be8], + }, + BigNum { + limbs: [0x4facbb773e7e09b87f65f96c3ad3d8, 0x391df1f55b0d02979cb2d4cc998a57, 0x002805], + }, + BigNum { + limbs: [0xecbebc0bb2bede8728abb983c104a2, 0xd259c48b91eaa8064226f6054683bc, 0x003083], + }, + BigNum { + limbs: [0xd0e546f44b9d2078d754457c3efb5f, 0xd4f96511eb5d8b3395e1139c918196, 0x004369], + }, + BigNum { + limbs: [0xd37ff2a87babb380c6c92288db9ca6, 0x72a1f9cd89124eb06d927e27a3fd9e, 0x007289], + }, + BigNum { + limbs: [0xea24105782b04b7f3936dc7724635b, 0x34b12fcff435e4896a758b7a3407b4, 0x000164], + }, + BigNum { + limbs: [0x3a7585c54ec264e3ee86325ff52f02, 0x34796ea0382b31d08ef46443e548e5, 0x000b97], + }, + BigNum { + limbs: [0x832e7d3aaf999a1c1179cca00ad0ff, 0x72d9bafd451d01694913a55df2bc6e, 0x006856], + }, + BigNum { + limbs: [0x83611805de11188d9fc12803667dbf, 0xd8489d9b1d2b7d981b5cc7400d058a, 0x00668c], + }, + BigNum { + limbs: [0x3a42eafa204ae672603ed6fc998242, 0xcf0a8c02601cb5a1bcab4261caffc9, 0x000d60], + }, + BigNum { + limbs: [0x6ace9eee636cfea106cdd2093221c4, 0x25a27aaf423e560d8375b9f57ddb5f, 0x004164], + }, + BigNum { + limbs: [0x52d564119aef005ef9322cf6cdde3d, 0x81b0aeee3b09dd2c54924fac5a29f4, 0x003289], + }, + BigNum { + limbs: [0x804da7679b1f2ab1d8a86c599c1125, 0x37ea83b297acb4d4cac9a82e460d7a, 0x000562], + }, + BigNum { + limbs: [0x3d565b98633cd44e275792a663eedc, 0x6f68a5eae59b7e650d3e617391f7d9, 0x006e8b], + }, + BigNum { + limbs: [0xac81ba0e9f27289accbc94269dcfed, 0xca7fe2354d973f2d66f302fd0a4109, 0x006288], + }, + BigNum { + limbs: [0x112248f15f34d66533436ad9623014, 0xdcd347682fb0f40c711506a4cdc44a, 0x001164], + }, + BigNum { + limbs: [0xaa925bcaf595931a976cec0c95430e, 0xf19446ee388087b66e87e6421ad7f4, 0x006e17], + }, + BigNum { + limbs: [0x1311a73508c66be5689312f36abcf3, 0xb5bee2af44c7ab836980235fbd2d5f, 0x0005d5], + }, + BigNum { + limbs: [0x7eebd047cbc2e51c5ec124a724f5d0, 0xf253594888ee9a00b7f8aae9ee446d, 0x0029f1], + }, + BigNum { + limbs: [0x3eb832b8329919e3a13eda58db0a31, 0xb4ffd054f4599939200f5eb7e9c0e6, 0x0049fb], + }, + BigNum { + limbs: [0xc3721ea6c79959350ce6a6828af90a, 0x65e4d3674be8111f4ebbffa0ac1554, 0x003f1a], + }, + BigNum { + limbs: [0xfa31e45936c2a5caf319587d7506f7, 0x416e56363160221a894c0a012beffe, 0x0034d3], + }, + BigNum { + limbs: [0xc955e365e603ea58bb2d6aa83247db, 0xdb61407a6cf482dcb6fbe1f248d57f, 0x006323], + }, + BigNum { + limbs: [0xf44e1f9a185814a744d29457cdb826, 0xcbf1e9231053b05d210c27af8f2fd3, 0x0010c9], + }, + BigNum { + limbs: [0x78a3d2d41320a58a91e7a363e4bf29, 0xf65a022ccf82e082eced9e4db37053, 0x004043], + }, + BigNum { + limbs: [0x4500302beb3b59756e185b9c1b40d8, 0xb0f92770adc552b6eb1a6b54249500, 0x0033a9], + }, + BigNum { + limbs: [0x51110b4d802457efc0e95192098448, 0x204ab0d2a8638e24584004aba6faa2, 0x001d4a], + }, + BigNum { + limbs: [0x6c92f7b27e37a7103f16ad6df67bb9, 0x870878cad4e4a5157fc804f6310ab1, 0x0056a3], + }, + BigNum { + limbs: [0xa76cbd7137e6f47e6e58015540096f, 0x17e3d47a499280db319a950d9b3877, 0x0024f7], + }, + BigNum { + limbs: [0x1637458ec6750a8191a7fdaabff692, 0x8f6f552333b5b25ea66d74943cccdc, 0x004ef6], + }, + BigNum { + limbs: [0x46cc3132ae68b8a5f2cc3b6ce6684c, 0xaeefe26d6d67ed111551f5aecd91b5, 0x006694], + }, + BigNum { + limbs: [0x76d7d1cd4ff3465a0d33c3931997b5, 0xf86347300fe04628c2b613f30a739e, 0x000d58], + }, + BigNum { + limbs: [0x356ebb9037c6036cf0c644e1105fba, 0xe6ce8ff225aa86da51c04c9130a03f, 0x005271], + }, + BigNum { + limbs: [0x8835476fc695fb930f39ba1eefa047, 0xc08499ab579dac5f8647bd10a76514, 0x00217b], + }, + BigNum { + limbs: [0x71972107f75956b53875e0be421d2a, 0xbd4090207fe16c1f9ade683c154e89, 0x0071bc], + }, + BigNum { + limbs: [0x4c0ce1f80702a84ac78a1e41bde2d7, 0xea12997cfd66c71a3d29a165c2b6ca, 0x000230], + }, + BigNum { + limbs: [0x62cc3eb2ba6bc6f7b5e5dc5beed42f, 0x4302c5125319ab5b6b747430015857, 0x0067d1], + }, + BigNum { + limbs: [0x5ad7c44d43f038084a1a22a4112bd2, 0x6450648b2a2e87de6c939571d6acfc, 0x000c1c], + }, + BigNum { + limbs: [0x4ded5e86515588409b42a1c622af82, 0xc18924c9ff6195534d6b669470a21f, 0x006db9], + }, + BigNum { + limbs: [0x6fb6a479ad0676bf64bd5d39dd507f, 0xe5ca04d37de69de68a9ca30d676334, 0x000633], + }, + BigNum { + limbs: [0xf940aaef199513b2942e1e96335b6e, 0x9fb0976b417260510ce0bd3d0820c3, 0x004908], + }, + BigNum { + limbs: [0xc4635810e4c6eb4d6bd1e069cca493, 0x07a292323bd5d2e8cb274c64cfe48f, 0x002ae5], + }, + BigNum { + limbs: [0x99f96384bc107506288c5822ce5a85, 0x472aaaaaf10a84bbb7015543f86105, 0x0031a4], + }, + BigNum { + limbs: [0x23aa9f7b424b89f9d773a6dd31a57c, 0x60287ef28c3dae7e2106b45ddfa44e, 0x004249], + }, + BigNum { + limbs: [0x380fc7606ef68763087e889370beba, 0xa48e895f4d79a04b607cacfddcb934, 0x0058be], + }, + BigNum { + limbs: [0x85943b9f8f65779cf781766c8f4147, 0x02c4a03e2fce92ee778b5ca3fb4c1f, 0x001b2f], + }, + BigNum { + limbs: [0x0d0e018ef12219eb96289ab55ac431, 0x583bb90996d418302d24d1f9482095, 0x0033d6], + }, + BigNum { + limbs: [0xb09601710d39e51469d7644aa53bd0, 0x4f177093e6741b09aae337a88fe4be, 0x004017], + }, + BigNum { + limbs: [0x720ee1ef0d377d0671c39b05d1219c, 0x0e3c672a9e17fe930bc21be24ae73d, 0x002bb2], + }, + BigNum { + limbs: [0x4b952110f12481f98e3c63fa2ede65, 0x9916c272df3034a6cc45edbf8d1e16, 0x00483b], + }, + BigNum { + limbs: [0x8f937d589f241863fb1675b6ea931b, 0x1c2179e9ba67fb96c016aa69f8fe7b, 0x0010f3], + }, + BigNum { + limbs: [0x2e1085a75f37e69c04e98949156ce6, 0x8b31afb3c2e037a317f15f37df06d8, 0x0062fa], + }, + BigNum { + limbs: [0x56e00d5f1e00882902252fc85dc59c, 0x3e901ee55f3ead151e1a9ffea6d1e0, 0x0020d7], + }, + BigNum { + limbs: [0x66c3f5a0e05b76d6fddacf37a23a65, 0x68c30ab81e098624b9ed69a3313373, 0x005316], + }, + BigNum { + limbs: [0xbc23b54455eb4351ac2ebbbbf58f0f, 0x9056fb6c09d687252eb8459705938c, 0x001765], + }, + BigNum { + limbs: [0x01804dbba870bbae53d143440a70f2, 0x16fc2e317371ac14a94fc40ad271c7, 0x005c88], + }, + BigNum { + limbs: [0x93c6b06754a128dff1056cfd5ec865, 0xf74df5e016d7a53f6b08885f52e784, 0x005e2a], + }, + BigNum { + limbs: [0x29dd5298a9bad6200efa9202a1379c, 0xb00533bd66708dfa6cff8142851dcf, 0x0015c2], + }, + BigNum { + limbs: [0x41d2f6c7f8a9395717a8e61423c05b, 0x3d0053a77263e322f86bf6d0dc3924, 0x0048ae], + }, + BigNum { + limbs: [0x7bd10c3805b2c5a8e85718ebdc3fa6, 0x6a52d5f60ae45016df9c12d0fbcc2f, 0x002b3f], + }, + BigNum { + limbs: [0x709eafc06c4ff19ad80a4b7b416ac5, 0x298eec226cfaea1765007c50fae425, 0x0031fc], + }, + BigNum { + limbs: [0x4d05533f920c0d6527f5b384be953c, 0x7dc43d7b104d492273078d50dd212e, 0x0041f1], + }, + BigNum { + limbs: [0x69099c2b782691822141c76792a203, 0x0bdedfe0d19fff137b4c5c01b22f1a, 0x003789], + }, + BigNum { + limbs: [0x549a66d486356d7ddebe37986d5dfe, 0x9b7449bcaba834265cbbada025d639, 0x003c64], + }, + BigNum { + limbs: [0x09b329fa1577ff554c99286208dfee, 0x6776f189910ff3a606914c38247b25, 0x005a7f], + }, + BigNum { + limbs: [0xb3f0d905e8e3ffaab366d69df72013, 0x3fdc3813ec383f93d176bd69b38a2e, 0x00196e], + }, + BigNum { + limbs: [0x24accfa767b8cf3d2cac8d90592e9c, 0xb0bff695f8bb1988ea48d61b0adbd7, 0x002e0c], + }, + BigNum { + limbs: [0x98f7335896a32fc2d353716fa6d165, 0xf6933307848d19b0edbf3386cd297c, 0x0045e0], + }, + BigNum { + limbs: [0x1c7ac41146f49ac18f962c2f958a43, 0x307fb2724e316afbbe1c20bf199667, 0x0065d9], + }, + BigNum { + limbs: [0xa1293eeeb767643e7069d2d06a75be, 0x76d3772b2f16c83e19ebe8e2be6eec, 0x000e14], + }, + BigNum { + limbs: [0xcd5e72e6bcb06297c78f3489f706ea, 0x1ed60f08ce06aadbb17ef22557b500, 0x005a6f], + }, + BigNum { + limbs: [0xf045901941ab9c683870ca7608f917, 0x887d1a94af41885e2689177c805052, 0x00197e], + }, + BigNum { + limbs: [0xe6b7a3bfecde634244d4514c7912ad, 0x0cb7e84409d6c970aa662616e8b847, 0x0037f5], + }, + BigNum { + limbs: [0xd6ec5f40117d9bbdbb2badb386ed54, 0x9a9b4159737169c92da1e38aef4d0b, 0x003bf8], + }, + BigNum { + limbs: [0x209b1c1b82cb497c47ca08d92d3855, 0x585dfc3bb27bf4ec94f6914ed44415, 0x000f94], + }, + BigNum { + limbs: [0x9d08e6e47b90b583b835f626d2c7ac, 0x4ef52d61cacc3e4d4311785303c13e, 0x006459], + }, + BigNum { + limbs: [0x0c3761f18348336e42f959081acdf7, 0xc7e6d1ada8b1413bf7a2546e4b2a2c, 0x0025f0], + }, + BigNum { + limbs: [0xb16ca10e7b13cb91bd06a5f7e5320a, 0xdf6c57efd496f1fde065b5338cdb27, 0x004dfc], + }, + BigNum { + limbs: [0xbd040be90c1f098bdfa8f11646bfd6, 0x43d46fcb1be37348df13ad0c2a5b55, 0x0010e9], + }, + BigNum { + limbs: [0x009ff716f23cf57420570de9b9402b, 0x637eb9d26164bff0f8f45c95ada9fe, 0x006304], + }, + BigNum { + limbs: [0x1d9aa77779df363215065a4e6c2abd, 0xc6a057415d04ff53233bd8fbdd0586, 0x004fa4], + }, + BigNum { + limbs: [0xa0095b88847cc8cdeaf9a4b193d544, 0xe0b2d25c204333e6b4cc30a5faffcd, 0x002448], + }, + BigNum { + limbs: [0x9cb31f0b9200b0648ac18a60c7b419, 0xedbddad8c9ed9ccc28ba8ce12efb12, 0x001deb], + }, + BigNum { + limbs: [0x20f0e3f46c5b4e9b753e749f384be8, 0xb9954ec4b35a966daf4d7cc0a90a41, 0x005601], + }, + BigNum { + limbs: [0x2e713efdc506192c3fd2500d74ed6a, 0xf5c94a9135d4738d8393fd1f618fcf, 0x005a3e], + }, + BigNum { + limbs: [0x8f32c4023955e5d3c02daef28b1297, 0xb189df0c4773bfac54740c82767584, 0x0019ae], + }, + BigNum { + limbs: [0x019f2521aea11163fdb1347e6d3c9b, 0xa3738160674ee6d82b9f88354b2359, 0x0015f0], + }, + BigNum { + limbs: [0xbc04ddde4fbaed9c024eca8192c366, 0x03dfa83d15f94c61ac68816c8ce1fa, 0x005dfd], + }, + BigNum { + limbs: [0x92fda99d579539f60c1d8e32539eed, 0x186ff76aea8fd621c79e7166b7c3ef, 0x004354], + }, + BigNum { + limbs: [0x2aa65962a6c6c509f3e270cdac6114, 0x8ee3323292b85d181069983b204164, 0x003099], + }, + BigNum { + limbs: [0x4724fc91e126a038f88846a27a42f1, 0x67d8299d6a032639726942cb41b3ab, 0x006903], + }, + BigNum { + limbs: [0x767f066e1d355ec70777b85d85bd10, 0x3f7b000013450d00659ec6d69651a8, 0x000aea], + }, + BigNum { + limbs: [0x36b2bbef5d95fb7d47e495b596c9e9, 0x7f053989ebbecb783501b9ec0fc922, 0x0073b2], + }, + BigNum { + limbs: [0x86f14710a0c60382b81b694a693618, 0x284df013918967c1a3064fb5c83c31, 0x00003b], + }, + BigNum { + limbs: [0xb23ca83d927621d3100b451544eeb2, 0xab0cf321b5b87b7be0e951d31d980f, 0x0001eb], + }, + BigNum { + limbs: [0x0b675ac26be5dd2ceff4b9eabb114f, 0xfc46367bc78fb7bdf71eb7ceba6d44, 0x007201], + }, + BigNum { + limbs: [0x55d00501e227d8804bf625d398d145, 0x32372fc6312f124acc1f42547e59ea, 0x005032], + }, + BigNum { + limbs: [0x67d3fdfe1c34267fb409d92c672ebc, 0x751bf9d74c1920ef0be8c74d59ab69, 0x0023bb], + }, + BigNum { + limbs: [0x179e352fd65140abe985536de528a4, 0xcebd48220fe6df7882f59ab9abc5a7, 0x000597], + }, + BigNum { + limbs: [0xa605cdd0280abe54167aab921ad75d, 0xd895e17b6d6153c155126ee82c3fac, 0x006e55], + }, + BigNum { + limbs: [0x6468c1fc0bd98bc3f6e8b28be3db63, 0x7ef3b4556ef6d679aecad160dc2576, 0x00313f], + }, + BigNum { + limbs: [0x593b4103f282733c09174c741c249e, 0x285f75480e515cc0293d3840fbdfdd, 0x0042ae], + }, + BigNum { + limbs: [0x13470f1ab3da1ef5d61e450be78a51, 0x2f1becd5cc2934506a82aac78647b9, 0x000c05], + }, + BigNum { + limbs: [0xaa5cf3e54a81e00a29e1b9f41875b0, 0x78373cc7b11efee96d855eda51bd9a, 0x0067e8], + }, + BigNum { + limbs: [0x661c5aa57383f79b12c70a99339b94, 0x46dd8726ce03b8415b884acecaf444, 0x001319], + }, + BigNum { + limbs: [0x5787a85a8ad80764ed38f466cc646d, 0x6075a276af447af87c7fbed30d110f, 0x0060d4], + }, + BigNum { + limbs: [0xce5f9885b2f745bfa666b56d5a311a, 0x2668128e4a2bc83ba98b6857538716, 0x000a71], + }, + BigNum { + limbs: [0xef446a7a4b64b94059994992a5cee7, 0x80eb170f331c6afe2e7ca14a847e3c, 0x00697c], + }, + BigNum { + limbs: [0x6aed1a564c146832d3560d5be17df8, 0x52d64d9b5c2fa87d62e7251e9f9727, 0x006b68], + }, + BigNum { + limbs: [0x52b6e8a9b24796cd2ca9f1a41e8209, 0x547cdc0221188abc7520e483386e2c, 0x000885], + }, + BigNum { + limbs: [0xd812068ac8f3657b45e33be2652de0, 0x309990b78e6f19be2ed4aae8454f92, 0x00411b], + }, + BigNum { + limbs: [0xe591fc7535689984ba1cc31d9ad221, 0x76b998e5eed9197ba9335eb992b5c0, 0x0032d2], + }, + BigNum { + limbs: [0xbd51462129070533c31b718832f5e8, 0x19426e03b06186e1de604ed007c9b0, 0x006903], + }, + BigNum { + limbs: [0x0052bcded554f9cc3ce48d77cd0a19, 0x8e10bb99cce6ac57f9a7bad1d03ba3, 0x000aea], + }, + BigNum { + limbs: [0x55d8768e908ff925fd2d98cb6dbbee, 0x8db0c855debd836ab3062d9fa9d8d9, 0x00547a], + }, + BigNum { + limbs: [0x67cb8c716dcc05da02d26634924413, 0x19a261479e8aafcf2501dc022e2c7a, 0x001f73], + }, + BigNum { + limbs: [0x8e0ba527eca417365149025f015d1e, 0xc3152df73f24a32669617e74f15ae1, 0x0070fc], + }, + BigNum { + limbs: [0x2f985dd811b7e7c9aeb6fca0fea2e3, 0xe43dfba63e2390136ea68b2ce6aa72, 0x0002f0], + }, + BigNum { + limbs: [0x8275c394add2deae53a0e275fd0cf4, 0x7b2aeb5230fa2c195afbea2192bd19, 0x00702f], + }, + BigNum { + limbs: [0x3b2e3f6b50892051ac5f1c8a02f30d, 0x2c283e4b4c4e07207d0c1f8045483a, 0x0003be], + }, + BigNum { + limbs: [0xb3c3d1d51852439775462cfb15928e, 0x5b03ee8a9e0c240a6ba7523bd51940, 0x00068f], + }, + BigNum { + limbs: [0x09e0312ae609bb688ab9d204ea6d73, 0x4c4f3b12df3c0f2f6c60b76602ec13, 0x006d5e], + }, + BigNum { + limbs: [0x2b5f0db0dd8f62428bf3d065323436, 0x3195598a28d8092bd18a7ee24d2161, 0x0001e3], + }, + BigNum { + limbs: [0x9244f54f20cc9cbd740c2e9acdcbcb, 0x75bdd01354702a0e067d8abf8ae3f2, 0x00720a], + }, + BigNum { + limbs: [0x9df86f28195171f1fe341312f98924, 0x54eb6b36c54b9602ae7a61023ae791, 0x0031b3], + }, + BigNum { + limbs: [0x1fab93d7e50a8d0e01cbebed0676dd, 0x5267be66b7fc9d37298da89f9d1dc2, 0x00423a], + }, + BigNum { + limbs: [0x32e14ea5c65fd882f06ddfe57fb749, 0xa4854293013e6b346b4a4b01e810da, 0x00109a], + }, + BigNum { + limbs: [0x8ac2b45a37fc267d0f921f1a8048b8, 0x02cde70a7c09c8056cbdbe9feff479, 0x006353], + }, + BigNum { + limbs: [0x423c71ad2b0dfa572131cee36007fa, 0x33b9c1df4ffd1b118bfbe33bd251a0, 0x001467], + }, + BigNum { + limbs: [0x7b679152d34e04a8dece301c9ff807, 0x739967be2d4b18284c0c266605b3b3, 0x005f86], + }, + BigNum { + limbs: [0x4312ad66d4b7e90d2b6da17aab81c3, 0xe4da640bbaac82fcb1b1e258caf7f7, 0x00218a], + }, + BigNum { + limbs: [0x7a91559929a415f2d4925d85547e3e, 0xc278c591c29bb03d265627490d0d5c, 0x005262], + }, + BigNum { + limbs: [0x7b3c07432c4bb846d7751759b82258, 0xbcb86c65c99f9735bdebf5628898ac, 0x00653a], + }, + BigNum { + limbs: [0x4267fbbcd21046b9288ae7a647dda9, 0xea9abd37b3a89c041a1c143f4f6ca7, 0x000eb2], + }, + BigNum { + limbs: [0x9ce7c297ab8d54db615b721e6888d5, 0x889f6574f553a2a6da1423fa9a8a78, 0x002313], + }, + BigNum { + limbs: [0x20bc406852ceaa249ea48ce197772c, 0x1eb3c42887f49092fdf3e5a73d7adb, 0x0050da], + }, + BigNum { + limbs: [0x73546ee70933efffe30ef5a9528edd, 0x0e58e6c6cf02feb911dc3dad3a3bad, 0x0054bc], + }, + BigNum { + limbs: [0x4a4f9418f5280f001cf10956ad7124, 0x98fa42d6ae453480c62bcbf49dc9a6, 0x001f31], + }, + BigNum { + limbs: [0x4b743731d6de69caf95626573b849e, 0x7b4eac93969def71980219544f4fd8, 0x0017e4], + }, + BigNum { + limbs: [0x722fcbce277d953506a9d8a8c47b63, 0x2c047d09e6aa43c84005f04d88b57b, 0x005c09], + }, + BigNum { + limbs: [0x76809182ba32c095d44706ae689c0c, 0xa9f46ae7f49b8041bad9d23de711f3, 0x0070d4], + }, + BigNum { + limbs: [0x4723717d44293e6a2bb8f8519763f5, 0xfd5ebeb588acb2f81d2e3763f0f360, 0x000318], + }, + BigNum { + limbs: [0x4311151b41f2e4a8b188dd1a6a4bf6, 0x66fd2e6a621ba27d46e4e6ebaaab28, 0x002920], + }, + BigNum { + limbs: [0x7a92ede4bc691a574e7721e595b40b, 0x4055fb331b2c90bc912322b62d5a2b, 0x004acd], + }, + BigNum { + limbs: [0x5cb240f458a0411af937dd7884b5bd, 0x5c392742ebcb8eda0f11c5920ab794, 0x004c46], + }, + BigNum { + limbs: [0x60f1c20ba5bbbde506c821877b4a44, 0x4b1a025a917ca45fc8f6440fcd4dbf, 0x0027a7], + }, + BigNum { + limbs: [0x6b26bf3a5b9cedc4de75f89a010b97, 0x7787223bc8fc5a52f2e3933f823d47, 0x006a5b], + }, + BigNum { + limbs: [0x527d43c5a2bf113b218a0665fef46a, 0x2fcc0761b44bd8e6e524766255c80c, 0x000992], + }, + BigNum { + limbs: [0x906daf54262b5a6d913c8a21d61a14, 0xfd20ce3f8b5ded02bf205d2103eac1, 0x00646e], + }, + BigNum { + limbs: [0x2d3653abd830a4926ec374de29e5ed, 0xaa325b5df1ea463718e7ac80d41a92, 0x000f7e], + }, + BigNum { + limbs: [0xd3fa076900a2701dc2e8ce1a0001e5, 0x8a061c5504e40c9c6d744ce76f9570, 0x004bae], + }, + BigNum { + limbs: [0xe9a9fb96fdb98ee23d1730e5fffe1c, 0x1d4d0d487864269d6a93bcba686fe2, 0x00283f], + }, + BigNum { + limbs: [0x841ffb42a9153d71f0aca0022c86e0, 0x0b4a3128782aad8b75eeb88658b3d3, 0x002b1f], + }, + BigNum { + limbs: [0x398407bd5546c18e0f535efdd37921, 0x9c08f875051d85ae6219511b7f5180, 0x0048ce], + }, + BigNum { + limbs: [0x328f11d9cdf877394e8363ac674b29, 0xfea00f8d24bf97d28a6cca10529e21, 0x004b21], + }, + BigNum { + limbs: [0x8b14f126306387c6b17c9b5398b4d8, 0xa8b31a1058889b674d9b3f91856732, 0x0028cb], + }, + BigNum { + limbs: [0x535ba390e22a934f2887da7a4613ac, 0x146fc82c471d6006a526adeef61511, 0x005d2c], + }, + BigNum { + limbs: [0x6a485f6f1c316bb0d7782485b9ec55, 0x92e36171362ad33332e15bb2e1f042, 0x0016c1], + }, + BigNum { + limbs: [0xe632049f8464426c8b9b2bf815aad7, 0x48ccf85251fc944d705267aef07995, 0x002fe5], + }, + BigNum { + limbs: [0xd771fe6079f7bc937464d307ea552a, 0x5e86314b2b4b9eec67b5a1f2e78bbd, 0x004408], + }, + BigNum { + limbs: [0xe3f58397fa59ca7ee8c97459708936, 0x49b450f7e1001fbfe1fc8d8a0d5fe7, 0x007294], + }, + BigNum { + limbs: [0xd9ae7f680402348117368aa68f76cb, 0x5d9ed8a59c481379f60b7c17caa56b, 0x000159], + }, + BigNum { + limbs: [0x9de328231391765bc4f547e17fae04, 0x7ae3db865ba7714dcc8e32350736c2, 0x002d93], + }, + BigNum { + limbs: [0x1fc0dadceaca88a43b0ab71e8051fd, 0x2c6f4e1721a0c1ec0b79d76cd0ce91, 0x00465a], + }, + BigNum { + limbs: [0x99e982481eb187c638ab874c146c0a, 0x850021892f6b10f3be96e9d4669892, 0x001b04], + }, + BigNum { + limbs: [0x23ba80b7dfaa7739c75477b3eb93f7, 0x225308144ddd224619711fcd716cc1, 0x0058e9], + }, + BigNum { + limbs: [0x22968828352a6e3f4bf52554d38e6f, 0xf1c7a7718e251607c0636d7990d68f, 0x00262a], + }, + BigNum { + limbs: [0x9b0d7ad7c93190c0b40ad9ab2c7192, 0xb58b822bef231d3217a49c28472ec4, 0x004dc2], + }, + BigNum { + limbs: [0x19d4b2a482d2fbc23c6ee8ac5a4aaf, 0xc9aafb60bcbac15b96d0a2f553f4e4, 0x002d95], + }, + BigNum { + limbs: [0xa3cf505b7b89033dc3911653a5b552, 0xdda82e3cc08d71de413766ac84106f, 0x004657], + }, + BigNum { + limbs: [0x9ac76eb653b8077d5feb370589ddcd, 0x1cea5e2d9df0734149137047b1786e, 0x003b8c], + }, + BigNum { + limbs: [0x22dc9449aaa3f782a014c7fa762234, 0x8a68cb6fdf57bff88ef4995a268ce5, 0x003861], + }, + BigNum { + limbs: [0x6ea99bee92c793b2126ee2e55d5b7b, 0x532503b950c74c9db999b77bc95b13, 0x006efd], + }, + BigNum { + limbs: [0x4efa67116b946b4ded911c1aa2a486, 0x542e25e42c80e69c1e6e52260eaa40, 0x0004f0], + }, + BigNum { + limbs: [0x4abd405dd655c9caba576e317c51c0, 0x5b7f47d7e3dde00b481b539b58b533, 0x006e5f], + }, + BigNum { + limbs: [0x72e6c2a22806353545a890ce83ae41, 0x4bd3e1c5996a532e8fecb6067f5020, 0x00058e], + }, + BigNum { + limbs: [0x231f19c71e8773da6453c4f956b91c, 0x019aedcb1f56b52853da3777fcc872, 0x000eaf], + }, + BigNum { + limbs: [0x9a84e938dfd48b259bac3a06a946e5, 0xa5b83bd25df17e11842dd229db3ce1, 0x00653e], + }, + BigNum { + limbs: [0x19668a6e56d866fa44b2cf5ea9ce3e, 0x3a4b78ab5c819959f3c1dbce24dcb2, 0x00567a], + }, + BigNum { + limbs: [0xa43d7891a7839805bb4d2fa15631c3, 0x6d07b0f220c699dfe4462dd3b328a1, 0x001d73], + }, + BigNum { + limbs: [0x8fc3ecb74d2370818a195b4030b82d, 0xda607fd657b1ecc589fe94d902934c, 0x002c8e], + }, + BigNum { + limbs: [0x2de01648b1388e7e75e6a3bfcf47d4, 0xccf2a9c7259646744e0974c8d57207, 0x00475e], + }, + BigNum { + limbs: [0x8586ae1f584b84c709f7cddb49aefe, 0x9d29782d7022884ec5a8cd2669f7cc, 0x0019fa], + }, + BigNum { + limbs: [0x381d54e0a6107a38f6083124b65103, 0x0a29b1700d25aaeb125f3c7b6e0d87, 0x0059f3], + }, + BigNum { + limbs: [0x97551d7eb479316903092c74d1b363, 0xc0dfcf0eae86c2b3ee68881b3131e8, 0x004b0e], + }, + BigNum { + limbs: [0x264ee58149e2cd96fcf6d28b2e4c9e, 0xe6735a8ecec17085e99f8186a6d36b, 0x0028de], + }, + BigNum { + limbs: [0x8f79025062832db2e14ff671c966ca, 0x39d976a5cc746815ff2c5df25e4c4b, 0x00500c], + }, + BigNum { + limbs: [0x2e2b00af9bd8d14d1eb0088e369937, 0x6d79b2f7b0d3cb23d8dbabaf79b908, 0x0023e1], + }, + BigNum { + limbs: [0x9d16dab72c6ea893501f19a2ae9b40, 0x9285f4b67ba0714fb14e35f116982e, 0x003c74], + }, + BigNum { + limbs: [0x208d2848d1ed566cafe0e55d5164c1, 0x14cd34e701a7c1ea26b9d3b0c16d25, 0x003779], + }, + BigNum { + limbs: [0x376a86c53fbaa0e7b0f84cf1693a6c, 0xd3d2ca0f2c04501eff841f6ad00440, 0x005f25], + }, + BigNum { + limbs: [0x86397c3abea15e184f07b20e96c595, 0xd3805f8e5143e31ad883ea37080113, 0x0014c7], + }, + BigNum { + limbs: [0xcfc741b88a6d90351e7a72117b4660, 0xbefa63943b3c9fb623bd7d8f468827, 0x00235e], + }, + BigNum { + limbs: [0xeddcc14773ee6ecae1858cee84b9a1, 0xe858c609420b9383b44a8c12917d2b, 0x00508e], + }, + BigNum { + limbs: [0x73d6ebd3f2d04ebd818c79e9b418c3, 0xa89d6917cf356fb52776257e47f6bd, 0x006d9c], + }, + BigNum { + limbs: [0x49cd172c0b8bb0427e7385164be73e, 0xfeb5c085ae12c384b091e423900e96, 0x000650], + }, + BigNum { + limbs: [0xcbed26a10189725865f49cae84c1f0, 0x51abf2ff1a7ac214f8af079281e8c2, 0x001c89], + }, + BigNum { + limbs: [0xf1b6dc5efcd28ca79a0b62517b3e11, 0x55a7369e62cd7124df59020f561c90, 0x005764], + }, + BigNum { + limbs: [0x5c2a2517ea29380d784d83532d58a4, 0xe5bdc2f376ef3fbfaf7cf36c98f23c, 0x002acb], + }, + BigNum { + limbs: [0x6179dde81432c6f287b27bacd2a75d, 0xc19566aa0658f37a288b16353f1317, 0x004921], + }, + BigNum { + limbs: [0x0c396a9fa67ea67e2a604403076877, 0xa9395cb8d476fab39024f46a4961d9, 0x003334], + }, + BigNum { + limbs: [0xb16a986057dd5881d59fbafcf8978a, 0xfe19cce4a8d1388647e315378ea37a, 0x0040b8], + }, + BigNum { + limbs: [0x659be0bb7e781e96ab11c20e5ad151, 0xbf9e4612a7a04b853daeb5686a7f1f, 0x005f0e], + }, + BigNum { + limbs: [0x580822447fe3e06954ee3cf1a52eb0, 0xe7b4e38ad5a7e7b49a5954396d8634, 0x0014de], + }, + BigNum { + limbs: [0x34af14b61e0abe74a1f6718c130477, 0x7a8bca252472eb674a1a620890d7a5, 0x004352], + }, + BigNum { + limbs: [0x88f4ee49e051408b5e098d73ecfb8a, 0x2cc75f7858d547d28deda799472dae, 0x00309b], + }, + BigNum { + limbs: [0x986d4f948654a8ddccfd2991cb1cc7, 0x529d1d76d858cc6ba0596eae27c4e4, 0x003b18], + }, + BigNum { + limbs: [0x2536b36b780756223302d56e34e33a, 0x54b60c26a4ef66ce37ae9af3b0406f, 0x0038d5], + }, + BigNum { + limbs: [0x9da80dc7ef9f0f200b5775cb7c7f34, 0xada04d5e74819262a96d0a5549b5f1, 0x000679], + }, + BigNum { + limbs: [0x1ffbf5380ebcefdff4a889348380cd, 0xf9b2dc3f08c6a0d72e9aff4c8e4f62, 0x006d73], + }, + BigNum { + limbs: [0x8076a04042fa6a4ae23d4887732cc7, 0x84efe7a91e54c20ba6c40efc806c85, 0x005327], + }, + BigNum { + limbs: [0x3d2d62bfbb6194b51dc2b6788cd33a, 0x226341f45ef3712e3143faa55798ce, 0x0020c6], + }, + BigNum { + limbs: [0xad338dc96b53f06d9bd93caef95435, 0x46d16b0ded487a772571e97d5605ea, 0x004ac4], + }, + BigNum { + limbs: [0x1070753693080e926426c25106abcc, 0x6081be8f8fffb8c2b296202481ff69, 0x002929], + }, + BigNum { + limbs: [0x640ded94a2153f4f3cf1b82d878f30, 0x620c501b6d5b34b1fe426ba069ee6f, 0x000904], + }, + BigNum { + limbs: [0x5996156b5c46bfb0c30e46d27870d1, 0x4546d9820fecfe87d9c59e016e16e4, 0x006ae9], + }, + BigNum { + limbs: [0x3fcc8fbece3ff36832c0e6cf2383d0, 0xb5ed3c6c5168d7a5b570137a2c4e8f, 0x0030a3], + }, + BigNum { + limbs: [0x7dd77341301c0b97cd3f1830dc7c31, 0xf165ed312bdf5b942297f627abb6c4, 0x004349], + }, + BigNum { + limbs: [0x950b898168358f10a2ea8dd9532d0b, 0x3fa6331dc12669b74e8a5f93d55dda, 0x0043a1], + }, + BigNum { + limbs: [0x2898797e96266fef5d157126acd2f6, 0x67acf67fbc21c982897daa0e02a779, 0x00304c], + }, + BigNum { + limbs: [0x87dd867c2846dfcc3b7f324100ce0b, 0xdd9346337dff0ec770162a016a73c0, 0x000934], + }, + BigNum { + limbs: [0x35c67c83d6151f33c480ccbeff31f6, 0xc9bfe369ff49247267f1dfa06d9193, 0x006ab8], + }, + BigNum { + limbs: [0xea948838d3a59e714fe5f9a319f08b, 0xd9b9e9bc0a45bca442260d0f5cc781, 0x0019ff], + }, + BigNum { + limbs: [0xd30f7ac72ab6608eb01a055ce60f76, 0xcd993fe17302769595e1fc927b3dd1, 0x0059ed], + }, + BigNum { + limbs: [0x42eaa33c21a6c3f8e855b7ca48e223, 0x2a883802cf8d5e7aadc120761b2157, 0x001430], + }, + BigNum { + limbs: [0x7ab95fc3dcb53b0717aa4735b71dde, 0x7ccaf19aadbad4bf2a46e92bbce3fc, 0x005fbd], + }, + BigNum { + limbs: [0xea26e3e861e9a6f03205e4801f0670, 0x521b43809c6f413f091a0442fe3b0a, 0x0057e2], + }, + BigNum { + limbs: [0xd37d1f179c72580fcdfa1a7fe0f991, 0x5537e61ce0d8f1faceee055ed9ca48, 0x001c0b], + }, + BigNum { + limbs: [0x888aca5f2cf18937eb9c08a6bad0a5, 0xb368c1bd3ec3d9a4667dbe97b7466b, 0x006c24], + }, + BigNum { + limbs: [0x351938a0d16a75c81463f659452f5c, 0xf3ea67e03e845995718a4b0a20bee8, 0x0007c8], + }, + BigNum { + limbs: [0xca463738abfdcceae6f7f2c97f6ddc, 0x37a8bdb046c980f6c206144132a757, 0x0053ca], + }, + BigNum { + limbs: [0xf35dcbc7525e321519080c36809225, 0x6faa6bed367eb2431601f560a55dfb, 0x002023], + }, + BigNum { + limbs: [0x33e248bb1c34f3d3daea56ba7f16a9, 0xf0818c66f93206930810c8ebd7cf6f, 0x002c56], + }, + BigNum { + limbs: [0x89c1ba44e2270b2c2515a84580e958, 0xb6d19d3684162ca6cff740b60035e4, 0x004796], + }, + BigNum { + limbs: [0xfa342f2e54d35b3efaf03e1f4c23a5, 0x4ed170bf21bac2867ad9bd62474fc4, 0x00426e], + }, + BigNum { + limbs: [0xc36fd3d1a988a3c1050fc0e0b3dc5c, 0x5881b8de5b8d70b35d2e4c3f90b58e, 0x00317f], + }, + BigNum { + limbs: [0xee7464cc2693acc7f2b0c7f97d0157, 0xcd54ee73a12d5a25364bab696dd707, 0x0044f2], + }, + BigNum { + limbs: [0xcf2f9e33d7c852380d4f370682feaa, 0xd9fe3b29dc1ad914a1bc5e386a2e4b, 0x002efa], + }, + BigNum { + limbs: [0x09bb3a7eed94b5ee1cb6e72b82c6d1, 0x2cf9a0599655f39dd358a82382f466, 0x002a3b], + }, + BigNum { + limbs: [0xb3e8c88110c74911e34917d47d3930, 0x7a598943e6f23f9c04af617e5510ed, 0x0049b2], + }, + BigNum { + limbs: [0xded1798f001c83984bae2ba9e576ec, 0x56ee3af2ac38ca85bda4670d2c2307, 0x000975], + }, + BigNum { + limbs: [0xded28970fe3f7b67b451d3561a8915, 0x5064eeaad10f68b41a63a294abe24b, 0x006a78], + }, + BigNum { + limbs: [0x4dc75cbe09f501a0b24ec3dca1f2ce, 0x3112ac902e13ee36737d3869b66204, 0x0031e6], + }, + BigNum { + limbs: [0x6fdca641f466fd5f4db13b235e0d33, 0x76407d0d4f344503648ad13821a34f, 0x004207], + }, + BigNum { + limbs: [0x156add501a1c6937b11e308bf0abc8, 0x363da95355ccf81be9d7b571ce05b1, 0x003e29], + }, + BigNum { + limbs: [0xa83925afe43f95c84ee1ce740f5439, 0x7115804a277b3b1dee30543009ffa2, 0x0035c4], + }, + BigNum { + limbs: [0xb50c83fd1f5c0dcd6dcd1e8a6d2938, 0x647da03f2b3cd52856ab58c24f30f6, 0x0025ad], + }, + BigNum { + limbs: [0x08977f02defff1329232e07592d6c9, 0x42d5895e520b5e11815cb0df88d45d, 0x004e40], + }, + BigNum { + limbs: [0xa73479f853c1eb8d14b4edec527670, 0x6dce2e5ec6630aa522414c846da37a, 0x001450], + }, + BigNum { + limbs: [0x166f8907aa9a1372eb4b1113ad8991, 0x3984fb3eb6e52894b5c6bd1d6a61d9, 0x005f9d], + }, + BigNum { + limbs: [0xd15d8f0976f55e06f8ee5e9777964d, 0x95ea54b09d10987f4e2ce1b79388c1, 0x00413d], + }, + BigNum { + limbs: [0xec4673f68766a0f90711a0688869b4, 0x1168d4ece0379aba89db27ea447c91, 0x0032b0], + }, + BigNum { + limbs: [0xb6afda9637ccb788a3d4bd18e66da6, 0x518219806ce2d8c3dd1ccbc1b529ec, 0x005581], + }, + BigNum { + limbs: [0x06f42869c68f47775c2b41e719925b, 0x55d1101d10655a75faeb3de022db67, 0x001e6c], + }, + BigNum { + limbs: [0x991b24aa25db0e40861b826cace87f, 0x5ee79ca9436b6c1feffb1c216f70a6, 0x007149], + }, + BigNum { + limbs: [0x2488de55d880f0bf79e47c93531782, 0x486b8cf439dcc719e80ced806894ad, 0x0002a4], + }, + BigNum { + limbs: [0xfb90de5161d3aa0e4f9e5a6854836c, 0x7730aabeaf2707d3acaf7b7234937b, 0x000453], + }, + BigNum { + limbs: [0xc21324ae9c8854f1b061a497ab7c95, 0x30227edece212b662b588e2fa371d7, 0x006f9a], + }, + BigNum { + limbs: [0x514cd4e04272c008e2fb108e12e22a, 0x80e1938cd09c9a3ae5427d8e18cb54, 0x000fe6], + }, + BigNum { + limbs: [0x6c572e1fbbe93ef71d04ee71ed1dd7, 0x26719610acab98fef2c58c13bf39ff, 0x006407], + }, + BigNum { + limbs: [0xad623bf3402bd57a9634b25637c216, 0x449c6a67b9ed93981376c9cd141418, 0x003869], + }, + BigNum { + limbs: [0x1041c70cbe30298569cb4ca9c83deb, 0x62b6bf35c35a9fa1c4913fd4c3f13b, 0x003b84], + }, + BigNum { + limbs: [0xc2dfa82313ad493a3e1a7aa260077d, 0xbce2aa1625f8acb62f7f17837a2577, 0x001c25], + }, + BigNum { + limbs: [0xfac45adceaaeb5c5c1e5845d9ff884, 0xea707f87574f8683a888f21e5ddfdb, 0x0057c7], + }, + BigNum { + limbs: [0x1db465016aecf09e6f74084c8e85a6, 0xf3dd5bee9b24bd298bcb9b46025a18, 0x006cbe], + }, + BigNum { + limbs: [0x9fef9dfe936f0e61908bf6b3717a5b, 0xb375cdaee22376104c3c6e5bd5ab3b, 0x00072e], + }, + BigNum { + limbs: [0x07ba425b194f3be868c32a5b94f4e5, 0x27101520c4b2e11d3393b8d009aa2c, 0x000eba], + }, + BigNum { + limbs: [0xb5e9c0a4e50cc317973cd4a46b0b1c, 0x8043147cb895521ca47450d1ce5b27, 0x006533], + }, + BigNum { + limbs: [0xe5eebb2c61bfc76d8878e6c92c1964, 0x3ea3f96c0440f88cd53e4cee2d698d, 0x00507c], + }, + BigNum { + limbs: [0xd7b547d39c9c379277871836d3e69d, 0x68af303179073aad02c9bcb3aa9bc5, 0x002371], + }, + BigNum { + limbs: [0xcaef2e1b379cbd65f21f6521b5ffe3, 0xb92efbacec2085f75cd0394e7e1493, 0x004c10], + }, + BigNum { + limbs: [0xf2b4d4e4c6bf419a0de099de4a001e, 0xee242df09127ad427b37d05359f0bf, 0x0027dc], + }, + BigNum { + limbs: [0x5a90d8902f34ee2ffffbac2e990b32, 0x85e3496a299b1a2b4aad24d743792b, 0x0042ce], + }, + BigNum { + limbs: [0x63132a6fcf2710d0000452d166f4cf, 0x216fe03353ad190e8d5ae4ca948c28, 0x00311f], + }, + BigNum { + limbs: [0xb5b47bb725cda97ed4be029bd47ddd, 0x6e0bba848829e2af1b87209c0c0556, 0x0072af], + }, + BigNum { + limbs: [0x07ef8748d88e55812b41fc642b8224, 0x39476f18f51e508abc80e905cbfffd, 0x00013e], + }, + BigNum { + limbs: [0x2bafd544a199a3fe213ce3f40c2fa1, 0x01cdf2ff819eb174b778fe8e29f421, 0x00158b], + }, + BigNum { + limbs: [0x91f42dbb5cc25b01dec31b0bf3d060, 0xa585369dfba981c5208f0b13ae1132, 0x005e62], + }, + BigNum { + limbs: [0xe7f96676286b47c433afe4d106b43d, 0x310d4f00fee0175ca29996af2afe4e, 0x004b52], + }, + BigNum { + limbs: [0xd5aa9c89d5f0b73bcc501a2ef94bc4, 0x7645da9c7e681bdd356e72f2ad0704, 0x00289b], + }, + BigNum { + limbs: [0xca2c4fd11289ccc9f8090ae9106aaf, 0x72623392274a8b3b1472c4aac7b30c, 0x00586f], + }, + BigNum { + limbs: [0xf377b32eebd2323607f6f416ef9552, 0x34f0f60b55fda7fec39544f7105246, 0x001b7e], + }, + BigNum { + limbs: [0xddcb3aae11b4f6a83569dad6cd41e9, 0xa2a0e40b14ad3ac082ec036858c652, 0x0042cb], + }, + BigNum { + limbs: [0xdfd8c851eca70857ca96242932be18, 0x04b24592689af879551c06397f3f00, 0x003122], + }, + BigNum { + limbs: [0xa633eb2bd252b8f338d1145bbf0bd5, 0x83fc39549f77c4b5af9e6def1f5a2e, 0x006953], + }, + BigNum { + limbs: [0x177017d42c09460cc72eeaa440f42c, 0x2356f048ddd06e8428699bb2b8ab25, 0x000a9a], + }, + BigNum { + limbs: [0xcd97301b698d332256b524d8b89e8b, 0x754e6966f69b3071acf3d7805a5c41, 0x004f5b], + }, + BigNum { + limbs: [0xf00cd2e494cecbdda94ada27476176, 0x3204c03686ad02c82b1432217da911, 0x002492], + }, + BigNum { + limbs: [0x85f998168289ca7f2423392adae5b9, 0xd7a8d381273c1b290213873ae175d7, 0x004fd7], + }, + BigNum { + limbs: [0x37aa6ae97bd23480dbdcc5d5251a48, 0xcfaa561c560c1810d5f48266f68f7c, 0x002415], + }, + BigNum { + limbs: [0x461c33c1a0f0b758be078a66b064a1, 0xe1a1f2cc7087dc66f4b808f364646b, 0x0037f4], + }, + BigNum { + limbs: [0x7787cf3e5d6b47a741f874994f9b60, 0xc5b136d10cc056d2e35000ae73a0e8, 0x003bf8], + }, + BigNum { + limbs: [0x10344b217e61bd034fe540f385a129, 0x7149c0f9efc012a497e72294fe0d1b, 0x000151], + }, + BigNum { + limbs: [0xad6fb7de7ffa41fcb01abe0c7a5ed8, 0x360968a38d8820954020e70cd9f838, 0x00729c], + }, + BigNum { + limbs: [0xaa12dad03920b780c10f21710ecb97, 0x2c08ab0d493cb63fc62f04e5adaf87, 0x0038b5], + }, + BigNum { + limbs: [0x1391282fc53b477f3ef0dd8ef1346a, 0x7b4a7e90340b7cfa11d904bc2a55cc, 0x003b38], + }, + BigNum { + limbs: [0xc9785e4b1a161953a535350d483019, 0x62ff5bf8d281fb472b23db94f42d8e, 0x00420b], + }, + BigNum { + limbs: [0xf42ba4b4e445e5ac5acac9f2b7cfe8, 0x4453cda4aac637f2ace42e0ce3d7c4, 0x0031e2], + }, + BigNum { + limbs: [0xf91bc8feb9b112808f505c45cb015c, 0x917dc58e99c00d615843aba8be67e6, 0x00109e], + }, + BigNum { + limbs: [0xc4883a0144aaec7f70afa2ba34fea5, 0x15d5640ee38825d87fc45df9199d6c, 0x00634f], + }, + BigNum { + limbs: [0xa0b2c8a4a7bc2e69a5eae3e0a37475, 0x723faf835210730c75680995aa200f, 0x006fb5], + }, + BigNum { + limbs: [0x1cf13a5b569fd0965a151b1f5c8b8c, 0x35137a1a2b37c02d62a0000c2de544, 0x000438], + }, + BigNum { + limbs: [0x5cf9ee56a0d33e35042724c5b436bb, 0xc0eebcb1f4772ef461072f445e70e7, 0x00080e], + }, + BigNum { + limbs: [0x60aa14a95d88c0cafbd8da3a4bc946, 0xe6646ceb88d104457700da5d79946c, 0x006bde], + }, + BigNum { + limbs: [0xe4ef4d5372d2492e81ced8221f9f8a, 0x1efd37f7f7e0769798bf3a5553980d, 0x0060b7], + }, + BigNum { + limbs: [0xd8b4b5ac8b89b5d17e3126dde06077, 0x8855f1a58567bca23f48cf4c846d45, 0x001336], + }, + BigNum { + limbs: [0xc6252dbf1b326892f4d9b3220826cd, 0xfeab6ca661472557041d93d5177942, 0x0013b1], + }, + BigNum { + limbs: [0xf77ed540e329966d0b264bddf7d934, 0xa8a7bcf71c010de2d3ea75ccc08c10, 0x00603b], + }, + BigNum { + limbs: [0x9b851d08727d4269878537a09ab251, 0xe2b20f3384ec13ab948f2be0c4358d, 0x005366], + }, + BigNum { + limbs: [0x221ee5f78bdebc96787ac75f654db0, 0xc4a11a69f85c1f8e4378ddc113cfc6, 0x002086], + }, + BigNum { + limbs: [0x97fa6b553424bce61ba1af6202359a, 0x62790c9ec5709483ded871817d0f54, 0x0027cf], + }, + BigNum { + limbs: [0x25a997aaca374219e45e4f9dfdca67, 0x44da1cfeb7d79eb5f92f98205af5ff, 0x004c1e], + }, + BigNum { + limbs: [0xc62920e6caa9f8f2292b77ec6944b7, 0x17e308d1480c85fddad45ca496fc0c, 0x006ddc], + }, + BigNum { + limbs: [0xf77ae21933b2060dd6d4871396bb4a, 0x8f7020cc353bad3bfd33acfd410946, 0x000611], + }, + BigNum { + limbs: [0xcc6493ffad656f51eae331d45e4567, 0x9478a2d01333d6a928516c6c492af2, 0x0048b3], + }, + BigNum { + limbs: [0xf13f6f0050f68fae151ccd2ba1ba9a, 0x12da86cd6a145c90afb69d358eda60, 0x002b3a], + }, + BigNum { + limbs: [0xa4b9a7d9b44f7d6609134c8fd05714, 0xef733c2089cf6b37fc2d2bce9a49f6, 0x006304], + }, + BigNum { + limbs: [0x18ea5b264a0c8199f6ecb2702fa8ed, 0xb7dfed7cf378c801dbdaddd33dbb5d, 0x0010e8], + }, + BigNum { + limbs: [0x01287aa8e28eee99c2146c444e519a, 0xaa852cf69d9898ecff7fc2e04b67ab, 0x0025ea], + }, + BigNum { + limbs: [0xbc7b88571bcd10663deb92bbb1ae67, 0xfccdfca6dfaf9a4cd88846c18c9da8, 0x004e02], + }, + BigNum { + limbs: [0x6c05295b5fb41cb8d6b4ecef99c9e8, 0x71a09ca75e9ecf0144808af6112ecb, 0x001783], + }, + BigNum { + limbs: [0x519ed9a49ea7e247294b1210663619, 0x35b28cf61ea9643893877eabc6d688, 0x005c6a], + }, + BigNum { + limbs: [0x0dab4c4a2a63ad2369ef864781d95e, 0x2f7c6017a94f9b01da56279eb5d9e5, 0x003cd1], + }, + BigNum { + limbs: [0xaff8b6b5d3f851dc961078b87e26a3, 0x77d6c985d3f89837fdb1e203222b6e, 0x00371c], + }, + BigNum { + limbs: [0xfbbf05605e22049088086fe345cf99, 0x9962d49e98f824a86f10b7e39f2849, 0x004955], + }, + BigNum { + limbs: [0xc1e4fd9fa039fa6f77f78f1cba3068, 0x0df054fee4500e9168f751be38dd09, 0x002a98], + }, + BigNum { + limbs: [0x6ea85e98587c4a13068409bc82e244, 0x73eb7bcba57289a774bf888a996f9c, 0x0052c7], + }, + BigNum { + limbs: [0x4efba467a5dfb4ecf97bf5437d1dbd, 0x3367add1d7d5a992634881173e95b7, 0x002126], + }, + BigNum { + limbs: [0x15a25c56a25116ef4661cf681ac890, 0x122395c63dc1d8108a1f42d3561429, 0x000157], + }, + BigNum { + limbs: [0xa801a6a95c0ae810b99e2f97e53771, 0x952f93d73f865b294de8c6ce81f12a, 0x007296], + }, + BigNum { + limbs: [0xfa85c091fab993f2d6a61c264bba11, 0xc9de3a5deb69cc970bd5f2e6c815a4, 0x005469], + }, + BigNum { + limbs: [0xc31e426e03a26b0d2959e2d9b445f0, 0xdd74ef3f91de66a2cc3216bb0fefae, 0x001f83], + }, + BigNum { + limbs: [0x9cf7f79590474d5947ce0ad319cdc7, 0xe9425e38ffcc78b5a5b93d41590f4b, 0x0054d9], + }, + BigNum { + limbs: [0x20ac0b6a6e14b1a6b831f42ce6323a, 0xbe10cb647d7bba84324ecc607ef608, 0x001f13], + }, + BigNum { + limbs: [0x059903e0524868e55b60810a7f877b, 0xe6dafe0adda151ded54695836adc05, 0x006bea], + }, + BigNum { + limbs: [0xb80aff1fac13961aa49f7df5807886, 0xc0782b929fa6e15b02c1741e6d294e, 0x000802], + }, + BigNum { + limbs: [0xe617879a72d893b66d13df0b850d61, 0x14ed7cb17771b59db72419438d24fd, 0x002e07], + }, + BigNum { + limbs: [0xd78c7b658b836b4992ec1ff47af2a0, 0x9265acec05d67d9c20e3f05e4ae055, 0x0045e6], + }, + BigNum { + limbs: [0xe4824fbac5f8e7a21ac44df3477076, 0x4574e3442ee136aebb2396bd4f09d5, 0x0062b3], + }, + BigNum { + limbs: [0xd921b3453863175de53bb10cb88f8b, 0x61de46594e66fc8b1ce472e488fb7d, 0x00113a], + }, + BigNum { + limbs: [0xb8ecee197d9af0e3712b897f88b4d1, 0x00c45b561179be483f87c82a93f63f, 0x001a16], + }, + BigNum { + limbs: [0x04b714e680c10e1c8ed47580774b30, 0xa68ece476bce74f198804177440f14, 0x0059d7], + }, + BigNum { + limbs: [0x94ef84e6b7b995a1041f9488f68dae, 0x2ec1fc6138bd21f6d173aa046fe4ca, 0x0026c6], + }, + BigNum { + limbs: [0x28b47e1946a2695efbe06a77097253, 0x78912d3c448b114306945f9d682089, 0x004d27], + }, + BigNum { + limbs: [0x6d56a1d006b6372fac4dd82e55e945, 0x85187afb65a3c87c53ce3f7a76569b, 0x004129], + }, + BigNum { + limbs: [0x504d612ff7a5c7d053b226d1aa16bc, 0x223aaea217a46abd8439ca2761aeb8, 0x0032c4], + }, + BigNum { + limbs: [0x63ef45ad4908e6f172f93272aef9c6, 0xa5933f9d639627bceabba9c13bcb9a, 0x0011b5], + }, + BigNum { + limbs: [0x59b4bd52b553180e8d06cc8d51063b, 0x01bfea0019b20b7ced4c5fe09c39b9, 0x006238], + }, + BigNum { + limbs: [0x435d45df81fc513e24cf88d26d14bd, 0x4e82e0a4d4c5a66c4465ffe15f6be2, 0x00628f], + }, + BigNum { + limbs: [0x7a46bd207c5fadc1db30762d92eb44, 0x58d048f8a8828ccd93a209c0789971, 0x00115e], + }, + BigNum { + limbs: [0x5755762ed0dc2e1fda0410c4e4d674, 0x48feadc8d91349f2892deb1068f424, 0x0025ff], + }, + BigNum { + limbs: [0x664e8cd12d7fd0e025fbee3b1b298d, 0x5e547bd4a434e9474eda1e916f112f, 0x004dee], + }, + BigNum { + limbs: [0x976a04577e50444bc5e118fb425b35, 0xe8512409c3857773b21c8454d0d6c7, 0x001273], + }, + BigNum { + limbs: [0x2639fea8800bbab43a1ee604bda4cc, 0xbf020593b9c2bbc625eb854d072e8c, 0x006179], + }, + BigNum { + limbs: [0x4fb65d28974f6792018eab205ac3e1, 0x8d26543a3a60f8147ec78eec0ecf24, 0x006da6], + }, + BigNum { + limbs: [0x6deda5d7670c976dfe7153dfa53c20, 0x1a2cd56342e73b2559407ab5c9362f, 0x000647], + }, + BigNum { + limbs: [0x98fe6b6879e3c225a29005376888d7, 0x028e0bf569fd1c2b22c48fbf68ae2d, 0x000ebb], + }, + BigNum { + limbs: [0x24a5979784783cda5d6ff9c897772a, 0xa4c51da8134b170eb54379e26f5726, 0x006532], + }, + BigNum { + limbs: [0x5c491d95facfe2393b548d4204a51f, 0xc40edecaced7de301cf8986c431565, 0x0020c0], + }, + BigNum { + limbs: [0x615ae56a038c1cc6c4ab71bdfb5ae2, 0xe3444ad2ae705509bb0f713594efee, 0x00532c], + }, + BigNum { + limbs: [0xad139cafdaa772d6e616c9c1421c9e, 0x0a3d1e68f810578306d723b212c53f, 0x00348b], + }, + BigNum { + limbs: [0x1090665023b48c2919e9353ebde363, 0x9d160b348537dbb6d130e5efc54014, 0x003f62], + }, + BigNum { + limbs: [0x700a79da2ac3c6085f76ac583f79a0, 0x140bc42b07da6b95d0e40b88b4ff01, 0x002e99], + }, + BigNum { + limbs: [0x4d998925d39838f7a08952a7c08661, 0x93476572756dc7a40723fe19230652, 0x004554], + }, + BigNum { + limbs: [0x81818041738bf1e847f9433776feb1, 0x0ebca8a36a05a5b6c8dde49bad804f, 0x00290a], + }, + BigNum { + limbs: [0x3c2282be8ad00d17b806bbc8890150, 0x989680fa13428d830f2a25062a8504, 0x004ae3], + }, + BigNum { + limbs: [0x309e790e65064e32306af340c1db2d, 0x686764a69972d87fb06401dd4ca805, 0x000bd0], + }, + BigNum { + limbs: [0x8d0589f19955b0cdcf950bbf3e24d4, 0x3eebc4f6e3d55aba27a407c48b5d4e, 0x00681d], + }, + BigNum { + limbs: [0xde5b52cfa56e5ef9702d02ce6b3081, 0xdded4361edc32293b4da09077a31d3, 0x001395], + }, + BigNum { + limbs: [0xdf48b03058eda0068fd2fc3194cf80, 0xc965e63b8f8510a6232e009a5dd37f, 0x006057], + }, + BigNum { + limbs: [0x3a7a3a30e164ebf89184cfc722bd9f, 0x110afa3cec1ecf530b2c40345efea5, 0x000c0f], + }, + BigNum { + limbs: [0x8329c8cf1cf713076e7b2f38dd4262, 0x96482f60912963e6ccdbc96d7906ae, 0x0067de], + }, + BigNum { + limbs: [0x82c7aa2f50c6718c98f99408577a27, 0x59b976e328f1826addffd2285db4e5, 0x002059], + }, + BigNum { + limbs: [0x3adc58d0ad958d7367066af7a885da, 0x4d99b2ba5456b0cefa0837797a506e, 0x005394], + }, + BigNum { + limbs: [0x8fd7eef9244cb298fb4636446409e3, 0x01c7ef28e18206ab7288252332b360, 0x004783], + }, + BigNum { + limbs: [0x2dcc1406da0f4c6704b9c8bb9bf61e, 0xa58b3a749bc62c8e657fe47ea551f3, 0x002c6a], + }, + BigNum { + limbs: [0x32aeceebd86026c4febf0b91c6806d, 0xa560942c6498c9107c1635743781d4, 0x0012a7], + }, + BigNum { + limbs: [0x8af5341425fbd83b0140f36e397f94, 0x01f2957118af6a295bf1d42da0837f, 0x006146], + }, + BigNum { + limbs: [0x1d7f2bc75be4ac1b670bcfcf1f849a, 0x509f02a10d5b316a6fe11176b0f9a8, 0x003c30], + }, + BigNum { + limbs: [0xa024d738a27752e498f42f30e07b67, 0x56b426fc6fed01cf6826f82b270bab, 0x0037bd], + }, + BigNum { + limbs: [0xafa9321aff17c9004c5e11eb9505f9, 0x07f5cae1a195084571c7ab7696e4c1, 0x002e99], + }, + BigNum { + limbs: [0x0dfad0e4ff4435ffb3a1ed146afa08, 0x9f5d5ebbdbb32af466405e2b412092, 0x004554], + }, + BigNum { + limbs: [0x292d24283ac6fa129eee3f986b8455, 0x05c46d5e39f3855c0d1a0fb582e60a, 0x003852], + }, + BigNum { + limbs: [0x9476ded7c39504ed6111bf67947bac, 0xa18ebc3f4354adddcaedf9ec551f49, 0x003b9b], + }, + BigNum { + limbs: [0xff6d043f13d90de781a5b5ae382857, 0xc1f34621fa6d9a2287d5f9220e2fb7, 0x003caa], + }, + BigNum { + limbs: [0xbe36fec0ea82f1187e5a4951c7d7aa, 0xe55fe37b82da99175032107fc9d59b, 0x003742], + }, + BigNum { + limbs: [0x36a4cdd6c52bf66dea2db07aecfb2c, 0xb07666086a21dc850dde1ba420a978, 0x00081f], + }, + BigNum { + limbs: [0x86ff35293930089215d24e851304d5, 0xf6dcc395132656b4ca29edfdb75bdb, 0x006bcd], + }, + BigNum { + limbs: [0xcff89970e84a2fd43576dcf6601f6a, 0x95fd98daca15ee47fe04bc7132137e, 0x0020d0], + }, + BigNum { + limbs: [0xedab698f1611cf2bca8922099fe097, 0x115590c2b33244f1da034d30a5f1d4, 0x00531d], + }, + BigNum { + limbs: [0x4bf510cf7c7c8c9e768704f04e2b80, 0x2d1b75a1ffc63094c7611bdd129b82, 0x002527], + }, + BigNum { + limbs: [0x71aef23081df72618978fa0fb1d481, 0x7a37b3fb7d8202a510a6edc4c569d1, 0x004ec6], + }, + BigNum { + limbs: [0xc766da81eb5f3a10cba8cca132a4af, 0x9895da559f7bcc1f97abceafe390c3, 0x002aef], + }, + BigNum { + limbs: [0xf63d287e12fcc4ef3457325ecd5b52, 0x0ebd4f47ddcc671a405c3af1f4748f, 0x0048fe], + }, + BigNum { + limbs: [0x77ccfd0e68f45d81c3ad1e35f68aa0, 0x04249a2841514c8df7a0b2153271d0, 0x007214], + }, + BigNum { + limbs: [0x45d705f19567a17e3c52e0ca097561, 0xa32e8f753bf6e6abe067578ca59383, 0x0001d9], + }, + BigNum { + limbs: [0xe42b3486654278312cda878efea016, 0x69b4cb4cf4fafbed3003ef8c3a813e, 0x001cc7], + }, + BigNum { + limbs: [0xd978ce79991986ced3257771015feb, 0x3d9e5e50884d374ca8041a159d8414, 0x005726], + }, + BigNum { + limbs: [0xdc08ba88d180d93188d4192bcfb84d, 0xa6db496e5b977354760383a269ab6e, 0x001e05], + }, + BigNum { + limbs: [0xe19b48772cdb25ce772be5d43047b4, 0x0077e02f21b0bfe5620485ff6e59e4, 0x0055e8], + }, + BigNum { + limbs: [0x9617aa98504fbcdf57909bea0a2da4, 0x5272602dee9b726a2311ddae84a49a, 0x005643], + }, + BigNum { + limbs: [0x278c5867ae0c4220a86f6315f5d25d, 0x54e0c96f8eacc0cfb4f62bf35360b9, 0x001daa], + }, + BigNum { + limbs: [0x74a072f75e1eafc6b7ae4cbe9918df, 0x0ca1fa1ca2ce7bd130433636e1f719, 0x003963], + }, + BigNum { + limbs: [0x49039008a03d4f394851b24166e722, 0x9ab12f80da79b768a7c4d36af60e3a, 0x003a8a], + }, + BigNum { + limbs: [0x0e4544b75517c16711866509b0117e, 0x8e613f107412f75f355eb5219f4d29, 0x005860], + }, + BigNum { + limbs: [0xaf5ebe48a9443d98ee7999f64fee83, 0x18f1ea8d09353bdaa2a9548038b82a, 0x001b8d], + }, + BigNum { + limbs: [0x6b2362c6e3206af330c75237fd3287, 0xcf9dbeeb7a113d432c185eaed41723, 0x003918], + }, + BigNum { + limbs: [0x5280a0391b3b940ccf38acc802cd7a, 0xd7b56ab20336f5f6abefaaf303ee30, 0x003ad4], + }, + BigNum { + limbs: [0xfe6141c56e87705d1a4de431b14902, 0xb6f79972f279436a9109526def19bc, 0x000611], + }, + BigNum { + limbs: [0xbf42c13a8fd48ea2e5b21ace4eb6ff, 0xf05b902a8aceefcf46feb733e8eb96, 0x006ddb], + }, + BigNum { + limbs: [0x771ac41ed853a25780bbfe03ec55d5, 0xa563d5b51c810b94291b65dd88b855, 0x000bf6], + }, + BigNum { + limbs: [0x46893ee126085ca87f4400fc13aa2c, 0x01ef53e860c727a5aeeca3c44f4cfe, 0x0067f7], + }, + BigNum { + limbs: [0x3ef3285a12e45cc86a0ebf672f9539, 0x73a1f676d8115d3e5f439eda2e7ab2, 0x001b27], + }, + BigNum { + limbs: [0x7eb0daa5eb77a23795f13f98d06ac8, 0x33b13326a536d5fb78c46ac7a98aa1, 0x0058c6], + }, + BigNum { + limbs: [0x078bb4a345264200b56e295c87eb31, 0x8d23be8445a567589623fdf89c7c4c, 0x002c63], + }, + BigNum { + limbs: [0xb6184e5cb935bcff4a91d5a37814d0, 0x1a2f6b1937a2cbe141e40ba93b8907, 0x00478a], + }, + BigNum { + limbs: [0xc428f8a2654518b52166440df9b688, 0x3d89e044cc6c8191cc5fd4eb468731, 0x002ec4], + }, + BigNum { + limbs: [0xf97b0a5d9916e64ade99baf2064979, 0x69c94958b0dbb1a80ba834b6917e21, 0x004529], + }, + BigNum { + limbs: [0x356a0242c49b8fb3212df6a0e2db64, 0x410905166866b24236a3c7e932fe37, 0x004cde], + }, + BigNum { + limbs: [0x883a00bd39c06f4cded2085f1d249d, 0x664a248714e180f7a16441b8a5071c, 0x00270f], + }, + BigNum { + limbs: [0x4a92da52332af0b26f1f6b19b802a2, 0x903bb1db99afcd62607b6d2f5a7aed, 0x005ee5], + }, + BigNum { + limbs: [0x731128adcb310e4d90e093e647fd5f, 0x171777c1e39865d7778c9c727d8a66, 0x001508], + }, + BigNum { + limbs: [0x34b261df65292e9ebf6443bba0f2ed, 0x19bd16418157f24ce6e76cd2d04b7e, 0x0060b4], + }, + BigNum { + limbs: [0x88f1a1209932d061409bbb445f0d14, 0x8d96135bfbf040ecf1209ccf07b9d5, 0x001339], + }, + BigNum { + limbs: [0x3654f0611097c6b6a28c1f1914c201, 0x62bf4cb52ef4097fce3915c694a5c5, 0x004e30], + }, + BigNum { + limbs: [0x874f129eedc438495d73dfe6eb3e00, 0x4493dce84e5429ba09cef3db435f8e, 0x0025bd], + }, + BigNum { + limbs: [0xa053141f7d3d7cf9065e7bcadcfc19, 0xb655d0e63d59e74dac8f8f64831f8c, 0x006be1], + }, + BigNum { + limbs: [0x1d50eee0811e8206f9a183352303e8, 0xf0fd58b73fee4bec2b787a3d54e5c7, 0x00080b], + }, + BigNum { + limbs: [0x1211542079c63a04b57a388ce6c261, 0x7bac5f90a18bb38f7e83bd6db07800, 0x00699e], + }, + BigNum { + limbs: [0xab92aedf8495c4fb4a85c673193da0, 0x2ba6ca0cdbbc7faa59844c34278d53, 0x000a4f], + }, + BigNum { + limbs: [0x0ee0c64f8b7ac1ff7ba2024a37b7bb, 0x93e4697b1d9ce0c431b6db18076ff9, 0x000834], + }, + BigNum { + limbs: [0xaec33cb072e13d00845dfcb5c84846, 0x136ec0225fab5275a6512e89d0955a, 0x006bb9], + }, + BigNum { + limbs: [0x01fa182468ba7c595e445abe442dca, 0x879144d0fcd2fcc9670838442647e3, 0x0051e8], + }, + BigNum { + limbs: [0xbba9eadb95a182a6a1bba441bbd237, 0x1fc1e4cc8075367070ffd15db1bd70, 0x002205], + }, + BigNum { + limbs: [0x9afd4618c5e1bc80afccf22a6f8a52, 0x1540ac49fb06bbc6c6b9a9fc918afb, 0x005101], + }, + BigNum { + limbs: [0x22a6bce7387a427f50330cd59075af, 0x92127d5382417773114e5fa5467a58, 0x0022ec], + }, + BigNum { + limbs: [0x1ee525b1ec67d1c5c9581135a7ab68, 0x30ea2e1c440d8b23d1f54cdf1fae7b, 0x00349e], + }, + BigNum { + limbs: [0x9ebedd4e11f42d3a36a7edca585499, 0x7668fb81393aa8160612bcc2b856d8, 0x003f4f], + }, + BigNum { + limbs: [0xae2ac8e1522fb525497b14298a9c76, 0x29bc131a89602fe31e0bda03eafb9b, 0x005ebe], + }, + BigNum { + limbs: [0x0f793a1eac2c49dab684ead675638b, 0x7d971682f3e80356b9fc2f9ded09b8, 0x00152f], + }, + BigNum { + limbs: [0x5b2f702a43d37b7ab8dac27f3e254c, 0x42d5471bc24662632562d7c80a5369, 0x0064a9], + }, + BigNum { + limbs: [0x627492d5ba88838547253c80c1dab5, 0x647de281bb01d0d6b2a531d9cdb1ea, 0x000f44], + }, + BigNum { + limbs: [0x77c91e81814f8b58eef8ea01b32225, 0xbbcf1c263cfc2d486a35143271ee7d, 0x003ea3], + }, + BigNum { + limbs: [0x45dae47e7d0c73a7110714fe4cdddc, 0xeb840d77404c05f16dd2f56f6616d6, 0x003549], + }, + BigNum { + limbs: [0x7e33d54601da6d389208e6356979ab, 0xc09b9fa4dfb218819428c8056d1d39, 0x0028c1], + }, + BigNum { + limbs: [0x3f702db9fc8191c76df718ca968656, 0xe6b789f89d961ab843df419c6ae81a, 0x004b2b], + }, + BigNum { + limbs: [0xa5905736c46ea4c5475b119e356265, 0xd098fc0f8207b6faf0e0d74f7a1025, 0x00690b], + }, + BigNum { + limbs: [0x1813abc939ed5a3ab8a4ed61ca9d9c, 0xd6ba2d8dfb407c3ee72732525df52e, 0x000ae1], + }, + BigNum { + limbs: [0xc3720c7bf19f0c42aa886429513423, 0xef4adbfcd69d77f7f625dacb9ddb3b, 0x0045eb], + }, + BigNum { + limbs: [0xfa31f6840cbcf2bd55779ad6aecbde, 0xb8084da0a6aabb41e1e22ed63a2a17, 0x002e01], + }, + BigNum { + limbs: [0xd1b9212b65bf214e921640c47a0a45, 0xd6554ec4fbad86e639ebf267f538dd, 0x00278f], + }, + BigNum { + limbs: [0xebeae1d4989cddb16de9be3b85f5bc, 0xd0fddad8819aac539e1c1739e2cc75, 0x004c5d], + }, + BigNum { + limbs: [0x0c31c44ac745f527c512ff22e85c3a, 0x2e4cd97518258238f206e24c0b1c2b, 0x002cbc], + }, + BigNum { + limbs: [0xb1723eb5371609d83aecffdd17a3c7, 0x790650286522b100e6012755cce928, 0x004731], + }, + BigNum { + limbs: [0x9989268429206117d51008e47afac8, 0x2c5a3a4f9c6aeb6b7a036c657da412, 0x001856], + }, + BigNum { + limbs: [0x241adc7bd53b9de82aeff61b850539, 0x7af8ef4de0dd47ce5e049d3c5a6141, 0x005b97], + }, + BigNum { + limbs: [0x3c1bffa488ae4c91a9d99c561db4f3, 0x5df95918a808d3a4931256f1413ddf, 0x002162], + }, + BigNum { + limbs: [0x8188035b75adb26e562662a9e24b0e, 0x4959d084d53f5f9544f5b2b096c774, 0x00528b], + }, + BigNum { + limbs: [0xfb570516b5e5cefc96ef08c768f7bb, 0x202424aab720e62747593b3d0256dd, 0x004ae0], + }, + BigNum { + limbs: [0xc24cfde9487630036910f638970846, 0x872f04f2c6274d1290aece64d5ae75, 0x00290d], + }, + BigNum { + limbs: [0x6d477b956af945571da68e63a7c767, 0xa9008ab58c52c373a0f84872096ba6, 0x005eed], + }, + BigNum { + limbs: [0x505c876a9362b9a8e259709c58389a, 0xfe529ee7f0f56fc6370fc12fce99ad, 0x0014ff], + }, + BigNum { + limbs: [0xc5dd2ae9e83d223d69281ae1af9955, 0x35a347e2e5a7d5bf621e6cdc1ff837, 0x00668d], + }, + BigNum { + limbs: [0xf7c6d816161edcc296d7e41e5066ac, 0x71afe1ba97a05d7a75e99cc5b80d1b, 0x000d60], + }, + BigNum { + limbs: [0xba0324468f865128736875d438f2d6, 0x73380eda1d3ba312905b71fb212d57, 0x001dae], + }, + BigNum { + limbs: [0x03a0deb96ed5add78c97892bc70d2b, 0x341b1ac3600c902747ac97a6b6d7fc, 0x00563f], + }, + BigNum { + limbs: [0x5e326a7b6d1553fd517bb125e87aa6, 0xbdab877991b02c465a03f89c87977d, 0x000c40], + }, + BigNum { + limbs: [0x5f7198849146ab02ae844dda17855b, 0xe9a7a223eb9806f37e041105506dd6, 0x0067ac], + }, + BigNum { + limbs: [0x5b47aa7fc702df407a3035875afd49, 0xa961d2308993234e4002f9a199a5c3, 0x004f00], + }, + BigNum { + limbs: [0x625c588037591fbf85cfc978a502b8, 0xfdf1576cf3b50feb980510003e5f90, 0x0024ec], + }, + BigNum { + limbs: [0xfb9dc693cfbdcbd6d7b660f42ebdf7, 0xe8ad2baf59d5de4ac442c8ffc9599c, 0x004111], + }, + BigNum { + limbs: [0xc2063c6c2e9e332928499e0bd1420a, 0xbea5fdee237254ef13c540a20eabb6, 0x0032db], + }, + BigNum { + limbs: [0x14d71f3d115d480b10922f5983b2e8, 0x80c524bd040ea27554f6cda2dd8143, 0x0046bf], + }, + BigNum { + limbs: [0xa8cce3c2ecfeb6f4ef6dcfa67c4d19, 0x268e04e0793990c483113bfefa8410, 0x002d2e], + }, + BigNum { + limbs: [0x8a4ccd5a8ffdaea479ce0adf737d2c, 0x281fc9738b6acf6a3c9e3de03c4b9f, 0x0057b4], + }, + BigNum { + limbs: [0x335735a56e5e505b8631f4208c82d5, 0x7f336029f1dd63cf9b69cbc19bb9b4, 0x001c39], + }, + BigNum { + limbs: [0xfa9da9aea7b7a807f3949ff7497ac4, 0x94e273230bc82fa52c43468bc2cb46, 0x0067d1], + }, + BigNum { + limbs: [0xc306595156a456f80c6b5f08b6853d, 0x1270b67a71800394abc4c316153a0c, 0x000c1c], + }, + BigNum { + limbs: [0xf90efcf7889498c0fa84462b5be3f9, 0x506cf5b4ad5c5dfa071dbcb2f776a7, 0x004583], + }, + BigNum { + limbs: [0xc495060875c7663f057bb8d4a41c08, 0x56e633e8cfebd53fd0ea4ceee08eab, 0x002e6a], + }, + BigNum { + limbs: [0x4bd6bd4ae9ab1cba6dbc0d400aabca, 0x020cfd306c1de084a51cd4d6f9f64b, 0x00678e], + }, + BigNum { + limbs: [0x71cd45b514b0e2459243f1bff55437, 0xa5462c6d112a52b532eb34cade0f08, 0x000c5f], + }, + BigNum { + limbs: [0xadc30be0afecd9400809b932c038e7, 0x6d07fcafce4a9a767be86caf30f381, 0x0063a0], + }, + BigNum { + limbs: [0x0fe0f71f4e6f25bff7f645cd3fc71a, 0x3a4b2cedaefd98c35c1f9cf2a711d2, 0x00104d], + }, + BigNum { + limbs: [0xfe8d47e5eb3bac52f1982243ace47a, 0xd6124eee8fcbbcf665d106968cdd39, 0x0039da], + }, + BigNum { + limbs: [0xbf16bb1a132052ad0e67dcbc531b87, 0xd140daaeed7c76437237030b4b2819, 0x003a12], + }, + BigNum { + limbs: [0x8b5ce291f218c9dd74958e6cca1c43, 0x7e5763a2583ce605c2850effefc8c8, 0x00144b], + }, + BigNum { + limbs: [0x3247206e0c4335228b6a709335e3be, 0x28fbc5fb250b4d341582faa1e83c8b, 0x005fa2], + }, + BigNum { + limbs: [0x2e5e696f842cffe144608f74eaac1b, 0x8fb393a3ab78c209cb769b65fa1ebe, 0x0030f6], + }, + BigNum { + limbs: [0x8f4599907a2eff1ebb9f6f8b1553e6, 0x179f95f9d1cf71300c916e3bdde695, 0x0042f7], + }, + BigNum { + limbs: [0xa5b8d3dda353e8a443e6dbbea71c3d, 0x4da2acaeebdd573de9e05c005ca05c, 0x003e26], + }, + BigNum { + limbs: [0x17eb2f225b08165bbc19234158e3c4, 0x59b07cee916adbfbee27ada17b64f7, 0x0035c7], + }, + BigNum { + limbs: [0x78b65b0a65311a96bd8776dcb3a3de, 0x40eea7b1a760a3c8fb7b4ca1b1ceb3, 0x000c7f], + }, + BigNum { + limbs: [0x44eda7f5992ae469427888234c5c23, 0x666481ebd5e78f70dc8cbd002636a0, 0x00676e], + }, + BigNum { + limbs: [0xdc89a891d9f52411e9aa243ff64fb7, 0xf8687719af42f436be5744d2fd476f, 0x0005fd], + }, + BigNum { + limbs: [0xe11a5a6e2466daee1655dac009b04a, 0xaeeab283ce053f0319b0c4cedabde3, 0x006def], + }, + BigNum { + limbs: [0xa76a4d12a65a59e004a8616ad310f0, 0xdcd7f3e6f15ec6c4f5b601e21ff0d9, 0x0016c4], + }, + BigNum { + limbs: [0x1639b5ed5801a51ffb579d952cef11, 0xca7b35b68be96c74e25207bfb8147a, 0x005d28], + }, + BigNum { + limbs: [0x0467bb084c964790407b4446e144b0, 0x40ff209302f1e88adcdbbfcc7732aa, 0x004269], + }, + BigNum { + limbs: [0xb93c47f7b1c5b76fbf84bab91ebb51, 0x6654090a7a564aaefb2c49d560d2a9, 0x003184], + }, + BigNum { + limbs: [0x7f89984e1f494bd58aa66bb4834fd9, 0xf85ceb431b3e231aa97f1b81adbf24, 0x000a1c], + }, + BigNum { + limbs: [0x3e1a6ab1df12b32a7559934b7cb028, 0xaef63e5a620a101f2e88ee202a462f, 0x0069d0], + }, + BigNum { + limbs: [0x6e71b10378df567095602a91bfeb57, 0x333f31a2b277845fe7e2ace6ee7a68, 0x0068bf], + }, + BigNum { + limbs: [0x4f3251fc857ca88f6a9fd46e4014aa, 0x7413f7facad0aed9f0255cbae98aeb, 0x000b2e], + }, + BigNum { + limbs: [0x72e12d4ef7b1bc1d048d5e4c8f92d5, 0x1919c9e42d245edfec475cd95fd90c, 0x0006dd], + }, + BigNum { + limbs: [0x4ac2d5b106aa42e2fb72a0b3706d2c, 0x8e395fb95023d459ebc0acc8782c47, 0x006d10], + }, + BigNum { + limbs: [0xa6caeec0019cce89f8a28c04b02908, 0x4254d49cb10f9468da4449c73ffa3f, 0x002507], + }, + BigNum { + limbs: [0x16d9143ffcbf3076075d72fb4fd6f9, 0x64fe5500cc389ed0fdc3bfda980b14, 0x004ee6], + }, + BigNum { + limbs: [0x7678b48bb1db8fb4bd8e160157197c, 0x9af535ae0e253b310b396831542a11, 0x004279], + }, + BigNum { + limbs: [0x472b4e744c806f4b4271e8fea8e685, 0x0c5df3ef6f22f808cccea17083db42, 0x003174], + }, + BigNum { + limbs: [0xc281a93aef62e96137a691be2497f9, 0xd3cb28a3b5a16588627f08e73b1b20, 0x004bab], + }, + BigNum { + limbs: [0xfb2259c50ef9159ec8596d41db6808, 0xd38800f9c7a6cdb1758900ba9cea32, 0x002841], + }, + BigNum { + limbs: [0xf4c10059af274ee2cc0434baf3e2fb, 0xd18546fdbca8764eb4562d580122db, 0x001aec], + }, + BigNum { + limbs: [0xc8e302a64f34b01d33fbca450c1d06, 0xd5cde29fc09fbceb23b1dc49d6e277, 0x005900], + }, + BigNum { + limbs: [0x2d6fb35a5cecb4467864c0e822f4f6, 0x40d594cfa384a9b31eb7a0574d1a1c, 0x001a4b], + }, + BigNum { + limbs: [0x90344fa5a16f4ab9879b3e17dd0b0b, 0x667d94cdd9c38986b950694a8aeb37, 0x0059a2], + }, + BigNum { + limbs: [0x0048cde3a189929b8c6581b7a57bb6, 0xc9c6a859b493283d27539aa3079e7e, 0x001a9f], + }, + BigNum { + limbs: [0xbd5b351c5cd26c64739a7d485a844b, 0xdd8c8143c8b50afcb0b46efed066d5, 0x00594d], + }, + BigNum { + limbs: [0x901f632ec9e7867e4f0728f664f220, 0x29d3d7d78713ff0e7a5f644cc3151a, 0x00256e], + }, + BigNum { + limbs: [0x2d849fd134747881b0f8d6099b0de1, 0x7d7f51c5f634342b5da8a55514f039, 0x004e7f], + }, + BigNum { + limbs: [0x8f4de46dd12913aa9ae8a21f3d3b2a, 0xc598ec5b2425c7cd9306078735756a, 0x006528], + }, + BigNum { + limbs: [0x2e561e922d32eb5565175ce0c2c4d7, 0xe1ba3d4259226b6c4502021aa28fe9, 0x000ec4], + }, + BigNum { + limbs: [0x13ba7565944c5b1543c85450272199, 0xf3850c2463a95f9cce23d45411857f, 0x00207f], + }, + BigNum { + limbs: [0xa9e98d9a6a0fa3eabc37aaafd8de68, 0xb3ce1d79199ed39d09e4354dc67fd4, 0x00536d], + }, + BigNum { + limbs: [0x46eb57ea4ac470f442b205efee0514, 0x43f88c427dfaf9484c246f79adca12, 0x00333c], + }, + BigNum { + limbs: [0x76b8ab15b3978e0bbd4df91011faed, 0x635a9d5aff4d39f18be39a282a3b41, 0x0040b1], + }, + BigNum { + limbs: [0xd2b436f50932afdcd4eae782b30688, 0x64dd8e54b387f9512866d3f7d41f14, 0x000837], + }, + BigNum { + limbs: [0xeaefcc0af5294f232b15177d4cf979, 0x42759b48c9c039e8afa135aa03e63e, 0x006bb6], + }, + BigNum { + limbs: [0x99d9214c68d624dc714980be571087, 0x9f73e4a877e46ea11c8dfdfe84358b, 0x001f19], + }, + BigNum { + limbs: [0x23cae1b39585da238eb67e41a8ef7a, 0x07df44f50563c498bb7a0ba353cfc8, 0x0054d4], + }, + BigNum { + limbs: [0x399fcbaaa521a98ea8afae00d170ae, 0x373c48aa371fc73ef01e4237d0cd62, 0x004d0a], + }, + BigNum { + limbs: [0x84043755593a5571575050ff2e8f53, 0x7016e0f346286bfae7e9c76a0737f1, 0x0026e3], + }, + BigNum { + limbs: [0x500eb02ee2d9b63e9fe4a0fd9609b0, 0x23d941e9787714e54cb0055d4e79e0, 0x0034ae], + }, + BigNum { + limbs: [0x6d9552d11b8248c1601b5e0269f651, 0x8379e7b404d11e548b580444898b73, 0x003f3f], + }, + BigNum { + limbs: [0x352480fa0142bbab3354b95ae621bc, 0x5126bd58cd82930f5e8f92bf19b8f0, 0x000cc6], + }, + BigNum { + limbs: [0x887f8205fd194354ccab45a519de45, 0x562c6c44afc5a02a797876e2be4c63, 0x006727], + }, + BigNum { + limbs: [0x62ded52fd700885ee20c0dd1b4a838, 0x1c067801129b35ed2aecb3a3c45a67, 0x00368a], + }, + BigNum { + limbs: [0x5ac52dd0275b76a11df3f12e4b57c9, 0x8b4cb19c6aacfd4cad1b55fe13aaec, 0x003d63], + }, + BigNum { + limbs: [0x66e7055dd8b9a9362010e8b6f2fca0, 0xb1192af8a686ae9351a4b09f45cf52, 0x006626], + }, + BigNum { + limbs: [0x56bcfda225a255c9dfef16490d0361, 0xf639fea4d6c184a686635902923601, 0x000dc6], + }, + BigNum { + limbs: [0x829fa9756239065149e6b135daad43, 0x1d92c648e00ac9797442364e2a520c, 0x0042df], + }, + BigNum { + limbs: [0x3b04598a9c22f8aeb6194dca2552be, 0x89c063549d3d69c063c5d353adb347, 0x00310e], + }, + BigNum { + limbs: [0x039c93ab01de8dc45d6a0ee42c235e, 0xe9a05d32ae0c342f0b767f189f73b8, 0x005802], + }, + BigNum { + limbs: [0xba076f54fc7d713ba295f01bd3dca3, 0xbdb2cc6acf3bff0acc918a8938919b, 0x001bea], + }, + BigNum { + limbs: [0x607690dcfab6e9e6e915abaf97bc2d, 0x7a3834c2b60b8fa3fe5f9b3c8ae049, 0x000023], + }, + BigNum { + limbs: [0x5d2d722303a5151916ea53506843d4, 0x2d1af4dac73ca395d9a86e654d250a, 0x0073ca], + }, + BigNum { + limbs: [0xf7e8d06558cc09c2361a9ef0904d55, 0xcd45c3e35c09548b704bd2ae612416, 0x003a9d], + }, + BigNum { + limbs: [0xc5bb329aa58ff53dc9e5600f6fb2ac, 0xda0d65ba213edeae67bc36f376e13c, 0x00394f], + }, + BigNum { + limbs: [0x366ec9858bbf6c69998015cfb618f9, 0x55e541519389f820338273189ec513, 0x0070c9], + }, + BigNum { + limbs: [0x8735397a729c9296667fe93049e708, 0x516de84be9be3b19a4859689394040, 0x000324], + }, + BigNum { + limbs: [0x991a8549b179952dfc1c048b1eebba, 0x4c4e68daaf27eca0d4a90b42cef9db, 0x002fd7], + }, + BigNum { + limbs: [0x24897db64ce269d203e3fa74e11447, 0x5b04c0c2ce204699035efe5f090b78, 0x004416], + }, + BigNum { + limbs: [0xaa6d581ed2c4bd1bfec4e31db595da, 0x7d5b0ed096e4303bd342e46dae0b30, 0x000674], + }, + BigNum { + limbs: [0x1336aae12b9741e4013b1be24a6a27, 0x29f81acce66402fe04c5253429fa23, 0x006d79], + }, + BigNum { + limbs: [0x81e1b366348d59d5008b415742cf2c, 0x1de08c44b05c5f9615ada1567cea0f, 0x001a24], + }, + BigNum { + limbs: [0x3bc24f99c9cea52aff74bda8bd30d5, 0x89729d58ccebd3a3c25a684b5b1b44, 0x0059c9], + }, + BigNum { + limbs: [0xe75b2f9b862e777f2812860a5e7bf6, 0x603dcb33a8f035c2af174b0de333ac, 0x002fce], + }, + BigNum { + limbs: [0xd648d364782d8780d7ed78f5a1840b, 0x47155e69d457fd7728f0be93f4d1a6, 0x00441f], + }, + BigNum { + limbs: [0x192102577134b3fe804b693688c917, 0x152542076b192914da850aa8c1ca1b, 0x003d77], + }, + BigNum { + limbs: [0xa48300a88d274b017fb495c97736ea, 0x922de796122f0a24fd82fef9163b38, 0x003676], + }, + BigNum { + limbs: [0xf4bccd99cb9046c44608878e56b18d, 0xe4da84bd62fbae9aa110d4844095c6, 0x001266], + }, + BigNum { + limbs: [0xc8e7356632cbb83bb9f77771a94e74, 0xc278a4e01a4c849f36f7351d976f8c, 0x006186], + }, + BigNum { + limbs: [0x311fa027a0f568823cb99f2c17bdcd, 0xf7cf11927e6353a2ae829e2dd36e96, 0x0072d2], + }, + BigNum { + limbs: [0x8c8462d85d66967dc3465fd3e84234, 0xaf84180afee4df9729856b740496bd, 0x00011a], + }, + BigNum { + limbs: [0x5c255fec426d8cdc8023c433014b7a, 0x1125fb8d170db8f63036640b7cfca4, 0x005ec0], + }, + BigNum { + limbs: [0x617ea313bbee72237fdc3accfeb487, 0x962d2e10663a7a43a7d1a5965b08af, 0x00152d], + }, + BigNum { + limbs: [0x234cc83e129d05cac696b0e5c3fcac, 0xfeb419a46ea5fcd501b9c2cf437010, 0x001c0a], + }, + BigNum { + limbs: [0x9a573ac1ebbef93539694e1a3c0355, 0xa89f0ff90ea23664d64e46d2949543, 0x0057e2], + }, + BigNum { + limbs: [0xe716e0f033f72b72498848fbc00998, 0xd0588d6029adaf665203abefaf0457, 0x001323], + }, + BigNum { + limbs: [0xd68d220fca64d38db677b6043ff669, 0xd6fa9c3d539a83d386045db22900fb, 0x0060c9], + }, + BigNum { + limbs: [0xa69c5cb7b5339c8b28202568c1191a, 0x7473aec107d89fd3fc0a318afa7228, 0x0010f4], + }, + BigNum { + limbs: [0x1707a64849286274d7dfd9973ee6e7, 0x32df7adc756f9365dbfdd816dd932b, 0x0062f9], + }, + BigNum { + limbs: [0x181f2d5d9e2a131245b9b503b948f7, 0x10fc1f1f45c512e78cf448f8beafff, 0x004bab], + }, + BigNum { + limbs: [0xa584d5a26031ebedba4649fc46b70a, 0x96570a7e378320524b13c0a9195554, 0x002842], + }, + BigNum { + limbs: [0x899c749fdaf665bc1548facb7b03c5, 0xc7d005315cea488effc435dd9245f1, 0x0047e6], + }, + BigNum { + limbs: [0x34078e6023659943eab7043484fc3c, 0xdf83246c205deaaad843d3c445bf62, 0x002c06], + }, + BigNum { + limbs: [0x980680010107783cd0d52868bd62f1, 0xff4f2394b51c1d27378dd579388bb1, 0x001b6d], + }, + BigNum { + limbs: [0x259d82fefd5486c32f2ad697429d10, 0xa8040608c82c1612a07a34289f79a2, 0x00587f], + }, + BigNum { + limbs: [0x0fda5051a37d3acd0cf163f403c594, 0x25d07b49a277db8a3197f6667f0a7c, 0x000aa3], + }, + BigNum { + limbs: [0xadc9b2ae5adec432f30e9b0bfc3a6d, 0x8182ae53dad057afa670133b58fad7, 0x00694a], + }, + BigNum { + limbs: [0xc4daee200c52605c067d108a5ba95a, 0x92c2bf28e2003a96940c094299dc62, 0x002976], + }, + BigNum { + limbs: [0xf8c914dff2099ea3f982ee75a456a7, 0x14906a749b47f8a343fc005f3e28f0, 0x004a77], + }, + BigNum { + limbs: [0xde75070be93e05f8f3ba3d42f36d2c, 0xd5e4479c8df0ecb3f50fb0f21337d1, 0x002414], + }, + BigNum { + limbs: [0xdf2efbf4151df9070c45c1bd0c92d5, 0xd16ee200ef574685e2f858afc4cd81, 0x004fd8], + }, + BigNum { + limbs: [0xf7bca4242070fcbc79729bfc181d87, 0xb15ea032d2eb3432303860656bc2eb, 0x004e23], + }, + BigNum { + limbs: [0xc5e75edbddeb0243868d6303e7e27a, 0xf5f4896aaa5cff07a7cfa93c6c4267, 0x0025c9], + }, + BigNum { + limbs: [0x5ef5e86046408143a898fb31c9c4ee, 0x91addd75800726e4c08df8991f67a0, 0x0056bd], + }, + BigNum { + limbs: [0x5eae1a9fb81b7dbc576703ce363b13, 0x15a54c27fd410c55177a1108b89db3, 0x001d30], + }, + BigNum { + limbs: [0x6e588415ecaa66b136effd3f67e4f0, 0xd8fd7bb9852f096506fcb28d9b7cf6, 0x0038ce], + }, + BigNum { + limbs: [0x4f4b7eea11b1984ec91001c0981b11, 0xce55ade3f81929d4d10b57143c885d, 0x003b1e], + }, + BigNum { + limbs: [0x8f36cb9e84d1b1630642f16c936994, 0xe75a382cbf2e02f0663c969124c698, 0x0067dc], + }, + BigNum { + limbs: [0x2e6d3761798a4d9cf9bd0d936c966d, 0xbff8f170be1a304971cb7310b33ebb, 0x000c10], + }, + BigNum { + limbs: [0xc391a44d095efb7975e7721deb1be9, 0xd069b7229003170842e6e017c538ea, 0x001403], + }, + BigNum { + limbs: [0xfa125eb2f4fd03868a188ce214e418, 0xd6e9727aed451c319521298a12cc68, 0x005fe9], + }, + BigNum { + limbs: [0x51d7689baf0f40f6c18c8d1ea26560, 0xb6ddd5775cb0f1982c73f8102e9d6d, 0x001b19], + }, + BigNum { + limbs: [0x6bcc9a644f4cbe093e7371e15d9aa1, 0xf0755426209741a1ab941191a967e6, 0x0058d3], + }, + BigNum { + limbs: [0xb10ea7a313f73e11fa377f6160c3e7, 0xf76f040b0a89bed4581761f087904e, 0x00346e], + }, + BigNum { + limbs: [0x0c955b5cea64c0ee05c87f9e9f3c1a, 0xafe4259272be74657ff0a7b1507505, 0x003f7e], + }, + BigNum { + limbs: [0xd73d5d3d1ebf4c2b27692f9d97b929, 0xc253a232e71502e1414cf60bcb7626, 0x004dd4], + }, + BigNum { + limbs: [0xe666a5c2df9cb2d4d896cf626846d8, 0xe4ff876a9633305896bb13960c8f2c, 0x002618], + }, + BigNum { + limbs: [0x01ab792405734124e37d7512d665de, 0x4efd72d699b6ad23b531fa5e728f48, 0x00502a], + }, + BigNum { + limbs: [0xbbf889dbf8e8bddb1c8289ed299a23, 0x5855b6c6e391861622d60f4365760b, 0x0023c3], + }, + BigNum { + limbs: [0x04625fcd552eb47e4f18a74d8f0ffc, 0x74e27cad0a2c5df5679e2874a63c51, 0x001b14], + }, + BigNum { + limbs: [0xb941a332a92d4a81b0e757b270f005, 0x3270acf0731bd5447069e12d31c902, 0x0058d9], + }, + BigNum { + limbs: [0x128954af94fd14686873f8ebe729d3, 0xaf07783cd487ebc8683b74daafca98, 0x0067d2], + }, + BigNum { + limbs: [0xab1aae50695eea97978c061418d62e, 0xf84bb160a8c047716fcc94c7283abb, 0x000c1a], + }, + BigNum { + limbs: [0x39c3bd751f2997989a8b21cb4b1481, 0xb14019f2da1c4b94376b4bf82d9ec8, 0x001e87], + }, + BigNum { + limbs: [0x83e0458adf3267676574dd34b4eb80, 0xf6130faaa32be7a5a09cbda9aa668b, 0x005565], + }, + BigNum { + limbs: [0x224e8044fb9b302d358051fe142663, 0x7e5dd2080df78bfe971e712d186e0a, 0x0041ee], + }, + BigNum { + limbs: [0x9b5582bb02c0ced2ca7fad01ebd99e, 0x28f557956f50a73b40e99874bf9749, 0x0031ff], + }, + BigNum { + limbs: [0x266e7302d6261ee8604ef138481f67, 0x4af099edb3d6b0bba73275b4fd222d, 0x003fb0], + }, + BigNum { + limbs: [0x97358ffd2835e0179fb10dc7b7e09a, 0x5c628fafc971827e30d593ecdae326, 0x00343d], + }, + BigNum { + limbs: [0xcd04d4f26b49a51297254297f78ee1, 0x396fe69b76655402529839aa08e182, 0x0029a6], + }, + BigNum { + limbs: [0xf09f2e0d931259ed68dabc68087120, 0x6de3430206e2df37856fcff7cf23d0, 0x004a47], + }, + BigNum { + limbs: [0x9a0420135c1e74d004fced7127bbd0, 0xfdaea9b84859439bb05a2196d21ca9, 0x006730], + }, + BigNum { + limbs: [0x239fe2eca23d8a2ffb03118ed84431, 0xa9a47fe534eeef9e27ade80b05e8aa, 0x000cbc], + }, + BigNum { + limbs: [0x9389ca095aa500706ae67706c752d6, 0x240d9f9006949ad4f83cf67b6dbbbc, 0x00710a], + }, + BigNum { + limbs: [0x2a1a38f6a3b6fe8f951987f938ad2b, 0x83458a0d76b39864dfcb13266a4997, 0x0002e3], + }, + BigNum { + limbs: [0x3128560305c8ef5a2396bbf9697fb6, 0xccabef53799b1e88e1d0d1f0dc5dc7, 0x003bc4], + }, + BigNum { + limbs: [0x8c7bacfcf8930fa5dc69430696804b, 0xdaa73a4a03ad14b0f63737b0fba78c, 0x003828], + }, + BigNum { + limbs: [0x7bdee41758cacac6c8da15682a43ad, 0xa255a42715a228e1ce9a9398792771, 0x0061ed], + }, + BigNum { + limbs: [0x41c51ee8a59134393725e997d5bc54, 0x04fd857667a60a58096d76095edde2, 0x001200], + }, + BigNum { + limbs: [0x36460c54463cd8f3645a8d9dd0449e, 0xc5e63ebd7c87a1375287bdfc69b2e7, 0x005f7a], + }, + BigNum { + limbs: [0x875df6abb81f260c9ba571622fbb63, 0xe16ceae000c0920285804ba56e526c, 0x001472], + }, + BigNum { + limbs: [0xe527d3c618bd91111135e45e927581, 0x651a3c71c35b24f44b3cbdee5bb69e, 0x0034e9], + }, + BigNum { + limbs: [0xd87c2f39e59e6deeeeca1aa16d8a80, 0x4238ed2bb9ed0e458ccb4bb37c4eb4, 0x003f04], + }, + BigNum { + limbs: [0x14bad0bf6f6300650f9beee20b5515, 0xe269c37d4d8412f381403b89980ee9, 0x00217b], + }, + BigNum { + limbs: [0xa8e932408ef8fe9af064101df4aaec, 0xc4e966202fc4204656c7ce183ff66a, 0x005271], + }, + BigNum { + limbs: [0x762a4c86bee8123a5f306e81360e77, 0x7337cf2dbc5743ce881218684db954, 0x0009e9], + }, + BigNum { + limbs: [0x4779b6793f73ecc5a0cf907ec9f18a, 0x341b5a6fc0f0ef6b4ff5f1398a4bff, 0x006a04], + }, + BigNum { + limbs: [0x9937ed82cb4a9fc76cd46491730168, 0xdc87d269cdd4133553ee41427fca0f, 0x001f19], + }, + BigNum { + limbs: [0x246c157d33115f38932b9a6e8cfe99, 0xcacb5733af7420048419c85f583b44, 0x0054d3], + }, + BigNum { + limbs: [0x56d7ccb64bbb09a91f10acaa57449b, 0x3d85d572d287a73bb732faaf08a75a, 0x004c45], + }, + BigNum { + limbs: [0x66cc3649b2a0f556e0ef5255a8bb66, 0x69cd542aaac08bfe20d50ef2cf5df9, 0x0027a8], + }, + BigNum { + limbs: [0x6f93db2578f813a18e4c1292f11cf2, 0x1640b859af326965abb4bbaf508f24, 0x003059], + }, + BigNum { + limbs: [0x4e1027da8563eb5e71b3ec6d0ee30f, 0x91127143ce15c9d42c534df287762f, 0x004394], + }, + BigNum { + limbs: [0x60ca413c1470f069cd62c92c7d3417, 0x0c87494cf671479a275b158a6c0d06, 0x006c26], + }, + BigNum { + limbs: [0x5cd9c1c3e9eb0e96329d35d382cbea, 0x9acbe05086d6eb9fb0acf4176bf84d, 0x0007c7], + }, + BigNum { + limbs: [0xb124828724cb9e6154c10541689b3b, 0x28ea95e4e4c038654cd2bddea77d27, 0x005169], + }, + BigNum { + limbs: [0x0c7f8078d990609eab3ef9be9764c6, 0x7e6893b89887fad48b354bc330882c, 0x002284], + }, + BigNum { + limbs: [0xd65e0a886ccc459e92185783bbf588, 0xf9623fbe85bf577afaa3b0aa4366e4, 0x003525], + }, + BigNum { + limbs: [0xe745f877918fb9616de7a77c440a79, 0xadf0e9def788dbbedd6458f7949e6e, 0x003ec7], + }, + BigNum { + limbs: [0x39b33948d004277c7c788388618a21, 0xd5d37bc89361ba87d73f16df38f517, 0x00166f], + }, + BigNum { + limbs: [0x83f0c9b72e57d78383877b779e75e0, 0xd17fadd4e9e678b200c8f2c29f103c, 0x005d7d], + }, + BigNum { + limbs: [0x0184807cbb3ccd17563741f5395c61, 0x191d96a87bdcf9bfabd2f465302102, 0x002917], + }, + BigNum { + limbs: [0xbc1f8283431f31e8a9c8bd0ac6a3a0, 0x8e3592f5016b397a2c35153ca7e451, 0x004ad6], + }, + BigNum { + limbs: [0x70b480ff3c8ada180c9ea7df3e2e1c, 0xb24c47cd173318b38cd42c7775b82f, 0x006df1], + }, + BigNum { + limbs: [0x4cef8200c1d124e7f3615720c1d1e5, 0xf506e1d066151a864b33dd2a624d24, 0x0005fb], + }, + BigNum { + limbs: [0xe0618f7723728fadfafe11076f83fb, 0xb65b78377562265e0e278de1545148, 0x0033f7], + }, + BigNum { + limbs: [0xdd427388dae96f520501edf8907c06, 0xf0f7b16607e60cdbc9e07bc083b40a, 0x003ff5], + }, + BigNum { + limbs: [0xe5d866c41107068d880fd835f7e59c, 0xfd30fb91fe1846ee4785af0c016f5e, 0x000ff9], + }, + BigNum { + limbs: [0xd7cb9c3bed54f87277f026ca081a65, 0xaa222e0b7f2fec4b90825a95d695f4, 0x0063f3], + }, + BigNum { + limbs: [0xb426361576c9da4906585ea02264ed, 0x7eb308dc00235023c5a79a89d2bbdf, 0x0032a6], + }, + BigNum { + limbs: [0x097dccea879224b6f9a7a05fdd9b14, 0x28a020c17d24e31612606f18054974, 0x004147], + }, + BigNum { + limbs: [0xa8b71686c297c367949e884db344bf, 0xdc7f753c1d55d80c7e16600602f704, 0x00100d], + }, + BigNum { + limbs: [0x14ecec793bc43b986b6176b24cbb42, 0xcad3b4615ff25b2d59f1a99bd50e4f, 0x0063df], + }, + BigNum { + limbs: [0xc575ec1a329a5541f33ede3b9f9399, 0x7826ed24369781fc49d19b208571ff, 0x002b29], + }, + BigNum { + limbs: [0xf82e16e5cbc1a9be0cc120c4606c68, 0x2f2c3c7946b0b13d8e366e81529353, 0x0048c4], + }, + BigNum { + limbs: [0xd485c1f50cc769de0283afe1cb6584, 0x56553e601b81d52738de72cd45e191, 0x005dda], + }, + BigNum { + limbs: [0xe91e410af1949521fd7c4f1e349a7d, 0x50fdeb3d61c65e129f2996d49223c1, 0x001613], + }, + BigNum { + limbs: [0x1fe5a5c8cfa8db155697e920b8c870, 0x4ccf3a7b715b6346c4d279d010a3a4, 0x000160], + }, + BigNum { + limbs: [0x9dbe5d372eb323eaa96815df473791, 0x5a83ef220beccff313358fd1c761af, 0x00728d], + }, + BigNum { + limbs: [0x99795435ca67fef6cc5689c1f540e1, 0x2cd7cfa083667322f2be809c88ff9b, 0x001572], + }, + BigNum { + limbs: [0x242aaeca33f4000933a9753e0abf20, 0x7a7b59fcf9e1c016e54989054f05b8, 0x005e7b], + }, + BigNum { + limbs: [0xba3d2b430423bbd2fee202f8577732, 0x8b74a34e54522dfa0d10e94de8286c, 0x002fb5], + }, + BigNum { + limbs: [0x0366d7bcfa38432d011dfc07a888cf, 0x1bde864f28f6053fcaf72053efdce7, 0x004438], + }, + BigNum { + limbs: [0xdbc3b2b164561896ce8e2e452c03e9, 0x67d41c98b8fa9829526ed6eec7578b, 0x0043ec], + }, + BigNum { + limbs: [0xe1e0504e9a05e6693171d0bad3fc18, 0x3f7f0d04c44d9b10859932b310adc7, 0x003001], + }, + BigNum { + limbs: [0x3a3bcba4e33b5f6e7f2a73337c97eb, 0xb18d510dd282977c9c840d057bc4a8, 0x0012ad], + }, + BigNum { + limbs: [0x8368375b1b209f9180d58bcc836816, 0xf5c5d88faac59bbd3b83fc9c5c40ab, 0x00613f], + }, + BigNum { + limbs: [0x546f42d2f2136ab70c1a97d4a5a28b, 0x519305a6a34d00a54824fbd3c944df, 0x0032b8], + }, + BigNum { + limbs: [0x6934c02d0c489448f3e5672b5a5d76, 0x55c023f6d9fb32948fe30dce0ec074, 0x004135], + }, + BigNum { + limbs: [0x565938c72e8dc88dd6a6cbf1ff3e4a, 0xdbdc2c56cc7d4b28d83b2561c2568a, 0x002e17], + }, + BigNum { + limbs: [0x674aca38cfce36722959330e00c1b7, 0xcb76fd46b0cae810ffcce44015aec9, 0x0045d5], + }, + BigNum { + limbs: [0x77ba8dbe3dfb062809456c05e23c98, 0x14671281b8a4b1b3a9be35f3271afe, 0x001935], + }, + BigNum { + limbs: [0x45e97541c060f8d7f6ba92fa1dc369, 0x92ec171bc4a381862e49d3aeb0ea55, 0x005ab8], + }, + BigNum { + limbs: [0x1096f45046dd52a99f6a0d133d06aa, 0x861a7b23584626170d92377f7b5e79, 0x004ed7], + }, + BigNum { + limbs: [0xad0d0eafb77eac566095f1ecc2f957, 0x2138ae7a25020d22ca75d2225ca6da, 0x002516], + }, + BigNum { + limbs: [0xe1ab1e5b93f822d0b94eb237110d9f, 0x5fa125e49db89d2655af277ba7868c, 0x0069f2], + }, + BigNum { + limbs: [0xdbf8e4a46a63dc2f46b14cc8eef262, 0x47b203b8df8f96138258e226307ec6, 0x0009fb], + }, + BigNum { + limbs: [0x6db8fecb665fa64c727ae95a4f1504, 0x4de5de9d149d0992379cc3665e3b80, 0x006d5c], + }, + BigNum { + limbs: [0x4feb043497fc58b38d8515a5b0eafd, 0x596d4b0068ab29a7a06b463b79c9d3, 0x000691], + }, + BigNum { + limbs: [0x62eebd2d2d03301254d2facb9c65ec, 0x9789160e7b8c0fe7473fe43df5ffa2, 0x000707], + }, + BigNum { + limbs: [0x5ab545d2d158ceedab2d0434639a15, 0x0fca138f01bc235290c82563e205b1, 0x006ce6], + }, + BigNum { + limbs: [0x34fabfe22bf195070a40826b0a8a22, 0x496805d716afcfe47a545cdc549868, 0x0045de], + }, + BigNum { + limbs: [0x88a9431dd26a69f8f5bf7c94f575df, 0x5deb23c6669863555db3acc5836ceb, 0x002e0f], + }, + BigNum { + limbs: [0x8e36a4f207ed7934afa23e4d664fb9, 0xe13b38a0e39adb1535f05011c0f97d, 0x001f5f], + }, + BigNum { + limbs: [0x2f6d5e0df66e85cb505dc0b299b048, 0xc617f0fc99ad5824a217b990170bd6, 0x00548d], + }, + BigNum { + limbs: [0x0efba3add1439fcda6025fcec5f85e, 0x23e39e3bddb85c5f7c6f1f39bb4a43, 0x004172], + }, + BigNum { + limbs: [0xaea85f522d185f3259fd9f313a07a3, 0x836f8b619f8fd6da5b98ea681cbb10, 0x00327b], + }, + BigNum { + limbs: [0x50fd367a04217a99f8b35c4feecc72, 0x3aeef6d281f2894bb176dc6c03beb7, 0x0000fa], + }, + BigNum { + limbs: [0x6ca6cc85fa3a8466074ca2b011338f, 0x6c6432cafb55a9ee26912d35d4469c, 0x0072f3], + }, + BigNum { + limbs: [0x3abeed94b4f1634be87dab9013c5e6, 0x7c84cd1b601bec56a6760508dcf493, 0x002bd5], + }, + BigNum { + limbs: [0x82e5156b496a9bb41782536fec3a1b, 0x2ace5c821d2c46e331920498fb10c0, 0x004818], + }, + BigNum { + limbs: [0x8726c067a90bbe12024f89b257ee62, 0x2e08318aeeacb408378170769053cb, 0x006b7e], + }, + BigNum { + limbs: [0x367d4298555040edfdb0754da8119f, 0x794af8128e9b7f31a086992b47b188, 0x00086f], + }, + BigNum { + limbs: [0xd18fa289732f688a5ee031a9245ad3, 0xbc0e64c9d219a8d562efc8186a2d24, 0x002969], + }, + BigNum { + limbs: [0xec1460768b2c9675a11fcd56dba52e, 0xeb44c4d3ab2e8a64751841896dd82e, 0x004a83], + }, + BigNum { + limbs: [0x427c3d5132b42adb5bf0d17886f914, 0x1b7bf18b694222c41c5896457592c9, 0x0009bb], + }, + BigNum { + limbs: [0x7b27c5aecba7d424a40f2d877906ed, 0x8bd7381214061075bbaf735c62728a, 0x006a32], + }, + BigNum { + limbs: [0xf4a328d6df60c441d4d6f8a6035ba1, 0x0e4e224ed50ccd12172874ef649f75, 0x0015ff], + }, + BigNum { + limbs: [0xc900da291efb3abe2b290659fca460, 0x9905074ea83b6627c0df94b27365dd, 0x005dee], + }, + BigNum { + limbs: [0x32eadeb2eaebb63bfd3383d2361246, 0xc05b04c9044fc6c5f0964c53353c45, 0x004c30], + }, + BigNum { + limbs: [0x8ab9244d137048c402cc7b2dc9edbb, 0xe6f824d478f86c73e771bd4ea2c90e, 0x0027bc], + }, + BigNum { + limbs: [0xe64e1a0d2e560d6e1499e715bda543, 0x278c6eed86f45ec8092b13ec8a7ecd, 0x00484d], + }, + BigNum { + limbs: [0xd755e8f2d005f191eb6617ea425abe, 0x7fc6baaff653d471cedcf5b54d8685, 0x002ba0], + }, + BigNum { + limbs: [0xa2a69107b6a980b482447428fa23ee, 0x7561de37d95e60cd66c57736477daa, 0x001a2c], + }, + BigNum { + limbs: [0x1afd71f847b27e4b7dbb8ad705dc13, 0x31f14b65a3e9d26c7142926b9087a9, 0x0059c1], + }, + BigNum { + limbs: [0x34a8335508915c9da5d0cc12724318, 0x78fad28e89573fde62c6b46b658a0f, 0x00242c], + }, + BigNum { + limbs: [0x88fbcfaaf5caa2625a2f32ed8dbce9, 0x2e58570ef3f0f35b75415536727b44, 0x004fc1], + }, + BigNum { + limbs: [0xd771dbf6e9599e6ae672da7b46fa2c, 0x3a0e0347179ccc16de33046dedfd4f, 0x005276], + }, + BigNum { + limbs: [0xe632270915026095198d2484b905d5, 0x6d45265665ab6722f9d50533ea0803, 0x002177], + }, + BigNum { + limbs: [0x50f41a25187433d5401e0e3fd3cfc1, 0x51bd4c910d3fe33c91024f7a8e43e3, 0x006e98], + }, + BigNum { + limbs: [0x6cafe8dae5e7cb2abfe1f0c02c3040, 0x5595dd0c70084ffd4705ba2749c170, 0x000555], + }, + BigNum { + limbs: [0x693136244c47d39006fed3cdaa0066, 0xa274da64baa96fb21ab194d4741dbd, 0x00004a], + }, + BigNum { + limbs: [0x5472ccdbb2142b6ff9012b3255ff9b, 0x04de4f38c29ec387bd5674cd63e796, 0x0073a3], + }, + BigNum { + limbs: [0x960d51bf6ae6f4e4ab5ac48f2bd9a6, 0x11dd7971e55a4d99e7da903c25f117, 0x006584], + }, + BigNum { + limbs: [0x2796b14093750a1b54a53a70d4265b, 0x9575b02b97ede59ff02d7965b2143c, 0x000e69], + }, + BigNum { + limbs: [0x60c1d07e6eeefc87b5eac39c929ac3, 0xe6212869277b67c6ec8885a28cd25a, 0x005d5f], + }, + BigNum { + limbs: [0x5ce232818f6d02784a153b636d653e, 0xc132013455cccb72eb7f83ff4b32f9, 0x00168d], + }, + BigNum { + limbs: [0xddf56e2cd4099acf38136ebca02c29, 0xac21cd03c9f223c6493f18cca8f69b, 0x003a40], + }, + BigNum { + limbs: [0xdfae94d32a526430c7ec90435fd3d8, 0xfb315c99b3560f738ec8f0d52f0eb7, 0x0039ac], + }, + BigNum { + limbs: [0x02b232af695bcf227fe83d53c1ddee, 0x912d964c2baf45393450556cb92530, 0x006af1], + }, + BigNum { + limbs: [0xbaf1d05095002fdd8017c1ac3e2213, 0x162593515198ee00a3b7b4351ee023, 0x0008fc], + }, + BigNum { + limbs: [0xa642214f0552fce5dcbdb1a601c023, 0xc5389b8a77563adc60186611634372, 0x001ccb], + }, + BigNum { + limbs: [0x1761e1b0f909021a23424d59fe3fde, 0xe21a8e1305f1f85d77efa39074c1e1, 0x005721], + }, + BigNum { + limbs: [0x62c16e272104bf004be4bfd097d114, 0xef816bc349c995e8b12f9a81eaa16a, 0x003adb], + }, + BigNum { + limbs: [0x5ae294d8dd573fffb41b3f2f682eed, 0xb7d1bdda337e9d5126d86f1fed63e9, 0x003911], + }, + BigNum { + limbs: [0xe4c9e2213e75a9aea4435a94a73592, 0x7bacf43b42c5ad0303a3834b35fc71, 0x005f05], + }, + BigNum { + limbs: [0xd8da20debfe655515bbca46b58ca6f, 0x2ba635623a828636d4648656a208e1, 0x0014e8], + }, + BigNum { + limbs: [0xaea472d254c55dee3ac1bc2e985d0e, 0x481c5fd3e525670a5d517f05737bda, 0x005dc7], + }, + BigNum { + limbs: [0x0eff902da996a111c53e42d167a2f3, 0x5f36c9c99822cc2f7ab68a9c648979, 0x001626], + }, + BigNum { + limbs: [0x95714916b52a44a1d1b433c6d47388, 0xf72b124899b39b47aca9f79b77ff22, 0x000957], + }, + BigNum { + limbs: [0x2832b9e94931ba5e2e4bcb392b8c79, 0xb0281754e39497f22b5e1206600631, 0x006a95], + }, + BigNum { + limbs: [0x3dab9667fd8d6bc0b912fc6ebb6b4d, 0xa957470b3b35b9ebd8849e767d8f1a, 0x00723d], + }, + BigNum { + limbs: [0x7ff86c9800ce933f46ed02914494b4, 0xfdfbe2924212794dff836b2b5a7639, 0x0001af], + }, + BigNum { + limbs: [0x1a6dd107013e8f532cb2e6d8d5aba7, 0x5fb4f46a87242dcbdd1d919b4e16c6, 0x004c9c], + }, + BigNum { + limbs: [0xa33631f8fd1d6facd34d18272a545a, 0x479e3532f624056dfaea780689ee8d, 0x002751], + }, + BigNum { + limbs: [0xdefdd5e0a986ed1c437a27915897ce, 0x95170c6c7a701e40b397a45127173a, 0x0043fb], + }, + BigNum { + limbs: [0xdea62d1f54d511e3bc85d76ea76833, 0x123c1d3102d814f924706550b0ee18, 0x002ff2], + }, + BigNum { + limbs: [0xbba69476fa5eda3561bfd6c71847fd, 0xc0f1216b6c3e53e37f41765245dfb3, 0x003b35], + }, + BigNum { + limbs: [0x01fd6e8903fd24ca9e402838e7b804, 0xe66208321109df5658c6934f9225a0, 0x0038b7], + }, + BigNum { + limbs: [0x1e4f3c2848bde33792a0704d7f3d5c, 0xa41db4f4117fa6964523fbe0428afd, 0x0028ea], + }, + BigNum { + limbs: [0x9f54c6d7b59e1bc86d5f8eb280c2a5, 0x033574a96bc88ca392e40dc1957a56, 0x004b03], + }, + BigNum { + limbs: [0x499179728f96587b47364abb902a7f, 0x06969e493afaf1cae603a9624c7f48, 0x0026cb], + }, + BigNum { + limbs: [0x7412898d6ec5a684b8c9b4446fd582, 0xa0bc8b54424d416ef204603f8b860b, 0x004d22], + }, + BigNum { + limbs: [0x2eab334af1e1da6d7b0ac353e2e894, 0xc71899852062fc6ecc48d2fcc38796, 0x0034e7], + }, + BigNum { + limbs: [0x8ef8cfb50c7a249284f53bac1d176d, 0xe03a90185ce536cb0bbf36a5147dbd, 0x003f05], + }, + BigNum { + limbs: [0xbaaa75d37ac780d245d76b67f27d60, 0x6941c2658187de20aaf30c6e820a8f, 0x0009bf], + }, + BigNum { + limbs: [0x02f98d2c83947e2dba2893980d82a1, 0x3e116737fbc055192d14fd3355fac4, 0x006a2e], + }, + BigNum { + limbs: [0x4d58135e5084d45283c7e8f859236e, 0xd03359beb3ea94caca1076aabb329a, 0x002fc3], + }, + BigNum { + limbs: [0x704befa1add72aad7c381607a6dc93, 0xd71fcfdec95d9e6f0df792f71cd2b9, 0x004429], + }, + BigNum { + limbs: [0x10e5e09d4a435c9c77c878f2bb8464, 0xf72162824b43a150ed4182d6c5cc71, 0x0021a4], + }, + BigNum { + limbs: [0xacbe2262b418a2638837860d447b9d, 0xb031c71b320491e8eac686cb1238e2, 0x005248], + }, + BigNum { + limbs: [0xf51d82b4bab62433c15d109a2b1351, 0xc51b3151c9ef8fa6d009cc1e058c1f, 0x000714], + }, + BigNum { + limbs: [0xc886804b43a5dacc3ea2ee65d4ecb0, 0xe237f84bb358a39307fe3d83d27933, 0x006cd8], + }, + BigNum { + limbs: [0x34ef3e831e2ed58ba307e4e30ab1d4, 0x08d18af837ce39c12f6fd503a491da, 0x006d88], + }, + BigNum { + limbs: [0x88b4c47ce02d29745cf81a1cf54e2d, 0x9e819ea54579f978a898349e337379, 0x000665], + }, + BigNum { + limbs: [0x336da7150fc15dddd56ac9a7dc56c7, 0x7d5317cd6abce54817f7fd9bdce46e, 0x004011], + }, + BigNum { + limbs: [0x8a365beaee9aa1222a95355823a93a, 0x2a0011d0128b4df1c0100c05fb20e5, 0x0033dc], + }, + BigNum { + limbs: [0x6ec9d66ed0d05112d7c36272dfa403, 0xc5d21eec1555ed81ca1bbc982e7922, 0x001ec1], + }, + BigNum { + limbs: [0x4eda2c912d8baded283c9c8d205bfe, 0xe1810ab167f245b80dec4d09a98c31, 0x00552b], + }, + BigNum { + limbs: [0xfa8f9106dce56dec7ec96011f79a3c, 0x1ac2f79b05e28225f2afe1f417c2c5, 0x0052ee], + }, + BigNum { + limbs: [0xc31471f92176911381369eee0865c5, 0x8c9032027765b113e55827adc0428d, 0x0020ff], + }, + BigNum { + limbs: [0x088b2b3a9aec775d554ddf3121ab7d, 0xfa53f3c7787f73c5ee3d79f317d56d, 0x00357f], + }, + BigNum { + limbs: [0xb518d7c5636f87a2aab21fcede5484, 0xacff35d604c8bf73e9ca8faec02fe6, 0x003e6d], + }, + BigNum { + limbs: [0xab1d2a69326150035433bf5ab27518, 0x9450acd956d2d3e5beb3e22dd68c4c, 0x0011d9], + }, + BigNum { + limbs: [0x1286d896cbfaaefcabcc3fa54d8ae9, 0x13027cc426755f5419542774017907, 0x006214], + }, + BigNum { + limbs: [0xb422d75c3d666f868f9ace7f0c05ad, 0x08fa0da5731b7a4f6bf340fd338d21, 0x003186], + }, + BigNum { + limbs: [0x09812ba3c0f58f7970653080f3fa54, 0x9e591bf80a2cb8ea6c14c8a4a47832, 0x004267], + }, + BigNum { + limbs: [0xa13ca9ab7aec628d9e085dbcf627b3, 0x2ceae6375943e17d761d599629634f, 0x0061f7], + }, + BigNum { + limbs: [0x1c675954836f9c7261f7a14309d84e, 0x7a684366240451bc61eab00baea204, 0x0011f6], + }, + BigNum { + limbs: [0x5a435445e20ad1603533d63a46811e, 0x107acd46e6ead73902c051a4f47a89, 0x001099], + }, + BigNum { + limbs: [0x6360aeba1c512d9fcacc28c5b97ee3, 0x96d85c56965d5c00d547b7fce38aca, 0x006354], + }, + BigNum { + limbs: [0x0f556c7dd965c9e662abd652bab712, 0x2868b33df772d83728a650fec1696a, 0x0039ae], + }, + BigNum { + limbs: [0xae4e968224f635199d5428ad4548ef, 0x7eea765f85d55b02af61b8a3169be9, 0x003a3f], + }, + BigNum { + limbs: [0x095888daa8cfdbbb8cc4d2edbd46d3, 0xae4dd751366cffd24594deb8870dde, 0x0007e3], + }, + BigNum { + limbs: [0xb44b7a25558c2344733b2c1242b92e, 0xf905524c46db336792732ae950f775, 0x006c09], + }, + BigNum { + limbs: [0x5aeccb05e4e36060803fc8de4668e8, 0x193723dba47ad8cbb8d047f3a39b0c, 0x00414b], + }, + BigNum { + limbs: [0x62b737fa19789e9f7fc03621b99719, 0x8e1c05c1d8cd5a6e1f37c1ae346a47, 0x0032a2], + }, + BigNum { + limbs: [0x1853b4ee0a8f23056507ef2eaa6a09, 0x0a90ca49d553e549f2ee40567332ca, 0x002d21], + }, + BigNum { + limbs: [0xa5504e11f3ccdbfa9af80fd15595f8, 0x9cc25f53a7f44defe519c94b64d289, 0x0046cc], + }, + BigNum { + limbs: [0x2624f47a7cc3c3863217230f4471f9, 0xa98b3d9bb1a86d72e5e027b600ea16, 0x00382c], + }, + BigNum { + limbs: [0x977f0e8581983b79cde8dbf0bb8e08, 0xfdc7ec01cb9fc5c6f227e1ebd71b3d, 0x003bc0], + }, + BigNum { + limbs: [0x833c9a0c4b5810f5b4c6b50487ae1f, 0x21f3bb92f58d494135cedd7cc2a033, 0x001be4], + }, + BigNum { + limbs: [0x3a6768f3b303ee0a4b3949fb7851e2, 0x855f6e0a87bae9f8a2392c25156520, 0x005809], + }, + BigNum { + limbs: [0xf382d2cf899e1c66a46ab4699489c6, 0xcabaccd26113e0b7a9efc26faa9532, 0x002803], + }, + BigNum { + limbs: [0xca21303074bde2995b954a966b763b, 0xdc985ccb1c3452822e1847322d7020, 0x004be9], + }, + BigNum { + limbs: [0x6910d639aefe17754b6a53fddc4c94, 0x88cd7576b823f47dfc583fe631a439, 0x0021d0], + }, + BigNum { + limbs: [0x54932cc64f5de78ab495ab0223b36d, 0x1e85b426c5243ebbdbafc9bba6611a, 0x00521d], + }, + BigNum { + limbs: [0x0d613cc36bfa358f848821e4356469, 0x09516722769df28de6c16bb4bbee36, 0x002f2b], + }, + BigNum { + limbs: [0xb042c63c9261c9707b77dd1bca9b98, 0x9e01c27b06aa40abf1469ded1c171d, 0x0044c2], + }, + BigNum { + limbs: [0x75d2d8c194a702ae113bb568e33c3c, 0xfd9bbe2b455b567ce9424c694ca7ba, 0x00596e], + }, + BigNum { + limbs: [0x47d12a3e69b4fc51eec449971cc3c5, 0xa9b76b7237ecdcbceec5bd388b5d99, 0x001a7e], + }, + BigNum { + limbs: [0xd67644ecb1ec23b5e2c92f7207066f, 0x3669f0b510aff120489b258ca13d29, 0x000c90], + }, + BigNum { + limbs: [0xe72dbe134c6fdb4a1d36cf8df8f992, 0x70e938e86c9842198f6ce41536c829, 0x00675d], + }, + BigNum { + limbs: [0xc313287b50ee6ceb107d107792e331, 0xf5f496036dda75d6467e78880bd899, 0x001f92], + }, + BigNum { + limbs: [0xfa90da84ad6d9214ef82ee886d1cd0, 0xb15e939a0f6dbd6391899119cc2cb9, 0x00545a], + }, + BigNum { + limbs: [0x0bd4e6a7e888998588ec8712bbb533, 0xc466e9f46b9b99b02b0d0da9e471ba, 0x003367], + }, + BigNum { + limbs: [0xb1cf1c5815d3657a771377ed444ace, 0xe2ec3fa911ac9989acfafbf7f39399, 0x004085], + }, + BigNum { + limbs: [0x3be97480c55418f45dadfa7ab57531, 0xea964384940530c5e2bc37a1533ac3, 0x0066b4], + }, + BigNum { + limbs: [0x81ba8e7f3907e60ba25204854a8ad0, 0xbcbce618e9430273f54bd20084ca90, 0x000d38], + }, + BigNum { + limbs: [0xc2430643e8182d35323eec80747457, 0xfcbdae14d82de463155db41faca3da, 0x006021], + }, + BigNum { + limbs: [0xfb60fcbc1643d1cacdc1127f8b8baa, 0xaa957b88a51a4ed6c2aa55822b6178, 0x0013cb], + }, + BigNum { + limbs: [0xc7a2c8ab4cebe3229d28add06fa1a0, 0x36b466b8ceec2076b2987fe06886b8, 0x001769], + }, + BigNum { + limbs: [0xf6013a54b1701bdd62d7512f905e61, 0x709ec2e4ae5c12c3256f89c16f7e9a, 0x005c84], + }, + BigNum { + limbs: [0xd8a879169dd8991a08d5e4e2e01343, 0x192fb0cd079daf0f64a02464f057f6, 0x00679a], + }, + BigNum { + limbs: [0xe4fb89e9608365e5f72a1a1d1fecbe, 0x8e2378d075aa842a7367e53ce7ad5c, 0x000c53], + }, + BigNum { + limbs: [0xb5485481194aefa65b28ed517d4354, 0xde37523e64d4ddbaddb9f90e7d697a, 0x000019], + }, + BigNum { + limbs: [0x085bae7ee5110f59a4d711ae82bcad, 0xc91bd75f1873557efa4e10935a9bd9, 0x0073d3], + }, + BigNum { + limbs: [0x970eedd0930abc1f41e0a2ec24c764, 0x76aca5cbffa191b659acf68394e8b7, 0x006b2f], + }, + BigNum { + limbs: [0x2695152f6b5142e0be1f5c13db389d, 0x30a683d17da6a1837e5b131e431c9c, 0x0008be], + }, + BigNum { + limbs: [0xea426fe3382da5ccd6232e773a7be0, 0xbccf1d2163b24879f55520eec3096c, 0x005fc0], + }, + BigNum { + limbs: [0xd361931cc62e593329dcd088c58421, 0xea840c7c1995eabfe2b2e8b314fbe6, 0x00142c], + }, + BigNum { + limbs: [0x5ded1899239a88898b0554d218a61c, 0xd11ff6f7fa6cbcbe9301f686e86bf9, 0x0044c1], + }, + BigNum { + limbs: [0x5fb6ea66dac1767674faaa2de759e5, 0xd63332a582db767b4506131aef995a, 0x002f2b], + }, + BigNum { + limbs: [0x62a1c1fa6e32aa1b529e40de1d7c4d, 0x5788394251987c11e63de35442f626, 0x0054e6], + }, + BigNum { + limbs: [0x5b024105902954e4ad61be21e283b4, 0x4fcaf05b2bafb727f1ca264d950f2d, 0x001f07], + }, + BigNum { + limbs: [0x23483beb660aa3126c1c8e445a8a5b, 0x12a22a888026f6f5faa93431d39300, 0x005726], + }, + BigNum { + limbs: [0x9a5bc71498515bed93e370bba575a6, 0x94b0ff14fd213c43dd5ed570047253, 0x001cc7], + }, + BigNum { + limbs: [0xd34a8629e2a390579464a37d34c01f, 0xe95e089c5912926d173883e9142489, 0x006800], + }, + BigNum { + limbs: [0xea597cd61bb86ea86b9b5b82cb3fe2, 0xbdf521012435a0ccc0cf85b8c3e0c9, 0x000bec], + }, + BigNum { + limbs: [0x12f7a9a2ba4c6f2289841708c47e76, 0x8d51514e6d3ba1fb1ad2f91bea10fe, 0x006c5c], + }, + BigNum { + limbs: [0xaaac595d440f8fdd767be7f73b818b, 0x1a01d84f100c913ebd351085edf455, 0x000791], + }, + BigNum { + limbs: [0x1084d1e459c2644faaa91388ae574d, 0xed8c43ec33b5e17e82746da5a2b076, 0x0047d7], + }, + BigNum { + limbs: [0xad1f311ba4999ab05556eb7751a8b4, 0xb9c6e5b1499251bb55939bfc3554dd, 0x002c15], + }, + BigNum { + limbs: [0xf9870d09b49934594ef32abcf775b9, 0xd339e9bdd168c902e32bba607579dc, 0x00220b], + }, + BigNum { + limbs: [0xc41cf5f649c2caa6b10cd443088a48, 0xd4193fdfabdf6a36f4dc4f41628b76, 0x0051e1], + }, + BigNum { + limbs: [0xba5587cee31ba92218afc24fb3fb6d, 0x26f47becfa9260ab9a24e417ab6e2a, 0x00010c], + }, + BigNum { + limbs: [0x034e7b311b4055dde7503cb04c0494, 0x805eadb082b5d28e3de3258a2c9729, 0x0072e1], + }, + BigNum { + limbs: [0xb1101b4a6a67fce5fb1ba223a764f8, 0x59b150561c08ee82c31d8e145688a9, 0x001f99], + }, + BigNum { + limbs: [0x0c93e7b593f4021a04e45cdc589b09, 0x4da1d947613f44b714ea7b8d817caa, 0x005454], + }, + BigNum { + limbs: [0x33e7e7f45b14fb3783b2614bebb0c2, 0x6a09c6e30dc4df9d916b36a30c5404, 0x006136], + }, + BigNum { + limbs: [0x89bc1b0ba34703c87c4d9db4144f3f, 0x3d4962ba6f83539c469cd2fecbb14f, 0x0012b7], + }, + BigNum { + limbs: [0x3eb77e93fdfad62d5d0f5c33535fd6, 0x31fb8102066d8296d9a9c6a10e2512, 0x006457], + }, + BigNum { + limbs: [0x7eec846c006128d2a2f0a2ccaca02b, 0x7557a89b76dab0a2fe5e4300c9e041, 0x000f96], + }, + BigNum { + limbs: [0x8fd58359d39d07910b8b9b66684add, 0x7d8c49ec4fb7f6900d91db7be189f1, 0x005363], + }, + BigNum { + limbs: [0x2dce7fa62abef76ef474639997b524, 0x29c6dfb12d903ca9ca762e25f67b62, 0x00208a], + }, + BigNum { + limbs: [0x5b9ae4008d73829ab0eaa775faa012, 0x76e29080b50f1cd896a4b3705edc8a, 0x004256], + }, + BigNum { + limbs: [0x62091eff70e87c654f15578a055fef, 0x3070991cc8391661416356317928c9, 0x003197], + }, + BigNum { + limbs: [0x5415c7e32b57d8f14c6ea5a428c753, 0x2871d8bbf1938804b57eba0c7f48b2, 0x005ea3], + }, + BigNum { + limbs: [0x698e3b1cd304260eb391595bd738ae, 0x7ee150e18bb4ab3522894f9558bca1, 0x00154a], + }, + BigNum { + limbs: [0x454cc072521a80dee4982fe73f0476, 0xc15b4cc4b5699059b96ae5d8e22ca0, 0x002ec1], + }, + BigNum { + limbs: [0x7857428dac417e211b67cf18c0fb8b, 0xe5f7dcd8c7dea2e01e9d23c8f5d8b3, 0x00452b], + }, + BigNum { + limbs: [0x6a4174f9d391c3c1bc0e2e75444e71, 0xd2c2aeff4f7c1033a694607d9089ee, 0x00585f], + }, + BigNum { + limbs: [0x53628e062aca3b3e43f1d08abbb190, 0xd4907a9e2dcc23063173a924477b65, 0x001b8d], + }, + BigNum { + limbs: [0x077fb2af5f3968498cb1c004d751da, 0x9f9a7567a04fcef4eeac0deb62a9e2, 0x002f41], + }, + BigNum { + limbs: [0xb62450509f2296b6734e3efb28ae27, 0x07b8b435dcf86444e95bfbb6755b71, 0x0044ac], + }, + BigNum { + limbs: [0x7f4b22ee86c90c6e3bf01c498740f6, 0xc509aec45575756fdf33240b9eb8c2, 0x004322], + }, + BigNum { + limbs: [0x3e58e0117792f291c40fe2b678bf0b, 0xe2497ad927d2bdc9f8d4e596394c91, 0x0030ca], + }, + BigNum { + limbs: [0x62ff60cc15dea0c8e2dd3ed107d499, 0x0cdd9173bbfd3e8c95924f0548cbe5, 0x004c1c], + }, + BigNum { + limbs: [0x5aa4a233e87d5e371d22c02ef82b68, 0x9a759829c14af4ad4275ba9c8f396e, 0x0027d1], + }, + BigNum { + limbs: [0xc9f9aa166bf26bc0797107b1cb3124, 0x3826c895df7f4b00e4140110a4aed7, 0x001896], + }, + BigNum { + limbs: [0xf3aa58e99269933f868ef74e34cedd, 0x6f2c61079dc8e838f3f4089133567b, 0x005b57], + }, + BigNum { + limbs: [0x6b1f176bbbafe77f0e8114b6a0d047, 0xe6b5bd56753f2c848ff6620f2d19a0, 0x0021fa], + }, + BigNum { + limbs: [0x5284eb9442ac1780f17eea495f2fba, 0xc09d6c47080906b54811a792aaebb3, 0x0051f2], + }, + BigNum { + limbs: [0x24dfe0eff265eeb9f443beec8e4a98, 0xd12f488a4f008dde048d37f34632d0, 0x006ab6], + }, + BigNum { + limbs: [0x98c422100bf610460bbc401371b569, 0xd623e1132e47a55bd37ad1ae91d283, 0x000936], + }, + BigNum { + limbs: [0x89389d045ecd85912bd03df9174127, 0x5678784bdd314b69773fb25cf78088, 0x0009e9], + }, + BigNum { + limbs: [0x346b65fb9f8e796ed42fc106e8beda, 0x50dab151a016e7d060c85744e084cb, 0x006a04], + }, + BigNum { + limbs: [0xb2c43c2678b650937dff33b29a7067, 0x10012f49cbdbb0c057cfa5a042c808, 0x0032f6], + }, + BigNum { + limbs: [0x0adfc6d985a5ae6c8200cb4d658f9a, 0x9751fa53b16c827980386401953d4b, 0x0040f7], + }, + BigNum { + limbs: [0x89db099f5aa3d61cf9c8103c36f106, 0x04026adc48a1cb249422c0b1923c84, 0x00420f], + }, + BigNum { + limbs: [0x33c8f960a3b828e30637eec3c90efb, 0xa350bec134a6681543e548f045c8cf, 0x0031de], + }, + BigNum { + limbs: [0x131960517113c6aa3f1fa1135a9163, 0xb023314a82dbfe42fdcdc306e96f61, 0x006fbc], + }, + BigNum { + limbs: [0xaa8aa2ae8d483855c0e05deca56e9e, 0xf72ff852fa6c34f6da3a469aee95f2, 0x000430], + }, + BigNum { + limbs: [0xa8dfb2d95d08eebad594175ea0777d, 0xd15d1348757839ea78d5ebd557ac68, 0x000fa5], + }, + BigNum { + limbs: [0x14c45026a15310452a6be7a15f8884, 0xd5f6165507cff94f5f321dcc8058eb, 0x006447], + }, + BigNum { + limbs: [0xb49eae14ca61adfb5a74bbf196694f, 0x78e42eccf77a299af2a89d3d9a9503, 0x0004a5], + }, + BigNum { + limbs: [0x090554eb33fa5104a58b430e6996b2, 0x2e6efad085ce099ee55f6c643d7050, 0x006f48], + }, + BigNum { + limbs: [0xc57c7aae3c5d192fc39139d30accaa, 0x6a37e78478720ac2b9a3a71bc6dee6, 0x0052ff], + }, + BigNum { + limbs: [0xf8278851c1fee5d03c6ec52cf53357, 0x3d1b421904d628771e64628611266c, 0x0020ee], + }, + BigNum { + limbs: [0xbfe4d04bc3af5abd41931e6ad8fbc4, 0xb4226f2d37b4092596aa02af41df19, 0x0052df], + }, + BigNum { + limbs: [0xfdbf32b43aaca442be6ce09527043d, 0xf330ba7045942a14415e06f2962639, 0x00210d], + }, + BigNum { + limbs: [0x5d4c8253345fc0da9862bcfa4152a5, 0xb67b052567d36d907e855e18e24fe2, 0x001666], + }, + BigNum { + limbs: [0x605780acc9fc3e25679d4205bead5c, 0xf0d824781574c5a95982ab88f5b571, 0x005d86], + }, + BigNum { + limbs: [0x2a6b489ba9d4071dd477a1a8fb9943, 0x2f1ccbe3e2f477c805e7d68aa60033, 0x0057e3], + }, + BigNum { + limbs: [0x9338ba645487f7e22b885d570466be, 0x78365db99a53bb71d2203317320520, 0x001c0a], + }, + BigNum { + limbs: [0x1ab551c326a152b58257bb2e5d71db, 0xbc560f4a92e069085360a46e5262e7, 0x004bf9], + }, + BigNum { + limbs: [0xa2eeb13cd7baac4a7da843d1a28e26, 0xeafd1a52ea67ca3184a7653385a26c, 0x0027f3], + }, + BigNum { + limbs: [0x58997c0bcf1c7ec8ed5cac7b9d2bac, 0xb301523084ffbb94572c1757cd8070, 0x001998], + }, + BigNum { + limbs: [0x650a86f42f3f803712a3528462d455, 0xf451d76cf84877a580dbf24a0a84e3, 0x005a54], + }, + BigNum { + limbs: [0xbf85946a2dad3bd8b9c1884f38f043, 0x2e2d253894999a00ad991d57396878, 0x000645], + }, + BigNum { + limbs: [0xfe1e6e95d0aec327463e76b0c70fbe, 0x79260464e8ae99392a6eec4a9e9cda, 0x006da8], + }, + BigNum { + limbs: [0x79d0abcc6b92776cfd5fd90654dc47, 0x92b5ba1dbfdb4e6157ba4c1415819b, 0x001b33], + }, + BigNum { + limbs: [0x43d3573392c9879302a025f9ab23ba, 0x149d6f7fbd6ce4d8804dbd8dc283b8, 0x0058ba], + }, + BigNum { + limbs: [0x68d3d308f6af752367d21449c614fb, 0x7acb9966a71884d4224a351c246aaa, 0x001e8c], + }, + BigNum { + limbs: [0x54d02ff707ac89dc982deab639eb06, 0x2c879036d62fae65b5bdd485b39aa9, 0x005561], + }, + BigNum { + limbs: [0xd1347b378fbf96e206da11a5d36306, 0x0a11a0f704f4fc3e8acfe0f8245f0a, 0x00564c], + }, + BigNum { + limbs: [0xec6f87c86e9c681df925ed5a2c9cfb, 0x9d4188a6785336fb4d3828a9b3a648, 0x001da1], + }, + BigNum { + limbs: [0xad4b8238fb15a2cd5f7b9753dbc950, 0x8876214b5ea64b7394e9aacb5a271f, 0x002bb6], + }, + BigNum { + limbs: [0x105880c703465c32a08467ac2436b1, 0x1edd08521ea1e7c6431e5ed67dde34, 0x004837], + }, + BigNum { + limbs: [0x63fff9337fecd313c7c03ef17a2033, 0xabee7c028923cc0affedaf37b5bb4e, 0x001c39], + }, + BigNum { + limbs: [0x59a409cc7e6f2bec383fc00e85dfce, 0xfb64ad9af424672ed81a5a6a224a05, 0x0057b3], + }, + BigNum { + limbs: [0x91a1faeb4b36d5cc2201b834e74a04, 0x8f5b87d7a05090eb099e349e17639b, 0x00605b], + }, + BigNum { + limbs: [0x2c020814b3252933ddfe46cb18b5fd, 0x17f7a1c5dcf7a24ece69d503c0a1b8, 0x001392], + }, + BigNum { + limbs: [0xa2df4d8921e8aff1867882e0b9cae8, 0xcb41966a5661788743c7818f06051d, 0x0006f3], + }, + BigNum { + limbs: [0x1ac4b576dc734f0e79877c1f463519, 0xdc11933326e6bab294408812d20036, 0x006cf9], + }, + BigNum { + limbs: [0x5c5d4be5b92c7b5ab670793f534c85, 0x7f1658569f752082ae264b6ae7cc8d, 0x003a09], + }, + BigNum { + limbs: [0x6146b71a452f83a5498f85c0acb37c, 0x283cd146ddd312b729e1be36f038c6, 0x0039e4], + }, + BigNum { + limbs: [0x6736009fa130119f9a06a539dcc7bd, 0xf5a12bf093b927ab9acee22625ab94, 0x005351], + }, + BigNum { + limbs: [0x566e02605d2bed6065f959c6233844, 0xb1b1fdace98f0b8e3d39277bb259bf, 0x00209b], + }, + BigNum { + limbs: [0x24c2fd6a62162b6b37d19f83bb87e0, 0xac8524669b3262d47d6f3069a6b4a9, 0x002146], + }, + BigNum { + limbs: [0x98e105959c45d394c82e5f7c447821, 0xface0536e215d0655a98d9383150aa, 0x0052a6], + }, + BigNum { + limbs: [0xa24a9bd470cd67ca0a0220aec02fa4, 0x3ba7dfb14308007b0e472badec8d39, 0x0057e0], + }, + BigNum { + limbs: [0x1b59672b8d8e9735f5fdde513fd05d, 0x6bab49ec3a4032bec9c0ddf3eb781a, 0x001c0d], + }, + BigNum { + limbs: [0xbf80d6881dc2190c850dd65aaaaefa, 0x4708ac66bf63479ddf15c7b33589c3, 0x001bab], + }, + BigNum { + limbs: [0xfe232c77e099e5f37af228a5555107, 0x604a7d36bde4eb9bf8f241eea27b8f, 0x005842], + }, + BigNum { + limbs: [0xd6c764f82602a7228bc1c0e7e3fdf5, 0x4cef0ca52f27785009eb7e7ecdaa03, 0x000658], + }, + BigNum { + limbs: [0xe6dc9e07d85957dd743e3e181c020c, 0x5a641cf84e20bae9ce1c8b230a5b4f, 0x006d95], + }, + BigNum { + limbs: [0x74957c1d2728744430911d2ef02d6c, 0x00c1a3aeef45073c6cb1200432d367, 0x00688a], + }, + BigNum { + limbs: [0x490e86e2d7338abbcf6ee1d10fd295, 0xa69185ee8e032bfd6b56e99da531ec, 0x000b63], + }, + BigNum { + limbs: [0xb39fb2d51ad78d473ea412a309a77c, 0x9915614f3901e5434787eb246e5cea, 0x003d3d], + }, + BigNum { + limbs: [0x0a04502ae38471b8c15bec5cf65885, 0x0e3dc84e44464df690801e7d69a869, 0x0036b0], + }, + BigNum { + limbs: [0x7203a676aa3fae360419ba7b4a732f, 0x208bd4a64316c3de999d9c5ccf8954, 0x00200d], + }, + BigNum { + limbs: [0x4ba05c89541c50c9fbe64484b58cd2, 0x86c754f73a316f5b3e6a6d45087bff, 0x0053e0], + }, + BigNum { + limbs: [0xcb18f70b1666477b49fff1eb1daf38, 0x4e933af6252c6dc58e41cd427dbe5f, 0x00009c], + }, + BigNum { + limbs: [0xf28b0bf4e7f5b784b6000d14e250c9, 0x58bfeea7581bc57449c63c5f5a46f3, 0x007351], + }, + BigNum { + limbs: [0x4567cac5c777f44c56fb3866d3a809, 0xffb392002a5b378787829b9e0abd13, 0x0067b3], + }, + BigNum { + limbs: [0x783c383a36e40ab3a904c6992c57f8, 0xa79f979d52ecfbb250856e03cd4840, 0x000c39], + }, + BigNum { + limbs: [0xdca0ae49bc978f29ebf33886000c8a, 0xabc5b7c03be4cc772df2b06be7d8d7, 0x0053d7], + }, + BigNum { + limbs: [0xe10354b641c46fd6140cc679fff377, 0xfb8d71dd416366c2aa155935f02c7b, 0x002015], + }, + BigNum { + limbs: [0x940867fad3080cff61da335d218c69, 0x9d4a6f36bb328011781ae2eb8338e5, 0x00596a], + }, + BigNum { + limbs: [0x299b9b052b53f2009e25cba2de7398, 0x0a08ba66c215b3285fed26b654cc6e, 0x001a83], + }, + BigNum { + limbs: [0x542b67f83c49199e3ccb8dd576b0f5, 0xadb736656798954b937d9da775086a, 0x004a41], + }, + BigNum { + limbs: [0x69789b07c212e561c334712a894f0c, 0xf99bf33815af9dee448a6bfa62fce9, 0x0029ab], + }, + BigNum { + limbs: [0x76cfa8688aad937936281d725764c6, 0xda887f345f79f45562e9505e5e255d, 0x005b21], + }, + BigNum { + limbs: [0x46d45a9773ae6b86c9d7e18da89b3b, 0xcccaaa691dce3ee4751eb94379dff6, 0x0018cb], + }, + BigNum { + limbs: [0xeafd87bcdafda8cb6a70e04f526a21, 0x340846157bd5c13b498f50314635ca, 0x0029d8], + }, + BigNum { + limbs: [0xd2a67b43235e5634958f1eb0ad95e0, 0x734ae388017271fe8e78b97091cf88, 0x004a15], + }, + BigNum { + limbs: [0x1da259503de1389ec8f2d00aa19cc2, 0xbf6ff47ecf4640000ffa7ee6b74af1, 0x002250], + }, + BigNum { + limbs: [0xa001a9afc07ac661370d2ef55e633f, 0xe7e3351eae01f339c80d8abb20ba62, 0x00519c], + }, + BigNum { + limbs: [0x03dab19044e968a5e53cecd36dabb8, 0xfcab3ad741ebc624a6bf28c35e8472, 0x00592e], + }, + BigNum { + limbs: [0xb9c9516fb972965a1ac3122c925449, 0xaaa7eec63b5c6d153148e0de7980e1, 0x001abe], + }, + BigNum { + limbs: [0x9d5d562fb82e29d6e0934f96c7a283, 0x5287a19abf3c4b844ced5de375e7cb, 0x0009c6], + }, + BigNum { + limbs: [0x2046acd0462dd5291f6caf69385d7e, 0x54cb8802be0be7b58b1aabbe621d88, 0x006a27], + }, + BigNum { + limbs: [0x726517ced91929d4910b491b0f88ae, 0x5ec1c5949c07f55d7b47c3dbbb90a2, 0x0010c6], + }, + BigNum { + limbs: [0x4b3eeb312542d52b6ef4b5e4f07753, 0x48916408e1403ddc5cc045c61c74b1, 0x006327], + }, + BigNum { + limbs: [0x93ecc4fa926abf15507909d573d669, 0x2ddbb6673ea3ae29036141e291016e, 0x00394a], + }, + BigNum { + limbs: [0x29b73e056bf13feaaf86f52a8c2998, 0x797773363ea48510d4a6c7bf4703e5, 0x003aa3], + }, + BigNum { + limbs: [0xdb8c0f19e4d5789314520692a107bf, 0x559da0d834d894ef9b74b96b0020a5, 0x006d5b], + }, + BigNum { + limbs: [0xe217f3e61986866cebadf86d5ef842, 0x51b588c5486f9e4a3c935036d7e4ad, 0x000692], + }, + BigNum { + limbs: [0x4ce9d6b7ae56c76a7878b810d6b679, 0xd0cbecb1569285bfd4bf0aae06bd36, 0x004ed8], + }, + BigNum { + limbs: [0x70ba2c4850053795878746ef294988, 0xd6873cec26b5ad7a0348fef3d1481d, 0x002514], + }, + BigNum { + limbs: [0x9a7d5bdaf34775fa3f8e60a92902ec, 0x7e6ad59835800491be3e124c5646a5, 0x0052a2], + }, + BigNum { + limbs: [0x2326a7250b148905c0719e56d6fd15, 0x28e8540547c82ea819c9f75581beae, 0x00214b], + }, + BigNum { + limbs: [0x930a3974130cf21f0bf5b12e2ad57b, 0xa88d3bb843f1e59a0efbb9fbdaac29, 0x003f00], + }, + BigNum { + limbs: [0x2a99c98beb4f0ce0f40a4dd1d52a86, 0xfec5ede539564d9fc90c4fa5fd592a, 0x0034ec], + }, + BigNum { + limbs: [0x0ca2ec307a54e23de675002a1dc598, 0xeaab319d871b6f8272abdf5878899b, 0x001327], + }, + BigNum { + limbs: [0xb10116cf84071cc2198afed5e23a69, 0xbca7f7fff62cc3b7655c2a495f7bb8, 0x0060c5], + }, + BigNum { + limbs: [0x7b78bbf9fcf6ac1a8ce009481b06f4, 0xcd295c0ef9e69f7e9ea74befd40aec, 0x00681c], + }, + BigNum { + limbs: [0x422b4706016552e5731ff5b7e4f90d, 0xda29cd8e836193bb3960bdb203fa67, 0x000bd0], + }, + BigNum { + limbs: [0x684c6a14b706e6a4e458d205940a65, 0xb4baeca30de2fa564db1db4df55ad5, 0x00160f], + }, + BigNum { + limbs: [0x555798eb4755185b1ba72cfa6bf59c, 0xf2983cfa6f6538e38a562e53e2aa7e, 0x005ddd], + }, + BigNum { + limbs: [0x357125c09f65d2f6bc04f1ccc8a05b, 0x75ece38b6b216509c259b1a0a550a2, 0x002e7a], + }, + BigNum { + limbs: [0x8832dd3f5ef62c0943fb0d33375fa6, 0x316646121226ce3015ae580132b4b1, 0x004573], + }, + BigNum { + limbs: [0x21340434d0af3d0e2bce377d6c3748, 0x53137d74125bb90512b69f97c1abe0, 0x003162], + }, + BigNum { + limbs: [0x9c6ffecb2dacc1f1d431c78293c8b9, 0x543fac296aec7a34c5516a0a165973, 0x00428b], + }, + BigNum { + limbs: [0xb75ebf1fa6a848f2dcd7de352e7812, 0xfa066178e33c85eb74ae061ea0c95e, 0x005b88], + }, + BigNum { + limbs: [0x064543e057b3b60d232820cad187ef, 0xad4cc8249a0bad4e635a0383373bf5, 0x001864], + }, + BigNum { + limbs: [0x7841ddfd61aa748afd27280b1d26d5, 0xb5dc03165af6d7e53ad367a6de9eee, 0x004736], + }, + BigNum { + limbs: [0x456225029cb18a7502d8d6f4e2d92c, 0xf177268722515b549d34a1faf96665, 0x002cb6], + }, + BigNum { + limbs: [0xa3fca4c95e97ef62e4bc4334d24aa2, 0x970f33b7a49db81d211727eccfa32c, 0x00148a], + }, + BigNum { + limbs: [0x19a75e369fc40f9d1b43bbcb2db55f, 0x1043f5e5d8aa7b1cb6f0e1b5086227, 0x005f63], + }, + BigNum { + limbs: [0x1af71607b2c66dfea4a56081023372, 0xb346b11ea91175e3dbeb28007ad97d, 0x0036e2], + }, + BigNum { + limbs: [0xa2acecf84b9591015b5a9e7efdcc8f, 0xf40c787ed436bd55fc1ce1a15d2bd6, 0x003d0a], + }, + BigNum { + limbs: [0xd98e5d422c5d1b27ff824c52dca1d0, 0x28e8851cb172fab2b64503252a7def, 0x004e8f], + }, + BigNum { + limbs: [0xe415a5bdd1fee3d8007db2ad235e31, 0x7e6aa480cbd5388721c3067cad8763, 0x00255e], + }, + BigNum { + limbs: [0x47a42d475447363d44f03d6a565b97, 0xbe856f6bbf1c5d54f3a81142092b09, 0x005168], + }, + BigNum { + limbs: [0x75ffd5b8aa14c8c2bb0fc195a9a46a, 0xe8cdba31be2bd5e4e45ff85fceda4a, 0x002284], + }, + BigNum { + limbs: [0x31d674997b53dae2b092cec051cab3, 0x4c464e1891f0c3c830738958768167, 0x001f64], + }, + BigNum { + limbs: [0x8bcd8e668308241d4f6d303fae354e, 0x5b0cdb84eb576f71a79480496183ec, 0x005489], + }, + BigNum { + limbs: [0xa86a543b84b81418e39ed00f0fb9e9, 0x2c67e97367ce5c3e6671824479d465, 0x003d75], + }, + BigNum { + limbs: [0x1539aec479a3eae71c612ef0f04618, 0x7aeb402a1579d6fb7196875d5e30ee, 0x003678], + }, + BigNum { + limbs: [0x8378bf20f973c70da3b463586d4b7b, 0xcdaeaa9b7abf7cc0ce06072e27a588, 0x003aa6], + }, + BigNum { + limbs: [0x3a2b43df04e837f25c4b9ba792b486, 0xd9a47f020288b6790a020273b05fcb, 0x003946], + }, + BigNum { + limbs: [0x010585e07a712c0b6729335818e69a, 0x2bac15e611d6564ae36561f30c5d45, 0x00369d], + }, + BigNum { + limbs: [0xbc9e7d1f83ead2f498d6cba7e71967, 0x7ba713b76b71dceef4a2a7aecba80e, 0x003d50], + }, + BigNum { + limbs: [0xa526579d681c965a90ff08490bfddc, 0x09f9fa970046d8d2e1418a37800c8a, 0x0027ad], + }, + BigNum { + limbs: [0x187dab62963f68a56f00f6b6f40225, 0x9d592f067d015a66f6c67f6a57f8c9, 0x004c40], + }, + BigNum { + limbs: [0x203f88cbdc4471948cb801db257f24, 0xa39c71e06fdf474e1e622995bbb22e, 0x000088], + }, + BigNum { + limbs: [0x9d647a3422178d6b7347fd24da80dd, 0x03b6b7bd0d68ebebb9a5e00c1c5325, 0x007365], + }, + BigNum { + limbs: [0xd9640467b89b62bb3664bc5da730c0, 0xf25d387914b42e95a8ce3dab9495f8, 0x00070c], + }, + BigNum { + limbs: [0xe43ffe9845c09c44c99b42a258cf41, 0xb4f5f124689404a42f39cbf6436f5a, 0x006ce0], + }, + BigNum { + limbs: [0xcb1c4c78afeecd4318a4cc529de646, 0x8ab180b6121766d0fbf770c619f590, 0x006722], + }, + BigNum { + limbs: [0xf287b6874e6d31bce75b32ad6219bb, 0x1ca1a8e76b30cc68dc1098dbbe0fc2, 0x000ccb], + }, + BigNum { + limbs: [0xf232337ef6eba4549c3333d5cdae87, 0x1b7d643dcbb06052961d233134d2bd, 0x001131], + }, + BigNum { + limbs: [0xcb71cf8107705aab63cccb2a32517a, 0x8bd5c55fb197d2e741eae670a33295, 0x0062bc], + }, + BigNum { + limbs: [0xd2a6543bf0a923b8baa3c5f39511a9, 0xfaafbd50344cd931eb4e7d8227c6d9, 0x0033f1], + }, + BigNum { + limbs: [0xeafdaec40db2db47455c390c6aee58, 0xaca36c4d48fb5a07ecb98c1fb03e79, 0x003ffb], + }, + BigNum { + limbs: [0x1777ae6de43c3bcc3cf45503a26bf9, 0x4930044f66d8675907d64a5c2feb97, 0x005605], + }, + BigNum { + limbs: [0xa62c54921a1fc333c30ba9fc5d9408, 0x5e23254e166fcbe0d031bf45a819bc, 0x001de8], + }, + BigNum { + limbs: [0x7664eaa2d713a5c7b1b0deaf488dc0, 0xdecc5a66647f9784a0b1a526c1fc01, 0x00040b], + }, + BigNum { + limbs: [0x473f185d274859384e4f2050b77241, 0xc886cf3718c89bb53756647b160952, 0x006fe1], + }, + BigNum { + limbs: [0xadbc1a2c46fc2c8d7616ca9a1232dd, 0x417472eed79049a3167cfffc90e27f, 0x0057d6], + }, + BigNum { + limbs: [0x0fe7e8d3b75fd27289e93465edcd24, 0x65deb6aea5b7e996c18b09a54722d4, 0x001c17], + }, + BigNum { + limbs: [0xfa62bbbbd6b631a42d6916ba23404c, 0x404b2b3e80406629c6836b11a80e95, 0x001e1a], + }, + BigNum { + limbs: [0xc341474427a5cd5bd296e845dcbfb5, 0x6707fe5efd07cd1011849e902ff6bd, 0x0055d3], + }, + BigNum { + limbs: [0xd481d0bb6911548cb29e5f68cdc81a, 0xaaa3d798d21e94dadff55c6cbfdb7f, 0x00630e], + }, + BigNum { + limbs: [0xe9223244954aaa734d619f973237e7, 0xfcaf5204ab299e5ef812ad351829d3, 0x0010de], + }, + BigNum { + limbs: [0x030f7af2e756bfa10792d623ec078b, 0xaf53a7f8913c194caac36ab9b39ee1, 0x001fef], + }, + BigNum { + limbs: [0xba94880d17053f5ef86d28dc13f876, 0xf7ff81a4ec0c19ed2d449ee8246672, 0x0053fd], + }, + BigNum { + limbs: [0xca4d3655b7f65a7a73df2ecd0e2030, 0x7518b9fd3554c0f19a67641063833c, 0x004b1d], + }, + BigNum { + limbs: [0xf356ccaa4665a4858c20d032f1dfd1, 0x323a6fa047f372483da0a591748216, 0x0028d0], + }, + BigNum { + limbs: [0xd3049773ed303c881867a03315f5d3, 0x2b4acc7c704c4f38a455be37d321ba, 0x0048b5], + }, + BigNum { + limbs: [0xea9f6b8c112bc277e7985eccea0a2e, 0x7c085d210cfbe40133b24b6a04e398, 0x002b38], + }, + BigNum { + limbs: [0xc2d66725116e6c0e39c5c0deac938d, 0x7b09d8722543e50d1ed404838c3942, 0x003c85], + }, + BigNum { + limbs: [0xfacd9bdaeced92f1c63a3e21536c74, 0x2c49512b58044e2cb934051e4bcc10, 0x003768], + }, + BigNum { + limbs: [0xc4f44254bfe3f098c01ebb90ee775e, 0x6d9caec03381a9ee3c0868e70f5777, 0x0043bc], + }, + BigNum { + limbs: [0xf8afc0ab3e780e673fe1436f1188a3, 0x39b67add49c6894b9bffa0bac8addb, 0x003031], + }, + BigNum { + limbs: [0xfddd235c7a98ac608be7900aae3100, 0xa244819154424d60ebf9f5ac99f13f, 0x005cb7], + }, + BigNum { + limbs: [0xbfc6dfa383c3529f74186ef551cf01, 0x050ea80c2905e5d8ec0e13f53e1413, 0x001736], + }, + BigNum { + limbs: [0x4a0fd486334f79d808d5c0d3ae1f12, 0x9daab2457724a2a6708e58d280c315, 0x005ac9], + }, + BigNum { + limbs: [0x73942e79cb0c8527f72a3e2c51e0ef, 0x09a87758062390936779b0cf57423e, 0x001924], + }, + BigNum { + limbs: [0xea8c83047a0348092bc156145ae3be, 0x6498d3d08cd0b43f4591e262934f10, 0x001299], + }, + BigNum { + limbs: [0xd3177ffb8458b6f6d43ea8eba51c43, 0x42ba55ccf0777efa9276273f44b642, 0x006154], + }, + BigNum { + limbs: [0xc9e71e9ad981f3f9bee777f505a670, 0xa66cf5599656047e8cec0c7be22c07, 0x0015ed], + }, + BigNum { + limbs: [0xf3bce46524da0b064118870afa5991, 0x00e63443e6f22ebb4b1bfd25f5d94b, 0x005e00], + }, + BigNum { + limbs: [0xaa95c116471933d23a4a114812d636, 0x1521f33b59d5e1255a25981421ff14, 0x0052c0], + }, + BigNum { + limbs: [0x130e41e9b742cb2dc5b5edb7ed29cb, 0x92313662237252147de2718db6063f, 0x00212d], + }, + BigNum { + limbs: [0xd54a83f5ca1be3e25cfe9c39fa442b, 0xf39fdb8f4cc1ff72289a55de1ef66f, 0x003042], + }, + BigNum { + limbs: [0xe8597f0a34401b1da30162c605bbd6, 0xb3b34e0e308633c7af6db3c3b90ee3, 0x0043aa], + }, + BigNum { + limbs: [0x6df133f7321a25f20ce8d579e35cee, 0xa3f774f19f1ff7a8b04d2828931d48, 0x0018c6], + }, + BigNum { + limbs: [0x4fb2cf08cc41d90df31729861ca313, 0x035bb4abde283b9127bae17944e80b, 0x005b27], + }, + BigNum { + limbs: [0x0f9d3b81d8d23eded4a5f256a9c7fa, 0xe84cc460e97596051ddbd646a327cd, 0x00211d], + }, + BigNum { + limbs: [0xae06c77e2589c0212b5a0ca9563807, 0xbf06653c93d29d34ba2c335b34dd86, 0x0052cf], + }, + BigNum { + limbs: [0x6d32c4bc785ddf8f84dcc764345e6f, 0x440f93c3062bad415ce2d67286aaff, 0x005d3d], + }, + BigNum { + limbs: [0x50713e4385fe1f707b23379bcba192, 0x634395da771c85f87b25332f515a54, 0x0016b0], + }, + BigNum { + limbs: [0x65f7f950b8ea85342030e7ba39b3a6, 0x509b496b983f565de17858f422f2df, 0x002b01], + }, + BigNum { + limbs: [0x57ac09af457179cbdfcf1745c64c5b, 0x56b7e031e508dcdbf68fb0adb51274, 0x0048ec], + }, + BigNum { + limbs: [0x0cf136ceac4b7be81282d9762849c5, 0x475dcfa943c0ac10e91b6361e98f4d, 0x004e05], + }, + BigNum { + limbs: [0xb0b2cc3152108317ed7d2589d7b63c, 0x5ff559f439878728eeeca63fee7606, 0x0025e8], + }, + BigNum { + limbs: [0xf5a38f02d0d9e3f6e035ff20282882, 0x92eb3eb00addf10be3c3f4a15ce3d9, 0x004f48], + }, + BigNum { + limbs: [0xc80073fd2d821b091fc9ffdfd7d77f, 0x1467eaed726a422df44415007b2179, 0x0024a5], + }, + BigNum { + limbs: [0x15abe4dc2aec8fda060609b2b47d85, 0x138145182f544c8a68d80bcba67af2, 0x0069de], + }, + BigNum { + limbs: [0xa7f81e23d36f6f25f9f9f54d4b827c, 0x93d1e4854df3e6af6f2ffdd6318a61, 0x000a0f], + }, + BigNum { + limbs: [0x1876aef7cc205e21ae42d827deca30, 0x6f29f2073a63626669c7c06691d161, 0x0010c7], + }, + BigNum { + limbs: [0xa52d5408323ba0de51bd26d82135d1, 0x3829379642e4d0d36e40493b4633f2, 0x006326], + }, + BigNum { + limbs: [0xd8e98cba8c851f53dbcceebb1aec4c, 0x7da509b2c067c30ab0c323dcd93343, 0x005edb], + }, + BigNum { + limbs: [0xe4ba764571d6dfac24331044e513b5, 0x29ae1feabce0702f2744e5c4fed20f, 0x001512], + }, + BigNum { + limbs: [0x34466bd37b654e75fbe2738ef6ec21, 0xf7bdf6d2576613871ea55580a605e5, 0x002f9e], + }, + BigNum { + limbs: [0x895d972c82f6b08a041d8b710913e0, 0xaf9532cb25e21fb2b962b42131ff6e, 0x00444e], + }, + BigNum { + limbs: [0xe3d5c95963601cef87c9f995096338, 0x788108ad69a5b53f9e776978ee912d, 0x0022c0], + }, + BigNum { + limbs: [0xd9ce39a69afbe2107836056af69cc9, 0x2ed220f013a27dfa3990a028e97425, 0x00512d], + }, + BigNum { + limbs: [0xa52764195066cb368bf892d23cfbea, 0x4ffc4e3af3f346bc2d29fe6ef3b600, 0x0000a1], + }, + BigNum { + limbs: [0x187c9ee6adf533c974076c2dc30417, 0x5756db628954ec7daade0b32e44f53, 0x00734c], + }, + BigNum { + limbs: [0xe7644948035d564c122ce446b3b25c, 0xf7e46fad681a2e91cb91310e85e484, 0x003e4b], + }, + BigNum { + limbs: [0xd63fb9b7fafea8b3edd31ab94c4da5, 0xaf6eb9f0152e04a80c76d8935220ce, 0x0035a1], + }, + BigNum { + limbs: [0xf2d9bfd5140d699cc42e43382e70a4, 0x083148cb1058349ee0fb910de629c0, 0x001bdd], + }, + BigNum { + limbs: [0xcaca432aea4e95633bd1bbc7d18f5d, 0x9f21e0d26ceffe9af70c7893f1db92, 0x005810], + }, + BigNum { + limbs: [0xff8a227dfd1dec38fa67bcd4f84471, 0xbd7da7f332978a73656310ab4c6c08, 0x0066e4], + }, + BigNum { + limbs: [0xbe19e082013e12c70598422b07bb90, 0xe9d581aa4ab0a8c672a4f8f68b994a, 0x000d08], + }, + BigNum { + limbs: [0xdac5574c6b36285f26172cbdae7696, 0x467880c3870fe5f29a8023d2eb1261, 0x001a74], + }, + BigNum { + limbs: [0xe2deabb39325d6a0d9e8d24251896b, 0x60daa8d9f6384d473d87e5ceecf2f1, 0x005979], + }, + BigNum { + limbs: [0x092a39c6a48f459c533e348b6eff5f, 0x1db7d0376a78528b2ecd3ea8ae6c56, 0x0011e5], + }, + BigNum { + limbs: [0xb479c93959ccb963acc1ca749100a2, 0x899b596612cfe0aea93acaf92998fd, 0x006208], + }, + BigNum { + limbs: [0x209c683b1f1277f13eb4a91bb6a4f8, 0xdb28617d36ba715ec5ec903e27b135, 0x0051e8], + }, + BigNum { + limbs: [0x9d079ac4df49870ec14b55e4495b09, 0xcc2ac820468dc1db121b7963b0541e, 0x002204], + }, + BigNum { + limbs: [0x39d9bec3468ebe119a0380eb0bbdd4, 0xf5fcf2b2518e4d3d9ef4fd3ca74c1a, 0x00493d], + }, + BigNum { + limbs: [0x83ca443cb7cd40ee65fc7e14f4422d, 0xb15636eb2bb9e5fc39130c6530b939, 0x002aaf], + }, + BigNum { + limbs: [0xc036c97cdeccdb1309e8f8e477af4b, 0x633fec31a36e9a52920637cefbb3a0, 0x0053b9], + }, + BigNum { + limbs: [0xfd6d39831f8f23ecf617061b8850b6, 0x44133d6bd9d998e74601d1d2dc51b2, 0x002034], + }, + BigNum { + limbs: [0xb83acfc8e1fc9f12f727121ee0964a, 0x4d4c275307f975b7d7ce0cb29b36bc, 0x0017fa], + }, + BigNum { + limbs: [0x056933371c5f5fed08d8ece11f69b7, 0x5a07024a754ebd820039fcef3cce97, 0x005bf3], + }, + BigNum { + limbs: [0x59be7af6c293cfd283f3b304941cef, 0x20f7ffe182d1e66aa095c3e85fc919, 0x0072b6], + }, + BigNum { + limbs: [0x63e588093bc82f2d7c0c4bfb6be312, 0x865b29bbfa764ccf377245b9783c3a, 0x000137], + }, + BigNum { + limbs: [0x03249c8429f87e6844532496014769, 0xf040e1fdfca4b40f89ddd68b08bfde, 0x000116], + }, + BigNum { + limbs: [0xba7f667bd4638097bbacda69feb898, 0xb712479f80a37f2a4e2a3316cf4575, 0x0072d6], + }, + BigNum { + limbs: [0x9356da41aa6f8f02e7836bb3ab600d, 0x64c674e3478a1a81fdfbfaf9e23819, 0x00690f], + }, + BigNum { + limbs: [0x2a4d28be53ec6ffd187c934c549ff4, 0x428cb4ba35be18b7da0c0ea7f5cd3a, 0x000ade], + }, + BigNum { + limbs: [0xcf83fe0ae1e6a534ea9661ff26117d, 0xfe13068acf76d38555ddf2b6be9f66, 0x005e47], + }, + BigNum { + limbs: [0xee2004f51c7559cb15699d00d9ee84, 0xa9402312add15fb4822a16eb1965ec, 0x0015a5], + }, + BigNum { + limbs: [0xad1740d605853de7454aa702a3c258, 0x76c88e274f02c447c149769ccad950, 0x0000a0], + }, + BigNum { + limbs: [0x108cc229f8d6c118bab557fd5c3da9, 0x308a9b762e456ef216be93050d2c03, 0x00734d], + }, + BigNum { + limbs: [0xaec3d9a57ccd3297472f2054fecfd5, 0xb9661959f10d1a81eafd4497a5304a, 0x0054dd], + }, + BigNum { + limbs: [0x0ee0295a818ecc68b8d0deab01302c, 0xeded10438c3b18b7ed0ac50a32d509, 0x001f0f], + }, + BigNum { + limbs: [0xd7652e15e99c4fa549c326bd5ec839, 0x7e6d3b984ce333a79fcc2c033c1a9e, 0x0029e0], + }, + BigNum { + limbs: [0xe63ed4ea14bfaf5ab63cd842a137c8, 0x28e5ee053064ff92383bdd9e9beab4, 0x004a0d], + }, + BigNum { + limbs: [0x4c88ff93efa64a2f0a407c5295fb98, 0xfac010dea4409740b7a0a0fd537819, 0x005882], + }, + BigNum { + limbs: [0x711b036c0eb5b4d0f5bf82ad6a0469, 0xac9318bed9079bf9206768a4848d3a, 0x001b6a], + }, + BigNum { + limbs: [0x5e84d56af0f9ca4f7f8d52f0dc3992, 0x3119b933616cdbe1801187d7696ce6, 0x001772], + }, + BigNum { + limbs: [0x5f1f2d950d6234b08072ac0f23c66f, 0x7639706a1bdb575857f681ca6e986d, 0x005c7b], + }, + BigNum { + limbs: [0x1f60d0941e92cd6a0c566da29d6b4e, 0x36ed69e2548982af2ca67090f30a51, 0x0007ca], + }, + BigNum { + limbs: [0x9e43326bdfc93195f3a9915d6294b3, 0x7065bfbb28beb08aab619910e4fb02, 0x006c23], + }, + BigNum { + limbs: [0xe983b035dd777461db389f0c72ef67, 0xaaa63a9561e15c725eab59b885b4dc, 0x000a23], + }, + BigNum { + limbs: [0xd42052ca20e48a9e24c75ff38d109a, 0xfcacef081b66d6c7795cafe9525076, 0x0069c9], + }, + BigNum { + limbs: [0x1026bb7cc4a92cb1a5916f0c03c77e, 0x52872cea0502fba135f7b61b767f8b, 0x00673d], + }, + BigNum { + limbs: [0xad7d478339b2d24e5a6e8ff3fc3883, 0x54cbfcb378453798a21053866185c8, 0x000cb0], + }, + BigNum { + limbs: [0xcc96ca4f8ddbb2b42b0658a8edfb6b, 0x43de3052b6648a3783538c1c28ad2f, 0x005c9c], + }, + BigNum { + limbs: [0xf10d38b070804c4bd4f9a657120496, 0x6374f94ac6e3a90254b47d85af5823, 0x001751], + }, + BigNum { + limbs: [0xf152a3c0f1c231ff49725a1870375c, 0xf7d3c4edc935ffc2941254837a46d2, 0x006b82], + }, + BigNum { + limbs: [0xcc515f3f0c99cd00b68da4e78fc8a5, 0xaf7f64afb412337743f5b51e5dbe80, 0x00086a], + }, + BigNum { + limbs: [0x9f913cac2cc77977ee6e82bfd3a1f9, 0xad1a0314eff2961eaed1c485488a76, 0x00706e], + }, + BigNum { + limbs: [0x1e12c653d194858811917c402c5e08, 0xfa3926888d559d1b2936451c8f7add, 0x00037e], + }, + BigNum { + limbs: [0x2ae97a5238177d86f50a21463dd536, 0x89498b4a364c53f06d7099b29ccb04, 0x004723], + }, + BigNum { + limbs: [0x92ba88adc64481790af5ddb9c22acb, 0x1e099e5346fbdf496a976fef3b3a4f, 0x002cca], + }, + BigNum { + limbs: [0xb3b215b2a1cb8a7d5e2afb958221be, 0xa16e424912fc4b00c302811881c325, 0x0021e9], + }, + BigNum { + limbs: [0x09f1ed4d5c907482a1d5036a7dde43, 0x05e4e7546a4be8391505888956422e, 0x005204], + }, + BigNum { + limbs: [0x4e85ecd63f5c377a6298c0d8230e4f, 0x740ddd00e10d2b0611c4592c433219, 0x0062fa], + }, + BigNum { + limbs: [0x6f1e1629beffc7859d673e27dcf1b2, 0x33454c9c9c3b0833c643b07594d33a, 0x0010f3], + }, + BigNum { + limbs: [0xe9678b025e60f28b161ada6afe9538, 0xf7a59a09cbe80551530ffb9aa031dd, 0x0027b8], + }, + BigNum { + limbs: [0xd43c77fd9ffb0c74e9e52495016ac9, 0xafad8f93b1602de884f80e0737d375, 0x004c34], + }, + BigNum { + limbs: [0x7ff15c409eef5bc3a92ef2ca3fd8cc, 0xfb4c9980bb944a5586179e02d5dc88, 0x004869], + }, + BigNum { + limbs: [0x3db2a6bf5f6ca33c56d10c35c02735, 0xac06901cc1b3e8e451f06b9f0228cb, 0x002b83], + }, + BigNum { + limbs: [0x85709d15b42a3e0c14b9b4139f47cc, 0xb392702c989dd317c3b03bc4cc00cc, 0x006104], + }, + BigNum { + limbs: [0x383365ea4a31c0f3eb464aec60b835, 0xf3c0b970e4aa60221457cddd0c0487, 0x0012e8], + }, + BigNum { + limbs: [0xd0d4498d8b5ced307b71c0af325c62, 0x9d954e4bc32d2071129882629c2840, 0x00278e], + }, + BigNum { + limbs: [0xeccfb97272ff11cf848e3e50cda39f, 0x09bddb51ba1b12c8c56f873f3bdd12, 0x004c5f], + }, + BigNum { + limbs: [0x525b7e8ba1b24d98d86a7929758ccd, 0x15da7d5d01b023f671701bbd40ca3b, 0x006b5e], + }, + BigNum { + limbs: [0x6b4884745ca9b167279585d68a7334, 0x9178ac407b980f436697ede4973b18, 0x00088f], + }, + BigNum { + limbs: [0x908e545d34e2793c0867a94b248b6c, 0x7d213aed98fd4b3905264a3e4317e5, 0x006bcc], + }, + BigNum { + limbs: [0x2d15aea2c97985c3f79855b4db7495, 0x2a31eeafe44ae800d2e1bf6394ed6e, 0x000821], + }, + BigNum { + limbs: [0xc94cff0b73a8b9be2ad0a5f63874ba, 0xed38e13513aa7562ef27c3910418f9, 0x0056f9], + }, + BigNum { + limbs: [0xf45703f48ab34541d52f5909c78b47, 0xba1a4868699dbdd6e8e04610d3ec59, 0x001cf3], + }, + BigNum { + limbs: [0x36fe219d2f1ca32551d25163a57d86, 0xa592c8e79d78eb4ed97a2ea201b711, 0x002f18], + }, + BigNum { + limbs: [0x86a5e162cf3f5bdaae2dad9c5a827b, 0x01c060b5dfcf47eafe8ddaffd64e42, 0x0044d5], + }, + BigNum { + limbs: [0xa4784e5cefc9be2e1b980e4cafe433, 0x577770c381e5cbe1a229495b4b99c7, 0x0042db], + }, + BigNum { + limbs: [0x192bb4a30e9240d1e467f0b3501bce, 0x4fdbb8d9fb62675835dec0468c6b8c, 0x003112], + }, + BigNum { + limbs: [0xb3c2c92942824865084a31ecb924fa, 0x2a1ecf656d32a30763627a6886702e, 0x001c62], + }, + BigNum { + limbs: [0x09e139d6bbd9b69af7b5cd1346db07, 0x7d345a381015903274a58f39519525, 0x00578b], + }, + BigNum { + limbs: [0x3d902f03551049f127d7c393e202c0, 0xf9cfd3370d6c944417a9fc1f8cfeb5, 0x00056b], + }, + BigNum { + limbs: [0x8013d3fca94bb50ed8283b6c1dfd41, 0xad8356666fdb9ef5c05e0d824b069e, 0x006e81], + }, + BigNum { + limbs: [0x4ba5d295058ca307a2b4097373ef5a, 0x85b55ab26d8ac390432f293555e2ba, 0x001d20], + }, + BigNum { + limbs: [0x71fe306af8cf5bf85d4bf58c8c10a7, 0x219dceeb0fbd6fa994d8e06c822299, 0x0056cd], + }, + BigNum { + limbs: [0xc2c4351645ca60d00d8e28e597ebb9, 0x937f818d465e2b8a21cbde1084c7d2, 0x0019b8], + }, + BigNum { + limbs: [0xfadfcde9b8919e2ff271d61a681448, 0x13d3a81036ea07afb63c2b91533d80, 0x005a35], + }, + BigNum { + limbs: [0x449d265c117b30c24ac967f93d8b01, 0xb6bfa3edb16c0360158fd6702a37e9, 0x00141f], + }, + BigNum { + limbs: [0x7906dca3ece0ce3db5369706c27500, 0xf09385afcbdc2fd9c2783331adcd6a, 0x005fcd], + }, + BigNum { + limbs: [0x3651759b44053677b99f0eca393e84, 0xa01b180d7fc3a4c3b9f74a56ca0543, 0x00077b], + }, + BigNum { + limbs: [0x87528d64ba56c8884660f035c6c17d, 0x0738118ffd848e761e10bf4b0e0010, 0x006c72], + }, + BigNum { + limbs: [0x5c324df87197f007401cd383ea6433, 0x19ddb92d997b13b0e0ff9f159f428e, 0x006b23], + }, + BigNum { + limbs: [0x6171b5078cc40ef8bfe32b7c159bce, 0x8d75706fe3cd1f88f7086a8c38c2c5, 0x0008ca], + }, + BigNum { + limbs: [0xa3ed8c7d553c366294367b3eef0647, 0x6b11dbd832ff1fb4c9583417520f25, 0x0008b2], + }, + BigNum { + limbs: [0x19b67682a91fc89d6bc983c110f9ba, 0x3c414dc54a4913850eafd58a85f62e, 0x006b3b], + }, + BigNum { + limbs: [0x9f779c216532e9654dff9acfc27353, 0xbb20340e48cb13a9b86723f41d63bd, 0x002365], + }, + BigNum { + limbs: [0x1e2c66de9929159ab20064303d8cae, 0xec32f58f347d1f901fa0e5adbaa196, 0x005087], + }, + BigNum { + limbs: [0x4badbde5b349d3512f0d5b5d19ba24, 0x6365555433d7803a1a95d55fc37552, 0x004e56], + }, + BigNum { + limbs: [0x71f6451a4b122baed0f2a3a2e645dd, 0x43edd4494970b2ffbd723442149001, 0x002597], + }, + BigNum { + limbs: [0x0acf4a881882c49d95b848783baff6, 0x6ef4daa39a3398ecd2bc6003abf49e, 0x004b0e], + }, + BigNum { + limbs: [0xb2d4b877e5d93a626a47b687c4500b, 0x385e4ef9e3149a4d054ba99e2c10b5, 0x0028df], + }, + BigNum { + limbs: [0xff7db1e208ca5762d37d2f50142c1d, 0x1798ccc9781075e48186a0f936f2f9, 0x00655b], + }, + BigNum { + limbs: [0xbe26511df591a79d2c82cfafebd3e4, 0x8fba5cd40537bd55568168a8a11259, 0x000e92], + }, + BigNum { + limbs: [0xe4385aa59379304eb87f06f3052074, 0xb8a802a174ea379ba1457efc2e2881, 0x0011f9], + }, + BigNum { + limbs: [0xd96ba85a6ae2ceb14780f80cfadf8d, 0xeeab26fc085dfb9e36c28aa5a9dcd1, 0x0061f3], + }, + BigNum { + limbs: [0xec510028ee108633efbda071957818, 0x8ee91d8b9f540e171f160493e14fee, 0x0003a1], + }, + BigNum { + limbs: [0xd15302d7104b78cc10425e8e6a87e9, 0x186a0c11ddf42522b8f2050df6b564, 0x00704c], + }, + BigNum { + limbs: [0xa7bbb5ec527557ba4fa14e54bbedf6, 0x417cb0e82b9ffd191ef6acc3e59f9d, 0x000c5e], + }, + BigNum { + limbs: [0x15e84d13abe6a745b05eb0ab44120b, 0x65d678b551a83620b9115cddf265b6, 0x00678f], + }, + BigNum { + limbs: [0xc024153f96227a1683c9b2579ec673, 0x898d8eda40f85e2f7f8a626b1f2011, 0x0035fc], + }, + BigNum { + limbs: [0xfd7fedc0683984e97c364ca861398e, 0x1dc59ac33c4fd50a587da736b8e541, 0x003df1], + }, + BigNum { + limbs: [0xe952a25430c3b9c15e92b69fb876f2, 0x4d58a5b97c0d1ffa0fefe7651f7418, 0x004a57], + }, + BigNum { + limbs: [0xd45160abcd98453ea16d486047890f, 0x59fa83e4013b133fc818223cb8913a, 0x002996], + }, + BigNum { + limbs: [0xc16e47ee9344e623a5a02af7352846, 0x1570af1eaed89534129c442b9b50b0, 0x0039b2], + }, + BigNum { + limbs: [0xfc35bb116b1718dc5a5fd408cad7bb, 0x91e27a7ece6f9e05c56bc5763cb4a2, 0x003a3b], + }, + BigNum { + limbs: [0xc9ff6bc17ee0c0300dcd481613376a, 0xf4786d303126047688651a184c8190, 0x003750], + }, + BigNum { + limbs: [0xf3a4973e7f7b3ecff232b6e9ecc897, 0xb2dabc6d4c222ec34fa2ef898b83c2, 0x003c9c], + }, + BigNum { + limbs: [0xe47938602798ee2feabcab1eb5c580, 0x8bd6fa1e279cd00145595a25cf22fa, 0x000af4], + }, + BigNum { + limbs: [0xd92aca9fd6c310d0154353e14a3a81, 0x1b7c2f7f55ab633892aeaf7c08e258, 0x0068f9], + }, + BigNum { + limbs: [0x82450dbe073be8162efe65f1c2b990, 0xe506ed3420bd548b26494c5a621e78, 0x002335], + }, + BigNum { + limbs: [0x3b5ef541f72016e9d101990e3d4671, 0xc24c3c695c8adeaeb1bebd4775e6db, 0x0050b7], + }, + BigNum { + limbs: [0x1a903d8f52d2a90dff66838d9c7fbd, 0x8a08974d8c1bf1ec877e19a187e39b, 0x004c87], + }, + BigNum { + limbs: [0xa313c570ab8955f200997b72638044, 0x1d4a924ff12c414d5089f0005021b8, 0x002766], + }, + BigNum { + limbs: [0x96c3746709260726d987fa9e3bbed3, 0xa27be85055e8b203921cd6971c63e4, 0x004e25], + }, + BigNum { + limbs: [0x26e08e98f535f7d926780461c4412e, 0x04d7414d275f813645eb330abba16f, 0x0025c8], + }, + BigNum { + limbs: [0xbdee817f227e486819b9b9795c3e0f, 0x00154a61744cbb7789c88db15913ad, 0x000d03], + }, + BigNum { + limbs: [0xffb58180dbddb697e6464586a3c1f2, 0xa73ddf3c08fb77c24e3f7bf07ef1a5, 0x0066ea], + }, + BigNum { + limbs: [0x07a6e79adda5afa3109ba77f2518c7, 0x867bd40a744e3d649126de0af18e82, 0x0063ea], + }, + BigNum { + limbs: [0xb5fd1b6520b64f5cef645780dae73a, 0x20d7559308f9f5d546e12b96e676d1, 0x001003], + }, + BigNum { + limbs: [0x5b78d7ad57b0f38547116436757283, 0xfdd66062acb5a269327c0efa5e5c8c, 0x004514], + }, + BigNum { + limbs: [0x622b2b52a6ab0b7ab8ee9ac98a8d7e, 0xa97cc93ad09290d0a58bfaa779a8c7, 0x002ed8], + }, + BigNum { + limbs: [0xa56f61a006515a17be1566d99a7483, 0x4f501ad75aad02dac68288140c42da, 0x0043c5], + }, + BigNum { + limbs: [0x1834a15ff80aa4e841ea9826658b7e, 0x58030ec6229b305f1185818dcbc279, 0x003028], + }, + BigNum { + limbs: [0x065584e021791f1391419338a0badc, 0xe82a30c630237655b39804b4c4a0e3, 0x003951], + }, + BigNum { + limbs: [0xb74e7e1fdce2dfec6ebe6bc75f4525, 0xbf28f8d74d24bce4247004ed136470, 0x003a9b], + }, + BigNum { + limbs: [0xf92ae474cef12d5145aca500592c77, 0x9d1eaf1c0b155b90729187a8961bf7, 0x000c7c], + }, + BigNum { + limbs: [0xc4791e8b2f6ad1aeba5359ffa6d38a, 0x0a347a817232d7a9657681f941e95b, 0x006771], + }, + BigNum { + limbs: [0x97eb526090f342f807dc397d6d14ee, 0x13ef0677dcd750c7a1520e76702560, 0x00627c], + }, + BigNum { + limbs: [0x25b8b09f6d68bc07f823c58292eb13, 0x93642325a070e27236b5fb2b67dff3, 0x001171], + }, + BigNum { + limbs: [0x94ea7f998e3036d6bed2498a5d8638, 0x448b1d5cbea6dfc72166834e512278, 0x003922], + }, + BigNum { + limbs: [0x28b98366702bc829412db575a279c9, 0x62c80c40bea15372b6a1865386e2db, 0x003acb], + }, + BigNum { + limbs: [0xff614331a1c5ee416c0cec37d6d1e3, 0x358697a1948bdde939ccba7d1a0b56, 0x006912], + }, + BigNum { + limbs: [0xbe42bfce5c9610be93f312c8292e1e, 0x71cc91fbe8bc55509e3b4f24bdf9fc, 0x000adb], + }, + BigNum { + limbs: [0xf453443751352cd5ec27c20801dd0c, 0xe39b16faf7c46cc7ac221e46db195c, 0x005428], + }, + BigNum { + limbs: [0xc950bec8ad26d22a13d83cf7fe22f5, 0xc3b812a28583c6722be5eb5afcebf6, 0x001fc4], + }, + BigNum { + limbs: [0x55db26760dbddac00db50a8b455478, 0xd94bd5ed9311a8d9ff5e4d8aea5817, 0x001b03], + }, + BigNum { + limbs: [0x67c8dc89f09e243ff24af474baab89, 0xce0753afea368a5fd8a9bc16edad3c, 0x0058e9], + }, + BigNum { + limbs: [0x49b65c7d1fed03f5b384a538296000, 0x7c3942fa7cfd9aed68d099c5eb4e62, 0x006288], + }, + BigNum { + limbs: [0x73eda682de6efb0a4c7b59c7d6a001, 0x2b19e6a3004a984c6f376fdbecb6f1, 0x001165], + }, + BigNum { + limbs: [0x3a5b42deb5e4c1b66d42eea88ef658, 0xd75572234819e092ac4898119b265f, 0x0020b2], + }, + BigNum { + limbs: [0x8348c02148773d4992bd10577109a9, 0xcffdb77a352e52a72bbf71903cdef4, 0x00533a], + }, + BigNum { + limbs: [0x9789fe6f5e6d87ec21011e1910e3f6, 0xddfe267b290a0c6b6dbfa5a338e877, 0x0062a3], + }, + BigNum { + limbs: [0x261a04909fee7713defee0e6ef1c0b, 0xc9550322543e26ce6a4863fe9f1cdc, 0x001149], + }, + BigNum { + limbs: [0x4759df07c81cf588e130df905786d7, 0xe1eeb4fc8bcd8ed5ffac85a790ec7a, 0x000af2], + }, + BigNum { + limbs: [0x764a23f8363f09771ecf1f6fa8792a, 0xc56474a0f17aa463d85b83fa4718d9, 0x0068fa], + }, + BigNum { + limbs: [0x5186929cb753ce8a84298fd3ddf34c, 0xba25714e3e69008fab821a3ee08d64, 0x006086], + }, + BigNum { + limbs: [0x6c1d7063470830757bd66f2c220cb5, 0xed2db84f3edf32aa2c85ef62f777ef, 0x001366], + }, + BigNum { + limbs: [0xe7a0348b8faec254f0afb89d963fea, 0x64ab3a29297f3027fbcec0f933fe6b, 0x003eee], + }, + BigNum { + limbs: [0xd603ce746ead3cab0f50466269c017, 0x42a7ef7453c90311dc3948a8a406e7, 0x0034ff], + }, + BigNum { + limbs: [0x3b845b65ff13ce04b81c740d89cb54, 0xd4ceaa3502758601997f45fa4a4b00, 0x0049b8], + }, + BigNum { + limbs: [0x821fa799ff4830fb47e38af27634ad, 0xd2847f687ad2ad383e88c3a78dba53, 0x002a34], + }, + BigNum { + limbs: [0xe365db905d5bbf2f11ec355270b1d7, 0x6c686f4d606c07c39a15c300ab83e5, 0x004b5f], + }, + BigNum { + limbs: [0xda3e276fa1003fd0ee13c9ad8f4e2a, 0x3aeaba501cdc2b763df246a12c816d, 0x00288e], + }, + BigNum { + limbs: [0xe2d540a29e52cd9cab5805fc609431, 0xba317c9334f608b7a43373d7cd3962, 0x006450], + }, + BigNum { + limbs: [0xdacec25d6009316354a7f9039f6bd0, 0xed21ad0a48522a8233d495ca0acbf0, 0x000f9c], + }, + BigNum { + limbs: [0x2b493a84dfb36896b6a5c9464cd413, 0x24db15ec7c17375f6988a630da2245, 0x006eb6], + }, + BigNum { + limbs: [0x925ac87b1ea89669495a35b9b32bee, 0x827813b10130fbda6e7f6370fde30e, 0x000537], + }, + BigNum { + limbs: [0x9b4d224b0528c83d046a082716bcad, 0x86515fbcd4407b19ef363b2e531257, 0x002064], + }, + BigNum { + limbs: [0x2256e0b4f93336c2fb95f6d8e94354, 0x2101c9e0a907b81fe8d1ce7384f2fc, 0x005389], + }, + BigNum { + limbs: [0xeb12eb2761d20c77841793f2e1f3bd, 0xf7216cd9a914d05c53c86f28bcf1f1, 0x00683d], + }, + BigNum { + limbs: [0xd29117d89c89f2887be86b0d1e0c44, 0xb031bcc3d43362dd843f9a791b1361, 0x000baf], + }, + BigNum { + limbs: [0x8beb6ddae7129a65bf313b1012d3c3, 0x6543cac258cb9e754890fcc1363893, 0x003e2d], + }, + BigNum { + limbs: [0x31b895251749649a40cec3efed2c3e, 0x420f5edb247c94c48f770ce0a1ccc0, 0x0035c0], + }, + BigNum { + limbs: [0xedd3f0704fcd8f277505ba720effe1, 0xa8a8ede82d0fb1e20890ceda6f1723, 0x0043a3], + }, + BigNum { + limbs: [0xcfd0128fae8e6fd88afa448df10020, 0xfeaa3bb550388157cf773ac768ee2f, 0x003049], + }, + BigNum { + limbs: [0xd1ce9ac4ad54c9e879678fda473b16, 0xae4c1953da0602d3749c19fa0c5093, 0x0056cb], + }, + BigNum { + limbs: [0xebd5683b5107351786986f25b8c4eb, 0xf9071049a3423066636befa7cbb4bf, 0x001d21], + }, + BigNum { + limbs: [0xa589adcd54196cf6b1a5c2e3dca6d2, 0xfd08c1065f9bee4333f2689c749b27, 0x000dba], + }, + BigNum { + limbs: [0x181a5532aa4292094e5a3c1c23592f, 0xaa4a68971dac44f6a415a105636a2c, 0x006632], + }, + BigNum { + limbs: [0x2f8dfa512822d59b3f666708cf6ab9, 0xd0072ac754cfe2a8f07114efb1bbae, 0x002c53], + }, + BigNum { + limbs: [0x8e1608aed6392964c09997f7309548, 0xd74bfed628785090e796f4b22649a5, 0x004799], + }, + BigNum { + limbs: [0xc31a16ae503a1dbb4d3aef9624f018, 0xe6e12b03a3ac400f72460d090590de, 0x004c37], + }, + BigNum { + limbs: [0xfa89ec51ae21e144b2c50f69db0fe9, 0xc071fe99d99bf32a65c1fc98d27474, 0x0027b5], + }, + BigNum { + limbs: [0x8cd6fdc62b7832b8bc7c0276b4eb5c, 0x0c57398282e4d2ba7b1aeab16b3187, 0x004445], + }, + BigNum { + limbs: [0x30cd0539d2e3cc474383fc894b14a5, 0x9afbf01afa63607f5ced1ef06cd3cc, 0x002fa8], + }, + BigNum { + limbs: [0x56f9dc800d97f131c91d435c7c321f, 0xe64eb0a6f68528607cdf9e439ef7d2, 0x00469d], + }, + BigNum { + limbs: [0x66aa267ff0c40dce36e2bba383cde2, 0xc10478f686c30ad95b286b5e390d81, 0x002d4f], + }, + BigNum { + limbs: [0x4b10df195a1e62c5f3a1fed8434f96, 0x7b876a5c766a1e9f60b772f6f9d3e6, 0x000afd], + }, + BigNum { + limbs: [0x729323e6a43d9c3a0c5e0027bcb06b, 0x2bcbbf4106de149a775096aade316d, 0x0068f0], + }, + BigNum { + limbs: [0xfbd130f283c5b69e922efa201850aa, 0x6ccf34bf27600b6ce3857940d09152, 0x001f8c], + }, + BigNum { + limbs: [0xc1d2d20d7a9648616dd104dfe7af57, 0x3a83f4de55e827ccf4829061077400, 0x005461], + }, + BigNum { + limbs: [0xa6a757eea27f2fa9af23aa807c2be1, 0x059ee3a1b642e96a613abae5c1d9bc, 0x005306], + }, + BigNum { + limbs: [0x16fcab115bdccf5650dc547f83d420, 0xa1b445fbc70549cf76cd4ebc162b97, 0x0020e7], + }, + BigNum { + limbs: [0xec67bec93ed7b8fcc288eadc69885e, 0xb2024f06f16a517e48c887951e3cc8, 0x004547], + }, + BigNum { + limbs: [0xd13c4436bf8446033d7714239677a3, 0xf550da968bdde1bb8f3f820cb9c88a, 0x002ea5], + }, + BigNum { + limbs: [0x2257110db62c1989285663ad98ee1f, 0x5151c6756d96e98d0ff23a9eb5a0ae, 0x0020d4], + }, + BigNum { + limbs: [0x9b4cf1f2482fe576d7a99b526711e2, 0x560163280fb149acc815cf032264a5, 0x005319], + }, + BigNum { + limbs: [0x0edb74177d38a4ad4cd59e471baa4d, 0x9e2545372c7b28f86f4786ee953296, 0x006cfe], + }, + BigNum { + limbs: [0xaec88ee881235a52b32a60b8e455b4, 0x092de46650cd0a4168c082b342d2bd, 0x0006ef], + }, + BigNum { + limbs: [0x412dab573abf941818f477fd67a800, 0x9584c239f193a789079521925a487d, 0x00439b], + }, + BigNum { + limbs: [0x7c7657a8c39c6ae7e70b8702985801, 0x11ce67638bb48bb0d072e80f7dbcd6, 0x003052], + }, + BigNum { + limbs: [0x7f2231c95ebaaa709feba3bd78dc6b, 0xca0f0381c911ddb1b93891f3063039, 0x0057ce], + }, + BigNum { + limbs: [0x3e81d1369fa1548f60145b42872396, 0xdd44261bb43655881ecf77aed1d51a, 0x001c1e], + }, + BigNum { + limbs: [0xde10ef35c170a32825b20112cdd5e9, 0xcd1b39a42a351e4dedee0a80e57d26, 0x002bd5], + }, + BigNum { + limbs: [0xdf9313ca3ceb5bd7da4dfded322a18, 0xda37eff9531314ebea19ff20f2882c, 0x004817], + }, + BigNum { + limbs: [0xdd1684a82174337180d4984f1ebc40, 0x3177280da2870d25a01bec21dfa01e, 0x002abe], + }, + BigNum { + limbs: [0xe08d7e57dce7cb8e7f2b66b0e143c1, 0x75dc018fdac1261437ec1d7ff86534, 0x00492f], + }, + BigNum { + limbs: [0x3d7f2a56a5a89fc8a744a668a546f7, 0x302ac56ea9dfeb1198dd3db79ebe10, 0x000a71], + }, + BigNum { + limbs: [0x8024d8a958b35f3758bb58975ab90a, 0x7728642ed36848283f2acbea394743, 0x00697c], + }, + BigNum { + limbs: [0x052f439346a8b05b12288d994b4771, 0xb9bad3328e426f695c45a377ddfd7e, 0x00682e], + }, + BigNum { + limbs: [0xb874bf6cb7b34ea4edd77166b4b890, 0xed98566aef05c3d07bc26629fa07d5, 0x000bbe], + }, + BigNum { + limbs: [0xba62b0c4e030ef1f583b87d6ade6f9, 0x014d6c8e9858d2bbd398ad664ee592, 0x002257], + }, + BigNum { + limbs: [0x0341523b1e2b0fe0a7c47729521908, 0xa605bd0ee4ef607e046f5c3b891fc1, 0x005196], + }, + BigNum { + limbs: [0x21e6561a1920b10c72391c8a1cc159, 0x16faab48860710a81440947ef47c01, 0x0003e6], + }, + BigNum { + limbs: [0x9bbdace5e53b4df38dc6e275e33ea8, 0x90587e54f7412291c3c77522e38952, 0x007007], + }, + BigNum { + limbs: [0x8aa947145e5a1fec90dd2dde7b5bef, 0x1560147bf3b782cd30aa038c9c0d6a, 0x00520e], + }, + BigNum { + limbs: [0x32fabbeba001df136f22d12184a412, 0x91f315218990b06ca75e06153bf7e9, 0x0021df], + }, + BigNum { + limbs: [0x29f6779cbe3cee50df9925dcf2a32c, 0x5c422ae049929893a83fe0e4945804, 0x006de1], + }, + BigNum { + limbs: [0x93ad8b63401f10af2066d9230d5cd5, 0x4b10febd33b59aa62fc828bd43ad4f, 0x00060c], + }, + BigNum { + limbs: [0x1c29ca120a5e788da46467972393bf, 0x37a599bc3caad9f3d4cbc2d492945a, 0x006d29], + }, + BigNum { + limbs: [0xa17a38edf3fd86725b9b9768dc6c42, 0x6fad8fe1409d5946033c46cd4570f9, 0x0006c4], + }, + BigNum { + limbs: [0x8bdc93a30df3b872ba7cd748c22385, 0x0d6b5a03665f72c462365d4b3dd6b5, 0x0015a8], + }, + BigNum { + limbs: [0x31c76f5cf068468d458327b73ddc7c, 0x99e7cf9a16e8c07575d1ac569a2e9e, 0x005e45], + }, + BigNum { + limbs: [0x594d11234a23b7fd8eaaee8a4332e5, 0x6bbb0c03c90c1fc1bd3e89411619ec, 0x00539f], + }, + BigNum { + limbs: [0x6456f1dcb438470271551075bccd1c, 0x3b981d99b43c13781ac98060c1eb67, 0x00204e], + }, + BigNum { + limbs: [0xbe36f366cdac04fe33f22717ae9a38, 0x1bf270758c7cedda892c24b801fffa, 0x001fcf], + }, + BigNum { + limbs: [0xff6d0f9930affa01cc0dd7e85165c9, 0x8b60b927f0cb455f4edbe4e9d60558, 0x00541e], + }, + BigNum { + limbs: [0xa2bc16d1f444dd3d8631f87a66bd9b, 0xb86c4fe25686801afb3bb037c2a2a3, 0x006d81], + }, + BigNum { + limbs: [0x1ae7ec2e0a1721c279ce0685994266, 0xeee6d9bb26c1b31edccc596a1562b0, 0x00066b], + }, + BigNum { + limbs: [0x429fc4b615dc88fbaeb3bdb102cf18, 0x62c9a6820e51c2d5d0d5ef27c7e4d5, 0x003b8b], + }, + BigNum { + limbs: [0x7b043e49e87f7604514c414efd30e9, 0x4489831b6ef6706407321a7a10207e, 0x003862], + }, + BigNum { + limbs: [0xf771c7881bf39e9792c9e792201cec, 0xf49510f16df834c2564b0fa575d528, 0x000708], + }, + BigNum { + limbs: [0xc6323b77e26860686d36176ddfe315, 0xb2be18ac0f4ffe7781bcf9fc62302a, 0x006ce4], + }, + BigNum { + limbs: [0x032279af1aaeba30316f6a5cbe727c, 0xe71dd75bc2ecd64c8f0c367f618e97, 0x000c66], + }, + BigNum { + limbs: [0xba818950e3ad44cfce9094a3418d85, 0xc0355241ba5b5ced48fbd3227676bc, 0x006786], + }, + BigNum { + limbs: [0x95285f31f3aad9c2b862b5a29aa404, 0x4aebd7d15d91b9f6a3756239a7394f, 0x005c5c], + }, + BigNum { + limbs: [0x287ba3ce0ab1253d479d495d655bfd, 0x5c6751cc1fb679433492a76830cc04, 0x001791], + }, + BigNum { + limbs: [0x5e256b68b3e8a4cd3a2a932e00323d, 0x168e51f06071676c71539cd85de38c, 0x001e97], + }, + BigNum { + limbs: [0x5f7e97974a735a32c5d56bd1ffcdc4, 0x90c4d7ad1cd6cbcd66b46cc97a21c7, 0x005556], + }, + BigNum { + limbs: [0x87e437986d307d92538c02aa2f6e16, 0xb672f7fb05252c5e0d6a5b267af071, 0x006080], + }, + BigNum { + limbs: [0x35bfcb67912b816dac73fc55d091eb, 0xf0e031a2782306dbca9dae7b5d14e2, 0x00136c], + }, + BigNum { + limbs: [0x0c2482681b3eecc7d230d176d2502b, 0xd166744e9433dbc0ece48bd069c490, 0x005a31], + }, + BigNum { + limbs: [0xb17f8097e31d12382dcf2d892dafd6, 0xd5ecb54ee9145778eb237dd16e40c3, 0x0019bb], + }, + BigNum { + limbs: [0x86b8b99e949a02a08d6542914ee68a, 0x2a3b847f9576527c4feb08776b8971, 0x001129], + }, + BigNum { + limbs: [0x36eb496169c1fc5f729abc6eb11977, 0x7d17a51de7d1e0bd881d012a6c7be2, 0x0062c4], + }, + BigNum { + limbs: [0x4dcb7d01ac2baaa6a808ecba9ac50b, 0x596e3a73a678b5b2804924315b5201, 0x002545], + }, + BigNum { + limbs: [0x6fd885fe5230545957f71245653af6, 0x4de4ef29d6cf7d8757bee5707cb352, 0x004ea8], + }, + BigNum { + limbs: [0xac76cc4049dd79650254e725ec2473, 0x0e33010313dbc8d859f57cc1de01fe, 0x005030], + }, + BigNum { + limbs: [0x112d36bfb47e859afdab17da13db8e, 0x9920289a696c6a617e128cdffa0355, 0x0023bd], + }, + BigNum { + limbs: [0x998959ee6be9e2410139dd5d09fffd, 0xf17cbc4b985729a80acaddf2df26ce, 0x001503], + }, + BigNum { + limbs: [0x241aa91192721cbefec621a2f60004, 0xb5d66d51e4f10991cd3d2baef8de85, 0x005ee9], + }, + BigNum { + limbs: [0x71139ca7d67729c5bde460a2bdde47, 0x104a66cf8ad94927833498c5a6b856, 0x002bf7], + }, + BigNum { + limbs: [0x4c90665827e4d53a421b9e5d4221ba, 0x9708c2cdf26eea1254d370dc314cfd, 0x0047f6], + }, + BigNum { + limbs: [0x8b90011d36f27ab1f8b0fada34ec97, 0xa849a2a72f072104cea55f96f8dc55, 0x0036a4], + }, + BigNum { + limbs: [0x321401e2c769844e074f0425cb136a, 0xff0986f64e4112350962aa0adf28fe, 0x003d48], + }, + BigNum { + limbs: [0xefe96b3eb765c50b865660e5468565, 0xdc08604089a07e4077bf84d06c3ecf, 0x007390], + }, + BigNum { + limbs: [0xcdba97c146f639f479a99e1ab97a9c, 0xcb4ac95cf3a7b4f9604884d16bc683, 0x00005c], + }, + BigNum { + limbs: [0xdefcb7f945a2551e66a066094d7636, 0x02f3870607e14fa3bbdd211d8337d4, 0x004421], + }, + BigNum { + limbs: [0xdea74b06b8b9a9e1995f98f6b289cb, 0xa45fa2977566e3961c2ae88454cd7e, 0x002fcc], + }, + BigNum { + limbs: [0x5822b64e0b9b26373a682660761944, 0xa7eef5328e8818fe26781cf3ff9137, 0x001c36], + }, + BigNum { + limbs: [0x65814cb1f2c0d8c8c597d89f89e6bd, 0xff64346aeec01a3bb18fecadd8741c, 0x0057b6], + }, + BigNum { + limbs: [0xfb335a0dcf92b2fc5c7a8d9430e9cb, 0xa76183551e88d8097dcb514c5654dd, 0x005f25], + }, + BigNum { + limbs: [0xc270a8f22ec94c03a385716bcf1636, 0xfff1a6485ebf5b305a3cb85581b075, 0x0014c7], + }, + BigNum { + limbs: [0x31363172d494c26fb839a9faf8188e, 0x2c9f639a3a5ab566a93088cd7eb1c4, 0x006c1a], + }, + BigNum { + limbs: [0x8c6dd18d29c73c9047c6550507e773, 0x7ab3c60342ed7dd32ed780d459538f, 0x0007d3], + }, + BigNum { + limbs: [0xaa1c87567b5903e83915b2035faea7, 0x57b15ac7081ca9b60f8f2c9fb54863, 0x0048b0], + }, + BigNum { + limbs: [0x13877ba98302fb17c6ea4cfca0515a, 0x4fa1ced6752b8983c878dd0222bcf0, 0x002b3d], + }, + BigNum { + limbs: [0xafbb716bbc387cca1310530cc044fa, 0x5601643b2882d8a0074dfb20e2d164, 0x00211f], + }, + BigNum { + limbs: [0x0de8919442238235ecefabf33fbb07, 0x5151c56254c55a99d0ba0e80f533ef, 0x0052ce], + }, + BigNum { + limbs: [0x10e1a8f2f64bf41a2ef73c66cbb7c6, 0x8f02f37c8d2455ee9f580df9527030, 0x00173a], + }, + BigNum { + limbs: [0xacc25a0d08100ae5d108c29934483b, 0x18503620f023dd4b38affba8859523, 0x005cb3], + }, + BigNum { + limbs: [0xa6122f655c997c2d3f94e98ca49bbb, 0xde0653949e912e81c1c7698c577526, 0x00143d], + }, + BigNum { + limbs: [0x1791d39aa1c282d2c06b15735b6446, 0xc94cd608deb704b81640a01580902d, 0x005faf], + }, + BigNum { + limbs: [0x1124d405bf7aabdf8d55151ef4f9ec, 0xc3c3bed53d882ad9387c916f12854a, 0x002055], + }, + BigNum { + limbs: [0xac7f2efa3ee1532072aae9e10b0615, 0xe38f6ac83fc008609f8b7832c58009, 0x005397], + }, + BigNum { + limbs: [0x2c74299a10e7c95e09090a764f6390, 0xbfebc2782a92610f3e639653fe3c1c, 0x006efc], + }, + BigNum { + limbs: [0x912fd965ed7435a1f6f6f489b09c71, 0xe767672552b5d22a99a4734dd9c937, 0x0004f0], + }, + BigNum { + limbs: [0x886bbc04a47c4088112f52fe2c4432, 0x3dfdc5b94c147f938adf9e252d8003, 0x006eef], + }, + BigNum { + limbs: [0x353846fb59dfbe77eed0ac01d3bbcf, 0x695563e43133b3a64d286b7caa8550, 0x0004fe], + }, + BigNum { + limbs: [0xbd0f5c286ae03a2c5fd0ee29a61068, 0x4b0ce3eea8ca794fdc040507aba85a, 0x003012], + }, + BigNum { + limbs: [0x0094a6d7937bc4d3a02f10d659ef99, 0x5c4645aed47db9e9fc04049a2c5cf9, 0x0043db], + }, + BigNum { + limbs: [0x36b7edd690eb355bbdd1528660c72d, 0x4bd9de921697a1e738e2f329ab8e0b, 0x001152], + }, + BigNum { + limbs: [0x86ec15296d70c9a4422eac799f38d4, 0x5b794b0b66b091529f2516782c7748, 0x00629b], + }, + BigNum { + limbs: [0xd72ad65f46d726783ee4e9030b121d, 0x4f5a2a19f612bc5b54bb9d04899f77, 0x0032ec], + }, + BigNum { + limbs: [0xe6792ca0b784d887c11b15fcf4ede4, 0x57f8ff83873576de834c6c9d4e65db, 0x004101], + }, + BigNum { + limbs: [0xc38dc29ee64919bd5b0d2da1fdb04f, 0xadda3175e8ed6509386b35e64b9e42, 0x005508], + }, + BigNum { + limbs: [0xfa1640611812e542a4f2d15e024fb2, 0xf978f827945ace309f9cd3bb8c6710, 0x001ee4], + }, + BigNum { + limbs: [0x8e7c5ddb1443d706f0db8c7121f9f3, 0x81191b6befa46edbc381958375eb7d, 0x001666], + }, + BigNum { + limbs: [0x2f27a524ea1827f90f24728ede060e, 0x263a0e318da3c45e1486741e6219d6, 0x005d87], + }, + BigNum { + limbs: [0x362129fcf80f3a0c35fe1ecc54fea6, 0x7330eb7307e28a976c40c41df52101, 0x00446d], + }, + BigNum { + limbs: [0x8782d903064cc4f3ca01e033ab015b, 0x34223e2a7565a8a26bc74583e2e452, 0x002f80], + }, + BigNum { + limbs: [0x896469b6669563c15ccddff613e6c3, 0x5ad7346c2a74d501f59804e685491d, 0x0045ad], + }, + BigNum { + limbs: [0x343f994997c69b3ea3321f09ec193e, 0x4c7bf53152d35e37e27004bb52bc36, 0x002e40], + }, + BigNum { + limbs: [0x71eca35d5272bc11b2b030ee121117, 0xac36dbd7d8ed6f40d43527acf89d16, 0x004c3a], + }, + BigNum { + limbs: [0x4bb75fa2abe942ee4d4fce11edeeea, 0xfb1c4dc5a45ac3f903d2e1f4df683d, 0x0027b2], + }, + BigNum { + limbs: [0x02b20f5415c8edfd3888c1a912f735, 0x7dd6b49f8d01590557dbc7ff3a72c5, 0x007263], + }, + BigNum { + limbs: [0xbaf1f3abe8931102c7773d56ed08cc, 0x297c74fdf046da34802c41a29d928e, 0x00018a], + }, + BigNum { + limbs: [0x07af22564f84f8f83aecc92580b8aa, 0x5a42aef9c0269ffb74496a8aa8d45f, 0x004f6e], + }, + BigNum { + limbs: [0xb5f4e0a9aed70607c51335da7f4757, 0x4d107aa3bd21933e63be9f172f30f4, 0x00247f], + }, + BigNum { + limbs: [0x9c70269bbd114690350f4e3f8df6a5, 0x89e17d7aec42fb14952aba78db9462, 0x0017ca], + }, + BigNum { + limbs: [0x2133dc64414ab86fcaf0b0c072095c, 0x1d71ac229105382542dd4f28fc70f1, 0x005c23], + }, + BigNum { + limbs: [0x5984f698b67a4f84e0147535fc4cc7, 0x9fb480cf1962424ccc9781abb5d4bd, 0x005cc5], + }, + BigNum { + limbs: [0x641f0c6747e1af7b1feb89ca03b33a, 0x079ea8ce63e5f0ed0b7087f6223096, 0x001728], + }, + BigNum { + limbs: [0xcc3eb7bca53cba14e4436934073cf8, 0xa29cc0a9b176bab082cf14139ca439, 0x000be1], + }, + BigNum { + limbs: [0xf1654b43591f44eb1bbc95cbf8c309, 0x04b668f3cbd178895538f58e3b6119, 0x00680c], + }, + BigNum { + limbs: [0x577ec3fec64b94ffa0768034358069, 0x2f0427377bf2559ffc5a62719e22db, 0x001c74], + }, + BigNum { + limbs: [0x66253f0138106a005f897ecbca7f98, 0x784f02660155dd99dbada73039e278, 0x005779], + }, + BigNum { + limbs: [0x336422fb2484bea951fae8db934564, 0x8cfc63f4ce5809a7f4331ef665f6ff, 0x002060], + }, + BigNum { + limbs: [0x8a3fe004d9d74056ae0516246cba9d, 0x1a56c5a8aef02991e3d4eaab720e54, 0x00538d], + }, + BigNum { + limbs: [0x2fee58775d07250cdf6a3a35ecf57f, 0x5f739bcb6b817b150a3d799a20a549, 0x001e1e], + }, + BigNum { + limbs: [0x8db5aa88a154d9f32095c4ca130a82, 0x47df8dd211c6b824cdca9007b7600a, 0x0055cf], + }, + BigNum { + limbs: [0xacd165ded9ee4bee85bd9f44eadafc, 0x8c66cae96230cc8ca46d95273f8560, 0x0043aa], + }, + BigNum { + limbs: [0x10d29d21246db3117a425fbb152505, 0x1aec5eb41b1766ad339a747a987ff3, 0x003043], + }, + BigNum { + limbs: [0xa62701b792b4b927428087510b4690, 0x4dfbddaa0f7018a5f6c9d6ee753c3a, 0x000c3e], + }, + BigNum { + limbs: [0x177d01486ba745d8bd7f77aef4b971, 0x59574bf36dd81a93e13e32b362c919, 0x0067af], + }, + BigNum { + limbs: [0x2bb8a6efad1e27f723ac02bc953aad, 0x19512cc16fca078fe779deb9655e56, 0x0027db], + }, + BigNum { + limbs: [0x91eb5c10513dd708dc53fc436ac554, 0x8e01fcdc0d7e2ba9f08e2ae872a6fd, 0x004c12], + }, + BigNum { + limbs: [0x4b2cfa769fd7090da3400381fcc74e, 0x37ba404a0d987ba20ac46f869f0e03, 0x002a5f], + }, + BigNum { + limbs: [0x727708895e84f5f25cbffb7e0338b3, 0x6f98e9536fafb797cd439a1b38f750, 0x00498e], + }, + BigNum { + limbs: [0x4c63965a705ecf9e985c7e18ed3d94, 0x676f45ec4c4be580c83d05f64c7819, 0x00641b], + }, + BigNum { + limbs: [0x71406ca58dfd2f6167a380e712c26d, 0x3fe3e3b130fc4db90fcb03ab8b8d3a, 0x000fd2], + }, + BigNum { + limbs: [0x40a5a6bee95b75b0a24612e823d13d, 0xb243df1e9853a678f914d4d20ec0cd, 0x004d3d], + }, + BigNum { + limbs: [0x7cfe5c411500894f5db9ec17dc2ec4, 0xf50f4a7ee4f48cc0def334cfc94486, 0x0026af], + }, + BigNum { + limbs: [0xe486ab9c1d181d325a4c24c7ca7cc7, 0x380a113e0de0bb589129ecd866e89a, 0x0004e7], + }, + BigNum { + limbs: [0xd91d5763e143e1cda5b3da3835833a, 0x6f49185f6f6777e146de1cc9711cb8, 0x006f06], + }, + BigNum { + limbs: [0xdad8d7196fb3f65c1941863d1168cd, 0x90308f169ce69e837a858ba1f4dbec, 0x0014da], + }, + BigNum { + limbs: [0xe2cb2be68ea808a3e6be78c2ee9734, 0x17229a86e06194b65d827dffe32966, 0x005f13], + }, + BigNum { + limbs: [0x74bd923dc36a592cc0d7becb4f8876, 0x61262f282dcae92f7171df3b47edda, 0x005b1b], + }, + BigNum { + limbs: [0x48e670c23af1a5d33f284034b0778b, 0x462cfa754f7d4a0a66962a66901779, 0x0018d2], + }, + BigNum { + limbs: [0x6d7db0e788ca47358d0356fe5c9dd1, 0x3bf5a632c343afe3c67ccb9bc555d5, 0x004101], + }, + BigNum { + limbs: [0x502652187591b7ca72fca801a36230, 0x6b5d836aba048356118b3e0612af7e, 0x0032ec], + }, + BigNum { + limbs: [0x8478c058ba081aa9a5318b553b5055, 0x204b4d180e5fafaf710124fe64cc2f, 0x00303b], + }, + BigNum { + limbs: [0x392b42a74453e4565ace73aac4afac, 0x8707dc856ee8838a6706e4a3733924, 0x0043b2], + }, + BigNum { + limbs: [0xdedeaa3d44c908d6481057712b62db, 0xae5fdb8f2f3d6ddcbaedc9453e96d0, 0x001bb7], + }, + BigNum { + limbs: [0xdec558c2b992f629b7efa78ed49d26, 0xf8f34e0e4e0ac55d1d1a405c996e82, 0x005835], + }, + BigNum { + limbs: [0xc6be59ee6c4978fab7b69fb529b7e3, 0x6c09a50cc22023fa498ade54827584, 0x006aeb], + }, + BigNum { + limbs: [0xf6e5a9119212860548495f4ad6481e, 0x3b498490bb280f3f8e7d2b4d558fce, 0x000902], + }, + BigNum { + limbs: [0x8f864a71161064a192553890378d77, 0x17ee086c6e073fd463744dfe796c4c, 0x004698], + }, + BigNum { + limbs: [0x2e1db88ee84b9a5e6daac66fc8728a, 0x8f6521310f40f3657493bba35e9907, 0x002d55], + }, + BigNum { + limbs: [0x9a9969bef61c7030607eed4e106241, 0xd1f0e3ff52986368034091730c6b9d, 0x000b2c], + }, + BigNum { + limbs: [0x230a9941083f8ecf9f8111b1ef9dc0, 0xd562459e2aafcfd1d4c7782ecb99b6, 0x0068c0], + }, + BigNum { + limbs: [0x507e6d99ae9fb5cf3f5b54b4aec959, 0x04f0408c123beba4f8ff3b7a8c1be7, 0x00027f], + }, + BigNum { + limbs: [0x6d2595664fbc4930c0a4aa4b5136a8, 0xa262e9116b0c4794df08ce274be96c, 0x00716e], + }, + BigNum { + limbs: [0xd9ded9e5b846364876072015b5eb65, 0xf33c820d1972523c36cb307c474c66, 0x002c3d], + }, + BigNum { + limbs: [0xe3c5291a4615c8b789f8deea4a149c, 0xb416a79063d5e0fda13cd92590b8ec, 0x0047af], + }, + BigNum { + limbs: [0xeb1be306684058ab89474dafefa2eb, 0xad8e0aff72fddd5f394035f10efc55, 0x004171], + }, + BigNum { + limbs: [0xd2881ff9961ba65476b8b150105d16, 0xf9c51e9e0a4a55da9ec7d3b0c908fd, 0x00327b], + }, + BigNum { + limbs: [0x254f5541ef7930a331a41b73f7abaa, 0xc571ec70792379996efebe4f0acfa9, 0x002115], + }, + BigNum { + limbs: [0x9854adbe0ee2ce5cce5be38c085457, 0xe1e13d2d0424b9a069094b52cd35aa, 0x0052d7], + }, + BigNum { + limbs: [0xb41f6fa66c6185499dc9307637db4e, 0x33aa2adfa3d536b7641585985e553c, 0x000617], + }, + BigNum { + limbs: [0x0984935991fa79b66236ce89c824b3, 0x73a8febdd972fc8273f2840979b017, 0x006dd6], + }, + BigNum { + limbs: [0xf9ceeec6dcc80182ea775599840a35, 0xfeed9f0db0a00b8ee40fc17a7860b4, 0x00597c], + }, + BigNum { + limbs: [0xc3d514392193fd7d1588a9667bf5cc, 0xa8658a8fcca827aaf3f848275fa49e, 0x001a70], + }, + BigNum { + limbs: [0x7c3afc63865e0d5abea05493f97fa6, 0x8700c692c174b22a86412d8ed07cee, 0x0040a9], + }, + BigNum { + limbs: [0x4169069c77fdf1a5415faa6c06805b, 0x2052630abbd3810f51c6dc13078865, 0x003344], + }, + BigNum { + limbs: [0x6fce9cfc06ce536b61e1f83655b4f5, 0xd69266a9fcde925a42a6d3f34fed4c, 0x0040d7], + }, + BigNum { + limbs: [0x4dd56603f78dab949e1e06c9aa4b0c, 0xd0c0c2f38069a0df956135ae881807, 0x003315], + }, + BigNum { + limbs: [0x6da96883a873462ccc2c2cf47c63df, 0x9ad5a4f61993a52471a84bb496a6c3, 0x0007f6], + }, + BigNum { + limbs: [0x4ffa9a7c55e8b8d333d3d20b839c22, 0x0c7d84a763b48e15665fbded415e90, 0x006bf7], + }, + BigNum { + limbs: [0xcdadabd0b38af56c035d9eab203dbe, 0x7ca455960f91959b712aca7c881bfe, 0x0021b1], + }, + BigNum { + limbs: [0xeff6572f4ad10993fca26054dfc243, 0x2aaed4076db69d9e66dd3f254fe954, 0x00523c], + }, + BigNum { + limbs: [0xe00594924fb402d6cd14fd27e25700, 0x44261676fcc9f3bc3df6273fd94bd1, 0x003186], + }, + BigNum { + limbs: [0xdd9e6e6daea7fc2932eb01d81da901, 0x632d1326807e3f7d9a11e261feb981, 0x004267], + }, + BigNum { + limbs: [0x0ee7d30e12b23d1ab447818017f222, 0xc6b854445b5ea6798aa04ee79bdb41, 0x0068aa], + }, + BigNum { + limbs: [0xaebc2ff1eba9c1e54bb87d7fe80ddf, 0xe09ad55921e98cc04d67baba3c2a12, 0x000b42], + }, + BigNum { + limbs: [0xfea3e5c0c9365a897755321979df0f, 0x1526811d79ccb36c6e20369d140fc1, 0x00306c], + }, + BigNum { + limbs: [0xbf001d3f3525a47688aacce68620f2, 0x922ca880037b7fcd69e7d304c3f591, 0x004381], + }, + BigNum { + limbs: [0x749a7cd475fcba89e3a03ed602252d, 0x3d4724f28a112be91e58eee71d4355, 0x006a7a], + }, + BigNum { + limbs: [0x4909862b885f44761c5fc029fddad4, 0x6a0c04aaf3370750b9af1ababac1fe, 0x000973], + }, + BigNum { + limbs: [0x0f1173523113cd28d02344081ebd9c, 0x6aa34cdcd1600752f686c03aab1979, 0x0072a9], + }, + BigNum { + limbs: [0xae928fadcd4831d72fdcbaf7e14265, 0x3cafdcc0abe82be6e18149672cebda, 0x000144], + }, + BigNum { + limbs: [0x19809deb59fb23d7cd720d549ab2eb, 0x7b346cc7e5c436afd1adf36438b891, 0x001f2d], + }, + BigNum { + limbs: [0xa4236514a460db28328df1ab654d16, 0x2c1ebcd59783fc8a065a163d9f4cc2, 0x0054c0], + }, + BigNum { + limbs: [0x61c74f88aecaa3f8518c32a0f5203d, 0x2e03ec6552ab659ae7550d5fbfbdcb, 0x001264], + }, + BigNum { + limbs: [0x5bdcb3774f915b07ae73cc5f0adfc4, 0x794f3d382a9ccd9ef0b2fc42184788, 0x006189], + }, + BigNum { + limbs: [0x0f7509eb12bf7a12d6b6c03800e954, 0xd14a7eea8bf2615934146cd481131e, 0x006ced], + }, + BigNum { + limbs: [0xae2ef914eb9c84ed29493ec7ff16ad, 0xd608aab2f155d1e0a3f39ccd56f235, 0x0006ff], + }, + BigNum { + limbs: [0x5972f0c64c836900ff94c5632452fe, 0xb39695b0958edb6e036992fd59a041, 0x000050], + }, + BigNum { + limbs: [0x64311239b1d895ff006b399cdbad03, 0xf3bc93ece7b957cbd49e76a47e6512, 0x00739c], + }, + BigNum { + limbs: [0x82918a1275e4859be951ce740d7fdb, 0xba9bb0ed7d9163545d0bf99fcaa395, 0x0056d7], + }, + BigNum { + limbs: [0x3b1278ed8877796416ae308bf28026, 0xecb778afffb6cfe57afc10020d61be, 0x001d15], + }, + BigNum { + limbs: [0x1601a76229c1adfbecb0a04cff1fd5, 0x7a5cdde8aca2e66faae39b39c088f7, 0x00292f], + }, + BigNum { + limbs: [0xa7a25b9dd49a5104134f5eb300e02c, 0x2cf64bb4d0a54cca2d246e68177c5c, 0x004abe], + }, + BigNum { + limbs: [0xb612d30c081aabf34e05525f877021, 0x4bfe667932157f92916e86d96b6930, 0x004bf2], + }, + BigNum { + limbs: [0x07912ff3f641530cb1faaca0788fe0, 0x5b54c3244b32b3a7469982c86c9c23, 0x0027fb], + }, + BigNum { + limbs: [0xd5ea380ce32e6b2dd42bd931d880fa, 0xe427c36951f6d473cff7407c6dcfb4, 0x006e88], + }, + BigNum { + limbs: [0xe7b9caf31b2d93d22bd425ce277f07, 0xc32b66342b515ec60810c9256a359e, 0x000564], + }, + BigNum { + limbs: [0x0f84475022fe939470465bee013097, 0x58bad03c9dbd58155a83a8ea6c3390, 0x002cda], + }, + BigNum { + limbs: [0xae1fbbafdb5d6b6b8fb9a311fecf6a, 0x4e985960df8adb247d8460b76bd1c3, 0x004713], + }, + BigNum { + limbs: [0xa16ef813f31e5f83b68b581d21fd33, 0xd5284c1600d347aae07d7872a6391a, 0x005202], + }, + BigNum { + limbs: [0x1c350aec0b3d9f7c4974a6e2de02ce, 0xd22add877c74eb8ef78a912f31cc39, 0x0021ea], + }, + BigNum { + limbs: [0x48051e0746d4d27634d53c101b484f, 0x274c05b653d0979001b1a9c1802b67, 0x00425b], + }, + BigNum { + limbs: [0x759ee4f8b7872c89cb2ac2efe4b7b2, 0x800723e729779ba9d6565fe057d9ec, 0x003192], + }, + BigNum { + limbs: [0x8503100bf4f456b35f7bf5575c7b23, 0x45cdf7a9ba4cf1bf9c0b78cfea72b9, 0x006f01], + }, + BigNum { + limbs: [0x38a0f2f40967a84ca08409a8a384de, 0x618531f3c2fb417a3bfc90d1ed929a, 0x0004ec], + }, + BigNum { + limbs: [0xf49d1fef18fe446a96b2f8aba94ca5, 0x0381d5637adbe052493f508ebbd64e, 0x005062], + }, + BigNum { + limbs: [0xc906e310e55dba95694d065456b35c, 0xa3d1543a026c52e78ec8b9131c2f04, 0x00238b], + }, + BigNum { + limbs: [0xe70398715625d1fe45dab729efaea5, 0x48d147f9e07b866b74814bbc6fc20e, 0x00284b], + }, + BigNum { + limbs: [0xd6a06a8ea8362d01ba2547d610515c, 0x5e81e1a39cccacce6386bde5684344, 0x004ba2], + }, + BigNum { + limbs: [0x43e19212b8aa4df3a5ad5791a994d8, 0x540c98122505b6ecd0eb892cffb184, 0x000dd3], + }, + BigNum { + limbs: [0x79c270ed45b1b10c5a52a76e566b29, 0x5346918b58427c4d071c8074d853cf, 0x00661a], + }, + BigNum { + limbs: [0x6bc6576070693cb7d4f57ca8e234d2, 0x78031812872bf13558bc3f0560e2d7, 0x00695a], + }, + BigNum { + limbs: [0x51ddab9f8df2c2482b0a82571dcb2f, 0x2f50118af61c42047f4bca9c77227c, 0x000a93], + }, + BigNum { + limbs: [0xfe1703fe711c29b80e538fb0db8eac, 0xdb43a94f5b7bb38f39714deeb1ae8a, 0x0014bd], + }, + BigNum { + limbs: [0xbf8cff018d3fd547f1ac6f4f247155, 0xcc0f804e21cc7faa9e96bbb32656c8, 0x005f2f], + }, + BigNum { + limbs: [0x24660d2d313d631f591af96e8a7fee, 0xc197a37224f76ca24d962e9700475f, 0x00347c], + }, + BigNum { + limbs: [0x993df5d2cd1e9be0a6e50591758013, 0xe5bb862b5850c6978a71db0ad7bdf4, 0x003f70], + }, + BigNum { + limbs: [0x88d41415a9d2b7905e2d22cc47814f, 0x81307e7897487efc9679d3ae6717af, 0x0029a4], + }, + BigNum { + limbs: [0x34cfeeea5489476fa1d2dc33b87eb2, 0x2622ab24e5ffb43d418e35f370eda4, 0x004a49], + }, + BigNum { + limbs: [0xf108e4ee1b6fb6162787b451688c10, 0x962e55e3bd5fbe8f28ffbc2667540c, 0x000c3d], + }, + BigNum { + limbs: [0xcc9b1e11e2ec48e9d8784aae9773f1, 0x1124d3b9bfe874aaaf084d7b70b146, 0x0067b0], + }, + BigNum { + limbs: [0x206cf9748b83dd96d828215664721a, 0xe83969d643cbcec6ec3b08bdf75cb5, 0x006a6b], + }, + BigNum { + limbs: [0x9d37098b72d8216927d7dda99b8de7, 0xbf19bfc7397c6472ebcd00e3e0a89e, 0x000981], + }, + BigNum { + limbs: [0x44895d478fa9ddd1291c9619ff853a, 0x8c88d24405c2e8c071ee884d75d3a4, 0x004ef4], + }, + BigNum { + limbs: [0x791aa5b86eb2212ed6e368e6007ac7, 0x1aca575977854a79661981546231af, 0x0024f9], + }, + BigNum { + limbs: [0x5a424237cbda19892e38be9f062611, 0x11bc8052d3e3f0c732b4b9a2d2ebd0, 0x000a94], + }, + BigNum { + limbs: [0x6361c0c83281e576d1c74060f9d9f0, 0x9596a94aa9644272a5534fff051983, 0x006959], + }, + BigNum { + limbs: [0x7d89921705901e5de06a0b012d0243, 0x594fdeb2e307f3e1fb2deb76f3bb71, 0x006c45], + }, + BigNum { + limbs: [0x401a70e8f8cbe0a21f95f3fed2fdbe, 0x4e034aea9a403f57dcda1e2ae449e2, 0x0007a8], + }, + BigNum { + limbs: [0xa788bc6d17181423c79bd954755494, 0x0481d07a7e9f35032fbef532789ce5, 0x00611b], + }, + BigNum { + limbs: [0x161b4692e743eadc386425ab8aab6d, 0xa2d15922fea8fe36a849146f5f686e, 0x0012d2], + }, + BigNum { + limbs: [0x1653d1c1bc6e308ea22d6694856daa, 0xb4cc459331ab514ca0d0085bb39e9d, 0x005068], + }, + BigNum { + limbs: [0xa750313e41edce715dd2986b7a9257, 0xf286e40a4b9ce1ed373801462466b6, 0x002384], + }, + BigNum { + limbs: [0x054f3e075b729d81098d794dea5701, 0x6abf41700b9842a65fa559497c8810, 0x004f9d], + }, + BigNum { + limbs: [0xb854c4f8a2e9617ef67285b215a900, 0x3c93e82d71aff0937862b0585b7d43, 0x002450], + }, + BigNum { + limbs: [0x5057d57703f9a87e126235ecd43026, 0x74affe564b7a8b3844deac9ea56431, 0x001736], + }, + BigNum { + limbs: [0x6d4c2d88fa625681ed9dc9132bcfdb, 0x32a32b4731cda80193295d0332a122, 0x005cb7], + }, + BigNum { + limbs: [0xb47dbca9cae90afbe221bbe8b0070f, 0x1707ef01055ae713812af75c3ce340, 0x006e6d], + }, + BigNum { + limbs: [0x092646563372f4041dde43174ff8f2, 0x904b3a9c77ed4c2656dd12459b2213, 0x000580], + }, + BigNum { + limbs: [0x6f364ee6ca599e2a57e7c2e3829f5d, 0xbff09ddfad632d741d8ddfa5d583ef, 0x0061f4], + }, + BigNum { + limbs: [0x4e6db419340260d5a8183c1c7d60a4, 0xe7628bbdcfe505c5ba7a29fc028164, 0x0011f8], + }, + BigNum { + limbs: [0x0b303e3b187bfe2d29236b4aba2c30, 0x7d686e321ed7e2bf66e7d85fbbf104, 0x004f5a], + }, + BigNum { + limbs: [0xb273c4c4e5e000d2d6dc93b545d3d1, 0x29eabb6b5e70507a712031421c144f, 0x002493], + }, + BigNum { + limbs: [0x8af5568bee084eafc9284dc5c825b3, 0x1e8cce6557ae443ba5d28686f073a4, 0x001c5b], + }, + BigNum { + limbs: [0x32aeac741053b05036d7b13a37da4e, 0x88c65b382599eefe3235831ae791af, 0x005792], + }, + BigNum { + limbs: [0x7e09e82f1c3e9d4efb199435cf1951, 0x5d7839b1fcfcf9503d8f57a4d6614e, 0x003b14], + }, + BigNum { + limbs: [0x3f9a1ad0e21d61b104e66aca30e6b0, 0x49daefeb804b39e99a78b1fd01a405, 0x0038d9], + }, + BigNum { + limbs: [0x55d107b1c203eab17bd0bb5bad1182, 0x9c8b5342ec1d44944d3f7324eb7480, 0x001cb9], + }, + BigNum { + limbs: [0x67d2fb4e3c58144e842f43a452ee7f, 0x0ac7d65a912aeea58ac8967cec90d3, 0x005734], + }, + BigNum { + limbs: [0xcc98e5c7db5187d8c1d40bb10adc59, 0xc0675265fa2dfc519755c087a32876, 0x003c33], + }, + BigNum { + limbs: [0xf10b1d38230a77273e2bf34ef523a8, 0xe6ebd737831a36e840b2491a34dcdc, 0x0037b9], + }, + BigNum { + limbs: [0xc2ff3e383faedce4a93fcddb1211f4, 0x208ddf82338cb12eca28a2ee1691e3, 0x0035c4], + }, + BigNum { + limbs: [0xfaa4c4c7bead221b56c03124edee0d, 0x86c54a1b49bb820b0ddf66b3c1736f, 0x003e29], + }, + BigNum { + limbs: [0x770750a3295ce013845fe3e81af4a9, 0x5e069cf1ffd4b20beea0d3d2717cab, 0x0040d6], + }, + BigNum { + limbs: [0x469cb25cd4ff1eec7ba01b17e50b58, 0x494c8cab7d73812de96735cf6688a8, 0x003317], + }, + BigNum { + limbs: [0x4b6d768688f6163f7aef5a8d5a484b, 0xc4e0a34ac8817ca0911d55cb959127, 0x003367], + }, + BigNum { + limbs: [0x72368c797565e8c08510a472a5b7b6, 0xe2728652b4c6b69946eab3d642742c, 0x004085], + }, + BigNum { + limbs: [0x0454e65c549e730c28faecaf1e8d22, 0x56b81cdb2573eb5e4c7cc761dd4520, 0x005d92], + }, + BigNum { + limbs: [0xb94f1ca3a9bd8bf3d7051250e172df, 0x509b0cc257d447db8b8b423ffac033, 0x00165b], + }, + BigNum { + limbs: [0x51ee0472a016488c27b766a60882f9, 0x11507fe896a5498eb71d7559be4c99, 0x0052c2], + }, + BigNum { + limbs: [0x6bb5fe8d5e45b673d8489859f77d08, 0x9602a9b4e6a2e9ab20ea944819b8ba, 0x00212b], + }, + BigNum { + limbs: [0xc5bca14681745c76d754972b0417a7, 0x2f86c9d8d39011f0f8130ff3be0f88, 0x0018f0], + }, + BigNum { + limbs: [0xf7e761b97ce7a28928ab67d4fbe85a, 0x77cc5fc4a9b82148dff4f9ae19f5ca, 0x005afd], + }, + BigNum { + limbs: [0x638559361842718ac62a5b6e5ad517, 0x6fb41d42210a721065e2d58541d8ed, 0x004100], + }, + BigNum { + limbs: [0x5a1ea9c9e6198d7539d5a391a52aea, 0x379f0c5b5c3dc1297225341c962c66, 0x0032ed], + }, + BigNum { + limbs: [0x1950751921323a56171b04b937cdaf, 0x937ddeaca07bc012d70246b27dc065, 0x0024ee], + }, + BigNum { + limbs: [0xa4538de6dd29c4a9e8e4fa46c83252, 0x13d54af0dccc73270105c2ef5a44ee, 0x004eff], + }, + BigNum { + limbs: [0x2a319f1febe961d72e9ae3be101d4a, 0x9c3f07698480401ec4aa8199861df1, 0x004b05], + }, + BigNum { + limbs: [0x937263e012729d28d1651b41efe2b7, 0x0b142233f8c7f31b135d880851e762, 0x0028e8], + }, + BigNum { + limbs: [0x6741faefb9fa2d5aa8609bb6978a8a, 0x21978e244f9d146d95e0e0022b3e03, 0x001a07], + }, + BigNum { + limbs: [0x566208104461d1a5579f6349687577, 0x85bb9b792dab1ecc4227299facc750, 0x0059e6], + }, + BigNum { + limbs: [0x45ddc7c4867210129ed5dca288fdad, 0xda03c2eccc63b00e689f35ee7c4f17, 0x000145], + }, + BigNum { + limbs: [0x77c63b3b77e9eeed612a225d770254, 0xcd4f66b0b0e4832b6f68d3b35bb63c, 0x0072a7], + }, + BigNum { + limbs: [0xb74b780ee14bd5ffd348ed4368ea6b, 0xe856ea5ac03fc0e50bf8399e8a372b, 0x0030c0], + }, + BigNum { + limbs: [0x06588af11d1029002cb711bc971596, 0xbefc3f42bd087254cc0fd0034dce28, 0x00432c], + }, + BigNum { + limbs: [0xb180cc06183fdc238b0dcafb1476da, 0x9abcdc6fffbff88b8ccd41b6fe9072, 0x006dae], + }, + BigNum { + limbs: [0x0c2336f9e61c22dc74f23404eb8927, 0x0c964d2d7d883aae4b3ac7ead974e1, 0x00063f], + }, + BigNum { + limbs: [0xa0aa4b47b65a9aa9b9e943288d1377, 0x1a344d6f5983ebaddafe1ce61a3e55, 0x002139], + }, + BigNum { + limbs: [0x1cf9b7b8480164564616bbd772ec8a, 0x8d1edc2e23c4478bfd09ecbbbdc6fe, 0x0052b4], + }, + BigNum { + limbs: [0xda2c1965bb0e4df3f081d760a857c1, 0x717dde8a10fab09cc8a6d690d6d975, 0x002b2c], + }, + BigNum { + limbs: [0xe377e99a434db10c0f7e279f57a840, 0x35d54b136c4d829d0f613311012bdd, 0x0048c1], + }, + BigNum { + limbs: [0x4b18da6a0cb40d9f323ea3d74cb3ed, 0xd903bc2a828e0a910beaf7801c3c4a, 0x0068a3], + }, + BigNum { + limbs: [0x728b2895f1a7f160cdc15b28b34c14, 0xce4f6d72faba28a8cc1d1221bbc909, 0x000b49], + }, + BigNum { + limbs: [0xdbfda03b545ae6d8953347b71b2763, 0x4045701c2afdeb6b10d0ae8fdb6702, 0x004e58], + }, + BigNum { + limbs: [0xe1a662c4aa0118276accb748e4d89e, 0x670db981524a47cec7375b11fc9e50, 0x002595], + }, + BigNum { + limbs: [0x29f1a50e3889f85141aa86a2a5ecfe, 0xb7b08d8f15ade18c576cea199d2fa8, 0x000189], + }, + BigNum { + limbs: [0x93b25df1c5d206aebe55785d5a1303, 0xefa29c0e679a51ad809b1f883ad5ab, 0x007263], + }, + BigNum { + limbs: [0xb6ef0eb662097c3848f25bc12e55e5, 0x0f09621ec698c303dcd2525aa8e1d5, 0x00207c], + }, + BigNum { + limbs: [0x06b4f4499c5282c7b70da33ed1aa1c, 0x9849c77eb6af7035fb35b7472f237e, 0x005371], + }, + BigNum { + limbs: [0xfee96131f8a2c92461b61f8c172710, 0x3925f9b4c85b4d19a6dc30bd3cf9de, 0x0034d0], + }, + BigNum { + limbs: [0xbebaa1ce05b935db9e49df73e8d8f1, 0x6e2d2fe8b4ece620312bd8e49b0b74, 0x003f1d], + }, + BigNum { + limbs: [0x141e3d346407c47189304e56429ad5, 0xb91199af6c50c47d1bfcf63d8da28f, 0x0056f5], + }, + BigNum { + limbs: [0xa985c5cb9a543a8e76cfb0a9bd652c, 0xee418fee10f76ebcbc0b13644a62c4, 0x001cf7], + }, + BigNum { + limbs: [0x8bc773e8f76ec48f6d8cad9a860cd0, 0x8ac912456e1d8865c216fafad6f949, 0x004228], + }, + BigNum { + limbs: [0x31dc8f1706ed3a709273516579f331, 0x1c8a17580f2aaad415f10ea7010c0a, 0x0031c5], + }, + BigNum { + limbs: [0x0738e3b14d3321adc2f5fb7a0f9779, 0xe3491835bf37c77b9884e9951f09f5, 0x001285], + }, + BigNum { + limbs: [0xb66b1f4eb128dd523d0a0385f06888, 0xc40a1167be106bbe3f83200cb8fb5e, 0x006167], + }, + BigNum { + limbs: [0xede3c44914fead6b72120c1df2a4b7, 0xe8be4df796d59f6c51b91a1bb80965, 0x0057f2], + }, + BigNum { + limbs: [0xcfc03eb6e95d51948dedf2e20d5b4a, 0xbe94dba5e67293cd864eef861ffbed, 0x001bfa], + }, + BigNum { + limbs: [0x02db433ead26c61eff4e410f51f541, 0xac8c4cf028e96b55b53b85b3aaaf65, 0x004f11], + }, + BigNum { + limbs: [0xbac8bfc1513538e100b1bdf0ae0ac0, 0xfac6dcad545ec7e422cc83ee2d55ee, 0x0024db], + }, + BigNum { + limbs: [0xcdd406650e46c8d98b75fb7861f2ca, 0x7cbfb59eea4ac9eaecdc39624a74d6, 0x00337d], + }, + BigNum { + limbs: [0xefcffc9af0153626748a03879e0d37, 0x2a9373fe92fd694eeb2bd03f8d907c, 0x004070], + }, + BigNum { + limbs: [0xa5bc30f24fec3acc3d6f4f809b0a53, 0x6ed642e8c59a514c846d5f0e44976d, 0x002013], + }, + BigNum { + limbs: [0x17e7d20dae6fc433c290af7f64f5ae, 0x387ce6b4b7ade1ed539aaa93936de6, 0x0053da], + }, + BigNum { + limbs: [0xdeb7a80902a9c5efdf3ccfe8e53a24, 0x1a50f8bb8a7d92a4ae617d426c9358, 0x0070ba], + }, + BigNum { + limbs: [0xdeec5af6fbb2391020c32f171ac5dd, 0x8d0230e1f2caa09529a68c5f6b71fa, 0x000333], + }, + BigNum { + limbs: [0x682f007f22bb81fdd7ada825dfd8e9, 0xba432991de5065a9a51a6b3c1aee25, 0x003c87], + }, + BigNum { + limbs: [0x55750280dba07d02285256da202718, 0xed10000b9ef7cd9032ed9e65bd172e, 0x003765], + }, + BigNum { + limbs: [0xdc15430c03b1e93f800f008fb12ae6, 0xab089b07419bb6f14d619c69d89866, 0x00665b], + }, + BigNum { + limbs: [0xe18ebff3faaa15c07ff0fe704ed51b, 0xfc4a8e963bac7c488aa66d37ff6cec, 0x000d91], + }, + BigNum { + limbs: [0x9e920fb609ba358d5ceacfe1dffb42, 0x817f573e38be9b763b9e8a078d875c, 0x004094], + }, + BigNum { + limbs: [0x1f11f349f4a1c972a3152f1e2004bf, 0x25d3d25f448997c39c697f9a4a7df7, 0x003359], + }, + BigNum { + limbs: [0x5f4c56d978347b10decd73542a05fd, 0x12ef8c4b82539a2ef0ffba88222629, 0x005c58], + }, + BigNum { + limbs: [0x5e57ac26862783ef21328babd5fa04, 0x94639d51faf4990ae7084f19b5df2a, 0x001795], + }, + BigNum { + limbs: [0x1a0584cc517b2805c42dc5891560a9, 0x9d33e7931ce4ecbc30602b356bce70, 0x0016b0], + }, + BigNum { + limbs: [0xa39e7e33ace0d6fa3bd23976ea9f58, 0x0a1f420a6063467da7a7de6c6c36e3, 0x005d3d], + }, + BigNum { + limbs: [0x628e600a788e04ab750b85650ebd1b, 0x45839982795b2e6635a42125b2c691, 0x004faf], + }, + BigNum { + limbs: [0x5b15a2f585cdfa548af4799af142e6, 0x61cf901b03ed04d3a263e87c253ec2, 0x00243e], + }, + BigNum { + limbs: [0x5fd0a3184059075334c20cef94dd35, 0x069a3f7275ed6f16b28321f60d75c3, 0x001a8e], + }, + BigNum { + limbs: [0x5dd35fe7be02f7accb3df2106b22cc, 0xa0b8ea2b075ac4232584e7abca8f90, 0x00595f], + }, + BigNum { + limbs: [0x5321e5ff1832016c9ec31e57800535, 0x6fde6d9f8cf58100484127999969e6, 0x0058d2], + }, + BigNum { + limbs: [0x6a821d00e629fd93613ce0a87ffacc, 0x3774bbfdf052b2398fc6e2083e9b6d, 0x001b1b], + }, + BigNum { + limbs: [0x24e42aa8d5aec08ce356eec0b581c3, 0x96482f24fb2a6806482acecf123181, 0x004ad6], + }, + BigNum { + limbs: [0x98bfd85728ad3e731ca9103f4a7e3e, 0x110afa78821dcb338fdd3ad2c5d3d2, 0x002917], + }, + BigNum { + limbs: [0x346f499430ac3e8834e343be816ade, 0x1c7a1e79b28af076c80674fbea502b, 0x003324], + }, + BigNum { + limbs: [0x8934b96bcdafc077cb1cbb417e9523, 0x8ad90b23cabd42c3100194a5edb528, 0x0040c9], + }, + BigNum { + limbs: [0x57918f034022d6713037f8b64415e9, 0x19fd78f51a8800de167d51cdd33239, 0x0000b2], + }, + BigNum { + limbs: [0x661273fcbe39288ecfc80649bbea18, 0x8d55b0a862c0325bc18ab7d404d31a, 0x00733b], + }, + BigNum { + limbs: [0xf59be099efbbbf1e9ee7f422718376, 0x28cf3247eb4450669afedabf51d50f, 0x006d6b], + }, + BigNum { + limbs: [0xc80822660ea03fe161180add8e7c8b, 0x7e83f7559203e2d33d092ee2863043, 0x000682], + }, + BigNum { + limbs: [0x717496b394e228bde1fcdaa1e27c0c, 0xc92134ed8fe810bde4e31b054a62bd, 0x001f39], + }, + BigNum { + limbs: [0x4c2f6c4c6979d6421e03245e1d83f5, 0xde31f4afed60227bf324ee9c8da296, 0x0054b3], + }, + BigNum { + limbs: [0x7d09d03af59770f1d0fcc7934e784a, 0xe258d964b59394e25115d08b5a107a, 0x005651], + }, + BigNum { + limbs: [0x409a32c508c48e0e2f03376cb187b7, 0xc4fa5038c7b49e5786f239167df4d9, 0x001d9b], + }, + BigNum { + limbs: [0xaaeb71ec0f716e68b025c69346bf09, 0x88ac099cc542dbc85d2e72f3dee770, 0x0004ca], + }, + BigNum { + limbs: [0x12b89113eeea90974fda386cb940f8, 0x1ea72000b80557717ad996adf91de3, 0x006f23], + }, + BigNum { + limbs: [0x3f0ed736ba61d95846912ad0cd72e8, 0xa976934ab9259ff3085d4c741c88b3, 0x00184a], + }, + BigNum { + limbs: [0x7e952bc943fa25a7b96ed42f328d19, 0xfddc9652c4229346cfaabd2dbb7ca0, 0x005ba2], + }, + BigNum { + limbs: [0x62b291c828ec3ebaf26067815711fc, 0xbb8260b46d2c51e40cbf75a7ee58fd, 0x0062e0], + }, + BigNum { + limbs: [0x5af17137d56fc0450d9f977ea8ee05, 0xebd0c8e9101be155cb4893f9e9ac56, 0x00110c], + }, + BigNum { + limbs: [0xf1944f8062e2362fd7908ad327998c, 0xfae10609ac308c560763e9b339ee02, 0x005d20], + }, + BigNum { + limbs: [0xcc0fb37f9b79c8d0286f742cd86675, 0xac722393d117a6e3d0a41fee9e1750, 0x0016cc], + }, + BigNum { + limbs: [0x238124a0db2fb18fbde3dcc5b9f194, 0x2223c6d14ff1cf5fcb7416a05e18ff, 0x002605], + }, + BigNum { + limbs: [0x9a22de5f232c4d70421c223a460e6d, 0x852f62cc2d5663da0c93f30179ec54, 0x004de8], + }, + BigNum { + limbs: [0x2f181b14aed10ff6e67eefaeab0cff, 0xa75b010005d75274ac3b3a23333006, 0x004d09], + }, + BigNum { + limbs: [0x8e8be7eb4f8aef0919810f5154f302, 0xfff8289d7770e0c52bcccf7ea4d54d, 0x0026e3], + }, + BigNum { + limbs: [0x84f64a6ba25a938975fe3c072f5f5c, 0xbd52dee2d5f7a21bae96e51a32d19d, 0x005087], + }, + BigNum { + limbs: [0x38adb8945c016b768a01c2f8d0a0a5, 0xea004abaa750911e29712487a533b6, 0x002365], + }, + BigNum { + limbs: [0x2ae0e11e73c3f16ca52fc81438540d, 0x08c778383129c0429531c4dd5df66d, 0x001ebd], + }, + BigNum { + limbs: [0x92c321e18a980d935ad036ebc7abf4, 0x9e8bb1654c1e72f742d644c47a0ee6, 0x005530], + }, + BigNum { + limbs: [0xe7fa646df251b192383683e59ecc6a, 0xc7fe5a5827024c14c0e444da9cff88, 0x000ef4], + }, + BigNum { + limbs: [0xd5a99e920c0a4d6dc7c97b1a613397, 0xdf54cf455645e7251723c4c73b05ca, 0x0064f8], + }, + BigNum { + limbs: [0xeef0bcd91847d841253cc2a928d6be, 0x37718307eb1a9579e0bf9778e20bdc, 0x005a0c], + }, + BigNum { + limbs: [0xceb34626e61426bedac33c56d72943, 0x6fe1a695922d9dbff7487228f5f976, 0x0019e1], + }, + BigNum { + limbs: [0xa701b8e3a721e0fefce536fb906424, 0x78afcd6fbd8fcad332db11efc5f13f, 0x00420e], + }, + BigNum { + limbs: [0x16a24a1c573a1e01031ac8046f9bdd, 0x2ea35c2dbfb86866a52cf7b2121414, 0x0031df], + }, + BigNum { + limbs: [0x2703973a98577b707f616b8ee5bc69, 0x35a38c635602c55fbb5a72a5dee0a8, 0x002220], + }, + BigNum { + limbs: [0x96a06bc56604838f809e93711a4398, 0x71af9d3a27456dda1cad96fbf924ab, 0x0051cd], + }, + BigNum { + limbs: [0xd426ce3bc379cebaa02908f78226c1, 0x3b64fc8a8d3697b57a95d72f49a7ec, 0x006531], + }, + BigNum { + limbs: [0xe97d34c43ae230455fd6f6087dd940, 0x6bee2d12f0119b845d7232728e5d66, 0x000ebc], + }, + BigNum { + limbs: [0x1aee8a70a157bc3db5dce28b3ecf15, 0xa940ed13adc86207c5cca3e248bbea, 0x0066a7], + }, + BigNum { + limbs: [0xa2b5788f5d0442c24a231c74c130ec, 0xfe123c89cf7fd132123b65bf8f4969, 0x000d45], + }, + BigNum { + limbs: [0x8d825a7d11480cdc99619927e24871, 0x40afc2350d54fc80dd3fde8f89eaed, 0x0012b8], + }, + BigNum { + limbs: [0x3021a882ed13f223669e65d81db790, 0x66a367686ff336b8fac82b124e1a66, 0x006135], + }, + BigNum { + limbs: [0x6d89d1cf521a52f9730ea6ccca6aa9, 0x874736ffd05944b37a5bdf5fc29b8e, 0x00017a], + }, + BigNum { + limbs: [0x501a3130ac41ac068cf15833359558, 0x200bf29daceeee865dac2a421569c5, 0x007273], + }, + BigNum { + limbs: [0x2ebb72dd507ad3e370ae5c9d88c367, 0xcad2981271db38af49782c25cc6a83, 0x002982], + }, + BigNum { + limbs: [0x8ee89022ade12b1c8f51a262773c9a, 0xdc80918b0b6cfa8a8e8fdd7c0b9ad0, 0x004a6a], + }, + BigNum { + limbs: [0x40bb9966258c7e444ef5bf9f9eaf5d, 0x50d0cd0a9c9ad02239843d3a7238d0, 0x00238a], + }, + BigNum { + limbs: [0x7ce86999d8cf80bbb10a3f606150a4, 0x56825c92e0ad63179e83cc6765cc83, 0x005063], + }, + BigNum { + limbs: [0xd860053850eb383390d76bb3f42bd6, 0x4a15cbfaab68c4280ae7caa60cf1aa, 0x003f5e], + }, + BigNum { + limbs: [0xe543fdc7ad70c6cc6f28934c0bd42b, 0x5d3d5da2d1df6f11cd203efbcb13a8, 0x00348f], + }, + BigNum { + limbs: [0xaef4419c79da6004e08d670c53a44e, 0xf7bd11fb6ad2133b0600858128f29b, 0x0069fc], + }, + BigNum { + limbs: [0x0eafc16384819efb1f7297f3ac5bb3, 0xaf9617a212761ffed2078420af12b8, 0x0009f0], + }, + BigNum { + limbs: [0x7f907f020a14b917b055c5dfbd2d5c, 0xe05ec31861f5674bdaf8e72b8709a1, 0x006927], + }, + BigNum { + limbs: [0x3e1383fdf44745e84faa392042d2a5, 0xc6f466851b52cbedfd0f227650fbb2, 0x000ac5], + }, + BigNum { + limbs: [0xebc1bad8e840c2ad13f6bbb95ec8ec, 0xcb2b258381423a47594a3ac9ba80ed, 0x000ba4], + }, + BigNum { + limbs: [0xd1e24827161b3c52ec094346a13715, 0xdc280419fc05f8f27ebdced81d8465, 0x006848], + }, + BigNum { + limbs: [0x2b07db533eecf717c095e63014ae72, 0x14ee8e4ee0069beb9bd9e5a49c9517, 0x002bbf], + }, + BigNum { + limbs: [0x929c27acbf6f07e83f6a18cfeb518f, 0x92649b4e9d41974e3c2e23fd3b703c, 0x00482e], + }, + BigNum { + limbs: [0xfce3f1ae16e1352f27668740f423f4, 0x53b32e18eb883962e4267ad3b836c2, 0x000776], + }, + BigNum { + limbs: [0xc0c01151e77ac9d0d89977bf0bdc0d, 0x539ffb8491bff9d6f3e18ece1fce90, 0x006c77], + }, + BigNum { + limbs: [0x0cb139b40f4c25efde2d1e3d91bdd7, 0x607ce8d23ffed09655e7bf9bbb56a0, 0x002fac], + }, + BigNum { + limbs: [0xb0f2c94bef0fd91021d2e0c26e422a, 0x46d640cb3d4962a382204a061caeb3, 0x004441], + }, + BigNum { + limbs: [0x9056c4e381145f218592573596e4e9, 0x1da7c6d8816a814bffbf8d20cef142, 0x000e09], + }, + BigNum { + limbs: [0x2d4d3e1c7d479fde7a6da7ca691b18, 0x89ab62c4fbddb1edd8487c81091411, 0x0065e4], + }, + BigNum { + limbs: [0x85d191ac75223523bb85f2da7f3e51, 0xb26339d05091e20e765bc6522c3d49, 0x0023fb], + }, + BigNum { + limbs: [0x37d271538939c9dc447a0c2580c1b0, 0xf4efefcd2cb6512b61ac434fabc80a, 0x004ff1], + }, + BigNum { + limbs: [0x42dd56d39e955417d408cfe1efe0da, 0x6dd7b2cf3c059a45ee2eabefd88d8d, 0x001286], + }, + BigNum { + limbs: [0x7ac6ac2c5fc6aae82bf72f1e101f27, 0x397b76ce414298f3e9d95db1ff77c6, 0x006167], + }, + BigNum { + limbs: [0x8ff68b2704622d8db3b98e4423fc50, 0x8734ba95974fe0a610e2a9cc4f55cf, 0x0021c7], + }, + BigNum { + limbs: [0x2dad77d8f9f9d1724c4670bbdc03b1, 0x201e6f07e5f85293c7255fd588af84, 0x005226], + }, + BigNum { + limbs: [0x8beba55b423887eb9775afe0580eb6, 0xc6493ca6f7bafdd94ab18c03456354, 0x00021f], + }, + BigNum { + limbs: [0x31b85da4bc237714688a4f1fa7f14b, 0xe109ecf6858d35608d567d9e92a1ff, 0x0071cd], + }, + BigNum { + limbs: [0xddf65cfc1c7f198f6e446f0ba80111, 0xfc3367b27efadae203a5d04d12b33b, 0x00547e], + }, + BigNum { + limbs: [0xdfada603e1dce57091bb8ff457fef0, 0xab1fc1eafe4d5857d4623954c55217, 0x001f6e], + }, + BigNum { + limbs: [0xb2111259c0e6827b9f2d0dfbe1fda0, 0xea46adb91f8909429055d788c6ef35, 0x0045e8], + }, + BigNum { + limbs: [0x0b92f0a63d757c8460d2f1041e0261, 0xbd0c7be45dbf29f747b2321911161e, 0x002e04], + }, + BigNum { + limbs: [0xd451939d2efc7530d247f9f1b06a9d, 0x723488ddb269aa2a0bb898bac279da, 0x002e0f], + }, + BigNum { + limbs: [0xe9526f62cf5f89cf2db8050e4f9564, 0x351ea0bfcade890fcc4f70e7158b78, 0x0045de], + }, + BigNum { + limbs: [0xcdfd800f910da40d61b57cc139d00a, 0x6f4e20fb2f20f36c5be4373da4ad3e, 0x002436], + }, + BigNum { + limbs: [0xefa682f06d4e5af29e4a823ec62ff7, 0x380508a24e273fcd7c23d264335814, 0x004fb7], + }, + BigNum { + limbs: [0xad59732db132de9f70a3a4625a28a2, 0x30d35a07976b6f22eeb847e6a4c2c5, 0x000455], + }, + BigNum { + limbs: [0x104a8fd24d2920608f5c5a9da5d75f, 0x767fcf95e5dcc416e94fc1bb33428e, 0x006f98], + }, + BigNum { + limbs: [0xa83f0d64199428796ae7ed987e3031, 0x66c481043d84ce7b5b9a58967a125a, 0x006e11], + }, + BigNum { + limbs: [0x1564f59be4c7d6869518116781cfd0, 0x408ea8993fc364be7c6db10b5df2f9, 0x0005dc], + }, + BigNum { + limbs: [0xfeec51f753cc687c69d6ae5df2c7e5, 0x01672a864c45dae541d1fd7ab0cf3b, 0x00252a], + }, + BigNum { + limbs: [0xbeb7b108aa8f9683962950a20d381c, 0xa5ebff173102585496360c27273617, 0x004ec3], + }, + BigNum { + limbs: [0x3737709114df79354b1b9355e6a54e, 0x4098bda9ad6a6469757c2498b0fd99, 0x006a78], + }, + BigNum { + limbs: [0x866c926ee97c85cab4e46baa195ab3, 0x66ba6bf3cfddced0628be5092707ba, 0x000975], + }, + BigNum { + limbs: [0x51ed8769fd01bf945fda78a7f367d9, 0x753bf1d2a62039f1517d74049b890e, 0x004fe3], + }, + BigNum { + limbs: [0x6bb67b96015a3f6ba02586580c9828, 0x321737cad727f948868a959d3c7c45, 0x00240a], + }, + BigNum { + limbs: [0x3fe7cabd0b23e5bf705eba460abe55, 0x3151de041923e02a79c24740b9cac2, 0x0008cf], + }, + BigNum { + limbs: [0x7dbc3842f33819408fa144b9f541ac, 0x76014b996424530f5e45c2611e3a91, 0x006b1e], + }, + BigNum { + limbs: [0x66c55dea845e4933d0b97dedcbec39, 0xbe534af38fff28cbbe5b58d6539c1a, 0x002362], + }, + BigNum { + limbs: [0x56dea51579fdb5cc2f4681123413c8, 0xe8ffdea9ed490a6e19acb0cb846939, 0x00508a], + }, + BigNum { + limbs: [0xe74ce466f28a996afd86c991620276, 0x6a14aab731397177349c6cb97b7c51, 0x005ffd], + }, + BigNum { + limbs: [0xd6571e990bd165950279356e9dfd8b, 0x3d3e7ee64c0ec1c2a36b9ce85c8901, 0x0013f0], + }, + BigNum { + limbs: [0xfc885d40f73760387ca37368ee6036, 0xfdacb64f6dcef359c6db5d8d487fc5, 0x003810], + }, + BigNum { + limbs: [0xc11ba5bf07249ec7835c8b97119fcb, 0xa9a6734e0f793fe0112cac148f858d, 0x003bdc], + }, + BigNum { + limbs: [0xe66d78cb626cc03ccda280ddf7c676, 0xaa5aa0b483b385f66bd08a1d249b53, 0x006a97], + }, + BigNum { + limbs: [0xd7368a349bef3ec3325d7e2208398b, 0xfcf888e8f994ad436c377f84b369ff, 0x000955], + }, + BigNum { + limbs: [0xe73f7a50c5aaeb5db85ae6ebfcb38d, 0xbca65083b25f7ee89ab1508940ca94, 0x001c15], + }, + BigNum { + limbs: [0xd66488af38b113a247a51814034c74, 0xeaacd919cae8b4513d56b918973abe, 0x0057d7], + }, + BigNum { + limbs: [0x3041d38fa295c8677f529da0db3616, 0x61b3e4c04bcf4cc051000148d5479a, 0x006b8b], + }, + BigNum { + limbs: [0x8d622f705bc6369880ad615f24c9eb, 0x459f44dd3178e6798708085902bdb9, 0x000862], + }, + BigNum { + limbs: [0x36ba5d59a1fdb3918b8ff2657cb799, 0x73141aa50ce8e0448856303668e326, 0x001a6f], + }, + BigNum { + limbs: [0x86e9a5a65c5e4b6e74700c9a834868, 0x343f0ef8705f52f54fb1d96b6f222d, 0x00597e], + }, + BigNum { + limbs: [0x6ccba57529ef3a2e69b325f8c2d10e, 0x4d647a8586116f35f254c16ac4e2e8, 0x000d42], + }, + BigNum { + limbs: [0x50d85d8ad46cc4d1964cd9073d2ef3, 0x59eeaf17f736c403e5b3483713226b, 0x0066ab], + }, + BigNum { + limbs: [0xd6a430a0bc13faa1c38e986fed60b7, 0xce5eedbb83c74a15db11a3b554b5d3, 0x006858], + }, + BigNum { + limbs: [0xe6ffd25f4248045e3c716690129f4a, 0xd8f43be1f980e923fcf665ec834f7f, 0x000b94], + }, + BigNum { + limbs: [0xbb69b1e997262c5f8b75eb59322015, 0xada1e5d0b6bf2aca0bb3f1eaef08eb, 0x0038e8], + }, + BigNum { + limbs: [0x023a51166735d2a0748a13a6cddfec, 0xf9b143ccc689086fcc5417b6e8fc68, 0x003b04], + }, + BigNum { + limbs: [0xb9c653a69df49edefa7c37d09c36a2, 0xadf904b0681b511569231f5f35c687, 0x0049b2], + }, + BigNum { + limbs: [0x03ddaf59606760210583c72f63c95f, 0xf95a24ed152ce2246ee4ea42a23ecc, 0x002a3a], + }, + BigNum { + limbs: [0x544e0eef300ebb6922152d741da680, 0xf4657f7341d681f7a80461466d15fc, 0x00633f], + }, + BigNum { + limbs: [0x6955f410ce4d4396ddead18be25981, 0xb2edaa2a3b71b1423003a85b6aef57, 0x0010ad], + }, + BigNum { + limbs: [0x3cb7a69485ca0129ceb6ef8030b2de, 0x6468a2d46ee05d32b857f28457a44c, 0x00702f], + }, + BigNum { + limbs: [0x80ec5c6b7891fdd631490f7fcf4d23, 0x42ea86c90e67d6071fb0171d806107, 0x0003be], + }, + BigNum { + limbs: [0x690adce0d4559ad0bab5f02b35aea3, 0x8d7a680f4f615969a24f8e2106f81a, 0x005dc7], + }, + BigNum { + limbs: [0x5499261f2a06642f454a0ed4ca515e, 0x19d8c18e2de6d9d035b87b80d10d39, 0x001626], + }, + BigNum { + limbs: [0xbf6566f761bbaaa58ea51a15cb2a93, 0xa436bbf70ebc9a481043f60ec7964f, 0x0042fa], + }, + BigNum { + limbs: [0xfe3e9c089ca0545a715ae4ea34d56e, 0x031c6da66e8b98f1c7c41393106f03, 0x0030f3], + }, + BigNum { + limbs: [0x3c61e635e16ea6e68378ad80a7bb00, 0x1824c50aa16fccd46c8c0a5d9be527, 0x004d3d], + }, + BigNum { + limbs: [0x81421cca1ced58197c87517f584501, 0x8f2e6492dbd866656b7bff443c202c, 0x0026b0], + }, + BigNum { + limbs: [0x32055cd6e43a26efe507326576562d, 0x3a3febc19c74e00c852874294fe1a0, 0x006623], + }, + BigNum { + limbs: [0x8b9ea6291a21d8101af8cc9a89a9d4, 0x6d133ddbe0d3532d52df95788823b3, 0x000dca], + }, + BigNum { + limbs: [0x920cdabfd84a8600c41c7ed4c36731, 0xe4e20eda21e3bc795bd8f25ded6ef3, 0x000937], + }, + BigNum { + limbs: [0x2b972840261178ff3be3802b3c98d0, 0xc2711ac35b6476c07c2f1743ea9660, 0x006ab5], + }, + BigNum { + limbs: [0xca1d8869e45cb67ef2f5436db89ce5, 0x428cd15fec9829f4d52d022a11c056, 0x003d18], + }, + BigNum { + limbs: [0xf3867a9619ff48810d0abb9247631c, 0x64c6583d90b0094502db0777c644fc, 0x0036d5], + }, + BigNum { + limbs: [0xc512d0ba6e3f20da7810f90a14ed63, 0xe965ba4aab15753bb87fe847a6e84a, 0x001400], + }, + BigNum { + limbs: [0xf8913245901cde2587ef05f5eb129e, 0xbded6f52d232bdfe1f88215a311d08, 0x005fec], + }, + BigNum { + limbs: [0xb385262d0e06a7bf046f046933915c, 0x2fcbe3d8e169f25d115b2909df5fae, 0x0070a5], + }, + BigNum { + limbs: [0x0a1edcd2f0555740fb90fa96cc6ea5, 0x778745c49bde40dcc6ace097f8a5a5, 0x000348], + }, + BigNum { + limbs: [0x8d607f4ee699ae051d64216ef65230, 0xb7a8f24647997c6daa193db1745c67, 0x003466], + }, + BigNum { + limbs: [0x304383b117c250fae29bdd9109add1, 0xefaa375735aeb6cc2deecbf063a8ec, 0x003f86], + }, + BigNum { + limbs: [0xd5f7ce03dd2713a624911665fba78b, 0x63171cfd358f14986d8c2b99885009, 0x002862], + }, + BigNum { + limbs: [0xe7ac34fc2134eb59db6ee89a045876, 0x443c0ca047b91ea16a7bde084fb549, 0x004b8b], + }, + BigNum { + limbs: [0xfe70a1a000bdeededa81868d68b00a, 0xd7c52f795ab5a3cbe846b833307b38, 0x0063a9], + }, + BigNum { + limbs: [0xbf33615ffd9e1021257e7872974ff7, 0xcf8dfa2422928f6defc1516ea78a1a, 0x001043], + }, + BigNum { + limbs: [0xe211b10f8f4244573cc1221781e0bc, 0xa9ee4fed8c9defe5bf47c589849963, 0x0002ca], + }, + BigNum { + limbs: [0xdb9251f06f19baa8c33edce87e1f45, 0xfd64d9aff0aa435418c04418536bef, 0x007122], + }, + BigNum { + limbs: [0x377cbd2bf36fcc3ec268ec688da522, 0x1c5a67a005fe6aef4b6396adfc608c, 0x004310], + }, + BigNum { + limbs: [0x862745d40aec32c13d971297725adf, 0x8af8c1fd7749c84a8ca472f3dba4c7, 0x0030dd], + }, + BigNum { + limbs: [0x258de8ab7c6bf6492d72265c8bb286, 0x12dd6a762ba5433ae5253027a86d6c, 0x001e57], + }, + BigNum { + limbs: [0x98161a5481f008b6d28dd8a3744d7b, 0x9475bf2751a2effef2e2d97a2f97e7, 0x005596], + }, + BigNum { + limbs: [0xfc6245c2276cfe52b9e2e3d8e363f5, 0x8f91391224f82d1509ea7380eb432e, 0x006724], + }, + BigNum { + limbs: [0xc141bd3dd6ef00ad461d1b271c9c0c, 0x17c1f08b58500624ce1d9620ecc224, 0x000cc9], + }, + BigNum { + limbs: [0xab98917739772b3fcea5a50aafcbdb, 0x2bbc74577df8687bcc2850f602ddf5, 0x002b9d], + }, + BigNum { + limbs: [0x120b7188c4e4d3c0315a59f5503426, 0x7b96b545ff4fcabe0bdfb8abd5275e, 0x004850], + }, + BigNum { + limbs: [0x59749fab0ea4f5cad4d5192ef12ff5, 0xf00a1aaafd469e2d6961368dca2476, 0x002787], + }, + BigNum { + limbs: [0x642f6354efb709352b2ae5d10ed00c, 0xb7490ef28001950c6ea6d3140de0dd, 0x004c65], + }, + BigNum { + limbs: [0xc74b9514983765d71e1882e1dd7f28, 0x927973e027868355da437798fef908, 0x00730c], + }, + BigNum { + limbs: [0xf6586deb66249928e1e77c1e2280d9, 0x14d9b5bd55c1afe3fdc49208d90c4a, 0x0000e1], + }, + BigNum { + limbs: [0xe18a0dbf32e81b22ac28512f733ac0, 0x88e2477fbf79aba7460fd9c360ec14, 0x006684], + }, + BigNum { + limbs: [0xdc19f540cb73e3dd53d7add08cc541, 0x1e70e21dbdce879291f82fde77193e, 0x000d69], + }, + BigNum { + limbs: [0x67f6c836862ed38368bc3ff9fe041d, 0x3f6664ca78be793846d6244234b80d, 0x005e13], + }, + BigNum { + limbs: [0x55ad3ac9782d2b7c9743bf0601fbe4, 0x67ecc4d30489ba019131e55fa34d46, 0x0015da], + }, + BigNum { + limbs: [0x95610ecb9899c53b6ead007648781c, 0xf6f4afb976d236fa3357bfa851e961, 0x0022da], + }, + BigNum { + limbs: [0x2842f43465c239c49152fe89b787e5, 0xb05e79e40675fc3fa4b049f9861bf2, 0x005112], + }, + BigNum { + limbs: [0xaa1b5e34bb77878b236035fa24c486, 0x954412900ed54088745ec1f2c16631, 0x0050d0], + }, + BigNum { + limbs: [0x1388a4cb42e47774dc9fc905db3b7b, 0x120f170d6e72f2b163a947af169f22, 0x00231d], + }, + BigNum { + limbs: [0x8a241be93dc8974e02b11bd3a217c2, 0x84a58f018d4c9b113b0587c1e3580c, 0x005870], + }, + BigNum { + limbs: [0x337fe716c09367b1fd4ee32c5de83f, 0x22ad9a9beffb98289d0281dff4ad47, 0x001b7d], + }, + BigNum { + limbs: [0x8dba7176a3140438e61a2bdb947cfb, 0x7d36756abfa6e6de4760c9223ca35d, 0x006d9b], + }, + BigNum { + limbs: [0x2fe991895b47fac719e5d3246b8306, 0x2a1cb432bda14c5b90a7407f9b61f6, 0x000652], + }, + BigNum { + limbs: [0x7a93ae34c98803cc138ce5decb272f, 0x9d92ac58ff78ea09ac3f1bdf706976, 0x002877], + }, + BigNum { + limbs: [0x431054cb34d3fb33ec73192134d8d2, 0x09c07d447dcf49302bc8edc2679bdd, 0x004b76], + }, + BigNum { + limbs: [0xf0341a13b3565ad286345e7ac747d6, 0x7c023d791f0bdc6832ada0a4abdbb2, 0x001473], + }, + BigNum { + limbs: [0xcd6fe8ec4b05a42d79cba08538b82b, 0x2b50ec245e3c56d1a55a68fd2c29a0, 0x005f7a], + }, + BigNum { + limbs: [0x4c4fa5f5263d07bfb59bd6f3e3410f, 0x1ddc11c537cbfe3ed86585643677f4, 0x00641b], + }, + BigNum { + limbs: [0x71545d0ad81ef7404a64280c1cbef2, 0x897717d8457c34faffa2843da18d5f, 0x000fd2], + }, + BigNum { + limbs: [0x2144b16886b434df3737d784288d49, 0x98ef059d3185cc257d69e121cd84b3, 0x006755], + }, + BigNum { + limbs: [0x9c5f519777a7ca20c8c8277bd772b8, 0x0e6424004bc267145a9e28800a80a0, 0x000c98], + }, + BigNum { + limbs: [0xdad8f147195417f8e3b085a77afbf2, 0xd402f8d47177c758c7a4112d4a8bea, 0x003aff], + }, + BigNum { + limbs: [0xe2cb11b8e507e7071c4f795885040f, 0xd35030c90bd06be11063f8748d7968, 0x0038ed], + }, + BigNum { + limbs: [0x13b822085973279feb3060dee77336, 0xec04bf19f89eb75b9bf5262d598072, 0x002dd3], + }, + BigNum { + limbs: [0xa9ebe0f7a4e8d76014cf9e21188ccb, 0xbb4e6a8384a97bde3c12e3747e84e1, 0x004619], + }, + BigNum { + limbs: [0xce316d93c6b00bb50855547902c03e, 0x97ca4d2c7b6a0c1945109c1f1e9c3a, 0x006ce3], + }, + BigNum { + limbs: [0xef72956c37abf34af7aaaa86fd3fc3, 0x0f88dc7101de272092f76d82b96918, 0x00070a], + }, + BigNum { + limbs: [0x694267eeda9311b9bc81d1e5f516e1, 0x5846cd4336b188de7c8b11604d8ff0, 0x006fb0], + }, + BigNum { + limbs: [0x54619b1123c8ed46437e2d1a0ae920, 0x4f0c5c5a4696aa5b5b7cf8418a7563, 0x00043d], + }, + BigNum { + limbs: [0x24f213c919d43d562e491138e601de, 0xe28f29fa7cfa57c3839a0140d9f2bb, 0x0007dd], + }, + BigNum { + limbs: [0x98b1ef36e487c1a9d1b6edc719fe23, 0xc4c3ffa3004ddb76546e0860fe1298, 0x006c0f], + }, + BigNum { + limbs: [0x6b7e5ff4d425ec22ae86624a026d8f, 0xf1287fe086b18251211dc7db069146, 0x00583a], + }, + BigNum { + limbs: [0x5225a30b2a3612dd51799cb5fd9272, 0xb62aa9bcf696b0e8b6ea41c6d1740d, 0x001bb2], + }, + BigNum { + limbs: [0x80b253331456f274067e67d28a7bf9, 0xe5fb6401d35e8b476c3d92001ca186, 0x000d83], + }, + BigNum { + limbs: [0x3cf1afccea050c8bf981972d758408, 0xc157c59ba9e9a7f26bca77a1bb63cd, 0x006669], + }, + BigNum { + limbs: [0xd98dbcb16d6b2bc8c4f400030cd5c1, 0x16f7a347bb978b3074eb9fb6094903, 0x0047b1], + }, + BigNum { + limbs: [0xe416464e90f0d3373b0bfefcf32a40, 0x905b8655c1b0a809631c69ebcebc4f, 0x002c3c], + }, + BigNum { + limbs: [0xb330e761da3be1436d1d98942671d5, 0xa5e3e36a9bf331e93cc37de09f5274, 0x006d89], + }, + BigNum { + limbs: [0x0a731b9e24201dbc92e2666bd98e2c, 0x016f4632e15501509b448bc138b2df, 0x000664], + }, + BigNum { + limbs: [0x3fb3867287d861038cb90b5f9e2564, 0x2156aa8bb80679fa31d23cd3c210ae, 0x0014ef], + }, + BigNum { + limbs: [0x7df07c8d76839dfc7346f3a061da9d, 0x85fc7f11c541b93fa635ccce15f4a5, 0x005efe], + }, + BigNum { + limbs: [0x32317a2cdbea65c58c12f0eb455e6b, 0x4698b9e42244abdd2198bdf7fde562, 0x00244b], + }, + BigNum { + limbs: [0x8b7288d32271993a73ed0e14baa196, 0x60ba6fb95b03875cb66f4ba9da1ff1, 0x004fa2], + }, + BigNum { + limbs: [0x8ed195331b98672808faa3ccaafe7d, 0xa34e6b5142c7e48095cf2e1b9d09fa, 0x00138f], + }, + BigNum { + limbs: [0x2ed26dcce2c397d7f7055b33550184, 0x0404be4c3a804eb94238db863afb59, 0x00605e], + }, + BigNum { + limbs: [0x6ce50ce8631ddc37c974247e893e37, 0xbafc2e8182867d9f8711636eb28e84, 0x004348], + }, + BigNum { + limbs: [0x50bef6179b3e22c8368bda8176c1ca, 0xec56fb1bfac1b59a50f6a6332576cf, 0x0030a4], + }, + BigNum { + limbs: [0xdb3d1d363620c7059279cc46720e88, 0x4bc4b85d0584dfd6b5fa91067e76e4, 0x000d5b], + }, + BigNum { + limbs: [0xe266e5c9c83b37fa6d8632b98df179, 0x5b8e714077c35363220d789b598e6e, 0x006692], + }, + BigNum { + limbs: [0x6ad7cae3c87627c98f6b3a48df5a28, 0xd4863b46a956c8dcee098ed888b038, 0x0029fb], + }, + BigNum { + limbs: [0x52cc381c35e5d7367094c4b720a5d9, 0xd2ccee56d3f16a5ce9fe7ac94f551b, 0x0049f1], + }, + BigNum { + limbs: [0xc9b512172293bb81396ff313d3bb80, 0x1736abd6d04b4739c52b4fabaab4dd, 0x005da9], + }, + BigNum { + limbs: [0xf3eef0e8dbc8437ec6900bec2c4481, 0x901c7dc6acfcec0012dcb9f62d5075, 0x001644], + }, + BigNum { + limbs: [0x977a45ccd1f4913ff0793ba434977c, 0x8bcb0af58a52192a995975d7064454, 0x003af5], + }, + BigNum { + limbs: [0x2629bd332c676dc00f86c35bcb6885, 0x1b881ea7f2f61a0f3eae93cad1c0ff, 0x0038f8], + }, + BigNum { + limbs: [0xef2fb42e82a91c3aaf009278b4b454, 0xef630dea07dd87c170f9a2a01856a4, 0x00038b], + }, + BigNum { + limbs: [0xce744ed17bb2e2c550ff6c874b4bad, 0xb7f01bb3756aab78670e6701bfaeae, 0x007061], + }, + BigNum { + limbs: [0xc8e73f1fb0956aac66e8dafc81fe1e, 0x059efabd9ae1387d443ddded77add3, 0x00321c], + }, + BigNum { + limbs: [0xf4bcc3e04dc69453991724037e01e3, 0xa1b42edfe266fabc93ca2bb460577f, 0x0041d1], + }, + BigNum { + limbs: [0x3933c1beda8052e1a0aa54ab584031, 0xe11c874ac1ff523154d2355e4e4176, 0x000605], + }, + BigNum { + limbs: [0x8470414123dbac1e5f55aa54a7bfd0, 0xc636a252bb48e1088335d44389c3dd, 0x006de7], + }, + BigNum { + limbs: [0x434bad0898bac4640aa66581465d9a, 0xaf57ad62903dde30dfbc088a2d14cc, 0x002840], + }, + BigNum { + limbs: [0x7a5855f765a13a9bf559997eb9a267, 0xf7fb7c3aed0a5508f84c0117aaf087, 0x004bac], + }, + BigNum { + limbs: [0xa295c7dfe550262e424716d6fbaa2d, 0xd989cae69b749be1ba8e713c6bf63c, 0x000224], + }, + BigNum { + limbs: [0x1b0e3b20190bd8d1bdb8e8290455d4, 0xcdc95eb6e1d397581d7998656c0f17, 0x0071c8], + }, + BigNum { + limbs: [0x027b481a99f8d7f13eed8a7afc59cc, 0x1cc9790e8f2c1db924e35b38caf6b5, 0x00086c], + }, + BigNum { + limbs: [0xbb28bae56463270ec112748503a635, 0x8a89b08eee1c1580b324ae690d0e9e, 0x006b81], + }, + BigNum { + limbs: [0x2f35aea290ac55b604c24be38ed2f2, 0xaa61fc26cd5f4c7a8318ba28706e7c, 0x004bf1], + }, + BigNum { + limbs: [0x8e6e545d6dafa949fb3db31c712d0f, 0xfcf12d76afe8e6bf54ef4f796796d7, 0x0027fb], + }, + BigNum { + limbs: [0x44c8d9317399ddb4c3351d1f85a494, 0x5c08fdb7b5f58ca2789772dc1ee600, 0x00527c], + }, + BigNum { + limbs: [0x78db29ce8ac2214b3ccae1e07a5b6d, 0x4b4a2be5c752a6975f7096c5b91f53, 0x002171], + }, + BigNum { + limbs: [0xacd8c18fd788b79108eb0359f985a8, 0xa5fb219c39b3597fd7cdb7cb9ec359, 0x0020c5], + }, + BigNum { + limbs: [0x10cb417026d3476ef714fba6067a59, 0x015808014394d9ba003a51d63941fa, 0x005328], + }, + BigNum { + limbs: [0x336e8b0eaa01fdee91311271ee45a3, 0x6b1c12f87566ddd0bf944a8e6d750a, 0x003ee3], + }, + BigNum { + limbs: [0x8a3577f1545a01116eceec8e11ba5e, 0x3c3716a507e155691873bf136a9049, 0x00350a], + }, + BigNum { + limbs: [0x0e3a4a2c1307877112e3fc3d4ace71, 0x75e2c927a7c9d2046ce027a513df74, 0x001ada], + }, + BigNum { + limbs: [0xaf69b8d3eb54778eed1c02c2b53190, 0x31706075d57e61356b27e1fcc425df, 0x005913], + }, + BigNum { + limbs: [0x531d011069710c1aadbdf0d9becb26, 0xfe392258bd3c57b360a745e7386083, 0x005264], + }, + BigNum { + limbs: [0x6a8701ef94eaf2e552420e264134db, 0xa91a0744c00bdb867760c3ba9fa4d0, 0x002188], + }, + BigNum { + limbs: [0xe9187454698944ac775919154154c1, 0x8c85aab132d3f04ce0af0a60f99468, 0x001dba], + }, + BigNum { + limbs: [0xd48b8eab94d2ba5388a6e5eabeab40, 0x1acd7eec4a7442ecf758ff40de70ea, 0x005633], + }, + BigNum { + limbs: [0x6c1604b24820a3770340790d55dc4c, 0x70485191eb56fc775110f342bec6f3, 0x003e60], + }, + BigNum { + limbs: [0x518dfe4db63b5b88fcbf85f2aa23b5, 0x370ad80b91f136c286f7165f193e60, 0x00358d], + }, + BigNum { + limbs: [0xeafb428e38a30928c22245d72bb2a3, 0xce32f7e962fa2b3e31afd97e204be3, 0x004902], + }, + BigNum { + limbs: [0xd2a8c071c5b8f5d73dddb928d44d5e, 0xd92031b41a4e07fba6583023b7b96f, 0x002aea], + }, + BigNum { + limbs: [0x3a451584a96e0ef35f980490fcc053, 0xd4e5faca74e951f07361d72a49f4b1, 0x00173b], + }, + BigNum { + limbs: [0x835eed7b54edf00ca067fa6f033fae, 0xd26d2ed3085ee14964a632778e10a2, 0x005cb1], + }, + BigNum { + limbs: [0x2e15a71ff3bb6b1793eb9057fda39b, 0x6d1eafc21e45b97be27adfc8bad8f1, 0x00170c], + }, + BigNum { + limbs: [0x8f8e5be00aa093e86c146ea8025c66, 0x3a3479db5f0279bdf58d29d91d2c62, 0x005ce1], + }, + BigNum { + limbs: [0x91a01cb11e1d388fbbb51771aacdbc, 0x5543e381889b38beaaccd6ea72786b, 0x003dcd], + }, + BigNum { + limbs: [0x2c03e64ee03ec670444ae78e553245, 0x520f461bf4acfa7b2d3b32b7658ce8, 0x003620], + }, + BigNum { + limbs: [0x1b2c2bf57e2ffa8bff0d76e779efd8, 0x136e7973448a6e8452d09af6d4fe0b, 0x002579], + }, + BigNum { + limbs: [0xa277d70a802c047400f28818861029, 0x93e4b02a38bdc4b585376eab030748, 0x004e74], + }, + BigNum { + limbs: [0x965114af80d5f237b8489e744cdb6a, 0x34a8111b5e6c4c02091f65cedfc07a, 0x000798], + }, + BigNum { + limbs: [0x2752ee507d860cc847b7608bb32497, 0x72ab18821edbe737cee8a3d2f844d9, 0x006c55], + }, + BigNum { + limbs: [0xe7ccd1f49218bcde0a39b54757baf4, 0x55b1570da586ba40c31e363e1506aa, 0x006c6a], + }, + BigNum { + limbs: [0xd5d7310b6c434221f5c649b8a8450d, 0x51a1d28fd7c178f914e9d363c2fea8, 0x000783], + }, + BigNum { + limbs: [0xd75a4c1d0a47bc8a57f67a92771886, 0xf7e713a14f663701ec08b9515cc1d4, 0x00504d], + }, + BigNum { + limbs: [0xe649b6e2f4144275a809846d88e77b, 0xaf6c15fc2de1fc37ebff50507b437e, 0x00239f], + }, + BigNum { + limbs: [0x4a6f5157ee66feed092f02034b4427, 0x089313ebbb63ab112c6e47f651c56b, 0x004f80], + }, + BigNum { + limbs: [0x7334b1a80ff50012f6d0fcfcb4bbda, 0x9ec015b1c1e48828ab99c1ab863fe8, 0x00246d], + }, + BigNum { + limbs: [0x960a2dbf6b89282bb928b6c2bc3afc, 0x9de0cb3644273fde5012c262290cdd, 0x000f2b], + }, + BigNum { + limbs: [0x2799d54092d2d6d446d7483d43c505, 0x09725e673920f35b87f5473faef876, 0x0064c2], + }, + BigNum { + limbs: [0xd8f900e407b7f428bce7e30c66a081, 0xa99e4a437b505d95dfd1630242422e, 0x005a1e], + }, + BigNum { + limbs: [0xe4ab021bf6a40ad743181bf3995f80, 0xfdb4df5a01f7d5a3f836a69f95c324, 0x0019ce], + }, + BigNum { + limbs: [0x7d648cf9f44e1804ceeaa511f4fae9, 0x69d70232147b3a090bcaa59c776b2b, 0x0041e4], + }, + BigNum { + limbs: [0x403f76060a0de6fb311559ee0b0518, 0x3d7c276b68ccf930cc3d6405609a28, 0x003209], + }, + BigNum { + limbs: [0x25da2e047033fefbbcff900fcc827f, 0x02ebc6464d846f98cb09f9865d83d0, 0x004d59], + }, + BigNum { + limbs: [0x97c9d4fb8e28000443006ef0337d82, 0xa46763572fc3c3a10cfe101b7a8183, 0x002694], + }, + BigNum { + limbs: [0xee0ffdf718781e60b137ab482066e4, 0xbc8d78d3c3cc9173a7c9c3c994b807, 0x001459], + }, + BigNum { + limbs: [0xcf940508e5e3e09f4ec853b7df991d, 0xeac5b0c9b97ba1c6303e45d8434d4b, 0x005f93], + }, + BigNum { + limbs: [0x525bc3d1cd03ba13854305ef54b104, 0x6d82f16d68853bf7bb74b643ac07c9, 0x000956], + }, + BigNum { + limbs: [0x6b483f2e315844ec7abcf910ab4efd, 0x39d0383014c2f7421c93535e2bfd8a, 0x006a97], + }, + BigNum { + limbs: [0x5e2f10a51b5409e93521dc76f14b89, 0x6a17ed37cedbd2dff79cd54a6ea067, 0x000beb], + }, + BigNum { + limbs: [0x5f74f25ae307f516cade22890eb478, 0x3d3b3c65ae6c6059e06b34576964ec, 0x006802], + }, + BigNum { + limbs: [0x55735e16b82bb0a2073fb0e02a7667, 0x7f1df880e7c227e024663dc027bae4, 0x006a70], + }, + BigNum { + limbs: [0x6830a4e946304e5df8c04e1fd5899a, 0x2835311c95860b59b3a1cbe1b04a6f, 0x00097d], + }, + BigNum { + limbs: [0x3c367ca1d1ffe6e2ae57afb246966b, 0xe0e87f964513f8ddba3c5316c7ec75, 0x0013e7], + }, + BigNum { + limbs: [0x816d865e2c5c181d51a84f4db96996, 0xc66aaa0738343a5c1dcbb68b1018de, 0x006005], + }, + BigNum { + limbs: [0xb3e11681c510a6dd5a6a3e91095dc7, 0x32d749c30d1dc4895811317d780782, 0x004019], + }, + BigNum { + limbs: [0x09c2ec7e394b5822a595c06ef6a23a, 0x747bdfda702a6eb07ff6d8245ffdd1, 0x0033d4], + }, + BigNum { + limbs: [0xbd453fb132b4682cdfe9db0ff4374b, 0x9c9a35f12409aee55906ba0e6f2ed2, 0x003225], + }, + BigNum { + limbs: [0x005ec34ecba796d3201623f00bc8b6, 0x0ab8f3ac593e84547f014f9368d681, 0x0041c8], + }, + BigNum { + limbs: [0xc6f53956b47ef98c1e4633a1e79a90, 0xf8a65c0009dce5d7361d5906eb273a, 0x002444], + }, + BigNum { + limbs: [0xf6aec9a949dd0573e1b9cb5e186571, 0xaeaccd9d736b4d62a1eab09aecde18, 0x004fa8], + }, + BigNum { + limbs: [0x73a69a942f840ad1d45960e9d626dc, 0xfe77b2223aa587ca2ddd92f73d486e, 0x001875], + }, + BigNum { + limbs: [0x49fd686bced7f42e2ba69e1629d925, 0xa8db777b42a2ab6faa2a76aa9abce5, 0x005b77], + }, + BigNum { + limbs: [0x880501279a899bcee868ce8587a13b, 0x8f1b04bfd10c7250976724baad776d, 0x0018f1], + }, + BigNum { + limbs: [0x359f01d863d263311797307a785ec6, 0x183824ddac3bc0e940a0e4e72a8de6, 0x005afc], + }, + BigNum { + limbs: [0xb3d3b950311f02a824f0ba9a8f2963, 0x7cb97acb4245d1566d60c3a6ba5720, 0x0036d4], + }, + BigNum { + limbs: [0x09d049afcd3cfc57db0f446570d69e, 0x2a99aed23b0261e36aa745fb1dae33, 0x003d19], + }, + BigNum { + limbs: [0x8992a0b4aebe62c3176cafbba6ece2, 0x3e3e42733334ed43caff7cac4fa484, 0x005665], + }, + BigNum { + limbs: [0x3411624b4f9d9c3ce8934f4459131f, 0x6914e72a4a1345f60d088cf58860cf, 0x001d88], + }, + BigNum { + limbs: [0x3e333e731c6d86ea2f0310654c1c69, 0x45e320a61c7930dd4640b8259046fa, 0x0072e0], + }, + BigNum { + limbs: [0x7f70c48ce1ee7815d0fcee9ab3e398, 0x617008f760cf025c91c7517c47be59, 0x00010d], + }, + BigNum { + limbs: [0xb4fac3c927f6e90d16741ca2ea19f3, 0x2ea688ce95690fb3e7765ded195901, 0x005fc4], + }, + BigNum { + limbs: [0x08a93f36d66515f2e98be25d15e60e, 0x78aca0cee7df2385f091abb4beac52, 0x001429], + }, + BigNum { + limbs: [0x38250aebdfea19439e2c0f3fec014c, 0x0c68a0cd2567ed61c7c501f9cc757c, 0x005f62], + }, + BigNum { + limbs: [0x857ef8141e71e5bc61d3efc013feb5, 0x9aea88d057e045d8104307a80b8fd7, 0x00148b], + }, + BigNum { + limbs: [0x315044d26ab11b7f5d7bffe0b305c8, 0x73d2528c3d883247ea42471dd1c0ed, 0x006381], + }, + BigNum { + limbs: [0x8c53be2d93aae380a283ff1f4cfa39, 0x3380d7113fc000f1edc5c284064466, 0x00106c], + }, + BigNum { + limbs: [0x80ec4b796d3c1fa24716c0654b3fca, 0x7624f7423ea31f36512a3c42e181bd, 0x006902], + }, + BigNum { + limbs: [0x3cb7b786911fdf5db8e93e9ab4c037, 0x312e325b3ea5140386ddcd5ef68396, 0x000aeb], + }, + BigNum { + limbs: [0xd55c9043bd712ec2374a085a04cf77, 0x4dce95290db96dbc6e981c87cc0d39, 0x0039dd], + }, + BigNum { + limbs: [0xe84772bc40ead03dc8b5f6a5fb308a, 0x598494746f8ec57d696fed1a0bf819, 0x003a10], + }, + BigNum { + limbs: [0xbf7472dae4da3860bf9e6bf6e31812, 0xb2cbafa33fb884780e7c68542c3f12, 0x006bd1], + }, + BigNum { + limbs: [0xfe2f90251981c69f406193091ce7ef, 0xf48779fa3d8faec1c98ba14dabc640, 0x00081b], + }, + BigNum { + limbs: [0xdd1b58249906be9ff079ce58af3199, 0xcedb6916a28c6ca682e24066db3c86, 0x001c77], + }, + BigNum { + limbs: [0xe088aadb655540600f8630a750ce68, 0xd877c086dabbc6935525c93afcc8cc, 0x005775], + }, + BigNum { + limbs: [0xb2c473d5eff1b216b4e9b27e7dd10b, 0x04f3b5c0b97878d28972a2a650511c, 0x0052f6], + }, + BigNum { + limbs: [0x0adf8f2a0e6a4ce94b164c81822ef6, 0xa25f73dcc3cfba674e9566fb87b437, 0x0020f7], + }, + BigNum { + limbs: [0x8ad7d4ab3b17b51f1f8779e781781b, 0x9112fa9f6cf5817199711eebb68441, 0x00416b], + }, + BigNum { + limbs: [0x32cc2e54c34449e0e07885187e87e6, 0x16402efe1052b1c83e96eab6218112, 0x003282], + }, + BigNum { + limbs: [0x388900a081efcebb6ed1c6d5c49f1c, 0xb4fd14ec51aeca9da4521c768d51ec, 0x001d1d], + }, + BigNum { + limbs: [0x851b025f7c6c3044912e382a3b60e5, 0xf25614b12b99689c33b5ed2b4ab367, 0x0056cf], + }, + BigNum { + limbs: [0x7bc9af0716769144464acf1f36c0d2, 0xf594e8c1b0eaeb8fc60143a855ad12, 0x006cdf], + }, + BigNum { + limbs: [0x41da53f8e7e56dbbb9b52fe0c93f2f, 0xb1be40dbcc5d47aa1206c5f9825841, 0x00070d], + }, + BigNum { + limbs: [0x9c31869ce1406981ccf144abd15da6, 0x3ce0bc31b687d449f891cf11c7f71e, 0x0032a7], + }, + BigNum { + limbs: [0x21727c631d1b957e330eba542ea25b, 0x6a726d6bc6c05eefdf763a90100e35, 0x004146], + }, + BigNum { + limbs: [0x3287e1eea50550f6cff67feb0214a3, 0x2edb568a00aaae9ef31c7368529f7b, 0x001469], + }, + BigNum { + limbs: [0x8b1c21115956ae0930097f14fdeb5e, 0x7877d3137c9d849ae4eb96398565d8, 0x005f84], + }, + BigNum { + limbs: [0x1765e37219c59a01744eaf22f61cd5, 0xa5ee072d800a1ddf4a71f83fdd1ad2, 0x005ac1], + }, + BigNum { + limbs: [0xa63e1f8de49664fe8bb14fdd09e32c, 0x0165226ffd3e155a8d961161faea81, 0x00192c], + }, + BigNum { + limbs: [0x9cafd3f14593be08db6cfdab4f5cbc, 0x28b7d9ee0088d8fd5273b9e4c23a8a, 0x0057b4], + }, + BigNum { + limbs: [0x20f42f0eb8c840f724930154b0a345, 0x7e9b4faf7cbf5a3c85944fbd15cac9, 0x001c39], + }, + BigNum { + limbs: [0x1d9eb5efde33ed0116fc035b9ef1e4, 0xbde86d834a067c0302160fb86d4f84, 0x00151e], + }, + BigNum { + limbs: [0xa0054d10202811fee903fba4610e1d, 0xe96abc1a3341b736d5f1f9e96ab5cf, 0x005ece], + }, + BigNum { + limbs: [0x6855f02b9c14d37b254b4c16aecf49, 0xebabeb3d7ef48c4988b6f7e98663fa, 0x0034ca], + }, + BigNum { + limbs: [0x554e12d462472b84dab4b2e95130b8, 0xbba73e5ffe53a6f04f5111b851a159, 0x003f22], + }, + BigNum { + limbs: [0x018d3725a347a231aef389d1650159, 0xe15e3ad0ea849dd9032a8990ebcab4, 0x00055b], + }, + BigNum { + limbs: [0xbc16cbda5b145cce510c752e9afea8, 0xc5f4eecc92c39560d4dd8010ec3a9f, 0x006e91], + }, + BigNum { + limbs: [0x291cf291adb45adf4f59597e92099f, 0x5f789f1b1294ee932d062fe4dad38d, 0x0016a6], + }, + BigNum { + limbs: [0x9487106e50a7a420b0a6a5816df662, 0x47da8a826ab344a6ab01d9bcfd31c6, 0x005d47], + }, + BigNum { + limbs: [0x6c7c3031e114547e10569404305b4e, 0x0bfd1bdf8a97e9ebe9b3a7f47018b5, 0x005d66], + }, + BigNum { + limbs: [0x5127d2ce1d47aa81efa96afbcfa4b3, 0x9b560dbdf2b0494dee5461ad67ec9e, 0x001687], + }, + BigNum { + limbs: [0xd91b48dadb210c247b1a81979f35c0, 0x6ac519183e52453eabbc8a1e13a637, 0x0065d5], + }, + BigNum { + limbs: [0xe488ba25233af2db84e57d6860ca41, 0x3c8e10853ef5edfb2c4b7f83c45f1b, 0x000e18], + }, + BigNum { + limbs: [0xf9c0f86360276418f827bbe6225400, 0xde0c2c3ab91f997809bf4d6d1952fa, 0x0026db], + }, + BigNum { + limbs: [0xc3e30a9c9e349ae707d84319ddac01, 0xc946fd62c42899c1ce48bc34beb258, 0x004d11], + }, + BigNum { + limbs: [0x80d9b39a09327511be38f00fe0e15b, 0x0ed0b718d075007221b4e63392be47, 0x006b81], + }, + BigNum { + limbs: [0x3cca4f65f52989ee41c70ef01f1ea6, 0x98827284acd332c7b653236e45470c, 0x00086c], + }, + BigNum { + limbs: [0x37d5f8a16c4f0f051e1aa4af01a637, 0x04ef549725e3a992bf6d27f26ad9a0, 0x006706], + }, + BigNum { + limbs: [0x85ce0a5e920ceffae1e55a50fe59ca, 0xa263d506576489a7189ae1af6d2bb3, 0x000ce7], + }, + BigNum { + limbs: [0xd3148a4e36e3f07250f3cf33f08243, 0x11b3253731a2f1970b62d2eeb13eaf, 0x001c8e], + }, + BigNum { + limbs: [0xea8f78b1c7780e8daf0c2fcc0f7dbe, 0x95a004664ba541a2cca536b326c6a3, 0x00575f], + }, + BigNum { + limbs: [0xd921850e3e933c628e568582ec954a, 0x63d8ead24230b1313472e590e57dc9, 0x0010ec], + }, + BigNum { + limbs: [0xe4827df1bfc8c29d71a9797d136ab7, 0x437a3ecb3b178208a3952410f28789, 0x006301], + }, + BigNum { + limbs: [0xca58916c4689cf7045743933f004c4, 0x0c8b650b839487fbfdffef881252a8, 0x0025e5], + }, + BigNum { + limbs: [0xf34b7193b7d22f8fba8bc5cc0ffb3d, 0x9ac7c491f9b3ab3dda081a19c5b2aa, 0x004e08], + }, + BigNum { + limbs: [0x98a02aabd7ff53948a74e7d72a06cd, 0x3cd150debfd777dd0e7b4cd77e3590, 0x006129], + }, + BigNum { + limbs: [0x2503d854265cab6b758b1728d5f934, 0x6a81d8bebd70bb5cc98cbcca59cfc3, 0x0012c4], + }, + BigNum { + limbs: [0x8d3c5d8e2ae3c2772ae3260559361e, 0x29d913bae95cd300eb8ed538a67baf, 0x006233], + }, + BigNum { + limbs: [0x3067a571d3783c88d51cd8faa6c9e3, 0x7d7a15e293eb6038ec7934693189a4, 0x0011ba], + }, + BigNum { + limbs: [0x7cb9e132d2958e4a821d18d001905b, 0x4d1e9a0e31c08c8b929e83caa601f1, 0x0042c1], + }, + BigNum { + limbs: [0x40ea21cd2bc670b57de2e62ffe6fa6, 0x5a348f8f4b87a6ae456985d7320362, 0x00312c], + }, + BigNum { + limbs: [0xb6a6109f87dc09a945ddfd3194d6d4, 0x6a5b221a98193db17c13a115ad244a, 0x006b90], + }, + BigNum { + limbs: [0x06fdf260767ff556ba2201ce6b292d, 0x3cf80782e52ef5885bf4688c2ae109, 0x00085d], + }, + BigNum { + limbs: [0xb409a53b4e735b3e20998093f034d1, 0x4132904aebad93d405cac07f33f025, 0x002dcc], + }, + BigNum { + limbs: [0x099a5dc4afe8a3c1df667e6c0fcb30, 0x66209952919a9f65d23d4922a4152e, 0x004621], + }, + BigNum { + limbs: [0x347967c3bc6e57d128b5e565be28ca, 0xd7c469a307201e75fc005a4b76b707, 0x0040d8], + }, + BigNum { + limbs: [0x892a9b3c41eda72ed74a199a41d737, 0xcf8ebffa762814c3dc07af56614e4c, 0x003314], + }, + BigNum { + limbs: [0xe64499b0d7caec0b00709d16ad9a83, 0xb54c8d72e98d795445bdfc60240f61, 0x00365f], + }, + BigNum { + limbs: [0xd75f694f269112f4ff8f61e952657e, 0xf2069c2a93bab9e5924a0d41b3f5f1, 0x003d8d], + }, + BigNum { + limbs: [0xd7a3987f769bcdcca9e87f5a7f1839, 0x28c04a0ebb7cef135ae7b8e3362098, 0x000aaf], + }, + BigNum { + limbs: [0xe6006a8087c0313356177fa580e7c8, 0x7e92df8ec1cb44267d2050bea1e4ba, 0x00693e], + }, + BigNum { + limbs: [0x46526f56e933837b9a7281e045bece, 0xca3c7024fc860c906c9a837e1ef6c9, 0x0051c3], + }, + BigNum { + limbs: [0x775193a915287b84658d7d1fba4133, 0xdd16b97880c226a96b6d8623b90e8a, 0x002229], + }, + BigNum { + limbs: [0x7bf2539257c17e7aad249861212753, 0x694837b9391d085fa60b9f017e7069, 0x0036a0], + }, + BigNum { + limbs: [0x41b1af6da69a808552db669eded8ae, 0x3e0af1e4442b2ada31fc6aa05994ea, 0x003d4d], + }, + BigNum { + limbs: [0x08ab2a2ad21968eec3c5de94bad69d, 0xc186cf00b349406509fe76f63710de, 0x0054c8], + }, + BigNum { + limbs: [0xb4f8d8d52c4296113c3a206b452964, 0xe5cc5a9cc9fef2d4ce0992aba0f475, 0x001f24], + }, + BigNum { + limbs: [0x944f00370ccf4f13fb91c643fb2d66, 0x95a692611ba92c8972a756f96cb36c, 0x003bbe], + }, + BigNum { + limbs: [0x295502c8f18cafec046e38bc04d29b, 0x11ac973c619f06b06560b2a86b51e7, 0x00382f], + }, + BigNum { + limbs: [0x272c6068d63114246a617ab5b1d7c1, 0xc9ed81babb1d1bd763ca4d6bdfd295, 0x005026], + }, + BigNum { + limbs: [0x9677a297282aeadb959e844a4e2840, 0xdd65a7e2c22b1762743dbc35f832be, 0x0023c6], + }, + BigNum { + limbs: [0x951e797897dba86fdf5cf1dc0d5e2d, 0xeff498b8905fcb05b3a6dd0acdcfa0, 0x00328e], + }, + BigNum { + limbs: [0x288589876680569020a30d23f2a1d4, 0xb75e90e4ece8683424612c970a35b3, 0x00415e], + }, + BigNum { + limbs: [0x6c51f4dd49bc1edfaec8846128af8c, 0xec951e59e820a34667352ae9d5dc49, 0x00565e], + }, + BigNum { + limbs: [0x51520e22b49fe02051377a9ed75075, 0xbabe0b4395278ff370d2deb802290a, 0x001d8e], + }, + BigNum { + limbs: [0x564a7da1b902e56caf3d28aac9a3c4, 0xb58e63be683db556ce006a3e0689cf, 0x0032f3], + }, + BigNum { + limbs: [0x6759855e4559199350c2d655365c3d, 0xf1c4c5df150a7de30a079f63d17b84, 0x0040f9], + }, + BigNum { + limbs: [0xc813f4bdbc74d2b530d23b962f2a33, 0xdc158b69f2a11da67680a3c4d0af46, 0x004500], + }, + BigNum { + limbs: [0xf5900e4241e72c4acf2dc369d0d5ce, 0xcb3d9e338aa71593618765dd07560c, 0x002eec], + }, + BigNum { + limbs: [0x5b041f5f9708988f8dae3158baa4f0, 0xfeb5f831eb4b4062055dbcce3169b1, 0x00257e], + }, + BigNum { + limbs: [0x629fe3a0675366707251cda7455b11, 0xa89d316b91fcf2d7d2aa4cd3a69ba2, 0x004e6e], + }, + BigNum { + limbs: [0xd87eea1587a122a77fcdb6e01fc805, 0xddb0d6f819ff9a970fd511c11cc817, 0x005111], + }, + BigNum { + limbs: [0xe52518ea76badc588032481fe037fc, 0xc9a252a5634898a2c832f7e0bb3d3b, 0x0022db], + }, + BigNum { + limbs: [0xcbb32eecd136f3bd36b91fbcc4d9b6, 0x5004d39bdc27c60b52058c6a5d992c, 0x0036d5], + }, + BigNum { + limbs: [0xf1f0d4132d250b42c946df433b264b, 0x574e5601a1206d2e86027d377a6c26, 0x003d18], + }, + BigNum { + limbs: [0x31775507138bf4d55710af424be9d8, 0xced1d9e77067fa868a71c6f77de16d, 0x006ab5], + }, + BigNum { + limbs: [0x8c2cadf8ead00a2aa8ef4fbdb41629, 0xd8814fb60ce038b34d9642aa5a23e6, 0x000937], + }, + BigNum { + limbs: [0x22be3aea24e089a73c2d0794e42fd6, 0x2e20bfe4966c7b20ecd45027f90dba, 0x002641], + }, + BigNum { + limbs: [0x9ae5c815d97b7558c3d2f76b1bd02b, 0x793269b8e6dbb818eb33b979def799, 0x004dac], + }, + BigNum { + limbs: [0x44e9ca24af3f23db594c625e551d2f, 0xaa708ba0d9387fc2ea6188ea73aeba, 0x005797], + }, + BigNum { + limbs: [0x78ba38db4f1cdb24a6b39ca1aae2d2, 0xfce29dfca40fb376eda680b7645699, 0x001c55], + }, + BigNum { + limbs: [0x1a389fbb63a04a5f354e65971de4d9, 0x55f4c40d039d403ad68fd45a57b606, 0x00422e], + }, + BigNum { + limbs: [0xa36b63449abbb4a0cab19968e21b28, 0x515e659079aaf2ff01783547804f4d, 0x0031bf], + }, + BigNum { + limbs: [0xb6cdeb0f626ed00651b1676d885461, 0x33380951bff039cc3eca9b8f12386f, 0x0033f6], + }, + BigNum { + limbs: [0x06d617f09bed2ef9ae4e979277aba0, 0x741b204bbd57f96d993d6e12c5cce4, 0x003ff7], + }, + BigNum { + limbs: [0xda6ff3d514cd34f981d24464db09e3, 0x09b0db598773f7ce184aa37ed63aa3, 0x0007f7], + }, + BigNum { + limbs: [0xe3340f2ae98eca067e2dba9b24f61e, 0x9da24e43f5d43b6bbfbd662301caaf, 0x006bf6], + }, + BigNum { + limbs: [0xd1f0ef63638923521de4c4c32db9ab, 0xbf2f35a097b959e1e80e2b91530396, 0x0021cc], + }, + BigNum { + limbs: [0xebb3139c9ad2dbade21b3a3cd24656, 0xe823f3fce58ed957eff9de108501bc, 0x005220], + }, + BigNum { + limbs: [0xd4938d032e32e3680c16c5a25aa156, 0x3cf7027be69cc607157d64fd6ad8aa, 0x007110], + }, + BigNum { + limbs: [0xe91075fcd0291b97f3e9395da55eab, 0x6a5c272196ab6d32c28aa4a46d2ca8, 0x0002dd], + }, + BigNum { + limbs: [0x49f11bcd26167e652046ce1ccb0b04, 0x0ab5a536a2bc4ae3bc899b9f299d3d, 0x006f24], + }, + BigNum { + limbs: [0x73b2e732d845809adfb930e334f4fd, 0x9c9d8466da8be8561b7e6e02ae6816, 0x0004c9], + }, + BigNum { + limbs: [0x86d07b2a764c768bf2bded30b49e55, 0x35c886192d15cdecb2b5626ba1982a, 0x001d5e], + }, + BigNum { + limbs: [0x36d387d5880f88740d4211cf4b61ac, 0x718aa3845032654d2552a736366d29, 0x00568f], + }, + BigNum { + limbs: [0x741dccc9d3b837864148660c5ff769, 0x674a258c9a5f5df0c9cf432b619672, 0x0044a4], + }, + BigNum { + limbs: [0x498636362aa3c779beb798f3a00898, 0x40090410e2e8d5490e38c676766ee1, 0x002f49], + }, + BigNum { + limbs: [0xf349c07945e5e0edb443dca4bddafd, 0xb2d557f9bc8f70459aa181f5b2c711, 0x00091a], + }, + BigNum { + limbs: [0xca5a4286b8761e124bbc225b422504, 0xf47dd1a3c0b8c2f43d6687ac253e41, 0x006ad2], + }, + BigNum { + limbs: [0x00d055d2a9b0bc6d8a5054451ad0e3, 0x34fba2e3d54058c59b99b8084fe171, 0x007059], + }, + BigNum { + limbs: [0xbcd3ad2d54ab429275afaabae52f1e, 0x725786b9a807da743c6e51998823e2, 0x000394], + }, + BigNum { + limbs: [0xdf38bbada9907b5c19b4d0ea2cf552, 0xe3137f39dc7cc1b70fdd68b0c23c3a, 0x0064a0], + }, + BigNum { + limbs: [0xde6b475254cb83a3e64b2e15d30aaf, 0xc43faa63a0cb7182c82aa0f115c918, 0x000f4c], + }, + BigNum { + limbs: [0xf33e0433d82ab9c8eb3ce41f9b3865, 0x856912a85c660aad656ffeb6c2bf63, 0x006c1f], + }, + BigNum { + limbs: [0xca65fecc2631453714c31ae064c79c, 0x21ea16f520e2288c72980aeb1545ef, 0x0007ce], + }, + BigNum { + limbs: [0xa761ed7f56302d96809abbf18276db, 0xe1596b71f9bc589a263dde7e697951, 0x005505], + }, + BigNum { + limbs: [0x16421580a82bd1697f65430e7d8926, 0xc5f9be2b838bda9fb1ca2b236e8c02, 0x001ee7], + }, + BigNum { + limbs: [0x4999895b894e7b3bcce44cd25431fe, 0x099c42c3c3a0f3e1f8c910f610b39b, 0x00349e], + }, + BigNum { + limbs: [0x740a79a4750d83c4331bb22dabce03, 0x9db6e6d9b9a73f57df3ef8abc751b8, 0x003f4f], + }, + BigNum { + limbs: [0xef365d8f564d8665d97d20da8a4880, 0x019e35705d3df95a130822cd786187, 0x005d09], + }, + BigNum { + limbs: [0xce6da570a80e789a2682de2575b781, 0xa5b4f42d200a39dfc4ffe6d45fa3cb, 0x0016e4], + }, + BigNum { + limbs: [0xbc1a689171d2cf978fe23164f37571, 0xf0e9d4f0de132b3dd8b8c5ad4beab0, 0x0073cf], + }, + BigNum { + limbs: [0x01899a6e8c892f68701dcd9b0c8a90, 0xb66954ac9f3507fbff4f43f48c1aa3, 0x00001d], + }, + BigNum { + limbs: [0x3ffb8f77520ffff2a23b550a4ab2db, 0x0b24e9dfe12818744d82593f6f34d6, 0x0057cf], + }, + BigNum { + limbs: [0x7da87388ac4bff0d5dc4a9f5b54d26, 0x9c2e3fbd9c201ac58a85b06268d07d, 0x001c1e], + }, + BigNum { + limbs: [0x997826bfc8ad389e25e3fe6cef99eb, 0x78749cc708a949a477553bc2f4fc33, 0x000ab3], + }, + BigNum { + limbs: [0x242bdc4035aec661da1c0093106616, 0x2ede8cd6749ee99560b2cddee30920, 0x00693a], + }, + BigNum { + limbs: [0x586184211e1e67d4f1c280878dd156, 0xde92b22d5da44740e70657943af37e, 0x0059db], + }, + BigNum { + limbs: [0x65427edee03d972b0e3d7e78722eab, 0xc8c077701fa3ebf8f101b20d9d11d5, 0x001a11], + }, + BigNum { + limbs: [0xcda463a8d1c74bd10369bd08096f25, 0xee4c927ff242f2211ffa4190c7122f, 0x0005f6], + }, + BigNum { + limbs: [0xefff9f572c94b32efc9641f7f690dc, 0xb906971d8b054118b80dc81110f323, 0x006df6], + }, + BigNum { + limbs: [0x064b923b363ae2563bf5faa91ed24b, 0xba6d9970e394849ed4fd6170ed5c48, 0x0061b0], + }, + BigNum { + limbs: [0xb75870c4c8211ca9c40a0456e12db6, 0xece5902c99b3ae9b030aa830eaa90b, 0x00123c], + }, + BigNum { + limbs: [0xac287e54e95f83e124da9b67220f6a, 0x9a86ccaef3e24ca64c8224be01c20b, 0x005fe6], + }, + BigNum { + limbs: [0x117b84ab14fc7b1edb256398ddf097, 0x0ccc5cee8965e6938b85e4e3d64348, 0x001407], + }, + BigNum { + limbs: [0xbdc8bec4ca55090a1159e33226fddc, 0x01452a43350e9ccd0a8ad0d9ab6b1b, 0x004ded], + }, + BigNum { + limbs: [0xffdb443b3406f5f5eea61bcdd90225, 0xa60dff5a4839966ccd7d38c82c9a37, 0x002600], + }, + BigNum { + limbs: [0x5e1c54792bce639cc1766f87d12b83, 0xfc8a65c7f929a997bfdd4f35e3ed22, 0x003339], + }, + BigNum { + limbs: [0x5f87ae86d28d9b633e898f782ed47e, 0xaac8c3d5841e89a2182aba6bf41831, 0x0040b3], + }, + BigNum { + limbs: [0xa43adf717e6f5462df3334e6f50603, 0x78efac810f398ebea89d164fda7eb5, 0x00194a], + }, + BigNum { + limbs: [0x1969238e7fecaa9d20ccca190af9fe, 0x2e637d1c6e0ea47b2f6af351fd869e, 0x005aa3], + }, + BigNum { + limbs: [0xc24e588eeaf243b62ac02fe31ee32e, 0x8a30a21a1e10ea55f945e2ab111301, 0x004765], + }, + BigNum { + limbs: [0xfb55aa711369bb49d53fcf1ce11cd3, 0x1d2287835f3748e3dec226f6c6f251, 0x002c88], + }, + BigNum { + limbs: [0xc6c68d42f47a67560dced4fdd1fa58, 0x7540ddef6d67d1f5d35735e4bd5e3b, 0x002f01], + }, + BigNum { + limbs: [0xf6dd75bd09e197a9f2312a022e05a9, 0x32124bae0fe0614404b0d3bd1aa717, 0x0044ec], + }, + BigNum { + limbs: [0xca9e3b165ffd945b504b3bb34e64db, 0x5e2e8b0cfbfa61bd24d49a89618b24, 0x0012ad], + }, + BigNum { + limbs: [0xf305c7e99e5e6aa4afb4c34cb19b26, 0x49249e90814dd17cb3336f18767a2e, 0x006140], + }, + BigNum { + limbs: [0x96f2f1c97a5e1a3a3e804ffc87763e, 0xbb98eb7f7419a70793f2a8652ad8ed, 0x002c07], + }, + BigNum { + limbs: [0x26b1113683fde4c5c17faf037889c3, 0xebba3e1e092e8c324415613cad2c66, 0x0047e5], + }, + BigNum { + limbs: [0x140327f4c971e021cd8ea769a094a8, 0xaaff762d242c005f3353a3f16a497c, 0x002959], + }, + BigNum { + limbs: [0xa9a0db0b34ea1ede327157965f6b59, 0xfc53b370591c32daa4b465b06dbbd7, 0x004a93], + }, + BigNum { + limbs: [0x0f71e5bc71e446fdc1747a63ca7ac3, 0x9afc610afa905bd996a93f88b570c4, 0x002c32], + }, + BigNum { + limbs: [0xae321d438c77b8023e8b849c35853e, 0x0c56c89282b7d760415eca1922948f, 0x0047bb], + }, + BigNum { + limbs: [0xf4cfbb63e2c54e74aa45a97409d198, 0x989b5812a14b95b3455dc1fc4ccd45, 0x00472e], + }, + BigNum { + limbs: [0xc8d4479c1b96b08b55ba558bf62e69, 0x0eb7d18adbfc9d8692aa47a58b380d, 0x002cbf], + }, + BigNum { + limbs: [0x93cc71925057864dbe0415c94990ca, 0xc088a84a78536f2265c88b14e72ab3, 0x0036e4], + }, + BigNum { + limbs: [0x29d7916dae0478b241fbe936b66f37, 0xe6ca815304f4c417723f7e8cf0daa0, 0x003d08], + }, + BigNum { + limbs: [0x84298ae8c5a849168f04747c6dd5f6, 0xafa0841de6392d45266b5073cdd55a, 0x002780], + }, + BigNum { + limbs: [0x397a781738b3b5e970fb8a83922a0b, 0xf7b2a57f970f05f4b19cb92e0a2ff9, 0x004c6c], + }, + BigNum { + limbs: [0x3e0b597663520df89d77764e3c697d, 0x98e3d7cffb2883fe05d75d187fb448, 0x000e2d], + }, + BigNum { + limbs: [0x7f98a9899b09f107628888b1c39684, 0x0e6f51cd821faf3bd230ac8958510b, 0x0065c0], + }, + BigNum { + limbs: [0x19ce40ca252a482fa108ef1d9fd883, 0xa5be459b5d08fae658577ea875bd85, 0x0053b2], + }, + BigNum { + limbs: [0xa3d5c235d931b6d05ef70fe260277e, 0x0194e402203f38537fb08af96247ce, 0x00203b], + }, + BigNum { + limbs: [0x8e834b9d101cc30553818f08ec3792, 0x732ccb933eb66f82430836ca2cb22d, 0x002a8a], + }, + BigNum { + limbs: [0x2f20b762ee3f3bfaac7e6ff713c86f, 0x34265e0a3e91c3b794ffd2d7ab5326, 0x004963], + }, + BigNum { + limbs: [0x578c6d4d68ed7dca98bd685bd2aadb, 0xcf54a97840df560670b0af632fe115, 0x0002a8], + }, + BigNum { + limbs: [0x661795b2956e8135674296a42d5526, 0xd7fe80253c68dd3367575a3ea8243e, 0x007144], + }, + BigNum { + limbs: [0x34d2b570c678cbc0cb94250c958ba6, 0x1552c8b68e2f38b6e13590d0570de6, 0x0025a8], + }, + BigNum { + limbs: [0x88d14d8f37e3333f346bd9f36a745b, 0x920060e6ef18fa82f6d278d180f76d, 0x004e45], + }, + BigNum { + limbs: [0x1184a5a8c9d0c61c94431cded59c35, 0x120f1f2bdbbd7a988914f8099e95c1, 0x00607e], + }, + BigNum { + limbs: [0xac1f5d57348b38e36bbce2212a63cc, 0x95440a71a18ab8a14ef31198396f92, 0x00136f], + }, + BigNum { + limbs: [0xd6fefe5e71e4af3ce5516b5b587650, 0x34b9a353074fe5db498087c0b30bec, 0x002f22], + }, + BigNum { + limbs: [0xe6a504a18c774fc31aae93a4a789b1, 0x7299864a75f84d5e8e8781e124f966, 0x0044cb], + }, + BigNum { + limbs: [0x7afe2f33b2d29c01e3f791190a25d7, 0x177195db06ee6206cad3f8f8edd20f, 0x000ffe], + }, + BigNum { + limbs: [0x42a5d3cc4b8962fe1c086de6f5da2a, 0x8fe193c27659d1330d3410a8ea3344, 0x0063ef], + }, + BigNum { + limbs: [0x5406346f9e88c9af3e5868ce1e4fa4, 0xf3250b114352a07bbae29228324286, 0x0037a1], + }, + BigNum { + limbs: [0x699dce905fd33550c1a79631e1b05d, 0xb42e1e8c39f592be1d257779a5c2cd, 0x003c4b], + }, + BigNum { + limbs: [0x32052ccde9b4a9e6681bf64684319d, 0x21267ce32c4122aea787e30b9f31d8, 0x005561], + }, + BigNum { + limbs: [0x8b9ed63214a7551997e408b97bce64, 0x862cacba5107108b3080269638d37b, 0x001e8c], + }, + BigNum { + limbs: [0x7297ee3889650ac76cad1646b4761b, 0x3c8ebc9a02da5d2bc85bcb435da336, 0x00018a], + }, + BigNum { + limbs: [0x4b0c14c774f6f4389352e8b94b89e6, 0x6ac46d037a6dd60e0fac3e5e7a621d, 0x007263], + }, + BigNum { + limbs: [0x254665e6c64ce581eae2c4dce4c189, 0x28fa32bbdcdfe1800790e64116d4ae, 0x006d41], + }, + BigNum { + limbs: [0x985d9d19380f197e151d3a231b3e78, 0x7e58f6e1a06851b9d0772360c130a5, 0x0006ac], + }, + BigNum { + limbs: [0xf3441dca163541a496c81e00ff1276, 0xbde858c524939b5eade1d86f47824f, 0x00678d], + }, + BigNum { + limbs: [0xca5fe535e826bd5b6937e0ff00ed8b, 0xe96ad0d858b497db2a263132908303, 0x000c5f], + }, + BigNum { + limbs: [0xe51ebc10b57b63a5e9eab8152b4839, 0xee15d6617551bb90e37cb272360e41, 0x004f8c], + }, + BigNum { + limbs: [0xd88546ef48e09b5a161546ead4b7c8, 0xb93d533c07f677a8f48b572fa1f711, 0x002460], + }, + BigNum { + limbs: [0x22cebc18e0dfea53811fb238fd2814, 0x90a3cef9da73ce6a4f2099a0af14fb, 0x0021bb], + }, + BigNum { + limbs: [0x9ad546e71d7c14ac7ee04cc702d7ed, 0x16af5aa3a2d464cf88e7700128f058, 0x005232], + }, + BigNum { + limbs: [0xfa1af59c87e3c79575577ad3edf1cb, 0x27562b6a9a47cd994218dfd57859ef, 0x00061a], + }, + BigNum { + limbs: [0xc3890d637678376a8aa8842c120e36, 0x7ffcfe32e30065a095ef29cc5fab63, 0x006dd3], + }, + BigNum { + limbs: [0x82dfab906848c79c3c62b3f1e99da1, 0x28bbc7ee1bd43b6c686683ad41bf33, 0x0012d8], + }, + BigNum { + limbs: [0x3ac4576f96133763c39d4b0e166260, 0x7e9761af6173f7cd6fa185f4964620, 0x006115], + }, + BigNum { + limbs: [0x55abba30f4c41cd573721eba4465da, 0x1de7a6c125e8339bd6dd4c22a7b59c, 0x0014b0], + }, + BigNum { + limbs: [0x67f848cf0997e22a8c8de045bb9a27, 0x896b82dc575fff9e012abd7f304fb7, 0x005f3d], + }, + BigNum { + limbs: [0x2d52cdfd0b98891cc466c414f63fc0, 0x2c10967cc466405960131e7988212b, 0x00237a], + }, + BigNum { + limbs: [0x90513502f2c375e33b993aeb09c041, 0x7b429320b8e1f2e077f4eb284fe428, 0x005073], + }, + BigNum { + limbs: [0x1c1e85d06fe60186a9252bd472f5c3, 0xa8ec47f5c95bf245914235998e63d5, 0x003282], + }, + BigNum { + limbs: [0xa1857d2f8e75fd7956dad32b8d0a3e, 0xfe66e1a7b3ec40f446c5d40849a17e, 0x00416a], + }, + BigNum { + limbs: [0x020c89ecc0849375daa8809864b9c9, 0xcb5137860e4d96b953a9110b8bc722, 0x0047e3], + }, + BigNum { + limbs: [0xbb9779133dd76b8a25577e679b4638, 0xdc01f2176efa9c80845ef8964c3e31, 0x002c09], + }, + BigNum { + limbs: [0xdc61fcccb02913fc394ee9057469b2, 0x555589c733ab00def2f546ab11bdb3, 0x006841], + }, + BigNum { + limbs: [0xe14206334e32eb03c6b115fa8b964f, 0x51fd9fd6499d325ae512c2f6c6479f, 0x000bac], + }, + BigNum { + limbs: [0x726e23ee95bde2252d6661602d7435, 0x26d40fbaeeb2b594020b8675359421, 0x0060ae], + }, + BigNum { + limbs: [0x4b35df11689e1cdad2999d9fd28bcc, 0x807f19e28e957da5d5fc832ca27132, 0x00133f], + }, + BigNum { + limbs: [0x9a0662c6b842dae4bdeee08a005d23, 0x5a11d5a09148a256aa11611dc01ba3, 0x001d34], + }, + BigNum { + limbs: [0x239da0394619241b42111e75ffa2de, 0x4d4153fcebff90e32df6a88417e9b0, 0x0056b9], + }, + BigNum { + limbs: [0xac53ac97accee001ed731a05753b82, 0x2e90157bd61796b1028e1af5170f0b, 0x000a2c], + }, + BigNum { + limbs: [0x11505668518d1efe128ce4fa8ac47f, 0x78c31421a7309c88d579eeacc0f648, 0x0069c1], + }, + BigNum { + limbs: [0xb6f5ee2e46bfbbca14e7c13bdd9bf7, 0x1801a4e66be3bb20514a762a99af1c, 0x00441c], + }, + BigNum { + limbs: [0x06ae14d1b79c4335eb183dc422640a, 0x8f5184b71164781986bd93773e5637, 0x002fd1], + }, + BigNum { + limbs: [0x439ad148d806a7ccdf8183b63ed567, 0x8c89b8e828873394d984953e9c4dc3, 0x0010e4], + }, + BigNum { + limbs: [0x7a0931b726555733207e7b49c12a9a, 0x1ac970b554c0ffa4fe8374633bb790, 0x006309], + }, + BigNum { + limbs: [0x3e07bd495b317f1e77078e4a922207, 0x5c0d57961afe92b25ed1032a82f445, 0x0041c9], + }, + BigNum { + limbs: [0x7f9c45b6a32a7fe188f870b56dddfa, 0x4b45d2076249a0877937067755110e, 0x003224], + }, + BigNum { + limbs: [0x3ab0758cbe037ad272322f2e9b1d0f, 0xce3c4a3cd9a490a6c43e4346125662, 0x000ae3], + }, + BigNum { + limbs: [0x82f38d734058842d8dcdcfd164e2f2, 0xd916df60a3a3a29313c9c65bc5aef1, 0x006909], + }, + BigNum { + limbs: [0x466a99fb5f7bef1e6017af6230182b, 0x7eb0960434809577da230e2c88260c, 0x0003df], + }, + BigNum { + limbs: [0x773969049ee00fe19fe84f9dcfe7d6, 0x28a2939948c79dc1fde4fb754fdf47, 0x00700e], + }, + BigNum { + limbs: [0x6ed968e5c09240096c2d089156eaed, 0x5fefa464baa254d980d9d59b1f65bd, 0x005bb3], + }, + BigNum { + limbs: [0x4eca9a1a3dc9bef693d2f66ea91514, 0x47638538c2a5de60572e3406b89f96, 0x00183a], + }, + BigNum { + limbs: [0x999c758ec8080ab8e9e36ceea971b7, 0x146d0722977916eed0bc549904aba0, 0x002254], + }, + BigNum { + limbs: [0x24078d713653f447161c9211568e4a, 0x92e6227ae5cf1c4b074bb508d359b3, 0x005199], + }, + BigNum { + limbs: [0x4d72814a2d66d08895e916b75c0586, 0x130e3be6e721dff06413633821356e, 0x0023c2], + }, + BigNum { + limbs: [0x703181b5d0f52e776a16e848a3fa7b, 0x9444edb69626534973f4a669b6cfe5, 0x00502b], + }, + BigNum { + limbs: [0x4f3dcab708c5c68b54a44d5eb5f239, 0xafacdf20a18221d002ebd6d577c87d, 0x004b6e], + }, + BigNum { + limbs: [0x6e663848f5963874ab5bb1a14a0dc8, 0xf7a64a7cdbc61169d51c32cc603cd6, 0x00287e], + }, + BigNum { + limbs: [0x3cd85a008ad190414dbdcb15d0dac0, 0x18c3495bb2a9b4c1265d710a862f5f, 0x006749], + }, + BigNum { + limbs: [0x80cba8ff738a6ebeb24233ea2f2541, 0x8e8fe041ca9e7e78b1aa989751d5f4, 0x000ca4], + }, + BigNum { + limbs: [0xfc5bbb5fe6d85bf135c083512c9fe8, 0xfacd0f29438dc279c735326262a715, 0x00443c], + }, + BigNum { + limbs: [0xc14847a01783a30eca3f7baed36019, 0xac861a7439ba70c010d2d73f755e3d, 0x002fb0], + }, + BigNum { + limbs: [0xddd69a355f5807ccd7ce20289e7057, 0xc73dd7b7381292525534a336790988, 0x0021bd], + }, + BigNum { + limbs: [0xdfcd68ca9f03f7332831ded7618faa, 0xe01551e64535a0e782d3666b5efbca, 0x00522f], + }, + BigNum { + limbs: [0x2e72025de4a0c712a4159d38ee7edf, 0x93133a3a6b7193b0142074a447361e, 0x00210f], + }, + BigNum { + limbs: [0x8f3200a219bb37ed5bea61c7118122, 0x143fef6311d69f89c3e794fd90cf35, 0x0052de], + }, + BigNum { + limbs: [0x668bb61eabbf26efe8b7c5f4cdbb8a, 0x8055f6f56ceef2a6ba04234203090d, 0x005169], + }, + BigNum { + limbs: [0x57184ce1529cd8101748390b324477, 0x26fd32a8105940931e03e65fd4fc46, 0x002284], + }, + BigNum { + limbs: [0x151dff81d368d532dbe75201147c74, 0xf563dca47733442fccebb3b272904a, 0x0015aa], + }, + BigNum { + limbs: [0xa886037e2af329cd2418acfeeb838d, 0xb1ef4cf90614ef0a0b1c55ef657509, 0x005e42], + }, + BigNum { + limbs: [0x0a8dbfebab4f06748e13419b319c10, 0x1d7727add9dd135d2ad0956ba98d78, 0x00528e], + }, + BigNum { + limbs: [0xb3164314530cf88b71ecbd64ce63f1, 0x89dc01efa36b1fdcad3774362e77db, 0x00215f], + }, + BigNum { + limbs: [0x9f0e6768335b1d2b9a21f44b8839df, 0xcffa24a5ed86e22b586a2e37e5b16a, 0x0039b5], + }, + BigNum { + limbs: [0x1e959b97cb00e1d465de0ab477c622, 0xd75904f78fc1510e7f9ddb69f253e9, 0x003a37], + }, + BigNum { + limbs: [0xe12f618a02f52636e22842492675f1, 0x1578dddc06904031a5b1f1d0e35a2d, 0x00465a], + }, + BigNum { + limbs: [0xdc74a175fb66d8c91dd7bcb6d98a10, 0x91da4bc176b7f308325617d0f4ab25, 0x002d93], + }, + BigNum { + limbs: [0xfc7593aacae8f0048c998c718b18fa, 0xb132aace436810593938764cd2873c, 0x005e9f], + }, + BigNum { + limbs: [0xc12e6f5533730efb7366728e74e707, 0xf6207ecf39e022e09ecf9355057e16, 0x00154d], + }, + BigNum { + limbs: [0x855c98f03e4ec9bbc878488ea71ba8, 0x4f4d80e421236231f3707b9d46a099, 0x005765], + }, + BigNum { + limbs: [0x38476a0fc00d35443787b67158e459, 0x5805a8b95c24d107e4978e049164ba, 0x001c88], + }, + BigNum { + limbs: [0xa9e6457cbef76d1fccde66fc588d7d, 0x6964e2c2128178dec9a67d6bf69ab1, 0x004c6b], + }, + BigNum { + limbs: [0x13bdbd833f6491e033219803a77284, 0x3dee46db6ac6ba5b0e618c35e16aa2, 0x002782], + }, + BigNum { + limbs: [0x0ab900fdd04ba0c27a1a12d0f2c7b4, 0x958f86d2b38d13cebad18da8de97be, 0x004fe1], + }, + BigNum { + limbs: [0xb2eb02022e105e3d85e5ec2f0d384d, 0x11c3a2cac9bb1f6b1d367bf8f96d95, 0x00240c], + }, + BigNum { + limbs: [0xfec709676525a283ae887be3b065d2, 0x31dc646483ada7ec9b7504f5c08d9a, 0x004ea3], + }, + BigNum { + limbs: [0xbedcf99899365c7c5177831c4f9a2f, 0x7576c538f99a8b4d3c9304ac1777b8, 0x00254a], + }, + BigNum { + limbs: [0x6236400ce1a035463b81e35706dc93, 0x794174efafe9bbb1da00479695453e, 0x0008ab], + }, + BigNum { + limbs: [0x5b6dc2f31cbbc9b9c47e1ba8f9236e, 0x2e11b4adcd5e7787fe07c20b42c015, 0x006b42], + }, + BigNum { + limbs: [0xac3ff58faca4e3edadb1101621f8bf, 0x844c97b849b37e115e7879e5fe85de, 0x003d52], + }, + BigNum { + limbs: [0x11640d7051b71b12524eeee9de0742, 0x230691e53394b528798f8fbbd97f75, 0x00369b], + }, + BigNum { + limbs: [0x7c85bcff563e231e8623e352e51c35, 0xcdffedfad78d5fe87ca61ae9abc08f, 0x002b43], + }, + BigNum { + limbs: [0x411e4600a81ddbe179dc1bad1ae3cc, 0xd9533ba2a5bad3515b61eeb82c44c4, 0x0048a9], + }, + BigNum { + limbs: [0xa804027c23b9f95376802e91e05be8, 0xe9c4cef6cbefe6c9741d8956584aee, 0x001cdb], + }, + BigNum { + limbs: [0x15a00083daa205ac897fd06e1fa419, 0xbd8e5aa6b1584c7063ea804b7fba65, 0x005711], + }, + BigNum { + limbs: [0x0e0cd54bd4aa61826d2d37f94a447f, 0x63512d6507eff7e74e36ebb406ab4a, 0x0065c6], + }, + BigNum { + limbs: [0xaf972db429b19d7d92d2c706b5bb82, 0x4401fc3875583b5289d11dedd15a09, 0x000e27], + }, + BigNum { + limbs: [0x1d8f59d2e0d8f517d1f555defa4965, 0xce0a6cf41e04d1f37da3193dc2f7e1, 0x000e39], + }, + BigNum { + limbs: [0xa014a92d1d8309e82e0aa92105b69c, 0xd948bca95f4361465a64f064150d72, 0x0065b3], + }, + BigNum { + limbs: [0xe9debb01a73a7d2d2fd8f2b8879fa4, 0x9ddf450c9503f6d1e86fff13f87f5a, 0x0010af], + }, + BigNum { + limbs: [0xd3c547fe572181d2d0270c4778605d, 0x0973e490e8443c67ef980a8ddf85f8, 0x00633e], + }, + BigNum { + limbs: [0x82a869b076061adec6750f6279f487, 0xe06fd1d55ed610877582a2642dfdc9, 0x0052c8], + }, + BigNum { + limbs: [0x3afb994f8855e421398aef9d860b7a, 0xc6e357c81e7222b26285673daa078a, 0x002124], + }, + BigNum { + limbs: [0xcd0477f8b300e2e8072dcdffa22a4b, 0x0427dc1ed46b959d6213b9fb9ca34b, 0x006cfb], + }, + BigNum { + limbs: [0xf09f8b074b5b1c17f8d231005dd5b6, 0xa32b4d7ea8dc9d9c75f44fa63b6207, 0x0006f2], + }, + BigNum { + limbs: [0x6e9b05922fb4ca4db6496c5f476610, 0x7f60ea83e3914376d6422502433719, 0x004ee5], + }, + BigNum { + limbs: [0x4f08fd6dcea734b249b692a0b899f1, 0x27f23f1999b6efc301c5e49f94ce3a, 0x002508], + }, + BigNum { + limbs: [0xa62fc0089b634dbf2aac25d7d75fee, 0xdb944f0c588276cb7f8865b7d9ba3e, 0x0035ed], + }, + BigNum { + limbs: [0x177442f762f8b140d553d92828a013, 0xcbbeda9124c5bc6e587fa3e9fe4b15, 0x003dff], + }, + BigNum { + limbs: [0x98290aa8b6ad53f2043aa3f401dfdc, 0x09673fc03acedd09ac836e1ca7736a, 0x0053e1], + }, + BigNum { + limbs: [0x257af85747aeab0dfbc55b0bfe2025, 0x9debe9dd427956302b849b853091e9, 0x00200c], + }, + BigNum { + limbs: [0x647448c7b0afb7ec1c61775ab7abdd, 0x889ebec7d61b637217c82c971d9e4f, 0x005239], + }, + BigNum { + limbs: [0x592fba384dac4713e39e87a5485424, 0x1eb46ad5a72ccfc7c03fdd0aba6704, 0x0021b4], + }, + BigNum { + limbs: [0xfdccab18b6ef1df95145ce9d220f41, 0xae5fde2b4f5827052bda8626455524, 0x0033b2], + }, + BigNum { + limbs: [0xbfd757e7476ce106aeba3062ddf0c0, 0xf8f34b722df00c34ac2d837b92b02e, 0x00403a], + }, + BigNum { + limbs: [0x48364c6d02ded0006ae02ab74add69, 0x07e0704b0c97aead5c4e44e64375c3, 0x000c8d], + }, + BigNum { + limbs: [0x756db692fb7d2eff951fd448b52298, 0x9f72b95270b0848c7bb9c4bb948f90, 0x006760], + }, + BigNum { + limbs: [0x0fa82de7378c5647041bcb6bd46fcc, 0x5e373ec8ee1bbc8c8f5360d1f7b0e5, 0x00450a], + }, + BigNum { + limbs: [0xadfbd518c6cfa8b8fbe433942b9035, 0x491bead48f2c76ad48b4a8cfe0546e, 0x002ee3], + }, + BigNum { + limbs: [0xd7924989f5052ba483ec3b98206641, 0xa817449255ff6eb0398da5372b4151, 0x0008d0], + }, + BigNum { + limbs: [0xe611b9760956d35b7c13c367df99c0, 0xff3be50b2748c4899e7a646aacc401, 0x006b1c], + }, + BigNum { + limbs: [0xcaad5df72cd49bbe86414d32e186de, 0xdad728f81f15d7ed9ff23c94d4b3e1, 0x00493c], + }, + BigNum { + limbs: [0xf2f6a508d187634179beb1cd1e7923, 0xcc7c00a55e325b4c3815cd0d035171, 0x002ab0], + }, + BigNum { + limbs: [0x1247f31227b7d49e32a2c19d55f8d3, 0xded3eebc215ddeea461ee0cd7d94d6, 0x001f0e], + }, + BigNum { + limbs: [0xab5c0fedd6a42a61cd5d3d62aa072e, 0xc87f3ae15bea544f91e928d45a707d, 0x0054de], + }, + BigNum { + limbs: [0xdc89075d67ed7e317050f884ca576b, 0x281b92bda8a01a3a778c086ff4e1ad, 0x0001ed], + }, + BigNum { + limbs: [0xe11afba2966e80ce8faf067b35a896, 0x7f3796dfd4a818ff607c0131e323a5, 0x007200], + }, + BigNum { + limbs: [0xcdb87cb712877e0bf60e7c63c2437b, 0x4efb2363ab2f1ff78cb0023480e8f9, 0x001a6f], + }, + BigNum { + limbs: [0xefeb8648ebd480f409f1829c3dbc86, 0x58580639d21913424b58076d571c59, 0x00597e], + }, + BigNum { + limbs: [0xd45c8361c9f7297117194176b34fcd, 0xabbd11933f13d0bd028d2df1d8d2ea, 0x00657c], + }, + BigNum { + limbs: [0xe9477f9e3464d58ee8e6bd894cb034, 0xfb96180a3e34627cd57adbafff3268, 0x000e70], + }, + BigNum { + limbs: [0xf77a7bafa8af3673a70628281b1030, 0x37b660a6007a671cd104321d3da423, 0x00523d], + }, + BigNum { + limbs: [0xc629875055acc88c58f9d6d7e4efd1, 0x6f9cc8f77ccdcc1d0703d7849a612f, 0x0021b0], + }, + BigNum { + limbs: [0xa5adf88739a7bd9d7f8fd7d5e17d4c, 0xa451b990fd38ff18af03ba072d922e, 0x0030ed], + }, + BigNum { + limbs: [0x17f60a78c4b441628070272a1e82b5, 0x0301700c800f342129044f9aaa7325, 0x004300], + }, + BigNum { + limbs: [0xd55f49d6b5a1fa4a715cef814e4239, 0x8cd22f924921ab164cf3cbcd563e6d, 0x005b3b], + }, + BigNum { + limbs: [0xe844b92948ba04b58ea30f7eb1bdc8, 0x1a80fa0b342688238b143dd481c6e5, 0x0018b2], + }, + BigNum { + limbs: [0xaa756712f2bc015611aad4215f6c1d, 0x446d71965b3a8e20c5aa738a332574, 0x001a1a], + }, + BigNum { + limbs: [0x132e9bed0b9ffda9ee552adea093e4, 0x62e5b807220da519125d9617a4dfdf, 0x0059d3], + }, + BigNum { + limbs: [0xdf1a3727fd721d20a3252151ac98a0, 0x0d63de7126601d7386b1d14b886090, 0x001c40], + }, + BigNum { + limbs: [0xde89cbd800e9e1df5cdaddae536761, 0x99ef4b2c56e815c6515638564fa4c2, 0x0057ad], + }, + BigNum { + limbs: [0xfb22b17b1b8fce193fef7af0333d31, 0x8d54f1ac8eda45244257bc7eed74d0, 0x001373], + }, + BigNum { + limbs: [0xc2815184e2cc30e6c010840fccc2d0, 0x19fe37f0ee6dee1595b04d22ea9082, 0x00607a], + }, + BigNum { + limbs: [0xd94eb86ff1ed3c7833cda901f237d1, 0x6cac58e7d4d227ece7306d1ad0f73b, 0x003446], + }, + BigNum { + limbs: [0xe4554a900c6ec287cc3255fe0dc830, 0x3aa6d0b5a8760b4cf0d79c87070e17, 0x003fa7], + }, + BigNum { + limbs: [0x0a0b6dc3344e9740aa98279de1d272, 0x396f0bbba2006c10dffbc6e2ccfd1f, 0x0043ce], + }, + BigNum { + limbs: [0xb398953cca0d67bf5567d7621e2d8f, 0x6de41de1db47c728f80c42bf0b0834, 0x00301f], + }, + BigNum { + limbs: [0x2774aacbd8e5410e990b7ea6099539, 0x0ff19575c66a5d823a24eadcf44034, 0x00013a], + }, + BigNum { + limbs: [0x962f58342576bdf166f48059f66ac8, 0x97619427b6ddd5b79de31ec4e3c51f, 0x0072b3], + }, + BigNum { + limbs: [0x98cfc228cdac64c0f4b12f26fbee10, 0x608230bf89f522f30a822df80cebab, 0x006bbe], + }, + BigNum { + limbs: [0x24d440d730af9a3f0b4ecfd90411f1, 0x46d0f8ddf3531046cd85dba9cb19a8, 0x00082f], + }, + BigNum { + limbs: [0xfcae5ba09e0c9e7936dad504dd20d8, 0xd14ad990c5d94abc61794fedbb7b37, 0x0004fd], + }, + BigNum { + limbs: [0xc0f5a75f604f6086c92529fb22df29, 0xd608500cb76ee87d768eb9b41c8a1b, 0x006eef], + }, + BigNum { + limbs: [0x2dd2cd0d439bf99df86a7b583e6a7a, 0x334ff56b12c0fe4d544102494ce813, 0x000313], + }, + BigNum { + limbs: [0x8fd135f2bac00562079583a7c19587, 0x740334326a8734ec83c707588b1d40, 0x0070da], + }, + BigNum { + limbs: [0x012acc92ab4930bd516cd62ba82664, 0xc77d512a5bc54b53c2020e1531be45, 0x0008b1], + }, + BigNum { + limbs: [0xbc79366d5312ce42ae9328d457d99d, 0xdfd5d8732182e7e61605fb8ca6470e, 0x006b3b], + }, + BigNum { + limbs: [0xa0896f1080c1eee49d3bc9f665878a, 0x46f8c3bf1cc0a4b9f13d221641f726, 0x0029aa], + }, + BigNum { + limbs: [0x1d1a93ef7d9a101b62c435099a7877, 0x605a65de60878e7fe6cae78b960e2d, 0x004a43], + }, + BigNum { + limbs: [0x53929cdf5d53f68046a0338d19eb21, 0x4ecf71c935ff0ddb58cba88e385eb4, 0x00701c], + }, + BigNum { + limbs: [0x6a116620a108087fb95fcb72e614e0, 0x5883b7d44749255e7f3c61139fa69f, 0x0003d1], + }, + BigNum { + limbs: [0x4d116daf42538b08c8845e74a76e3c, 0x3df169bd66227d167a1aa89fd1bf92, 0x006073], + }, + BigNum { + limbs: [0x70929550bc0873f7377ba08b5891c5, 0x6961bfe01725b6235ded61020645c1, 0x00137a], + }, + BigNum { + limbs: [0x7ec84bcbd1676791088fac0c4f9032, 0x2f32a44ea3b5e5353491392eb969f1, 0x004928], + }, + BigNum { + limbs: [0x3edbb7342cf4976ef77052f3b06fcf, 0x7820854ed9924e04a376d0731e9b62, 0x002ac5], + }, + BigNum { + limbs: [0x9fefa0239bcb3e8a28db7c68591369, 0xab965ee2dd62dc7f696be9aa0ec978, 0x0028e0], + }, + BigNum { + limbs: [0x1db462dc6290c075d7248297a6ec98, 0xfbbccaba9fe556ba6e9c1ff7c93bdb, 0x004b0c], + }, + BigNum { + limbs: [0xb1df0d7f11055f353f8e344469d5db, 0xee2957ec3250ae111cfbdc4970ab0d, 0x006a85], + }, + BigNum { + limbs: [0x0bc4f580ed569fcac071cabb962a26, 0xb929d1b14af78528bb0c2d58675a46, 0x000967], + }, + BigNum { + limbs: [0xcaf14f19ed7d03a0f0d6fddf65ab78, 0x1d09b8983f31effc399a99a0f0774b, 0x001ce3], + }, + BigNum { + limbs: [0xf2b2b3e610defb5f0f2901209a5489, 0x8a4971053e16433d9e6d7000e78e07, 0x00570a], + }, + BigNum { + limbs: [0x0eb926614be1a588cdfcb063137ed0, 0xde7ab1959c4bc6a2ed06d37f167a03, 0x00407f], + }, + BigNum { + limbs: [0xaeeadc9eb27a597732034e9cec8131, 0xc8d87807e0fc6c96eb013622c18b50, 0x00336d], + }, + BigNum { + limbs: [0x7ea24c2e5ec8f8aa638667dde3590d, 0x5373bf1e91d9fef178082e44ecc0c7, 0x002ce4], + }, + BigNum { + limbs: [0x3f01b6d19f9306559c7997221ca6f4, 0x53df6a7eeb6e34485fffdb5ceb448c, 0x004709], + }, + BigNum { + limbs: [0x908be130f926723ad61f87d207308f, 0xd1772f77e6a8eea341e88434f19304, 0x004a4c], + }, + BigNum { + limbs: [0x2d1821cf05358cc529e0772df8cf72, 0xd5dbfa25969f4496961f856ce6724f, 0x0029a0], + }, + BigNum { + limbs: [0xe8222d4428fff63a9a7c5389c73e8f, 0x6f9d1eeb0abdf3bac4d64a36538a64, 0x007363], + }, + BigNum { + limbs: [0xd581d5bbd55c08c56583ab7638c172, 0x37b60ab2728a3f7f1331bf6b847aee, 0x00008a], + }, + BigNum { + limbs: [0x931b5f8b6cbdcc7974730b5c3ba924, 0x64469d1accc8fc62eef966d0253b7f, 0x003675], + }, + BigNum { + limbs: [0x2a88a374919e32868b8cf3a3c456dd, 0x430c8c82b07f36d6e90ea2d1b2c9d4, 0x003d78], + }, + BigNum { + limbs: [0x67e34e22abef508c9d7369401c9ce9, 0x6cd186a4d1bf23bfab53572bc8e62a, 0x007179], + }, + BigNum { + limbs: [0x55c0b4dd526cae73628c95bfe36318, 0x3a81a2f8ab890f7a2cb4b2760f1f29, 0x000274], + }, + BigNum { + limbs: [0x523efd9a4034293bcb639a86de8161, 0x70e5bd7314ec89710171d3095acded, 0x002dc3], + }, + BigNum { + limbs: [0x6b650565be27d5c4349c6479217ea0, 0x366d6c2a685ba9c8d69636987d3766, 0x00462a], + }, + BigNum { + limbs: [0xdc86cb3ee5aeda0dc44788191c6694, 0x85025f6fc6b635ee1289a4af9cc708, 0x000a03], + }, + BigNum { + limbs: [0xe11d37c118ad24f23bb876e6e3996d, 0x2250ca2db691fd4bc57e64f23b3e4a, 0x0069ea], + }, + BigNum { + limbs: [0xfb20b8ec99d14e44d969247a3b9ea0, 0x8d984cf2bbe3e84864fbbaf6ca1a19, 0x003a17], + }, + BigNum { + limbs: [0xc2834a13648ab0bb2696da85c46161, 0x19badcaac1644af1730c4eab0deb39, 0x0039d6], + }, + BigNum { + limbs: [0x3e4ce9b0b4d29e8ddb46c387d94289, 0x9c0f10c48a5ee2c04f5308e4117c29, 0x006e01], + }, + BigNum { + limbs: [0x7f57194f4989607224b93b7826bd78, 0x0b4418d8f2e9507988b500bdc6892a, 0x0005ec], + }, + BigNum { + limbs: [0x0843767d0372343f1f18f7ffc6877b, 0x6f733cc9941e4d1f292459f8fcb93b, 0x000f19], + }, + BigNum { + limbs: [0xb5608c82fae9cac0e0e70700397886, 0x37dfecd3e929e61aaee3afa8db4c18, 0x0064d4], + }, + BigNum { + limbs: [0x88b0025d0d21897a73822ebdcd10f4, 0xad7c3cd1771ded6b0d595d2df89be8, 0x00255b], + }, + BigNum { + limbs: [0x34f400a2f13a75858c7dd04232ef0d, 0xf9d6eccc062a45cecaaeac73df696b, 0x004e91], + }, + BigNum { + limbs: [0x33a0cc91de22b00210a61427617e32, 0xf107893997a09e1935feb8328692f2, 0x003e5f], + }, + BigNum { + limbs: [0x8a03366e20394efdef59ead89e81cf, 0xb64ba063e5a79520a209516f517261, 0x00358d], + }, + BigNum { + limbs: [0xaba4806747cbbb3ed3c6695778c414, 0x6b7fc7d64506fd4c8ab2f0d9a0c2ef, 0x001fd5], + }, + BigNum { + limbs: [0x11ff8298b69043c12c3995a8873bed, 0x3bd361c7384135ed4d5518c8374264, 0x005418], + }, + BigNum { + limbs: [0x9793cdc553268fdb8c8c9df25f113f, 0xc8b8a6bed3ce2e4295f13884893e82, 0x00569a], + }, + BigNum { + limbs: [0x2610353aab356f247373610da0eec2, 0xde9a82dea97a04f74216d11d4ec6d1, 0x001d52], + }, + BigNum { + limbs: [0x48c725f84f95c141afaf92fc44c150, 0x2ec90d8645b8541c402b6099de87a6, 0x006430], + }, + BigNum { + limbs: [0x74dcdd07aec63dbe50506c03bb3eb1, 0x788a1c17378fdf1d97dca907f97dad, 0x000fbd], + }, + BigNum { + limbs: [0x3d298b3fdcee949d23158904db414e, 0x5b2f0cdcb97b5ef4890c09efc1b9e8, 0x002c4a], + }, + BigNum { + limbs: [0x807a77c0216d6a62dcea75fb24beb3, 0x4c241cc0c3ccd4454efbffb2164b6b, 0x0047a3], + }, + BigNum { + limbs: [0x54bc8d5e005d10a64eed6a5818a4bf, 0x165bdc32edd97d8cc8889c8a298881, 0x005ab7], + }, + BigNum { + limbs: [0x68e775a1fdfeee59b11294a7e75b42, 0x90f74d6a8f6eb5ad0f7f6d17ae7cd2, 0x001936], + }, + BigNum { + limbs: [0x5d543983bbd49126324200928abe0a, 0x82d48a57fa1bf0d2b13a179c103085, 0x005e68], + }, + BigNum { + limbs: [0x604fc97c42876dd9cdbdfe6d7541f7, 0x247e9f45832c426726cdf205c7d4ce, 0x001585], + }, + BigNum { + limbs: [0x4959e25753f8727e4cddf5bbcf9e2e, 0x0e9ae069d4854261fc6d52cd9f472f, 0x001c9a], + }, + BigNum { + limbs: [0x744a20a8aa638c81b32209443061d3, 0x98b84933a8c2f0d7db9ab6d438be24, 0x005753], + }, + BigNum { + limbs: [0xfb52a4a4084049b64635a1fca37cd4, 0x97060617002b139d9e55125fd6a0da, 0x0006a1], + }, + BigNum { + limbs: [0xc2515e5bf61bb549b9ca5d035c832d, 0x104d23867d1d1f9c39b2f742016478, 0x006d4c], + }, + BigNum { + limbs: [0x46b757d37646ad5f6ed9d54ebc7dfd, 0x115e1973082b57191cb038744d3fda, 0x0059ad], + }, + BigNum { + limbs: [0x76ecab2c881551a0912629b1438204, 0x95f5102a751cdc20bb57d12d8ac579, 0x001a40], + }, + BigNum { + limbs: [0x3a3fdb27ce4620c9037884585beeed, 0x7ba852c1b35fd6ee452a97c16ac388, 0x004c29], + }, + BigNum { + limbs: [0x836427d83015de36fc877aa7a41114, 0x2baad6dbc9e85c4b92dd71e06d41cb, 0x0027c4], + }, + BigNum { + limbs: [0x5007e38c90bf5a1406a9e74470eb1c, 0x2d7256bac7644923c535f42197488e, 0x0059a7], + }, + BigNum { + limbs: [0x6d9c1f736d9ca4ebf95617bb8f14e5, 0x79e0d2e2b5e3ea1612d2158040bcc5, 0x001a46], + }, + BigNum { + limbs: [0x58596cd9180f6351eeda0bf1f9d15c, 0xdbac48ffd83b5b50fba542ee045f2d, 0x000cc1], + }, + BigNum { + limbs: [0x654a9626e64c9bae1125f30e062ea5, 0xcba6e09da50cd7e8dc62c6b3d3a626, 0x00672b], + }, + BigNum { + limbs: [0xda385259825e8ff7de74762844b59b, 0x8d1d32ee41ea7fa57c0bb07ba2861e, 0x004a07], + }, + BigNum { + limbs: [0xe36bb0a67bfd6f08218b88d7bb4a66, 0x1a35f6af3b5db3945bfc5926357f34, 0x0029e6], + }, + BigNum { + limbs: [0x663b19281ecf204a13c9090a5de344, 0x6cb1b8029d0f4ea7520a9e1f45fed2, 0x000264], + }, + BigNum { + limbs: [0x5768e9d7df8cdeb5ec36f5f5a21cbd, 0x3aa1719ae038e49285fd6b82920681, 0x007189], + }, + BigNum { + limbs: [0x424c5b7c97a6d27d1881b7fb2a11e6, 0x8b263946eb224cb0fea682711f56cf, 0x000526], + }, + BigNum { + limbs: [0x7b57a78366b52c82e77e4704d5ee1b, 0x1c2cf0569225e688d9618730b8ae84, 0x006ec7], + }, + BigNum { + limbs: [0xbf61c5f3d0832796c52d21fbc61f0f, 0xb379c9183ffc813bcf1073aceca325, 0x000ef4], + }, + BigNum { + limbs: [0xfe423d0c2dd8d7693ad2dd0439e0f2, 0xf3d960853d4bb1fe08f795f4eb622d, 0x0064f8], + }, + BigNum { + limbs: [0xe3a6cd55d29c43736afc498dd8c1d1, 0xa19828da9aab0564b5a8d1072ba42b, 0x00445e], + }, + BigNum { + limbs: [0xd9fd35aa2bbfbb8c9503b572273e30, 0x05bb00c2e29d2dd5225f389aac6127, 0x002f8f], + }, + BigNum { + limbs: [0xead8a0448ecebabcdf1235752b0ef3, 0xe8ee9237909732d4a06d7aa57eb71b, 0x006bcb], + }, + BigNum { + limbs: [0xd2cb62bb6f8d444320edc98ad4f10e, 0xbe649765ecb10065379a8efc594e37, 0x000821], + }, + BigNum { + limbs: [0x4119ad873614884d66efb4fed2279a, 0xd9900b7ae25a95dfadf106e3f002de, 0x005ae6], + }, + BigNum { + limbs: [0x7c8a5578c84776b299104a012dd867, 0xcdc31e229aed9d5a2a1702bde80275, 0x001906], + }, + BigNum { + limbs: [0xb4f7967f7e42a5fda4841718420054, 0x2f3fb51cf0a715d27b6251fc311c17, 0x0062fb], + }, + BigNum { + limbs: [0x08ac6c80801959025b7be7e7bdffad, 0x781374808ca11d675ca5b7a5a6e93c, 0x0010f2], + }, + BigNum { + limbs: [0x180e0e8b24f12309f239f760b82267, 0xba636d174692ad5a534045625d9514, 0x0058c3], + }, + BigNum { + limbs: [0xa595f474d96adbf60dc6079f47dd9a, 0xecefbc8636b585df84c7c43f7a703f, 0x001b29], + }, + BigNum { + limbs: [0xc7e8901137ff0153a93b55b4fea0eb, 0xc4a69476d9fc4bb6f34c1c58a0568e, 0x000e7c], + }, + BigNum { + limbs: [0xf5bb72eec65cfdac56c4a94b015f16, 0xe2ac9526a34be782e4bbed4937aec4, 0x006570], + }, + BigNum { + limbs: [0x72a5c3f51c283524eb6f79660ba729, 0x4cc8ec848f9932f96660e46b8b0362, 0x00548e], + }, + BigNum { + limbs: [0x4afe3f0ae233c9db14908599f458d8, 0x5a8a3d18edaf004071a725364d01f1, 0x001f5f], + }, + BigNum { + limbs: [0xb69e5da3889e1b2613fb0ba0d0c8b9, 0x48f2bdc1f969a35750fccdbd565adc, 0x0045f4], + }, + BigNum { + limbs: [0x0705a55c75bde3d9ec04f35f2f3748, 0x5e606bdb83de8fe2870b3be481aa77, 0x002df9], + }, + BigNum { + limbs: [0xeeae11e7bccf3f082cf84eeb77b539, 0xd3cae75d7dcbb02266098876489699, 0x006a92], + }, + BigNum { + limbs: [0xcef5f118418cbff7d307b014884ac8, 0xd388423fff7c831771fe812b8f6eb9, 0x00095a], + }, + BigNum { + limbs: [0x9edcfa443aea1905a885cb88412fc6, 0x71fcb801d5d5172aa6aa52827f4c0e, 0x00140c], + }, + BigNum { + limbs: [0x1ec708bbc371e5fa577a3377bed03b, 0x3556719ba7731c0f315db71f58b945, 0x005fe1], + }, + BigNum { + limbs: [0x2c95af5bc18faa930fa010bc171746, 0x7dc1d3176b166ae305e12c0d0f3845, 0x003659], + }, + BigNum { + limbs: [0x910e53a43ccc546cf05fee43e8e8bb, 0x299156861231c856d226dd94c8cd0e, 0x003d94], + }, + BigNum { + limbs: [0x85a508df2452feef976635fc779c0c, 0x54744d4336448dd7a2cb1fe4cabc60, 0x00509e], + }, + BigNum { + limbs: [0x37fefa20da0900106899c9038863f5, 0x52dedc5a4703a562353ce9bd0d48f3, 0x00234f], + }, + BigNum { + limbs: [0x2a457ac1b1515e66caf0bfe0dc71bd, 0xde54f97535615e9a245b3b982d893b, 0x007033], + }, + BigNum { + limbs: [0x935e883e4d0aa099350f3f1f238e44, 0xc8fe302847e6d49fb3acce09aa7c18, 0x0003b9], + }, + BigNum { + limbs: [0xe681ffa04fd14425cd201433440674, 0xde62396f17618541eba544010dc6e2, 0x0031d2], + }, + BigNum { + limbs: [0xd722035fae8abada32dfeaccbbf98d, 0xc8f0f02e65e6adf7ec62c5a0ca3e70, 0x00421a], + }, + BigNum { + limbs: [0x52dc972de8dd1ae0ef5504d0804371, 0xd7d00aa6d47ea06254fd521a05e75b, 0x0063c3], + }, + BigNum { + limbs: [0x6ac76bd2157ee41f10aafa2f7fbc90, 0xcf831ef6a8c992d7830ab787d21df8, 0x001029], + }, + BigNum { + limbs: [0x4804de0259a52492093ce6634374ea, 0x74a1cf96403463f289036f16b94858, 0x002037], + }, + BigNum { + limbs: [0x759f24fda4b6da6df6c3189cbc8b17, 0x32b15a073d13cf474f049a8b1ebcfb, 0x0053b6], + }, + BigNum { + limbs: [0x0b4a6523f47a1ff8e0b04c3b1af356, 0x83b623d916a3ad6c4c7ac3494271a8, 0x005a8d], + }, + BigNum { + limbs: [0xb2599ddc09e1df071f4fb2c4e50cab, 0x239d05c466a485cd8b8d46589593ab, 0x001960], + }, + BigNum { + limbs: [0x3acd5edbf5700358a7bfe4303c5b1e, 0xb52b913e7460fc8fc271fb692c97c4, 0x0021a2], + }, + BigNum { + limbs: [0x82d6a42408ebfba758401acfc3a4e3, 0xf227985f08e736aa15960e38ab6d8f, 0x00524a], + }, + BigNum { + limbs: [0x751f4f8dda18c726694b3c0708989b, 0x74e808084266d6dc71af08a18e5f03, 0x000d2f], + }, + BigNum { + limbs: [0x4884b372244337d996b4c2f8f76766, 0x326b21953ae15c5d6659010049a650, 0x0066be], + }, + BigNum { + limbs: [0x4d9b4898d2ec0030ad1815af2831cb, 0xb9b40807616a9227838f3a3ed300cf, 0x003d4c], + }, + BigNum { + limbs: [0x7008ba672b6ffecf52e7e950d7ce36, 0xed9f21961bdda1125478cf63050484, 0x0036a0], + }, + BigNum { + limbs: [0x5661caa9b88f7bc99c409c32cbe93c, 0x81febdfe94276a8aad8807a5d7050b, 0x006767], + }, + BigNum { + limbs: [0x6742385645cc833663bf62cd3416c5, 0x25546b9ee920c8af2a8001fc010048, 0x000c86], + }, + BigNum { + limbs: [0xe1b8db4b0c6ea3ab3dcd74abc0acc5, 0x518f26f7d15431ab14182ee5361144, 0x003309], + }, + BigNum { + limbs: [0xdbeb27b4f1ed5b54c2328a543f533c, 0x55c402a5abf4018ec3efdabca1f40e, 0x0040e4], + }, + BigNum { + limbs: [0xef2afdb60852031c3f34a887d3c3e1, 0xcb3506e60a81f0394c93a42b5b72e9, 0x00064c], + }, + BigNum { + limbs: [0xce790549f609fbe3c0cb56782c3c20, 0xdc1e22b772c643008b7465767c9269, 0x006da0], + }, + BigNum { + limbs: [0x8cdb76a42676ccb187cd4b5130698f, 0x41db3bd37280e077b68e7eab756cb8, 0x006959], + }, + BigNum { + limbs: [0x30c88c5bd7e5324e7832b3aecf9672, 0x6577edca0ac752c221798af662989b, 0x000a94], + }, + BigNum { + limbs: [0xb80be01829aa6e6b4e1dd7a6e41adf, 0x6de1daf8905fb9f70b105865f3b1cf, 0x004c84], + }, + BigNum { + limbs: [0x059822e7d4b19094b1e227591be522, 0x39714ea4ece87942ccf7b13be45384, 0x002769], + }, + BigNum { + limbs: [0xcad3633089749adf4e63d01af609aa, 0x0be46010a6b28fce2e90dce28a6db3, 0x003d3e], + }, + BigNum { + limbs: [0xf2d09fcf74e76420b19c2ee509f657, 0x9b6ec98cd695a36ba9772cbf4d979f, 0x0036af], + }, + BigNum { + limbs: [0x3fe56d15f19fd9d3a88f9769d85682, 0xa2628ede060eab8f2d5800a8be3b0f, 0x006281], + }, + BigNum { + limbs: [0x7dbe95ea0cbc252c5770679627a97f, 0x04f09abf773987aaaab008f919ca44, 0x00116c], + }, + BigNum { + limbs: [0x33b77d2d66205cd6436789acd58a6a, 0x0e51924a73f486c6d515c6dbbd56d8, 0x00661d], + }, + BigNum { + limbs: [0x89ec85d2983ba229bc9875532a7597, 0x990197530953ac7302f242c61aae7b, 0x000dd0], + }, + BigNum { + limbs: [0xbbd52b782f347dae0408970b4aab1a, 0x678caa916b48f296454a57be9a3dd2, 0x000554], + }, + BigNum { + limbs: [0x01ced787cf278151fbf767f4b554e7, 0x3fc67f0c11ff40a392bdb1e33dc781, 0x006e99], + }, + BigNum { + limbs: [0x7fe07d8d824b70a6b05f18a33c32b1, 0x4018a4fba9970315f7d6239cfdfbbe, 0x004ea9], + }, + BigNum { + limbs: [0x3dc385727c108e594fa0e65cc3cd50, 0x673a84a1d3b13023e031e604da0995, 0x002544], + }, + BigNum { + limbs: [0x50bf4dbafd02920d87e416425a1f5b, 0x43b8831183496fc9fedba1ca177ecf, 0x004c47], + }, + BigNum { + limbs: [0x6ce4b54501596cf2781be8bda5e0a6, 0x639aa68bf9fec36fd92c67d7c08684, 0x0027a6], + }, + BigNum { + limbs: [0x9c92782418d9a6f68d125f81344d2e, 0x3ae417d106a4752a779731a01e141a, 0x0005a4], + }, + BigNum { + limbs: [0x21118adbe582580972ed9f7ecbb2d3, 0x6c6f11cc76a3be0f6070d801b9f139, 0x006e49], + }, + BigNum { + limbs: [0xa9568098dc13297c139a093efa1190, 0x1f8538db87179f115b32fd34f9e257, 0x0044e7], + }, + BigNum { + limbs: [0x144d82672248d583ec65f5c105ee71, 0x87cdf0c1f63094287cd50c6cde22fc, 0x002f06], + }, + BigNum { + limbs: [0xdb59a295eea1fad891f7ce48c338da, 0x0bc19af45832cd3e67ec475459da28, 0x001a56], + }, + BigNum { + limbs: [0xe24a606a0fba04276e0830b73cc727, 0x9b918ea9251565fb701bc24d7e2b2a, 0x005997], + }, + BigNum { + limbs: [0x7cc816a910521c8f7f77012d9d64d2, 0xfd5789c0e146b081e9cf98bbfed9d6, 0x00483a], + }, + BigNum { + limbs: [0x40dbec56ee09e2708088fdd2629b2f, 0xa9fb9fdc9c0182b7ee3870e5d92b7d, 0x002bb2], + }, + BigNum { + limbs: [0xc356be3d0f029aa409d9ee00585213, 0xb147452598293eb810c81a72553cb7, 0x0025b3], + }, + BigNum { + limbs: [0xfa4d44c2ef59645bf62610ffa7adee, 0xf60be477e51ef481c73fef2f82c89b, 0x004e39], + }, + BigNum { + limbs: [0xb871097a9f0c6f53f1742ce989b5a2, 0xdd8280effb6326d76b58b9434f6ec5, 0x00686f], + }, + BigNum { + limbs: [0x0532f9855f4f8fac0e8bd216764a5f, 0xc9d0a8ad81e50c626caf505e88968e, 0x000b7d], + }, + BigNum { + limbs: [0x1a129e137f0039c2fcba24fbaa6740, 0xaf9519ca80d68d67bc688c2a21ffa8, 0x0046ea], + }, + BigNum { + limbs: [0xa39164ec7f5bc53d0345da045598c1, 0xf7be0fd2fc71a5d21b9f7d77b605ab, 0x002d02], + }, + BigNum { + limbs: [0x077dddb5761a734e2a017e4ffb6836, 0xe1e4f08eb7ec1e23d4338ba1fdbc33, 0x00099a], + }, + BigNum { + limbs: [0xb626254a88418bb1d5fe80b00497cb, 0xc56e390ec55c151603d47dffda4920, 0x006a52], + }, + BigNum { + limbs: [0xc00f384e56df5ab098af553e858ddc, 0x772639e0f2e0bdf93ce28c12b17e9a, 0x003d4d], + }, + BigNum { + limbs: [0xfd94cab1a77ca44f6750a9c17a7225, 0x302cefbc8a6775409b257d8f2686b8, 0x0036a0], + }, + BigNum { + limbs: [0xbbcd0457572ea4ba6f047a391e07cd, 0xdb9969605428e20283d330193c8c22, 0x00227d], + }, + BigNum { + limbs: [0x01d6fea8a72d5a4590fb84c6e1f834, 0xcbb9c03d291f51375434d9889b7931, 0x00516f], + }, + BigNum { + limbs: [0x3d78a715d35e675f5607600ebe8e85, 0x45bcd7037c97ac5bec5d064c7b2fa1, 0x0068c0], + }, + BigNum { + limbs: [0x802b5bea2afd97a0a9f89ef141717c, 0x6196529a00b086ddebab03555cd5b2, 0x000b2d], + }, + BigNum { + limbs: [0x5255f97b2f5f8a3aab39c40d504e47, 0x3931c4e8a3365aa19c692fd480ceff, 0x0022e9], + }, + BigNum { + limbs: [0x6b4e0984cefc74c554c63af2afb1ba, 0x6e2164b4da11d8983b9ed9cd573654, 0x005104], + }, + BigNum { + limbs: [0xe8628b87c4717f74298e4f1f6b05b8, 0x86ffd6389f469bbcecee7941985189, 0x006d89], + }, + BigNum { + limbs: [0xd541777839ea7f8bd671afe094fa49, 0x20535364de01977ceb1990603fb3c9, 0x000664], + }, + BigNum { + limbs: [0xc4b3dde8d99b1da59b819134b83579, 0x3f3b319dd1b9a8cc0754083d8a76de, 0x001476], + }, + BigNum { + limbs: [0xf8f0251724c0e15a647e6dcb47ca88, 0x6817f7ffab8e8a6dd0b401644d8e74, 0x005f77], + }, + BigNum { + limbs: [0x5e5d72ca14bf355b2c4072b03330aa, 0xfcb9bed9a1d0c039e6a24828a4d111, 0x0044cb], + }, + BigNum { + limbs: [0x5f469035e99cc9a4d3bf8c4fcccf57, 0xaa996ac3db7772fff165c179333442, 0x002f21], + }, + BigNum { + limbs: [0xa6b76707616830fca70889363d0810, 0x474a16a937608616f4669de6d37aa6, 0x004100], + }, + BigNum { + limbs: [0x16ec9bf89cf3ce0358f775c9c2f7f1, 0x600912f445e7ad22e3a16bbb048aad, 0x0032ed], + }, + BigNum { + limbs: [0x034ce5f2a0e16cc71a57258e59e205, 0x4a3b69d18144f376ca920c31a41df2, 0x005d4a], + }, + BigNum { + limbs: [0xba571d0d5d7a9238e5a8d971a61dfc, 0x5d17bfcbfc033fc30d75fd7033e761, 0x0016a3], + }, + BigNum { + limbs: [0x479c06b64c620e54913a5fad66493e, 0xe8eccb401e43ab35fb17c2ef06e1ff, 0x004f0e], + }, + BigNum { + limbs: [0x7607fc49b1f9f0ab6ec59f5299b6c3, 0xbe665e5d5f048803dcf046b2d12354, 0x0024de], + }, + BigNum { + limbs: [0x8301162f9b026bdf8f0a899f9ee419, 0x8d97e4ea5441615140b6e155e9ab76, 0x001aa6], + }, + BigNum { + limbs: [0x3aa2ecd06359932070f57560611be8, 0x19bb44b32906d1e89751284bee59dd, 0x005947], + }, + BigNum { + limbs: [0x9c1028848c11d02b0801fe4d03f4b3, 0xddace4e38717b5fc4d667f921f06b3, 0x001110], + }, + BigNum { + limbs: [0x2193da7b724a2ed4f7fe00b2fc0b4e, 0xc9a644b9f6307d3d8aa18a0fb8fea0, 0x0062dc], + }, + BigNum { + limbs: [0x3288fa993675c6b000ebfccd728a11, 0x3393fe4edec850a6b9493521aaddad, 0x006be2], + }, + BigNum { + limbs: [0x8b1b0866c7e6384fff1402328d75f0, 0x73bf2b4e9e7fe2931ebed4802d27a6, 0x00080b], + }, + BigNum { + limbs: [0x199a38673d1c784644f6e6d10cdb65, 0x5763a14834a7853a33904d076ea499, 0x0005fe], + }, + BigNum { + limbs: [0xa409ca98c13f86b9bb09182ef3249c, 0x4fef885548a0adffa477bc9a6960ba, 0x006def], + }, + BigNum { + limbs: [0x50d9ce6be8ab7e9afd17ae1c79b3cc, 0x6f3c81d65abe294532501559ab8009, 0x003e12], + }, + BigNum { + limbs: [0x6cca349415b0806502e850e3864c35, 0x3816a7c7228a09f4a5b7f4482c854a, 0x0035db], + }, + BigNum { + limbs: [0x2086a26309099ab289450a2c8c785c, 0x78639fbbfa1a19c8f6a5547ef0cb37, 0x005cae], + }, + BigNum { + limbs: [0x9d1d609cf552644d76baf4d37387a5, 0x2eef89e1832e1970e162b522e73a1c, 0x00173f], + }, + BigNum { + limbs: [0x726a6f11fd5d1e41a26186d0f7d95a, 0x480ded0b0a2522ed236d0d4ec5e8bf, 0x005b39], + }, + BigNum { + limbs: [0x4b3993ee00fee0be5d9e782f0826a7, 0x5f453c927323104cb49afc53121c94, 0x0018b4], + }, + BigNum { + limbs: [0xac9edb793129a56d2a3526d2c2e46a, 0x40f093ad57bc107ae64b724aae15f9, 0x006831], + }, + BigNum { + limbs: [0x11052786cd325992d5cad82d3d1b97, 0x666295f0258c22bef1bc975729ef5a, 0x000bbc], + }, + BigNum { + limbs: [0x6a7dd7ea6053089d718125b7898a67, 0xf96ecc6b5153abf178d66922bda5cb, 0x005b3c], + }, + BigNum { + limbs: [0x53262b159e08f6628e7ed94876759a, 0xade45d322bf487485f31a07f1a5f88, 0x0018b0], + }, + BigNum { + limbs: [0xa04848fde48575abf74fde099c325f, 0x7857f96a44b11675db3747d3d791a7, 0x003395], + }, + BigNum { + limbs: [0x1d5bba0219d6895408b020f663cda2, 0x2efb303338971cc3fcd0c1ce0073ac, 0x004058], + }, + BigNum { + limbs: [0x69b1ce32ce51fbe4282ad9e2553334, 0x6ea21fc2a195c87adc4b385e8304b6, 0x005bd0], + }, + BigNum { + limbs: [0x53f234cd300a031bd7d5251daacccd, 0x38b109dadbb26abefbbcd14355009d, 0x00181d], + }, + BigNum { + limbs: [0x5f6c03f0f179646b0b935e5c78f259, 0x287edbd07e2b04b4c968ebc0152690, 0x005995], + }, + BigNum { + limbs: [0x5e37ff0f0ce29a94f46ca0a3870da8, 0x7ed44dccff1d2e850e9f1de1c2dec3, 0x001a58], + }, + BigNum { + limbs: [0x5ed2cf19172e412e59452c2173c6ea, 0xb895c01840aecfda8e31c5ff001739, 0x005656], + }, + BigNum { + limbs: [0x5ed133e6e72dbdd1a6bad2de8c3917, 0xeebd69853c99635f49d643a2d7ee1a, 0x001d96], + }, + BigNum { + limbs: [0x9dcb7f92ea6a9b8d444a5beec3aaaf, 0x07e606bceb10c1d6263b3c797138ff, 0x00654d], + }, + BigNum { + limbs: [0x1fd8836d13f16372bbb5a3113c5552, 0x9f6d22e092377163b1cccd2866cc54, 0x000ea0], + }, + BigNum { + limbs: [0xb9b3a0749e60cb8768c9f875b63680, 0x291981e1a6ffd922ef4010fd623046, 0x003a9e], + }, + BigNum { + limbs: [0x03f0628b5ffb33789736068a49c981, 0x7e39a7bbd6485a16e8c7f8a475d50d, 0x00394f], + }, + BigNum { + limbs: [0xf2172bc7473892459629b66ba900be, 0xeb28f1112e24ae07a577ed5adb9833, 0x003ec2], + }, + BigNum { + limbs: [0xcb8cd738b7236cba69d6489456ff43, 0xbc2a388c4f23853232901c46fc6d1f, 0x00352a], + }, + BigNum { + limbs: [0x6c73629eb540ea3f9554aa5ac511e9, 0xba428345abaac34c773123acc36bcc, 0x004a8a], + }, + BigNum { + limbs: [0x5130a061491b14c06aab54a53aee18, 0xed10a657d19d6fed60d6e5f5149987, 0x002962], + }, + BigNum { + limbs: [0xd2b29f89691c73686d7450c33d5a33, 0x95c67b9ea2efa1729a4994ac329b4c, 0x0057b5], + }, + BigNum { + limbs: [0xeaf16376953f8b97928bae3cc2a5ce, 0x118cadfeda5891c73dbe74f5a56a06, 0x001c38], + }, + BigNum { + limbs: [0x0da05f62a2205a038764a74650d0c5, 0x264ed896f8869866cb67d02650f974, 0x00192c], + }, + BigNum { + limbs: [0xb003a39d5c3ba4fc789b57b9af2f3c, 0x8104510684c19ad30ca0397b870bdf, 0x005ac1], + }, + BigNum { + limbs: [0x07f2b8fe1b995c6f51caab160744d9, 0x45b7ef86f69047659707080c8273d8, 0x00724c], + }, + BigNum { + limbs: [0xb5b14a01e2c2a290ae3553e9f8bb28, 0x619b3a1686b7ebd44101019555917b, 0x0001a1], + }, + BigNum { + limbs: [0xe6a93079ee7cccc934e486ecc125c0, 0x355dce7eaf368f76379c2c28653e10, 0x002031], + }, + BigNum { + limbs: [0xd6fad2860fdf3236cb1b78133eda41, 0x71f55b1ece11a3c3a06bdd7972c742, 0x0053bc], + }, + BigNum { + limbs: [0xf79fc3d741bf226521696c6179297c, 0x9ae2c216552207600419c3f6115aeb, 0x0063bc], + }, + BigNum { + limbs: [0xc6043f28bc9cdc9ade96929e86d685, 0x0c70678728262bd9d3ee45abc6aa67, 0x001031], + }, + BigNum { + limbs: [0xc4ded9ffbba24056e5deedda27244b, 0x8f8601768ac3bbb9b61429944d0c24, 0x00213e], + }, + BigNum { + limbs: [0xf8c5290042b9bea91a211125d8dbb6, 0x17cd2826f284778021f3e00d8af92e, 0x0052af], + }, + BigNum { + limbs: [0xf518b492651ba347ad66c74d7bca64, 0x5064e14b100a32e73c0848a259cce0, 0x004409], + }, + BigNum { + limbs: [0xc88b4e6d99405bb8529937b284359d, 0x56ee48526d3e00529bffc0ff7e3872, 0x002fe4], + }, + BigNum { + limbs: [0x31564fda741ade70b774835f62ee3c, 0x1ce4194322964607884498bbcb8c71, 0x001e85], + }, + BigNum { + limbs: [0x8c4db3258a41208f488b7ba09d11c5, 0x8a6f105a5ab1ed324fc370e60c78e2, 0x005568], + }, + BigNum { + limbs: [0xddec933364680fd1c931b0f7188c6e, 0x2e92d9ce55819bcfd2af02a07aa006, 0x000456], + }, + BigNum { + limbs: [0xdfb76fcc99f3ef2e36ce4e08e77393, 0x78c04fcf27c6976a055907015d654c, 0x006f97], + }, + BigNum { + limbs: [0x960fc9c499955198e1e535f0666860, 0x5f24e19b3eee4df7efe5f71e0abf44, 0x0054a5], + }, + BigNum { + limbs: [0x2794393b64c6ad671e1ac90f9997a1, 0x482e48023e59e541e8221283cd460f, 0x001f48], + }, + BigNum { + limbs: [0x1bc63ba1f12ba86a96e7321bc04210, 0x5ec81887c4f43e877567664189754e, 0x0045df], + }, + BigNum { + limbs: [0xa1ddc75e0d3056956918cce43fbdf1, 0x488b1115b853f4b262a0a3604e9005, 0x002e0e], + }, + BigNum { + limbs: [0x7c81ae1d87699d225d35c86477d58b, 0x400e38958dc7f5783bcc2a7ca18b18, 0x004293], + }, + BigNum { + limbs: [0x412254e276f261dda2ca369b882a76, 0x6744f107ef803dc19c3bdf25367a3b, 0x00315a], + }, + BigNum { + limbs: [0x2611cec67dd54be518be27e7093f4e, 0x9743b4e0d46958698576f11c4a2e78, 0x0011ea], + }, + BigNum { + limbs: [0x979234398086b31ae741d718f6c0b3, 0x100f74bca8dedad0529118858dd6db, 0x006203], + }, + BigNum { + limbs: [0x0223751b720a0cf2dab1c8c4a189ff, 0xdcb7690555b9127b1606420ade2a86, 0x002ac9], + }, + BigNum { + limbs: [0xbb808de48c51f20d254e363b5e7602, 0xca9bc098278f20bec201c796f9dacd, 0x004923], + }, + BigNum { + limbs: [0xa5dd527cd71fb7976ac7f5f6c72a88, 0x6117fe37a234a60a47cec5cb1a85e6, 0x001f1c], + }, + BigNum { + limbs: [0x17c6b083273c47689538090938d579, 0x463b2b65db138d2f903943d6bd7f6d, 0x0054d1], + }, + BigNum { + limbs: [0x8b12057546a348bd571c059c104014, 0xb61776734f89d0fc55508e07bb7098, 0x00699c], + }, + BigNum { + limbs: [0x3291fd8ab7b8b642a8e3f963efbfed, 0xf13bb32a2dbe623d82b77b9a1c94bb, 0x000a50], + }, + BigNum { + limbs: [0x9e8b72db6f1e2653fd29142d3819a2, 0xd3f9439750aa38a37afc68b0fafae2, 0x0054a1], + }, + BigNum { + limbs: [0x1f1890248f3dd8ac02d6ead2c7e65f, 0xd359e6062c9dfa965d0ba0f0dd0a71, 0x001f4b], + }, + BigNum { + limbs: [0xd7c1a278ec608700a9be0299817ca4, 0x55532c1abbaf9ef11dfefbb02e5e62, 0x0007a0], + }, + BigNum { + limbs: [0xe5e2608711fb77ff5641fc667e835d, 0x51fffd82c1989448ba090df1a9a6f0, 0x006c4d], + }, + BigNum { + limbs: [0x1fd547be4b6ce2b275fb29418f4c5d, 0x428c158ed643f84e55b954bddacbef, 0x003076], + }, + BigNum { + limbs: [0x9dcebb41b2ef1c4d8a04d5be70b3a4, 0x64c7140ea7043aeb824eb4e3fd3964, 0x004377], + }, + BigNum { + limbs: [0xc86ad30700ce774a3b8d2e0f596020, 0xba2fd3948857eb766ca2207244f211, 0x006a3e], + }, + BigNum { + limbs: [0xf5392ff8fd8d87b5c472d0f0a69fe1, 0xed235608f4f047c36b65e92f931341, 0x0009ae], + }, + BigNum { + limbs: [0x855177336fb60fdca2ca5cd99ce3c3, 0xe0d6b37e59679e533b9248389fa8c1, 0x00324a], + }, + BigNum { + limbs: [0x38528bcc8ea5ef235d35a226631c3e, 0xc67c761f23e094e69c75c169385c92, 0x0041a2], + }, + BigNum { + limbs: [0xa947be6ae0adca67112eaf34e9f6be, 0x377e8099fa46465283e47a582918fe, 0x001b23], + }, + BigNum { + limbs: [0x145c44951dae3498eed14fcb160943, 0x6fd4a9038301ece754238f49aeec55, 0x0058ca], + }, + BigNum { + limbs: [0x1d79c870ba25b6c9e1715651f94edb, 0xe6471ba2107df5f9703e00bf2460a7, 0x002bbe], + }, + BigNum { + limbs: [0xa02a3a8f443648361e8ea8ae06b126, 0xc10c0dfb6cca3d4067ca08e2b3a4ac, 0x00482e], + }, + BigNum { + limbs: [0x180a97607b7b75ee0a9b7720fe18ea, 0x61caaccddcb331fc82977997ab4493, 0x003441], + }, + BigNum { + limbs: [0xa5996b9f82e08911f56487df01e717, 0x45887ccfa095013d5570900a2cc0c0, 0x003fac], + }, + BigNum { + limbs: [0x7a4cdd8c345f311415ae6f648ca4c4, 0x11970ddf05c3476edefa503afd9c0a, 0x0017ae], + }, + BigNum { + limbs: [0x43572573c9fccdebea518f9b735b3d, 0x95bc1bbe7784ebcaf90db966da6949, 0x005c3f], + }, + BigNum { + limbs: [0x2431336dffbd3ff302032d443d58d3, 0xda94c4d882d868bd470adc88c0ecd8, 0x0026c2], + }, + BigNum { + limbs: [0x9972cf91fe9ebf0cfdfcd1bbc2a72e, 0xccbe64c4fa6fca7c90fd2d1917187b, 0x004d2a], + }, + BigNum { + limbs: [0x8b73877a32f62bdfe96721a6cd7b3e, 0x0231915bdd4603e21d77f00f7c14ae, 0x004f5b], + }, + BigNum { + limbs: [0x32307b85cb65d3201698dd593284c3, 0xa5219841a0022f57ba9019925bf0a5, 0x002492], + }, + BigNum { + limbs: [0xe566e43fbfb3adcaa4621ab46a4d30, 0xe4c6b3243876efd27177d6ce56ad87, 0x00583a], + }, + BigNum { + limbs: [0xd83d1ec03ea851355b9de44b95b2d1, 0xc28c767944d14367669032d38157cb, 0x001bb2], + }, + BigNum { + limbs: [0x7e23dd40142c5f9422d2c34101124c, 0x9b8792f6512f934f79299c50142c3d, 0x0024ea], + }, + BigNum { + limbs: [0x3f8025bfea2f9f6bdd2d3bbefeedb5, 0x0bcb96a72c189fea5ede6d51c3d916, 0x004f03], + }, + BigNum { + limbs: [0xec9c0406a08f265cce2c30333b187f, 0x6ca4e92bd0ad946fec5826cc03719d, 0x000206], + }, + BigNum { + limbs: [0xd107fef95dccd8a331d3ceccc4e782, 0x3aae4071ac9a9ec9ebafe2d5d493b5, 0x0071e7], + }, + BigNum { + limbs: [0x7f3449b8bd93686beadab96405ae3a, 0x1ab61fc3015bf5412a443f8e57f148, 0x003965], + }, + BigNum { + limbs: [0x3e6fb94740c896941525459bfa51c7, 0x8c9d09da7bec3df8adc3ca1380140b, 0x003a88], + }, + BigNum { + limbs: [0xd9c57133e56dfad3ea280c5f782f2b, 0xead5a7d140e1e3fff1c4cd5cae127b, 0x0024c2], + }, + BigNum { + limbs: [0xe3de91cc18ee042c15d7f2a087d0d6, 0xbc7d81cc3c664f39e6433c4529f2d7, 0x004f2a], + }, + BigNum { + limbs: [0xa7fbcbd8c1ce86f75167878ef4c2b7, 0x118566730cb78c4efcd85ee6395889, 0x007110], + }, + BigNum { + limbs: [0x15a837273c8d7808ae9877710b3d4a, 0x95cdc32a7090a6eadb2faabb9eacca, 0x0002dd], + }, + BigNum { + limbs: [0x1ffcba3c12bc2b9ee90b3d11c2dd21, 0x102ef837861bde2c7551f9dff19445, 0x0006b7], + }, + BigNum { + limbs: [0x9da748c3eb9fd36116f4c1ee3d22e0, 0x97243165f72c550d62b60fc1e6710e, 0x006d36], + }, + BigNum { + limbs: [0xd017e31cf0cb08eef8f30684ce9026, 0x8d3c8185d7d529293c2d54cc37eba5, 0x00519e], + }, + BigNum { + limbs: [0xed8c1fe30d90f611070cf87b316fdb, 0x1a16a817a5730a109bdab4d5a019ad, 0x00224f], + }, + BigNum { + limbs: [0x7a986565c2a5d1c9be282a115f3af5, 0x9b7c85ec9ffed0759691f8350bcf77, 0x002dfe], + }, + BigNum { + limbs: [0x430b9d9a3bb62d3641d7d4eea0c50c, 0x0bd6a3b0dd4962c44176116ccc35dc, 0x0045ef], + }, + BigNum { + limbs: [0xa9e37a3c78a6f03c5e8cd07ac27967, 0xa77bf4482596c40e6ea7ec15f1e470, 0x006957], + }, + BigNum { + limbs: [0x13c088c385b50ec3a1732e853d869a, 0xffd7355557b16f2b69601d8be620e3, 0x000a95], + }, + BigNum { + limbs: [0xda1d1c2ae95f6ed46bc78329689a4e, 0xd3feed71abf08747974362d7998504, 0x005f55], + }, + BigNum { + limbs: [0xe386e6d514fc902b94387bd69765b3, 0xd3543c2bd157abf240c4a6ca3e804e, 0x001497], + }, + BigNum { + limbs: [0xdc7f318ce3896129a67c58c11af270, 0x33b32d96101f50bdf12f11ba2ba3f6, 0x004407], + }, + BigNum { + limbs: [0xe124d1731ad29dd65983a63ee50d91, 0x739ffc076d28e27be6d8f7e7ac615c, 0x002fe6], + }, + BigNum { + limbs: [0x277cbb3e7a777eeeb008d78b019434, 0xfbfe7fba4f67c98d9a4ba421a74a5e, 0x006892], + }, + BigNum { + limbs: [0x962747c183e480114ff72774fe6bcd, 0xab54a9e32de069ac3dbc658030baf5, 0x000b5a], + }, + BigNum { + limbs: [0x20997b1fdd66bd53ec18ed560e5c0c, 0x74a3e7e4ae661be49858d07f3e273d, 0x000bdf], + }, + BigNum { + limbs: [0x9d0a87e020f541ac13e711a9f1a3f5, 0x32af41b8cee217553faf392299de16, 0x00680e], + }, + BigNum { + limbs: [0xe792ae1b302effd0b0f21e5dd18de6, 0x1d8cfff841ef8c787035f36a072656, 0x0051d1], + }, + BigNum { + limbs: [0xd61154e4ce2cff2f4f0de0a22e721b, 0x89c629a53b58a6c167d21637d0defc, 0x00221c], + }, + BigNum { + limbs: [0x1a01cc28fefe11f643be94ebcf7272, 0x3a3286fa30c54b3fe9256008c92553, 0x00491c], + }, + BigNum { + limbs: [0xa3a236d6ff5ded09bc416a14308d8f, 0x6d20a2a34c82e7f9eee2a9990ee000, 0x002ad1], + }, + BigNum { + limbs: [0x3fdeea97c6fe196470728429de50e2, 0x0a1474f2943817443ffa79edc2405a, 0x003edc], + }, + BigNum { + limbs: [0x7dc51868375de59b8f8d7ad621af1f, 0x9d3eb4aae9101bf5980d8fb415c4f9, 0x003511], + }, + BigNum { + limbs: [0xeaa5fd91eb8ad60697528e66468f8b, 0xf542a4cb0e56a928854e7f46c10779, 0x0037ca], + }, + BigNum { + limbs: [0xd2fe056e12d128f968ad7099b97076, 0xb21084d26ef18a1152b98a5b16fdd9, 0x003c22], + }, + BigNum { + limbs: [0x13924feb1eeca0f1045bd496c219a4, 0x1bdcc7a762a7a1e2d45135ad7c1cf7, 0x000303], + }, + BigNum { + limbs: [0xaa11b314df6f5e0efba42a693de65d, 0x8b7661f61aa0915703b6d3f45be85c, 0x0070ea], + }, + BigNum { + limbs: [0x4daa4a99dbb5b03fbacc5e6dc71317, 0x8eb4ab2df85240fdd323261f47b06d, 0x002bbf], + }, + BigNum { + limbs: [0x6ff9b86622a64ec04533a09238ecea, 0x189e7e6f84f5f23c04e4e3829054e6, 0x00482e], + }, + BigNum { + limbs: [0x6af2a3df55476564cabfb80ccdf965, 0xa8bb5dc5e43d9aaa551e3cb295f125, 0x006bfb], + }, + BigNum { + limbs: [0x52b15f20a914999b354046f332069c, 0xfe97cbd7990a988f82e9ccef42142e, 0x0007f1], + }, + BigNum { + limbs: [0x57cb9f5410cdb13e4972bf66f482c6, 0x0a0c78d1f4e98c45d4e61e2afaf2e3, 0x006534], + }, + BigNum { + limbs: [0x65d863abed8e4dc1b68d3f990b7d3b, 0x9d46b0cb885ea6f40321eb76dd1270, 0x000eb9], + }, + BigNum { + limbs: [0x47df7ab3dcb27be44ecf3b78cfad97, 0x5daa7c9b91da67e2903db4b2328356, 0x000cb4], + }, + BigNum { + limbs: [0x75c4884c21a9831bb130c38730526a, 0x49a8ad01eb6dcb5747ca54efa581fd, 0x006739], + }, + BigNum { + limbs: [0x335495b3e381a61803b5a2380d0d30, 0xdc57672d00970d536c25c56fe7a60f, 0x0021d1], + }, + BigNum { + limbs: [0x8a4f6d4c1ada58e7fc4a5cc7f2f2d1, 0xcafbc2707cb125e66be24431f05f44, 0x00521b], + }, + BigNum { + limbs: [0xb619876811f53367d96ac4dec2a7c5, 0x205c599f30a57bf990ec45bb4a8b69, 0x003ef1], + }, + BigNum { + limbs: [0x078a7b97ec66cb9826953a213d583c, 0x86f6cffe4ca2b740471bc3e68d79ea, 0x0034fc], + }, + BigNum { + limbs: [0x41e2dc3cbcaa821d94f28bd2c67835, 0x1f70aeb2ebcd2b0325dad02c36de2e, 0x0014b9], + }, + BigNum { + limbs: [0x7bc126c341b17ce26b0d732d3987cc, 0x87e27aea917b0836b22d3975a12725, 0x005f34], + }, + BigNum { + limbs: [0x4afcc358f070656798b57cfe3321aa, 0xf69b92ab6fc454e75abe206844831d, 0x001654], + }, + BigNum { + limbs: [0x72a73fa70deb9998674a8201ccde57, 0xb0b796f20d83de527d49e939938236, 0x005d98], + }, + BigNum { + limbs: [0xb646d5a9ae7de4fb27d64d21924534, 0x29fc62fee1ef3730c5466a640457fe, 0x003c13], + }, + BigNum { + limbs: [0x075d2d564fde1a04d829b1de6dbacd, 0x7d56c69e9b58fc0912c19f3dd3ad55, 0x0037da], + }, + BigNum { + limbs: [0x89d821e1ae06b63c3d590cd42f742e, 0x63ad8b42d73f52437581fc31b4cb3b, 0x0045cb], + }, + BigNum { + limbs: [0x33cbe11e505548c3c2a6f22bd08bd3, 0x43a59e5aa608e0f662860d70233a18, 0x002e22], + }, + BigNum { + limbs: [0xd7c6c5de7c9c7598942eff1093543f, 0x475a4ded008f25944c39b09897e604, 0x006e29], + }, + BigNum { + limbs: [0xe5dd3d2181bf89676bd0ffef6cabc2, 0x5ff8dbb07cb90da58bce5909401f4e, 0x0005c4], + }, + BigNum { + limbs: [0xac5823be4c981f8af00971a8493ef2, 0x1d363d4b2f15805a9b50ec0d2d83c6, 0x003175], + }, + BigNum { + limbs: [0x114bdf41b1c3df750ff68d57b6c10f, 0x8a1cec524e32b2df3cb71d94aa818d, 0x004278], + }, + BigNum { + limbs: [0x9f60bd799619a78b235e378dc9fa7c, 0x81e948ae5bc5fe101b8c580f1b2242, 0x0067b0], + }, + BigNum { + limbs: [0x1e43458668425774dca1c772360585, 0x2569e0ef21823529bc7bb192bce311, 0x000c3d], + }, + BigNum { + limbs: [0xee8492ee3da22ff3e3e1962f75a6b8, 0x5dd7ff6f5999d3d22736d22e5d8107, 0x0073d3], + }, + BigNum { + limbs: [0xcf1f7011c0b9cf0c1c1e68d08a5949, 0x497b2a2e23ae5f67b0d137737a844b, 0x00001a], + }, + BigNum { + limbs: [0xcec740fed7840e6dbad9a23e72f81c, 0xb9a5d59ea6535f2fce20817a78d7c3, 0x004785], + }, + BigNum { + limbs: [0xeedcc20126d7f09245265cc18d07e5, 0xedad53fed6f4d40a09e788275f2d8f, 0x002c67], + }, + BigNum { + limbs: [0x069ac76165652518b66c7d8e84b7fb, 0x6824377d54128a64cca9517059cf6b, 0x0033f1], + }, + BigNum { + limbs: [0xb7093b9e98f6d9e7499381717b4806, 0x3f2ef2202935a8d50b5eb8317e35e8, 0x003ffc], + }, + BigNum { + limbs: [0x0ecd974f2a3b506efed909666fe227, 0x79afbe389bf399a8cb100ba938f0ea, 0x005eac], + }, + BigNum { + limbs: [0xaed66bb0d420ae910126f599901dda, 0x2da36b64e15499910cf7fdf89f1469, 0x001541], + }, + BigNum { + limbs: [0x010631e01cbc9f572cb84cf2c5ba09, 0x861b644b42c375aa55f89169d7ad93, 0x005b59], + }, + BigNum { + limbs: [0xbc9dd11fe19f5fa8d347b20d3a45f8, 0x2137c5523a84bd8f820f78380057c0, 0x001894], + }, + BigNum { + limbs: [0x036aeea430a057753ed7c94fb0eeb9, 0x421b969856edaeada54c5497aad2cf, 0x002aa4], + }, + BigNum { + limbs: [0xba39145bcdbba78ac12835b04f1148, 0x65379305265a848c32bbb50a2d3284, 0x004949], + }, + BigNum { + limbs: [0x27f1e0971010d57a3c81696a211fdf, 0xa91f129e2638b0ee8a91eb8b9e25cb, 0x0065f1], + }, + BigNum { + limbs: [0x95b22268ee4b2985c37e9595dee022, 0xfe3416ff570f824b4d761e1639df88, 0x000dfb], + }, + BigNum { + limbs: [0xb6b627c983a9d2e73458ac79b074ee, 0x26f9a1f2fb63a902b699f27a42bda3, 0x0066ae], + }, + BigNum { + limbs: [0x06eddb367ab22c18cba752864f8b13, 0x805987aa81e48a37216e17279547b0, 0x000d3f], + }, + BigNum { + limbs: [0x2345c5177d051a336503a91e97e5d7, 0xe82a9d82d223e607676361fe30e365, 0x002b64], + }, + BigNum { + limbs: [0x9a5e3de88156e4cc9afc55e1681a2a, 0xbf288c1aab244d3270a4a7a3a721ee, 0x004888], + }, + BigNum { + limbs: [0xb5d08955ff9e20e0480ab0fd9a31fa, 0x67c5369459aa472ce39066e706af49, 0x005bf5], + }, + BigNum { + limbs: [0x07d379a9febdde1fb7f54e0265ce07, 0x3f8df309239dec0cf477a2bad1560a, 0x0017f8], + }, + BigNum { + limbs: [0x21a614ccdb8d0356d6ec5ed1e118ad, 0x4cbaa9097311544f0b99685cfd7fc2, 0x003715], + }, + BigNum { + limbs: [0x9bfdee3322cefba92913a02e1ee754, 0x5a9880940a36deeacc6ea144da8591, 0x003cd8], + }, + BigNum { + limbs: [0x4004660ebbfc8136ef495f9fe8668d, 0xd2acd3b1314f047d8c5e8e943d7b0f, 0x00158c], + }, + BigNum { + limbs: [0x7d9f9cf1425f7dc910b69f60179974, 0xd4a655ec4bf92ebc4ba97b0d9a8a44, 0x005e60], + }, + BigNum { + limbs: [0xef7cb95c169e236f344925d273570b, 0xed4d89397e65a1e265fc1fb2d6cb41, 0x0039d6], + }, + BigNum { + limbs: [0xce2749a3e7bddb90cbb6d92d8ca8f6, 0xba05a063fee29157720be9ef013a11, 0x003a16], + }, + BigNum { + limbs: [0xbfd8fb21c9bc312aafa84a8f32c4c3, 0x725ed9887c0d76a737cfb9ec903271, 0x006fd9], + }, + BigNum { + limbs: [0xfdcb07de349fcdd55057b470cd3b3e, 0x34f45015013abc92a0384fb547d2e1, 0x000414], + }, + BigNum { + limbs: [0xac5555ad914c92614850e921b50b55, 0x888e1bc2c0f01f01546fd8631e66e8, 0x0027fc], + }, + BigNum { + limbs: [0x114ead526d0f6c9eb7af15de4af4ac, 0x1ec50ddabc5814388398313eb99e6b, 0x004bf1], + }, + BigNum { + limbs: [0x54fbc08c604c0bc827edff9f54ca63, 0xdddc6facd3a427840b4f6a4b3ffe3c, 0x0000cc], + }, + BigNum { + limbs: [0x68a842739e0ff337d811ff60ab359e, 0xc976b9f0a9a40bb5ccb89f56980717, 0x007320], + }, + BigNum { + limbs: [0xf4f876d5d1189994dd945218bdbbc2, 0xfb376ec72a786796c6567f5b161232, 0x005e8f], + }, + BigNum { + limbs: [0xc8ab8c2a2d43656b226bace742443f, 0xac1bbad652cfcba311b18a46c1f320, 0x00155d], + }, + BigNum { + limbs: [0x33fc05de37b96a5c092cddae2df4ca, 0x946abc676c5ed913df0b62773d4fbd, 0x000822], + }, + BigNum { + limbs: [0x89a7fd21c6a294a3f6d32151d20b37, 0x12e86d3610e95a25f8fca72a9ab596, 0x006bcb], + }, + BigNum { + limbs: [0x9d80b5ada11a750907a4e8b7d58e6a, 0x3c12226705777b23957d3889bcbf4d, 0x005b5e], + }, + BigNum { + limbs: [0x20234d525d4189f6f85b16482a7197, 0x6b41073677d0b816428ad1181b4606, 0x00188f], + }, + BigNum { + limbs: [0xdeb374606e7481ab9cb369c352cef9, 0x386f0661f1a7f25ded5a7525beba19, 0x0030c6], + }, + BigNum { + limbs: [0xdef08e9f8fe77d54634c953cad3108, 0x6ee4233b8ba040dbeaad947c194b39, 0x004327], + }, + BigNum { + limbs: [0x5b1a2164b6dd1896e6c704e507a68c, 0xa11049970467d95853e14bf970d3fc, 0x00736a], + }, + BigNum { + limbs: [0x6289e19b477ee6691938fa1af85975, 0x0642e00678e059e18426bda8673157, 0x000083], + }, + BigNum { + limbs: [0xa0c3b85cc1625c18889dbb4c8fc93f, 0x554ad434a3a77303d14549438829dd, 0x002db8], + }, + BigNum { + limbs: [0x1ce04aa33cf9a2e7776243b37036c2, 0x52085568d9a0c03606c2c05e4fdb76, 0x004635], + }, + BigNum { + limbs: [0x495a3f68e907e71bb3e6377c8ca828, 0x42dcd31ae38aaeeb020aab9a427042, 0x00136d], + }, + BigNum { + limbs: [0x7449c397155417e44c19c7837357d9, 0x6476568299bd844ed5fd5e07959511, 0x006080], + }, + BigNum { + limbs: [0x03fca33ae80a7fc83b37a3b9e12e68, 0x42747c135aee51c1f421f069545a96, 0x0016f8], + }, + BigNum { + limbs: [0xb9a75fc516517f37c4c85b461ed199, 0x64dead8a2259e177e3e6193883aabd, 0x005cf5], + }, + BigNum { + limbs: [0x2e14681c99205c3efbab2e58a9a902, 0xd98628e0476857354101f90fd89fc1, 0x002975], + }, + BigNum { + limbs: [0x8f8f9ae3653ba2c10454d0a75656ff, 0xcdcd00bd35dfdc0497061091ff6592, 0x004a77], + }, + BigNum { + limbs: [0x8b8205eb6bd64213c2c46305798d57, 0xc8a83119f25dcd4785621a77f02003, 0x0029a8], + }, + BigNum { + limbs: [0x3221fd149285bcec3d3b9bfa8672aa, 0xdeaaf8838aea65f252a5ef29e7e550, 0x004a44], + }, + BigNum { + limbs: [0x3a7975240c453467f53af052532623, 0x65af92d4f70159b29ee57bf65f7f96, 0x00622b], + }, + BigNum { + limbs: [0x832a8ddbf216ca980ac50eadacd9de, 0x41a396c88646d98739228dab7885bd, 0x0011c2], + }, + BigNum { + limbs: [0x63e200e9d8e2e5305f74f884460d5a, 0xf96b57d1fb5374dfde2f880fa03f19, 0x0023a8], + }, + BigNum { + limbs: [0x59c20216257919cfa08b067bb9f2a7, 0xade7d1cb81f4be59f9d8819237c63a, 0x005044], + }, + BigNum { + limbs: [0xe6f3a7aa7aa027d5ef58fc555a6545, 0xc3a26d8d2d0b63363c75ac7b61fa06, 0x001efe], + }, + BigNum { + limbs: [0xd6b05b5583bbd72a10a702aaa59abc, 0xe3b0bc10503cd0039b925d26760b4c, 0x0054ee], + }, + BigNum { + limbs: [0x8cc4e59271bc254675e44de9acb089, 0x90622d1b33952336df41aa60d8fd88, 0x002a16], + }, + BigNum { + limbs: [0x30df1d6d8c9fd9b98a1bb116534f78, 0x16f0fc8249b31002f8c65f40ff07cb, 0x0049d7], + }, + BigNum { + limbs: [0x5a4984bd3033326a314c573c060e79, 0x4308610110d950309e5d6881371a44, 0x00251f], + }, + BigNum { + limbs: [0x635a7e42ce28cc95ceb3a7c3f9f188, 0x644ac89c6c6ee30939aaa120a0eb0f, 0x004ece], + }, + BigNum { + limbs: [0x6261dae436c20e1ae655f9c67cb4ee, 0x22db31ab8d36fc199e379693433fef, 0x00590d], + }, + BigNum { + limbs: [0x5b42281bc799f0e519aa0539834b13, 0x8477f7f1f011372039d0730e94c564, 0x001ae0], + }, + BigNum { + limbs: [0x97df7b82540d7f520fa375ce78b879, 0xd257d52cc247f82e1823a6a0a604df, 0x0013e4], + }, + BigNum { + limbs: [0x25c4877daa4e7fadf05c8931874788, 0xd4fb5470bb003b0bbfe46301320074, 0x006008], + }, + BigNum { + limbs: [0x27e28d07b063a01ddcc828594b2606, 0x18800771dd7f441b5c5cba7e08c60a, 0x006e7a], + }, + BigNum { + limbs: [0x95c175f84df85ee22337d6a6b4d9fb, 0x8ed3222b9fc8ef1e7bab4f23cf3f49, 0x000573], + }, + BigNum { + limbs: [0x122a6bda001d781a1d628b12064a8f, 0xbef1ee380b4c3884583970d8ed1f28, 0x000d69], + }, + BigNum { + limbs: [0xab799725fe3e86e5e29d73edf9b572, 0xe8613b6571fbfab57fce98c8eae62b, 0x006683], + }, + BigNum { + limbs: [0x4109d826db2ff20301669f731697cb, 0xefe5327bd2b34713d04cbf2d404699, 0x005999], + }, + BigNum { + limbs: [0x7c9a2ad9232c0cfcfe995f8ce96836, 0xb76df721aa94ec2607bb4a7497beba, 0x001a53], + }, + BigNum { + limbs: [0x279b87d2e6b387fcf5fe3b045dd181, 0x1fd88f51bc49ee62c37382b0353690, 0x004f16], + }, + BigNum { + limbs: [0x96087b2d17a877030a01c3fba22e80, 0x877a9a4bc0fe44d7149486f1a2cec3, 0x0024d7], + }, + BigNum { + limbs: [0xb5d2af6411c8553712b61b70f50fdc, 0xfef871d9d6648a833323701f1e4282, 0x003dba], + }, + BigNum { + limbs: [0x07d1539bec93a9c8ed49e38f0af025, 0xa85ab7c3a6e3a8b6a4e49982b9c2d1, 0x003632], + }, + BigNum { + limbs: [0x15c80f017c9aa2a069d1dc9b7042bc, 0xa5269bf2095fdaa09ca8fc7421e5f7, 0x0019e0], + }, + BigNum { + limbs: [0xa7dbf3fe81c15c5f962e22648fbd45, 0x022c8dab73e858993b5f0d2db61f5c, 0x005a0d], + }, + BigNum { + limbs: [0x62db18feb3e506f88c9f388c0677df, 0x3b9eaedc5bb79b6f2492431540cb08, 0x005385], + }, + BigNum { + limbs: [0x5ac8ea014a76f8077360c673f98822, 0x6bb47ac1219097cab375c68c973a4b, 0x002068], + }, + BigNum { + limbs: [0x655490bf2eb5c842ba9cf6eeeeae9b, 0xd2474b10f54a9e3e5c6ba11db18f5c, 0x003d7f], + }, + BigNum { + limbs: [0x584f7240cfa636bd45630811115166, 0xd50bde8c87fd94fb7b9c68842675f7, 0x00366d], + }, + BigNum { + limbs: [0xdbd2559a884245d72951864d8fa8da, 0x1375b8c0af7b737efcd5f01ebdb95c, 0x001fb6], + }, + BigNum { + limbs: [0xe1d1ad657619b928d6ae78b2705727, 0x93dd70dccdccbfbadb3219831a4bf6, 0x005437], + }, + BigNum { + limbs: [0x5879432fea7a51222aedd803cfa5cb, 0x4886f803ad1dad27b4014dedfaed14, 0x001b15], + }, + BigNum { + limbs: [0x652abfd013e1adddd51226fc305a36, 0x5ecc3199d02a86122406bbb3dd183f, 0x0058d8], + }, + BigNum { + limbs: [0xc99defc2a29159bca5d0ce219b4711, 0x7214004ab09d69632374d00f8a2e91, 0x001737], + }, + BigNum { + limbs: [0xf406133d5bcaa5435a2f30de64b8f0, 0x353f2952ccaac9d6b49339924dd6c1, 0x005cb6], + }, + BigNum { + limbs: [0x4901bbd26428fd3608266993cc1060, 0xf73cd3a330df9a39086a6948da8562, 0x004f39], + }, + BigNum { + limbs: [0x74a2472d9a3301c9f7d9956c33efa1, 0xb01655fa4c689900cf9da058fd7ff1, 0x0024b3], + }, + BigNum { + limbs: [0x077d669930bd57b515ba906dbfc129, 0x63cbfdc3672250f2476c3902b234c3, 0x0025eb], + }, + BigNum { + limbs: [0xb6269c66cd9ea74aea456e92403ed8, 0x43872bda1625e247909bd09f25d090, 0x004e02], + }, + BigNum { + limbs: [0x63a3ef0a0dc0eda56e5338c1cb228f, 0x4dcd2085462924021dd09c3abc78e7, 0x003d7c], + }, + BigNum { + limbs: [0x5a0013f5f09b115a91acc63e34dd72, 0x59860918371f0f37ba376d671b8c6c, 0x003671], + }, + BigNum { + limbs: [0x17f78b09396083ed9be33e30f62aaa, 0xb650aa0b473d0bd9e6a77fb9d5d6ca, 0x007369], + }, + BigNum { + limbs: [0xa5ac77f6c4fb7b12641cc0cf09d557, 0xf1027f92360b275ff16089e8022e89, 0x000083], + }, + BigNum { + limbs: [0xb3ac610f977e33a5d11204dfbed99d, 0xbb4b42cf1f3a9b0feb4704453bb48b, 0x0046df], + }, + BigNum { + limbs: [0x09f7a1f066ddcb5a2eedfa20412664, 0xec07e6ce5e0d9829ecc1055c9c50c8, 0x002d0d], + }, + BigNum { + limbs: [0x55ad625c181f556065bcd7a01c30f2, 0x781a7c2239ae887a36503010401e36, 0x004f5b], + }, + BigNum { + limbs: [0x67f6a0a3e63ca99f9a43275fe3cf0f, 0x2f38ad7b4399aabfa1b7d99197e71d, 0x002492], + }, + BigNum { + limbs: [0x41edb4801671b387553452e7d61777, 0xd29ba4c63ee76548d5a502b249e7f1, 0x006dc9], + }, + BigNum { + limbs: [0x7bb64e7fe7ea4b78aacbac1829e88a, 0xd4b784d73e60cdf1026306ef8e1d62, 0x000623], + }, + BigNum { + limbs: [0xc3fa6b12b3b74ec8b70acd9cf0d865, 0x2c1755de706dc08e3aa03315ca7a63, 0x003b64], + }, + BigNum { + limbs: [0xf9a997ed4aa4b03748f531630f279c, 0x7b3bd3bf0cda72ab9d67d68c0d8aef, 0x003889], + }, + BigNum { + limbs: [0xef690241dfa3963ce8fa61277fed1a, 0x4b9f0b721eb1bf8908719fe1ec6949, 0x005e90], + }, + BigNum { + limbs: [0xce3b00be1eb868c317059dd88012e7, 0x5bb41e2b5e9673b0cf9669bfeb9c09, 0x00155d], + }, + BigNum { + limbs: [0xe791c9632c5ea306ce63b513ad4ce0, 0xe3baa6b4f02c0689adb2f9082fb65f, 0x004e36], + }, + BigNum { + limbs: [0xd612399cd1fd5bf9319c49ec52b321, 0xc39882e88d1c2cb02a551099a84ef3, 0x0025b6], + }, + BigNum { + limbs: [0x0cde3a17cbf71e5f622b1f50d9fdd2, 0x2cf1d0e1dadb041561a5e218abee3e, 0x002002], + }, + BigNum { + limbs: [0xb0c5c8e83264e0a09dd4dfaf26022f, 0x7a6158bba26d2f24766227892c1715, 0x0053eb], + }, + BigNum { + limbs: [0x537e43d8e58b2372f85bc98bc40e5a, 0xeaa7d4663a5035d056852237c9d923, 0x002481], + }, + BigNum { + limbs: [0x6a25bf2718d0db8d07a435743bf1a7, 0xbcab553742f7fd698182e76a0e2c30, 0x004f6b], + }, + BigNum { + limbs: [0x47b2f144954b140bbd1890bb6705e7, 0xff7adae82fa6558f5be8e50b86a696, 0x001707], + }, + BigNum { + limbs: [0x75f111bb6910eaf442e76e4498fa1a, 0xa7d84eb54da1ddaa7c1f2496515ebd, 0x005ce5], + }, + BigNum { + limbs: [0xe680f5dafc6153a131aa10fd632e00, 0x134c2edfd8640e2f577d0ff387b8a5, 0x005ff3], + }, + BigNum { + limbs: [0xd7230d2501faab5ece55ee029cd201, 0x9406fabda4e4250a808af9ae504cad, 0x0013fa], + }, + BigNum { + limbs: [0x52d122bd538957e4cb00352c21f113, 0x6b967a02c84b89d12a87006d579ea1, 0x0027d8], + }, + BigNum { + limbs: [0x6ad2e042aad2a71b34ffc9d3de0eee, 0x3bbcaf9ab4fca968ad8109348066b2, 0x004c15], + }, + BigNum { + limbs: [0x6069bbc672bcd63fc6e7f37a5b26a1, 0x12f82c0988ef81ca254da703f317b7, 0x002c4a], + }, + BigNum { + limbs: [0x5d3a47398b9f28c039180b85a4d960, 0x945afd93f458b16fb2ba629de4ed9c, 0x0047a3], + }, + BigNum { + limbs: [0x550d70148336689facaa64d3610ad5, 0x07745a6b893c3d980cdab38ca1760a, 0x0002f8], + }, + BigNum { + limbs: [0x689692eb7b25966053559a2c9ef52c, 0x9fdecf31f40bf5a1cb2d5615368f49, 0x0070f5], + }, + BigNum { + limbs: [0xca0410a1c9a10a62c107092a653563, 0x89b5205c01ad36eb0ad3b74e021dec, 0x002aa8], + }, + BigNum { + limbs: [0xf39ff25e34baf49d3ef8f5d59aca9e, 0x1d9e09417b9afc4ecd345253d5e766, 0x004945], + }, + BigNum { + limbs: [0x0607c9bc523c31742ddf5eef4d4eaa, 0x891e1db52597a9c0b4d6e6ac40094a, 0x00155d], + }, + BigNum { + limbs: [0xb79c3943ac1fcd8bd220a010b2b157, 0x1e350be857b08979233122f597fc09, 0x005e90], + }, + BigNum { + limbs: [0xdadda702f99ca6235747e7245ca8f3, 0x989c317709ce3761dca398879864ee, 0x0067f5], + }, + BigNum { + limbs: [0xe2c65bfd04bf58dca8b817dba3570e, 0x0eb6f8267379fbd7fb64711a3fa064, 0x000bf8], + }, + BigNum { + limbs: [0x26cb392f9cd37aa223717637b2a39a, 0x7bac12ba0cc14923b1de5d054ff5cd, 0x0008ac], + }, + BigNum { + limbs: [0x96d8c9d06188845ddc8e88c84d5c67, 0x2ba716e37086ea162629ac9c880f86, 0x006b41], + }, + BigNum { + limbs: [0xcc5d3b6c2f14c021e5adbdd7b45b67, 0xa957448e60fb4ed489c94adbeee64a, 0x004438], + }, + BigNum { + limbs: [0xf146c793cf473ede1a5241284ba49a, 0xfdfbe50f1c4ce4654e3ebec5e91f08, 0x002fb4], + }, + BigNum { + limbs: [0xbd422a206f6b6a21a0019cde8aa342, 0x4dfd3ba86f2050548384249ecf71c4, 0x00178c], + }, + BigNum { + limbs: [0x0061d8df8ef094de5ffe6221755cbf, 0x5955edf50e27e2e55483e50308938f, 0x005c61], + }, + BigNum { + limbs: [0xcc4b7382a961c6042cdc510b610c75, 0x371b67e5b1e369b3acd7001093f4a1, 0x00431e], + }, + BigNum { + limbs: [0xf1588f7d54fa38fbd323adf49ef38c, 0x7037c1b7cb64c9862b3109914410b1, 0x0030cf], + }, + BigNum { + limbs: [0x6fd201e8f5cc40a3afe5b2094fc128, 0xfe671be7bb3770be381d1d554a5b40, 0x0018bf], + }, + BigNum { + limbs: [0x4dd20117088fbe5c501a4cf6b03ed9, 0xa8ec0db5c210c27b9feaec4c8daa13, 0x005b2d], + }, + BigNum { + limbs: [0xf025db383b07030c5949b99fe0cf18, 0x293af972bc06e684d71edb9b48c8fb, 0x005514], + }, + BigNum { + limbs: [0xcd7e27c7c354fbf3a6b645601f30e9, 0x7e18302ac1414cb500e92e068f3c57, 0x001ed9], + }, + BigNum { + limbs: [0x3562ca05a2228a61650d680b8a6595, 0x9add509bfeb324c70882829c954881, 0x003f8f], + }, + BigNum { + limbs: [0x884138fa5c39749e9af296f4759a6c, 0x0c75d9017e950e72cf85870542bcd2, 0x00345e], + }, + BigNum { + limbs: [0x6b3c313aa95aee82f6451c0ffd9e4b, 0x6d8766a0943a502e6324c3508a3d5d, 0x001de8], + }, + BigNum { + limbs: [0x5267d1c55501107d09bae2f00261b6, 0x39cbc2fce90de30b74e346514dc7f6, 0x005605], + }, + BigNum { + limbs: [0x654ce80fe96082a1e43aaa7b821ea8, 0xf72b923064c0be698f7263e18fd0b9, 0x002cc7], + }, + BigNum { + limbs: [0x58571af014fb7c5e1bc554847de159, 0xb027976d188774d04895a5c048349a, 0x004725], + }, + BigNum { + limbs: [0x54ae98f2436032489a67c9866dd8ad, 0xe4d12bf37061256021f248c7908c5b, 0x005e75], + }, + BigNum { + limbs: [0x68f56a0dbafbccb765983579922754, 0xc281fdaa0ce70dd9b615c0da4778f8, 0x001577], + }, + BigNum { + limbs: [0x8497fcc49d0aa40b429d38e35259ba, 0x99a26cd1eb74403a1340a2d6a1bb64, 0x003475], + }, + BigNum { + limbs: [0x390c063b61515af4bd62c61cada647, 0x0db0bccb91d3f2ffc4c766cb3649ef, 0x003f78], + }, + BigNum { + limbs: [0x3be6ce0d94c6fa2af3b166edf32104, 0xdd86f64b2b584cdc6ccbf204e89982, 0x00386c], + }, + BigNum { + limbs: [0x81bd34f2699504d50c4e98120cdefd, 0xc9cc335251efe65d6b3c179cef6bd1, 0x003b80], + }, + BigNum { + limbs: [0xfe230845799344541d2d22e8741f95, 0xb81eac8a6b93f11de21f95fdc20639, 0x0019a3], + }, + BigNum { + limbs: [0xbf80faba84c8baabe2d2dc178be06c, 0xef347d1311b4421bf5e873a415ff19, 0x005a49], + }, + BigNum { + limbs: [0xfe8d642079b117e2b984147df9fa0c, 0x54602f81f7daddb4495985ce8faabc, 0x00268a], + }, + BigNum { + limbs: [0xbf169edf84aae71d467bea820605f5, 0x52f2fa1b856d55858eae83d3485a96, 0x004d63], + }, + BigNum { + limbs: [0xac10045770c08b8c60ff7cd1cb44b7, 0x548cbf1cc89059674f9cea35a7984c, 0x002455], + }, + BigNum { + limbs: [0x1193fea88d9b73739f00822e34bb4a, 0x52c66a80b4b7d9d2886b1f6c306d07, 0x004f98], + }, + BigNum { + limbs: [0x3682e1dd8e09eea1bf6608e5f02061, 0x4966d963f03feefe5024fc878e21d5, 0x007052], + }, + BigNum { + limbs: [0x872121227052105e4099f61a0fdfa0, 0x5dec50398d08443b87e30d1a49e37e, 0x00039b], + }, + BigNum { + limbs: [0x2e052cb748d5c0c04adf434b4e09ff, 0xf2bbe685dbe29aa1cac699a261938d, 0x00218a], + }, + BigNum { + limbs: [0x8f9ed648b5863e3fb520bbb4b1f602, 0xb4974317a16598980d416fff7671c6, 0x005262], + }, + BigNum { + limbs: [0x6d28a175fac82773be83cb00213581, 0x05a1a5d4698d5ee9e090bc999a0261, 0x002710], + }, + BigNum { + limbs: [0x507b618a0393d78c417c33ffdeca80, 0xa1b183c913bad44ff7774d083e02f2, 0x004cdd], + }, + BigNum { + limbs: [0xc71ad10f1cb57ed38797c866a2d324, 0x5a3fce4392a5b6641cef26ddbb1e10, 0x00543a], + }, + BigNum { + limbs: [0xf68931f0e1a6802c786836995d2cdd, 0x4d135b59eaa27cd5bb18e2c41ce742, 0x001fb3], + }, + BigNum { + limbs: [0x3b0e7eef22839ee457f3a8335b7c95, 0x7dc08530f7efe3a32515bfe9049360, 0x000a3e], + }, + BigNum { + limbs: [0x82958410dbd8601ba80c56cca4836c, 0x2992a46c85584f96b2f249b8d371f3, 0x0069af], + }, + BigNum { + limbs: [0x010d11ad78e67deb7dbe225750689c, 0xc1ce8fe57512b096e947760ffd71d2, 0x001478], + }, + BigNum { + limbs: [0xbc96f152857581148241dca8af9765, 0xe58499b8083582a2eec09391da9381, 0x005f74], + }, + BigNum { + limbs: [0x0d7b400461dcb7a69e3537d4ebbcf1, 0xf8671d4058336373dcdb72a544f8c7, 0x000aab], + }, + BigNum { + limbs: [0xb028c2fb9c7f475961cac72b144310, 0xaeec0c5d2514cfc5fb2c96fc930c8c, 0x006941], + }, + BigNum { + limbs: [0xbcb5780f8ed96932b18098666562a4, 0xbd71f2c2ea600d38d4f3d4ea6f549f, 0x004256], + }, + BigNum { + limbs: [0x00ee8af06f8295cd4e7f66999a9d5d, 0xe9e136da92e82601031434b768b0b4, 0x003196], + }, + BigNum { + limbs: [0x38d17454846f3841f49d74735570ea, 0x165fbd58c5a8755dc5938773609f0e, 0x0003ed], + }, + BigNum { + limbs: [0x84d28eab79ecc6be0b628a8caa8f17, 0x90f36c44b79fbddc1274822e776645, 0x007000], + }, + BigNum { + limbs: [0xfcb916c626e0e9bc29f6173ab70b65, 0x3d073a9c55cdd85ea2235bfe4d4804, 0x005b5b], + }, + BigNum { + limbs: [0xc0eaec39d77b1543d609e7c548f49c, 0x6a4bef01277a5adb35e4ada38abd4e, 0x001892], + }, + BigNum { + limbs: [0xc37b9a1dfaaf4193724cef26d4b27a, 0x9c2994f61e115e9f0991476ba4f346, 0x004ae3], + }, + BigNum { + limbs: [0xfa2868e203acbd6c8db30fd92b4d87, 0x0b2994a75f36d49ace76c23633120c, 0x00290a], + }, + BigNum { + limbs: [0x377a276c1c5329c1018e5e8284261e, 0xd80ac1ce9fe1755c33da05a269c910, 0x0053fd], + }, + BigNum { + limbs: [0x8629db93e208d53efe71a07d7bd9e3, 0xcf4867cedd66bddda42e03ff6e3c43, 0x001fef], + }, + BigNum { + limbs: [0x45dc24dbfdb880c6163bc865dd8bfa, 0x904b30cf1672d3253aaf3beeedf700, 0x0032fe], + }, + BigNum { + limbs: [0x77c7de2400a37e39e9c4369a227407, 0x1707f8ce66d560149d58cdb2ea0e53, 0x0040ef], + }, + BigNum { + limbs: [0xba16207a4ed9735b36b24c6dd788a9, 0x460aee018137df4643f06e17e34196, 0x001af7], + }, + BigNum { + limbs: [0x038de285af828ba4c94db292287758, 0x61483b9bfc1053f394179b89f4c3bd, 0x0058f6], + }, + BigNum { + limbs: [0x5051b124a48d44acceb7bbce4cc395, 0x49a9f4f29b3a002bc0adb6fdc0f664, 0x006fcb], + }, + BigNum { + limbs: [0x6d5251db59ceba5331484331b33c6c, 0x5da934aae20e330e175a52a4170eef, 0x000422], + }, + BigNum { + limbs: [0xdce6f23222f777c94bdd9d3ac706d2, 0x815b057415a7e25cd2e9271b27153d, 0x000455], + }, + BigNum { + limbs: [0xe0bd10cddb648736b42261c538f92f, 0x25f8242967a050dd051ee286b0f015, 0x006f98], + }, + BigNum { + limbs: [0x66373acc16d886ceddaf21e77fc517, 0xa9919ec5166a85cf008f30e27fbec0, 0x0010b0], + }, + BigNum { + limbs: [0x576cc833e78378312250dd18803aea, 0xfdc18ad866ddad6ad778d8bf584693, 0x00633c], + }, + BigNum { + limbs: [0xcf5dfbcdebe183e6e206d7bdffab49, 0x14f3cf6874649b5de195f3b709f16f, 0x000d09], + }, + BigNum { + limbs: [0xee460732127a7b191df927420054b8, 0x925f5a3508e397dbf67215eace13e3, 0x0066e4], + }, + BigNum { + limbs: [0x620e2e04af3cb774d607ae86c135cd, 0x379a5ac72106a7f3d9eeeea2803ed8, 0x002032], + }, + BigNum { + limbs: [0x5b95d4fb4f1f478b29f850793eca34, 0x6fb8ced65c418b45fe191aff57c67b, 0x0053bb], + }, + BigNum { + limbs: [0xbe8983b787f09a3fda16b703ae79d7, 0xc42675dd613b3489b26bb21f6c258f, 0x0056da], + }, + BigNum { + limbs: [0xff1a7f48766b64c025e947fc51862a, 0xe32cb3c01c0cfeb0259c57826bdfc3, 0x001d12], + }, + BigNum { + limbs: [0x4e939154c03c580acc2b5ef5216f61, 0x9334769b3974daaf8d6debc056151e, 0x001ead], + }, + BigNum { + limbs: [0x6f1071ab3e1fa6f533d4a00ade90a0, 0x141eb30243d3588a4a9a1de181f035, 0x005540], + }, + BigNum { + limbs: [0x6b31e32115dd92996c19a5568c67f4, 0x5347f1132f4d1e57fcce6b05f90380, 0x0036c7], + }, + BigNum { + limbs: [0x52721fdee87e6c6693e659a973980d, 0x540b388a4dfb14e1db399e9bdf01d3, 0x003d26], + }, + BigNum { + limbs: [0xf2bdccb70a6ef709cbca5b7a65aab2, 0xbd04f7f6b469d3ddff14a41bbd9dd2, 0x0036f1], + }, + BigNum { + limbs: [0xcae63648f3ed07f63435a3859a554f, 0xea4e31a6c8de5f5bd8f365861a6780, 0x003cfb], + }, + BigNum { + limbs: [0x66f13b1ab5685cd8cdc7146b807204, 0x9469afda287a4012a1a3ae0c60acc9, 0x004fd2], + }, + BigNum { + limbs: [0x56b2c7e548f3a2273238ea947f8dfd, 0x12e979c354cdf32736645b9577588a, 0x00241b], + }, + BigNum { + limbs: [0x7853b66b61d5200372e53f548f8ce3, 0x87ce2ad498442d5e019288a337976e, 0x003b03], + }, + BigNum { + limbs: [0x45504c949c86defc8d1abfab70731e, 0x1f84fec8e50405dbd67580fea06de5, 0x0038ea], + }, + BigNum { + limbs: [0x70bff3af461bc0ca31c421a753efa0, 0xa63dfd84ffaec090ac87917778335b, 0x0056b5], + }, + BigNum { + limbs: [0x4ce40f50b8403e35ce3bdd58ac1061, 0x01152c187d9972a92b80782a5fd1f8, 0x001d38], + }, + BigNum { + limbs: [0xc5373ec9c8343b1e4ca4d8ce229e36, 0x5d229a04387d9c5d5a214d0488f0ef, 0x00455e], + }, + BigNum { + limbs: [0xf86cc4363627c3e1b35b2631dd61cb, 0x4a308f9944ca96dc7de6bc9d4f1463, 0x002e8f], + }, + BigNum { + limbs: [0x5dcdee102c3ba87f2f48f3eb5d88d3, 0xa72bf8109fde405a5c49fdd0824580, 0x0013de], + }, + BigNum { + limbs: [0x5fd614efd2205680d0b70b14a2772e, 0x0027318cdd69f2df7bbe0bd155bfd3, 0x00600f], + }, + BigNum { + limbs: [0xd2826073fe1c3d9541142e4bebfa33, 0x8b9ab81f31622738fb770b6f7db0fd, 0x006321], + }, + BigNum { + limbs: [0xeb21a28c003fc16abeebd0b41405ce, 0x1bb8717e4be60c00dc90fe325a5455, 0x0010cc], + }, + BigNum { + limbs: [0x2655a4f2a71153bc164249c8f6ae4c, 0xed9f7c0b36665bc1b21db066728eec, 0x00230a], + }, + BigNum { + limbs: [0x974e5e0d574aab43e9bdb5370951b5, 0xb9b3ad9246e1d77825ea593b657667, 0x0050e2], + }, + BigNum { + limbs: [0x47c28ba9fd6add445358152fe9e30e, 0x4d75bff8bc844cda745819c6a69193, 0x000182], + }, + BigNum { + limbs: [0x75e1775600f121bbaca7e9d0161cf3, 0x59dd69a4c0c3e65f63afefdb3173c0, 0x00726b], + }, + BigNum { + limbs: [0xeccbd814da06896454b1247b57539e, 0xde70f6f89e7b9b7862421542c6ade1, 0x002cc2], + }, + BigNum { + limbs: [0xd0d82aeb2455759bab4eda84a8ac63, 0xc8e232a4decc97c175c5f45f115771, 0x00472a], + }, + BigNum { + limbs: [0x94d9614b087f3c1980045ae4b78723, 0xd97a1ce103e07e6e65b246bd533015, 0x0044dd], + }, + BigNum { + limbs: [0x28caa1b4f5dcc2e67ffba41b4878de, 0xcdd90cbc7967b4cb7255c2e484d53e, 0x002f0f], + }, + BigNum { + limbs: [0x51fbc98b29ffba9c5a4354bbba58aa, 0x3cb2c5f57ea5b26b1d49f27a08e557, 0x003f3d], + }, + BigNum { + limbs: [0x6ba83974d45c4463a5bcaa4445a757, 0x6aa063a7fea280cebabe1727cf1ffc, 0x0034b0], + }, + BigNum { + limbs: [0x61db1d1b9c0b08cb773551758ecaa4, 0xe37eb8a506acf1f91c7b55db3a8be4, 0x00593a], + }, + BigNum { + limbs: [0x5bc8e5e46250f63488caad8a71355d, 0xc3d470f8769b4140bb8cb3c69d796f, 0x001ab2], + }, + BigNum { + limbs: [0x444d8a302c8da96e37bfb94751e58e, 0x6690ae243ef976f6b24227dd5cb253, 0x005ec0], + }, + BigNum { + limbs: [0x795678cfd1ce5591c84045b8ae1a73, 0x40c27b793e4ebc4325c5e1c47b5300, 0x00152d], + }, + BigNum { + limbs: [0x3dfdc600984107cda32780a77f8f5f, 0xa1529986e0edb5dd9e2d3dd12687a9, 0x002eb2], + }, + BigNum { + limbs: [0x7fa63cff661af7325cd87e588070a2, 0x060090169c5a7d5c39dacbd0b17daa, 0x00453b], + }, + BigNum { + limbs: [0x2489344a456b47cae21e3bd7150af7, 0xea05243f47f6f7db687fb68d902acb, 0x005750], + }, + BigNum { + limbs: [0x991aceb5b8f0b7351de1c328eaf50a, 0xbd4e055e35513b5e6f88531447da88, 0x001c9c], + }, + BigNum { + limbs: [0xca05a65a819a818d65f283960c64f6, 0xfcc67803f85a9d91f530887530a761, 0x004c36], + }, + BigNum { + limbs: [0xf39e5ca57cc17d729a0d7b69f39b0b, 0xaa8cb19984ed95a7e2d7812ca75df1, 0x0027b6], + }, + BigNum { + limbs: [0x5c3a002f47ebc42d07692bea45f396, 0xa5fa42eabba5613a5c9f9b3231c3b6, 0x007192], + }, + BigNum { + limbs: [0x616a02d0b6703ad2f896d315ba0c6b, 0x0158e6b2c1a2d1ff7b686e6fa6419d, 0x00025b], + }, + BigNum { + limbs: [0xeceaad029bec7ce943f9b1660bb1a9, 0x59ff4eddaac6fee6711ca11606eba0, 0x001658], + }, + BigNum { + limbs: [0xd0b955fd626f8216bc064d99f44e58, 0x4d53dabfd281345366eb688bd119b2, 0x005d95], + }, + BigNum { + limbs: [0x218f1dd4394b56b4953e423b9c04e0, 0x87019792e16ae4979dbd6023b97478, 0x004970], + }, + BigNum { + limbs: [0x9c14e52bc510a84b6ac1bcc463fb21, 0x2051920a9bdd4ea23a4aa97e1e90db, 0x002a7d], + }, + BigNum { + limbs: [0x37f73343b719ecede15ecd60b3df65, 0x624c06087cb6ad30ccd8f447ed080a, 0x0059ba], + }, + BigNum { + limbs: [0x85accfbc474212121ea1319f4c209c, 0x45072395009186090b2f1559eafd49, 0x001a33], + }, + BigNum { + limbs: [0x467cc6e972110032c5ece8b055e8a9, 0x62d2f2b315a015393dcc435c95bf3a, 0x000274], + }, + BigNum { + limbs: [0x77273c168c4afecd3a13164faa1758, 0x448036ea67a81e009a3bc645424619, 0x007179], + }, + BigNum { + limbs: [0xc2941dbdeb3eff86bbc2821a7c954d, 0x4e5fe188f49e4f87f802ec2872f93e, 0x0043c8], + }, + BigNum { + limbs: [0xfb0fe542131cff79443d7ce5836ab4, 0x58f3481488a9e3b1e0051d79650c14, 0x003025], + }, + BigNum { + limbs: [0x5315b31507ceb8d2aa93f770b9c8e1, 0x9106ee3a43fd12880e5eefdbae2ab6, 0x004b9b], + }, + BigNum { + limbs: [0x6a8e4feaf68d462d556c078f463720, 0x164c3b63394b20b1c9a919c629da9d, 0x002852], + }, + BigNum { + limbs: [0xcbd2211181fe944077e77ff3104df5, 0xaa51988e575837557c3b5ebdfea8e8, 0x0060c6], + }, + BigNum { + limbs: [0xf1d1e1ee7c5d6abf88187f0cefb20c, 0xfd01910f25effbe45bccaae3d95c6a, 0x001326], + }, + BigNum { + limbs: [0xe7ea60eb7cbec10bffa78086fdf997, 0xf61c4bca67ebd5e3fdd1c6dc2cea86, 0x005f7c], + }, + BigNum { + limbs: [0xd5b9a214819d3df400587e7902066a, 0xb136ddd3155c5d55da3642c5ab1acc, 0x001470], + }, + BigNum { + limbs: [0xade32f51e3b92db7b324b4eaa555a9, 0xf91f5315f9552e1b95e6b724cde4ee, 0x0008b5], + }, + BigNum { + limbs: [0x0fc0d3ae1aa2d1484cdb4a155aaa58, 0xae33d68783f3051e4221527d0a2065, 0x006b37], + }, + BigNum { + limbs: [0xf8a4660d27320008b429fd878ffa9e, 0x7d7b53ab5425e3b013ebe22d4afdb4, 0x003702], + }, + BigNum { + limbs: [0xc4ff9cf2d729fef74bd60178700563, 0x29d7d5f229224f89c41c27748d079e, 0x003ceb], + }, + BigNum { + limbs: [0xd3a1081b7dc34879cad7e40b802754, 0xb1694de1defdc9b305be4031baafd7, 0x004d4c], + }, + BigNum { + limbs: [0xea02fae48098b68635281af47fd8ad, 0xf5e9dbbb9e4a6986d249c9701d557b, 0x0026a0], + }, + BigNum { + limbs: [0xbb4de382da6cec9b679276f6e92cd5, 0x81b1b3b9f48d763ed728d201436845, 0x004de2], + }, + BigNum { + limbs: [0x02561f7d23ef1264986d880916d32c, 0x25a175e388babcfb00df37a0949d0e, 0x00260b], + }, + BigNum { + limbs: [0xfea794c0e0d6b46940f19dbc185b43, 0xe9cede62c18b938f1b083fb184c56e, 0x000168], + }, + BigNum { + limbs: [0xbefc6e3f1d854a96bf0e6143e7a4be, 0xbd844b3abbbc9faabcffc9f0533fe4, 0x007284], + }, + BigNum { + limbs: [0xadf465bebef8ccebfad58878130b3d, 0xc395d5f911b303cec6f905265aae1a, 0x00446a], + }, + BigNum { + limbs: [0x0faf9d413f633214052a7687ecf4c4, 0xe3bd53a46b952f6b110f047b7d5739, 0x002f82], + }, + BigNum { + limbs: [0x9f1ddab1d4fa82932aebc0965a4202, 0xf36fa2b47ddb5a73c6e65398047a50, 0x000364], + }, + BigNum { + limbs: [0x1e86284e29617c6cd5143e69a5bdff, 0xb3e386e8ff6cd8c61121b609d38b03, 0x007088], + }, + BigNum { + limbs: [0xc769faa4402f293c314964fd4408c9, 0x849c98537bacc5b2f69cad1dade64b, 0x00177b], + }, + BigNum { + limbs: [0xf63a085bbe2cd5c3ceb69a02bbf738, 0x22b6914a019b6d86e16b5c842a1f07, 0x005c72], + }, + BigNum { + limbs: [0x79365f811d5769926a3c0cfe4005c3, 0x79a31835c7e2ccb2e5196d0deb2ba5, 0x003864], + }, + BigNum { + limbs: [0x446da37ee104956d95c3f201bffa3e, 0x2db01167b5656686f2ee9c93ecd9ae, 0x003b89], + }, + BigNum { + limbs: [0x6df44639124f2ba81be6d8edda7638, 0x668413c019df4374af12eabf982893, 0x006f87], + }, + BigNum { + limbs: [0x4fafbcc6ec0cd357e41926122589c9, 0x40cf15dd6368efc528f51ee23fdcc0, 0x000466], + }, + BigNum { + limbs: [0x43a907c09f060427d329827aa98fff, 0xb856c1b52cf9492d043c2e74cf231b, 0x00354b], + }, + BigNum { + limbs: [0x79fafb3f5f55fad82cd67c85567002, 0xeefc67e8504eea0cd3cbdb2d08e238, 0x003ea1], + }, + BigNum { + limbs: [0xb9bf92bae7e7fe896a2d7f2d01187c, 0x0f53d6c54c0941a9861e5c72b0d523, 0x000277], + }, + BigNum { + limbs: [0x03e470451674007695d27fd2fee785, 0x97ff52d8313ef19051e9ad2f273030, 0x007176], + }, + BigNum { + limbs: [0x1b0da0ac3997d798ff94a498f96017, 0x732533ddaf1a10b0beb4fee8a1769d, 0x006801], + }, + BigNum { + limbs: [0xa2966253c4c42767006b5a67069fea, 0x342df5bfce2e228919530ab9368eb6, 0x000bec], + }, + BigNum { + limbs: [0x26c30fdbf9ba3500c4ee9032afcc94, 0x105c8329a6955caccf15dda0d8ad03, 0x002fff], + }, + BigNum { + limbs: [0x96e0f32404a1c9ff3b116ecd50336d, 0x96f6a673d6b2d68d08f22c00ff5850, 0x0043ee], + }, + BigNum { + limbs: [0x236a92397b76349a0f0a5f9fbb73b7, 0x6e8046dfa7d7b0dba6fd299e303d1d, 0x000cc2], + }, + BigNum { + limbs: [0x9a3970c682e5ca65f0f59f60448c4a, 0x38d2e2bdd570825e310ae003a7c836, 0x00672b], + }, + BigNum { + limbs: [0x3b84c03955634d9dafd3593bc10665, 0x7aa88f051d3d6e47e7481dbd70b738, 0x004f3a], + }, + BigNum { + limbs: [0x821f42c6a8f8b162502ca5c43ef99c, 0x2caa9a98600ac4f1f0bfebe4674e1b, 0x0024b3], + }, + BigNum { + limbs: [0x0a98ca924c9853cdf99d946705e265, 0xb82069c37ab55ff8776e9d4b000112, 0x002b67], + }, + BigNum { + limbs: [0xb30b386db1c3ab3206626a98fa1d9c, 0xef32bfda0292d34160996c56d80441, 0x004885], + }, + BigNum { + limbs: [0x50631ef088678db03b789302413b7c, 0xcd6afbf40e773e053844b1d7c4c0ec, 0x00455e], + }, + BigNum { + limbs: [0x6d40e40f75f4714fc4876bfdbec485, 0xd9e82da96ed0f5349fc357ca134467, 0x002e8e], + }, + BigNum { + limbs: [0x1279da43e3f45b1ede5de981ebf8f8, 0xce9f04a28d115ecc4f16874611b142, 0x000db4], + }, + BigNum { + limbs: [0xab2a28bc1a67a3e121a2157e140709, 0xd8b424faf036d46d88f1825bc65411, 0x006638], + }, + BigNum { + limbs: [0x91e47e376c2e5b6ff7d691b3198b23, 0xe821190696fc5d6ecc9a8405e05629, 0x005133], + }, + BigNum { + limbs: [0x2bbf84c8922da39008296d4ce674de, 0xbf321096e64bd5cb0b6d859bf7af2a, 0x0022b9], + }, + BigNum { + limbs: [0xc528e11bb8f362bbb3efec893f294f, 0x10302a2f39be6d2099caa9324c56d8, 0x005679], + }, + BigNum { + limbs: [0xf87b21e445689c444c101276c0d6b2, 0x9722ff6e4389c6193e3d606f8bae7a, 0x001d74], + }, + BigNum { + limbs: [0xd83c84ed265e50977e9c4587dfe508, 0x739e84003bec789aed56b517a468ea, 0x000076], + }, + BigNum { + limbs: [0xe5677e12d7fdae688163b978201af9, 0x33b4a59d415bba9eeab1548a339c68, 0x007377], + }, + BigNum { + limbs: [0x235c660dcd47d87bf14d05ce8047ea, 0xef848d536f6afc0071a614f0a4770c, 0x00643c], + }, + BigNum { + limbs: [0x9a479cf2311426840eb2f9317fb817, 0xb7ce9c4a0ddd37396661f4b1338e47, 0x000fb0], + }, + BigNum { + limbs: [0x7f1ed0313f9e0fe150bea48f8d1dea, 0xe117dc9238c29fb9c14a0e4d763a00, 0x0024c9], + }, + BigNum { + limbs: [0x3e8532cebebdef1eaf415a7072e217, 0xc63b4d0b4485938016bdfb5461cb53, 0x004f23], + }, + BigNum { + limbs: [0x81791f3a6308454c51bb17349f0783, 0xe041d03cc117b367e019a720931783, 0x001d2d], + }, + BigNum { + limbs: [0x3c2ae3c59b53b9b3ae44e7cb60f87e, 0xc7115960bc307fd1f7ee628144edd0, 0x0056bf], + }, + BigNum { + limbs: [0xc3ba13d252c0e88f18500f83965a8e, 0x641539037f771f1b83b02e67527a4d, 0x0055b6], + }, + BigNum { + limbs: [0xf9e9ef2dab9b1670e7afef7c69a573, 0x433df099fdd1141e5457db3a858b05, 0x001e37], + }, + BigNum { + limbs: [0x5502a77ae6332fa6600254a7d754be, 0x4cdc36f88410f5d7bfef36de3b7834, 0x00027e], + }, + BigNum { + limbs: [0x68a15b851828cf599ffdaa5828ab43, 0x5a76f2a4f9373d621818d2c39c8d1f, 0x00716f], + }, + BigNum { + limbs: [0x8d41cd7ab1753ea7303c63152c1640, 0x4a2297423679aee4b37190faa6c7d5, 0x004f91], + }, + BigNum { + limbs: [0x306235854ce6c058cfc39bead3e9c1, 0x5d30925b46ce8455249678a7313d7e, 0x00245c], + }, + BigNum { + limbs: [0x87cba345c1658b64271241619da532, 0x46ae7297a21a8f4310cd2220399c88, 0x0037d2], + }, + BigNum { + limbs: [0x35d85fba3cf6739bd8edbd9e625acf, 0x60a4b705db2da3f6c73ae7819e68cb, 0x003c1b], + }, + BigNum { + limbs: [0x2651d853c9eca95343e645167ee188, 0x1331dca429aad2f2eb5255c656c902, 0x00258b], + }, + BigNum { + limbs: [0x97522aac346f55acbc19b9e9811e79, 0x94214cf9539d6046ecb5b3db813c51, 0x004e62], + }, + BigNum { + limbs: [0x5390d0e60bdfb3b93907b7592ea586, 0xe4164e07f2ab58063db3959fe0ef23, 0x003596], + }, + BigNum { + limbs: [0x6a133219f27c4b46c6f847a6d15a7b, 0xc33cdb958a9cdb339a547401f71630, 0x003e56], + }, + BigNum { + limbs: [0xb8b209e98b7e0f2fa61198c7de7bd4, 0x75e0a5e4145fb34bad5f4e9cfdb6f3, 0x003811], + }, + BigNum { + limbs: [0x04f1f91672ddefd059ee663821842d, 0x317283b968e87fee2aa8bb04da4e60, 0x003bdc], + }, + BigNum { + limbs: [0x6e76cf4f775ba9242cce972bd82d65, 0x812b15a0625c3583f1f0c36ae9d2f5, 0x0011d0], + }, + BigNum { + limbs: [0x4f2d33b0870055dbd33167d427d29c, 0x262813fd1aebfdb5e6174636ee325e, 0x00621d], + }, + BigNum { + limbs: [0x7524de9c02b81cf5045a21462659cf, 0x5fa6f3c3db8efc130759d8cd8c1f9d, 0x0017bf], + }, + BigNum { + limbs: [0x487f2463fba3e20afba5ddb9d9a632, 0x47ac35d9a1b93726d0ae30d44be5b6, 0x005c2e], + }, + BigNum { + limbs: [0x66175e422e5e04509c353c559ce0e4, 0xc2a34bbcc1de81c01f6a38e43c7150, 0x0028ff], + }, + BigNum { + limbs: [0x578ca4bdcffdfaaf63cac2aa631f1d, 0xe4afdde0bb69b179b89dd0bd9b9403, 0x004aed], + }, + BigNum { + limbs: [0xc17fed2efa16c0bf255236c073301f, 0x95c68591a521990ffbee982e626b47, 0x00713f], + }, + BigNum { + limbs: [0xfc2415d104453e40daadc83f8ccfe2, 0x118ca40bd8269a29dc197173759a0b, 0x0002ae], + }, + BigNum { + limbs: [0x37692cb91745a591e0a5ec1dbb4517, 0x2b1236ce1f78bd6f986d418b46797f, 0x006418], + }, + BigNum { + limbs: [0x863ad646e716596e1f5a12e244baea, 0x7c40f2cf5dcf75ca3f9ac816918bd4, 0x000fd5], + }, + BigNum { + limbs: [0x743adadff7878293e97ac2c7bf5f23, 0x47fe2645c3ccca5cf55c4cee43e80b, 0x005d20], + }, + BigNum { + limbs: [0x4969282006d47c6c16853c3840a0de, 0x5f550357b97b68dce2abbcb3941d48, 0x0016cd], + }, + BigNum { + limbs: [0x1f5b434515524094eb42b26bd7cec8, 0x5d84c1e11520848c1259d579deff61, 0x006ae4], + }, + BigNum { + limbs: [0x9e48bfbae909be6b14bd4c94283139, 0x49ce67bc6827aeadc5ae3427f905f2, 0x000909], + }, + BigNum { + limbs: [0x7a83f4b3620a8bc1ab543280174b65, 0x4fe4101d764247b839b40665b9ab31, 0x004d4e], + }, + BigNum { + limbs: [0x43200e4c9c51733e54abcc7fe8b49c, 0x576f19800705eb819e54033c1e5a22, 0x00269f], + }, + BigNum { + limbs: [0x16e6f88f393313659ed34f1ba7c758, 0x479f6d036dbe156e6d5f1cd1d95835, 0x004f05], + }, + BigNum { + limbs: [0xa6bd0a70c528eb9a612cafe45838a9, 0x5fb3bc9a0f8a1dcb6aa8eccffead1e, 0x0024e8], + }, + BigNum { + limbs: [0xb4744f8cf411c654449ec24eff1d4a, 0xae41472c7c0e590ce3fe74cee9cc36, 0x0061df], + }, + BigNum { + limbs: [0x092fb3730a4a38abbb613cb100e2b7, 0xf911e2710139da2cf40994d2ee391d, 0x00120d], + }, + BigNum { + limbs: [0x1b7ec3a436588065b8118cdf67b4c8, 0x457a8a468be812b6b2973fbcaa7c77, 0x003d49], + }, + BigNum { + limbs: [0xa2253f5bc8037e9a47ee7220984b39, 0x61d89f56f16020832570c9e52d88dc, 0x0036a4], + }, + BigNum { + limbs: [0x3412c9cd2a9b3731e9ab2413ce6403, 0x8dc1af53e39e07ae39bf50998fa407, 0x004686], + }, + BigNum { + limbs: [0x89913932d3c0c7ce1654daec319bfe, 0x19917a4999aa2b8b9e48b90848614c, 0x002d67], + }, + BigNum { + limbs: [0x89c1bd2dd357cf20f00f1e8819ff37, 0x2f0c9a6585b33115765c3d23d4949e, 0x003fb7], + }, + BigNum { + limbs: [0x33e245d22b042fdf0ff0e077e600ca, 0x78468f37f795022461abcc7e0370b5, 0x003436], + }, + BigNum { + limbs: [0xdd464b1c886d78042cef5c92e33195, 0x557b73b7e48b242355a680b717f586, 0x0025de], + }, + BigNum { + limbs: [0xe05db7e375ee86fbd310a26d1cce6c, 0x51d7b5e598bd0f16826188eac00fcc, 0x004e0f], + }, + BigNum { + limbs: [0xedf499ef3076be4475c4d42b7a4b38, 0x602954fc0ca6ba46042c3d326406d9, 0x0054de], + }, + BigNum { + limbs: [0xcfaf6910cde540bb8a3b2ad485b4c9, 0x4729d4a170a178f3d3dbcc6f73fe79, 0x001f0f], + }, + BigNum { + limbs: [0xfcd31b702dd686c47e6812cda15c19, 0xf2d45a69922bb0a0d0c53a6b502bef, 0x005861], + }, + BigNum { + limbs: [0xc0d0e78fd085783b8197ec325ea3e8, 0xb47ecf33eb1c82990742cf3687d963, 0x001b8b], + }, + BigNum { + limbs: [0x8425612ae7e671237bffd304e4fe50, 0xf9f2176adc1d48e923008e61d9c58e, 0x004067], + }, + BigNum { + limbs: [0x397ea1d516758ddc84002bfb1b01b1, 0xad611232a12aea50b5077b3ffe3fc5, 0x003385], + }, + BigNum { + limbs: [0xba411117fb1be0bb14f4f365c1b600, 0x58bcb55478df34740bade3183ade28, 0x000335], + }, + BigNum { + limbs: [0x0362f1e803401e44eb0b0b9a3e4a01, 0x4e9674490468fec5cc5a26899d272b, 0x0070b8], + }, + BigNum { + limbs: [0x9fcc4cdb6f0c10a87049c0b5897879, 0x9424325317c08c97b1f14e6a7312cd, 0x006329], + }, + BigNum { + limbs: [0x1dd7b6248f4fee578fb63e4a768788, 0x132ef74a6587a6a22616bb3764f286, 0x0010c4], + }, + BigNum { + limbs: [0x9f899703062de0d3baa1acb4e5b0f5, 0x090a68110f9092a633fc64cef521ba, 0x0065eb], + }, + BigNum { + limbs: [0x1e1a6bfcf82e1e2c455e524b1a4f0c, 0x9e48c18c6db7a093a40ba4d2e2e399, 0x000e02], + }, + BigNum { + limbs: [0xd96ff2cd8b2f2e472cb619daac4bd2, 0x0f2dbc497381f411d51f076e4466de, 0x00573a], + }, + BigNum { + limbs: [0xe4341032732cd0b8d349e52553b42f, 0x98256d5409c63f2802e90233939e74, 0x001cb3], + }, + BigNum { + limbs: [0xb84c544876a9c789aa8cb2686396ce, 0xa3313c8414b9bdb48d3a72566086b0, 0x006dbc], + }, + BigNum { + limbs: [0x0557aeb787b2377655734c979c6933, 0x0421ed19688e75854acd974b777ea3, 0x000631], + }, + BigNum { + limbs: [0xe7613894a9b5c86333defbe1eafec8, 0xecb3aff7822dc90fd38cadbdeab57e, 0x0051a0], + }, + BigNum { + limbs: [0xd642ca6b54a6369ccc21031e150139, 0xba9f79a5fb1a6a2a047b5be3ed4fd4, 0x00224c], + }, + BigNum { + limbs: [0xbd99d6f7d72c9825c9330c166c32b6, 0x656984a80d04d77f485529026c165c, 0x0008f3], + }, + BigNum { + limbs: [0x000a2c08272f66da36ccf2e993cd4b, 0x41e9a4f570435bba8fb2e09f6beef7, 0x006afa], + }, + BigNum { + limbs: [0x00ac7d231f0dcc77f716ad84ec3f4e, 0x66b749227bc79c2b526b533ce6736d, 0x001236], + }, + BigNum { + limbs: [0xbcf785dcdf4e328808e9517b13c0b3, 0x409be07b0180970e859cb664f191e6, 0x0061b7], + }, + BigNum { + limbs: [0x44df453062977b35a87e2790b1aa63, 0x70a52543032792c60337c3de194e28, 0x004ca4], + }, + BigNum { + limbs: [0x78c4bdcf9bc483ca5781d76f4e559e, 0x36ae045a7a20a073d4d045c3beb72b, 0x002749], + }, + BigNum { + limbs: [0x009c43f83b178b774638c79cf5dc1f, 0x3f6e8235ecae3905159358e0d38ebb, 0x0010c4], + }, + BigNum { + limbs: [0xbd07bf07c3447388b9c737630a23e2, 0x67e4a7679099fa34c274b0c1047698, 0x006329], + }, + BigNum { + limbs: [0x2a876351c2a2215759eb2f01eda387, 0xcb3d2bb78a0443275a5062c289ae5a, 0x0051ae], + }, + BigNum { + limbs: [0x931c9fae3bb9dda8a614cffe125c7a, 0xdc15fde5f343f0127db7a6df4e56f9, 0x00223e], + }, + BigNum { + limbs: [0xa8a3a7f2912453021ed75861bf15b2, 0xb5e368fea545ec1883b4b3c9abedbf, 0x0052cb], + }, + BigNum { + limbs: [0x15005b0d6d37abfde128a69e40ea4f, 0xf16fc09ed8024721545355d82c1794, 0x002121], + }, + BigNum { + limbs: [0x99bf3cadf47500466419f0acda4132, 0x0fab03bda4f931faf27e04e17cf31b, 0x004831], + }, + BigNum { + limbs: [0x23e4c65209e6feb99be60e5325becf, 0x97a825dfd84f013ee58a04c05b1238, 0x002bbc], + }, + BigNum { + limbs: [0x2af33beac6f68086ebdd53f2e05b8c, 0x18dfadf4968e6c38c06e52f5b19228, 0x003f52], + }, + BigNum { + limbs: [0x92b0c71537657e791422ab0d1fa475, 0x8e737ba8e6b9c7011799b6ac26732b, 0x00349b], + }, + BigNum { + limbs: [0x532ae018561e10623432bc97e66621, 0x7d758178f8009d3d7a7ff033103d20, 0x003c40], + }, + BigNum { + limbs: [0x6a7922e7a83dee9dcbcd42681999e0, 0x29dda824854795fc5d88196ec7c833, 0x0037ad], + }, + BigNum { + limbs: [0x5fdb8562ecaee38095506aaf2ed4e8, 0x40fa9e92971b3b44484802d2908ee1, 0x005327], + }, + BigNum { + limbs: [0x5dc87d9d11ad1b7f6aaf9450d12b19, 0x66588b0ae62cf7f58fc006cf477672, 0x0020c6], + }, + BigNum { + limbs: [0xc00587548157407cc2c1b551422388, 0x2433aacc79664fd54b05535ed75859, 0x0006c4], + }, + BigNum { + limbs: [0xfd9e7bab7d04be833d3e49aebddc79, 0x831f7ed103e1e3648d02b64300acf9, 0x006d29], + }, + BigNum { + limbs: [0xabf9af77e7e83655b9012175a8cc3b, 0xe87fd6b51c9c4226a334d73bebcb2b, 0x000b72], + }, + BigNum { + limbs: [0x11aa53881673c8aa46fedd8a5733c6, 0xbed352e860abf11334d33265ec3a28, 0x00687a], + }, + BigNum { + limbs: [0x1fbcdb53444abbab0181bccc152b72, 0xedc455355287c6bf314728f7672064, 0x0068e3], + }, + BigNum { + limbs: [0x9de727acba114354fe7e4233ead48f, 0xb98ed4682ac06c7aa6c0e0aa70e4ef, 0x000b09], + }, + BigNum { + limbs: [0x5603226dcddca5147d1e72d2b5d06e, 0xc12baea83c091f5a39e548082c8807, 0x0064a3], + }, + BigNum { + limbs: [0x67a0e092307f59eb82e18c2d4a2f93, 0xe6277af5413f13df9e22c199ab7d4c, 0x000f49], + }, + BigNum { + limbs: [0x2ed8500386c76648c8e50cb39616ec, 0xef6739da92bc569aa8da7c3ebc2a85, 0x005a31], + }, + BigNum { + limbs: [0x8ecbb2fc779498b7371af24c69e915, 0xb7ebefc2ea8bdc9f2f2d8d631bdace, 0x0019bb], + }, + BigNum { + limbs: [0xfe3a2e7b95c6469630cf3b08b533d4, 0x2a8f2e2a85919ad23e75d282b2d3b6, 0x006802], + }, + BigNum { + limbs: [0xbf69d4846895b869cf30c3f74acc2d, 0x7cc3fb72f7b698679992371f25319c, 0x000beb], + }, + BigNum { + limbs: [0xcae90dfb3c0064c6123fa45fb28c2e, 0xd4cb52a34e3d7519670d09634336d4, 0x0023ce], + }, + BigNum { + limbs: [0xf2baf504c25b9a39edc05aa04d73d3, 0xd287d6fa2f0abe2070fb003e94ce7e, 0x00501e], + }, + BigNum { + limbs: [0x5ca0f385906331980144927341bf91, 0xe145a4a45855dd7ae283294477734f, 0x006964], + }, + BigNum { + limbs: [0x61030f7a6df8cd67febb6c8cbe4070, 0xc60d84f924f255bef584e05d609204, 0x000a88], + }, + BigNum { + limbs: [0xa47df0bc824e8ea22755dfe7bb9750, 0xfb32f90ffda0d607ced8ce69bc11a9, 0x0046cf], + }, + BigNum { + limbs: [0x192612437c0d705dd8aa1f184468b1, 0xac20308d7fa75d32092f3b381bf3aa, 0x002d1d], + }, + BigNum { + limbs: [0xec958cdc54a63cc7a96c1c03278845, 0x14461e4a1131fa3b366dda348f3893, 0x000791], + }, + BigNum { + limbs: [0xd10e7623a9b5c2385693e2fcd877bc, 0x930d0b536c1638fea19a2f6d48ccbf, 0x006c5c], + }, + BigNum { + limbs: [0xb5abf8c3e544b7cec40dd9d4019abd, 0xe3e21a204627ca43fa39cf3715caad, 0x002b0f], + }, + BigNum { + limbs: [0x07f80a3c191747313bf2252bfe6544, 0xc3710f7d372068f5ddce3a6ac23aa6, 0x0048dd], + }, + BigNum { + limbs: [0x40722db5a2fdf30997af02bca933c9, 0x56c300383c82d6ab35ba4d5db3f1f7, 0x00688a], + }, + BigNum { + limbs: [0x7d31d54a5b5e0bf66850fc4356cc38, 0x5090296540c55c8ea24dbc4424135c, 0x000b63], + }, + BigNum { + limbs: [0x564fcbc247d6d6ac9cc344a8cfff5a, 0xeb803c23772e9c6afb16ff55ea304f, 0x004b12], + }, + BigNum { + limbs: [0x6754373db6852853633cba573000a7, 0xbbd2ed7a061996cedcf10a4bedd504, 0x0028da], + }, + BigNum { + limbs: [0xcdd1364d8cfacb93f88bc67b7b3721, 0x665f2b83a6deb7fdceb13345570e65, 0x0022a4], + }, + BigNum { + limbs: [0xefd2ccb27161336c0774388484c8e0, 0x40f3fe19d6697b3c0956d65c80f6ed, 0x005149], + }, + BigNum { + limbs: [0x0e9d35b6ed76adf7713ef284c069ff, 0xcf43948b469bcd431486dfe074f000, 0x002d69], + }, + BigNum { + limbs: [0xaf06cd4910e551088ec10c7b3f9602, 0xd80f951236ac65f6c38129c1631553, 0x004683], + }, + BigNum { + limbs: [0x67d80e0380c9dd297e9abd55f848ed, 0x70bfd3999432941131a1638c47aaf6, 0x002ffb], + }, + BigNum { + limbs: [0x55cbf4fc7d9221d6816541aa07b714, 0x36935603e9159f28a666a615905a5d, 0x0043f2], + }, + BigNum { + limbs: [0x8032cefe4d368500c64cd40384f439, 0xe7910a9571c7e580abd9bdea663091, 0x001d7f], + }, + BigNum { + limbs: [0x3d713401b12579ff39b32afc7b0bc8, 0xbfc21f080b804db92c2e4bb771d4c2, 0x00566d], + }, + BigNum { + limbs: [0x121d901c68c49123c031d18d8c2649, 0xd8bc987365098ce1593a825ad83ef5, 0x006fc8], + }, + BigNum { + limbs: [0xab8672e395976ddc3fce2d7273d9b8, 0xce96912a183ea6587ecd8746ffc65e, 0x000424], + }, + BigNum { + limbs: [0xe9d91c5935fd49f4b6cc71968e9630, 0xab942a7f28f2aeb5acc56ef4dd0686, 0x003414], + }, + BigNum { + limbs: [0xd3cae6a6c85eb50b49338d697169d1, 0xfbbeff1e545584842b429aacfafecc, 0x003fd8], + }, + BigNum { + limbs: [0x40d3a6dad17cfb58253c958a750acb, 0xd11e6709e3150b19cc92362eeaac79, 0x00503d], + }, + BigNum { + limbs: [0x7cd05c252cdf03a7dac369758af536, 0xd634c2939a3328200b75d372ed58da, 0x0023af], + }, + BigNum { + limbs: [0x25871b96c0742e75161473966a53f7, 0x032dedb0b892480e75bd26e4e2ccb3, 0x000e42], + }, + BigNum { + limbs: [0x981ce7693de7d08ae9eb8b6995ac0a, 0xa4253becc4b5eb2b624ae2bcf538a0, 0x0065ab], + }, + BigNum { + limbs: [0x309054dce40022360156e8b623013e, 0xbaeda02a6ff092a7ec5a61b18bafed, 0x003381], + }, + BigNum { + limbs: [0x8d13ae231a5bdcc9fea91649dcfec3, 0xec6589730d57a091ebada7f04c5566, 0x00406b], + }, + BigNum { + limbs: [0xa9d4bab0b502dd86edbea447c942d5, 0x0a33a25ac40a26f8483151cc7c8088, 0x0060a2], + }, + BigNum { + limbs: [0x13cf484f4959217912415ab836bd2c, 0x9d1f8742b93e0c418fd6b7d55b84cb, 0x00134b], + }, + BigNum { + limbs: [0x269bddbc2b9df4ce9a534745bfd613, 0xeb58904936dbdf2b8960761678b86c, 0x001fa4], + }, + BigNum { + limbs: [0x97082543d2be0a3165acb7ba4029ee, 0xbbfa9954466c540e4ea7938b5f4ce7, 0x005448], + }, + BigNum { + limbs: [0xc4c8739d4475765bf0e8fec7a9af22, 0xd3a3929c4bb36342213767f33397b9, 0x002c4c], + }, + BigNum { + limbs: [0xf8db8f62b9e688a40f1700385650df, 0xd3af97013194cff7b6d0a1aea46d99, 0x0047a0], + }, + BigNum { + limbs: [0x8c7a99da8938647073084001146f23, 0x948861351141f0f5093f56be4518ad, 0x000b04], + }, + BigNum { + limbs: [0x3129692575239a8f8cf7befeeb90de, 0x12cac8686c064244cec8b2e392eca6, 0x0068e9], + }, + BigNum { + limbs: [0xab88365b6035748de74346b283c145, 0xa824ff74aa74280674d32da105c40d, 0x004f97], + }, + BigNum { + limbs: [0x121bcca49e268a7218bcb84d7c3ebc, 0xff2e2a28d2d40b336334dc00d24146, 0x002455], + }, + BigNum { + limbs: [0x76d28a9be629fb69e5dad127abcc9f, 0x7efc6393c8cfe857780d4fc57e7f03, 0x003ad2], + }, + BigNum { + limbs: [0x46d17864183203961a252dd8543362, 0x2856c609b4784ae25ffab9dc598650, 0x00391b], + }, ]; diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/lib.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/lib.nr new file mode 100644 index 00000000000..1f83b3bb669 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/lib.nr @@ -0,0 +1,5 @@ +mod blob_public_inputs; +mod blob; +mod mock_blob_oracle; +mod unconstrained_config; +// TODO(#9982): Replace unconstrained_config with config and import ROOTS - calculating ROOTS in unconstrained is insecure. diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/main.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/main.nr deleted file mode 100644 index d4b4b06b957..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/blob/src/main.nr +++ /dev/null @@ -1,605 +0,0 @@ -// ONLY IMPORT ONE OF THESE CONFIGS! The big `config` takes 11 mins to compile. - -// SMALL CONFIG ********************************************************************************* - -// mod smaller_config; - -// use crate::smaller_config::{ -// BigNum, BLS12_381_Fr_Params, F, FIELDS_PER_BLOB, LOG_FIELDS_PER_BLOB, NOIR_FIELDS_PER_BLOB, -// FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB, D, D_INV, ROOTS, NEGATIVE_ROOTS -// }; - -//********************************************************************************* - -// BIG CONFIG ********************************************************************* - -mod config; -mod negative_roots; - -use crate::{ - config::{ - BigNum, F, FIELDS_PER_BLOB, LOG_FIELDS_PER_BLOB, NOIR_FIELDS_PER_BLOB, - FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB, D, D_INV, ROOTS -}, - negative_roots::NEGATIVE_ROOTS -}; - -//********************************************************************************* - -use std::hash::poseidon2; - -global LIMB_MAX = 2.pow_32(120); - -unconstrained fn __batch_invert_impl(mut x: [F; N]) -> [F; N] { - let mut accumulator: F = BigNum::one(); - - let mut temporaries: [F] = &[]; - for i in 0..x.len() { - temporaries = temporaries.push_back(accumulator); - if (x[i].__is_zero() == false) { - accumulator = accumulator.__mul(x[i]); - } - } - - accumulator = accumulator.__invmod(); - let mut T0: F = BigNum::new(); - for i in 0..x.len() { - let idx = x.len() - 1 - i; - if (x[idx].__is_zero() == false) { - T0 = accumulator.__mul(temporaries[idx]); - accumulator = accumulator.__mul(x[idx]); - x[idx] = T0; - } - } - x -} - -// Not used because it resulted in "stack too deep", so it's inlined instead. -unconstrained fn __compute_fracs(z: F, ys: [F; FIELDS_PER_BLOB]) -> [F; FIELDS_PER_BLOB] { - let mut denoms: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; - for i in 0..FIELDS_PER_BLOB { - denoms[i] = z.__add(NEGATIVE_ROOTS[i]); // (z - omega^i) - } - let inv_denoms = __batch_invert_impl(denoms); // 1 / (z - omega^i), for all i - - let mut fracs: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; - for i in 0..FIELDS_PER_BLOB { - let inv_denom = inv_denoms[i]; // 1 / (z - omega^i) - - fracs[i] = ys[i].__mul(inv_denom); // y_i / (z - omega^i) - } - fracs -} - -unconstrained fn __field_to_bytes(x: Field) -> [u8; 32] { - x.to_be_bytes() -} - -unconstrained fn __field_to_bignum(x: Field) -> F { - let x_bytes = __field_to_bytes(x); - - BigNum::from_be_bytes(x_bytes) -} - -unconstrained fn __field_to_bignum_limbs(x: Field) -> [Field; 3] { - __field_to_bignum(x).limbs -} - -// Only works for bignums with modulus larger than the BN Fr size (which is true -// for the bls12-381 Fr field). -fn field_to_bignum(x: Field) -> F { - let __x_limbs = __field_to_bignum_limbs(x); - - let mut check = __x_limbs[3 - 1]; - for i in 1..3 { - check *= LIMB_MAX; - check += __x_limbs[3 - i - 1]; - } - assert(check == x); - - BigNum { limbs: __x_limbs } -} - -// DANGER: this assumes the input bignum is <= the Noir field size. -// Only use this if you _know_ the data being passed in is small enough. -// -// Or actually, maybe it's not unsafe, if Field catches overflows? -fn unsafe_bignum_to_field(x: F) -> Field { - let mut result: Field = 0; - result += x.limbs[3 - 1]; - for i in 1..3 { - result *= LIMB_MAX; - result += x.limbs[3 - i - 1]; - } - result -} - -fn bignum_to_bytes(x: F) -> [u8] { - let limb_0_bytes: [u8; 15] = x.limbs[0].to_be_bytes(); - let limb_1_bytes: [u8; 15] = x.limbs[1].to_be_bytes(); - let limb_2_bytes: [u8; 2] = x.limbs[2].to_be_bytes(); - let mut out: [u8; 32] = [0; 32]; - for i in 0..32 { - out[i] = limb_0_bytes[i]; - out[i+15] = limb_1_bytes[i]; - } - for i in 0..1 { - out[30 + i] = limb_2_bytes[i]; - } - std::static_assert(out.len() == 32, "bad byte decomposition of bignum"); - out -} - -// fn kzg_commitment_to_bytes(c: [Field; 2]) -> [u8] { -// let limb_0_bytes: [u8; 32] = x.limbs[0].to_be_bytes(); -// let limb_1_bytes: [u8; 16] = x.limbs[1].to_be_bytes(); - -// let out = limb_2_bytes.append(limb_1_bytes).append(limb_0_bytes); -// std::static_assert(out.len() == 32, "bad byte decomposition of bignum"); -// out -// } - -// DANGER: this assumes the input bignum is <= the Noir field size. -// Only use this if you _know_ the data being passed in is small enough. -// -// This is inefficient, in the sense that we discard ~1 bit of blob space per -// 255-bit blob field, when converting it to a 245-bit noir field. Over the whole blob, -// we end up discarding 1 bit * 4096 fields_per_blob = 512 bytes = 16 words of data. -// BUT, it is much simpler to do this than to reconstitute 4096 disparate bits across -// the whole blob into 16 words. Perhaps the more complex approach should only be -// taken once aztec blobs are sufficiently full? -fn unsafe_blob_to_fields(blob: [F; FIELDS_PER_BLOB]) -> [Field; FIELDS_PER_BLOB] { - let mut blob_as_fields: [Field; FIELDS_PER_BLOB] = [0; FIELDS_PER_BLOB]; - for i in 0..FIELDS_PER_BLOB { - blob_as_fields[i] = unsafe_bignum_to_field(blob[i]); - } - blob_as_fields -} - -unconstrained fn __unsafe_extract_top_bit(x: F) -> (Field, Field) { - let top_limb: Field = x.limbs[2]; - // The top_limb is at most 2 bytes (16 bits). - // 0x8000 = 2^15 = 32768 - let top_bit: Field = (top_limb as u16 / 0x8000) as Field; - let top_limb_with_top_bit_removed = top_limb - top_bit * 0x8000; - (top_bit, top_limb_with_top_bit_removed) -} - -// DANGER: it's named as "unsafe" because the caller MUST already have checked that -// each blob Field is formatted as (u1, Field). I.e. the "rhs" 254-bits should already -// fit within a Field. If the "rhs" 254 bits is larger than the field modulus, -// there will be an uncaught overflow of the 254-bits in the Field, resulting in -// an unintended tiny value. -// -// For efficiency, the top_bit is kept as a Field throughout. -fn unsafe_extract_top_bit(x: F) -> (Field, F) { - let (top_bit, top_limb_with_top_bit_removed) = __unsafe_extract_top_bit(x); - assert_eq(top_bit * 0x8000 + top_limb_with_top_bit_removed, x.limbs[2]); - - (top_bit, BigNum { limbs: [x.limbs[0], x.limbs[1], top_limb_with_top_bit_removed] }) -} - -fn blob_to_fields__tightly_packed(blob: [F; FIELDS_PER_BLOB]) -> [Field; NOIR_FIELDS_PER_BLOB] { - let mut blob_as_fields: [Field; NOIR_FIELDS_PER_BLOB] = [0; NOIR_FIELDS_PER_BLOB]; - let mut top_bits: [Field; FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB] = [0; FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB]; - - // We start with [F; 4096]. - // The first 4064 of these bls-fields have a 255th bit (counting from 1) which can contribute towards - // new 254-bit noir fields. That is, we extract 4064 top-bits from the first 4064 of the 4096 bls-fields, - // and reconstitute them into 4064 / 254 = 16 extra noir fields. - // So we end up with 4096 + 16 = 4112 noir fields. - - // Here we compute top_bits[0:4064] and blob_as_fields[0:4064]. - for i in 0..FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB { - let (top_bit, field_with_top_bit_removed): (Field, F) = unsafe_extract_top_bit(blob[i]); - top_bits[i] = top_bit; - blob_as_fields[i] = unsafe_bignum_to_field(field_with_top_bit_removed); - } - // Here we compute blob_as_fields[4064:4096]. - for i in FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB..FIELDS_PER_BLOB { - blob_as_fields[i] = unsafe_bignum_to_field(blob[i]); - } - // Here we compute blob_as_fields[4096:4112] from top_bits[0:4064] - for i in FIELDS_PER_BLOB..NOIR_FIELDS_PER_BLOB { - // the top_bits are assumed to be big-endian bit arrays: - let mut reconstituted_field = top_bits[0]; - for j in 1..254 { - let k = (i - FIELDS_PER_BLOB) * 254 + j; - reconstituted_field *= 2; - reconstituted_field += top_bits[k]; - // std::as_witness(reconstituted_field); // this was costing 4048 gates - } - blob_as_fields[i] = reconstituted_field; - } - blob_as_fields -} - -// TODO: We'll want to hash this data -// in an arrangement which makes sense to the aztec protocol. THink about this more. -fn hash_blob(blob: [F; FIELDS_PER_BLOB]) -> Field { - // let mut blob_as_fields = unsafe_blob_to_fields(blob); - let mut blob_as_fields = blob_to_fields__tightly_packed(blob); - let hash = poseidon2::Poseidon2::hash(blob_as_fields, blob_as_fields.len()); - hash -} - -fn hash_kzg_commitment(kzg_commitment: [Field; 2]) -> Field { - let hash = poseidon2::Poseidon2::hash(kzg_commitment, kzg_commitment.len()); - hash -} - -fn compute_challenge(blob: [F; FIELDS_PER_BLOB], kzg_commitment: [Field; 2]) -> Field { - let kzg_commitment_hash = hash_kzg_commitment(kzg_commitment); - let blob_hash = hash_blob(blob); - // let blob_hash = 1; - let challenge = poseidon2::Poseidon2::hash([blob_hash, kzg_commitment_hash], 2); - challenge -} - -// ~500k constraints. 30 MINUTES TO COMPILE (due to all the brillig)! -// -// Note: the kzg_commitment is technically a BLS12-381 point in (Fq, Fq), but -// we haven't implemented Fq; only Fr, and we don't actually need to operate on it; -// we just need the bits of data. So we've simply encoded it as fitting inside a -// [Field; 2], since two 254-bit fields more-than covers 381+1=382 bits. -fn main(blob: [F; FIELDS_PER_BLOB], kzg_commitment: [Field; 2]) -> pub (Field, F, [Field; 2]) { - let challenge_z: Field = compute_challenge(blob, kzg_commitment); - let challenge_z_as_bignum: F = field_to_bignum(challenge_z); - - let y: F = barycentric_evaluate_blob_at_z(challenge_z_as_bignum, blob); - // let y = challenge_z_as_bignum; // dummy constraint for when we want to skip the barycentric stuff in testing. - - // let challenge_z_as_bytes: [u8; 32] = challenge_z.to_be_bytes(); - // let y_as_bytes: [u8] = bignum_to_bytes(y); - // let kzg_commitment_as_bytes: [u8] = () - - // TODO: this return data needs to be TIGHTLY PACKED into bytes. - // TODO: then those bytes need to be sha256-hashed, to produce a single value that can be sent to ethereum for cheap snark verification. On ethereum, the bytes will be sent along with the sha256-hash of the bytes. The bytes will be used in the point evaluation precompile. The sha256-hash will form a part of the public inputs of the zk-snark proof. - (challenge_z, y, kzg_commitment) -} - -/** - * ___d-1 - * z^d - 1 \ omega^i - * p(z) = --------- . / y_i . --------- - * d /____ z - omega^i - * i=0 - * - * p(z) = factor . sum( y_i . num / denom ) - * - * - * where d = 4096 - * - * Precompute: - * - The d roots of unity omega^i (plus maybe their negatives for z - omega^i computations). - * - (1 / d) - * - * @param z - * @param ys - the many y_i's of the blob. - * - * @return y = p(z) - */ -fn barycentric_evaluate_blob_at_z(z: F, ys: [F; FIELDS_PER_BLOB]) -> F { - // z ^ D: - - let mut t1 = z.__mul(z); - - BigNum::evaluate_quadratic_expression([[z]], [[false]], [[z]], [[false]], [t1], [true]); - - let mut t2: F = BigNum::new(); - for _i in 0..LOG_FIELDS_PER_BLOB - 1 { - t2 = t1.__mul(t1); - - // GRATUITOUS USAGE OF as_witness, LIKE THROWING DARTS AT A DARTBOARD AND HOPING THIS HELPS - std::as_witness(t2.limbs[0]); - std::as_witness(t2.limbs[1]); - std::as_witness(t2.limbs[2]); - - BigNum::evaluate_quadratic_expression([[t1]], [[false]], [[t1]], [[false]], [t2], [true]); - - t1 = t2; - std::as_witness(t1.limbs[0]); - std::as_witness(t1.limbs[1]); - std::as_witness(t1.limbs[2]); - } - - let z_pow_d = t1; - - // factor: - - let one: F = BigNum::one(); - - t1 = z_pow_d.__sub(one); - std::as_witness(t1.limbs[0]); - std::as_witness(t1.limbs[1]); - std::as_witness(t1.limbs[2]); - - let factor = t1.__mul(D_INV); - - // (z_pow_d - one) * (D_INV) - factor = 0 - // z_pow_d * D_INV - D_INV - factor = 0 - BigNum::evaluate_quadratic_expression( - [[z_pow_d]], - [[false]], - [[D_INV]], - [[false]], - [factor, D_INV], - [true, true] - ); - - // This version doesn't work: - // BigNum::evaluate_quadratic_expression( - // [[z_pow_d, one]], - // [[false, true]], - // [[D_INV]], - // [[false]], - // [factor], - // [true] - // ); - - // sum: - - let mut sum: F = BigNum::new(); - - // Making a call to this function causes a "stack too deep" error, so I've put the body of that function here, instead: - // let fracs = __compute_fracs(z, ys); // { y_i / (z - omega^i) } - - // Note: it's more efficient (saving 30k constraints) to compute: - // ___d-1 - // \ / y_i \ - // / | --------- | . omega^i - // /____ \ z - omega^i / - // i=0 - // ^^^^^^^^^ - // frac - // - // ... than to compute: - // - // ___d-1 - // \ / omega^i \ - // / y_i . | --------- | - // /____ \ z - omega^i / - // i=0 - // - // perhaps because all the omega^i terms are constant witnesses? - - //***************************************************************** - // This section is only needed because `__compute_fracs` isn't working (stack too deep error). - - let mut fracs: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; // y_i / (z - omega^i), for all i - - let mut denoms = [BigNum::new(); FIELDS_PER_BLOB]; - for i in 0..FIELDS_PER_BLOB { - denoms[i] = z.__add(NEGATIVE_ROOTS[i]); // (z - omega^i) - } - - // If you're seeing a `bug` warning for this line, I think it's fine. - // Ideally, we'd be using `__compute_fracs`, anyway, but we're getting a "stack too deep" error. - let inv_denoms = __batch_invert_impl(denoms); // 1 / (z - omega^i), for all i - - for i in 0..FIELDS_PER_BLOB { - let num = ys[i]; - let inv_denom = inv_denoms[i]; // 1 / (z - omega^i) - - let frac = num.__mul(inv_denom); // y_i * (1 / (z - omega^i)) - - fracs[i] = frac; // y_i / (z - omega^i) - std::as_witness(fracs[i].limbs[0]); - std::as_witness(fracs[i].limbs[1]); - std::as_witness(fracs[i].limbs[2]); - - //End of section that is only needed because `__compute_fracs` isn't working - //***************************************************************** - - // frac <-- ys[i] / (z + neg_roots[i]) - // frac * (z + neg_roots[i]) - ys[i] = 0 - BigNum::evaluate_quadratic_expression( - [[fracs[i]]], - [[false]], - [[z, NEGATIVE_ROOTS[i]]], - [[false, false]], - [ys[i]], - [true] - ); - } - - // OK so...we can add multiple product terms into a sum...but I am not sure how many! - // we are computing 254 * 254 bit products and we need to ensure each product limb doesn't overflow - // each limb is 120 bits => 120 * 120 = 240 bits. - // however when computing a mul we add up to 5 product terms into a single field element => 243 bits (ish) - // when we do a modular reduction we validate that a field element >> 120 bits is less than 2^{126} which implies we have 246 bits to play with - // which implies...we can accomodate up to EIGHT additions of product terms before we risk overflowing - // (this is really messy! I never considered the case of giant linear sequences of products) - let mut sum: F = BigNum::new(); - - // Seeking: - // ___d-1 - // \ omega^i - // sum = / y_i . --------- - // /____ z - omega^i - // i=0 - let NUM_PARTIAL_SUMS = FIELDS_PER_BLOB / 8; - for i in 0..NUM_PARTIAL_SUMS { - let mut partial_sum: F = BigNum::new(); - let mut lhs: [F; 8] = [BigNum::new(); 8]; - let mut rhs = lhs; - - // Seeking: - // ___i*8 + 7 - // \ omega^k - // partial_sum = / y_k . --------- - // /____ z - omega^k - // k=i*8 + 0 - - for j in 0..8 { - let k = i * 8 + j; - lhs[j] = ROOTS[k]; // omega^k - rhs[j] = fracs[k]; // y_k / (z - omega^k) - std::as_witness(lhs[j].limbs[0]); - std::as_witness(lhs[j].limbs[1]); - std::as_witness(lhs[j].limbs[2]); - std::as_witness(rhs[j].limbs[0]); - std::as_witness(rhs[j].limbs[1]); - std::as_witness(rhs[j].limbs[2]); - - // y_k * ( omega^k / (z - omega^k) ) - let summand = ROOTS[k].__mul(fracs[k]); - - // partial_sum + ( y_k * ( omega^k / (z - omega^k) ) -> partial_sum - partial_sum = partial_sum.__add(summand); - std::as_witness(partial_sum.limbs[0]); - std::as_witness(partial_sum.limbs[1]); - std::as_witness(partial_sum.limbs[2]); - } - - // Seeking: - // ___i*8 - 1 ___i*8 + 7 - // \ omega^i \ / y_k \ - // sum_out = / y_i . --------- + / omega^k . | --------- | - // /____ z - omega^i /____ \ z - omega^k / - // 0 k = i*8 - // ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - // sum partial_sum - // - // ... that is: - // - // ___i*8 - 1 ___ 7 - // \ omega^i \ - // sum_out = / y_i . --------- + / lhs[j] . rhs[j] - // /____ z - omega^i /____ - // 0 j = 0 - // ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^ - // sum partial_sum - // - - let mut sum_out = sum.__add(partial_sum); - - std::as_witness(sum_out.limbs[0]); - std::as_witness(sum_out.limbs[1]); - std::as_witness(sum_out.limbs[2]); - - // sum_out <- sum + (lhs[0] * rhs[0] + ... + lhs[7] * rhs[7]) - // => (lhs[0] * rhs[0] + ... + lhs[7] * rhs[7]) + sum - sum_out == 0 - BigNum::evaluate_quadratic_expression( - [[lhs[0]], [lhs[1]], [lhs[2]], [lhs[3]], [lhs[4]], [lhs[5]], [lhs[6]], [lhs[7]]], - [[false], [false], [false], [false], [false], [false], [false], [false]], - [[rhs[0]], [rhs[1]], [rhs[2]], [rhs[3]], [rhs[4]], [rhs[5]], [rhs[6]], [rhs[7]]], - [[false], [false], [false], [false], [false], [false], [false], [false]], - [sum, sum_out], - [false, true] - ); - - sum = sum_out; - std::as_witness(sum.limbs[0]); - std::as_witness(sum.limbs[1]); - std::as_witness(sum.limbs[2]); - } - - // y: - - let y = factor.__mul(sum); - - // y <- factor * sum - // => factor * sum - y == 0 - BigNum::evaluate_quadratic_expression([[factor]], [[false]], [[sum]], [[false]], [y], [true]); - - println(y); - - y -} - -#[test] -fn test_main() { - let mut blob: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; - - blob[0] = BigNum { limbs: [0x1234, 0, 0] }; - blob[1] = BigNum { limbs: [0xabcd, 0, 0] }; - blob[2] = BigNum { limbs: [0x69, 0, 0] }; - - let kzg_commitment_in = [1, 2]; // this is made-up nonsense. - - let (challenge_z, y, kzg_commitment) = main(blob, kzg_commitment_in); - - println(challenge_z); - println(y); - println(kzg_commitment); -} - -#[test] -fn test_print() { - let x = 4; - println(f"x: {x}"); -} - -#[test] -fn test_bignum_conversions() { - let x = 1000; - let x_bignum = __field_to_bignum(x); - println(f"x_bignum: {x_bignum}"); -} - -// nargo test --show-output test_barycentric -#[test] -fn test_barycentric() { - let z: F = BigNum { limbs: [2, 0, 0] }; - - // many y's form a blob: - let mut ys: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; - - ys[0] = BigNum { limbs: [0x1234, 0, 0] }; - ys[1] = BigNum { limbs: [0xabcd, 0, 0] }; - ys[2] = BigNum { limbs: [0x69, 0, 0] }; - - // evaluate the blob at z = 2 to yield y: - let y = barycentric_evaluate_blob_at_z(z, ys); - - let mut expected_y: [Field; 3] = [0; 3]; - if (FIELDS_PER_BLOB == 4096) { - // Computed with the eth consensus specs py lib - expected_y = [ - 0x0c62e352a428e8e9842eadc1c106bd, - 0x902c5b4968d755b6f49c0231e15af8, - 0x00049a - ]; - // Also computed with cKzg, in the typescript tests: - // 0x049a902c5b4968d755b6f49c0231e15af80c62e352a428e8e9842eadc1c106bd - } - if (FIELDS_PER_BLOB == 8) { - // Computed with the eth consensus specs py lib (after hacking it to cope with blobs of size 8 instead of 4096): - expected_y = [ - 0xb04cdea4304000053abffffffb203a, - 0x0000000002e30785c8afa4496f8e38, - 0x000000 - ]; - } - assert(y.limbs == expected_y); -} - -// Helper function used to populate the hard-coded double_modulus value in the bls12381Fr.nr file in the bignum library. -unconstrained fn compute_double_modulus() -> [Field; 3] { - let two_p = [0x7b4805fffcb7fdfffffffe00000002, 0x4ea6533afa906673b0101343b00aa7, 0x00e7db]; - let NUM_LIMBS = 3; // must be >= 3 - let two_pow_120 = 2.pow_32(120); - let mut double_modulus: [Field; 3] = [0; 3]; - - double_modulus[0] = two_p[0] + two_pow_120; - for i in 1..NUM_LIMBS - 1 { - double_modulus[i] = two_p[i] + two_pow_120 - 1; - } - double_modulus[NUM_LIMBS - 1] = two_p[NUM_LIMBS - 1] - 1; - double_modulus -} - -// nargo test --show-output test_compute_double_modulus -#[test] -fn test_compute_double_modulus() { - println(compute_double_modulus()); -} - -// nargo test --show-output test_compute_d_inv -#[test] -fn test_compute_d_inv() { - let D_INV = D.__invmod(); - println(D_INV); -} - diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/mock_blob_oracle.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/mock_blob_oracle.nr new file mode 100644 index 00000000000..e25468ded05 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/mock_blob_oracle.nr @@ -0,0 +1,23 @@ +use crate::blob_public_inputs::{BlobCommitment, BlockBlobPublicInputs}; +use types::{ + abis::sponge_blob::SpongeBlob, + constants::{BLOB_PUBLIC_INPUTS, BLOBS_PER_BLOCK, FIELDS_PER_BLOB}, +}; +// TODO(#10323): this was added to save simulation time (~1min in ACVM, ~3mins in wasm -> 500ms). +// The use of bignum adds a lot of unconstrained code which overloads limits when simulating. +// If/when simulation times of unconstrained are improved, remove this. +pub unconstrained fn evaluate_blobs( + blobs_as_fields: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK], + kzg_commitments: [BlobCommitment; BLOBS_PER_BLOCK], + mut sponge_blob: SpongeBlob, +) -> BlockBlobPublicInputs { + let fields = evaluate_blobs_oracle(blobs_as_fields, kzg_commitments, sponge_blob); + BlockBlobPublicInputs::deserialize(fields) +} + +#[oracle(evaluateBlobs)] +unconstrained fn evaluate_blobs_oracle( + blobs_as_fields: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK], + kzg_commitments: [BlobCommitment; BLOBS_PER_BLOCK], + mut sponge_blob: SpongeBlob, +) -> [Field; BLOB_PUBLIC_INPUTS * BLOBS_PER_BLOCK] {} diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/negative_roots.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/negative_roots.nr deleted file mode 100644 index a494173e618..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/blob/src/negative_roots.nr +++ /dev/null @@ -1,4102 +0,0 @@ -use dep::bigint::BigNum; - -// TODO: these negative roots are actually a rearrangement of the roots. If it is inefficient to load all 4096 of these bls fields (12k noir fields), we could perhaps modify the barycentric formula to do some clever indexing to lookup negative roots from the existing roots array. I'd be weary of auditability and bugs with such an approach, though. - -global NEGATIVE_ROOTS = [ - BigNum { limbs: [ 0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed ] } , - BigNum { limbs: [ 0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000 ] } , - BigNum { limbs: [ 0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed ] } , - BigNum { limbs: [ 0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000 ] } , - BigNum { limbs: [ 0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96 ] } , - BigNum { limbs: [ 0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457 ] } , - BigNum { limbs: [ 0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9 ] } , - BigNum { limbs: [ 0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333 ] } , - BigNum { limbs: [ 0xfef0f00df2ec88ac159e2688bd4333, 0xd8c1e977024e561dcd0fd4d314d93b, 0x00533b ] } , - BigNum { limbs: [ 0xbeb312f20b6f7653ea61d87742bcce, 0xce9140267af9dd1c0af834cec32c17, 0x0020b1 ] } , - BigNum { limbs: [ 0xc8bd90143c7a436a20b4c8fbee018e, 0x4de4b45f2d7bc4a72e43a8f20dbb34, 0x0024c1 ] } , - BigNum { limbs: [ 0xf4e672ebc1e1bb95df4b360411fe73, 0x596e753e4fcc6e92a9c460afca4a1e, 0x004f2c ] } , - BigNum { limbs: [ 0x43389604eeaf5a7f847ee47dc08d74, 0x15b4607e449bd66c91d61832fc60bd, 0x005511 ] } , - BigNum { limbs: [ 0x7a6b6cfb0faca4807b811a823f728d, 0x919ec91f38ac5ccd4631f16edba496, 0x001edc ] } , - BigNum { limbs: [ 0x010d53ccb225425e544cdf4c887948, 0xb475ab91194b687a73c92f188612fc, 0x003b25 ] } , - BigNum { limbs: [ 0xbc96af334c36bca1abb31fb37786b9, 0xf2dd7e0c63fccabf643eda8951f257, 0x0038c7 ] } , - BigNum { limbs: [ 0x4f1b07b3c56074c9f39f658c9620b3, 0x17191423f48d7e7d03f9e6ac83bc94, 0x00230d ] } , - BigNum { limbs: [ 0x6e88fb4c38fb8a360c60997369df4e, 0x903a157988bab4bcd40e22f55448bf, 0x0050e0 ] } , - BigNum { limbs: [ 0x0124a02ec3ede2c13af36ece5c935e, 0xe1cface780a62d34ccafd6d0ce6e2d, 0x000df6 ] } , - BigNum { limbs: [ 0xbc7f62d13a6e1c3ec50c9031a36ca3, 0xc5837cb5fca206050b5832d1099726, 0x0065f6 ] } , - BigNum { limbs: [ 0x7fdf9c77487ae79733f3a6ba60eaa6, 0xa2fb6162ffabd84f8612c8b6cc00bd, 0x00476f ] } , - BigNum { limbs: [ 0x3dc46688b5e11768cc0c58459f155b, 0x0457c83a7d9c5aea51f540eb0c0496, 0x002c7e ] } , - BigNum { limbs: [ 0xd460a1dbfcd267df2b12e5b0330148, 0xcd3a7fca77e38a490835c612d67951, 0x0020e9 ] } , - BigNum { limbs: [ 0xe943612401899720d4ed194fccfeb9, 0xda18a9d30564a8f0cfd2438f018c01, 0x005303 ] } , - BigNum { limbs: [ 0x8c291cbae2a361196986abd51edcb5, 0x83d4d0a0ae73ac3f6e2f24bd52fe70, 0x006f8c ] } , - BigNum { limbs: [ 0x317ae6451bb89de69679532ae1234c, 0x237e58fcced486fa69d8e4e48506e3, 0x000461 ] } , - BigNum { limbs: [ 0x6466930923ab7811a43132b1888c36, 0xf5e67a06fbd88f907adac98af5480e, 0x006f70 ] } , - BigNum { limbs: [ 0x593d6ff6dab086ee5bcecc4e7773cb, 0xb16caf96816fa3a95d2d4016e2bd45, 0x00047c ] } , - BigNum { limbs: [ 0x16d26dfeb2f7ee7d19743e43af5772, 0x4b9a3c48cf47ecaed406f9fc1065f1, 0x001cfa ] } , - BigNum { limbs: [ 0xa6d195014b641082e68bc0bc50a88f, 0x5bb8ed54ae00468b04010fa5c79f62, 0x0056f3 ] } , - BigNum { limbs: [ 0x7876bf0928e68fae34a81e1cfca2ec, 0xed8c432405d0ae25b21df6c52b2a6c, 0x005e73 ] } , - BigNum { limbs: [ 0x452d43f6d5756f51cb57e0e3035d15, 0xb9c6e6797777851425ea12dcacdae7, 0x001579 ] } , - BigNum { limbs: [ 0x2724b71d050aa97ebf2fcc0f5611ae, 0x440d3d981efb1e97f596a4c8da4826, 0x002e3e ] } , - BigNum { limbs: [ 0x967f4be2f951558140d032f0a9ee53, 0x6345ec055e4d14a1e27164d8fdbd2d, 0x0045af ] } , - BigNum { limbs: [ 0xcb9993a1e752756220b9443bf5371d, 0x77449923ce3ca1cac574d6e7aa0947, 0x004b02 ] } , - BigNum { limbs: [ 0xf20a6f5e1709899ddf46bac40ac8e4, 0x300e9079af0b916f129332ba2dfc0b, 0x0028eb ] } , - BigNum { limbs: [ 0xe1991fee0e510a7b9610b1db94977e, 0xf9e8afe7612dc1649310899759ba6e, 0x00205b ] } , - BigNum { limbs: [ 0xdc0ae311f00af48469ef4d246b6883, 0xad6a79b61c1a71d544f7800a7e4ae4, 0x005391 ] } , - BigNum { limbs: [ 0x8f60f019fd400926be16cb704b990a, 0xa2325ba21faac6e50c813baa997430, 0x002f00 ] } , - BigNum { limbs: [ 0x2e4312e6011bf5d941e9338fb466f7, 0x0520cdfb5d9d6c54cb86cdf73e9123, 0x0044ed ] } , - BigNum { limbs: [ 0xaaf80b0c55bd8430f9a5d7f0c3cdb2, 0x4257e466b84b3c8c71b5ba9e612b6f, 0x001ef3 ] } , - BigNum { limbs: [ 0x12abf7f3a89e7acf065a270f3c324f, 0x64fb4536c4fcf6ad66524f0376d9e4, 0x0054fa ] } , - BigNum { limbs: [ 0x93335cea2da31a2d03a19553a24b82, 0x66a6d1a50dea09febaa04d13f22bb2, 0x0065a5 ] } , - BigNum { limbs: [ 0x2a70a615d0b8e4d2fc5e69ac5db47f, 0x40ac57f86f5e293b1d67bc8de5d9a1, 0x000e48 ] } , - BigNum { limbs: [ 0x9e4af408c2b9413f0eca84af71a186, 0xa6a78265e48883e0070b973ffd92c2, 0x001b29 ] } , - BigNum { limbs: [ 0x1f590ef73ba2bdc0f1357a508e5e7b, 0x00aba73798bfaf59d0fc7261da7291, 0x0058c4 ] } , - BigNum { limbs: [ 0xbabf1e9e172de6223c4fc056e43d9a, 0x2f0122e8072dabac70f83e4acd519b, 0x001095 ] } , - BigNum { limbs: [ 0x02e4e461e72e18ddc3b03ea91bc267, 0x785206b5761a878d670fcb570ab3b8, 0x006358 ] } , - BigNum { limbs: [ 0xf9b80ec36bb2b55ba6c1e4335d3495, 0x1c76ad9e668d4f4bc1c2f86897360c, 0x002026 ] } , - BigNum { limbs: [ 0xc3ebf43c92a949a4593e1acca2cb6c, 0x8adc7bff16bae3ee1645113940cf46, 0x0053c7 ] } , - BigNum { limbs: [ 0xd6586048a1b7870bb1eb8b66cd55ce, 0x56c914ef83eed9620388e8f73902f9, 0x003c1a ] } , - BigNum { limbs: [ 0xe74ba2b75ca477f44e14739932aa33, 0x508a14adf95959d7d47f20aa9f0259, 0x0037d3 ] } , - BigNum { limbs: [ 0x1e85011d426b52b891fa3f982b68c5, 0xdaee7b3c79d6566009b5882952d6a4, 0x00199c ] } , - BigNum { limbs: [ 0x9f1f01e2bbf0ac476e05bf67d4973c, 0xcc64ae610371dcd9ce528178852eaf, 0x005a50 ] } , - BigNum { limbs: [ 0xa2bee506858fc6870b11e11ba54d0f, 0xa3d0ddae097ebcf95c6ee2bfcfce81, 0x000596 ] } , - BigNum { limbs: [ 0x1ae51df978cc3878f4ee1de45ab2f2, 0x03824bef73c976407b9926e20836d2, 0x006e57 ] } , - BigNum { limbs: [ 0x4910119f300f47d64b34dde86304f3, 0x2dc00c9fa4b3b3c03b15fa3a7826e9, 0x007082 ] } , - BigNum { limbs: [ 0x7493f160ce4cb729b4cb21179cfb0e, 0x79931cfdd8947f799cf20f675fde6a, 0x00036b ] } , - BigNum { limbs: [ 0xb73f5d9958580573ea3fa3e6fe310f, 0xba2461933c32412d801131c542d24e, 0x0068f0 ] } , - BigNum { limbs: [ 0x0664a566a603f98c15c05b1901cef2, 0xed2ec80a4115f20c57f6d7dc953305, 0x000afc ] } , - BigNum { limbs: [ 0xdb96c6037b2ae2f8d84c914e68b10d, 0xd155db6e78824b6f2c61beab61e404, 0x004b26 ] } , - BigNum { limbs: [ 0xe20d3cfc83311c0727b36db1974ef4, 0xd5fd4e2f04c5e7caaba64af676214e, 0x0028c6 ] } , - BigNum { limbs: [ 0x872ef3dce28e788d28c143168bba2c, 0x097461a2eeaf4e84b3cd7dc75b61db, 0x00640d ] } , - BigNum { limbs: [ 0x36750f231bcd8672d73ebbe97445d5, 0x9ddec7fa8e98e4b5243a8bda7ca378, 0x000fe0 ] } , - BigNum { limbs: [ 0xecd9567808eac2aecf3d3d99feda43, 0x963f1644f6057b734cba89c47734ba, 0x000b55 ] } , - BigNum { limbs: [ 0xd0caac87f5713c5130c2c1660125be, 0x111413588742b7c68b4d7fdd60d098, 0x006898 ] } , - BigNum { limbs: [ 0x8d00b4a1b1e1cd5f6d85cc838aefbe, 0x0f15498c6f24f1f9df7fc191d3ac9b, 0x00431b ] } , - BigNum { limbs: [ 0x30a34e5e4c7a31a0927a327c751043, 0x983de0110e23413ff88848100458b8, 0x0030d2 ] } , - BigNum { limbs: [ 0x9f9c8b080ee81bd10899b24dbbf12d, 0xb19b5e5f8ee9313b8642525d5075f6, 0x0022df ] } , - BigNum { limbs: [ 0x1e0777f7ef73e32ef7664cb2440ed4, 0xf5b7cb3dee5f01fe51c5b744878f5d, 0x00510d ] } , - BigNum { limbs: [ 0x5d206f9aa2eeccc15168ac46d068db, 0x8d3bec0cc3466f0af7c7244a3da1a4, 0x005e3f ] } , - BigNum { limbs: [ 0x608393655b6d323eae9752b92f9726, 0x1a173d90ba01c42ee040e5579a63af, 0x0015ae ] } , - BigNum { limbs: [ 0xaa3be95461c35c8ad72a76bc61a4ef, 0x6c715d7a8ee18506b7660550ec6994, 0x00595e ] } , - BigNum { limbs: [ 0x136819ab9c98a27528d588439e5b12, 0x3ae1cc22ee66ae3320a20450eb9bbf, 0x001a8f ] } , - BigNum { limbs: [ 0x0cc5569e6281d1bfff4f4b898366d9, 0x9c52d10eaa78a7a111083c39ad633a, 0x003e27 ] } , - BigNum { limbs: [ 0xb0deac619bda2d4000b0b3767c9928, 0x0b00588ed2cf8b98c6ffcd682aa219, 0x0035c6 ] } , - BigNum { limbs: [ 0x286adfae56d25be72cfc5c9966d09e, 0x3ba0fa4b6f560e09b1a3879520095f, 0x006e5f ] } , - BigNum { limbs: [ 0x95392351a789a318d303a266992f63, 0x6bb22f520df225302664820cb7fbf4, 0x00058e ] } , - BigNum { limbs: [ 0x75c4fd31a9bdfbb14b44a23cfe6f92, 0xfa6a84eec93cd9bbb5adebfdc2994f, 0x0002a8 ] } , - BigNum { limbs: [ 0x47df05ce549e034eb4bb5cc301906f, 0xace8a4aeb40b597e225a1da4156c04, 0x007144 ] } , - BigNum { limbs: [ 0x40042d8d8ef0be12605a3ecd13f5de, 0x0024e28a13e18ee8aa1b9e97d4cdd5, 0x0014be ] } , - BigNum { limbs: [ 0x7d9fd5726f6b40ed9fa5c032ec0a23, 0xa72e47136966a4512dec6b0a03377e, 0x005f2f ] } , - BigNum { limbs: [ 0x82d714b1cb5d445b0e07816f77b3a7, 0x47e7840143b38aeed579d92544a1d4, 0x005199 ] } , - BigNum { limbs: [ 0x3accee4e32febaa4f1f87d90884c5a, 0x5f6ba59c3994a84b028e307c93637f, 0x002254 ] } , - BigNum { limbs: [ 0x1dff643be95635b750da4cab28e208, 0xc802a94a946e8cbe2437f0b4b27650, 0x0007d0 ] } , - BigNum { limbs: [ 0x9fa49ec41505c948af25b254d71df9, 0xdf508052e8d9a67bb3d018ed258f03, 0x006c1c ] } , - BigNum { limbs: [ 0xb2b183f7ec0b194222925245f4e2fb, 0x0c47d9f8e63309b97ddd04dcc90920, 0x001878 ] } , - BigNum { limbs: [ 0x0af27f081250e5bddd6dacba0b1d06, 0x9b0b4fa4971529805a2b04c50efc33, 0x005b75 ] } , - BigNum { limbs: [ 0xbdb5218d05af8af6a1cd7025d071a5, 0x21e17d3cd87a2ed1234cde5d6927a9, 0x004ae9 ] } , - BigNum { limbs: [ 0xffeee172f8ac74095e328eda2f8e5c, 0x8571ac60a4ce0468b4bb2b446edda9, 0x002904 ] } , - BigNum { limbs: [ 0xc0551ac0e33765241de8ab6c75208d, 0x9d9a302401865eec2340271598ef87, 0x005944 ] } , - BigNum { limbs: [ 0xfd4ee83f1b2499dbe21753938adf74, 0x09b8f9797bc1d44db4c7e28c3f15cb, 0x001aa9 ] } , - BigNum { limbs: [ 0xc2217b84b789f1c0f0045c15eb6cca, 0x23f0bdd367bbf9b36026bf15201e3d, 0x001bd8 ] } , - BigNum { limbs: [ 0xfb82877b46d20d3f0ffba2ea149337, 0x83626bca158c398677e14a8cb7e715, 0x005815 ] } , - BigNum { limbs: [ 0xccffd43f1931b63ff630d3f89c4c2c, 0x34a0f387add7faa1f3804fdb73d008, 0x001f38 ] } , - BigNum { limbs: [ 0xf0a42ec0e52a48c009cf2b0763b3d5, 0x72b23615cf703897e487b9c664354a, 0x0054b5 ] } , - BigNum { limbs: [ 0xffe63827d533369b173ba8dd620212, 0xd4bf2035cba62b52573b968efab1e1, 0x000c3f ] } , - BigNum { limbs: [ 0xbdbdcad82928c864e8c456229dfdef, 0xd2940967b1a207e780cc7312dd5371, 0x0067ad ] } , - BigNum { limbs: [ 0x7294c2bb71bbb2bba97efd27ba08e2, 0x925014876109c4ae3115d25772a7b6, 0x0020d5 ] } , - BigNum { limbs: [ 0x4b0f40448ca04c44568101d845f71f, 0x150315161c3e6e8ba6f2374a655d9d, 0x005318 ] } , - BigNum { limbs: [ 0xdb89e0a4a5765fe2c1b6af78029270, 0x1b5dc39ecc507541df17373a065728, 0x004f53 ] } , - BigNum { limbs: [ 0xe21a225b58e59f1d3e494f87fd6d91, 0x8bf565feb0f7bdf7f8f0d267d1ae2a, 0x00249a ] } , - BigNum { limbs: [ 0x28fb6cae51baff7ef262ffa8f8c918, 0x611dcedcb15b720543223d96f0ac8d, 0x0007aa ] } , - BigNum { limbs: [ 0x94a89651aca0ff810d9cff570736e9, 0x46355ac0cbecc13494e5cc0ae758c6, 0x006c43 ] } , - BigNum { limbs: [ 0x291d47986d31d3bbf254b932e053a6, 0xa37bb55ee341bde19c2cf633387e72, 0x005950 ] } , - BigNum { limbs: [ 0x9486bb67912a2b440dab45cd1fac5b, 0x03d7743e9a0675583bdb136e9f86e1, 0x001a9d ] } , - BigNum { limbs: [ 0x4dee80538980eca8e45d0230d79fe6, 0xacc5d6a40c8de1f7cc23d4a0a0fa3d, 0x005a56 ] } , - BigNum { limbs: [ 0x6fb582ac74db12571ba2fccf28601b, 0xfa8d52f970ba51420be43501370b16, 0x001996 ] } , - BigNum { limbs: [ 0x333e46f0700ee03227ea10b26bd413, 0x06f483d66e532628df85d7c3f50e72, 0x0040b7 ] } , - BigNum { limbs: [ 0x8a65bc0f8e4d1ecdd815ee4d942bee, 0xa05ea5c70ef50d10f88231dde2f6e1, 0x003336 ] } , - BigNum { limbs: [ 0x66f8a0dc0e6bbe91e8a1ba3b6f3441, 0x2d20409a835fe1b2c3aa0eb455ffbe, 0x001a11 ] } , - BigNum { limbs: [ 0x56ab6223eff0406e175e44c490cbc0, 0x7a32e902f9e85187145dfaed820595, 0x0059dc ] } , - BigNum { limbs: [ 0x79114c0bc2a6e035825224af0aaa1d, 0x1712a762f4607c95a954c7a25068a3, 0x0013c8 ] } , - BigNum { limbs: [ 0x4492b6f43bb51eca7dadda50f555e4, 0x9040823a88e7b6a42eb341ff879cb0, 0x006025 ] } , - BigNum { limbs: [ 0xf54484042843734f76a9059bae8f9f, 0x7bd601e8bb0a29c34d9781b10bdf29, 0x006097 ] } , - BigNum { limbs: [ 0xc85f7efbd6188bb08956f964517062, 0x2b7d27b4c23e09768a7087f0cc2629, 0x001356 ] } , - BigNum { limbs: [ 0x0f59e12c64384016236e58af56f1b8, 0x4d7bbcfd52504045ee80a2a90eecf7, 0x005d2a ] } , - BigNum { limbs: [ 0xae4a21d39a23bee9dc91a650a90e49, 0x59d76ca02af7f2f3e98766f8c9185c, 0x0016c3 ] } , - BigNum { limbs: [ 0xf69b4a47af75655a9a50847f96ec43, 0x90b59abcf615a6231d154bcbeebf11, 0x004636 ] } , - BigNum { limbs: [ 0xc708b8b84ee699a565af7a806913be, 0x169d8ee087328d16baf2bdd5e94641, 0x002db7 ] } , - BigNum { limbs: [ 0xc290a30beab8a82a0a83854a64dccf, 0x33e0bb0973b096c09431666614720d, 0x0011fb ] } , - BigNum { limbs: [ 0xfb135ff413a356d5f57c79b59b2332, 0x73726e9409979c7943d6a33bc39345, 0x0061f2 ] } , - BigNum { limbs: [ 0x4c9bd5d6faba529cc2c16c38357332, 0x4d8c8ac99daef21979ec507b8b9ad7, 0x00374e ] } , - BigNum { limbs: [ 0x71082d2903a1ac633d3e92c7ca8ccf, 0x59c69ed3df9941205e1bb9264c6a7c, 0x003c9f ] } , - BigNum { limbs: [ 0x7d0aaebb6e8b5c2433b50af8bb7619, 0xc2eca698be862c164da00c6f5f076d, 0x00581e ] } , - BigNum { limbs: [ 0x409954448fd0a2dbcc4af4074489e8, 0xe4668304bec207238a67fd3278fde6, 0x001bce ] } , - BigNum { limbs: [ 0x81066e578d78bf6207cd2f20df9d12, 0xefec34093e9a725ce48f79bf9cd600, 0x0060c7 ] } , - BigNum { limbs: [ 0x3c9d94a870e33f9df832cfdf2062ef, 0xb766f5943eadc0dcf3788fe23b2f53, 0x001325 ] } , - BigNum { limbs: [ 0xb53e5a66157cffb6ca42cf7e8096b6, 0x66ba46b38c19c80356e65d94e35849, 0x002452 ] } , - BigNum { limbs: [ 0x0865a899e8deff4935bd2f817f694b, 0x4098e2e9f12e6b368121ac0cf4ad0a, 0x004f9b ] } , - BigNum { limbs: [ 0x6d471fd7d619f99d47ae1b2d5cb20c, 0x9cb1d4e5cd90d2ed0c39d81ba4edef, 0x000db0 ] } , - BigNum { limbs: [ 0x505ce32828420562b851e3d2a34df5, 0x0aa154b7afb7604ccbce3186331764, 0x00663d ] } , - BigNum { limbs: [ 0x83c14c0425182e523db144c948a873, 0x7e100025cede2c14671f92089bc7df, 0x0019e7 ] } , - BigNum { limbs: [ 0x39e2b6fbd943d0adc24eba36b7578e, 0x29432977ae6a072570e877993c3d74, 0x005a06 ] } , - BigNum { limbs: [ 0xf14a39fc751f567d6dcabcb43adfeb, 0xa40efa6dcac098af3a8f44a3055298, 0x0026b8 ] } , - BigNum { limbs: [ 0xcc59c903893ca8829235424bc52016, 0x03442f2fb2879a8a9d78c4fed2b2ba, 0x004d35 ] } , - BigNum { limbs: [ 0x393a229e5c956ea8e747e70c3352b9, 0x0fa52ca5f2b6074231113972d1f31e, 0x0020b8 ] } , - BigNum { limbs: [ 0x8469e061a1c6905718b817f3ccad48, 0x97adfcf78a922bf7a6f6d02f061235, 0x005335 ] } , - BigNum { limbs: [ 0x964479e66a29b26678ce10f387bc87, 0x504e08859b66e14f851900aff7991b, 0x00284a ] } , - BigNum { limbs: [ 0x275f891994324c998731ee0c78437a, 0x57052117e1e151ea52ef08f1e06c38, 0x004ba3 ] } , - BigNum { limbs: [ 0xe0cfc513638e8df766c4aadd94806e, 0x67fad38d59a038f1bab4965c08a022, 0x0031e5 ] } , - BigNum { limbs: [ 0xdcd43dec9acd7108993b54226b7f93, 0x3f58561023a7fa481d537345cf6530, 0x004208 ] } , - BigNum { limbs: [ 0x0a9a547af7f7203c1d97dd9423b5d1, 0x39c63dcea51c6dfda5ce9bf2fc0c49, 0x0067dc ] } , - BigNum { limbs: [ 0xb309ae850664dec3e268216bdc4a30, 0x6d8cebced82bc53c32396daedbf90a, 0x000c11 ] } , - BigNum { limbs: [ 0xacb6a751c4cf62e9b77e2a455758d3, 0x702adadc3bea54f132dd768cbcd025, 0x002fbb ] } , - BigNum { limbs: [ 0x10ed5bae398c9c164881d4baa8a72e, 0x37284ec1415dde48a52a93151b352e, 0x004432 ] } , - BigNum { limbs: [ 0x3dd930616645bb8acad28c5f36ac67, 0xc138ef72e20e3645eba92f93fcb1b3, 0x00314a ] } , - BigNum { limbs: [ 0x7fcad29e98164375352d72a0c9539a, 0xe61a3a2a9b39fcf3ec5eda0ddb53a0, 0x0042a2 ] } , - BigNum { limbs: [ 0x4adbcf1b2f27651340a28ffe15d019, 0xcbbd0503595ec98da723e86bdc412c, 0x002b92 ] } , - BigNum { limbs: [ 0x72c833e4cf3499ecbf5d6f01ea2fe8, 0xdb96249a23e969ac30e42135fbc427, 0x00485a ] } , - BigNum { limbs: [ 0xc72871c1151445d010a9edb4b638a4, 0x9164dbe6739dc4f0a81758d181ac9c, 0x00713a ] } , - BigNum { limbs: [ 0xf67b913ee947b92fef56114b49c75d, 0x15ee4db709aa6e492ff0b0d05658b6, 0x0002b3 ] } , - BigNum { limbs: [ 0x66372d5f7944f1045697cc52056d9b, 0x984a697ff768d986c0c20a39fc66c8, 0x0025b9 ] } , - BigNum { limbs: [ 0x576cd5a085170dfba96832adfa9266, 0x0f08c01d85df59b31745ff67db9e8b, 0x004e34 ] } , - BigNum { limbs: [ 0xb1ae62415a9910cca54ea0331495d4, 0xaecf5af2f4abb40ec2b38999673e05, 0x00163d ] } , - BigNum { limbs: [ 0x0bf5a0bea3c2ee335ab15ecceb6a2d, 0xf883ceaa889c7f2b1554800870c74e, 0x005daf ] } , - BigNum { limbs: [ 0xef7d53496e420711c4c75b7ec9cc10, 0xfa7c095d48bff317e2f8e7ee39e7bc, 0x000ca9 ] } , - BigNum { limbs: [ 0xce26afb69019f7ee3b38a3813633f1, 0xacd7204034884021f50f21b39e1d96, 0x006743 ] } , - BigNum { limbs: [ 0x1cb8c070f0ce322e9a4db5f138dab3, 0x5980dade66efbcca660ee327eb377a, 0x006a94 ] } , - BigNum { limbs: [ 0xa0eb428f0d8dccd165b2490ec7254e, 0x4dd24ebf1658766f71f92679eccdd9, 0x000959 ] } , - BigNum { limbs: [ 0x2fb0fde29479defdde6c4bcc3c47ac, 0x7ee321cfb3ba051f83121c342bf6e5, 0x003d6a ] } , - BigNum { limbs: [ 0x8df3051d69e220022193b333c3b855, 0x287007cdc98e2e1a54f5ed6dac0e6e, 0x003683 ] } , - BigNum { limbs: [ 0x0dd8d1bcb91626d103024fb1d9a54a, 0xf2c9a0e3a19998e526154ae4ed7989, 0x00443a ] } , - BigNum { limbs: [ 0xafcb31434545d82efcfdaf4e265ab7, 0xb48988b9dbae9a54b1f2bebcea8bca, 0x002fb2 ] } , - BigNum { limbs: [ 0x4a95d2c3e71de2f6f43227eaade450, 0x2e127d4b36ff388a3903558023a261, 0x002d43 ] } , - BigNum { limbs: [ 0x730e303c173e1c090bcdd715521bb1, 0x7940ac524648faaf9f04b421b462f2, 0x0046aa ] } , - BigNum { limbs: [ 0x170673bd1b99a3d922fa1a3b513f68, 0x4ce5aa3941ee054ba2513a8f6466a4, 0x003629 ] } , - BigNum { limbs: [ 0xa69d8f42e2c25b26dd05e4c4aec099, 0x5a6d7f643b5a2dee35b6cf12739eaf, 0x003dc4 ] } , - BigNum { limbs: [ 0x807acfac7a7564eb7d8810073f5d6a, 0x4339fb741fc31769583e0d6d2c1a7a, 0x00415e ] } , - BigNum { limbs: [ 0x3d29335383e69a148277eef8c0a297, 0x64192e295d851bd07fc9fc34abead9, 0x00328f ] } , - BigNum { limbs: [ 0x911f0feabd369ed3545212d01cdd49, 0xccf9865fb1560092a559ef66cd15de, 0x004557 ] } , - BigNum { limbs: [ 0x2c84f3154125602cabadec2fe322b8, 0xda59a33dcbf232a732ae1a3b0aef75, 0x002e95 ] } , - BigNum { limbs: [ 0x483352f033ff64adf373b18b704af8, 0x51ecd7358cb0e80451eb57c7c2cac8, 0x0036e7 ] } , - BigNum { limbs: [ 0x7570b00fca5c9a520c8c4d748fb509, 0x55665267f0974b35861cb1da153a8b, 0x003d06 ] } , - BigNum { limbs: [ 0x8a9a8b48559c156358cf18763f4063, 0x2a235b185c763e293867324c9a71d9, 0x007343 ] } , - BigNum { limbs: [ 0x330977b7a8bfe99ca730e689c0bf9e, 0x7d2fce8520d1f5109fa0d7553d937a, 0x0000aa ] } , - BigNum { limbs: [ 0x777b4d984f404a1c2a241e2d08c1c0, 0xf0091746f546751b65160340510aef, 0x000522 ] } , - BigNum { limbs: [ 0x4628b567af1bb4e3d5dbe0d2f73e41, 0xb74a12568801be1e72f2066186fa64, 0x006eca ] } , - BigNum { limbs: [ 0x5e4d6e9cbd5e02c4d432320e1384eb, 0x08d50d96eba478550062e390c312e4, 0x001e0b ] } , - BigNum { limbs: [ 0x5f56946340fdfc3b2bcdccf1ec7b16, 0x9e7e1c0691a3bae4d7a5261114f26f, 0x0055e2 ] } , - BigNum { limbs: [ 0xbbd67710e3399ec1e9f9b456588891, 0x86052e81456eb383cca0626033166f, 0x000db8 ] } , - BigNum { limbs: [ 0x01cd8bef1b22603e16064aa9a77770, 0x214dfb1c37d97fb60b67a741a4eee4, 0x006635 ] } , - BigNum { limbs: [ 0x12655fec382b488ab3113c021da780, 0x7d875f42d925180ea84a5115cfd262, 0x0053aa ] } , - BigNum { limbs: [ 0xab3ea313c630b6754ceec2fde25881, 0x29cbca5aa4231b2b2fbdb88c0832f1, 0x002043 ] } , - BigNum { limbs: [ 0x68befea0679e494b94920969459132, 0xd44cddf6abc21d51a2e03b9c9cf237, 0x001e03 ] } , - BigNum { limbs: [ 0x54e5045f96bdb5b46b6df596ba6ecf, 0xd3064ba6d18615e83527ce053b131c, 0x0055e9 ] } , - BigNum { limbs: [ 0x693fdc8713f747bf7579b9d2eebd4d, 0x92aeafc59bc1963edac49c2696da4d, 0x00178b ] } , - BigNum { limbs: [ 0x54642678ea64b7408a86452d1142b4, 0x14a479d7e1869cfafd436d7b412b06, 0x005c62 ] } , - BigNum { limbs: [ 0x46869d4d10052be675fcb3e18fa3f3, 0x95e215d7a7a452f66ec2c60b147c17, 0x004e91 ] } , - BigNum { limbs: [ 0x771d65b2ee56d3198a034b1e705c0e, 0x117113c5d5a3e04369454396c3893c, 0x00255c ] } , - BigNum { limbs: [ 0xf464cb4256a3b3f3f90bd2b05e602e, 0xebe124834a8fcfdc1da7bf59004b42, 0x0036e1 ] } , - BigNum { limbs: [ 0xc93f37bda7b84b0c06f42c4fa19fd3, 0xbb72051a32b8635dba604a48d7ba10, 0x003d0b ] } , - BigNum { limbs: [ 0x40515e8a158dedad5b3bb2b65b60e3, 0x8b7ffb85398c18fae2b2b0ec6a9811, 0x0005ff ] } , - BigNum { limbs: [ 0x7d52a475e8ce1152a4c44c49a49f1e, 0x1bd32e1843bc1a3ef55558b56d6d42, 0x006dee ] } , - BigNum { limbs: [ 0x6eaf3c40be7b3838159f7147329ad5, 0x2aac2d0686c83e013c718435ef5413, 0x0055f8 ] } , - BigNum { limbs: [ 0x4ef4c6bf3fe0c6c7ea608db8cd652c, 0x7ca6fc96f67ff5389b96856be8b140, 0x001df5 ] } , - BigNum { limbs: [ 0x84d7b3f8b7cf132874e1098b7e9b1a, 0x5092e98ac1b47a9970f370ae50cbc6, 0x001585 ] } , - BigNum { limbs: [ 0x38cc4f07468cebd78b1ef5748164e7, 0x56c04012bb93b8a0671498f387398d, 0x005e68 ] } , - BigNum { limbs: [ 0x5d62341f399e527a79183fcde843c9, 0x31feceffb21884061f9f18bf5ab67d, 0x006974 ] } , - BigNum { limbs: [ 0x6041cee0c4bdac8586e7bf3217bc38, 0x75545a9dcb2faf33b868f0e27d4ed6, 0x000a79 ] } , - BigNum { limbs: [ 0x3c92294a7df3115dd34f3efbca7e49, 0x47e9d645599344915a4a7e63657193, 0x0032d5 ] } , - BigNum { limbs: [ 0x8111d9b58068eda22cb0c0043581b8, 0x5f69535823b4eea87dbd8b3e7293c0, 0x004118 ] } , - BigNum { limbs: [ 0xbba87982f8a3ab72032b6dd9980aa2, 0x7eba81db23a02297d49fc28271cf6b, 0x000f0a ] } , - BigNum { limbs: [ 0x01fb897d05b8538dfcd4912667f55f, 0x2898a7c259a810a20368471f6635e8, 0x0064e3 ] } , - BigNum { limbs: [ 0x50e43a80a9bd4cf0ea8a73552c030d, 0x2863a6f63f83bb09fed64b951d7aa3, 0x005b0c ] } , - BigNum { limbs: [ 0x6cbfc87f549eb20f15758baad3fcf4, 0x7eef82a73dc4782fd931be0cba8ab0, 0x0018e1 ] } , - BigNum { limbs: [ 0xb901d9b44bf6cee9dd22a497765719, 0x994d9fc0040d8e1dd927f6f6bf4ac2, 0x003dbe ] } , - BigNum { limbs: [ 0x04a2294bb265301622dd5a6889a8e8, 0x0e0589dd793aa51bfee012ab18ba91, 0x00362f ] } , - BigNum { limbs: [ 0xa2163218d48aa1c0ef0c55544da820, 0x239cd9c777f74c72f50d0dde0ecfa2, 0x003cd5 ] } , - BigNum { limbs: [ 0x1b8dd0e729d15d3f10f3a9abb257e1, 0x83b64fd60550e6c6e2fafbc3c935b1, 0x003718 ] } , - BigNum { limbs: [ 0xf812a0fada0ad9898a4a40149eac37, 0x2f025b748d0949212bd8afe3031a1c, 0x002fe8 ] } , - BigNum { limbs: [ 0xc59162052451257675b5beeb6153ca, 0x7850ce28f03eea18ac2f59bed4eb36, 0x004405 ] } , - BigNum { limbs: [ 0x3cae032393991be9561c176a2f777a, 0xed25272e58ee91b000235a5bfd4fc0, 0x006d64 ] } , - BigNum { limbs: [ 0x80f5ffdc6ac2e316a9e3e795d08887, 0xba2e026f2459a189d7e4af45dab593, 0x000688 ] } , - BigNum { limbs: [ 0x44f49758f2e4f90e5070b9bada029b, 0xf6421e7859bbb5c8af93f751a2bcf2, 0x0027b9 ] } , - BigNum { limbs: [ 0x78af6ba70b7705f1af8f454525fd66, 0xb1110b25238c7d7128741250354861, 0x004c33 ] } , - BigNum { limbs: [ 0x7edb7e69c459f44c191129505eef66, 0xd87eefb9b5beb3e1674c00ddcfeef2, 0x001638 ] } , - BigNum { limbs: [ 0x3ec884963a020ab3e6eed5afa1109b, 0xced439e3c7897f5870bc08c4081661, 0x005db4 ] } , - BigNum { limbs: [ 0xbe0261fa1ef0748bd63e0485773dba, 0xc5875ac931fbed257db1ed5ff5da83, 0x006ceb ] } , - BigNum { limbs: [ 0xffa1a105df6b8a7429c1fa7a88c247, 0xe1cbced44b4c46145a561c41e22acf, 0x000701 ] } , - BigNum { limbs: [ 0x4b7d976c7acfe832b49690815bdc10, 0x941c73d35adbfe74944fa524ee2707, 0x00677b ] } , - BigNum { limbs: [ 0x72266b93838c16cd4b696e7ea423f1, 0x1336b5ca226c34c543b8647ce9de4c, 0x000c72 ] } , - BigNum { limbs: [ 0x5354ab6e8c2ab4f007bdc150d024b1, 0xaa7aeef7d8dee0eb9d91cdecccfbbf, 0x001f2c ] } , - BigNum { limbs: [ 0x6a4f579172314a0ff8423daf2fdb50, 0xfcd83aa5a469524e3a763bb50b0994, 0x0054c0 ] } , - BigNum { limbs: [ 0x8db8d2298d3f8e16a0c798f162eacb, 0xcf811bf1365ac48ba1f92b1fec5c78, 0x006bba ] } , - BigNum { limbs: [ 0x2feb30d6711c70e95f38660e9d1536, 0xd7d20dac46ed6eae360ede81eba8db, 0x000832 ] } , - BigNum { limbs: [ 0xaf7f13d0a74f74dbbc76a74c1da9e8, 0x98fa4cbff0603b174240d6d0c662a1, 0x005987 ] } , - BigNum { limbs: [ 0x0e24ef2f570c8a24438957b3e25619, 0x0e58dcdd8ce7f82295c732d111a2b2, 0x001a66 ] } , - BigNum { limbs: [ 0x1a65f594b099268117a83fe0dacaef, 0x1bfda43188b512712448c25af0595d, 0x002b76 ] } , - BigNum { limbs: [ 0xa33e0d6b4dc2d87ee857bf1f253512, 0x8b55856bf49320c8b3bf4746e7abf6, 0x004877 ] } , - BigNum { limbs: [ 0xa63f546586f6d2da37c449f8b60f52, 0x2b8b7d02f5cf2f49c52c6190369d3b, 0x0015e2 ] } , - BigNum { limbs: [ 0x1764ae9a77652c25c83bb50749f0af, 0x7bc7ac9a877903f012dba811a16818, 0x005e0b ] } , - BigNum { limbs: [ 0xf315a6b2d095ff2d787c980313ea47, 0x372554761399758318df7c28ca7b95, 0x0016d4 ] } , - BigNum { limbs: [ 0xca8e5c4d2dc5ffd2878366fcec15ba, 0x702dd52769aebdb6bf288d790d89bd, 0x005d19 ] } , - BigNum { limbs: [ 0x80256afc11e71d85fcf33c21a24ad6, 0xcb61c12c11e74dc142b14aa249269d, 0x0056da ] } , - BigNum { limbs: [ 0x3d7e9803ec74e17a030cc2de5db52b, 0xdbf168716b60e5789556beff8edeb6, 0x001d12 ] } , - BigNum { limbs: [ 0x408d95d9268abf109873789332cd2a, 0x9110624b32011b2911f5ddb3864aca, 0x000190 ] } , - BigNum { limbs: [ 0x7d166d26d7d13fef678c866ccd32d7, 0x1642c7524b471810c6122bee51ba89, 0x00725d ] } , - BigNum { limbs: [ 0xba2b752da27a4e8d66b6b5017225bb, 0x7601029a4196d247f1687a9eb754cb, 0x0011c1 ] } , - BigNum { limbs: [ 0x03788dd25be1b072994949fe8dda46, 0x315227033bb160f1e69f8f0320b088, 0x00622c ] } , - BigNum { limbs: [ 0x45442a4caa31c65b585be1aadcb79d, 0x7c4e35f66b90ebafe0c16826da6975, 0x004fce ] } , - BigNum { limbs: [ 0x785fd8b3542a38a4a7a41d55234864, 0x2b04f3a711b74789f746a17afd9bde, 0x00241f ] } , - BigNum { limbs: [ 0xfdab76f48019b80ffc32908c1049f0, 0x9775428ee41b2674c1244e803b82a8, 0x005f80 ] } , - BigNum { limbs: [ 0xbff88c0b7e4246f003cd6e73efb611, 0x0fdde70e992d0cc516e3bb219c82aa, 0x00146d ] } , - BigNum { limbs: [ 0x7cbc17fe538ac37a355caf264d4933, 0xf579f5325dd3ffbe4b7354be35fc6e, 0x000177 ] } , - BigNum { limbs: [ 0x40e7eb01aad13b85caa34fd9b2b6ce, 0xb1d9346b1f74337b8c94b4e3a208e5, 0x007275 ] } , - BigNum { limbs: [ 0x560ac1281b27b43e0664b6a44982e0, 0xcd6eb725f684d2d28fd9dc0d920b64, 0x0018fd ] } , - BigNum { limbs: [ 0x679941d7e3344ac1f99b485bb67d21, 0xd9e4727786c36067482e2d9445f9ef, 0x005aef ] } , - BigNum { limbs: [ 0xe32750901a3f7f194e60f3a1520636, 0x8aeb7895fc66a495eee2bbe6b01a7b, 0x0057eb ] } , - BigNum { limbs: [ 0xda7cb26fe41c7fe6b19f0b5eadf9cb, 0x1c67b10780e18ea3e9254dbb27ead7, 0x001c02 ] } , - BigNum { limbs: [ 0x0dca122075b980101710f74afb7107, 0x332fb92a0335f1d522fdb2753b9f65, 0x006916 ] } , - BigNum { limbs: [ 0xafd9f0df88a27eefe8ef07b5048efa, 0x742370737a124164b50a572c9c65ee, 0x000ad7 ] } , - BigNum { limbs: [ 0xdf56fce8bd22da93050b36e83ec01b, 0x993461faf18fdb43e6645492ac8622, 0x007328 ] } , - BigNum { limbs: [ 0xde4d06174139246cfaf4c817c13fe6, 0x0e1ec7a28bb857f5f1a3b50f2b7f30, 0x0000c5 ] } , - BigNum { limbs: [ 0x7b4ee66e4caccb7d01866add958780, 0x7658084c71a467e701a945e9b713df, 0x0018ba ] } , - BigNum { limbs: [ 0x42551c91b1af3382fe7994226a7881, 0x30fb21510ba3cb52d65ec3b820f174, 0x005b33 ] } , - BigNum { limbs: [ 0x268d78c59e5b00babe46ffd11fbcb3, 0x4100d476d6f3f93aebe3fc216f657d, 0x006a9c ] } , - BigNum { limbs: [ 0x97168a3a6000fe4541b8ff2ee0434e, 0x66525526a65439feec240d80689fd6, 0x000951 ] } , - BigNum { limbs: [ 0x1d256641a44b4fd5a18486a7be5e27, 0xf0d85715c2389db00efaaefd61d069, 0x000d5f ] } , - BigNum { limbs: [ 0xa07e9cbe5a10af2a5e7b785841a1da, 0xb67ad287bb0f9589c90d5aa47634ea, 0x00668d ] } , - BigNum { limbs: [ 0x51124d9f38a3d264d11e5e40eed6d0, 0xcafd455e05aa248cee69c0ae043a7d, 0x004fb2 ] } , - BigNum { limbs: [ 0x6c91b560c5b82c9b2ee1a0bf112931, 0xdc55e43f779e0eace99e48f3d3cad6, 0x00243a ] } , - BigNum { limbs: [ 0x7b55024e5ba8cf5f15555ba7c59481, 0x15b1a10112962edb5dd3926d465f42, 0x00408b ] } , - BigNum { limbs: [ 0x424f00b1a2b32fa0eaaaa3583a6b80, 0x91a1889c6ab2045e7a34773491a611, 0x003362 ] } , - BigNum { limbs: [ 0xb19c81ab2696c55b36bed952623e8b, 0x9e2178411af206551ddbbdaeb8d015, 0x000ae8 ] } , - BigNum { limbs: [ 0x0c078154d7c539a4c94125ad9dc176, 0x0931b15c62562ce4ba2c4bf31f353e, 0x006905 ] } , - BigNum { limbs: [ 0x22d0dee6c4fa9c8c8d1d91a8df6b62, 0x7aacf872a63ad4ff231a7b85a381a9, 0x006f49 ] } , - BigNum { limbs: [ 0x9ad324193961627372e26d5720949f, 0x2ca6312ad70d5e3ab4ed8e1c3483aa, 0x0004a4 ] } , - BigNum { limbs: [ 0xde1cdf309627554e936d6ec3cf97e5, 0x2c5d26f96239e8c982570f56a5560e, 0x0049ba ] } , - BigNum { limbs: [ 0xdf8723cf6834a9b16c92903c30681c, 0x7af602a41b0e4a7055b0fa4b32af44, 0x002a33 ] } , - BigNum { limbs: [ 0x1d9f02709eb90093277736a35fa518, 0xb8a187109e2da14d12d4e142af50a6, 0x00588b ] } , - BigNum { limbs: [ 0xa005008f5fa2fe6cd888c85ca05ae9, 0xeeb1a28cdf1a91ecc533285f28b4ad, 0x001b61 ] } , - BigNum { limbs: [ 0xd19bc8cbd2faac2393abcd485fee6d, 0x63042b0b017f91f84ff7a4d483324e, 0x00493e ] } , - BigNum { limbs: [ 0xec083a342b6152dc6c5431b7a01194, 0x444efe927bc8a141881064cd54d304, 0x002aaf ] } , - BigNum { limbs: [ 0xfe867dc61896f386642e87c3c5520f, 0xd064608e5f2f072d1252b0ee8768db, 0x002e8e ] } , - BigNum { limbs: [ 0xbf1d8539e5c50b799bd1773c3aadf2, 0xd6eec90f1e192c0cc5b558b3509c77, 0x00455e ] } , - BigNum { limbs: [ 0x7c5b52db2a5c58e302dccf4853d300, 0x18783b6e925b1875aba524351eafb0, 0x001b40 ] } , - BigNum { limbs: [ 0x4148b024d3ffa61cfd232fb7ac2d01, 0x8edaee2eeaed1ac42c62e56cb955a3, 0x0058ad ] } , - BigNum { limbs: [ 0x31b0356f6a9b5c49182c727dbb9b2e, 0x482e7e3453a9b0c1aa8a59aec67c30, 0x0051b3 ] } , - BigNum { limbs: [ 0x8bf3cd9093c0a2b6e7d38c824464d3, 0x5f24ab69299e82782d7daff3118923, 0x00223a ] } , - BigNum { limbs: [ 0xecd8830dcc0a87a87aba4a19b4551b, 0x20593e7aa7d629114bed4238dad377, 0x003fa2 ] } , - BigNum { limbs: [ 0xd0cb7ff2325177578545b4e64baae6, 0x86f9eb22d5720a288c1ac768fd31db, 0x00344b ] } , - BigNum { limbs: [ 0x749ce3d6806cc2df259f8f0b5c45d6, 0x9de85005026e67409b01de51fdb529, 0x00012e ] } , - BigNum { limbs: [ 0x49071f297def3c20da606ff4a3ba2b, 0x096ad9987ad9cbf93d062b4fda502a, 0x0072bf ] } , - BigNum { limbs: [ 0x206fbc4adcbd25d3873ed3a6ec005f, 0xa54afcaeb187f4382c695d1c52f9a4, 0x002a07 ] } , - BigNum { limbs: [ 0x9d3446b5219ed92c78c12b5913ffa2, 0x02082ceecbc03f01ab9eac85850baf, 0x0049e6 ] } , - BigNum { limbs: [ 0x05eef4a96aad48bd7831edbb030fe8, 0x5814750a6cbe6d7b9d657ca5570433, 0x003ec1 ] } , - BigNum { limbs: [ 0xb7b50e5693aeb64287ce1144fcf019, 0x4f3eb4931089c5be3aa28cfc810120, 0x00352c ] } , - BigNum { limbs: [ 0x8cca56e78e96b9e0a8ac1b333b6dd3, 0x735d04dc0040e8378be639ffa7e013, 0x00323f ] } , - BigNum { limbs: [ 0x30d9ac186fc5451f5753e3ccc4922e, 0x33f624c17d074b024c21cfa2302540, 0x0041ae ] } , - BigNum { limbs: [ 0x6fbe9550966ceedce70e087bbfc955, 0xa59c190e10e0d2f740262a46581b55, 0x000356 ] } , - BigNum { limbs: [ 0x4de56daf67ef102318f1f6844036ac, 0x01b7108f6c67604297e1df5b7fe9fe, 0x007097 ] } , - BigNum { limbs: [ 0xe18e474ae247464219652d417991d9, 0x59e2fa4a0e2d43e305da5e1bbe7b40, 0x001cac ] } , - BigNum { limbs: [ 0xdc15bbb51c14b8bde69ad1be866e28, 0x4d702f536f1aef56d22dab86198a12, 0x005741 ] } , - BigNum { limbs: [ 0xa918bc0373c6c8466b081672596f68, 0xe2053bec9fec3247210a1e7da36c46, 0x001f43 ] } , - BigNum { limbs: [ 0x148b46fc8a9536b994f7e88da69099, 0xc54dedb0dd5c00f2b6fdeb2434990d, 0x0054a9 ] } , - BigNum { limbs: [ 0xdd6fb6b626c0980deb33b55635d786, 0x2b7ad6b8e554b9e31698cf2929dc64, 0x002201 ] } , - BigNum { limbs: [ 0xe0344c49d79b66f214cc49a9ca287b, 0x7bd852e497f37956c16f3a78ae28ee, 0x0051ec ] } , - BigNum { limbs: [ 0x93bae27d7c8966716d5f7d8adc97ea, 0x1b0361161a437bc9bc70a777b79a25, 0x006474 ] } , - BigNum { limbs: [ 0x29e9208281d2988e92a08175236817, 0x8c4fc8876304b7701b97622a206b2e, 0x000f79 ] } , - BigNum { limbs: [ 0x903c61723623d784ae05866017ee40, 0x39f9472de76f53fe5729a1399f1093, 0x0031e3 ] } , - BigNum { limbs: [ 0x2d67a18dc838277b51fa789fe811c1, 0x6d59e26f95d8df3b80de686838f4c0, 0x00420a ] } , - BigNum { limbs: [ 0x24d57952c2179c0ade8d476f637dd2, 0x97e408eec004f78e806eb0f4022ff0, 0x0071b5 ] } , - BigNum { limbs: [ 0x98ce89ad3c4462f52172b7909c822f, 0x0f6f20aebd433bab579958add5d563, 0x000238 ] } , - BigNum { limbs: [ 0x10182ef83597e2fd1d06b2287e2963, 0xbaf250f91eab2bea3d671d9097441d, 0x005c2b ] } , - BigNum { limbs: [ 0xad8bd407c8c41c02e2f94cd781d69e, 0xec60d8a45e9d074f9aa0ec1140c136, 0x0017c1 ] } , - BigNum { limbs: [ 0xb07fa0fdd65a6b01583cca695cba0f, 0xec810deb108a31e2fa98dc4b1e43c1, 0x001a4a ] } , - BigNum { limbs: [ 0x0d246202280193fea7c33496a345f2, 0xbad21bb26cbe0156dd6f2d56b9c192, 0x0059a2 ] } , - BigNum { limbs: [ 0x03e8294f5b02f3d11b3fcd84beba66, 0x1b38f45499d57d71ada7cd3a346199, 0x005cf0 ] } , - BigNum { limbs: [ 0xb9bbd9b0a3590b2ee4c0317b41459b, 0x8c1a3548e372b5c82a603c67a3a3ba, 0x0016fd ] } , - BigNum { limbs: [ 0xf819f7fbd18722ca2e518d542f5ab4, 0x35118c1d063b5c7bd78eafd2363f37, 0x005c5a ] } , - BigNum { limbs: [ 0xc58a0b042cd4dc35d1ae71abd0a54d, 0x72419d80770cd6be007959cfa1c61b, 0x001793 ] } , - BigNum { limbs: [ 0x4c749d2221afabc6570d2ea95bfd84, 0x230b34c24e2299c8a193d439a310dd, 0x001a41 ] } , - BigNum { limbs: [ 0x712f65dddcac5339a8f2d056a4027d, 0x8447f4db2f2599713674356834f476, 0x0059ac ] } , - BigNum { limbs: [ 0x5b986955de3d638aab34fd0a699f92, 0x5244f60d187bbb3dd6f817e650250b, 0x00730f ] } , - BigNum { limbs: [ 0x620b99aa201e9b7554cb01f596606f, 0x550e339064cc77fc010ff1bb87e048, 0x0000de ] } , - BigNum { limbs: [ 0x3db510e55d16a3e67a1afdf2e1d708, 0xaf7b83040141e91596d67292f596fa, 0x0016f9 ] } , - BigNum { limbs: [ 0x7feef21aa1455b1985e5010d1e28f9, 0xf7d7a6997c064a244131970ee26e59, 0x005cf3 ] } , - BigNum { limbs: [ 0xce9513fd14fa7340e4c962f57bba4b, 0x7452c5c978665bef62d338fc0848a3, 0x000809 ] } , - BigNum { limbs: [ 0xef0eef02e9618bbf1b369c0a8445b6, 0x330063d404e1d74a7534d0a5cfbcaf, 0x006be4 ] } , - BigNum { limbs: [ 0x7ab3a7d22d6c5592b4c291774613b8, 0x79855eaa576ca9326e0004f6e7c7e8, 0x00196f ] } , - BigNum { limbs: [ 0x42f05b2dd0efa96d4b3d6d88b9ec49, 0x2dcdcaf325db8a076a0804aaf03d6b, 0x005a7e ] } , - BigNum { limbs: [ 0x961fc06f917f456838fa701f0cdbfe, 0x91826d1ea37ca6b777d6a373de1df3, 0x000773 ] } , - BigNum { limbs: [ 0x278442906cdcb997c7058ee0f32403, 0x15d0bc7ed9cb8c826031662df9e760, 0x006c7a ] } , - BigNum { limbs: [ 0x3bea52fcee5c63623d46a32577733e, 0x40908d912fb4d3aadb67990338294c, 0x0024e3 ] } , - BigNum { limbs: [ 0x81b9b0030fff9b9dc2b95bda888cc3, 0x66c29c0c4d935f8efca0709e9fdc07, 0x004f0a ] } , - BigNum { limbs: [ 0x0c65a059be118a25093e32d48647fc, 0x89a064a13d0524e66bbc118025ac0b, 0x004560 ] } , - BigNum { limbs: [ 0xb13e62a6404a74daf6c1cc2b79b805, 0x1db2c4fc40430e536c4bf821b25948, 0x002e8d ] } , - BigNum { limbs: [ 0x72d3eac34989c0c460bf22c6dd910f, 0xebc8ca0be3db6b57d03403d311f62f, 0x002789 ] } , - BigNum { limbs: [ 0x4ad0183cb4d23e3b9f40dc39226ef2, 0xbb8a5f91996cc7e207d405cec60f24, 0x004c63 ] } , - BigNum { limbs: [ 0xa058e2c2a8dc2b2f4286ba7a4e32a8, 0xa84ec3c5e8eac82a05812d8bb32c75, 0x00595f ] } , - BigNum { limbs: [ 0x1d4b203d557fd3d0bd794485b1cd59, 0xff0465d7945d6b0fd286dc1624d8de, 0x001a8d ] } , - BigNum { limbs: [ 0x3e55838f11d552fa1d1933f24d7bfd, 0x35a06ce0919752c9a55bbbc7e37efe, 0x0051c0 ] } , - BigNum { limbs: [ 0x7f4e7f70ec86ac05e2e6cb0db28404, 0x71b2bcbcebb0e07032ac4dd9f48655, 0x00222d ] } , - BigNum { limbs: [ 0x8bcd5f497503b12d0f0a19166b00c7, 0x0e645548e4bcc54b5ed9c1a33946bd, 0x004185 ] } , - BigNum { limbs: [ 0x31d6a3b689584dd2f0f5e5e994ff3a, 0x98eed454988b6dee792e47fe9ebe96, 0x003268 ] } , - BigNum { limbs: [ 0xebfd640c6d99e1b579a40cf2801b02, 0x2aab2ab6864674ce062206a898e6d8, 0x00698d ] } , - BigNum { limbs: [ 0xd1a69ef390c21d4a865bf20d7fe4ff, 0x7ca7fee6f701be6bd1e602f93f1e7a, 0x000a60 ] } , - BigNum { limbs: [ 0x5afb20b758d4c56810b3b69d253b76, 0x48761d47bb2dbdcc28003263f82d28, 0x00736a ] } , - BigNum { limbs: [ 0x62a8e248a5873997ef4c4862dac48b, 0x5edd0c55c21a756db007d73ddfd82b, 0x000083 ] } , - BigNum { limbs: [ 0xc1ad4c687f28a233811ea1fe0c65f4, 0x66679a5d88b1ecfbede342dee7f415, 0x001bb4 ] } , - BigNum { limbs: [ 0xfbf6b6977f335ccc7ee15d01f39a0d, 0x40eb8f3ff496463dea24c6c2f0113d, 0x005839 ] } , - BigNum { limbs: [ 0x140b7174540d1ee0723c72eb58f584, 0x0d469c569786f01e6f45ceee8419f9, 0x002153 ] } , - BigNum { limbs: [ 0xa998918baa4ee01f8dc38c14a70a7d, 0x9a0c8d46e5c1431b68c23ab353eb5a, 0x00529a ] } , - BigNum { limbs: [ 0xc7ab07e301263fbe92da98becd1980, 0xfa81cc9e333fd5f34d908dff438caa, 0x00104b ] } , - BigNum { limbs: [ 0xf5f8fb1cfd35bf416d25664132e681, 0xacd15cff4a085d468a777ba29478a8, 0x0063a1 ] } , - BigNum { limbs: [ 0x1c5b62960ddd7bf7a3f674f9b19bf4, 0x8a0fee2cab3a400753b97514ed7663, 0x001a30 ] } , - BigNum { limbs: [ 0xa148a069f07e83085c098a064e640d, 0x1d433b70d20df332844e948cea8ef0, 0x0059bd ] } , - BigNum { limbs: [ 0x8b6515f4891a079d93099bed238a2d, 0xb683645e7a9b063a79a35d016c0793, 0x006ecb ] } , - BigNum { limbs: [ 0x323eed0b7541f7626cf66312dc75d4, 0xf0cfc53f02ad2cff5e64aca06bfdc0, 0x000521 ] } , - BigNum { limbs: [ 0x50700bdc4b9b68122fe2e0669a2cc8, 0xc18d055596827a36b26c3985d06330, 0x00035b ] } , - BigNum { limbs: [ 0x6d33f723b2c096edd01d1e9965d339, 0xe5c62447e6c5b903259bd01c07a223, 0x007091 ] } , - BigNum { limbs: [ 0xeecf7cd0cd4949b5cc4b34b05aff2c, 0xc104bb6ae704668000c77dfd2ab5db, 0x002d17 ] } , - BigNum { limbs: [ 0xced4862f3112b54a33b4ca4fa500d5, 0xe64e6e329643ccb9d7408ba4ad4f77, 0x0046d5 ] } , - BigNum { limbs: [ 0x15b63f114c71efc32c2d1d3fc57bb5, 0xe009cb95e995039beacf8acebb1062, 0x006195 ] } , - BigNum { limbs: [ 0xa7edc3eeb1ea0f3cd3d2e1c03a844c, 0xc7495e0793b32f9ded387ed31cf4f1, 0x001257 ] } , - BigNum { limbs: [ 0xf304939c366da7fa6ceef222eb879a, 0x9af90ed12f4499f61f4617deac542e, 0x0006d4 ] } , - BigNum { limbs: [ 0xca9f6f63c7ee570593110cdd147867, 0x0c5a1acc4e039943b8c1f1c32bb124, 0x006d19 ] } , - BigNum { limbs: [ 0x1a907743c3d4b3b9f177b76f473cbc, 0x1ce244d73adbedbfb8fc9a7be5d5c8, 0x002a44 ] } , - BigNum { limbs: [ 0xa3138bbc3a874b460e884790b8c345, 0x8a70e4c6426c457a1f0b6f25f22f8b, 0x0049a9 ] } , - BigNum { limbs: [ 0xac3a69d3f05c06b6526124c54da696, 0xba3f3484126d34771621130c70cbfc, 0x0007ba ] } , - BigNum { limbs: [ 0x1169992c0dfff849ad9eda3ab2596b, 0xed13f5196adafec2c1e6f695673957, 0x006c32 ] } , - BigNum { limbs: [ 0x680114a074f1baf65070e6d99ba93c, 0xfb30ee127ca0dc895e94a770ff3373, 0x002096 ] } , - BigNum { limbs: [ 0x55a2ee5f896a4409af8f18266456c5, 0xac223b8b00a756b079736230d8d1e0, 0x005356 ] } , - BigNum { limbs: [ 0x9258044aa060587c5dfd459fa42382, 0xd9cfdbfc9d66f6151fb652c0f57149, 0x0018b5 ] } , - BigNum { limbs: [ 0x2b4bfeb55dfba683a202b9605bdc7f, 0xcd834da0dfe13d24b851b6e0e2940a, 0x005b37 ] } , - BigNum { limbs: [ 0x27a423c7cc92cc140700f6f5ad1992, 0x160d7fc7387b84be2f7125588a799d, 0x003da1 ] } , - BigNum { limbs: [ 0x95ffdf3831c932ebf8ff080a52e66f, 0x9145a9d644ccae7ba896e4494d8bb6, 0x00364c ] } , - BigNum { limbs: [ 0x69193792854e59eaa83d0bb9842e37, 0x55f8128b96e1bec7f66e6610a74bbd, 0x006d34 ] } , - BigNum { limbs: [ 0x548acb6d790da51557c2f3467bd1ca, 0x515b1711e6667471e199a39130b996, 0x0006b9 ] } , - BigNum { limbs: [ 0xba514cd0bf3bc04c72f9b057bbbeda, 0xad4f7c60faf33102bf19312d4f8a02, 0x0018fe ] } , - BigNum { limbs: [ 0x0352b62f3f203eb38d064ea8444127, 0xfa03ad3c8255023718eed874887b51, 0x005aee ] } , - BigNum { limbs: [ 0x50400a4d7958bad4bc9284b961cfbc, 0xd3b1f84b876e27307b162670856cd9, 0x002777 ] } , - BigNum { limbs: [ 0x6d63f8b28503442b436d7a469e3045, 0xd3a13151f5da0c095cf1e33152987a, 0x004c75 ] } , - BigNum { limbs: [ 0x5aad4b9c1dd14b87b9261d38ab4a25, 0x5c5bb54b12a82b3248a8f8582464c8, 0x004171 ] } , - BigNum { limbs: [ 0x62f6b763e08ab37846d9e1c754b5dc, 0x4af774526aa008078f5f1149b3a08b, 0x00327c ] } , - BigNum { limbs: [ 0xd7a64cccac9b12ac9567be9a36d522, 0xc447ce21b78aefacaa48c2c4827459, 0x006b54 ] } , - BigNum { limbs: [ 0xe5fdb63351c0ec536a984065c92adf, 0xe30b5b7bc5bd438d2dbf46dd5590f9, 0x000898 ] } , - BigNum { limbs: [ 0x8feed2f822e3f634d926b66d9a40d9, 0x7051d2cfcef60b4704bcfac11d52d8, 0x0012ea ] } , - BigNum { limbs: [ 0x2db53007db7808cb26d9489265bf28, 0x370156cdae5227f2d34b0ee0bab27b, 0x006103 ] } , - BigNum { limbs: [ 0xd479a309a7768d1dad095b97e1f99c, 0x5f2b8f504ab5b1261c30d1e2c9a258, 0x000c36 ] } , - BigNum { limbs: [ 0xe92a5ff656e571e252f6a3681e0665, 0x48279a4d32928213bbd737bf0e62fa, 0x0067b7 ] } , - BigNum { limbs: [ 0x736de903ce2b7aaddcfc96a506dae2, 0xbb19b5815e67af1b0f713a146c9387, 0x00346c ] } , - BigNum { limbs: [ 0x4a3619fc303084522303685af9251f, 0xec39741c1ee0841ec896cf8d6b71cc, 0x003f80 ] } , - BigNum { limbs: [ 0xb3f165d554150970217c6264ef06a7, 0xb2d1c312e47ba1d384187ac0cbd3f3, 0x0068a5 ] } , - BigNum { limbs: [ 0x09b29d2aaa46f58fde839c9b10f95a, 0xf481668a98cc916653ef8ee10c3160, 0x000b47 ] } , - BigNum { limbs: [ 0x305485b09dd0d77ce50ec0e597b1be, 0xbc95e93142ab188f4c46937150a9b9, 0x004d83 ] } , - BigNum { limbs: [ 0x8d4f7d4f608b27831af13e1a684e43, 0xeabd406c3a9d1aaa8bc17630875b9a, 0x002669 ] } , - BigNum { limbs: [ 0x5e4ac091a8413b5f2fb9c8ee9f3784, 0xb0d68f671db5f1b534e07ce710985d, 0x0055c4 ] } , - BigNum { limbs: [ 0x5f59426e561ac3a0d046361160c87d, 0xf67c9a365f924184a3278cbac76cf6, 0x001e28 ] } , - BigNum { limbs: [ 0x089f3a743c502732d4d0b2be200c36, 0x89a7a2513fddbc12df9658c7b4a74b, 0x000a5e ] } , - BigNum { limbs: [ 0xb504c88bc20bd7cd2b2f4c41dff3cb, 0x1dab874c3d6a7726f871b0da235e08, 0x00698f ] } , - BigNum { limbs: [ 0x5e6f6b805b1acb8faa4aea5baef097, 0x701853308eaff1326910bc966667fe, 0x001616 ] } , - BigNum { limbs: [ 0x5f34977fa341337055b514a4510f6a, 0x373ad66cee9842076ef74d0b719d55, 0x005dd7 ] } , - BigNum { limbs: [ 0x515de81a8f54d10bdbcbe1522354a4, 0x99bc6abc5e8ce134e3c781697fafab, 0x00294c ] } , - BigNum { limbs: [ 0x6c461ae56f072df424341daddcab5d, 0x0d96bee11ebb5204f44088385855a8, 0x004aa1 ] } , - BigNum { limbs: [ 0xaf1958d3f38148b9522b20ae99e8eb, 0x8fab0ad3ea6c60070f1a3e701e4021, 0x000461 ] } , - BigNum { limbs: [ 0x0e8aaa2c0adab646add4de51661716, 0x17a81ec992dbd332c8edcb31b9c532, 0x006f8c ] } , - BigNum { limbs: [ 0x2736107d34be5daadbf867e295fe4e, 0xe2b1413ae56b13c6ed1276f03221d7, 0x006388 ] } , - BigNum { limbs: [ 0x966df282c99da1552407971d6a01b3, 0xc4a1e86297dd1f72eaf592b1a5e37c, 0x001064 ] } , - BigNum { limbs: [ 0xde4e04f17d1bbebad332c47b502202, 0xe6965a8b5056b3aff7b76fe8a3969e, 0x002429 ] } , - BigNum { limbs: [ 0xdf55fe0e814040452ccd3a84afddff, 0xc0bccf122cf17f89e05099b9346eb4, 0x004fc3 ] } , - BigNum { limbs: [ 0x2d7ed96060d2064f5bf1a980b4b953, 0xef839c67e73b2b58548adad886286f, 0x0067de ] } , - BigNum { limbs: [ 0x9025299f9d89f8b0a40e557f4b46ae, 0xb7cf8d35960d07e1837d2ec951dce4, 0x000c0e ] } , - BigNum { limbs: [ 0x5b275c4ae15be49062ff9a0538ec84, 0xecbcd74b6124435ea8ffe19c8c85a0, 0x000496 ] } , - BigNum { limbs: [ 0x627ca6b51d001a6f9d0064fac7137d, 0xba9652521c23efdb2f0828054b7fb3, 0x006f56 ] } , - BigNum { limbs: [ 0x65da083310e06da099ecb7d80ab778, 0xe6259f2dfb34f6430aea6aa55bf0e5, 0x0007de ] } , - BigNum { limbs: [ 0x57c9facced7b915f66134727f54889, 0xc12d8a6f82133cf6cd1d9efc7c146e, 0x006c0e ] } , - BigNum { limbs: [ 0x8a0bce9fdfac61064a5280cb9b0a5c, 0x564df61c66ea2dca882e26bcc0c102, 0x0022de ] } , - BigNum { limbs: [ 0x339834601eaf9df9b5ad7e3464f5a5, 0x51053381165e056f4fd9e2e5174451, 0x00510f ] } , - BigNum { limbs: [ 0xd388dec8bdb5c912e39b8b4c1ce30a, 0x38f4465cd0832f946b3f886734d3ac, 0x00512a ] } , - BigNum { limbs: [ 0xea1b243740a635ed1c6473b3e31cf7, 0x6e5ee340acc503a56cc8813aa331a6, 0x0022c3 ] } , - BigNum { limbs: [ 0x1803cb0ce55a68b138b29831a31ae4, 0xd5b1c6859a593bf47374fb414144fe, 0x000b9a ] } , - BigNum { limbs: [ 0xa5a037f31901964ec74d66ce5ce51d, 0xd1a16317e2eef74564930e6096c055, 0x006852 ] } , - BigNum { limbs: [ 0x62075a6764c01e1be69f3270830aad, 0x969225ba3389447bddbac2fd51ed68, 0x005807 ] } , - BigNum { limbs: [ 0x5b9ca898999be0e41960cc8f7cf554, 0x10c103e349beeebdfa4d46a48617eb, 0x001be6 ] } , - BigNum { limbs: [ 0xf3bdbc0f422b0a94e53fb564bdd489, 0x70ead42b9162943f2b9abaa7250db0, 0x005c61 ] } , - BigNum { limbs: [ 0xc9e646f0bc30f46b1ac0499b422b78, 0x36685571ebe59efaac6d4efab2f7a2, 0x00178c ] } , - BigNum { limbs: [ 0x7715244985e12969c563a89174294c, 0x146a268b13c20cc5580a897bad41f4, 0x0035f0 ] } , - BigNum { limbs: [ 0x468edeb6787ad5963a9c566e8bd6b5, 0x92e90312698626747ffd80262ac35f, 0x003dfd ] } , - BigNum { limbs: [ 0x1bb332b4e8ce845d8e6990bfa23004, 0xbc8a3a58c72ad4fbf85ba3c7b295cb, 0x003c5d ] } , - BigNum { limbs: [ 0xa1f0d04b158d7aa271966e405dcffd, 0xeac8ef44b61d5e3ddfac65da256f88, 0x00378f ] } , - BigNum { limbs: [ 0x4c06153eb88810ba7f245503b95a8d, 0x1b18f176a5e0bf948a2120473a20d3, 0x0063c2 ] } , - BigNum { limbs: [ 0x719dedc145d3ee4580dba9fc46a574, 0x8c3a3826d76773a54de6e95a9de480, 0x00102b ] } , - BigNum { limbs: [ 0x501e5b050695d67acc968a7ee39687, 0xe9acd483910f8d1373f244cb09332b, 0x0038b7 ] } , - BigNum { limbs: [ 0x6d85a7faf7c62885336974811c697a, 0xbda65519ec38a6266415c4d6ced228, 0x003b35 ] } , - BigNum { limbs: [ 0x6c95434baa21c004caf2400fd5ee93, 0x01e4a8a5521a3cc485d9d1f4893b37, 0x005ae6 ] } , - BigNum { limbs: [ 0x510ebfb4543a3efb350dbef02a116e, 0xa56e80f82b2df675522e37ad4eca1c, 0x001907 ] } , - BigNum { limbs: [ 0xaca11799075f19a1afe59459ec7a6c, 0x1932f58837e2fd33cb428c4702ad69, 0x0006b0 ] } , - BigNum { limbs: [ 0x1102eb66f6fce55e501a6aa6138595, 0x8e203415456536060cc57d5ad557ea, 0x006d3d ] } , - BigNum { limbs: [ 0x3fb9a2d6fcdc22625384be62a7a2e8, 0xe66c7ea5ba6f2c5ded5ceeccb2adf6, 0x00109d ] } , - BigNum { limbs: [ 0x7dea6029017fdc9dac7b409d585d19, 0xc0e6aaf7c2d906dbeaab1ad525575d, 0x00634f ] } , - BigNum { limbs: [ 0x863f5f009ecad09830635b160a4e50, 0xe86e2ca5471eb6794f0e98b62bca80, 0x0014cc ] } , - BigNum { limbs: [ 0x3764a3ff5f912e67cf9ca3e9f5b1b1, 0xbee4fcf836297cc088f970ebac3ad3, 0x005f20 ] } , - BigNum { limbs: [ 0x4a14f4b69dcc7f13c76b01443a1a6a, 0x3f2176d7176b4e16fbfa13619ed849, 0x00455c ] } , - BigNum { limbs: [ 0x738f0e49608f7fec3894fdbbc5e597, 0x6831b2c665dce522dc0df640392d0a, 0x002e91 ] } , - BigNum { limbs: [ 0x0bd5440656804fe785f7e33fdf3618, 0x5d764886ee710487aa8f6987c373cb, 0x002b27 ] } , - BigNum { limbs: [ 0xb1cebef9a7dbaf187a081bc020c9e9, 0x49dce1168ed72eb22d78a01a149188, 0x0048c6 ] } , - BigNum { limbs: [ 0x4537fd0d912eeaf8d0009cc2a6c535, 0x61eb978ffd8a5d8cb9d35a162fdbd5, 0x0028de ] } , - BigNum { limbs: [ 0x786c05f26d2d14072fff623d593acc, 0x4567920d7fbdd5ad1e34af8ba8297e, 0x004b0f ] } , - BigNum { limbs: [ 0x1d1aec1b762d2b71962ed94d9ec469, 0x8340e97d268e6db2b2d9ca2e4902c2, 0x005ea0 ] } , - BigNum { limbs: [ 0xa08916e4882ed38e69d125b2613b98, 0x2412402056b9c587252e3f738f0291, 0x00154d ] } , - BigNum { limbs: [ 0x1959d9d4d000d57d8a7a6c8da4a98a, 0x695f56d8f6c543c94f59a6eb37f312, 0x00278e ] } , - BigNum { limbs: [ 0xa44a292b2e5b2982758592725b5677, 0x3df3d2c48682ef7088ae62b6a01241, 0x004c5f ] } , - BigNum { limbs: [ 0x7fe3b9ce8d4477e7b70dbad015d339, 0x391ed371c0f55135022b211d95bd0a, 0x00473d ] } , - BigNum { limbs: [ 0x3dc049317117871848f2442fea2cc8, 0x6e34562bbc52e204d5dce884424849, 0x002cb0 ] } , - BigNum { limbs: [ 0xeb83e42ef3f6bff9ed4f03933eef85, 0xdbabda2a09d6a9ca21650de7491c30, 0x0007d1 ] } , - BigNum { limbs: [ 0xd2201ed10a653f0612b0fb6cc1107c, 0xcba74f737371896fb6a2fbba8ee922, 0x006c1b ] } , - BigNum { limbs: [ 0xde1994dace1ccf2f3ec47bd8b0ba51, 0xec2473e12abc21c1bcc99837c8b4f4, 0x00480f ] } , - BigNum { limbs: [ 0xdf8a6e25303f2fd0c13b83274f45b0, 0xbb2eb5bc528c11781b3e716a0f505e, 0x002bdd ] } , - BigNum { limbs: [ 0xeb78f9f7d520bba268f1f3f9991f29, 0xa0cff984144a7eec9c9f7a1d45bf48, 0x0018ea ] } , - BigNum { limbs: [ 0xd22b0908293b435d970e0b0666e0d8, 0x0683301968fdb44d3b688f8492460a, 0x005b03 ] } , - BigNum { limbs: [ 0xf811d4c6505005d5191d3dde403c3e, 0x091c4b9d1142e84835306f7d058a71, 0x0003ed ] } , - BigNum { limbs: [ 0xc5922e39ae0bf92ae6e2c121bfc3c3, 0x9e36de006c054af1a2d79a24d27ae1, 0x007000 ] } , - BigNum { limbs: [ 0xd7699069b48f58d70edde47d675fa1, 0xc4567150a5beaddfcf3650346bbe9e, 0x00617a ] } , - BigNum { limbs: [ 0xe63a729649cca628f1221a8298a060, 0xe2fcb84cd789855a08d1b96d6c46b4, 0x001272 ] } , - BigNum { limbs: [ 0x5dbfac1f1fe4b9be012e3d0f88b8f7, 0xb7b62c9021abf738c5833b75cdaa6d, 0x001b02 ] } , - BigNum { limbs: [ 0x5fe456e0de774541fed1c1f077470a, 0xef9cfd0d5b9c3c011284ce2c0a5ae6, 0x0058ea ] } , - BigNum { limbs: [ 0x6f2857c36a7e1d9b6c9285b13538ad, 0x18566cfd81a49b5745a08aa3699d08, 0x005ac0 ] } , - BigNum { limbs: [ 0x4e7bab3c93dde164936d794ecac754, 0x8efcbc9ffba397e292677efe6e684b, 0x00192d ] } , - BigNum { limbs: [ 0xca09572342def7ba5726e06aa67c30, 0xb9bfed75084452e1463e0a059e7d7e, 0x006c8f ] } , - BigNum { limbs: [ 0xf39aabdcbb7d0745a8d91e955983d1, 0xed933c287503e05891c9ff9c3987d4, 0x00075d ] } , - BigNum { limbs: [ 0xb8cb20a77d72301e268819ba508ef6, 0x479ce465498369c5df0b617bd142d6, 0x002170 ] } , - BigNum { limbs: [ 0x04d8e25880e9cee1d977e545af710b, 0x5fb6453833c4c973f8fca82606c27d, 0x00527d ] } , - BigNum { limbs: [ 0x26621eaacc2ecdd7a9ede4acccf961, 0xd336fe1aa081805c3d7296833b35a8, 0x001689 ] } , - BigNum { limbs: [ 0x9741e455322d312856121a533306a0, 0xd41c2b82dcc6b2dd9a95731e9ccfab, 0x005d63 ] } , - BigNum { limbs: [ 0x201a5821e639da07da2d48f5cd0787, 0x5c66a3e483f153122fd2b0ffde049a, 0x0055f9 ] } , - BigNum { limbs: [ 0x9d89aade182224f825d2b60a32f87a, 0x4aec85b8f956e027a83558a1fa00b9, 0x001df4 ] } , - BigNum { limbs: [ 0x9026546d768efac20b830cc925e818, 0xb21e5543ecce6dc01e733db2cbd86a, 0x0060e6 ] } , - BigNum { limbs: [ 0x2d7dae9287cd043df47cf236da17e9, 0xf534d4599079c579b994cbef0c2ce9, 0x001306 ] } , - BigNum { limbs: [ 0xf1f245ca8edb3130d3acddb0356ceb, 0xc3bb68888454c3916432097245e578, 0x003f57 ] } , - BigNum { limbs: [ 0xcbb1bd356f80cdcf2c53214fca9316, 0xe397c114f8f36fa873d6002f921fda, 0x003495 ] } , - BigNum { limbs: [ 0x5b416bad06a7528bc1932b0d274a1d, 0xf02be95b1a9e70f081507724a71a88, 0x005b78 ] } , - BigNum { limbs: [ 0x62629752f7b4ac743e6cd3f2d8b5e4, 0xb727404262a9c24956b7927d30eacb, 0x001874 ] } , - BigNum { limbs: [ 0xb0a7d87187c5c0e304a47cfe2c39f0, 0xcba79e856c22293082360528eebee2, 0x003b4a ] } , - BigNum { limbs: [ 0x0cfc2a8e76963e1cfb5b8201d3c611, 0xdbab8b1811260a0955d20478e94671, 0x0038a2 ] } , - BigNum { limbs: [ 0x6d86f1951712e83bf2a9b9d4a639c1, 0x251c92d55cc1d86c4cbda4eb5e6270, 0x004105 ] } , - BigNum { limbs: [ 0x501d116ae74916c40d56452b59c640, 0x823696c820865acd8b4a64b679a2e3, 0x0032e8 ] } , - BigNum { limbs: [ 0x2032b420d1fe8b1602cb7786c1f5e3, 0x2fd57acdc0bc3bc2e754e78bbdb068, 0x0067eb ] } , - BigNum { limbs: [ 0x9d714edf2c5d73e9fd3487793e0a1e, 0x777daecfbc8bf776f0b322161a54eb, 0x000c02 ] } , - BigNum { limbs: [ 0x1d8a62b9c4f076d098777bae4c5131, 0x62c281967ad887b5b1048c57291040, 0x00730e ] } , - BigNum { limbs: [ 0xa019a046396b882f67888351b3aed0, 0x4490a807026fab8427037d4aaef513, 0x0000df ] } , - BigNum { limbs: [ 0x05c9aa3ad941421836ad1a4285082d, 0x64bedefa515a0baf4bd9cc81ff243e, 0x001568 ] } , - BigNum { limbs: [ 0xb7da58c5251abce7c952e4bd7af7d4, 0x42944aa32bee278a8c2e3d1fd8e115, 0x005e85 ] } , - BigNum { limbs: [ 0x0c3ae2947f2aaaf882c6f1282fa4bf, 0x9ceaf4033df64e318d58820a2e95f5, 0x003256 ] } , - BigNum { limbs: [ 0xb169206b7f3154077d390dd7d05b42, 0x0a68359a3f51e5084aaf8797a96f5e, 0x004197 ] } , - BigNum { limbs: [ 0x819e5ef22725f40d41b8bf60aef96b, 0x217edb6cee5eb6a386acee69958ad7, 0x0024eb ] } , - BigNum { limbs: [ 0x3c05a40dd7360af2be473f9f510696, 0x85d44e308ee97c96515b1b38427a7c, 0x004f02 ] } , - BigNum { limbs: [ 0xfd86cce858f8c8c3adf3d3e5d685bf, 0x8c1e703f7f808df483f139d30e3c13, 0x001c1c ] } , - BigNum { limbs: [ 0xc01d3617a563363c520c2b1a297a42, 0x1b34b95dfdc7a5455416cfcec9c93f, 0x0057d1 ] } , - BigNum { limbs: [ 0xed617941b103b9bd7360167f49690f, 0xb7898c657ed61486518d8c5f968955, 0x0040b5 ] } , - BigNum { limbs: [ 0xd04289be4d5845428c9fe880b696f2, 0xefc99d37fe721eb3867a7d42417bfd, 0x003337 ] } , - BigNum { limbs: [ 0x768cbb400f3ad33232c7280ee80ad2, 0x20190a0862687ce549bde2dd6b0f1c, 0x004ddf ] } , - BigNum { limbs: [ 0x471747bfef212bcdcd38d6f117f52f, 0x873a1f951adfb6548e4a26c46cf637, 0x00260e ] } , - BigNum { limbs: [ 0xa1ce0189080895ba7d4348b3e9e6a5, 0xafb08780ceadafb713389188cd094f, 0x002e26 ] } , - BigNum { limbs: [ 0x1bd60176f653694582bcb64c16195c, 0xf7a2a21cae9a8382c4cf78190afc04, 0x0045c6 ] } , - BigNum { limbs: [ 0xaacd273b23eb136d7e35ad7dffbdb8, 0x386c09e2fd3d3b841c065526cbf892, 0x00219e ] } , - BigNum { limbs: [ 0x12d6dbc4da70eb9281ca5182004249, 0x6ee71fba800af7b5bc01b47b0c0cc1, 0x00524f ] } , - BigNum { limbs: [ 0xe01bf0fda622ef30b5dbc87cc84197, 0xeafa5e3ec783e66fd8bc18071b1f97, 0x00430b ] } , - BigNum { limbs: [ 0xdd88120258390fcf4a24368337be6a, 0xbc58cb5eb5c44cc9ff4bf19abce5bb, 0x0030e1 ] } , - BigNum { limbs: [ 0x144a26488e76c5f3f78dff3e64eff2, 0xd8c786d8f2a3a9f4d11fa88cb30729, 0x004479 ] } , - BigNum { limbs: [ 0xa959dcb76fe5390c0871ffc19b100f, 0xce8ba2c48aa4894506e8611524fe2a, 0x002f73 ] } , - BigNum { limbs: [ 0x4a1bd4592fe1551ea4d56a5d6a3654, 0x279f667a6ff2c62477cbd8d1dc7282, 0x003679 ] } , - BigNum { limbs: [ 0x73882ea6ce7aa9e15b2a94a295c9ad, 0x7fb3c3230d556d15603c30cffb92d1, 0x003d74 ] } , - BigNum { limbs: [ 0xc5e9ec9c4b3efb8902bffd4b07db39, 0x60cdeaa382f0eeb4135df31350fa9f, 0x00042f ] } , - BigNum { limbs: [ 0xf7ba1663b31d0376fd4001b4f824c8, 0x46853ef9fa574485c4aa168e870ab3, 0x006fbe ] } , - BigNum { limbs: [ 0xbc8a5b856414d3e0fda947724a81e9, 0xb0c5760e32cd0b9943d2d6d61529eb, 0x002ca0 ] } , - BigNum { limbs: [ 0x0119a77a9a472b1f0256b78db57e18, 0xf68db38f4a7b27a0943532cbc2db68, 0x00474c ] } , - BigNum { limbs: [ 0xa8119ed34f68195796130c33f27af7, 0xcfc06aac46bac4a4a9bfd42acfd1e9, 0x003288 ] } , - BigNum { limbs: [ 0x1592642caef3e5a869ecf2cc0d850a, 0xd792bef1368d6e952e48357708336a, 0x004164 ] } , - BigNum { limbs: [ 0xd34dc48b542a7916654b4e3193f385, 0xdbd781fc6d1c881dab49e15d37277d, 0x006a61 ] } , - BigNum { limbs: [ 0xea563e74aa3185e99ab4b0ce6c0c7c, 0xcb7ba7a1102bab1c2cbe2844a0ddd5, 0x00098b ] } , - BigNum { limbs: [ 0x7a246cd90253a0c3d729985a3d27ad, 0xf18f4ade05a6a3ebf7dbfa2a6d1169, 0x00418f ] } , - BigNum { limbs: [ 0x437f9626fc085e3c28d666a5c2d854, 0xb5c3debf77a18f4de02c0f776af3ea, 0x00325d ] } , - BigNum { limbs: [ 0xb978246a8a9751e006a537b0b22aa3, 0xb23b00803f2306393249e58f2e6d9d, 0x002324 ] } , - BigNum { limbs: [ 0x042bde9573c4ad1ff95ac74f4dd55e, 0xf518291d3e252d00a5be2412a997b6, 0x0050c8 ] } , - BigNum { limbs: [ 0xe9771aed2a45e4ed7a973f12c92d2b, 0x457c8751bd35931fcee5dda872f979, 0x000ec9 ] } , - BigNum { limbs: [ 0xd42ce812d4161a128568bfed36d2d6, 0x61d6a24bc012a01a09222bf9650bd9, 0x006524 ] } , - BigNum { limbs: [ 0x6eb9c39f25a1b6cad4adcb40845700, 0x0cf7a259f141112e10699e587abfb4, 0x0040e9 ] } , - BigNum { limbs: [ 0x4eea3f60d8ba48352b5233bf7ba901, 0x9a5b87438c07220bc79e6b495d459f, 0x003304 ] } , - BigNum { limbs: [ 0x55c873c327fe57370ab333c6f92093, 0x6ef876296e2b29311f879db097f3e9, 0x0033fd ] } , - BigNum { limbs: [ 0x67db8f3cd65da7c8f54ccb3906df6e, 0x385ab3740f1d0a08b8806bf140116a, 0x003ff0 ] } , - BigNum { limbs: [ 0xacb2cf03455d20a2195045a974862a, 0x51f5fedf54ea303d37414fe2284f56, 0x005f4e ] } , - BigNum { limbs: [ 0x10f133fcb8fede5de6afb9568b79d7, 0x555d2abe285e02fca0c6b9bfafb5fd, 0x00149f ] } , - BigNum { limbs: [ 0x063a5dd416fc7e587523b2c6c0bf06, 0x1a5ea6afd85d4791dc7d89fc483f7a, 0x006bfa ] } , - BigNum { limbs: [ 0xb769a52be75f80a78adc4c393f40fb, 0x8cf482eda4eaeba7fb8a7fa58fc5d9, 0x0007f3 ] } , - BigNum { limbs: [ 0xa066fe71d2adad04740fcd7b80fc99, 0x2a441d7ffda7d2a707cdd6d20c23ac, 0x00289e ] } , - BigNum { limbs: [ 0x1d3d048e2bae51fb8bf031847f0368, 0x7d0f0c1d7fa06092d03a32cfcbe1a7, 0x004b4f ] } , - BigNum { limbs: [ 0xede3875d96e2cd62979d1865413cb8, 0x278129efd34cb651d7c4276bdb209c, 0x004c48 ] } , - BigNum { limbs: [ 0xcfc07ba26779319d6862e69abec349, 0x7fd1ffada9fb7ce80043e235fce4b6, 0x0027a5 ] } , - BigNum { limbs: [ 0x9211824fd34cc6c76b6f5d6b8f1730, 0x4123de61856ae8ce8c8ee3d05f4bd7, 0x007381 ] } , - BigNum { limbs: [ 0x2b9280b02b0f38389490a19470e8d1, 0x662f4b3bf7dd4a6b4b7925d178b97c, 0x00006c ] } , - BigNum { limbs: [ 0x5b371e85e4ebbbc9ac443b6b1fe6b2, 0x987f518a9bb8270cb9aa18e75c64c6, 0x0058e6 ] } , - BigNum { limbs: [ 0x626ce47a1970433653bbc394e0194f, 0x0ed3d812e1900c2d1e5df0ba7ba08d, 0x001b07 ] } , - BigNum { limbs: [ 0xfe4a2d19b29c5bbc553c7e42f7b311, 0xc047cb8e976f912d2496f5d3df5ba3, 0x00209e ] } , - BigNum { limbs: [ 0xbf59d5e64bbfa343aac380bd084cf0, 0xe70b5e0ee5d8a20cb37113cdf8a9af, 0x00534e ] } , - BigNum { limbs: [ 0x6428df20f92acf73d509e47ebe32d7, 0x977fc989d6e9a45a613d58124dcd8c, 0x006af7 ] } , - BigNum { limbs: [ 0x597b23df05312f8c2af61a8141cd2a, 0x0fd36013a65e8edf76cab18f8a37c7, 0x0008f6 ] } , - BigNum { limbs: [ 0xa4cbd9833c3a414a181389f87bece1, 0x7743368184aff1caddd8e5b9862c15, 0x00428e ] } , - BigNum { limbs: [ 0x18d8297cc221bdb5e7ec7507841320, 0x300ff31bf898416efa2f23e851d93e, 0x00315f ] } , - BigNum { limbs: [ 0x03d461c35feb8959f37ab9f484d0ba, 0x402f68d642046c844b24b5fb7d2304, 0x007268 ] } , - BigNum { limbs: [ 0xb9cfa13c9e7075a60c85450b7b2f47, 0x6723c0c73b43c6b58ce353a65ae24f, 0x000185 ] } , - BigNum { limbs: [ 0x72fb7ca4c58800a9c8a7ac0afc154b, 0x9cf9569612de921e2c6b2e2b0e5b1f, 0x0045d0 ] } , - BigNum { limbs: [ 0x4aa8865b38d3fe56375852f503eab6, 0x0a59d3076a69a11bab9cdb76c9aa34, 0x002e1d ] } , - BigNum { limbs: [ 0x8e8e79ce1738afcbd889784fc85af0, 0x70adf3759a105ad6b00db8c6608aa4, 0x0037ee ] } , - BigNum { limbs: [ 0x2f158931e7234f34277686b037a511, 0x36a53627e337d86327fa50db777aaf, 0x003bff ] } , - BigNum { limbs: [ 0x62920b1726c6fbf8c8655cbd410ec7, 0x2205bb5233768eac7b3e1e56a597ad, 0x003714 ] } , - BigNum { limbs: [ 0x5b11f7e8d7950307379aa242bef13a, 0x854d6e4b49d1a48d5cc9eb4b326da6, 0x003cd9 ] } , - BigNum { limbs: [ 0x48da51a3ceef7da8462d95102f2604, 0x6380b57ff9a33393332f846410f366, 0x003f53 ] } , - BigNum { limbs: [ 0x74c9b15c2f6c8157b9d269efd0d9fd, 0x43d2741d83a4ffa6a4d8853dc711ed, 0x00349a ] } , - BigNum { limbs: [ 0x2b763fc1c4da11dee3b94096c967be, 0x2e2ea7ca3dc3e00372501f9a620697, 0x0029b9 ] } , - BigNum { limbs: [ 0x922dc33e3981ed211c46be69369843, 0x792481d33f84533665b7ea0775febc, 0x004a34 ] } , - BigNum { limbs: [ 0x4dfad4798e80cf4f71fa87d693d5dd, 0xf99d1c130150cf2f177d4c65cf9085, 0x000a52 ] } , - BigNum { limbs: [ 0x6fa92e866fdb2fb08e0577296c2a24, 0xadb60d8a7bf7640ac08abd3c0874ce, 0x00699a ] } , - BigNum { limbs: [ 0xace76ff79739280558a1daf69bb76b, 0x9a1d28915435498040eea16a597630, 0x002e21 ] } , - BigNum { limbs: [ 0x10bc93086722d6faa75e2409644896, 0x0d36010c2912e9b9971968377e8f23, 0x0045cc ] } , - BigNum { limbs: [ 0xab0cb85cf1ab233c52f846b770de97, 0x4db8b5ea55272bd9b05bc47234f06c, 0x004bf5 ] } , - BigNum { limbs: [ 0x12974aa30cb0dbc3ad07b8488f216a, 0x599a73b32821076027ac452fa314e7, 0x0027f8 ] } , - BigNum { limbs: [ 0xb5e1c37fc947d5601dede2df479679, 0xf7525102cbcbf698a3d11158073f9c, 0x002149 ] } , - BigNum { limbs: [ 0x07c23f803514299fe2121c20b86988, 0xb000d89ab17c3ca13436f849d0c5b7, 0x0052a3 ] } , - BigNum { limbs: [ 0x68b4524370c27f0fb67041c5129a32, 0xee2c40319d20456713bee1b503ea19, 0x0051f3 ] } , - BigNum { limbs: [ 0x54efb0bc8d997ff0498fbd3aed65cf, 0xb926e96be027edd2c44927ecd41b3a, 0x0021f9 ] } , - BigNum { limbs: [ 0xfa6503c4d05ba1ea36d1e453fdd087, 0xa362bd6b6a042cf83a952b74d32af6, 0x003b10 ] } , - BigNum { limbs: [ 0xc33eff3b2e005d15c92e1aac022f7a, 0x03f06c32134406419d72de2d04da5c, 0x0038dd ] } , - BigNum { limbs: [ 0x87bbd026fa86d5ef038837f0987616, 0xa4f668519c9b01f7d5c2d383ee5424, 0x001c8e ] } , - BigNum { limbs: [ 0x35e832d903d52910fc77c70f6789eb, 0x025cc14be0ad31420245361de9b12f, 0x00575f ] } , - BigNum { limbs: [ 0x05f87df80ac9fddd41e574458fd37c, 0x816f5ff8d2418cc7fecf9873ce9cbd, 0x001b37 ] } , - BigNum { limbs: [ 0xb7ab8507f3920122be1a8aba702c85, 0x25e3c9a4ab06a671d938712e096896, 0x0058b6 ] } , - BigNum { limbs: [ 0x53e58810b1cee006b3eb0cdec6a8c2, 0x381661c95526543f42237adbe725d4, 0x0025db ] } , - BigNum { limbs: [ 0x69be7aef4c8d1ef94c14f22139573f, 0x6f3cc7d42821defa95e48ec5f0df7f, 0x004e12 ] } , - BigNum { limbs: [ 0x49692c1d29ea093ad9908c78bbc1ba, 0x47e252806a5387191b04b833d6601d, 0x004911 ] } , - BigNum { limbs: [ 0x743ad6e2d471f5c5266f7287443e47, 0x5f70d71d12f4ac20bd03516e01a536, 0x002adc ] } , - BigNum { limbs: [ 0x917e3da2b9bb315d38cedd8d0fdb2c, 0x21e71d042942367c1710447002b2b9, 0x0026d7 ] } , - BigNum { limbs: [ 0x2c25c55d44a0cda2c7312172f024d5, 0x856c0c995405fcbdc0f7c531d5529a, 0x004d16 ] } , - BigNum { limbs: [ 0x9b656972e6cc487fbbf17bc15c64ac, 0x649c9174faecd5912df70ec1b97947, 0x005bd1 ] } , - BigNum { limbs: [ 0x223e998d178fb680440e833ea39b55, 0x42b69828825b5da8aa10fae01e8c0c, 0x00181c ] } , - BigNum { limbs: [ 0xad0b658b878cd33e40d756ff854ab9, 0xbbd5cab87cf836cd562985291f2333, 0x005353 ] } , - BigNum { limbs: [ 0x10989d7476cf2bc1bf28a8007ab548, 0xeb7d5ee5004ffc6c81de8478b8e220, 0x002099 ] } , - BigNum { limbs: [ 0x26cc6375bfcdf36c4d75133cfc0f8d, 0xde42ff094ff6c332b08fb7b9293b69, 0x004f11 ] } , - BigNum { limbs: [ 0x96d79f8a3e8e0b93b28aebc303f074, 0xc9102a942d517007277851e8aec9ea, 0x0024db ] } , - BigNum { limbs: [ 0x767fed4f084e0f5570c083ce5628ee, 0x4ba0c5dc95e95840ede1d53ed438c2, 0x00337f ] } , - BigNum { limbs: [ 0x472415b0f60defaa8f3f7b31a9d713, 0x5bb263c0e75edaf8ea26346303cc91, 0x00406e ] } , - BigNum { limbs: [ 0x9ae2975cf67ec45f2f249eac565c21, 0xc69b6a0ef1385b7d1adc6c9e1f5278, 0x0073aa ] } , - BigNum { limbs: [ 0x22c16ba307dd3aa0d0db6053a9a3e0, 0xe0b7bf8e8c0fd7bcbd2b9d03b8b2db, 0x000042 ] } , - BigNum { limbs: [ 0xe4aa0df97601afe87b01434fc4bad2, 0xd6874a3acdd969b93a9f9581e6db22, 0x0066b6 ] } , - BigNum { limbs: [ 0xd8f9f506885a4f1784febbb03b452f, 0xd0cbdf62af6ec9809d68741ff12a30, 0x000d36 ] } , - BigNum { limbs: [ 0x58269e818e3fc33ed6b1470d0d0994, 0x9febd6e43d38d853c0570cdbfc0b89, 0x004b66 ] } , - BigNum { limbs: [ 0x657d647e701c3bc1294eb7f2f2f66d, 0x076752b9400f5ae617b0fcc5dbf9ca, 0x002887 ] } , - BigNum { limbs: [ 0xc9c7c25300308ca93031353fe3c003, 0xcca26b4c54709d683b0430a4a5c85b, 0x000afc ] } , - BigNum { limbs: [ 0xf3dc40acfe2b7256cfcec9c01c3ffe, 0xdab0be5128d795d19d03d8fd323cf7, 0x0068f0 ] } , - BigNum { limbs: [ 0x83dcbb8737c64f21f698c3549e1769, 0xc7db395ba0b0fd78657de7686e3365, 0x006024 ] } , - BigNum { limbs: [ 0x39c74778c695afde09673bab61e898, 0xdf77f041dc9735c1728a223969d1ee, 0x0013c8 ] } , - BigNum { limbs: [ 0xa6da970c07d2f4672fbfd4c682cf8d, 0x054f510f1adf0d3a5af0340cd39621, 0x001c0e ] } , - BigNum { limbs: [ 0x16c96bf3f6890a98d0402a397d3074, 0xa203d88e626925ff7d17d595046f32, 0x0057df ] } , - BigNum { limbs: [ 0xeb1d39384b680169843829431e57fd, 0xc9fcdddf203264a8313119df103abc, 0x000379 ] } , - BigNum { limbs: [ 0xd286c9c7b2f3fd967bc7d5bce1a804, 0xdd564bbe5d15ce91a6d6efc2c7ca96, 0x007073 ] } , - BigNum { limbs: [ 0xd863493a775f14a7aaf7b62fda6cba, 0xece0e9a4b842539c3d85087d66ffb0, 0x006f80 ] } , - BigNum { limbs: [ 0xe540b9c586fcea58550848d0259347, 0xba723ff8c505df9d9a8301247105a2, 0x00046c ] } , - BigNum { limbs: [ 0x25f767bd489fccc3c1676c47894ba0, 0xd13e09d7af1a26b78eaf3df8bc95bc, 0x0062c4 ] } , - BigNum { limbs: [ 0x97ac9b42b5bc323c3e9892b876b461, 0xd6151fc5ce2e0c824958cba91b6f97, 0x001128 ] } , - BigNum { limbs: [ 0xda9d4dc7871d4a47af2d5b15406a72, 0x33fe081daf40e72e21fce524caa0b9, 0x004011 ] } , - BigNum { limbs: [ 0xe306b538773eb4b850d2a3eabf958f, 0x7355217fce074c0bb60b247d0d6499, 0x0033dc ] } , - BigNum { limbs: [ 0xe89be72af25d72b654f9c26799dcc7, 0x1a1266ade51931c4dadec9aeb860cb, 0x001f7e ] } , - BigNum { limbs: [ 0xd5081bd50bfe8c49ab063c9866233a, 0x8d40c2ef982f0174fd293ff31fa487, 0x00546f ] } , - BigNum { limbs: [ 0xe8c6934d213fe213b5cd83a2997e0e, 0x0fc72fbf98558aa91c8fa2a68184ad, 0x0031d3 ] } , - BigNum { limbs: [ 0xd4dd6fb2dd1c1cec4a327b5d6681f3, 0x978bf9dde4f2a890bb7866fb5680a5, 0x00421a ] } , - BigNum { limbs: [ 0x76bd1d8b43599a9af9ec6b82136fc7, 0xe2555448411c9fdd3bcb27daee1540, 0x006f03 ] } , - BigNum { limbs: [ 0x46e6e574bb0264650613937dec903a, 0xc4fdd5553c2b935c9c3ce1c6e9f013, 0x0004e9 ] } , - BigNum { limbs: [ 0x27279edc58fd1ce3909bdfa35ee205, 0x7df04eb2ae3e8875f56db1fbe72c64, 0x0072fc ] } , - BigNum { limbs: [ 0x967c6423a55ee21c6f641f5ca11dfc, 0x2962daeacf09aac3e29a57a5f0d8ef, 0x0000f1 ] } , - BigNum { limbs: [ 0x19167dd03b0082caa9050b145fc8ff, 0x29b3b56e181b7de6598d54383a7743, 0x0069c5 ] } , - BigNum { limbs: [ 0xa48d852fc35b7c3556faf3eba03702, 0x7d9f742f652cb5537e7ab5699d8e10, 0x000a28 ] } , - BigNum { limbs: [ 0x6ed594862ae70796b282ba55bd550f, 0x81d01c4a001d3738c02808219767c6, 0x001755 ] } , - BigNum { limbs: [ 0x4ece6e79d374f7694d7d44aa42aaf2, 0x25830d537d2afc0117e00180409d8d, 0x005c98 ] } , - BigNum { limbs: [ 0x0d80f013eb6d129170990306486340, 0xf2286dd35bc1d03f8875b901a1ea3f, 0x004758 ] } , - BigNum { limbs: [ 0xb02312ec12eeec6e8f66fbf9b79cc1, 0xb52abbca218662fa4f9250a0361b14, 0x002c94 ] } , - BigNum { limbs: [ 0xb6ee7abb0b512c4aff92c0ab6779fd, 0x9e6ca7456d51a8f9ddce3882b20010, 0x002222 ] } , - BigNum { limbs: [ 0x06b58844f30ad2b5006d3e54988604, 0x08e682580ff68a3ffa39d11f260543, 0x0051cb ] } , - BigNum { limbs: [ 0xb5bb56ff3185f6a6958a4de8220461, 0x8adb129134d545dcaef866cec41447, 0x00524d ] } , - BigNum { limbs: [ 0x07e8ac00ccd608596a75b117ddfba0, 0x1c78170c4872ed5d290fa2d313f10c, 0x0021a0 ] } , - BigNum { limbs: [ 0x8d0b8f5ef4f45aa414b4187bf0cefd, 0xc86e1684b663c2b3fd7da0d1731abe, 0x001859 ] } , - BigNum { limbs: [ 0x309873a10967a45beb4be6840f3104, 0xdee51318c6e47085da8a68d064ea95, 0x005b93 ] } , - BigNum { limbs: [ 0x51d705b1446605453da88542fd72f9, 0x5b3a9e5d2c3aede5eb002c2b60b93f, 0x00539f ] } , - BigNum { limbs: [ 0x6bccfd4eb9f5f9bac25779bd028d08, 0x4c188b40510d4553ed07dd76774c14, 0x00204e ] } , - BigNum { limbs: [ 0x20c5e1ac91e7043eb55cb297533407, 0xfaa743efbaf221d99fc92763044ae6, 0x005c43 ] } , - BigNum { limbs: [ 0x9cde21536c74fac14aa34c68accbfa, 0xacabe5adc2561160383ee23ed3ba6d, 0x0017a9 ] } , - BigNum { limbs: [ 0xaf9e2530eab9cf4264d6404a2733ac, 0x27f12d3a9a9ee77632a0defe39c33e, 0x006795 ] } , - BigNum { limbs: [ 0x0e05ddcf13a22fbd9b29beb5d8cc55, 0x7f61fc62e2a94bc3a5672aa39e4215, 0x000c58 ] } , - BigNum { limbs: [ 0x8648e1bd9e0ece0b288ed46081a8e5, 0xdc9e2560b853a8674746f1368083cd, 0x0018b0 ] } , - BigNum { limbs: [ 0x375b2142604d30f4d7712a9f7e571c, 0xcab5043cc4f48ad290c1186b578186, 0x005b3c ] } , - BigNum { limbs: [ 0xb072e3c322e74eb23d90e7a150a81f, 0x0e2241ddb7f31f96bcabcb3f5b3eff, 0x0073e0 ] } , - BigNum { limbs: [ 0x0d311f3cdb74b04dc26f175eaf57e2, 0x9930e7bfc55513a31b5c3e627cc654, 0x00000d ] } , - BigNum { limbs: [ 0xb307c4acc098af9cb7d0a095380a13, 0x3f93d39b0e35ce4610ed89ddafa938, 0x0054f5 ] } , - BigNum { limbs: [ 0x0a9c3e533dc34f63482f5e6ac7f5ee, 0x67bf56026f1264f3c71a7fc4285c1b, 0x001ef8 ] } , - BigNum { limbs: [ 0xc96dc7bd14fd4cc6265320eb04df1f, 0x03162d547d0b04b715cf2986e1bd7c, 0x003eef ] } , - BigNum { limbs: [ 0xf4363b42e95eb239d9acde14fb20e2, 0xa43cfc49003d2e82c238e01af647d6, 0x0034fe ] } , - BigNum { limbs: [ 0x6a261391ef2b05dcba1da9c0ea4d84, 0x6db34aa2ef6bab4614b52835830458, 0x001907 ] } , - BigNum { limbs: [ 0x537def6e0f30f92345e2553f15b27d, 0x399fdefa8ddc87f3c352e16c5500fb, 0x005ae6 ] } , - BigNum { limbs: [ 0x8e53b94e2d7a777de0dbdf025ab85c, 0x181891141667e186be8536666f274c, 0x00679f ] } , - BigNum { limbs: [ 0x2f5049b1d0e187821f241ffda547a5, 0x8f3a988966e051b31982d33b68de07, 0x000c4e ] } , - BigNum { limbs: [ 0xae7460b333dded75dc07e6b09841ae, 0x73938b410ebea7cc7d4d32121c4242, 0x001959 ] } , - BigNum { limbs: [ 0x0f2fa24cca7e118a23f8184f67be53, 0x33bf9e5c6e898b6d5abad78fbbc311, 0x005a94 ] } , - BigNum { limbs: [ 0x64ec99029da116a22f45c8ff3de158, 0xdbac28c819ba8cacb9af89cb58ec17, 0x002fc2 ] } , - BigNum { limbs: [ 0x58b769fd60bae85dd0ba3600c21ea9, 0xcba700d5638da68d1e587fd67f193c, 0x00442a ] } , - BigNum { limbs: [ 0x73ff57fd162c88611aff08b8082bc6, 0xf00eba8d17bc2c4bf77e923ee5026a, 0x00372b ] } , - BigNum { limbs: [ 0x49a4ab02e82f769ee500f647f7d43b, 0xb7446f10658c06ede0897762f302e9, 0x003cc1 ] } , - BigNum { limbs: [ 0x6c8c0251e16956675a23bf595affed, 0x3edbaffb7067814b2a4f9ae135c4b2, 0x006450 ] } , - BigNum { limbs: [ 0x511800ae1cf2a898a5dc3fa6a50014, 0x687779a20ce0b1eeadb86ec0a240a1, 0x000f9d ] } , - BigNum { limbs: [ 0x1b05e2e48b2c9152b3b5b80abf68c0, 0xf3bed6f2430129e041031e004e4e4d, 0x005bf9 ] } , - BigNum { limbs: [ 0xa29e201b732f6dad4c4a46f5409741, 0xb39452ab3a4709599704eba189b706, 0x0017f3 ] } , - BigNum { limbs: [ 0x3113167ed5e21da7624e7e7d9cdb91, 0x99ee54290f334230f56b2d54e5aaa3, 0x006816 ] } , - BigNum { limbs: [ 0x8c90ec812879e1589db18082632470, 0x0d64d5746e14f108e29cdc4cf25ab0, 0x000bd7 ] } , - BigNum { limbs: [ 0xd5832d79ecd0b4adec57b39d5976fd, 0x54978826cc78e85cbd472ff7cb3b7a, 0x002d0a ] } , - BigNum { limbs: [ 0xe820d586118b4a5213a84b62a68904, 0x52bba176b0cf4add1ac0d9aa0cc9d8, 0x0046e3 ] } , - BigNum { limbs: [ 0x954a71cbe1cb702768549ef50d9562, 0x6029a0323eb4708b2ba556f0c0a801, 0x000caa ] } , - BigNum { limbs: [ 0x285991341c908ed897ab600af26a9f, 0x4729896b3e93c2aeac62b2b1175d52, 0x006743 ] } , - BigNum { limbs: [ 0xcf3f09884d9f7cec479b5abada171d, 0x4fe37b3abad3b49c7e5f0832dcc06a, 0x0058a0 ] } , - BigNum { limbs: [ 0xee64f977b0bc8213b864a44525e8e4, 0x576fae62c2747e9d59a9016efb44e8, 0x001b4d ] } , - BigNum { limbs: [ 0x0250f48d469c3b7aa035dd3fba17b8, 0x82b51da12ff666d4ff4fe4de8341dc, 0x00501a ] } , - BigNum { limbs: [ 0xbb530e72b7bfc3855fca21c045e849, 0x249e0bfc4d51cc64d8b824c354c377, 0x0023d3 ] } , - BigNum { limbs: [ 0x3b1f635d5fc7cc8a01bada5c2066ed, 0x5fcb606dc747f4725150e337e2a86e, 0x006fae ] } , - BigNum { limbs: [ 0x82849fa29e943275fe4524a3df9914, 0x4787c92fb6003ec786b72669f55ce5, 0x00043f ] } , - BigNum { limbs: [ 0x52347c40e9ad023dcc7526c32059aa, 0xf213d0cefbb428b4392029b4096c62, 0x00174f ] } , - BigNum { limbs: [ 0x6b6f86bf14aefcc2338ad83cdfa657, 0xb53f58ce81940a859ee7dfedce98f1, 0x005c9d ] } , - BigNum { limbs: [ 0xe0af91d785eedd767ce31ad39ec74e, 0x5dc4713f0d24d25e7f23bfb2ad7c28, 0x006ff7 ] } , - BigNum { limbs: [ 0xdcf47128786d2189831ce42c6138b3, 0x498eb85e702360db58e449ef2a892a, 0x0003f6 ] } , - BigNum { limbs: [ 0xc509359dec7597fa4a62b198187d9a, 0x55adc7a91433e2710626e8e387ea5b, 0x00360f ] } , - BigNum { limbs: [ 0xf89acd6211e66705b59d4d67e78267, 0x51a561f4691450c8d1e120be501af7, 0x003dde ] } , - BigNum { limbs: [ 0x6141d7458572909d52919d7329c038, 0xc14e478b55b07e3d7cd77d927340a2, 0x0004d1 ] } , - BigNum { limbs: [ 0x5c622bba78e96e62ad6e618cd63fc9, 0xe604e2122797b4fc5b308c0f64c4b1, 0x006f1b ] } , - BigNum { limbs: [ 0x3f0ba16d9f1f798d749c6f55b6f3ba, 0x17cd54e1e0b2ca3cc0bb4809745d14, 0x005e5d ] } , - BigNum { limbs: [ 0x7e9861925f3c85728b638faa490c47, 0x8f85d4bb9c9568fd174cc19863a83f, 0x001590 ] } , - BigNum { limbs: [ 0x60e24fd4d442ae546c0da3d6f92de7, 0x3db28c42d6efb645e1a4810837fbd5, 0x000ccf ] } , - BigNum { limbs: [ 0x5cc1b32b2a1950ab93f25b2906d21a, 0x69a09d5aa6587cf3f6638899a0097e, 0x00671e ] } , - BigNum { limbs: [ 0xf4ae259cce48fc73025a78d6a157b6, 0x2a8493910d2041ee514c8d8fd2a6cf, 0x00364d ] } , - BigNum { limbs: [ 0xc8f5dd633013028cfda586295ea84b, 0x7cce960c7027f14b86bb7c12055e83, 0x003da0 ] } , - BigNum { limbs: [ 0x4bd3293e18494166467f37ad6acacb, 0x808eb6c3dadf3f67a56addd0a74c6c, 0x0022c7 ] } , - BigNum { limbs: [ 0x71d0d9c1e612bd99b980c752953536, 0x26c472d9a268f3d2329d2bd130b8e7, 0x005126 ] } , - BigNum { limbs: [ 0x4a46043dc9fa03bb8ef7568e987dfb, 0x4e1376cb98cec3b5a6dbbcd0298f91, 0x00666b ] } , - BigNum { limbs: [ 0x735dfec23461fb447108a871678206, 0x593fb2d1e4796f84312c4cd1ae75c2, 0x000d82 ] } , - BigNum { limbs: [ 0x9490f7e75dcd289448486b546b2984, 0xcd9aaa9e76bd9ca162e764f989b23e, 0x000666 ] } , - BigNum { limbs: [ 0x29130b18a08ed66bb7b793ab94d67d, 0xd9b87eff068a96987520a4a84e5315, 0x006d86 ] } , - BigNum { limbs: [ 0xcdcd52a8f26af52a75a50ad2fef008, 0xf6bad0a94058f46302ada65165e7d9, 0x0044c5 ] } , - BigNum { limbs: [ 0xefd6b0570bf109d58a5af42d010ff9, 0xb09858f43cef3ed6d55a6350721d79, 0x002f27 ] } , - BigNum { limbs: [ 0x2630a24cfce639d244d30cd8ea7bcd, 0x77725f8abc93e7c90da100aec7bcec, 0x0050d5 ] } , - BigNum { limbs: [ 0x977360b30175c52dbb2cf227158434, 0x2fe0ca12c0b44b70ca6708f3104867, 0x002318 ] } , - BigNum { limbs: [ 0x3a476657e66ec984ccab00b208b2e0, 0x021de21f69c33790707ffd6c682af6, 0x00069b ] } , - BigNum { limbs: [ 0x835c9ca817ed357b3354fe4df74d21, 0xa535477e1384fba967880c356fda5d, 0x006d52 ] } , - BigNum { limbs: [ 0x5aaef6e05e419040ed2e6880add73b, 0xda87a31501872a2b361d0b35042e63, 0x005225 ] } , - BigNum { limbs: [ 0x62f50c1fa01a6ebf12d1967f5228c6, 0xcccb86887bc1090ea1eafe6cd3d6f0, 0x0021c7 ] } , - BigNum { limbs: [ 0x4565eab0ef4b24b52b9cfaf405946b, 0x1d79893ac2b83c595e90e2afa653dd, 0x0028db ] } , - BigNum { limbs: [ 0x783e184f0f10da4ad463040bfa6b96, 0x89d9a062ba8ff6e0797726f231b176, 0x004b12 ] } , - BigNum { limbs: [ 0x3dd810d20c496d3587decdf7bdaa27, 0xf2bbd8bfc515df8f48abf33cd40538, 0x005288 ] } , - BigNum { limbs: [ 0x7fcbf22df21291ca782131084255da, 0xb49750ddb83253aa8f5c166504001b, 0x002164 ] } , - BigNum { limbs: [ 0xcefb8080afbd38fd46d94c88ac4eda, 0xab95aa7cb97959d2edb08e5b49e499, 0x0024de ] } , - BigNum { limbs: [ 0xeea8827f4e9ec602b926b27753b127, 0xfbbd7f20c3ced966ea577b468e20b9, 0x004f0e ] } , - BigNum { limbs: [ 0x147027983c0f8e8e92f6b7a949929e, 0x8cad13ea364f478c702a489564da6b, 0x006f1b ] } , - BigNum { limbs: [ 0xa933db67c24c70716d094756b66d63, 0x1aa615b346f8ebad67ddc10c732ae8, 0x0004d2 ] } , - BigNum { limbs: [ 0xc610f12b9e1d4099f34ca4605bd68f, 0xcbed867978e43f186ccae13678a464, 0x006871 ] } , - BigNum { limbs: [ 0xf79311d4603ebe660cb35a9fa42972, 0xdb65a3240463f4216b3d286b5f60ee, 0x000b7b ] } , - BigNum { limbs: [ 0x0ddd0120cf62cffd5caa9f3a11da0a, 0x603682fe9fd4a90e241ecc89caa243, 0x002c9c ] } , - BigNum { limbs: [ 0xafc701df2ef92f02a3555fc5ee25f7, 0x471ca69edd738a2bb3e93d180d6310, 0x004751 ] } , - BigNum { limbs: [ 0x39f2f88e75b4a31b2f74c46426a23f, 0xe66af1d7932ad362456d75681d0549, 0x00612b ] } , - BigNum { limbs: [ 0x83b10a7188a75be4d08b3a9bd95dc2, 0xc0e837c5ea1d5fd7929a9439bb000a, 0x0012c1 ] } , - BigNum { limbs: [ 0x7ccd6a86be44a45afc5292bb43a009, 0xf56c69e40d222b3c9b710572b491af, 0x0019e9 ] } , - BigNum { limbs: [ 0x40d6987940175aa503ad6c44bc5ff8, 0xb1e6bfb9702607fd3c97042f2373a4, 0x005a03 ] } , - BigNum { limbs: [ 0x214e0c0015ea14a22443b06499ea49, 0xa33d50975d0a9f6e1923a2a4b4dcbc, 0x007391 ] } , - BigNum { limbs: [ 0x9c55f6ffe871ea5ddbbc4e9b6615b8, 0x0415d906203d93cbbee466fd232897, 0x00005c ] } , - BigNum { limbs: [ 0xeaa2e037baf3baf72dcbd4ee24d39a, 0xc546aa30e6bbe2e10ddec548608fb9, 0x0047d8 ] } , - BigNum { limbs: [ 0xd30122c843684408d2342a11db2c67, 0xe20c7f6c968c5058ca294459777599, 0x002c14 ] } , - BigNum { limbs: [ 0xee0baf3ab52c8e241d4950959a1c81, 0x5c07c691a601433a25b11b79630111, 0x006759 ] } , - BigNum { limbs: [ 0xcf9853c5492f70dbe2b6ae6a65e380, 0x4b4b630bd746efffb256ee28750441, 0x000c94 ] } , - BigNum { limbs: [ 0x1b63605f954ac2ea65f987bc35193c, 0xbbd397fcaca0416914466c9808724d, 0x001b92 ] } , - BigNum { limbs: [ 0xa240a2a069113c159a067743cae6c5, 0xeb7f91a0d0a7f1d0c3c19d09cf9306, 0x00585a ] } , - BigNum { limbs: [ 0xfaa20e0cddd4ba8766a6b4eea4bd15, 0x021925886da6a106358b0ea4c998aa, 0x0045a1 ] } , - BigNum { limbs: [ 0xc301f4f32087447899594a115b42ec, 0xa53a04150fa19233a27cfafd0e6ca8, 0x002e4c ] } , - BigNum { limbs: [ 0x0c741345a901b26974f21222a37402, 0xe98ca62b53227f386fec48ffba5725, 0x00579c ] } , - BigNum { limbs: [ 0xb12fefba555a4c968b0decdd5c8bff, 0xbdc683722a25b401681bc0a21dae2e, 0x001c50 ] } , - BigNum { limbs: [ 0xcdf2a4df205c566d342b664751b8b9, 0x7aac979f99d2f628a70262abb5b8a7, 0x003c45 ] } , - BigNum { limbs: [ 0xefb15e20ddffa892cbd498b8ae4748, 0x2ca691fde3753d113105a6f6224cab, 0x0037a8 ] } , - BigNum { limbs: [ 0xdf3781210e04f7222b74ab3f9cd482, 0xefc0f255ee76feb34b02af2903342b, 0x000f6a ] } , - BigNum { limbs: [ 0xde6c81def05707ddd48b53c0632b7f, 0xb79237478ed134868d055a78d4d127, 0x006482 ] } , - BigNum { limbs: [ 0x2d459a176b849968acb5abcae514e0, 0xe49b48fef478de731b11f75f47a2d2, 0x0057d1 ] } , - BigNum { limbs: [ 0x905e68e892d76597534a53351aeb21, 0xc2b7e09e88cf54c6bcf61242906281, 0x001c1b ] } , - BigNum { limbs: [ 0x8d4a502532c28e6e1fa05bb77f119a, 0xefb5e006cff6c98b53c795188a5a0b, 0x005078 ] } , - BigNum { limbs: [ 0x3059b2dacb997091e05fa34880ee67, 0xb79d4996ad5169ae844074894dab48, 0x002374 ] } , - BigNum { limbs: [ 0x3bfddab2017f2386535fda205c415b, 0x5a5aef0bbd1f7eee7fbc801335bcd5, 0x00413e ] } , - BigNum { limbs: [ 0x81a6284dfcdcdb79aca024dfa3bea6, 0x4cf83a91c028b44b584b898ea2487e, 0x0032af ] } , - BigNum { limbs: [ 0xdb4e2aef22df835a8bd76b81c8f97a, 0x78d408ec44ceebf8005827d0646a5e, 0x0026f6 ] } , - BigNum { limbs: [ 0xe255d810db7c7ba57428937e370687, 0x2e7f20b138794741d7afe1d1739af4, 0x004cf7 ] } , - BigNum { limbs: [ 0x936d72b19928b1afb86759927b47e6, 0x58eed6c70605ed202ef373dc7dccd9, 0x005a8a ] } , - BigNum { limbs: [ 0x2a36904e65334d504798a56d84b81b, 0x4e6452d677424619a91495c55a387a, 0x001963 ] } , - BigNum { limbs: [ 0x347d893a3ed84b41240552aa7372e9, 0xbda6e04b700a69a05c17cf5cbd9f23, 0x003c98 ] } , - BigNum { limbs: [ 0x892679c5bf83b3bedbfaac558c8d18, 0xe9ac49520d3dc9997bf03a451a6630, 0x003754 ] } , - BigNum { limbs: [ 0xcb4f0c95186dabe3ebd6d30fdaa02c, 0x885359d63febad14b5a4357eafab79, 0x00217f ] } , - BigNum { limbs: [ 0xf254f66ae5ee531c14292bf0255fd5, 0x1effcfc73d5c86252263d4232859d9, 0x00526e ] } , - BigNum { limbs: [ 0xdc256927d8f49d065a52ec3e0c7ac2, 0x7110edd98c4d50fabf7d6f4d5c8851, 0x000980 ] } , - BigNum { limbs: [ 0xe17e99d8256761f9a5ad12c1f3853f, 0x36423bc3f0fae23f188a9a547b7d01, 0x006a6d ] } , - BigNum { limbs: [ 0x8d3d79f6e39d2bde112abd7a8e53ce, 0x1479cf4e8c2ab65c067e38b58ae4b3, 0x0065b0 ] } , - BigNum { limbs: [ 0x306689091abed321eed5418571ac33, 0x92d95a4ef11d7cddd189d0ec4d20a0, 0x000e3d ] } , - BigNum { limbs: [ 0x8086ae070bc3d11bc024c840b8433e, 0xecef36ebf26bc40b39fcc48e6ab637, 0x0004f1 ] } , - BigNum { limbs: [ 0x3d1d54f8f2982de43fdb36bf47bcc3, 0xba63f2b18adc6f2e9e0b45136d4f1c, 0x006efb ] } , - BigNum { limbs: [ 0x2d74caec959b4df578c292627d3424, 0x2c5313faac4a00c8b1843ee3d0d104, 0x0022ff ] } , - BigNum { limbs: [ 0x902f381368c0b10a873d6c9d82cbdd, 0x7b0015a2d0fe32712683cabe07344f, 0x0050ee ] } , - BigNum { limbs: [ 0xcf42b161d631e688549e5f6c934620, 0xb48f1d3b4fec1e9238d1a4e8a71125, 0x00458a ] } , - BigNum { limbs: [ 0xee61519e282a1877ab619f936cb9e1, 0xf2c40c622d5c14a79f3664b930f42d, 0x002e62 ] } , - BigNum { limbs: [ 0xf8c738132c60091b074f4e6b57c34e, 0xfe66eaad172ed475976325a4a96406, 0x006eb3 ] } , - BigNum { limbs: [ 0xc4dccaecd1fbf5e4f8b0b094a83cb3, 0xa8ec3ef066195ec440a4e3fd2ea14c, 0x000539 ] } , - BigNum { limbs: [ 0xd37c4a9d7a65620d7dee1433f8ef02, 0x9cf12e56f6319dc1d778f39327e520, 0x005d45 ] } , - BigNum { limbs: [ 0xea27b86283f69cf28211eacc0710ff, 0x0a61fb4687169578008f160eb02032, 0x0016a8 ] } , - BigNum { limbs: [ 0x69b768b5d39b86cf7e7c09c345bf6a, 0x130e6f604f4e6321de3462e322a634, 0x002434 ] } , - BigNum { limbs: [ 0x53ec9a4a2ac078308183f53cba4097, 0x9444ba3d2df9d017f9d3a6beb55f1f, 0x004fb9 ] } , - BigNum { limbs: [ 0xeb960d6a0abcd4023d030dac526fc5, 0x7884b1d5501c2736269918a1a78ae4, 0x0066ba ] } , - BigNum { limbs: [ 0xd20df595f39f2afdc2fcf153ad903c, 0x2ece77c82d2c0c03b16ef100307a6e, 0x000d33 ] } , - BigNum { limbs: [ 0xb2dd5fcf5a47dd0ab1196d1f9bc88a, 0x57bc56f0e20f0f70fe1ee409d50d7c, 0x005259 ] } , - BigNum { limbs: [ 0x0ac6a330a41421f54ee691e0643777, 0x4f96d2ac9b3923c8d9e9259802f7d7, 0x002194 ] } , - BigNum { limbs: [ 0xaf66b07fd2b89b14d4dbb8e4c988de, 0x9998cb776df0869b997c65b4575e03, 0x000585 ] } , - BigNum { limbs: [ 0x0e3d52802ba363eb2b24461b367723, 0x0dba5e260f57ac9e3e8ba3ed80a750, 0x006e68 ] } , - BigNum { limbs: [ 0xf61d3f6170e53d97f8f008cf768a76, 0x5b602c58269c8ef028376b9685c9b8, 0x002c20 ] } , - BigNum { limbs: [ 0xc786c39e8d76c168070ff63089758b, 0x4bf2fd4556aba449afd09e0b523b9a, 0x0047cd ] } , - BigNum { limbs: [ 0x622ff754d375d84c5d77199341945f, 0x78893b8d266ef3ddf8f1f8e8f7d951, 0x00122f ] } , - BigNum { limbs: [ 0x5b740bab2ae626b3a288e56cbe6ba2, 0x2ec9ee1056d93f5bdf1610b8e02c02, 0x0061be ] } , - BigNum { limbs: [ 0x0aefb294a5d9e3687d2670f622df6c, 0x95d2457d5d6b293ef92ea67a692ab7, 0x005cd6 ] } , - BigNum { limbs: [ 0xb2b4506b58821b9782d98e09dd2095, 0x1180e4201fdd09faded963276eda9c, 0x001717 ] } , - BigNum { limbs: [ 0x63d364c9ba00d272890840b00420f5, 0x29c2ab9eba06a3fb843e6f883875ae, 0x001602 ] } , - BigNum { limbs: [ 0x59d09e36445b2c8d76f7be4ffbdf0c, 0x7d907dfec3418f3e53c99a199f8fa5, 0x005deb ] } , - BigNum { limbs: [ 0x62e5ef54d446d001dd7dd94f4c83f0, 0x2e6610db2be579e285d21c3be96a52, 0x001d6c ] } , - BigNum { limbs: [ 0x5abe13ab2a152efe228225b0b37c11, 0x78ed18c25162b9575235ed65ee9b01, 0x005681 ] } , - BigNum { limbs: [ 0xe4dc21d66c88a5c58b87357f57f234, 0xefb1629354e4d34f93e73013f72753, 0x006c6d ] } , - BigNum { limbs: [ 0xd8c7e12991d3593a7478c980a80dcd, 0xb7a1c70a28635fea4420d98de0ddff, 0x00077f ] } , - BigNum { limbs: [ 0xff24fa0bcfa8e4bfefc24704198a6b, 0x313aaab6b721937ae0819ff6472d7a, 0x00173a ] } , - BigNum { limbs: [ 0xbe7f08f42eb31a40103db7fbe67596, 0x76187ee6c6269fbef78669ab90d7d8, 0x005cb3 ] } , - BigNum { limbs: [ 0xab6f0ea079a6e4dba78a63795564bb, 0xea6ea42ae469d892949d7b60807964, 0x00590e ] } , - BigNum { limbs: [ 0x1234f45f84b51a2458759b86aa9b46, 0xbce4857298de5aa7436a8e41578bef, 0x001ade ] } , - BigNum { limbs: [ 0xd4d8d238af27685a21f57246d64bcc, 0x3610625447c700e379bdca7a6a2783, 0x004db0 ] } , - BigNum { limbs: [ 0xe8cb30c74f3496a5de0a8cb929b435, 0x7142c749358132565e4a3f276dddcf, 0x00263d ] } , - BigNum { limbs: [ 0xfd3bf0033dd6fe1e4c57f1c23661a7, 0xc9277b211191ac0755754412cef056, 0x006972 ] } , - BigNum { limbs: [ 0xc06812fcc08500e1b3a80d3dc99e5a, 0xde2bae7c6bb687328292c58f0914fc, 0x000a7a ] } , - BigNum { limbs: [ 0xf4f2863d6f00a5eb8cf558ae23eb3b, 0x9d2ac6d6cc9db539528902a8e6d4bf, 0x005623 ] } , - BigNum { limbs: [ 0xc8b17cc28f5b5914730aa651dc14c6, 0x0a2862c6b0aa7e00857f06f8f13093, 0x001dca ] } , - BigNum { limbs: [ 0xab7346f1c5dd69a742ad16020f0c07, 0x98cd60ef84bf73f1b64511c0021f98, 0x003c98 ] } , - BigNum { limbs: [ 0x1230bc0e387e9558bd52e8fdf0f3fa, 0x0e85c8adf888bf4821c2f7e1d5e5bb, 0x003755 ] } , - BigNum { limbs: [ 0xdb5ac19e95471752eef10592d37478, 0x78280afce1c17f500934d635381119, 0x005831 ] } , - BigNum { limbs: [ 0xe24941616914e7ad110ef96d2c8b89, 0x2f2b1ea09b86b3e9ced3336c9ff439, 0x001bbc ] } , - BigNum { limbs: [ 0x087316430ad9438cf77e056331d4fc, 0x0f9abac161455397d635854b193f18, 0x007363 ] } , - BigNum { limbs: [ 0xb530ecbcf382bb730881f99cce2b05, 0x97b86edc1c02dfa201d28456bec63b, 0x00008a ] } , - BigNum { limbs: [ 0x167cabcf48aae9ea0b1c34224fbd61, 0xb6b181ffb7e11ae9d1320a2c5beb55, 0x001d24 ] } , - BigNum { limbs: [ 0xa7275730b5b11515f4e3caddb042a0, 0xf0a1a79dc567185006d5ff757c19fe, 0x0056c8 ] } , - BigNum { limbs: [ 0x5bed60b7df5038076491b23c075728, 0xdb8369f69b7d6e35580692da3e8018, 0x0023a4 ] } , - BigNum { limbs: [ 0x61b6a2481f0bc6f89b6e4cc3f8a8d9, 0xcbcfbfa6e1cac504800176c799853b, 0x005048 ] } , - BigNum { limbs: [ 0x57c68d7415396c2de50d5f536e30db, 0xb1543cca2a1fb1eec4853a3a35d891, 0x0023ad ] } , - BigNum { limbs: [ 0x65dd758be92292d21af29fac91cf26, 0xf5feecd35328814b1382cf67a22cc2, 0x00503f ] } , - BigNum { limbs: [ 0x9e4983675d87e1d04fe1856b5161fa, 0x80f0b3ede8ab143ae61d73677668e6, 0x0002a8 ] } , - BigNum { limbs: [ 0x1f5a7f98a0d41d2fb01e7994ae9e07, 0x266275af949d1efef1ea963a619c6d, 0x007145 ] } , - BigNum { limbs: [ 0x302bd0f30daa22f40997d4e0cdb369, 0xcdf6ec9a06b06690843e61cac4ade1, 0x0025e8 ] } , - BigNum { limbs: [ 0x8d78320cf0b1dc0bf6682a1f324c98, 0xd95c3d037697cca953c9a7d7135772, 0x004e04 ] } , - BigNum { limbs: [ 0x126166bddccd1462e572f220fa4c0c, 0xed111ae29c7e0eb4cf7a3c92ea0844, 0x002e7b ] } , - BigNum { limbs: [ 0xab429c42218eea9d1a8d0cdf05b3f5, 0xba420ebae0ca2485088dcd0eedfd0f, 0x004571 ] } , - BigNum { limbs: [ 0x339c0906b87b56568f4b0b097df9fb, 0xdfc74d69529870a13c9e329eb8dd18, 0x003e79 ] } , - BigNum { limbs: [ 0x8a07f9f945e0a8a970b4f3f6820606, 0xc78bdc342aafc2989b69d7031f283b, 0x003573 ] } , - BigNum { limbs: [ 0xa5c4ac27eb44e2aae5c2b5313d9002, 0xd2e5157046db1ad6ff97430335c818, 0x003f0d ] } , - BigNum { limbs: [ 0x17df56d813171c551a3d49cec26fff, 0xd46e142d366d1862d870c69ea23d3b, 0x0034df ] } , - BigNum { limbs: [ 0x4c7bf3f8b147be2cbed7f0bf090098, 0x5e1556dbfbb27f64e8055e8cdb1d7c, 0x003d96 ] } , - BigNum { limbs: [ 0x71280f074d1440d341280e40f6ff69, 0x493dd2c18195b3d4f002ab14fce7d7, 0x003657 ] } , - BigNum { limbs: [ 0x404608c5b6bf709eecc8e7ede857ab, 0x1ce95d845fd76979d9369a57471b9a, 0x004ff7 ] } , - BigNum { limbs: [ 0x7d5dfa3a479c8e611337171217a856, 0x8a69cc191d70c9bffed16f4a90e9b9, 0x0023f6 ] } , - BigNum { limbs: [ 0x9b0c2b81d681413f774225fa5aa0e0, 0xc198b4f1edccb9f6c4aa4c9d097385, 0x006526 ] } , - BigNum { limbs: [ 0x2297d77e27dabdc088bdd905a55f21, 0xe5ba74ab8f7b7943135dbd04ce91ce, 0x000ec6 ] } , - BigNum { limbs: [ 0xa6230c9f9b8b900243a36f7f89fae5, 0xa8409974793c2046ca955ddeaaf043, 0x0051d8 ] } , - BigNum { limbs: [ 0x1780f66062d06efdbc5c8f8076051c, 0xff129029040c12f30d72abc32d1510, 0x002214 ] } , - BigNum { limbs: [ 0xbe2f06e8c58c2a19bf210063c2e679, 0x47b8fcec34f0ce000121051220f6e1, 0x004808 ] } , - BigNum { limbs: [ 0xff74fc1738cfd4e640defe9c3d1988, 0x5f9a2cb148576539d6e7048fb70e71, 0x002be5 ] } , - BigNum { limbs: [ 0xbec3196e627413dbd79f51edccc9e4, 0x55dcd186a03fc273e1ba09ad8bf571, 0x00219c ] } , - BigNum { limbs: [ 0xfee0e9919be7eb242860ad1233361d, 0x51765816dd0870c5f64dfff44c0fe1, 0x005251 ] } , - BigNum { limbs: [ 0xa062883d272c787e214c505cc37bb8, 0xb19461ae3758739bee8ef3518d5981, 0x004beb ] } , - BigNum { limbs: [ 0x1d417ac2d72f8681deb3aea33c8449, 0xf5bec7ef45efbf9de97916504aabd2, 0x002801 ] } , - BigNum { limbs: [ 0xbdca35bc89cf2e818683ca0e981e53, 0xabcc07dbc25a9d40c19692ced6937a, 0x00411c ] } , - BigNum { limbs: [ 0xffd9cd43748cd07e797c34f167e1ae, 0xfb8721c1baed95f9167176d30171d8, 0x0032d0 ] } , - BigNum { limbs: [ 0x76b4372a3289a33215dfcaf179a125, 0x4a5b3f291c611783ec1b207387edc9, 0x003832 ] } , - BigNum { limbs: [ 0x46efcbd5cbd25bcdea20340e865edc, 0x5cf7ea7460e71bb5ebece92e50178a, 0x003bbb ] } , - BigNum { limbs: [ 0xa2d66a05b0421da524c859157d01be, 0x43031dbf32617e16d937f8e8873c46, 0x003a36 ] } , - BigNum { limbs: [ 0x1acd98fa4e19e15adb37a5ea82fe43, 0x64500bde4ae6b522fed010b950c90d, 0x0039b7 ] } , - BigNum { limbs: [ 0xc428110192350213760ef8046fdba5, 0xdad815b390567ce98b35604515d398, 0x000370 ] } , - BigNum { limbs: [ 0xf97bf1fe6c26fcec89f106fb90245c, 0xcc7b13e9ecf1b6504cd2a95cc231ba, 0x00707c ] } , - BigNum { limbs: [ 0x09a3d15c678111e2a72c91d778db77, 0xb77eaaecc8b737ee782500a1480a23, 0x004e16 ] } , - BigNum { limbs: [ 0xb40031a396daed1d58d36d2887248a, 0xefd47eb0b490fb4b5fe309008ffb30, 0x0025d6 ] } , - BigNum { limbs: [ 0x050de9d5c78215b0b1b60a24681e28, 0x7754d7ae1281cf955a039d047aeee7, 0x00341d ] } , - BigNum { limbs: [ 0xb896192a36d9e94f4e49f4db97e1d9, 0x2ffe51ef6ac663a47e046c9d5d166c, 0x003fd0 ] } , - BigNum { limbs: [ 0x812a31c427febd6c35d2e338026d9e, 0x40a4e5d8b982cb0880ad6c1e36a6a1, 0x003aba ] } , - BigNum { limbs: [ 0x3c79d13bd65d4193ca2d1bc7fd9263, 0x66ae43c4c3c56831575a9d83a15eb2, 0x003933 ] } , - BigNum { limbs: [ 0x386f8d921bce1f63f68d7c07ae7401, 0x78cd5c4a2cc22b1f82c24c49a6a38b, 0x001429 ] } , - BigNum { limbs: [ 0x8534756de28ddf9c097282f8518c00, 0x2e85cd535086081a5545bd583161c8, 0x005fc4 ] } , - BigNum { limbs: [ 0x42ced375a1f9831695feeee6ebbb23, 0xd17c31c23df923d33c5281359d1088, 0x006c99 ] } , - BigNum { limbs: [ 0x7ad52f8a5c627be96a0110191444de, 0xd5d6f7db3f4f0f669bb5886c3af4cb, 0x000753 ] } , - BigNum { limbs: [ 0xc0e4c27b09624c3cf4c3c8b82268de, 0x24ae8c3220d3bb0dbb32d6f021f23f, 0x00487a ] } , - BigNum { limbs: [ 0xfcbf4084f4f9b2c30b3c3647dd9723, 0x82a49d6b5c74782c1cd532b1b61313, 0x002b73 ] } , - BigNum { limbs: [ 0x6c3c4c1e3774f5b1c6930c377f7040, 0x7c135543154ef67cf84ec44d0f01fd, 0x0033b1 ] } , - BigNum { limbs: [ 0x5167b6e1c6e7094e396cf2c8808fc1, 0x2b3fd45a67f93cbcdfb94554c90356, 0x00403c ] } , - BigNum { limbs: [ 0x12ca311f7fd12d398fb5e547b671b5, 0x0cc4ba4853e11ccbbaa4383233ec38, 0x0046f1 ] } , - BigNum { limbs: [ 0xaad9d1e07e8ad1c6704a19b8498e4c, 0x9a8e6f552967166e1d63d16fa4191b, 0x002cfc ] } , - BigNum { limbs: [ 0x16b36d3c1ac814874529ef17d6a510, 0x55fc1bc3b5fe65b56a1a1234552ec5, 0x005afc ] } , - BigNum { limbs: [ 0xa6f095c3e393ea78bad60fe8295af1, 0x51570dd9c749cd846dedf76d82d68e, 0x0018f1 ] } , - BigNum { limbs: [ 0xe92a68efce58edae9be2c9a128b7a8, 0xff24306585a01aeba02b847008d252, 0x0017b9 ] } , - BigNum { limbs: [ 0xd4799a1030031151641d355ed74859, 0xa82ef937f7a8184e37dc8531cf3300, 0x005c33 ] } , - BigNum { limbs: [ 0x2c20261d6f63fdb01729273b501f58, 0xd773fa1a1bff31abec1184bb529d60, 0x00487c ] } , - BigNum { limbs: [ 0x9183dce28ef8014fe8d6d7c4afe0a9, 0xcfdf2f836149018debf684e68567f3, 0x002b70 ] } , - BigNum { limbs: [ 0x4511e37ec0a0e6c38e58bed13d112c, 0x5c7d802ce23ea4f3a7a686812ee345, 0x003eee ] } , - BigNum { limbs: [ 0x78921f813dbb183c71a7402ec2eed5, 0x4ad5a9709b098e4630618320a9220e, 0x0034ff ] } , - BigNum { limbs: [ 0x0c9fa08508aad414ea074c1f23ba30, 0xf799394ba267d5c451b52ac38a7015, 0x001c87 ] } , - BigNum { limbs: [ 0xb104627af5b12aeb15f8b2e0dc45d1, 0xafb9f051dae05d758652dede4d953e, 0x005765 ] } , - BigNum { limbs: [ 0xb637bb3a3b9a8596dac2ba21e1b301, 0x8e70d46598eddeff558cd1ceec3f42, 0x006a7d ] } , - BigNum { limbs: [ 0x076c47c5c2c17969253d44de1e4d00, 0x18e25537e45a543a827b37d2ebc611, 0x000970 ] } , - BigNum { limbs: [ 0xa32c41aa67e0beb0ad80034eb71aa6, 0x9508a3dad316105f067219141f4450, 0x002bcd ] } , - BigNum { limbs: [ 0x1a77c155967b404f527ffbb148e55b, 0x124a85c2aa3222dad195f08db8c103, 0x004820 ] } , - BigNum { limbs: [ 0x6b3940c718bb3958fd9a1ddf213be7, 0xee356d71662cd22a979f6b15fc86ce, 0x001f4a ] } , - BigNum { limbs: [ 0x526ac238e5a0c5a70265e120dec41a, 0xb91dbc2c171b610f40689e8bdb7e85, 0x0054a2 ] } , - BigNum { limbs: [ 0x0164a97d188ac0ad5367ab4e7b9e84, 0xd76d92812edc0b2170f8fa33b90723, 0x001637 ] } , - BigNum { limbs: [ 0xbc3f5982e5d13e52ac9853b184617d, 0xcfe5971c4e6c2818670f0f6e1efe30, 0x005db5 ] } , - BigNum { limbs: [ 0xd38af418dcea4940696f931cef27c7, 0xf2b39ee7c1f14c64da2d1c87fee4ab, 0x001510 ] } , - BigNum { limbs: [ 0xea190ee72171b5bf96906be310d83a, 0xb49f8ab5bb56e6d4fddaed19d920a7, 0x005edc ] } , - BigNum { limbs: [ 0xa0fc06f956f6d131762634135d8773, 0x660adcd8596d1256ead3bd82cadd77, 0x00043b ] } , - BigNum { limbs: [ 0x1ca7fc06a7652dce89d9caeca2788e, 0x41484cc523db20e2ed344c1f0d27dc, 0x006fb2 ] } , - BigNum { limbs: [ 0x98b5990f7dd55dba4f3fedebd06bc5, 0xeac74899e255532e7960de94f43902, 0x004481 ] } , - BigNum { limbs: [ 0x24ee69f08086a145b0c011142f943c, 0xbc8be1039af2e00b5ea72b0ce3cc51, 0x002f6b ] } , - BigNum { limbs: [ 0x6f602b2b358f7ef3a6617be19d472b, 0xa8e515acb6396cee5a925bf81b7077, 0x005326 ] } , - BigNum { limbs: [ 0x4e43d7d4c8cc800c599e831e62b8d6, 0xfe6e13f0c70ec64b7d75ada9bc94dc, 0x0020c6 ] } , - BigNum { limbs: [ 0x18d4d95a863f36470f4ebc84a1bd09, 0x925d1a9cc5785dcf1a4388a868b3e5, 0x00591e ] } , - BigNum { limbs: [ 0xa4cf29a5781cc8b8f0b1427b5e42f8, 0x14f60f00b7cfd56abdc480f96f516e, 0x001acf ] } , - BigNum { limbs: [ 0x37975f1f4d9331f2d9f84be1cb409f, 0x6d9d6d6d6548788364ba04c31cffc8, 0x002d3a ] } , - BigNum { limbs: [ 0x860ca3e0b0c8cd0d2607b31e34bf62, 0x39b5bc3017ffbab6734e04debb058b, 0x0046b3 ] } , - BigNum { limbs: [ 0x13995efabb2e08108045b70a904c29, 0x68e227088a0c18c2811a831726b411, 0x001626 ] } , - BigNum { limbs: [ 0xaa0aa405432df6ef7fba47f56fb3d8, 0x3e710294f33c1a7756ed868ab15142, 0x005dc7 ] } , - BigNum { limbs: [ 0xd904c73a6df631a566da4dc6969ff2, 0x233a4e20eddc2b3f3429032441631e, 0x00113b ] } , - BigNum { limbs: [ 0xe49f3bc59065cd5a9925b13969600f, 0x8418db7c8f6c07faa3df067d96a234, 0x0062b2 ] } , - BigNum { limbs: [ 0xb4ad674a5b0e84b2be9919fe7beb09, 0x9b7a1f04d514ebbd8e4a6a5f39d332, 0x000818 ] } , - BigNum { limbs: [ 0x08f69bb5a34d7a4d4166e5018414f8, 0x0bd90a98a833477c49bd9f429e3221, 0x006bd5 ] } , - BigNum { limbs: [ 0x3815ad2b4e0bed39a9ab3291ebcb6d, 0x481a65dceabc6ce9304f5ee5ab74a3, 0x001073 ] } , - BigNum { limbs: [ 0x858e55d4b05011c65654cc6e143494, 0x5f38c3c0928bc650a7b8aabc2c90b0, 0x00637a ] } , - BigNum { limbs: [ 0x675ee8f0cfc4fbe1c53bdc5c414033, 0x6ff3dc88c3c951715c36a0edc53b77, 0x006c1f ] } , - BigNum { limbs: [ 0x56451a0f2e97031e3ac422a3bebfce, 0x375f4d14b97ee1c87bd168b412c9dc, 0x0007ce ] } , - BigNum { limbs: [ 0x9d6b9010e7aedcfd961ec7e5265cdf, 0x3797d5d3852d318d7031d74e4c3e13, 0x0000d3 ] } , - BigNum { limbs: [ 0x203872ef16ad220269e1371ad9a322, 0x6fbb53c9f81b01ac67d632538bc740, 0x00731a ] } , - BigNum { limbs: [ 0x76d9747869e6fb998944eb24e3022a, 0xf60ba4afea247aeba5e346b9d70e94, 0x002f0d ] } , - BigNum { limbs: [ 0x46ca8e879475036676bb13db1cfdd7, 0xb14784ed9323b84e3224c2e800f6bf, 0x0044df ] } , - BigNum { limbs: [ 0x7e74e6253d9e28eb6f05198583cc5a, 0xc3fb75a40eda9e7820f403bec3fa34, 0x006263 ] } , - BigNum { limbs: [ 0x3f2f1cdac0bdd61490fae57a7c33a7, 0xe357b3f96e6d94c1b71405e3140b1f, 0x001189 ] } , - BigNum { limbs: [ 0x67b6ccb7cb52aa6311b7eb3aeec353, 0x45181092c55b725895bec22d77a19f, 0x00082e ] } , - BigNum { limbs: [ 0x55ed36483309549cee4813c5113cae, 0x623b190ab7ecc0e1424947746063b4, 0x006bbf ] } , - BigNum { limbs: [ 0xa2948b0f28fd5df91fc60871a54c24, 0x2150f3f639fc833e844a9af6b85d52, 0x003d89 ] } , - BigNum { limbs: [ 0x1b0f77f0d55ea106e039f68e5ab3dd, 0x860235a7434baffb53bd6eab1fa801, 0x003664 ] } , - BigNum { limbs: [ 0xd623dc41d0fd8aa88e850ca72894b1, 0xcc83e375c0ec4ed37d208f6077d205, 0x006501 ] } , - BigNum { limbs: [ 0xe78026be2d5e7457717af258d76b50, 0xdacf4627bc5be4665ae77a4160334d, 0x000eeb ] } , - BigNum { limbs: [ 0x55e876c3e0a5147afa35ae1fc29be8, 0x0a9434ce3e69fda9e3cc5bacdeab09, 0x0030ad ] } , - BigNum { limbs: [ 0x67bb8c3c1db6ea8505ca50e03d6419, 0x9cbef4cf3ede358ff43badf4f95a4a, 0x004340 ] } , - BigNum { limbs: [ 0x5e38e331c8b4975bd310c3a66c9537, 0x7452f50c70e72cd060f51bbb1a5c14, 0x0007e0 ] } , - BigNum { limbs: [ 0x5f6b1fce35a767a42cef3b59936aca, 0x330034910c6106697712ede6bda93f, 0x006c0d ] } , - BigNum { limbs: [ 0x839e93b61ed367713054cb61f934a6, 0x86e13262538cbcd386b654d64e49aa, 0x006697 ] } , - BigNum { limbs: [ 0x3a056f49df88978ecfab339e06cb5b, 0x2071f73b29bb76665151b4cb89bba9, 0x000d56 ] } , - BigNum { limbs: [ 0xce77b6b91a5bff3496d2f9d70bbbed, 0xfa867056ef0bf0b6fbbe96fe0b5f57, 0x006e22 ] } , - BigNum { limbs: [ 0xef2c4c46e3ffffcb692d0528f44414, 0xacccb9468e3c4282dc4972a3cca5fb, 0x0005ca ] } , - BigNum { limbs: [ 0x35851865696a5fe7449852b6744cfb, 0xca1910b4c0d6c2301c80b5355c202d, 0x006397 ] } , - BigNum { limbs: [ 0x881eea9a94f19f18bb67ac498bb306, 0xdd3a18e8bc717109bb87546c7be526, 0x001055 ] } , - BigNum { limbs: [ 0x15b13cd94b772008f85d2cfd89da4e, 0x0bba06096d7f32862846c576ee59a4, 0x00044c ] } , - BigNum { limbs: [ 0xa7f2c626b2e4def707a2d2027625b3, 0x9b9923940fc900b3afc1442ae9abaf, 0x006fa1 ] } , - BigNum { limbs: [ 0xad4e7565595253f1a51657f2a2f9e7, 0xe3fc58bf7b73a3423aa9719209a14a, 0x00257d ] } , - BigNum { limbs: [ 0x10558d9aa509ab0e5ae9a70d5d061a, 0xc356d0de01d48ff79d5e980fce6409, 0x004e6f ] } , - BigNum { limbs: [ 0x99e27a2081799b4eca385586eb2c8a, 0x6e1e917d3c28d3709d3de66e349da2, 0x004217 ] } , - BigNum { limbs: [ 0x23c188df7ce263b135c7a97914d377, 0x39349820411f5fc93aca2333a367b1, 0x0031d6 ] } , - BigNum { limbs: [ 0x5b5d18505549feee6bc914fa35124f, 0xa94623e44bc1990ff506a2cd6b3d9d, 0x00288e ] } , - BigNum { limbs: [ 0x6246eaafa91200119436ea05caedb2, 0xfe0d05b931869a29e30166d46cc7b6, 0x004b5e ] } , - BigNum { limbs: [ 0x200aebafc5ea98d70b82be17d2ea44, 0x9e1350d0f12ec8c9b38256147ffc5f, 0x0002b0 ] } , - BigNum { limbs: [ 0x9d99175038716628f47d40e82d15bd, 0x093fd8cc8c196a702485b38d5808f4, 0x00713d ] } , - BigNum { limbs: [ 0xd22bffba2587708972aa6c93818ac3, 0x0d75320a98111865427c3fbad80109, 0x001d89 ] } , - BigNum { limbs: [ 0xeb780345d8d48e768d55926c7e753e, 0x99ddf792e5371ad4958bc9e7000449, 0x005664 ] } , - BigNum { limbs: [ 0x987808ecddda052fa970fa47b4d601, 0x73f9895e0b1dddf69a51b191869389, 0x00017f ] } , - BigNum { limbs: [ 0x252bfa132081f9d0568f04b84b2a00, 0x3359a03f722a55433db658105171ca, 0x00726e ] } , - BigNum { limbs: [ 0x797372b5768dd9ebb076877911c04b, 0x9e39ebc0279c4f5b7a8a85b70bc7fe, 0x004478 ] } , - BigNum { limbs: [ 0x4430904a87ce25144f897786ee3fb6, 0x09193ddd55abe3de5d7d83eacc3d55, 0x002f75 ] } , - BigNum { limbs: [ 0xd8a8d534b0bce4b5614227d84785d3, 0x7c149fa74f614d379f099408001942, 0x001142 ] } , - BigNum { limbs: [ 0xe4fb2dcb4d9f1a4a9ebdd727b87a2e, 0x2b3e89f62de6e60238fe7599d7ec10, 0x0062ab ] } , - BigNum { limbs: [ 0xe783d9c51d6ce1625d7b4024d0bc31, 0x8f48d8897bd8b9ad44bff146d48270, 0x003884 ] } , - BigNum { limbs: [ 0xd620293ae0ef1d9da284bedb2f43d0, 0x180a5114016f798c9348185b0382e2, 0x003b69 ] } , - BigNum { limbs: [ 0x4f5998407582cb8e651766a21aabf7, 0x222338f5c90837822f5731ee9d1207, 0x00453f ] } , - BigNum { limbs: [ 0x6e4a6abf88d933719ae8985de5540a, 0x852ff0a7b43ffbb7a8b0d7b33af34c, 0x002eae ] } , - BigNum { limbs: [ 0xf11b943e0a5c1e2e4846815bb5cb67, 0x91e813585d0a31b10c4d0834e51570, 0x000ab9 ] } , - BigNum { limbs: [ 0xcc886ec1f3ffe0d1b7b97da44a349a, 0x156b1645203e0188cbbb016cf2efe2, 0x006934 ] } , - BigNum { limbs: [ 0x1a72e496b8439b36cd4db1bbe5ca69, 0x5ceb01a76fced43cc0d2474edd1a13, 0x001243 ] } , - BigNum { limbs: [ 0xa3311e69461863c932b24d441a3598, 0x4a6827f60d795efd1735c252faeb40, 0x0061aa ] } , - BigNum { limbs: [ 0x3b6fa83d80ddb697498cee10f65636, 0x145c26afc67740e95ba8f06421ede8, 0x0062de ] } , - BigNum { limbs: [ 0x82345ac27d7e4868b67310ef09a9cb, 0x92f702edb6d0f2507c5f193db6176b, 0x00110f ] } , - BigNum { limbs: [ 0xe294866778dba7eed0691c4f064c24, 0x4e726428a8545d0980355d73eb438a, 0x005985 ] } , - BigNum { limbs: [ 0xdb0f7c98858057112f96e2b0f9b3dd, 0x58e0c574d4f3d63057d2ac2decc1c8, 0x001a68 ] } , - BigNum { limbs: [ 0x3127d801dca32a39962c609da710e3, 0xa4b1ab2b9df1738156030e0c00b4b8, 0x005d57 ] } , - BigNum { limbs: [ 0x8c7c2afe21b8d4c669d39e6258ef1e, 0x02a17e71df56bfb88204fb95d7509b, 0x001696 ] } , - BigNum { limbs: [ 0x7235137c96ca150abf67a5fa6f0687, 0x8eaab1e5d22ab63f8399bdf5936d8f, 0x004978 ] } , - BigNum { limbs: [ 0x4b6eef836791e9f54098590590f97a, 0x18a877b7ab1d7cfa546e4bac4497c4, 0x002a75 ] } , - BigNum { limbs: [ 0xe34c60b7c083e55fade10d7514eed6, 0x3333ea0f66fa627540c1307c98c144, 0x001ac5 ] } , - BigNum { limbs: [ 0xda57a2483dd819a0521ef18aeb112b, 0x741f3f8e164dd0c49746d9253f440e, 0x005928 ] } , - BigNum { limbs: [ 0x500508fe3d0e6a914a23cd6857106f, 0x136a2fdf95ef346770ba87cbc4ad1e, 0x005fb4 ] } , - BigNum { limbs: [ 0x6d9efa01c14d946eb5dc3197a8ef92, 0x93e8f9bde758fed2674d81d6135835, 0x001439 ] } , - BigNum { limbs: [ 0x526fc51e926eed088ea3d3a61591a0, 0x5b7ee5750ad9dde09fa1fc42c5aba4, 0x003f9c ] } , - BigNum { limbs: [ 0x6b343de16bed11f7715c2b59ea6e61, 0x4bd44428726e555938660d5f1259af, 0x003451 ] } , - BigNum { limbs: [ 0xe5f6189a91d3131e38ce660312f615, 0x21c3f659c625eb5509c25b6653d9e7, 0x006f33 ] } , - BigNum { limbs: [ 0xd7adea656c88ebe1c73198fced09ec, 0x858f3343b72247e4ce45ae3b842b6b, 0x0004ba ] } , - BigNum { limbs: [ 0x7a0d81db669673c291f14cd98a7d2a, 0x8d612d2d97a693c03dbd4683c4baa6, 0x003fbe ] } , - BigNum { limbs: [ 0x4396812497c58b3d6e0eb2267582d7, 0x19f1fc6fe5a19f799a4ac31e134aad, 0x00342f ] } , - BigNum { limbs: [ 0x8a993fc6880486691832e8a41ee752, 0x5621a1853029eb3b5bfee47aaa41ce, 0x0007ed ] } , - BigNum { limbs: [ 0x330ac33976577896e7cd165be118af, 0x513188184d1e47fe7c0925272dc385, 0x006c00 ] } , - BigNum { limbs: [ 0x09811b9ecc3cdd2f69ba00cf49e3de, 0x0de23f4bcc6180fb5cd21c7d361f8c, 0x003a91 ] } , - BigNum { limbs: [ 0xb422e761321f21d09645fe30b61c23, 0x9970ea51b0e6b23e7b35ed24a1e5c7, 0x00395c ] } , - BigNum { limbs: [ 0xb28df60d27e28a6f0bea9e4dba4f9a, 0xa7903b327a3446326e6d7100f47412, 0x002992 ] } , - BigNum { limbs: [ 0x0b160cf2d6797490f41560b245b067, 0xffc2ee6b0313ed07699a98a0e39141, 0x004a5a ] } , - BigNum { limbs: [ 0x11fd20282d1b25e0833b7c617bdc5d, 0xf09ed8b68a8d837045222b2c384419, 0x0052dc ] } , - BigNum { limbs: [ 0xaba6e2d7d140d91f7cc4829e8423a4, 0xb6b450e6f2baafc992e5de759fc13a, 0x002110 ] } , - BigNum { limbs: [ 0x1d92ba5065f372af722cf7829fab72, 0x13f833701b1eabc3f1fbd860bb881d, 0x006004 ] } , - BigNum { limbs: [ 0xa01148af98688c508dd3077d60548f, 0x935af62d62298775e60c31411c7d36, 0x0013e9 ] } , - BigNum { limbs: [ 0xf67c97f1fdd432814ece7435bcf923, 0x637daaeb4a5bdc3e971128e27174e4, 0x002f9c ] } , - BigNum { limbs: [ 0xc7276b0e0087cc7eb1318aca4306de, 0x43d57eb232ec56fb40f6e0bf66906e, 0x004451 ] } , - BigNum { limbs: [ 0xd1fc0d8c4aab114fc7d67bfcec6520, 0xc284a67515dc83cfc755da62fd7c91, 0x005dc3 ] } , - BigNum { limbs: [ 0xeba7f573b3b0edb038298303139ae1, 0xe4ce8328676baf6a10b22f3eda88c1, 0x001629 ] } , - BigNum { limbs: [ 0x21d9526aec07103e286a9ea36bab20, 0x583453a9a25dc5a592e88c3fc46d0a, 0x00431c ] } , - BigNum { limbs: [ 0x9bcab0951254eec1d795605c9454e1, 0x4f1ed5f3daea6d94451f7d62139849, 0x0030d1 ] } , - BigNum { limbs: [ 0xbc49eed496ecddb02181d185aa602e, 0x379c4b7bd1be32fa560b3c056fed6e, 0x006bb0 ] } , - BigNum { limbs: [ 0x015a142b676f214fde7e2d7a559fd3, 0x6fb6de21ab8a003f81fccd9c6817e5, 0x00083d ] } , - BigNum { limbs: [ 0x0d4cb24f88de63e4ada96b3b020d8b, 0x0732880a87c2e260e20d201f1dc558, 0x0011c7 ] } , - BigNum { limbs: [ 0xb05750b0757d9b1b525693c4fdf276, 0xa020a192f58550d8f5fae982ba3ffb, 0x006226 ] } , - BigNum { limbs: [ 0x281a3c2fd0196ddb35b650d9ab3014, 0x13a14cf58033dcd23a6d13a1561f3f, 0x007398 ] } , - BigNum { limbs: [ 0x9589c6d02e429124ca49ae2654cfed, 0x93b1dca7fd1456679d9af60081e614, 0x000055 ] } , - BigNum { limbs: [ 0xd7aba520c240a24ce5e53162d931c5, 0x9aee630fab443b1f1ed6a578f80def, 0x003ee8 ] } , - BigNum { limbs: [ 0xe5f85ddf3c1b5cb31a1acd9d26ce3c, 0x0c64c68dd203f81ab9316428dff763, 0x003505 ] } , - BigNum { limbs: [ 0x134e66da5b38f8967d351412b79c04, 0x5553ee0a4e4a941d33b1f8e336b54e, 0x006fe8 ] } , - BigNum { limbs: [ 0xaa559c25a323066982caeaed4863fd, 0x51ff3b932efd9f1ca45610bea15005, 0x000405 ] } , - BigNum { limbs: [ 0x414e3836e3157a8288c66f4fdacbf8, 0x52a8c981ab3a1e7d85b985abf82649, 0x005b43 ] } , - BigNum { limbs: [ 0x7c55cac91b46847d77398fb0253409, 0x54aa601bd20e14bc524e83f5dfdf0a, 0x0018aa ] } , - BigNum { limbs: [ 0x4ab805ac95beda104662889534a02c, 0x539e4674f2d136fa5c7dcdca12fd92, 0x005b3e ] } , - BigNum { limbs: [ 0x72ebfd53689d24efb99d766acb5fd5, 0x53b4e3288a76fc3f7b8a3bd7c507c1, 0x0018af ] } , - BigNum { limbs: [ 0xc08825ca2a922d393400b40d41c6eb, 0x890fb076d6c0dae0712f321c7aee7d, 0x004ca0 ] } , - BigNum { limbs: [ 0xfd1bdd35d3c9d1c6cbff4af2be3916, 0x1e437926a687585966d8d7855d16d5, 0x00274d ] } , - BigNum { limbs: [ 0x0630f155a7283ed1c9abe0a3bb223d, 0xb0488d87edd87d3d3093d21097e608, 0x000f50 ] } , - BigNum { limbs: [ 0xb77311aa5733c02e36541e5c44ddc4, 0xf70a9c158f6fb5fca7743791401f4b, 0x00649c ] } , - BigNum { limbs: [ 0xfee2872cd133059b478876f4842e9f, 0x8ac51357d5355dd7ecde8c306bc5e4, 0x002cbb ] } , - BigNum { limbs: [ 0xbec17bd32d28f964b877880b7bd162, 0x1c8e1645a812d561eb297d716c3f6e, 0x004732 ] } , - BigNum { limbs: [ 0x7209469bf06555dc6de7f9dc3cf057, 0xda9a17c0cb99deeaf901bbb17f4cad, 0x006861 ] } , - BigNum { limbs: [ 0x4b9abc640df6a92392180523c30faa, 0xccb911dcb1ae544edf064df058b8a6, 0x000b8b ] } , - BigNum { limbs: [ 0x79a8628ff9a0c9d04682224497a483, 0xac3d44a1626a5e5a49672c61ad1248, 0x005d42 ] } , - BigNum { limbs: [ 0x43fba07004bb352fb97ddcbb685b7e, 0xfb15e4fc1addd4df8ea0dd402af30b, 0x0016aa ] } , - BigNum { limbs: [ 0x66c147052435b8c52cd3cb674b34f7, 0xb6bdb257b845b08cd87970cb89e28a, 0x004357 ] } , - BigNum { limbs: [ 0x56e2bbfada26463ad32c3398b4cb0a, 0xf0957745c50282acff8e98d64e22c9, 0x003095 ] } , - BigNum { limbs: [ 0x8bc41357f8ecf34b52bf5ff565037f, 0x1602f720f2c6cb73d20cbefccdbf11, 0x00456c ] } , - BigNum { limbs: [ 0x31dfefa8056f0bb4ad409f0a9afc82, 0x9150327c8a8167c605fb4aa50a4642, 0x002e81 ] } , - BigNum { limbs: [ 0xd49563f5999b733d36e6c8d5c85d0c, 0x16953595435748ad3268533efd6733, 0x003b7b ] } , - BigNum { limbs: [ 0xe90e9f0a64c08bc2c919362a37a2f5, 0x90bdf40839f0ea8ca59fb662da9e1f, 0x003872 ] } , - BigNum { limbs: [ 0xb693f1fdc1ba0de7ecc99fd1b22cc2, 0x4379a23142572df8d45c0c2cc85d70, 0x000015 ] } , - BigNum { limbs: [ 0x071011023ca1f11813365f2e4dd33f, 0x63d9876c3af1054103abfd750fa7e3, 0x0073d8 ] } , - BigNum { limbs: [ 0x54551ac51be1b7412c65f5e605243e, 0x5d17e1be209e075f004f9b4bf64387, 0x004307 ] } , - BigNum { limbs: [ 0x694ee83ae27a47bed39a0919fadbc3, 0x4a3b47df5caa2bdad7b86e55e1c1cc, 0x0030e6 ] } , - BigNum { limbs: [ 0x5f4e9992ab4edb37d62c4d138d2f72, 0xe6bd27170f4a688b7dc622905567a8, 0x0037ce ] } , - BigNum { limbs: [ 0x5e55696d530d23c829d3b1ec72d08f, 0xc09602866dfdcaae5a41e711829dab, 0x003c1e ] } , - BigNum { limbs: [ 0x95171015da9c0f569350c43c0745df, 0xf42bd04cd34e6ef5bca284efc7b5c6, 0x00024d ] } , - BigNum { limbs: [ 0x288cf2ea23bfefa96caf3ac3f8ba22, 0xb3275950a9f9c4441b6584b2104f8d, 0x00719f ] } , - BigNum { limbs: [ 0x31e04ad7a1c291452b2c882eaec899, 0x34fc43e610951bdad4b55e2f230cdf, 0x001530 ] } , - BigNum { limbs: [ 0x8bc3b8285c996dbad4d376d1513768, 0x7256e5b76cb3175f0352ab72b4f874, 0x005ebd ] } , - BigNum { limbs: [ 0x3459c934ecefaca50981741a41e44f, 0x1ae656312fef5318e11dc9b1ca9119, 0x001190 ] } , - BigNum { limbs: [ 0x894a39cb116c525af67e8ae5be1bb2, 0x8c6cd36c4d58e020f6ea3ff00d743a, 0x00625d ] } , - BigNum { limbs: [ 0x97c25d899137c6d44daf086afcf9b8, 0xd1a4bc0456eca420f0afb1451cc192, 0x001a75 ] } , - BigNum { limbs: [ 0x25e1a5766d24382bb250f695030649, 0xd5ae6d99265b8f18e758585cbb43c1, 0x005977 ] } , - BigNum { limbs: [ 0xad19ee483751942d93bf8912cc93b0, 0x9c4f8b2315b52fea09cc230ac20329, 0x003210 ] } , - BigNum { limbs: [ 0x108a14b7c70a6ad26c4075ed336c51, 0x0b039e7a6793034fce3be69716022a, 0x0041dd ] } , - BigNum { limbs: [ 0x49d37738918ca35cb7f86764fdea09, 0x402ed2d26efaccfdb0625b8ce63bd7, 0x0008a5 ] } , - BigNum { limbs: [ 0x73d08bc76ccf5ba34807979b0215f8, 0x672456cb0e4d663c27a5ae14f1c97c, 0x006b48 ] } , - BigNum { limbs: [ 0x0c0f30d36b082eb0dc17816cb0e06b, 0xd4b929a9031fcbefd73174b145ab8d, 0x000997 ] } , - BigNum { limbs: [ 0xb194d22c9353d04f23e87d934f1f96, 0xd299fff47a28674a00d694f09259c6, 0x006a55 ] } , - BigNum { limbs: [ 0xd79d9b5cf0b02f4ad1ec37bc4668a5, 0x0b9445efe18018da6541112be98f50, 0x005f8d ] } , - BigNum { limbs: [ 0xe60667a30dabcfb52e13c743b9975c, 0x9bbee3ad9bc81a5f72c6f875ee7602, 0x001460 ] } , - BigNum { limbs: [ 0x121d282465bdad0f34141c7d3da09a, 0x0ef76b4c80691a776f67d16dfe80bc, 0x006c4d ] } , - BigNum { limbs: [ 0xab86dadb989e51f0cbebe282c25f67, 0x985bbe50fcdf18c268a03833d98497, 0x0007a0 ] } , - BigNum { limbs: [ 0xe32d00989071c592863b2deccd28d4, 0x78def8f9daa7a035b7beb65789703d, 0x002513 ] } , - BigNum { limbs: [ 0xda7702676dea396d79c4d11332d72d, 0x2e7430a3a2a093042049534a4e9515, 0x004eda ] } , - BigNum { limbs: [ 0x7db9aa83b35c113fb0d31aeeacbb65, 0x84ab3bcdeda0cd33828d5f406885fb, 0x003543 ] } , - BigNum { limbs: [ 0x3fea587c4affedc04f2ce41153449c, 0x22a7edcf8fa76606557aaa616f7f58, 0x003eaa ] } , - BigNum { limbs: [ 0xe78a85938af37e0af32e561b3d24e8, 0x8ff9c4252ab7abacc0ad5a0f8108c1, 0x00380e ] } , - BigNum { limbs: [ 0xd6197d6c736880f50cd1a8e4c2db19, 0x175965785290878d175aaf9256fc91, 0x003bdf ] } , - BigNum { limbs: [ 0xe862487904d0ab1b561347c6a47727, 0xca4cf7456c9b942c20e45c3ad14d9c, 0x005164 ] } , - BigNum { limbs: [ 0xd541ba86f98b53e4a9ecb7395b88da, 0xdd06325810ac9f0db723ad6706b7b6, 0x002288 ] } , - BigNum { limbs: [ 0xd33bf14161f9d1b57c74a1a632861c, 0x8837cd53b51429480da6ff98e69efd, 0x0006ea ] } , - BigNum { limbs: [ 0xea6811be9c622d4a838b5d59cd79e5, 0x1f1b5c49c83409f1ca610a08f16655, 0x006d03 ] } , - BigNum { limbs: [ 0x6f85c75c7104048219119f4ee37970, 0xe3b668951f44d83642143e5116021a, 0x006661 ] } , - BigNum { limbs: [ 0x4e1e3ba38d57fa7de6ee5fb11c8691, 0xc39cc1085e035b0395f3cb50c20339, 0x000d8b ] } , - BigNum { limbs: [ 0xabe8a42bca4648155c5db70536fba5, 0x1a6d0e45b70438852afca87a27475e, 0x0011ed ] } , - BigNum { limbs: [ 0x11bb5ed43415b6eaa3a247fac9045c, 0x8ce61b57c643fab4ad0b6127b0bdf5, 0x006200 ] } , - BigNum { limbs: [ 0x56b609aec53dfd8fd8477795ff4e24, 0x9098661b7f0098c6a168ae263847ed, 0x004d4f ] } , - BigNum { limbs: [ 0x66edf951391e017027b8876a00b1dd, 0x16bac381fe479a73369f5b7b9fbd66, 0x00269e ] } , - BigNum { limbs: [ 0x3068288d002952aa9bb95d1b374ed5, 0xc885613baf7578fdbf732896904a2d, 0x00034b ] } , - BigNum { limbs: [ 0x8d3bda72fe32ac556446a1e4c8b12c, 0xdecdc861cdd2ba3c1894e10b47bb26, 0x0070a1 ] } , - BigNum { limbs: [ 0xfaf5246bdc6160df264050cf3e22ae, 0x814196ce178247b7c36d8edbda6053, 0x00323e ] } , - BigNum { limbs: [ 0xc2aede9421fa9e20d9bfae30c1dd53, 0x261192cf65c5eb82149a7ac5fda4ff, 0x0041af ] } , - BigNum { limbs: [ 0x83b05c24992a3135e348767c4aafe2, 0x8130b73aebc3ce227e8fb926f40cd9, 0x000ede ] } , - BigNum { limbs: [ 0x39f3a6db6531cdca1cb78883b5501f, 0x26227262918465175978507ae3f87a, 0x00650f ] } , - BigNum { limbs: [ 0xfa262ea0e733170f29a0b04e9a8146, 0xdb5d01b6e9702207cb5d3f177f64f8, 0x001672 ] } , - BigNum { limbs: [ 0xc37dd45f1728e7f0d65f4eb1657ebb, 0xcbf627e693d811320caaca8a58a05a, 0x005d7a ] } , - BigNum { limbs: [ 0xcd82c8828701da73a34913a9e841e9, 0x69cdffa8d7cafcb50dee8ce8259bd4, 0x004147 ] } , - BigNum { limbs: [ 0xf0213a7d775a248c5cb6eb5617be18, 0x3d8529f4a57d3684ca197cb9b2697e, 0x0032a6 ] } , - BigNum { limbs: [ 0x94f0b4c9df1485e97b95616c3a6fef, 0x3edc1705b7526883f2507b3751c473, 0x006835 ] } , - BigNum { limbs: [ 0x28b34e361f477916846a9d93c59012, 0x68771297c5f5cab5e5b78e6a8640e0, 0x000bb8 ] } , - BigNum { limbs: [ 0x8dd787b3ad291ab1521b0d5ecedcc4, 0x82b9f56777bee241f5a44452f15b9e, 0x00200a ] } , - BigNum { limbs: [ 0x2fcc7b4c5132e44eade4f1a131233d, 0x24993436058950f7e263c54ee6a9b5, 0x0053e3 ] } , - BigNum { limbs: [ 0xd9ef271dd3186ccee2ccfa249bc96c, 0x3aebd897ae71b531e25c39151709d1, 0x006261 ] } , - BigNum { limbs: [ 0xe3b4dbe22b4392311d3304db643695, 0x6c675105ced67e07f5abd08cc0fb81, 0x00118c ] } , - BigNum { limbs: [ 0xcc8504f991529c7e5c204ab3282e9c, 0x10c06ce25a54f297d011f3f4779043, 0x004296 ] } , - BigNum { limbs: [ 0xf11efe066d096281a3dfb44cd7d165, 0x9692bcbb22f340a207f615ad60750f, 0x003157 ] } , - BigNum { limbs: [ 0xe0ed66ad5979117d3b59206b37406b, 0xf99d726505dc5b4365cceb71e6cc29, 0x006e26 ] } , - BigNum { limbs: [ 0xdcb69c52a4e2ed82c4a6de94c8bf96, 0xadb5b738776bd7f6723b1e2ff13929, 0x0005c6 ] } , - BigNum { limbs: [ 0xffc63674068e602b7a8144bbcd69c5, 0xf8e0e7abdd4583aa7aaa8a5d528ad3, 0x005a65 ] } , - BigNum { limbs: [ 0xbdddcc8bf7cd9ed4857eba4432963c, 0xae7241f1a002af8f5d5d7f44857a7f, 0x001987 ] } , - BigNum { limbs: [ 0x7d6416a22630d3fd06627b42ef60df, 0xf9d79aea135c6db595852b0bc9e469, 0x0025d3 ] } , - BigNum { limbs: [ 0x403fec5dd82b2b02f99d83bd109f22, 0xad7b8eb369ebc5844282de960e20ea, 0x004e19 ] } , - BigNum { limbs: [ 0x572b91ccaf01e737ebaf0350b4539e, 0x1b19e36b145443404dbc8e67ffaff0, 0x001f1c ] } , - BigNum { limbs: [ 0x667871334f5a17c81450fbaf4bac63, 0x8c39463268f3eff98a4b7b39d85563, 0x0054d1 ] } , - BigNum { limbs: [ 0xd7ac7c2c9bde34674cde84dbe81470, 0x7c3cd8f74f3b31619e9a529ee63694, 0x0000cb ] } , - BigNum { limbs: [ 0xe5f786d3627dca98b3217a2417eb91, 0x2b1650a62e0d01d8396db702f1cebe, 0x007322 ] } , - BigNum { limbs: [ 0xa95fd87e28812feed0f1e2e15ed07a, 0x199195db48b029afda9a43a0090477, 0x003a0e ] } , - BigNum { limbs: [ 0x14442a81d5dacf112f0e1c1ea12f87, 0x8dc193c234980989fd6dc601cf00dc, 0x0039df ] } , - BigNum { limbs: [ 0x2b8714689ebb197b31b51d176d5c3c, 0xe1242db051eb464a672cc470201226, 0x0067bd ] } , - BigNum { limbs: [ 0x921cee975fa0e584ce4ae1e892a3c5, 0xc62efbed2b5cecef70db4531b7f32d, 0x000c2f ] } , - BigNum { limbs: [ 0x3cbdd8a6e048f12007970e58be3166, 0x33f1b315af0fd1980c2d159e845906, 0x0016c2 ] } , - BigNum { limbs: [ 0x80e62a591e130ddff868f0a741ce9b, 0x73617687ce3861a1cbdaf40353ac4d, 0x005d2b ] } , - BigNum { limbs: [ 0xfee8040aec8c1b21876fef338861b6, 0x48f5fc192eed7bab0a897de2a8f403, 0x002725 ] } , - BigNum { limbs: [ 0xbebbfef511cfe3de78900fcc779e4b, 0x5e5d2d844e5ab78ecd7e8bbf2f114f, 0x004cc8 ] } , - BigNum { limbs: [ 0xc23fb356e882cb58c9b96eb9c473a7, 0x69aaaeeede1f442a3183fc9227d33e, 0x003df9 ] } , - BigNum { limbs: [ 0xfb644fa915d933a7364690463b8c5a, 0x3da87aae9f28ef0fa6840d0fb03214, 0x0035f4 ] } , - BigNum { limbs: [ 0x94938a3faced68a2e0778d5371aa24, 0xceb0996b830d198b7c6783f5c910ad, 0x00195a ] } , - BigNum { limbs: [ 0x291078c0516e965d1f8871ac8e55dd, 0xd8a29031fa3b19ae5ba085ac0ef4a6, 0x005a92 ] } , - BigNum { limbs: [ 0xff4d68c5cc6a9938a37e9fbda3520b, 0x15803f81c70dcc1409ac0a82f404fc, 0x003786 ] } , - BigNum { limbs: [ 0xbe569a3a31f165c75c815f425cadf6, 0x91d2ea1bb63a6725ce5bff1ee40056, 0x003c67 ] } , - BigNum { limbs: [ 0xe8bb12eb4447c40dcc1e860326fca3, 0x8ed923b9bbd942fb5be8827759c83c, 0x0000e4 ] } , - BigNum { limbs: [ 0xd4e8f014ba143af233e178fcd9035e, 0x187a05e3c16ef03e7c1f872a7e3d16, 0x007309 ] } , - BigNum { limbs: [ 0x4adbc5153b03755ad82db249fcc494, 0x19a4f89360d960c87e36158349361b, 0x004976 ] } , - BigNum { limbs: [ 0x72c83deac35889a527d24cb6033b6d, 0x8dae310a1c6ed27159d1f41e8ecf38, 0x002a77 ] } , - BigNum { limbs: [ 0xd06bc72939ea9a0f0b5d731502b4fc, 0xa8bd32d060ed4e1a4ccbda7027a088, 0x0028d3 ] } , - BigNum { limbs: [ 0xed383bd6c47164f0f4a28beafd4b05, 0xfe95f6cd1c5ae51f8b3c2f31b064ca, 0x004b19 ] } , - BigNum { limbs: [ 0xfaf4b473e66f63ed292d9ec211f01f, 0xf755c839b702b7f1381a8091ff1f94, 0x001e3c ] } , - BigNum { limbs: [ 0xc2af4e8c17ec9b12d6d2603dee0fe2, 0xaffd6163c6457b489fed890fd8e5be, 0x0055b0 ] } , - BigNum { limbs: [ 0x24a11c49898e7b3bb56210f46b445f, 0xc5ea4ace31b95f11446f4b1f4fdbed, 0x005b56 ] } , - BigNum { limbs: [ 0x9902e6b674cd83c44a9dee0b94bba2, 0xe168decf4b8ed4289398be82882966, 0x001896 ] } , - BigNum { limbs: [ 0x6f5e54d4f027ac5bad62e1af726a05, 0x30306ecaf3fa1c87b7ca9aec4a5134, 0x003ffc ] } , - BigNum { limbs: [ 0x4e45ae2b0e3452a4529d1d508d95fc, 0x7722bad2894e16b2203d6eb58db41f, 0x0033f1 ] } , - BigNum { limbs: [ 0x85c9632db6a4b24bef8e0f80d5157c, 0x85e0f879619f68358d191aaeef76af, 0x003f86 ] } , - BigNum { limbs: [ 0x37da9fd247b74cb41071ef7f2aea85, 0x217231241ba8cb044aeeeef2e88ea4, 0x003467 ] } , - BigNum { limbs: [ 0x7e418610e6300609ec655a96950036, 0x96a6cc49dbfef1d56e569388e1650c, 0x002089 ] } , - BigNum { limbs: [ 0x3f627cef182bf8f6139aa4696affcb, 0x10ac5d53a149416469b17618f6a047, 0x005364 ] } , - BigNum { limbs: [ 0x3f0be78d99500000cea642590ebc16, 0xab00ba22d325f03fa5b968775aa902, 0x006218 ] } , - BigNum { limbs: [ 0x7e981b72650bfeff3159bca6f143eb, 0xfc526f7aaa2242fa324ea12a7d5c51, 0x0011d4 ] } , - BigNum { limbs: [ 0xea4e19668e715782042e05ddb7752a, 0xf74d99ab54b7ec9f8b181a83fad3b4, 0x001ba4 ] } , - BigNum { limbs: [ 0xd355e9996feaa77dfbd1f922488ad7, 0xb0058ff22890469a4cefef1ddd319e, 0x005848 ] } , - BigNum { limbs: [ 0x4c336a761e4581bf60523dc6f3dea6, 0x32a8f7310d4638b6bb7d490afd305a, 0x000aae ] } , - BigNum { limbs: [ 0x71709889e0167d409fadc1390c215b, 0x74aa326c7001fa831c8ac096dad4f9, 0x00693f ] } , - BigNum { limbs: [ 0x3e67ad1973bd409807a6e05531681c, 0x70aa028a2ef45d5b62df0f11ae65bf, 0x006c86 ] } , - BigNum { limbs: [ 0x7f3c55e68a9ebe67f8591eaace97e5, 0x36a927134e53d5de7528fa90299f94, 0x000767 ] } , - BigNum { limbs: [ 0xe717b4de70fa810795a88a3a2252bc, 0x6fc224829e1a6434fe5c34476208aa, 0x006e82 ] } , - BigNum { limbs: [ 0xd68c4e218d617df86a5774c5ddad45, 0x3791051adf2dcf04d9abd55a75fca8, 0x00056b ] } , - BigNum { limbs: [ 0x4283ef0cd948c46de4c7756a415804, 0x0f838a7f9cfe5497048871f79513b8, 0x0060e8 ] } , - BigNum { limbs: [ 0x7b2013f325133a921b388995bea7fd, 0x97cf9f1de049dea2d37f97aa42f19b, 0x001305 ] } , - BigNum { limbs: [ 0x32eb25ed865d8a753b31683fa6dd39, 0x966dbaad8e05e14dfe2ee8716930f9, 0x0016ab ] } , - BigNum { limbs: [ 0x8ab8dd1277fe748ac4ce96c05922c8, 0x10e56eefef4251ebd9d921306ed45a, 0x005d42 ] } , - BigNum { limbs: [ 0xb3548fbd0e36ae4822c9601db5b4d5, 0xa86df049b80d263ce2230e80f40b30, 0x006d28 ] } , - BigNum { limbs: [ 0x0a4f7342f02550b7dd369ee24a4b2c, 0xfee53953c53b0cfcf5e4fb20e3fa23, 0x0006c4 ] } , - BigNum { limbs: [ 0x405360681e405f89ed751a5b13fc35, 0x5e64d07b6631b2a5b57903a8320da2, 0x007020 ] } , - BigNum { limbs: [ 0x7d50a297e01b9f76128ae4a4ec03cc, 0x48ee592217168094228f05f9a5f7b1, 0x0003cd ] } , - BigNum { limbs: [ 0xa7b4c41bfe96e37702c146acabf566, 0xa04f78c9dafbc3e1ff474a6d35e8b9, 0x0056c0 ] } , - BigNum { limbs: [ 0x15ef3ee3ffc51b88fd3eb853540a9b, 0x0703b0d3a24c6f57d8c0bf34a21c9a, 0x001d2d ] } , - BigNum { limbs: [ 0x1cbb84cdda266dbb22ab2c4a38aa7a, 0x5c8ebe53d0423309862f1db8081658, 0x0042c7 ] } , - BigNum { limbs: [ 0xa0e87e3224359144dd54d2b5c75587, 0x4ac46b49ad06003051d8ebe9cfeefb, 0x003126 ] } , - BigNum { limbs: [ 0x320b95d64b1d490f210d0f0ba87923, 0xe1b4b7a01995741c5814d5130a8fc8, 0x00332e ] } , - BigNum { limbs: [ 0x8b986d29b33eb5f0def2eff45786de, 0xc59e71fd63b2bf1d7ff3348ecd758b, 0x0040be ] } , - BigNum { limbs: [ 0x23f2668433fa8a28e9d267e676f09d, 0x0c0d2f68cc92142eaa7c005473e533, 0x0038bd ] } , - BigNum { limbs: [ 0x99b19c7bca6174d7162d9719890f64, 0x9b45fa34b0b61f0b2d8c094d642020, 0x003b30 ] } , - BigNum { limbs: [ 0xec9c72dcc8734dc425ca19861ee552, 0xa1b4bb68c4254dc4593c3329bca6f0, 0x00452b ] } , - BigNum { limbs: [ 0xd107902335e8b13bda35e579e11aaf, 0x059e6e34b922e5757ecbd6781b5e62, 0x002ec2 ] } , - BigNum { limbs: [ 0x1f67edc6afede3df74adaaa1cca9a7, 0x5e0842a169ebac8106ac15c98c18ed, 0x005ad2 ] } , - BigNum { limbs: [ 0x9e3c15394e6e1b208b52545e33565a, 0x494ae6fc135c86b8d15bf3d84bec66, 0x00191b ] } , - BigNum { limbs: [ 0x4058bec7b133ca651afefb29a9939c, 0x0a1b0f3b4c751890003cd3ebaf5e8c, 0x001c40 ] } , - BigNum { limbs: [ 0x7d4b44384d28349ae50103d6566c65, 0x9d381a6230d31aa9d7cb35b628a6c7, 0x0057ad ] } , - BigNum { limbs: [ 0x36ab8ea81583c4c1bac540e381c8f0, 0x1aaa7e12f469e4cd7d8ce2c990dfaf, 0x00228b ] } , - BigNum { limbs: [ 0x86f87457e8d83a3e453abe1c7e3711, 0x8ca8ab8a88de4e6c5a7b26d84725a4, 0x005162 ] } , - BigNum { limbs: [ 0xcc000a11e4802951f21cd6dbea7c2a, 0xb2123d13636d445f7082bc8207c8de, 0x0040e1 ] } , - BigNum { limbs: [ 0xf1a3f8ee19dbd5ae0de328241583d7, 0xf540ec8a19daeeda67854d1fd03c74, 0x00330b ] } , - BigNum { limbs: [ 0x3e599117e9cb952d607598bcc1e83b, 0x0c2ab77ef28c6f50de31578cfaa24a, 0x0057db ] } , - BigNum { limbs: [ 0x7f4a71e8149069d29f8a66433e17c6, 0x9b28721e8abbc3e8f9d6b214dd6309, 0x001c12 ] } , - BigNum { limbs: [ 0x1799f058035dcbd96ba5757dda8575, 0x50a13bd906972b0df5d780044f449b, 0x0046ae ] } , - BigNum { limbs: [ 0xa60a12a7fafe3326945a8982257a8c, 0x56b1edc476b1082be230899d88c0b8, 0x002d3f ] } , - BigNum { limbs: [ 0xd251991f9b1b248b5290db47cce484, 0x26250c7b5ea46f67582902c36e8328, 0x006bd0 ] } , - BigNum { limbs: [ 0xeb5269e06340da74ad6f23b8331b7d, 0x812e1d221ea3c3d27fdf06de69822a, 0x00081d ] } , - BigNum { limbs: [ 0x6031729518c4b8a9bfdced5c3773f4, 0x86953de4b81e7bbf620c45bb9d997c, 0x001328 ] } , - BigNum { limbs: [ 0x5d72906ae5974656402311a3c88c0d, 0x20bdebb8c529b77a75fbc3e63a6bd7, 0x0060c5 ] } , - BigNum { limbs: [ 0x32c32f9153cf104f13adf78f0ab22e, 0xa23781992517af63a50cecf710ddd8, 0x0015df ] } , - BigNum { limbs: [ 0x8ae0d36eaa8ceeb0ec520770f54dd3, 0x051ba804583083d632fb1caac7277b, 0x005e0e ] } , - BigNum { limbs: [ 0x4cd9e894db2eabe96ae51954f195b5, 0x98b9143180684b98c91a50bad0d8c1, 0x006e54 ] } , - BigNum { limbs: [ 0x70ca1a6b232d5316951ae5ab0e6a4c, 0x0e9a156bfcdfe7a10eedb8e7072c92, 0x000599 ] } , - BigNum { limbs: [ 0xae1798878e7216996be5ea4dc5beac, 0x20333d0b9da9e2636e6e51aab939ce, 0x004de0 ] } , - BigNum { limbs: [ 0x0f8c6a786fe9e866941a14b23a4155, 0x871fec91df9e50d66999b7f71ecb85, 0x00260d ] } , - BigNum { limbs: [ 0x4b1482a8d939c5fa9b75f82a40b888, 0x083d359637c206f39bf89d8be3b31f, 0x006541 ] } , - BigNum { limbs: [ 0x728f805725223905648a06d5bf4779, 0x9f15f40745862c463c0f6c15f45234, 0x000eac ] } , - BigNum { limbs: [ 0x0c9aca5890366ec871b857734dcd5f, 0x0d89eb0a9d7dda72356f321f529289, 0x006e9d ] } , - BigNum { limbs: [ 0xb10938a76e2590378e47a78cb232a2, 0x99c93e92dfca58c7a298d7828572ca, 0x000550 ] } , - BigNum { limbs: [ 0xd568dfeaa8afc9152957dd7e3e6d6e, 0x0519af22b8c6ef03dcb464a2d69029, 0x0054ca ] } , - BigNum { limbs: [ 0xe83b231555ac35ead6a82181c19293, 0xa2397a7ac4814435fb53a4ff017529, 0x001f23 ] } , - BigNum { limbs: [ 0x4e5a1345f539f8413b50b95c227c97, 0x1d1e8c04c2f02e593273988bfecb24, 0x001e84 ] } , - BigNum { limbs: [ 0x6f49efba092206bec4af45a3dd836a, 0x8a349d98ba5804e0a5947115d93a2f, 0x005569 ] } , - BigNum { limbs: [ 0xa233d82ae54a6891aab45ac7da93f8, 0x59e206cc655847d1ca20dca2c17542, 0x000643 ] } , - BigNum { limbs: [ 0x1b702ad51911966e554ba438256c09, 0x4d7122d117efeb680de72cff169011, 0x006daa ] } , - BigNum { limbs: [ 0x81e21fc24c6141198168d81deef562, 0x4b60c7562ad9d99a2cadbf83be355f, 0x002c49 ] } , - BigNum { limbs: [ 0x3bc1e33db1fabde67e9726e2110a9f, 0x5bf26247526e599fab5a4a1e19cff4, 0x0047a4 ] } , - BigNum { limbs: [ 0x2ac7666544ba6c5bdbe9e8a2c79508, 0x78e857f2fceaabddbfda8da360393c, 0x003e34 ] } , - BigNum { limbs: [ 0x92dc9c9ab9a192a42416165d386af9, 0x2e6ad1aa805d875c182d7bfe77cc17, 0x0035b9 ] } , - BigNum { limbs: [ 0xe1aa2efec5bded7ca93d1f2babd583, 0x8b67f646955d6a841374b0bdab42f1, 0x0016ad ] } , - BigNum { limbs: [ 0xdbf9d401389e118356c2dfd4542a7e, 0x1beb3356e7eac8b5c49358e42cc261, 0x005d40 ] } , - BigNum { limbs: [ 0xdf9ac37921d95019c73db3049e70c2, 0xdae9d3069be8ff8367d0e70c66c376, 0x002895 ] } , - BigNum { limbs: [ 0xde093f86dc82aee638c24bfb618f3f, 0xcc695696e15f33b6703722957141dc, 0x004b57 ] } , - BigNum { limbs: [ 0x79d4bf47595d55596ef2bd27f6682b, 0xeeb9d3a9d140dca62ce144961f8e25, 0x0058e2 ] } , - BigNum { limbs: [ 0x43cf43b8a4fea9a6910d41d80997d6, 0xb89955f3ac075693ab26c50bb8772e, 0x001b0a ] } , - BigNum { limbs: [ 0x4facbb773e7e09b87f65f96c3ad3d8, 0x391df1f55b0d02979cb2d4cc998a57, 0x002805 ] } , - BigNum { limbs: [ 0x6df74788bfddf547809a0593c52c29, 0x6e3537a8223b30a23b5534d53e7afc, 0x004be8 ] } , - BigNum { limbs: [ 0xd0e546f44b9d2078d754457c3efb5f, 0xd4f96511eb5d8b3395e1139c918196, 0x004369 ] } , - BigNum { limbs: [ 0xecbebc0bb2bede8728abb983c104a2, 0xd259c48b91eaa8064226f6054683bc, 0x003083 ] } , - BigNum { limbs: [ 0xea24105782b04b7f3936dc7724635b, 0x34b12fcff435e4896a758b7a3407b4, 0x000164 ] } , - BigNum { limbs: [ 0xd37ff2a87babb380c6c92288db9ca6, 0x72a1f9cd89124eb06d927e27a3fd9e, 0x007289 ] } , - BigNum { limbs: [ 0x832e7d3aaf999a1c1179cca00ad0ff, 0x72d9bafd451d01694913a55df2bc6e, 0x006856 ] } , - BigNum { limbs: [ 0x3a7585c54ec264e3ee86325ff52f02, 0x34796ea0382b31d08ef46443e548e5, 0x000b97 ] } , - BigNum { limbs: [ 0x3a42eafa204ae672603ed6fc998242, 0xcf0a8c02601cb5a1bcab4261caffc9, 0x000d60 ] } , - BigNum { limbs: [ 0x83611805de11188d9fc12803667dbf, 0xd8489d9b1d2b7d981b5cc7400d058a, 0x00668c ] } , - BigNum { limbs: [ 0x52d564119aef005ef9322cf6cdde3d, 0x81b0aeee3b09dd2c54924fac5a29f4, 0x003289 ] } , - BigNum { limbs: [ 0x6ace9eee636cfea106cdd2093221c4, 0x25a27aaf423e560d8375b9f57ddb5f, 0x004164 ] } , - BigNum { limbs: [ 0x3d565b98633cd44e275792a663eedc, 0x6f68a5eae59b7e650d3e617391f7d9, 0x006e8b ] } , - BigNum { limbs: [ 0x804da7679b1f2ab1d8a86c599c1125, 0x37ea83b297acb4d4cac9a82e460d7a, 0x000562 ] } , - BigNum { limbs: [ 0x112248f15f34d66533436ad9623014, 0xdcd347682fb0f40c711506a4cdc44a, 0x001164 ] } , - BigNum { limbs: [ 0xac81ba0e9f27289accbc94269dcfed, 0xca7fe2354d973f2d66f302fd0a4109, 0x006288 ] } , - BigNum { limbs: [ 0x1311a73508c66be5689312f36abcf3, 0xb5bee2af44c7ab836980235fbd2d5f, 0x0005d5 ] } , - BigNum { limbs: [ 0xaa925bcaf595931a976cec0c95430e, 0xf19446ee388087b66e87e6421ad7f4, 0x006e17 ] } , - BigNum { limbs: [ 0x3eb832b8329919e3a13eda58db0a31, 0xb4ffd054f4599939200f5eb7e9c0e6, 0x0049fb ] } , - BigNum { limbs: [ 0x7eebd047cbc2e51c5ec124a724f5d0, 0xf253594888ee9a00b7f8aae9ee446d, 0x0029f1 ] } , - BigNum { limbs: [ 0xfa31e45936c2a5caf319587d7506f7, 0x416e56363160221a894c0a012beffe, 0x0034d3 ] } , - BigNum { limbs: [ 0xc3721ea6c79959350ce6a6828af90a, 0x65e4d3674be8111f4ebbffa0ac1554, 0x003f1a ] } , - BigNum { limbs: [ 0xf44e1f9a185814a744d29457cdb826, 0xcbf1e9231053b05d210c27af8f2fd3, 0x0010c9 ] } , - BigNum { limbs: [ 0xc955e365e603ea58bb2d6aa83247db, 0xdb61407a6cf482dcb6fbe1f248d57f, 0x006323 ] } , - BigNum { limbs: [ 0x4500302beb3b59756e185b9c1b40d8, 0xb0f92770adc552b6eb1a6b54249500, 0x0033a9 ] } , - BigNum { limbs: [ 0x78a3d2d41320a58a91e7a363e4bf29, 0xf65a022ccf82e082eced9e4db37053, 0x004043 ] } , - BigNum { limbs: [ 0x6c92f7b27e37a7103f16ad6df67bb9, 0x870878cad4e4a5157fc804f6310ab1, 0x0056a3 ] } , - BigNum { limbs: [ 0x51110b4d802457efc0e95192098448, 0x204ab0d2a8638e24584004aba6faa2, 0x001d4a ] } , - BigNum { limbs: [ 0x1637458ec6750a8191a7fdaabff692, 0x8f6f552333b5b25ea66d74943cccdc, 0x004ef6 ] } , - BigNum { limbs: [ 0xa76cbd7137e6f47e6e58015540096f, 0x17e3d47a499280db319a950d9b3877, 0x0024f7 ] } , - BigNum { limbs: [ 0x76d7d1cd4ff3465a0d33c3931997b5, 0xf86347300fe04628c2b613f30a739e, 0x000d58 ] } , - BigNum { limbs: [ 0x46cc3132ae68b8a5f2cc3b6ce6684c, 0xaeefe26d6d67ed111551f5aecd91b5, 0x006694 ] } , - BigNum { limbs: [ 0x8835476fc695fb930f39ba1eefa047, 0xc08499ab579dac5f8647bd10a76514, 0x00217b ] } , - BigNum { limbs: [ 0x356ebb9037c6036cf0c644e1105fba, 0xe6ce8ff225aa86da51c04c9130a03f, 0x005271 ] } , - BigNum { limbs: [ 0x4c0ce1f80702a84ac78a1e41bde2d7, 0xea12997cfd66c71a3d29a165c2b6ca, 0x000230 ] } , - BigNum { limbs: [ 0x71972107f75956b53875e0be421d2a, 0xbd4090207fe16c1f9ade683c154e89, 0x0071bc ] } , - BigNum { limbs: [ 0x5ad7c44d43f038084a1a22a4112bd2, 0x6450648b2a2e87de6c939571d6acfc, 0x000c1c ] } , - BigNum { limbs: [ 0x62cc3eb2ba6bc6f7b5e5dc5beed42f, 0x4302c5125319ab5b6b747430015857, 0x0067d1 ] } , - BigNum { limbs: [ 0x6fb6a479ad0676bf64bd5d39dd507f, 0xe5ca04d37de69de68a9ca30d676334, 0x000633 ] } , - BigNum { limbs: [ 0x4ded5e86515588409b42a1c622af82, 0xc18924c9ff6195534d6b669470a21f, 0x006db9 ] } , - BigNum { limbs: [ 0xc4635810e4c6eb4d6bd1e069cca493, 0x07a292323bd5d2e8cb274c64cfe48f, 0x002ae5 ] } , - BigNum { limbs: [ 0xf940aaef199513b2942e1e96335b6e, 0x9fb0976b417260510ce0bd3d0820c3, 0x004908 ] } , - BigNum { limbs: [ 0x23aa9f7b424b89f9d773a6dd31a57c, 0x60287ef28c3dae7e2106b45ddfa44e, 0x004249 ] } , - BigNum { limbs: [ 0x99f96384bc107506288c5822ce5a85, 0x472aaaaaf10a84bbb7015543f86105, 0x0031a4 ] } , - BigNum { limbs: [ 0x85943b9f8f65779cf781766c8f4147, 0x02c4a03e2fce92ee778b5ca3fb4c1f, 0x001b2f ] } , - BigNum { limbs: [ 0x380fc7606ef68763087e889370beba, 0xa48e895f4d79a04b607cacfddcb934, 0x0058be ] } , - BigNum { limbs: [ 0xb09601710d39e51469d7644aa53bd0, 0x4f177093e6741b09aae337a88fe4be, 0x004017 ] } , - BigNum { limbs: [ 0x0d0e018ef12219eb96289ab55ac431, 0x583bb90996d418302d24d1f9482095, 0x0033d6 ] } , - BigNum { limbs: [ 0x4b952110f12481f98e3c63fa2ede65, 0x9916c272df3034a6cc45edbf8d1e16, 0x00483b ] } , - BigNum { limbs: [ 0x720ee1ef0d377d0671c39b05d1219c, 0x0e3c672a9e17fe930bc21be24ae73d, 0x002bb2 ] } , - BigNum { limbs: [ 0x2e1085a75f37e69c04e98949156ce6, 0x8b31afb3c2e037a317f15f37df06d8, 0x0062fa ] } , - BigNum { limbs: [ 0x8f937d589f241863fb1675b6ea931b, 0x1c2179e9ba67fb96c016aa69f8fe7b, 0x0010f3 ] } , - BigNum { limbs: [ 0x66c3f5a0e05b76d6fddacf37a23a65, 0x68c30ab81e098624b9ed69a3313373, 0x005316 ] } , - BigNum { limbs: [ 0x56e00d5f1e00882902252fc85dc59c, 0x3e901ee55f3ead151e1a9ffea6d1e0, 0x0020d7 ] } , - BigNum { limbs: [ 0x01804dbba870bbae53d143440a70f2, 0x16fc2e317371ac14a94fc40ad271c7, 0x005c88 ] } , - BigNum { limbs: [ 0xbc23b54455eb4351ac2ebbbbf58f0f, 0x9056fb6c09d687252eb8459705938c, 0x001765 ] } , - BigNum { limbs: [ 0x29dd5298a9bad6200efa9202a1379c, 0xb00533bd66708dfa6cff8142851dcf, 0x0015c2 ] } , - BigNum { limbs: [ 0x93c6b06754a128dff1056cfd5ec865, 0xf74df5e016d7a53f6b08885f52e784, 0x005e2a ] } , - BigNum { limbs: [ 0x7bd10c3805b2c5a8e85718ebdc3fa6, 0x6a52d5f60ae45016df9c12d0fbcc2f, 0x002b3f ] } , - BigNum { limbs: [ 0x41d2f6c7f8a9395717a8e61423c05b, 0x3d0053a77263e322f86bf6d0dc3924, 0x0048ae ] } , - BigNum { limbs: [ 0x4d05533f920c0d6527f5b384be953c, 0x7dc43d7b104d492273078d50dd212e, 0x0041f1 ] } , - BigNum { limbs: [ 0x709eafc06c4ff19ad80a4b7b416ac5, 0x298eec226cfaea1765007c50fae425, 0x0031fc ] } , - BigNum { limbs: [ 0x549a66d486356d7ddebe37986d5dfe, 0x9b7449bcaba834265cbbada025d639, 0x003c64 ] } , - BigNum { limbs: [ 0x69099c2b782691822141c76792a203, 0x0bdedfe0d19fff137b4c5c01b22f1a, 0x003789 ] } , - BigNum { limbs: [ 0xb3f0d905e8e3ffaab366d69df72013, 0x3fdc3813ec383f93d176bd69b38a2e, 0x00196e ] } , - BigNum { limbs: [ 0x09b329fa1577ff554c99286208dfee, 0x6776f189910ff3a606914c38247b25, 0x005a7f ] } , - BigNum { limbs: [ 0x98f7335896a32fc2d353716fa6d165, 0xf6933307848d19b0edbf3386cd297c, 0x0045e0 ] } , - BigNum { limbs: [ 0x24accfa767b8cf3d2cac8d90592e9c, 0xb0bff695f8bb1988ea48d61b0adbd7, 0x002e0c ] } , - BigNum { limbs: [ 0xa1293eeeb767643e7069d2d06a75be, 0x76d3772b2f16c83e19ebe8e2be6eec, 0x000e14 ] } , - BigNum { limbs: [ 0x1c7ac41146f49ac18f962c2f958a43, 0x307fb2724e316afbbe1c20bf199667, 0x0065d9 ] } , - BigNum { limbs: [ 0xf045901941ab9c683870ca7608f917, 0x887d1a94af41885e2689177c805052, 0x00197e ] } , - BigNum { limbs: [ 0xcd5e72e6bcb06297c78f3489f706ea, 0x1ed60f08ce06aadbb17ef22557b500, 0x005a6f ] } , - BigNum { limbs: [ 0xd6ec5f40117d9bbdbb2badb386ed54, 0x9a9b4159737169c92da1e38aef4d0b, 0x003bf8 ] } , - BigNum { limbs: [ 0xe6b7a3bfecde634244d4514c7912ad, 0x0cb7e84409d6c970aa662616e8b847, 0x0037f5 ] } , - BigNum { limbs: [ 0x9d08e6e47b90b583b835f626d2c7ac, 0x4ef52d61cacc3e4d4311785303c13e, 0x006459 ] } , - BigNum { limbs: [ 0x209b1c1b82cb497c47ca08d92d3855, 0x585dfc3bb27bf4ec94f6914ed44415, 0x000f94 ] } , - BigNum { limbs: [ 0xb16ca10e7b13cb91bd06a5f7e5320a, 0xdf6c57efd496f1fde065b5338cdb27, 0x004dfc ] } , - BigNum { limbs: [ 0x0c3761f18348336e42f959081acdf7, 0xc7e6d1ada8b1413bf7a2546e4b2a2c, 0x0025f0 ] } , - BigNum { limbs: [ 0x009ff716f23cf57420570de9b9402b, 0x637eb9d26164bff0f8f45c95ada9fe, 0x006304 ] } , - BigNum { limbs: [ 0xbd040be90c1f098bdfa8f11646bfd6, 0x43d46fcb1be37348df13ad0c2a5b55, 0x0010e9 ] } , - BigNum { limbs: [ 0xa0095b88847cc8cdeaf9a4b193d544, 0xe0b2d25c204333e6b4cc30a5faffcd, 0x002448 ] } , - BigNum { limbs: [ 0x1d9aa77779df363215065a4e6c2abd, 0xc6a057415d04ff53233bd8fbdd0586, 0x004fa4 ] } , - BigNum { limbs: [ 0x20f0e3f46c5b4e9b753e749f384be8, 0xb9954ec4b35a966daf4d7cc0a90a41, 0x005601 ] } , - BigNum { limbs: [ 0x9cb31f0b9200b0648ac18a60c7b419, 0xedbddad8c9ed9ccc28ba8ce12efb12, 0x001deb ] } , - BigNum { limbs: [ 0x8f32c4023955e5d3c02daef28b1297, 0xb189df0c4773bfac54740c82767584, 0x0019ae ] } , - BigNum { limbs: [ 0x2e713efdc506192c3fd2500d74ed6a, 0xf5c94a9135d4738d8393fd1f618fcf, 0x005a3e ] } , - BigNum { limbs: [ 0xbc04ddde4fbaed9c024eca8192c366, 0x03dfa83d15f94c61ac68816c8ce1fa, 0x005dfd ] } , - BigNum { limbs: [ 0x019f2521aea11163fdb1347e6d3c9b, 0xa3738160674ee6d82b9f88354b2359, 0x0015f0 ] } , - BigNum { limbs: [ 0x2aa65962a6c6c509f3e270cdac6114, 0x8ee3323292b85d181069983b204164, 0x003099 ] } , - BigNum { limbs: [ 0x92fda99d579539f60c1d8e32539eed, 0x186ff76aea8fd621c79e7166b7c3ef, 0x004354 ] } , - BigNum { limbs: [ 0x767f066e1d355ec70777b85d85bd10, 0x3f7b000013450d00659ec6d69651a8, 0x000aea ] } , - BigNum { limbs: [ 0x4724fc91e126a038f88846a27a42f1, 0x67d8299d6a032639726942cb41b3ab, 0x006903 ] } , - BigNum { limbs: [ 0x86f14710a0c60382b81b694a693618, 0x284df013918967c1a3064fb5c83c31, 0x00003b ] } , - BigNum { limbs: [ 0x36b2bbef5d95fb7d47e495b596c9e9, 0x7f053989ebbecb783501b9ec0fc922, 0x0073b2 ] } , - BigNum { limbs: [ 0x0b675ac26be5dd2ceff4b9eabb114f, 0xfc46367bc78fb7bdf71eb7ceba6d44, 0x007201 ] } , - BigNum { limbs: [ 0xb23ca83d927621d3100b451544eeb2, 0xab0cf321b5b87b7be0e951d31d980f, 0x0001eb ] } , - BigNum { limbs: [ 0x67d3fdfe1c34267fb409d92c672ebc, 0x751bf9d74c1920ef0be8c74d59ab69, 0x0023bb ] } , - BigNum { limbs: [ 0x55d00501e227d8804bf625d398d145, 0x32372fc6312f124acc1f42547e59ea, 0x005032 ] } , - BigNum { limbs: [ 0xa605cdd0280abe54167aab921ad75d, 0xd895e17b6d6153c155126ee82c3fac, 0x006e55 ] } , - BigNum { limbs: [ 0x179e352fd65140abe985536de528a4, 0xcebd48220fe6df7882f59ab9abc5a7, 0x000597 ] } , - BigNum { limbs: [ 0x593b4103f282733c09174c741c249e, 0x285f75480e515cc0293d3840fbdfdd, 0x0042ae ] } , - BigNum { limbs: [ 0x6468c1fc0bd98bc3f6e8b28be3db63, 0x7ef3b4556ef6d679aecad160dc2576, 0x00313f ] } , - BigNum { limbs: [ 0xaa5cf3e54a81e00a29e1b9f41875b0, 0x78373cc7b11efee96d855eda51bd9a, 0x0067e8 ] } , - BigNum { limbs: [ 0x13470f1ab3da1ef5d61e450be78a51, 0x2f1becd5cc2934506a82aac78647b9, 0x000c05 ] } , - BigNum { limbs: [ 0x5787a85a8ad80764ed38f466cc646d, 0x6075a276af447af87c7fbed30d110f, 0x0060d4 ] } , - BigNum { limbs: [ 0x661c5aa57383f79b12c70a99339b94, 0x46dd8726ce03b8415b884acecaf444, 0x001319 ] } , - BigNum { limbs: [ 0xef446a7a4b64b94059994992a5cee7, 0x80eb170f331c6afe2e7ca14a847e3c, 0x00697c ] } , - BigNum { limbs: [ 0xce5f9885b2f745bfa666b56d5a311a, 0x2668128e4a2bc83ba98b6857538716, 0x000a71 ] } , - BigNum { limbs: [ 0x52b6e8a9b24796cd2ca9f1a41e8209, 0x547cdc0221188abc7520e483386e2c, 0x000885 ] } , - BigNum { limbs: [ 0x6aed1a564c146832d3560d5be17df8, 0x52d64d9b5c2fa87d62e7251e9f9727, 0x006b68 ] } , - BigNum { limbs: [ 0xe591fc7535689984ba1cc31d9ad221, 0x76b998e5eed9197ba9335eb992b5c0, 0x0032d2 ] } , - BigNum { limbs: [ 0xd812068ac8f3657b45e33be2652de0, 0x309990b78e6f19be2ed4aae8454f92, 0x00411b ] } , - BigNum { limbs: [ 0x0052bcded554f9cc3ce48d77cd0a19, 0x8e10bb99cce6ac57f9a7bad1d03ba3, 0x000aea ] } , - BigNum { limbs: [ 0xbd51462129070533c31b718832f5e8, 0x19426e03b06186e1de604ed007c9b0, 0x006903 ] } , - BigNum { limbs: [ 0x67cb8c716dcc05da02d26634924413, 0x19a261479e8aafcf2501dc022e2c7a, 0x001f73 ] } , - BigNum { limbs: [ 0x55d8768e908ff925fd2d98cb6dbbee, 0x8db0c855debd836ab3062d9fa9d8d9, 0x00547a ] } , - BigNum { limbs: [ 0x2f985dd811b7e7c9aeb6fca0fea2e3, 0xe43dfba63e2390136ea68b2ce6aa72, 0x0002f0 ] } , - BigNum { limbs: [ 0x8e0ba527eca417365149025f015d1e, 0xc3152df73f24a32669617e74f15ae1, 0x0070fc ] } , - BigNum { limbs: [ 0x3b2e3f6b50892051ac5f1c8a02f30d, 0x2c283e4b4c4e07207d0c1f8045483a, 0x0003be ] } , - BigNum { limbs: [ 0x8275c394add2deae53a0e275fd0cf4, 0x7b2aeb5230fa2c195afbea2192bd19, 0x00702f ] } , - BigNum { limbs: [ 0x09e0312ae609bb688ab9d204ea6d73, 0x4c4f3b12df3c0f2f6c60b76602ec13, 0x006d5e ] } , - BigNum { limbs: [ 0xb3c3d1d51852439775462cfb15928e, 0x5b03ee8a9e0c240a6ba7523bd51940, 0x00068f ] } , - BigNum { limbs: [ 0x9244f54f20cc9cbd740c2e9acdcbcb, 0x75bdd01354702a0e067d8abf8ae3f2, 0x00720a ] } , - BigNum { limbs: [ 0x2b5f0db0dd8f62428bf3d065323436, 0x3195598a28d8092bd18a7ee24d2161, 0x0001e3 ] } , - BigNum { limbs: [ 0x1fab93d7e50a8d0e01cbebed0676dd, 0x5267be66b7fc9d37298da89f9d1dc2, 0x00423a ] } , - BigNum { limbs: [ 0x9df86f28195171f1fe341312f98924, 0x54eb6b36c54b9602ae7a61023ae791, 0x0031b3 ] } , - BigNum { limbs: [ 0x8ac2b45a37fc267d0f921f1a8048b8, 0x02cde70a7c09c8056cbdbe9feff479, 0x006353 ] } , - BigNum { limbs: [ 0x32e14ea5c65fd882f06ddfe57fb749, 0xa4854293013e6b346b4a4b01e810da, 0x00109a ] } , - BigNum { limbs: [ 0x7b679152d34e04a8dece301c9ff807, 0x739967be2d4b18284c0c266605b3b3, 0x005f86 ] } , - BigNum { limbs: [ 0x423c71ad2b0dfa572131cee36007fa, 0x33b9c1df4ffd1b118bfbe33bd251a0, 0x001467 ] } , - BigNum { limbs: [ 0x7a91559929a415f2d4925d85547e3e, 0xc278c591c29bb03d265627490d0d5c, 0x005262 ] } , - BigNum { limbs: [ 0x4312ad66d4b7e90d2b6da17aab81c3, 0xe4da640bbaac82fcb1b1e258caf7f7, 0x00218a ] } , - BigNum { limbs: [ 0x4267fbbcd21046b9288ae7a647dda9, 0xea9abd37b3a89c041a1c143f4f6ca7, 0x000eb2 ] } , - BigNum { limbs: [ 0x7b3c07432c4bb846d7751759b82258, 0xbcb86c65c99f9735bdebf5628898ac, 0x00653a ] } , - BigNum { limbs: [ 0x20bc406852ceaa249ea48ce197772c, 0x1eb3c42887f49092fdf3e5a73d7adb, 0x0050da ] } , - BigNum { limbs: [ 0x9ce7c297ab8d54db615b721e6888d5, 0x889f6574f553a2a6da1423fa9a8a78, 0x002313 ] } , - BigNum { limbs: [ 0x4a4f9418f5280f001cf10956ad7124, 0x98fa42d6ae453480c62bcbf49dc9a6, 0x001f31 ] } , - BigNum { limbs: [ 0x73546ee70933efffe30ef5a9528edd, 0x0e58e6c6cf02feb911dc3dad3a3bad, 0x0054bc ] } , - BigNum { limbs: [ 0x722fcbce277d953506a9d8a8c47b63, 0x2c047d09e6aa43c84005f04d88b57b, 0x005c09 ] } , - BigNum { limbs: [ 0x4b743731d6de69caf95626573b849e, 0x7b4eac93969def71980219544f4fd8, 0x0017e4 ] } , - BigNum { limbs: [ 0x4723717d44293e6a2bb8f8519763f5, 0xfd5ebeb588acb2f81d2e3763f0f360, 0x000318 ] } , - BigNum { limbs: [ 0x76809182ba32c095d44706ae689c0c, 0xa9f46ae7f49b8041bad9d23de711f3, 0x0070d4 ] } , - BigNum { limbs: [ 0x7a92ede4bc691a574e7721e595b40b, 0x4055fb331b2c90bc912322b62d5a2b, 0x004acd ] } , - BigNum { limbs: [ 0x4311151b41f2e4a8b188dd1a6a4bf6, 0x66fd2e6a621ba27d46e4e6ebaaab28, 0x002920 ] } , - BigNum { limbs: [ 0x60f1c20ba5bbbde506c821877b4a44, 0x4b1a025a917ca45fc8f6440fcd4dbf, 0x0027a7 ] } , - BigNum { limbs: [ 0x5cb240f458a0411af937dd7884b5bd, 0x5c392742ebcb8eda0f11c5920ab794, 0x004c46 ] } , - BigNum { limbs: [ 0x527d43c5a2bf113b218a0665fef46a, 0x2fcc0761b44bd8e6e524766255c80c, 0x000992 ] } , - BigNum { limbs: [ 0x6b26bf3a5b9cedc4de75f89a010b97, 0x7787223bc8fc5a52f2e3933f823d47, 0x006a5b ] } , - BigNum { limbs: [ 0x2d3653abd830a4926ec374de29e5ed, 0xaa325b5df1ea463718e7ac80d41a92, 0x000f7e ] } , - BigNum { limbs: [ 0x906daf54262b5a6d913c8a21d61a14, 0xfd20ce3f8b5ded02bf205d2103eac1, 0x00646e ] } , - BigNum { limbs: [ 0xe9a9fb96fdb98ee23d1730e5fffe1c, 0x1d4d0d487864269d6a93bcba686fe2, 0x00283f ] } , - BigNum { limbs: [ 0xd3fa076900a2701dc2e8ce1a0001e5, 0x8a061c5504e40c9c6d744ce76f9570, 0x004bae ] } , - BigNum { limbs: [ 0x398407bd5546c18e0f535efdd37921, 0x9c08f875051d85ae6219511b7f5180, 0x0048ce ] } , - BigNum { limbs: [ 0x841ffb42a9153d71f0aca0022c86e0, 0x0b4a3128782aad8b75eeb88658b3d3, 0x002b1f ] } , - BigNum { limbs: [ 0x8b14f126306387c6b17c9b5398b4d8, 0xa8b31a1058889b674d9b3f91856732, 0x0028cb ] } , - BigNum { limbs: [ 0x328f11d9cdf877394e8363ac674b29, 0xfea00f8d24bf97d28a6cca10529e21, 0x004b21 ] } , - BigNum { limbs: [ 0x6a485f6f1c316bb0d7782485b9ec55, 0x92e36171362ad33332e15bb2e1f042, 0x0016c1 ] } , - BigNum { limbs: [ 0x535ba390e22a934f2887da7a4613ac, 0x146fc82c471d6006a526adeef61511, 0x005d2c ] } , - BigNum { limbs: [ 0xd771fe6079f7bc937464d307ea552a, 0x5e86314b2b4b9eec67b5a1f2e78bbd, 0x004408 ] } , - BigNum { limbs: [ 0xe632049f8464426c8b9b2bf815aad7, 0x48ccf85251fc944d705267aef07995, 0x002fe5 ] } , - BigNum { limbs: [ 0xd9ae7f680402348117368aa68f76cb, 0x5d9ed8a59c481379f60b7c17caa56b, 0x000159 ] } , - BigNum { limbs: [ 0xe3f58397fa59ca7ee8c97459708936, 0x49b450f7e1001fbfe1fc8d8a0d5fe7, 0x007294 ] } , - BigNum { limbs: [ 0x1fc0dadceaca88a43b0ab71e8051fd, 0x2c6f4e1721a0c1ec0b79d76cd0ce91, 0x00465a ] } , - BigNum { limbs: [ 0x9de328231391765bc4f547e17fae04, 0x7ae3db865ba7714dcc8e32350736c2, 0x002d93 ] } , - BigNum { limbs: [ 0x23ba80b7dfaa7739c75477b3eb93f7, 0x225308144ddd224619711fcd716cc1, 0x0058e9 ] } , - BigNum { limbs: [ 0x99e982481eb187c638ab874c146c0a, 0x850021892f6b10f3be96e9d4669892, 0x001b04 ] } , - BigNum { limbs: [ 0x9b0d7ad7c93190c0b40ad9ab2c7192, 0xb58b822bef231d3217a49c28472ec4, 0x004dc2 ] } , - BigNum { limbs: [ 0x22968828352a6e3f4bf52554d38e6f, 0xf1c7a7718e251607c0636d7990d68f, 0x00262a ] } , - BigNum { limbs: [ 0xa3cf505b7b89033dc3911653a5b552, 0xdda82e3cc08d71de413766ac84106f, 0x004657 ] } , - BigNum { limbs: [ 0x19d4b2a482d2fbc23c6ee8ac5a4aaf, 0xc9aafb60bcbac15b96d0a2f553f4e4, 0x002d95 ] } , - BigNum { limbs: [ 0x22dc9449aaa3f782a014c7fa762234, 0x8a68cb6fdf57bff88ef4995a268ce5, 0x003861 ] } , - BigNum { limbs: [ 0x9ac76eb653b8077d5feb370589ddcd, 0x1cea5e2d9df0734149137047b1786e, 0x003b8c ] } , - BigNum { limbs: [ 0x4efa67116b946b4ded911c1aa2a486, 0x542e25e42c80e69c1e6e52260eaa40, 0x0004f0 ] } , - BigNum { limbs: [ 0x6ea99bee92c793b2126ee2e55d5b7b, 0x532503b950c74c9db999b77bc95b13, 0x006efd ] } , - BigNum { limbs: [ 0x72e6c2a22806353545a890ce83ae41, 0x4bd3e1c5996a532e8fecb6067f5020, 0x00058e ] } , - BigNum { limbs: [ 0x4abd405dd655c9caba576e317c51c0, 0x5b7f47d7e3dde00b481b539b58b533, 0x006e5f ] } , - BigNum { limbs: [ 0x9a84e938dfd48b259bac3a06a946e5, 0xa5b83bd25df17e11842dd229db3ce1, 0x00653e ] } , - BigNum { limbs: [ 0x231f19c71e8773da6453c4f956b91c, 0x019aedcb1f56b52853da3777fcc872, 0x000eaf ] } , - BigNum { limbs: [ 0xa43d7891a7839805bb4d2fa15631c3, 0x6d07b0f220c699dfe4462dd3b328a1, 0x001d73 ] } , - BigNum { limbs: [ 0x19668a6e56d866fa44b2cf5ea9ce3e, 0x3a4b78ab5c819959f3c1dbce24dcb2, 0x00567a ] } , - BigNum { limbs: [ 0x2de01648b1388e7e75e6a3bfcf47d4, 0xccf2a9c7259646744e0974c8d57207, 0x00475e ] } , - BigNum { limbs: [ 0x8fc3ecb74d2370818a195b4030b82d, 0xda607fd657b1ecc589fe94d902934c, 0x002c8e ] } , - BigNum { limbs: [ 0x381d54e0a6107a38f6083124b65103, 0x0a29b1700d25aaeb125f3c7b6e0d87, 0x0059f3 ] } , - BigNum { limbs: [ 0x8586ae1f584b84c709f7cddb49aefe, 0x9d29782d7022884ec5a8cd2669f7cc, 0x0019fa ] } , - BigNum { limbs: [ 0x264ee58149e2cd96fcf6d28b2e4c9e, 0xe6735a8ecec17085e99f8186a6d36b, 0x0028de ] } , - BigNum { limbs: [ 0x97551d7eb479316903092c74d1b363, 0xc0dfcf0eae86c2b3ee68881b3131e8, 0x004b0e ] } , - BigNum { limbs: [ 0x2e2b00af9bd8d14d1eb0088e369937, 0x6d79b2f7b0d3cb23d8dbabaf79b908, 0x0023e1 ] } , - BigNum { limbs: [ 0x8f79025062832db2e14ff671c966ca, 0x39d976a5cc746815ff2c5df25e4c4b, 0x00500c ] } , - BigNum { limbs: [ 0x208d2848d1ed566cafe0e55d5164c1, 0x14cd34e701a7c1ea26b9d3b0c16d25, 0x003779 ] } , - BigNum { limbs: [ 0x9d16dab72c6ea893501f19a2ae9b40, 0x9285f4b67ba0714fb14e35f116982e, 0x003c74 ] } , - BigNum { limbs: [ 0x86397c3abea15e184f07b20e96c595, 0xd3805f8e5143e31ad883ea37080113, 0x0014c7 ] } , - BigNum { limbs: [ 0x376a86c53fbaa0e7b0f84cf1693a6c, 0xd3d2ca0f2c04501eff841f6ad00440, 0x005f25 ] } , - BigNum { limbs: [ 0xeddcc14773ee6ecae1858cee84b9a1, 0xe858c609420b9383b44a8c12917d2b, 0x00508e ] } , - BigNum { limbs: [ 0xcfc741b88a6d90351e7a72117b4660, 0xbefa63943b3c9fb623bd7d8f468827, 0x00235e ] } , - BigNum { limbs: [ 0x49cd172c0b8bb0427e7385164be73e, 0xfeb5c085ae12c384b091e423900e96, 0x000650 ] } , - BigNum { limbs: [ 0x73d6ebd3f2d04ebd818c79e9b418c3, 0xa89d6917cf356fb52776257e47f6bd, 0x006d9c ] } , - BigNum { limbs: [ 0xf1b6dc5efcd28ca79a0b62517b3e11, 0x55a7369e62cd7124df59020f561c90, 0x005764 ] } , - BigNum { limbs: [ 0xcbed26a10189725865f49cae84c1f0, 0x51abf2ff1a7ac214f8af079281e8c2, 0x001c89 ] } , - BigNum { limbs: [ 0x6179dde81432c6f287b27bacd2a75d, 0xc19566aa0658f37a288b16353f1317, 0x004921 ] } , - BigNum { limbs: [ 0x5c2a2517ea29380d784d83532d58a4, 0xe5bdc2f376ef3fbfaf7cf36c98f23c, 0x002acb ] } , - BigNum { limbs: [ 0xb16a986057dd5881d59fbafcf8978a, 0xfe19cce4a8d1388647e315378ea37a, 0x0040b8 ] } , - BigNum { limbs: [ 0x0c396a9fa67ea67e2a604403076877, 0xa9395cb8d476fab39024f46a4961d9, 0x003334 ] } , - BigNum { limbs: [ 0x580822447fe3e06954ee3cf1a52eb0, 0xe7b4e38ad5a7e7b49a5954396d8634, 0x0014de ] } , - BigNum { limbs: [ 0x659be0bb7e781e96ab11c20e5ad151, 0xbf9e4612a7a04b853daeb5686a7f1f, 0x005f0e ] } , - BigNum { limbs: [ 0x88f4ee49e051408b5e098d73ecfb8a, 0x2cc75f7858d547d28deda799472dae, 0x00309b ] } , - BigNum { limbs: [ 0x34af14b61e0abe74a1f6718c130477, 0x7a8bca252472eb674a1a620890d7a5, 0x004352 ] } , - BigNum { limbs: [ 0x2536b36b780756223302d56e34e33a, 0x54b60c26a4ef66ce37ae9af3b0406f, 0x0038d5 ] } , - BigNum { limbs: [ 0x986d4f948654a8ddccfd2991cb1cc7, 0x529d1d76d858cc6ba0596eae27c4e4, 0x003b18 ] } , - BigNum { limbs: [ 0x1ffbf5380ebcefdff4a889348380cd, 0xf9b2dc3f08c6a0d72e9aff4c8e4f62, 0x006d73 ] } , - BigNum { limbs: [ 0x9da80dc7ef9f0f200b5775cb7c7f34, 0xada04d5e74819262a96d0a5549b5f1, 0x000679 ] } , - BigNum { limbs: [ 0x3d2d62bfbb6194b51dc2b6788cd33a, 0x226341f45ef3712e3143faa55798ce, 0x0020c6 ] } , - BigNum { limbs: [ 0x8076a04042fa6a4ae23d4887732cc7, 0x84efe7a91e54c20ba6c40efc806c85, 0x005327 ] } , - BigNum { limbs: [ 0x1070753693080e926426c25106abcc, 0x6081be8f8fffb8c2b296202481ff69, 0x002929 ] } , - BigNum { limbs: [ 0xad338dc96b53f06d9bd93caef95435, 0x46d16b0ded487a772571e97d5605ea, 0x004ac4 ] } , - BigNum { limbs: [ 0x5996156b5c46bfb0c30e46d27870d1, 0x4546d9820fecfe87d9c59e016e16e4, 0x006ae9 ] } , - BigNum { limbs: [ 0x640ded94a2153f4f3cf1b82d878f30, 0x620c501b6d5b34b1fe426ba069ee6f, 0x000904 ] } , - BigNum { limbs: [ 0x7dd77341301c0b97cd3f1830dc7c31, 0xf165ed312bdf5b942297f627abb6c4, 0x004349 ] } , - BigNum { limbs: [ 0x3fcc8fbece3ff36832c0e6cf2383d0, 0xb5ed3c6c5168d7a5b570137a2c4e8f, 0x0030a3 ] } , - BigNum { limbs: [ 0x2898797e96266fef5d157126acd2f6, 0x67acf67fbc21c982897daa0e02a779, 0x00304c ] } , - BigNum { limbs: [ 0x950b898168358f10a2ea8dd9532d0b, 0x3fa6331dc12669b74e8a5f93d55dda, 0x0043a1 ] } , - BigNum { limbs: [ 0x35c67c83d6151f33c480ccbeff31f6, 0xc9bfe369ff49247267f1dfa06d9193, 0x006ab8 ] } , - BigNum { limbs: [ 0x87dd867c2846dfcc3b7f324100ce0b, 0xdd9346337dff0ec770162a016a73c0, 0x000934 ] } , - BigNum { limbs: [ 0xd30f7ac72ab6608eb01a055ce60f76, 0xcd993fe17302769595e1fc927b3dd1, 0x0059ed ] } , - BigNum { limbs: [ 0xea948838d3a59e714fe5f9a319f08b, 0xd9b9e9bc0a45bca442260d0f5cc781, 0x0019ff ] } , - BigNum { limbs: [ 0x7ab95fc3dcb53b0717aa4735b71dde, 0x7ccaf19aadbad4bf2a46e92bbce3fc, 0x005fbd ] } , - BigNum { limbs: [ 0x42eaa33c21a6c3f8e855b7ca48e223, 0x2a883802cf8d5e7aadc120761b2157, 0x001430 ] } , - BigNum { limbs: [ 0xd37d1f179c72580fcdfa1a7fe0f991, 0x5537e61ce0d8f1faceee055ed9ca48, 0x001c0b ] } , - BigNum { limbs: [ 0xea26e3e861e9a6f03205e4801f0670, 0x521b43809c6f413f091a0442fe3b0a, 0x0057e2 ] } , - BigNum { limbs: [ 0x351938a0d16a75c81463f659452f5c, 0xf3ea67e03e845995718a4b0a20bee8, 0x0007c8 ] } , - BigNum { limbs: [ 0x888aca5f2cf18937eb9c08a6bad0a5, 0xb368c1bd3ec3d9a4667dbe97b7466b, 0x006c24 ] } , - BigNum { limbs: [ 0xf35dcbc7525e321519080c36809225, 0x6faa6bed367eb2431601f560a55dfb, 0x002023 ] } , - BigNum { limbs: [ 0xca463738abfdcceae6f7f2c97f6ddc, 0x37a8bdb046c980f6c206144132a757, 0x0053ca ] } , - BigNum { limbs: [ 0x89c1ba44e2270b2c2515a84580e958, 0xb6d19d3684162ca6cff740b60035e4, 0x004796 ] } , - BigNum { limbs: [ 0x33e248bb1c34f3d3daea56ba7f16a9, 0xf0818c66f93206930810c8ebd7cf6f, 0x002c56 ] } , - BigNum { limbs: [ 0xc36fd3d1a988a3c1050fc0e0b3dc5c, 0x5881b8de5b8d70b35d2e4c3f90b58e, 0x00317f ] } , - BigNum { limbs: [ 0xfa342f2e54d35b3efaf03e1f4c23a5, 0x4ed170bf21bac2867ad9bd62474fc4, 0x00426e ] } , - BigNum { limbs: [ 0xcf2f9e33d7c852380d4f370682feaa, 0xd9fe3b29dc1ad914a1bc5e386a2e4b, 0x002efa ] } , - BigNum { limbs: [ 0xee7464cc2693acc7f2b0c7f97d0157, 0xcd54ee73a12d5a25364bab696dd707, 0x0044f2 ] } , - BigNum { limbs: [ 0xb3e8c88110c74911e34917d47d3930, 0x7a598943e6f23f9c04af617e5510ed, 0x0049b2 ] } , - BigNum { limbs: [ 0x09bb3a7eed94b5ee1cb6e72b82c6d1, 0x2cf9a0599655f39dd358a82382f466, 0x002a3b ] } , - BigNum { limbs: [ 0xded28970fe3f7b67b451d3561a8915, 0x5064eeaad10f68b41a63a294abe24b, 0x006a78 ] } , - BigNum { limbs: [ 0xded1798f001c83984bae2ba9e576ec, 0x56ee3af2ac38ca85bda4670d2c2307, 0x000975 ] } , - BigNum { limbs: [ 0x6fdca641f466fd5f4db13b235e0d33, 0x76407d0d4f344503648ad13821a34f, 0x004207 ] } , - BigNum { limbs: [ 0x4dc75cbe09f501a0b24ec3dca1f2ce, 0x3112ac902e13ee36737d3869b66204, 0x0031e6 ] } , - BigNum { limbs: [ 0xa83925afe43f95c84ee1ce740f5439, 0x7115804a277b3b1dee30543009ffa2, 0x0035c4 ] } , - BigNum { limbs: [ 0x156add501a1c6937b11e308bf0abc8, 0x363da95355ccf81be9d7b571ce05b1, 0x003e29 ] } , - BigNum { limbs: [ 0x08977f02defff1329232e07592d6c9, 0x42d5895e520b5e11815cb0df88d45d, 0x004e40 ] } , - BigNum { limbs: [ 0xb50c83fd1f5c0dcd6dcd1e8a6d2938, 0x647da03f2b3cd52856ab58c24f30f6, 0x0025ad ] } , - BigNum { limbs: [ 0x166f8907aa9a1372eb4b1113ad8991, 0x3984fb3eb6e52894b5c6bd1d6a61d9, 0x005f9d ] } , - BigNum { limbs: [ 0xa73479f853c1eb8d14b4edec527670, 0x6dce2e5ec6630aa522414c846da37a, 0x001450 ] } , - BigNum { limbs: [ 0xec4673f68766a0f90711a0688869b4, 0x1168d4ece0379aba89db27ea447c91, 0x0032b0 ] } , - BigNum { limbs: [ 0xd15d8f0976f55e06f8ee5e9777964d, 0x95ea54b09d10987f4e2ce1b79388c1, 0x00413d ] } , - BigNum { limbs: [ 0x06f42869c68f47775c2b41e719925b, 0x55d1101d10655a75faeb3de022db67, 0x001e6c ] } , - BigNum { limbs: [ 0xb6afda9637ccb788a3d4bd18e66da6, 0x518219806ce2d8c3dd1ccbc1b529ec, 0x005581 ] } , - BigNum { limbs: [ 0x2488de55d880f0bf79e47c93531782, 0x486b8cf439dcc719e80ced806894ad, 0x0002a4 ] } , - BigNum { limbs: [ 0x991b24aa25db0e40861b826cace87f, 0x5ee79ca9436b6c1feffb1c216f70a6, 0x007149 ] } , - BigNum { limbs: [ 0xc21324ae9c8854f1b061a497ab7c95, 0x30227edece212b662b588e2fa371d7, 0x006f9a ] } , - BigNum { limbs: [ 0xfb90de5161d3aa0e4f9e5a6854836c, 0x7730aabeaf2707d3acaf7b7234937b, 0x000453 ] } , - BigNum { limbs: [ 0x6c572e1fbbe93ef71d04ee71ed1dd7, 0x26719610acab98fef2c58c13bf39ff, 0x006407 ] } , - BigNum { limbs: [ 0x514cd4e04272c008e2fb108e12e22a, 0x80e1938cd09c9a3ae5427d8e18cb54, 0x000fe6 ] } , - BigNum { limbs: [ 0x1041c70cbe30298569cb4ca9c83deb, 0x62b6bf35c35a9fa1c4913fd4c3f13b, 0x003b84 ] } , - BigNum { limbs: [ 0xad623bf3402bd57a9634b25637c216, 0x449c6a67b9ed93981376c9cd141418, 0x003869 ] } , - BigNum { limbs: [ 0xfac45adceaaeb5c5c1e5845d9ff884, 0xea707f87574f8683a888f21e5ddfdb, 0x0057c7 ] } , - BigNum { limbs: [ 0xc2dfa82313ad493a3e1a7aa260077d, 0xbce2aa1625f8acb62f7f17837a2577, 0x001c25 ] } , - BigNum { limbs: [ 0x9fef9dfe936f0e61908bf6b3717a5b, 0xb375cdaee22376104c3c6e5bd5ab3b, 0x00072e ] } , - BigNum { limbs: [ 0x1db465016aecf09e6f74084c8e85a6, 0xf3dd5bee9b24bd298bcb9b46025a18, 0x006cbe ] } , - BigNum { limbs: [ 0xb5e9c0a4e50cc317973cd4a46b0b1c, 0x8043147cb895521ca47450d1ce5b27, 0x006533 ] } , - BigNum { limbs: [ 0x07ba425b194f3be868c32a5b94f4e5, 0x27101520c4b2e11d3393b8d009aa2c, 0x000eba ] } , - BigNum { limbs: [ 0xd7b547d39c9c379277871836d3e69d, 0x68af303179073aad02c9bcb3aa9bc5, 0x002371 ] } , - BigNum { limbs: [ 0xe5eebb2c61bfc76d8878e6c92c1964, 0x3ea3f96c0440f88cd53e4cee2d698d, 0x00507c ] } , - BigNum { limbs: [ 0xf2b4d4e4c6bf419a0de099de4a001e, 0xee242df09127ad427b37d05359f0bf, 0x0027dc ] } , - BigNum { limbs: [ 0xcaef2e1b379cbd65f21f6521b5ffe3, 0xb92efbacec2085f75cd0394e7e1493, 0x004c10 ] } , - BigNum { limbs: [ 0x63132a6fcf2710d0000452d166f4cf, 0x216fe03353ad190e8d5ae4ca948c28, 0x00311f ] } , - BigNum { limbs: [ 0x5a90d8902f34ee2ffffbac2e990b32, 0x85e3496a299b1a2b4aad24d743792b, 0x0042ce ] } , - BigNum { limbs: [ 0x07ef8748d88e55812b41fc642b8224, 0x39476f18f51e508abc80e905cbfffd, 0x00013e ] } , - BigNum { limbs: [ 0xb5b47bb725cda97ed4be029bd47ddd, 0x6e0bba848829e2af1b87209c0c0556, 0x0072af ] } , - BigNum { limbs: [ 0x91f42dbb5cc25b01dec31b0bf3d060, 0xa585369dfba981c5208f0b13ae1132, 0x005e62 ] } , - BigNum { limbs: [ 0x2bafd544a199a3fe213ce3f40c2fa1, 0x01cdf2ff819eb174b778fe8e29f421, 0x00158b ] } , - BigNum { limbs: [ 0xd5aa9c89d5f0b73bcc501a2ef94bc4, 0x7645da9c7e681bdd356e72f2ad0704, 0x00289b ] } , - BigNum { limbs: [ 0xe7f96676286b47c433afe4d106b43d, 0x310d4f00fee0175ca29996af2afe4e, 0x004b52 ] } , - BigNum { limbs: [ 0xf377b32eebd2323607f6f416ef9552, 0x34f0f60b55fda7fec39544f7105246, 0x001b7e ] } , - BigNum { limbs: [ 0xca2c4fd11289ccc9f8090ae9106aaf, 0x72623392274a8b3b1472c4aac7b30c, 0x00586f ] } , - BigNum { limbs: [ 0xdfd8c851eca70857ca96242932be18, 0x04b24592689af879551c06397f3f00, 0x003122 ] } , - BigNum { limbs: [ 0xddcb3aae11b4f6a83569dad6cd41e9, 0xa2a0e40b14ad3ac082ec036858c652, 0x0042cb ] } , - BigNum { limbs: [ 0x177017d42c09460cc72eeaa440f42c, 0x2356f048ddd06e8428699bb2b8ab25, 0x000a9a ] } , - BigNum { limbs: [ 0xa633eb2bd252b8f338d1145bbf0bd5, 0x83fc39549f77c4b5af9e6def1f5a2e, 0x006953 ] } , - BigNum { limbs: [ 0xf00cd2e494cecbdda94ada27476176, 0x3204c03686ad02c82b1432217da911, 0x002492 ] } , - BigNum { limbs: [ 0xcd97301b698d332256b524d8b89e8b, 0x754e6966f69b3071acf3d7805a5c41, 0x004f5b ] } , - BigNum { limbs: [ 0x37aa6ae97bd23480dbdcc5d5251a48, 0xcfaa561c560c1810d5f48266f68f7c, 0x002415 ] } , - BigNum { limbs: [ 0x85f998168289ca7f2423392adae5b9, 0xd7a8d381273c1b290213873ae175d7, 0x004fd7 ] } , - BigNum { limbs: [ 0x7787cf3e5d6b47a741f874994f9b60, 0xc5b136d10cc056d2e35000ae73a0e8, 0x003bf8 ] } , - BigNum { limbs: [ 0x461c33c1a0f0b758be078a66b064a1, 0xe1a1f2cc7087dc66f4b808f364646b, 0x0037f4 ] } , - BigNum { limbs: [ 0xad6fb7de7ffa41fcb01abe0c7a5ed8, 0x360968a38d8820954020e70cd9f838, 0x00729c ] } , - BigNum { limbs: [ 0x10344b217e61bd034fe540f385a129, 0x7149c0f9efc012a497e72294fe0d1b, 0x000151 ] } , - BigNum { limbs: [ 0x1391282fc53b477f3ef0dd8ef1346a, 0x7b4a7e90340b7cfa11d904bc2a55cc, 0x003b38 ] } , - BigNum { limbs: [ 0xaa12dad03920b780c10f21710ecb97, 0x2c08ab0d493cb63fc62f04e5adaf87, 0x0038b5 ] } , - BigNum { limbs: [ 0xf42ba4b4e445e5ac5acac9f2b7cfe8, 0x4453cda4aac637f2ace42e0ce3d7c4, 0x0031e2 ] } , - BigNum { limbs: [ 0xc9785e4b1a161953a535350d483019, 0x62ff5bf8d281fb472b23db94f42d8e, 0x00420b ] } , - BigNum { limbs: [ 0xc4883a0144aaec7f70afa2ba34fea5, 0x15d5640ee38825d87fc45df9199d6c, 0x00634f ] } , - BigNum { limbs: [ 0xf91bc8feb9b112808f505c45cb015c, 0x917dc58e99c00d615843aba8be67e6, 0x00109e ] } , - BigNum { limbs: [ 0x1cf13a5b569fd0965a151b1f5c8b8c, 0x35137a1a2b37c02d62a0000c2de544, 0x000438 ] } , - BigNum { limbs: [ 0xa0b2c8a4a7bc2e69a5eae3e0a37475, 0x723faf835210730c75680995aa200f, 0x006fb5 ] } , - BigNum { limbs: [ 0x60aa14a95d88c0cafbd8da3a4bc946, 0xe6646ceb88d104457700da5d79946c, 0x006bde ] } , - BigNum { limbs: [ 0x5cf9ee56a0d33e35042724c5b436bb, 0xc0eebcb1f4772ef461072f445e70e7, 0x00080e ] } , - BigNum { limbs: [ 0xd8b4b5ac8b89b5d17e3126dde06077, 0x8855f1a58567bca23f48cf4c846d45, 0x001336 ] } , - BigNum { limbs: [ 0xe4ef4d5372d2492e81ced8221f9f8a, 0x1efd37f7f7e0769798bf3a5553980d, 0x0060b7 ] } , - BigNum { limbs: [ 0xf77ed540e329966d0b264bddf7d934, 0xa8a7bcf71c010de2d3ea75ccc08c10, 0x00603b ] } , - BigNum { limbs: [ 0xc6252dbf1b326892f4d9b3220826cd, 0xfeab6ca661472557041d93d5177942, 0x0013b1 ] } , - BigNum { limbs: [ 0x221ee5f78bdebc96787ac75f654db0, 0xc4a11a69f85c1f8e4378ddc113cfc6, 0x002086 ] } , - BigNum { limbs: [ 0x9b851d08727d4269878537a09ab251, 0xe2b20f3384ec13ab948f2be0c4358d, 0x005366 ] } , - BigNum { limbs: [ 0x25a997aaca374219e45e4f9dfdca67, 0x44da1cfeb7d79eb5f92f98205af5ff, 0x004c1e ] } , - BigNum { limbs: [ 0x97fa6b553424bce61ba1af6202359a, 0x62790c9ec5709483ded871817d0f54, 0x0027cf ] } , - BigNum { limbs: [ 0xf77ae21933b2060dd6d4871396bb4a, 0x8f7020cc353bad3bfd33acfd410946, 0x000611 ] } , - BigNum { limbs: [ 0xc62920e6caa9f8f2292b77ec6944b7, 0x17e308d1480c85fddad45ca496fc0c, 0x006ddc ] } , - BigNum { limbs: [ 0xf13f6f0050f68fae151ccd2ba1ba9a, 0x12da86cd6a145c90afb69d358eda60, 0x002b3a ] } , - BigNum { limbs: [ 0xcc6493ffad656f51eae331d45e4567, 0x9478a2d01333d6a928516c6c492af2, 0x0048b3 ] } , - BigNum { limbs: [ 0x18ea5b264a0c8199f6ecb2702fa8ed, 0xb7dfed7cf378c801dbdaddd33dbb5d, 0x0010e8 ] } , - BigNum { limbs: [ 0xa4b9a7d9b44f7d6609134c8fd05714, 0xef733c2089cf6b37fc2d2bce9a49f6, 0x006304 ] } , - BigNum { limbs: [ 0xbc7b88571bcd10663deb92bbb1ae67, 0xfccdfca6dfaf9a4cd88846c18c9da8, 0x004e02 ] } , - BigNum { limbs: [ 0x01287aa8e28eee99c2146c444e519a, 0xaa852cf69d9898ecff7fc2e04b67ab, 0x0025ea ] } , - BigNum { limbs: [ 0x519ed9a49ea7e247294b1210663619, 0x35b28cf61ea9643893877eabc6d688, 0x005c6a ] } , - BigNum { limbs: [ 0x6c05295b5fb41cb8d6b4ecef99c9e8, 0x71a09ca75e9ecf0144808af6112ecb, 0x001783 ] } , - BigNum { limbs: [ 0xaff8b6b5d3f851dc961078b87e26a3, 0x77d6c985d3f89837fdb1e203222b6e, 0x00371c ] } , - BigNum { limbs: [ 0x0dab4c4a2a63ad2369ef864781d95e, 0x2f7c6017a94f9b01da56279eb5d9e5, 0x003cd1 ] } , - BigNum { limbs: [ 0xc1e4fd9fa039fa6f77f78f1cba3068, 0x0df054fee4500e9168f751be38dd09, 0x002a98 ] } , - BigNum { limbs: [ 0xfbbf05605e22049088086fe345cf99, 0x9962d49e98f824a86f10b7e39f2849, 0x004955 ] } , - BigNum { limbs: [ 0x4efba467a5dfb4ecf97bf5437d1dbd, 0x3367add1d7d5a992634881173e95b7, 0x002126 ] } , - BigNum { limbs: [ 0x6ea85e98587c4a13068409bc82e244, 0x73eb7bcba57289a774bf888a996f9c, 0x0052c7 ] } , - BigNum { limbs: [ 0xa801a6a95c0ae810b99e2f97e53771, 0x952f93d73f865b294de8c6ce81f12a, 0x007296 ] } , - BigNum { limbs: [ 0x15a25c56a25116ef4661cf681ac890, 0x122395c63dc1d8108a1f42d3561429, 0x000157 ] } , - BigNum { limbs: [ 0xc31e426e03a26b0d2959e2d9b445f0, 0xdd74ef3f91de66a2cc3216bb0fefae, 0x001f83 ] } , - BigNum { limbs: [ 0xfa85c091fab993f2d6a61c264bba11, 0xc9de3a5deb69cc970bd5f2e6c815a4, 0x005469 ] } , - BigNum { limbs: [ 0x20ac0b6a6e14b1a6b831f42ce6323a, 0xbe10cb647d7bba84324ecc607ef608, 0x001f13 ] } , - BigNum { limbs: [ 0x9cf7f79590474d5947ce0ad319cdc7, 0xe9425e38ffcc78b5a5b93d41590f4b, 0x0054d9 ] } , - BigNum { limbs: [ 0xb80aff1fac13961aa49f7df5807886, 0xc0782b929fa6e15b02c1741e6d294e, 0x000802 ] } , - BigNum { limbs: [ 0x059903e0524868e55b60810a7f877b, 0xe6dafe0adda151ded54695836adc05, 0x006bea ] } , - BigNum { limbs: [ 0xd78c7b658b836b4992ec1ff47af2a0, 0x9265acec05d67d9c20e3f05e4ae055, 0x0045e6 ] } , - BigNum { limbs: [ 0xe617879a72d893b66d13df0b850d61, 0x14ed7cb17771b59db72419438d24fd, 0x002e07 ] } , - BigNum { limbs: [ 0xd921b3453863175de53bb10cb88f8b, 0x61de46594e66fc8b1ce472e488fb7d, 0x00113a ] } , - BigNum { limbs: [ 0xe4824fbac5f8e7a21ac44df3477076, 0x4574e3442ee136aebb2396bd4f09d5, 0x0062b3 ] } , - BigNum { limbs: [ 0x04b714e680c10e1c8ed47580774b30, 0xa68ece476bce74f198804177440f14, 0x0059d7 ] } , - BigNum { limbs: [ 0xb8ecee197d9af0e3712b897f88b4d1, 0x00c45b561179be483f87c82a93f63f, 0x001a16 ] } , - BigNum { limbs: [ 0x28b47e1946a2695efbe06a77097253, 0x78912d3c448b114306945f9d682089, 0x004d27 ] } , - BigNum { limbs: [ 0x94ef84e6b7b995a1041f9488f68dae, 0x2ec1fc6138bd21f6d173aa046fe4ca, 0x0026c6 ] } , - BigNum { limbs: [ 0x504d612ff7a5c7d053b226d1aa16bc, 0x223aaea217a46abd8439ca2761aeb8, 0x0032c4 ] } , - BigNum { limbs: [ 0x6d56a1d006b6372fac4dd82e55e945, 0x85187afb65a3c87c53ce3f7a76569b, 0x004129 ] } , - BigNum { limbs: [ 0x59b4bd52b553180e8d06cc8d51063b, 0x01bfea0019b20b7ced4c5fe09c39b9, 0x006238 ] } , - BigNum { limbs: [ 0x63ef45ad4908e6f172f93272aef9c6, 0xa5933f9d639627bceabba9c13bcb9a, 0x0011b5 ] } , - BigNum { limbs: [ 0x7a46bd207c5fadc1db30762d92eb44, 0x58d048f8a8828ccd93a209c0789971, 0x00115e ] } , - BigNum { limbs: [ 0x435d45df81fc513e24cf88d26d14bd, 0x4e82e0a4d4c5a66c4465ffe15f6be2, 0x00628f ] } , - BigNum { limbs: [ 0x664e8cd12d7fd0e025fbee3b1b298d, 0x5e547bd4a434e9474eda1e916f112f, 0x004dee ] } , - BigNum { limbs: [ 0x5755762ed0dc2e1fda0410c4e4d674, 0x48feadc8d91349f2892deb1068f424, 0x0025ff ] } , - BigNum { limbs: [ 0x2639fea8800bbab43a1ee604bda4cc, 0xbf020593b9c2bbc625eb854d072e8c, 0x006179 ] } , - BigNum { limbs: [ 0x976a04577e50444bc5e118fb425b35, 0xe8512409c3857773b21c8454d0d6c7, 0x001273 ] } , - BigNum { limbs: [ 0x6deda5d7670c976dfe7153dfa53c20, 0x1a2cd56342e73b2559407ab5c9362f, 0x000647 ] } , - BigNum { limbs: [ 0x4fb65d28974f6792018eab205ac3e1, 0x8d26543a3a60f8147ec78eec0ecf24, 0x006da6 ] } , - BigNum { limbs: [ 0x24a5979784783cda5d6ff9c897772a, 0xa4c51da8134b170eb54379e26f5726, 0x006532 ] } , - BigNum { limbs: [ 0x98fe6b6879e3c225a29005376888d7, 0x028e0bf569fd1c2b22c48fbf68ae2d, 0x000ebb ] } , - BigNum { limbs: [ 0x615ae56a038c1cc6c4ab71bdfb5ae2, 0xe3444ad2ae705509bb0f713594efee, 0x00532c ] } , - BigNum { limbs: [ 0x5c491d95facfe2393b548d4204a51f, 0xc40edecaced7de301cf8986c431565, 0x0020c0 ] } , - BigNum { limbs: [ 0x1090665023b48c2919e9353ebde363, 0x9d160b348537dbb6d130e5efc54014, 0x003f62 ] } , - BigNum { limbs: [ 0xad139cafdaa772d6e616c9c1421c9e, 0x0a3d1e68f810578306d723b212c53f, 0x00348b ] } , - BigNum { limbs: [ 0x4d998925d39838f7a08952a7c08661, 0x93476572756dc7a40723fe19230652, 0x004554 ] } , - BigNum { limbs: [ 0x700a79da2ac3c6085f76ac583f79a0, 0x140bc42b07da6b95d0e40b88b4ff01, 0x002e99 ] } , - BigNum { limbs: [ 0x3c2282be8ad00d17b806bbc8890150, 0x989680fa13428d830f2a25062a8504, 0x004ae3 ] } , - BigNum { limbs: [ 0x81818041738bf1e847f9433776feb1, 0x0ebca8a36a05a5b6c8dde49bad804f, 0x00290a ] } , - BigNum { limbs: [ 0x8d0589f19955b0cdcf950bbf3e24d4, 0x3eebc4f6e3d55aba27a407c48b5d4e, 0x00681d ] } , - BigNum { limbs: [ 0x309e790e65064e32306af340c1db2d, 0x686764a69972d87fb06401dd4ca805, 0x000bd0 ] } , - BigNum { limbs: [ 0xdf48b03058eda0068fd2fc3194cf80, 0xc965e63b8f8510a6232e009a5dd37f, 0x006057 ] } , - BigNum { limbs: [ 0xde5b52cfa56e5ef9702d02ce6b3081, 0xdded4361edc32293b4da09077a31d3, 0x001395 ] } , - BigNum { limbs: [ 0x8329c8cf1cf713076e7b2f38dd4262, 0x96482f60912963e6ccdbc96d7906ae, 0x0067de ] } , - BigNum { limbs: [ 0x3a7a3a30e164ebf89184cfc722bd9f, 0x110afa3cec1ecf530b2c40345efea5, 0x000c0f ] } , - BigNum { limbs: [ 0x3adc58d0ad958d7367066af7a885da, 0x4d99b2ba5456b0cefa0837797a506e, 0x005394 ] } , - BigNum { limbs: [ 0x82c7aa2f50c6718c98f99408577a27, 0x59b976e328f1826addffd2285db4e5, 0x002059 ] } , - BigNum { limbs: [ 0x2dcc1406da0f4c6704b9c8bb9bf61e, 0xa58b3a749bc62c8e657fe47ea551f3, 0x002c6a ] } , - BigNum { limbs: [ 0x8fd7eef9244cb298fb4636446409e3, 0x01c7ef28e18206ab7288252332b360, 0x004783 ] } , - BigNum { limbs: [ 0x8af5341425fbd83b0140f36e397f94, 0x01f2957118af6a295bf1d42da0837f, 0x006146 ] } , - BigNum { limbs: [ 0x32aeceebd86026c4febf0b91c6806d, 0xa560942c6498c9107c1635743781d4, 0x0012a7 ] } , - BigNum { limbs: [ 0xa024d738a27752e498f42f30e07b67, 0x56b426fc6fed01cf6826f82b270bab, 0x0037bd ] } , - BigNum { limbs: [ 0x1d7f2bc75be4ac1b670bcfcf1f849a, 0x509f02a10d5b316a6fe11176b0f9a8, 0x003c30 ] } , - BigNum { limbs: [ 0x0dfad0e4ff4435ffb3a1ed146afa08, 0x9f5d5ebbdbb32af466405e2b412092, 0x004554 ] } , - BigNum { limbs: [ 0xafa9321aff17c9004c5e11eb9505f9, 0x07f5cae1a195084571c7ab7696e4c1, 0x002e99 ] } , - BigNum { limbs: [ 0x9476ded7c39504ed6111bf67947bac, 0xa18ebc3f4354adddcaedf9ec551f49, 0x003b9b ] } , - BigNum { limbs: [ 0x292d24283ac6fa129eee3f986b8455, 0x05c46d5e39f3855c0d1a0fb582e60a, 0x003852 ] } , - BigNum { limbs: [ 0xbe36fec0ea82f1187e5a4951c7d7aa, 0xe55fe37b82da99175032107fc9d59b, 0x003742 ] } , - BigNum { limbs: [ 0xff6d043f13d90de781a5b5ae382857, 0xc1f34621fa6d9a2287d5f9220e2fb7, 0x003caa ] } , - BigNum { limbs: [ 0x86ff35293930089215d24e851304d5, 0xf6dcc395132656b4ca29edfdb75bdb, 0x006bcd ] } , - BigNum { limbs: [ 0x36a4cdd6c52bf66dea2db07aecfb2c, 0xb07666086a21dc850dde1ba420a978, 0x00081f ] } , - BigNum { limbs: [ 0xedab698f1611cf2bca8922099fe097, 0x115590c2b33244f1da034d30a5f1d4, 0x00531d ] } , - BigNum { limbs: [ 0xcff89970e84a2fd43576dcf6601f6a, 0x95fd98daca15ee47fe04bc7132137e, 0x0020d0 ] } , - BigNum { limbs: [ 0x71aef23081df72618978fa0fb1d481, 0x7a37b3fb7d8202a510a6edc4c569d1, 0x004ec6 ] } , - BigNum { limbs: [ 0x4bf510cf7c7c8c9e768704f04e2b80, 0x2d1b75a1ffc63094c7611bdd129b82, 0x002527 ] } , - BigNum { limbs: [ 0xf63d287e12fcc4ef3457325ecd5b52, 0x0ebd4f47ddcc671a405c3af1f4748f, 0x0048fe ] } , - BigNum { limbs: [ 0xc766da81eb5f3a10cba8cca132a4af, 0x9895da559f7bcc1f97abceafe390c3, 0x002aef ] } , - BigNum { limbs: [ 0x45d705f19567a17e3c52e0ca097561, 0xa32e8f753bf6e6abe067578ca59383, 0x0001d9 ] } , - BigNum { limbs: [ 0x77ccfd0e68f45d81c3ad1e35f68aa0, 0x04249a2841514c8df7a0b2153271d0, 0x007214 ] } , - BigNum { limbs: [ 0xd978ce79991986ced3257771015feb, 0x3d9e5e50884d374ca8041a159d8414, 0x005726 ] } , - BigNum { limbs: [ 0xe42b3486654278312cda878efea016, 0x69b4cb4cf4fafbed3003ef8c3a813e, 0x001cc7 ] } , - BigNum { limbs: [ 0xe19b48772cdb25ce772be5d43047b4, 0x0077e02f21b0bfe5620485ff6e59e4, 0x0055e8 ] } , - BigNum { limbs: [ 0xdc08ba88d180d93188d4192bcfb84d, 0xa6db496e5b977354760383a269ab6e, 0x001e05 ] } , - BigNum { limbs: [ 0x278c5867ae0c4220a86f6315f5d25d, 0x54e0c96f8eacc0cfb4f62bf35360b9, 0x001daa ] } , - BigNum { limbs: [ 0x9617aa98504fbcdf57909bea0a2da4, 0x5272602dee9b726a2311ddae84a49a, 0x005643 ] } , - BigNum { limbs: [ 0x49039008a03d4f394851b24166e722, 0x9ab12f80da79b768a7c4d36af60e3a, 0x003a8a ] } , - BigNum { limbs: [ 0x74a072f75e1eafc6b7ae4cbe9918df, 0x0ca1fa1ca2ce7bd130433636e1f719, 0x003963 ] } , - BigNum { limbs: [ 0xaf5ebe48a9443d98ee7999f64fee83, 0x18f1ea8d09353bdaa2a9548038b82a, 0x001b8d ] } , - BigNum { limbs: [ 0x0e4544b75517c16711866509b0117e, 0x8e613f107412f75f355eb5219f4d29, 0x005860 ] } , - BigNum { limbs: [ 0x5280a0391b3b940ccf38acc802cd7a, 0xd7b56ab20336f5f6abefaaf303ee30, 0x003ad4 ] } , - BigNum { limbs: [ 0x6b2362c6e3206af330c75237fd3287, 0xcf9dbeeb7a113d432c185eaed41723, 0x003918 ] } , - BigNum { limbs: [ 0xbf42c13a8fd48ea2e5b21ace4eb6ff, 0xf05b902a8aceefcf46feb733e8eb96, 0x006ddb ] } , - BigNum { limbs: [ 0xfe6141c56e87705d1a4de431b14902, 0xb6f79972f279436a9109526def19bc, 0x000611 ] } , - BigNum { limbs: [ 0x46893ee126085ca87f4400fc13aa2c, 0x01ef53e860c727a5aeeca3c44f4cfe, 0x0067f7 ] } , - BigNum { limbs: [ 0x771ac41ed853a25780bbfe03ec55d5, 0xa563d5b51c810b94291b65dd88b855, 0x000bf6 ] } , - BigNum { limbs: [ 0x7eb0daa5eb77a23795f13f98d06ac8, 0x33b13326a536d5fb78c46ac7a98aa1, 0x0058c6 ] } , - BigNum { limbs: [ 0x3ef3285a12e45cc86a0ebf672f9539, 0x73a1f676d8115d3e5f439eda2e7ab2, 0x001b27 ] } , - BigNum { limbs: [ 0xb6184e5cb935bcff4a91d5a37814d0, 0x1a2f6b1937a2cbe141e40ba93b8907, 0x00478a ] } , - BigNum { limbs: [ 0x078bb4a345264200b56e295c87eb31, 0x8d23be8445a567589623fdf89c7c4c, 0x002c63 ] } , - BigNum { limbs: [ 0xf97b0a5d9916e64ade99baf2064979, 0x69c94958b0dbb1a80ba834b6917e21, 0x004529 ] } , - BigNum { limbs: [ 0xc428f8a2654518b52166440df9b688, 0x3d89e044cc6c8191cc5fd4eb468731, 0x002ec4 ] } , - BigNum { limbs: [ 0x883a00bd39c06f4cded2085f1d249d, 0x664a248714e180f7a16441b8a5071c, 0x00270f ] } , - BigNum { limbs: [ 0x356a0242c49b8fb3212df6a0e2db64, 0x410905166866b24236a3c7e932fe37, 0x004cde ] } , - BigNum { limbs: [ 0x731128adcb310e4d90e093e647fd5f, 0x171777c1e39865d7778c9c727d8a66, 0x001508 ] } , - BigNum { limbs: [ 0x4a92da52332af0b26f1f6b19b802a2, 0x903bb1db99afcd62607b6d2f5a7aed, 0x005ee5 ] } , - BigNum { limbs: [ 0x88f1a1209932d061409bbb445f0d14, 0x8d96135bfbf040ecf1209ccf07b9d5, 0x001339 ] } , - BigNum { limbs: [ 0x34b261df65292e9ebf6443bba0f2ed, 0x19bd16418157f24ce6e76cd2d04b7e, 0x0060b4 ] } , - BigNum { limbs: [ 0x874f129eedc438495d73dfe6eb3e00, 0x4493dce84e5429ba09cef3db435f8e, 0x0025bd ] } , - BigNum { limbs: [ 0x3654f0611097c6b6a28c1f1914c201, 0x62bf4cb52ef4097fce3915c694a5c5, 0x004e30 ] } , - BigNum { limbs: [ 0x1d50eee0811e8206f9a183352303e8, 0xf0fd58b73fee4bec2b787a3d54e5c7, 0x00080b ] } , - BigNum { limbs: [ 0xa053141f7d3d7cf9065e7bcadcfc19, 0xb655d0e63d59e74dac8f8f64831f8c, 0x006be1 ] } , - BigNum { limbs: [ 0xab92aedf8495c4fb4a85c673193da0, 0x2ba6ca0cdbbc7faa59844c34278d53, 0x000a4f ] } , - BigNum { limbs: [ 0x1211542079c63a04b57a388ce6c261, 0x7bac5f90a18bb38f7e83bd6db07800, 0x00699e ] } , - BigNum { limbs: [ 0xaec33cb072e13d00845dfcb5c84846, 0x136ec0225fab5275a6512e89d0955a, 0x006bb9 ] } , - BigNum { limbs: [ 0x0ee0c64f8b7ac1ff7ba2024a37b7bb, 0x93e4697b1d9ce0c431b6db18076ff9, 0x000834 ] } , - BigNum { limbs: [ 0xbba9eadb95a182a6a1bba441bbd237, 0x1fc1e4cc8075367070ffd15db1bd70, 0x002205 ] } , - BigNum { limbs: [ 0x01fa182468ba7c595e445abe442dca, 0x879144d0fcd2fcc9670838442647e3, 0x0051e8 ] } , - BigNum { limbs: [ 0x22a6bce7387a427f50330cd59075af, 0x92127d5382417773114e5fa5467a58, 0x0022ec ] } , - BigNum { limbs: [ 0x9afd4618c5e1bc80afccf22a6f8a52, 0x1540ac49fb06bbc6c6b9a9fc918afb, 0x005101 ] } , - BigNum { limbs: [ 0x9ebedd4e11f42d3a36a7edca585499, 0x7668fb81393aa8160612bcc2b856d8, 0x003f4f ] } , - BigNum { limbs: [ 0x1ee525b1ec67d1c5c9581135a7ab68, 0x30ea2e1c440d8b23d1f54cdf1fae7b, 0x00349e ] } , - BigNum { limbs: [ 0x0f793a1eac2c49dab684ead675638b, 0x7d971682f3e80356b9fc2f9ded09b8, 0x00152f ] } , - BigNum { limbs: [ 0xae2ac8e1522fb525497b14298a9c76, 0x29bc131a89602fe31e0bda03eafb9b, 0x005ebe ] } , - BigNum { limbs: [ 0x627492d5ba88838547253c80c1dab5, 0x647de281bb01d0d6b2a531d9cdb1ea, 0x000f44 ] } , - BigNum { limbs: [ 0x5b2f702a43d37b7ab8dac27f3e254c, 0x42d5471bc24662632562d7c80a5369, 0x0064a9 ] } , - BigNum { limbs: [ 0x45dae47e7d0c73a7110714fe4cdddc, 0xeb840d77404c05f16dd2f56f6616d6, 0x003549 ] } , - BigNum { limbs: [ 0x77c91e81814f8b58eef8ea01b32225, 0xbbcf1c263cfc2d486a35143271ee7d, 0x003ea3 ] } , - BigNum { limbs: [ 0x3f702db9fc8191c76df718ca968656, 0xe6b789f89d961ab843df419c6ae81a, 0x004b2b ] } , - BigNum { limbs: [ 0x7e33d54601da6d389208e6356979ab, 0xc09b9fa4dfb218819428c8056d1d39, 0x0028c1 ] } , - BigNum { limbs: [ 0x1813abc939ed5a3ab8a4ed61ca9d9c, 0xd6ba2d8dfb407c3ee72732525df52e, 0x000ae1 ] } , - BigNum { limbs: [ 0xa5905736c46ea4c5475b119e356265, 0xd098fc0f8207b6faf0e0d74f7a1025, 0x00690b ] } , - BigNum { limbs: [ 0xfa31f6840cbcf2bd55779ad6aecbde, 0xb8084da0a6aabb41e1e22ed63a2a17, 0x002e01 ] } , - BigNum { limbs: [ 0xc3720c7bf19f0c42aa886429513423, 0xef4adbfcd69d77f7f625dacb9ddb3b, 0x0045eb ] } , - BigNum { limbs: [ 0xebeae1d4989cddb16de9be3b85f5bc, 0xd0fddad8819aac539e1c1739e2cc75, 0x004c5d ] } , - BigNum { limbs: [ 0xd1b9212b65bf214e921640c47a0a45, 0xd6554ec4fbad86e639ebf267f538dd, 0x00278f ] } , - BigNum { limbs: [ 0xb1723eb5371609d83aecffdd17a3c7, 0x790650286522b100e6012755cce928, 0x004731 ] } , - BigNum { limbs: [ 0x0c31c44ac745f527c512ff22e85c3a, 0x2e4cd97518258238f206e24c0b1c2b, 0x002cbc ] } , - BigNum { limbs: [ 0x241adc7bd53b9de82aeff61b850539, 0x7af8ef4de0dd47ce5e049d3c5a6141, 0x005b97 ] } , - BigNum { limbs: [ 0x9989268429206117d51008e47afac8, 0x2c5a3a4f9c6aeb6b7a036c657da412, 0x001856 ] } , - BigNum { limbs: [ 0x8188035b75adb26e562662a9e24b0e, 0x4959d084d53f5f9544f5b2b096c774, 0x00528b ] } , - BigNum { limbs: [ 0x3c1bffa488ae4c91a9d99c561db4f3, 0x5df95918a808d3a4931256f1413ddf, 0x002162 ] } , - BigNum { limbs: [ 0xc24cfde9487630036910f638970846, 0x872f04f2c6274d1290aece64d5ae75, 0x00290d ] } , - BigNum { limbs: [ 0xfb570516b5e5cefc96ef08c768f7bb, 0x202424aab720e62747593b3d0256dd, 0x004ae0 ] } , - BigNum { limbs: [ 0x505c876a9362b9a8e259709c58389a, 0xfe529ee7f0f56fc6370fc12fce99ad, 0x0014ff ] } , - BigNum { limbs: [ 0x6d477b956af945571da68e63a7c767, 0xa9008ab58c52c373a0f84872096ba6, 0x005eed ] } , - BigNum { limbs: [ 0xf7c6d816161edcc296d7e41e5066ac, 0x71afe1ba97a05d7a75e99cc5b80d1b, 0x000d60 ] } , - BigNum { limbs: [ 0xc5dd2ae9e83d223d69281ae1af9955, 0x35a347e2e5a7d5bf621e6cdc1ff837, 0x00668d ] } , - BigNum { limbs: [ 0x03a0deb96ed5add78c97892bc70d2b, 0x341b1ac3600c902747ac97a6b6d7fc, 0x00563f ] } , - BigNum { limbs: [ 0xba0324468f865128736875d438f2d6, 0x73380eda1d3ba312905b71fb212d57, 0x001dae ] } , - BigNum { limbs: [ 0x5f7198849146ab02ae844dda17855b, 0xe9a7a223eb9806f37e041105506dd6, 0x0067ac ] } , - BigNum { limbs: [ 0x5e326a7b6d1553fd517bb125e87aa6, 0xbdab877991b02c465a03f89c87977d, 0x000c40 ] } , - BigNum { limbs: [ 0x625c588037591fbf85cfc978a502b8, 0xfdf1576cf3b50feb980510003e5f90, 0x0024ec ] } , - BigNum { limbs: [ 0x5b47aa7fc702df407a3035875afd49, 0xa961d2308993234e4002f9a199a5c3, 0x004f00 ] } , - BigNum { limbs: [ 0xc2063c6c2e9e332928499e0bd1420a, 0xbea5fdee237254ef13c540a20eabb6, 0x0032db ] } , - BigNum { limbs: [ 0xfb9dc693cfbdcbd6d7b660f42ebdf7, 0xe8ad2baf59d5de4ac442c8ffc9599c, 0x004111 ] } , - BigNum { limbs: [ 0xa8cce3c2ecfeb6f4ef6dcfa67c4d19, 0x268e04e0793990c483113bfefa8410, 0x002d2e ] } , - BigNum { limbs: [ 0x14d71f3d115d480b10922f5983b2e8, 0x80c524bd040ea27554f6cda2dd8143, 0x0046bf ] } , - BigNum { limbs: [ 0x335735a56e5e505b8631f4208c82d5, 0x7f336029f1dd63cf9b69cbc19bb9b4, 0x001c39 ] } , - BigNum { limbs: [ 0x8a4ccd5a8ffdaea479ce0adf737d2c, 0x281fc9738b6acf6a3c9e3de03c4b9f, 0x0057b4 ] } , - BigNum { limbs: [ 0xc306595156a456f80c6b5f08b6853d, 0x1270b67a71800394abc4c316153a0c, 0x000c1c ] } , - BigNum { limbs: [ 0xfa9da9aea7b7a807f3949ff7497ac4, 0x94e273230bc82fa52c43468bc2cb46, 0x0067d1 ] } , - BigNum { limbs: [ 0xc495060875c7663f057bb8d4a41c08, 0x56e633e8cfebd53fd0ea4ceee08eab, 0x002e6a ] } , - BigNum { limbs: [ 0xf90efcf7889498c0fa84462b5be3f9, 0x506cf5b4ad5c5dfa071dbcb2f776a7, 0x004583 ] } , - BigNum { limbs: [ 0x71cd45b514b0e2459243f1bff55437, 0xa5462c6d112a52b532eb34cade0f08, 0x000c5f ] } , - BigNum { limbs: [ 0x4bd6bd4ae9ab1cba6dbc0d400aabca, 0x020cfd306c1de084a51cd4d6f9f64b, 0x00678e ] } , - BigNum { limbs: [ 0x0fe0f71f4e6f25bff7f645cd3fc71a, 0x3a4b2cedaefd98c35c1f9cf2a711d2, 0x00104d ] } , - BigNum { limbs: [ 0xadc30be0afecd9400809b932c038e7, 0x6d07fcafce4a9a767be86caf30f381, 0x0063a0 ] } , - BigNum { limbs: [ 0xbf16bb1a132052ad0e67dcbc531b87, 0xd140daaeed7c76437237030b4b2819, 0x003a12 ] } , - BigNum { limbs: [ 0xfe8d47e5eb3bac52f1982243ace47a, 0xd6124eee8fcbbcf665d106968cdd39, 0x0039da ] } , - BigNum { limbs: [ 0x3247206e0c4335228b6a709335e3be, 0x28fbc5fb250b4d341582faa1e83c8b, 0x005fa2 ] } , - BigNum { limbs: [ 0x8b5ce291f218c9dd74958e6cca1c43, 0x7e5763a2583ce605c2850effefc8c8, 0x00144b ] } , - BigNum { limbs: [ 0x8f4599907a2eff1ebb9f6f8b1553e6, 0x179f95f9d1cf71300c916e3bdde695, 0x0042f7 ] } , - BigNum { limbs: [ 0x2e5e696f842cffe144608f74eaac1b, 0x8fb393a3ab78c209cb769b65fa1ebe, 0x0030f6 ] } , - BigNum { limbs: [ 0x17eb2f225b08165bbc19234158e3c4, 0x59b07cee916adbfbee27ada17b64f7, 0x0035c7 ] } , - BigNum { limbs: [ 0xa5b8d3dda353e8a443e6dbbea71c3d, 0x4da2acaeebdd573de9e05c005ca05c, 0x003e26 ] } , - BigNum { limbs: [ 0x44eda7f5992ae469427888234c5c23, 0x666481ebd5e78f70dc8cbd002636a0, 0x00676e ] } , - BigNum { limbs: [ 0x78b65b0a65311a96bd8776dcb3a3de, 0x40eea7b1a760a3c8fb7b4ca1b1ceb3, 0x000c7f ] } , - BigNum { limbs: [ 0xe11a5a6e2466daee1655dac009b04a, 0xaeeab283ce053f0319b0c4cedabde3, 0x006def ] } , - BigNum { limbs: [ 0xdc89a891d9f52411e9aa243ff64fb7, 0xf8687719af42f436be5744d2fd476f, 0x0005fd ] } , - BigNum { limbs: [ 0x1639b5ed5801a51ffb579d952cef11, 0xca7b35b68be96c74e25207bfb8147a, 0x005d28 ] } , - BigNum { limbs: [ 0xa76a4d12a65a59e004a8616ad310f0, 0xdcd7f3e6f15ec6c4f5b601e21ff0d9, 0x0016c4 ] } , - BigNum { limbs: [ 0xb93c47f7b1c5b76fbf84bab91ebb51, 0x6654090a7a564aaefb2c49d560d2a9, 0x003184 ] } , - BigNum { limbs: [ 0x0467bb084c964790407b4446e144b0, 0x40ff209302f1e88adcdbbfcc7732aa, 0x004269 ] } , - BigNum { limbs: [ 0x3e1a6ab1df12b32a7559934b7cb028, 0xaef63e5a620a101f2e88ee202a462f, 0x0069d0 ] } , - BigNum { limbs: [ 0x7f89984e1f494bd58aa66bb4834fd9, 0xf85ceb431b3e231aa97f1b81adbf24, 0x000a1c ] } , - BigNum { limbs: [ 0x4f3251fc857ca88f6a9fd46e4014aa, 0x7413f7facad0aed9f0255cbae98aeb, 0x000b2e ] } , - BigNum { limbs: [ 0x6e71b10378df567095602a91bfeb57, 0x333f31a2b277845fe7e2ace6ee7a68, 0x0068bf ] } , - BigNum { limbs: [ 0x4ac2d5b106aa42e2fb72a0b3706d2c, 0x8e395fb95023d459ebc0acc8782c47, 0x006d10 ] } , - BigNum { limbs: [ 0x72e12d4ef7b1bc1d048d5e4c8f92d5, 0x1919c9e42d245edfec475cd95fd90c, 0x0006dd ] } , - BigNum { limbs: [ 0x16d9143ffcbf3076075d72fb4fd6f9, 0x64fe5500cc389ed0fdc3bfda980b14, 0x004ee6 ] } , - BigNum { limbs: [ 0xa6caeec0019cce89f8a28c04b02908, 0x4254d49cb10f9468da4449c73ffa3f, 0x002507 ] } , - BigNum { limbs: [ 0x472b4e744c806f4b4271e8fea8e685, 0x0c5df3ef6f22f808cccea17083db42, 0x003174 ] } , - BigNum { limbs: [ 0x7678b48bb1db8fb4bd8e160157197c, 0x9af535ae0e253b310b396831542a11, 0x004279 ] } , - BigNum { limbs: [ 0xfb2259c50ef9159ec8596d41db6808, 0xd38800f9c7a6cdb1758900ba9cea32, 0x002841 ] } , - BigNum { limbs: [ 0xc281a93aef62e96137a691be2497f9, 0xd3cb28a3b5a16588627f08e73b1b20, 0x004bab ] } , - BigNum { limbs: [ 0xc8e302a64f34b01d33fbca450c1d06, 0xd5cde29fc09fbceb23b1dc49d6e277, 0x005900 ] } , - BigNum { limbs: [ 0xf4c10059af274ee2cc0434baf3e2fb, 0xd18546fdbca8764eb4562d580122db, 0x001aec ] } , - BigNum { limbs: [ 0x90344fa5a16f4ab9879b3e17dd0b0b, 0x667d94cdd9c38986b950694a8aeb37, 0x0059a2 ] } , - BigNum { limbs: [ 0x2d6fb35a5cecb4467864c0e822f4f6, 0x40d594cfa384a9b31eb7a0574d1a1c, 0x001a4b ] } , - BigNum { limbs: [ 0xbd5b351c5cd26c64739a7d485a844b, 0xdd8c8143c8b50afcb0b46efed066d5, 0x00594d ] } , - BigNum { limbs: [ 0x0048cde3a189929b8c6581b7a57bb6, 0xc9c6a859b493283d27539aa3079e7e, 0x001a9f ] } , - BigNum { limbs: [ 0x2d849fd134747881b0f8d6099b0de1, 0x7d7f51c5f634342b5da8a55514f039, 0x004e7f ] } , - BigNum { limbs: [ 0x901f632ec9e7867e4f0728f664f220, 0x29d3d7d78713ff0e7a5f644cc3151a, 0x00256e ] } , - BigNum { limbs: [ 0x2e561e922d32eb5565175ce0c2c4d7, 0xe1ba3d4259226b6c4502021aa28fe9, 0x000ec4 ] } , - BigNum { limbs: [ 0x8f4de46dd12913aa9ae8a21f3d3b2a, 0xc598ec5b2425c7cd9306078735756a, 0x006528 ] } , - BigNum { limbs: [ 0xa9e98d9a6a0fa3eabc37aaafd8de68, 0xb3ce1d79199ed39d09e4354dc67fd4, 0x00536d ] } , - BigNum { limbs: [ 0x13ba7565944c5b1543c85450272199, 0xf3850c2463a95f9cce23d45411857f, 0x00207f ] } , - BigNum { limbs: [ 0x76b8ab15b3978e0bbd4df91011faed, 0x635a9d5aff4d39f18be39a282a3b41, 0x0040b1 ] } , - BigNum { limbs: [ 0x46eb57ea4ac470f442b205efee0514, 0x43f88c427dfaf9484c246f79adca12, 0x00333c ] } , - BigNum { limbs: [ 0xeaefcc0af5294f232b15177d4cf979, 0x42759b48c9c039e8afa135aa03e63e, 0x006bb6 ] } , - BigNum { limbs: [ 0xd2b436f50932afdcd4eae782b30688, 0x64dd8e54b387f9512866d3f7d41f14, 0x000837 ] } , - BigNum { limbs: [ 0x23cae1b39585da238eb67e41a8ef7a, 0x07df44f50563c498bb7a0ba353cfc8, 0x0054d4 ] } , - BigNum { limbs: [ 0x99d9214c68d624dc714980be571087, 0x9f73e4a877e46ea11c8dfdfe84358b, 0x001f19 ] } , - BigNum { limbs: [ 0x84043755593a5571575050ff2e8f53, 0x7016e0f346286bfae7e9c76a0737f1, 0x0026e3 ] } , - BigNum { limbs: [ 0x399fcbaaa521a98ea8afae00d170ae, 0x373c48aa371fc73ef01e4237d0cd62, 0x004d0a ] } , - BigNum { limbs: [ 0x6d9552d11b8248c1601b5e0269f651, 0x8379e7b404d11e548b580444898b73, 0x003f3f ] } , - BigNum { limbs: [ 0x500eb02ee2d9b63e9fe4a0fd9609b0, 0x23d941e9787714e54cb0055d4e79e0, 0x0034ae ] } , - BigNum { limbs: [ 0x887f8205fd194354ccab45a519de45, 0x562c6c44afc5a02a797876e2be4c63, 0x006727 ] } , - BigNum { limbs: [ 0x352480fa0142bbab3354b95ae621bc, 0x5126bd58cd82930f5e8f92bf19b8f0, 0x000cc6 ] } , - BigNum { limbs: [ 0x5ac52dd0275b76a11df3f12e4b57c9, 0x8b4cb19c6aacfd4cad1b55fe13aaec, 0x003d63 ] } , - BigNum { limbs: [ 0x62ded52fd700885ee20c0dd1b4a838, 0x1c067801129b35ed2aecb3a3c45a67, 0x00368a ] } , - BigNum { limbs: [ 0x56bcfda225a255c9dfef16490d0361, 0xf639fea4d6c184a686635902923601, 0x000dc6 ] } , - BigNum { limbs: [ 0x66e7055dd8b9a9362010e8b6f2fca0, 0xb1192af8a686ae9351a4b09f45cf52, 0x006626 ] } , - BigNum { limbs: [ 0x3b04598a9c22f8aeb6194dca2552be, 0x89c063549d3d69c063c5d353adb347, 0x00310e ] } , - BigNum { limbs: [ 0x829fa9756239065149e6b135daad43, 0x1d92c648e00ac9797442364e2a520c, 0x0042df ] } , - BigNum { limbs: [ 0xba076f54fc7d713ba295f01bd3dca3, 0xbdb2cc6acf3bff0acc918a8938919b, 0x001bea ] } , - BigNum { limbs: [ 0x039c93ab01de8dc45d6a0ee42c235e, 0xe9a05d32ae0c342f0b767f189f73b8, 0x005802 ] } , - BigNum { limbs: [ 0x5d2d722303a5151916ea53506843d4, 0x2d1af4dac73ca395d9a86e654d250a, 0x0073ca ] } , - BigNum { limbs: [ 0x607690dcfab6e9e6e915abaf97bc2d, 0x7a3834c2b60b8fa3fe5f9b3c8ae049, 0x000023 ] } , - BigNum { limbs: [ 0xc5bb329aa58ff53dc9e5600f6fb2ac, 0xda0d65ba213edeae67bc36f376e13c, 0x00394f ] } , - BigNum { limbs: [ 0xf7e8d06558cc09c2361a9ef0904d55, 0xcd45c3e35c09548b704bd2ae612416, 0x003a9d ] } , - BigNum { limbs: [ 0x8735397a729c9296667fe93049e708, 0x516de84be9be3b19a4859689394040, 0x000324 ] } , - BigNum { limbs: [ 0x366ec9858bbf6c69998015cfb618f9, 0x55e541519389f820338273189ec513, 0x0070c9 ] } , - BigNum { limbs: [ 0x24897db64ce269d203e3fa74e11447, 0x5b04c0c2ce204699035efe5f090b78, 0x004416 ] } , - BigNum { limbs: [ 0x991a8549b179952dfc1c048b1eebba, 0x4c4e68daaf27eca0d4a90b42cef9db, 0x002fd7 ] } , - BigNum { limbs: [ 0x1336aae12b9741e4013b1be24a6a27, 0x29f81acce66402fe04c5253429fa23, 0x006d79 ] } , - BigNum { limbs: [ 0xaa6d581ed2c4bd1bfec4e31db595da, 0x7d5b0ed096e4303bd342e46dae0b30, 0x000674 ] } , - BigNum { limbs: [ 0x3bc24f99c9cea52aff74bda8bd30d5, 0x89729d58ccebd3a3c25a684b5b1b44, 0x0059c9 ] } , - BigNum { limbs: [ 0x81e1b366348d59d5008b415742cf2c, 0x1de08c44b05c5f9615ada1567cea0f, 0x001a24 ] } , - BigNum { limbs: [ 0xd648d364782d8780d7ed78f5a1840b, 0x47155e69d457fd7728f0be93f4d1a6, 0x00441f ] } , - BigNum { limbs: [ 0xe75b2f9b862e777f2812860a5e7bf6, 0x603dcb33a8f035c2af174b0de333ac, 0x002fce ] } , - BigNum { limbs: [ 0xa48300a88d274b017fb495c97736ea, 0x922de796122f0a24fd82fef9163b38, 0x003676 ] } , - BigNum { limbs: [ 0x192102577134b3fe804b693688c917, 0x152542076b192914da850aa8c1ca1b, 0x003d77 ] } , - BigNum { limbs: [ 0xc8e7356632cbb83bb9f77771a94e74, 0xc278a4e01a4c849f36f7351d976f8c, 0x006186 ] } , - BigNum { limbs: [ 0xf4bccd99cb9046c44608878e56b18d, 0xe4da84bd62fbae9aa110d4844095c6, 0x001266 ] } , - BigNum { limbs: [ 0x8c8462d85d66967dc3465fd3e84234, 0xaf84180afee4df9729856b740496bd, 0x00011a ] } , - BigNum { limbs: [ 0x311fa027a0f568823cb99f2c17bdcd, 0xf7cf11927e6353a2ae829e2dd36e96, 0x0072d2 ] } , - BigNum { limbs: [ 0x617ea313bbee72237fdc3accfeb487, 0x962d2e10663a7a43a7d1a5965b08af, 0x00152d ] } , - BigNum { limbs: [ 0x5c255fec426d8cdc8023c433014b7a, 0x1125fb8d170db8f63036640b7cfca4, 0x005ec0 ] } , - BigNum { limbs: [ 0x9a573ac1ebbef93539694e1a3c0355, 0xa89f0ff90ea23664d64e46d2949543, 0x0057e2 ] } , - BigNum { limbs: [ 0x234cc83e129d05cac696b0e5c3fcac, 0xfeb419a46ea5fcd501b9c2cf437010, 0x001c0a ] } , - BigNum { limbs: [ 0xd68d220fca64d38db677b6043ff669, 0xd6fa9c3d539a83d386045db22900fb, 0x0060c9 ] } , - BigNum { limbs: [ 0xe716e0f033f72b72498848fbc00998, 0xd0588d6029adaf665203abefaf0457, 0x001323 ] } , - BigNum { limbs: [ 0x1707a64849286274d7dfd9973ee6e7, 0x32df7adc756f9365dbfdd816dd932b, 0x0062f9 ] } , - BigNum { limbs: [ 0xa69c5cb7b5339c8b28202568c1191a, 0x7473aec107d89fd3fc0a318afa7228, 0x0010f4 ] } , - BigNum { limbs: [ 0xa584d5a26031ebedba4649fc46b70a, 0x96570a7e378320524b13c0a9195554, 0x002842 ] } , - BigNum { limbs: [ 0x181f2d5d9e2a131245b9b503b948f7, 0x10fc1f1f45c512e78cf448f8beafff, 0x004bab ] } , - BigNum { limbs: [ 0x34078e6023659943eab7043484fc3c, 0xdf83246c205deaaad843d3c445bf62, 0x002c06 ] } , - BigNum { limbs: [ 0x899c749fdaf665bc1548facb7b03c5, 0xc7d005315cea488effc435dd9245f1, 0x0047e6 ] } , - BigNum { limbs: [ 0x259d82fefd5486c32f2ad697429d10, 0xa8040608c82c1612a07a34289f79a2, 0x00587f ] } , - BigNum { limbs: [ 0x980680010107783cd0d52868bd62f1, 0xff4f2394b51c1d27378dd579388bb1, 0x001b6d ] } , - BigNum { limbs: [ 0xadc9b2ae5adec432f30e9b0bfc3a6d, 0x8182ae53dad057afa670133b58fad7, 0x00694a ] } , - BigNum { limbs: [ 0x0fda5051a37d3acd0cf163f403c594, 0x25d07b49a277db8a3197f6667f0a7c, 0x000aa3 ] } , - BigNum { limbs: [ 0xf8c914dff2099ea3f982ee75a456a7, 0x14906a749b47f8a343fc005f3e28f0, 0x004a77 ] } , - BigNum { limbs: [ 0xc4daee200c52605c067d108a5ba95a, 0x92c2bf28e2003a96940c094299dc62, 0x002976 ] } , - BigNum { limbs: [ 0xdf2efbf4151df9070c45c1bd0c92d5, 0xd16ee200ef574685e2f858afc4cd81, 0x004fd8 ] } , - BigNum { limbs: [ 0xde75070be93e05f8f3ba3d42f36d2c, 0xd5e4479c8df0ecb3f50fb0f21337d1, 0x002414 ] } , - BigNum { limbs: [ 0xc5e75edbddeb0243868d6303e7e27a, 0xf5f4896aaa5cff07a7cfa93c6c4267, 0x0025c9 ] } , - BigNum { limbs: [ 0xf7bca4242070fcbc79729bfc181d87, 0xb15ea032d2eb3432303860656bc2eb, 0x004e23 ] } , - BigNum { limbs: [ 0x5eae1a9fb81b7dbc576703ce363b13, 0x15a54c27fd410c55177a1108b89db3, 0x001d30 ] } , - BigNum { limbs: [ 0x5ef5e86046408143a898fb31c9c4ee, 0x91addd75800726e4c08df8991f67a0, 0x0056bd ] } , - BigNum { limbs: [ 0x4f4b7eea11b1984ec91001c0981b11, 0xce55ade3f81929d4d10b57143c885d, 0x003b1e ] } , - BigNum { limbs: [ 0x6e588415ecaa66b136effd3f67e4f0, 0xd8fd7bb9852f096506fcb28d9b7cf6, 0x0038ce ] } , - BigNum { limbs: [ 0x2e6d3761798a4d9cf9bd0d936c966d, 0xbff8f170be1a304971cb7310b33ebb, 0x000c10 ] } , - BigNum { limbs: [ 0x8f36cb9e84d1b1630642f16c936994, 0xe75a382cbf2e02f0663c969124c698, 0x0067dc ] } , - BigNum { limbs: [ 0xfa125eb2f4fd03868a188ce214e418, 0xd6e9727aed451c319521298a12cc68, 0x005fe9 ] } , - BigNum { limbs: [ 0xc391a44d095efb7975e7721deb1be9, 0xd069b7229003170842e6e017c538ea, 0x001403 ] } , - BigNum { limbs: [ 0x6bcc9a644f4cbe093e7371e15d9aa1, 0xf0755426209741a1ab941191a967e6, 0x0058d3 ] } , - BigNum { limbs: [ 0x51d7689baf0f40f6c18c8d1ea26560, 0xb6ddd5775cb0f1982c73f8102e9d6d, 0x001b19 ] } , - BigNum { limbs: [ 0x0c955b5cea64c0ee05c87f9e9f3c1a, 0xafe4259272be74657ff0a7b1507505, 0x003f7e ] } , - BigNum { limbs: [ 0xb10ea7a313f73e11fa377f6160c3e7, 0xf76f040b0a89bed4581761f087904e, 0x00346e ] } , - BigNum { limbs: [ 0xe666a5c2df9cb2d4d896cf626846d8, 0xe4ff876a9633305896bb13960c8f2c, 0x002618 ] } , - BigNum { limbs: [ 0xd73d5d3d1ebf4c2b27692f9d97b929, 0xc253a232e71502e1414cf60bcb7626, 0x004dd4 ] } , - BigNum { limbs: [ 0xbbf889dbf8e8bddb1c8289ed299a23, 0x5855b6c6e391861622d60f4365760b, 0x0023c3 ] } , - BigNum { limbs: [ 0x01ab792405734124e37d7512d665de, 0x4efd72d699b6ad23b531fa5e728f48, 0x00502a ] } , - BigNum { limbs: [ 0xb941a332a92d4a81b0e757b270f005, 0x3270acf0731bd5447069e12d31c902, 0x0058d9 ] } , - BigNum { limbs: [ 0x04625fcd552eb47e4f18a74d8f0ffc, 0x74e27cad0a2c5df5679e2874a63c51, 0x001b14 ] } , - BigNum { limbs: [ 0xab1aae50695eea97978c061418d62e, 0xf84bb160a8c047716fcc94c7283abb, 0x000c1a ] } , - BigNum { limbs: [ 0x128954af94fd14686873f8ebe729d3, 0xaf07783cd487ebc8683b74daafca98, 0x0067d2 ] } , - BigNum { limbs: [ 0x83e0458adf3267676574dd34b4eb80, 0xf6130faaa32be7a5a09cbda9aa668b, 0x005565 ] } , - BigNum { limbs: [ 0x39c3bd751f2997989a8b21cb4b1481, 0xb14019f2da1c4b94376b4bf82d9ec8, 0x001e87 ] } , - BigNum { limbs: [ 0x9b5582bb02c0ced2ca7fad01ebd99e, 0x28f557956f50a73b40e99874bf9749, 0x0031ff ] } , - BigNum { limbs: [ 0x224e8044fb9b302d358051fe142663, 0x7e5dd2080df78bfe971e712d186e0a, 0x0041ee ] } , - BigNum { limbs: [ 0x97358ffd2835e0179fb10dc7b7e09a, 0x5c628fafc971827e30d593ecdae326, 0x00343d ] } , - BigNum { limbs: [ 0x266e7302d6261ee8604ef138481f67, 0x4af099edb3d6b0bba73275b4fd222d, 0x003fb0 ] } , - BigNum { limbs: [ 0xf09f2e0d931259ed68dabc68087120, 0x6de3430206e2df37856fcff7cf23d0, 0x004a47 ] } , - BigNum { limbs: [ 0xcd04d4f26b49a51297254297f78ee1, 0x396fe69b76655402529839aa08e182, 0x0029a6 ] } , - BigNum { limbs: [ 0x239fe2eca23d8a2ffb03118ed84431, 0xa9a47fe534eeef9e27ade80b05e8aa, 0x000cbc ] } , - BigNum { limbs: [ 0x9a0420135c1e74d004fced7127bbd0, 0xfdaea9b84859439bb05a2196d21ca9, 0x006730 ] } , - BigNum { limbs: [ 0x2a1a38f6a3b6fe8f951987f938ad2b, 0x83458a0d76b39864dfcb13266a4997, 0x0002e3 ] } , - BigNum { limbs: [ 0x9389ca095aa500706ae67706c752d6, 0x240d9f9006949ad4f83cf67b6dbbbc, 0x00710a ] } , - BigNum { limbs: [ 0x8c7bacfcf8930fa5dc69430696804b, 0xdaa73a4a03ad14b0f63737b0fba78c, 0x003828 ] } , - BigNum { limbs: [ 0x3128560305c8ef5a2396bbf9697fb6, 0xccabef53799b1e88e1d0d1f0dc5dc7, 0x003bc4 ] } , - BigNum { limbs: [ 0x41c51ee8a59134393725e997d5bc54, 0x04fd857667a60a58096d76095edde2, 0x001200 ] } , - BigNum { limbs: [ 0x7bdee41758cacac6c8da15682a43ad, 0xa255a42715a228e1ce9a9398792771, 0x0061ed ] } , - BigNum { limbs: [ 0x875df6abb81f260c9ba571622fbb63, 0xe16ceae000c0920285804ba56e526c, 0x001472 ] } , - BigNum { limbs: [ 0x36460c54463cd8f3645a8d9dd0449e, 0xc5e63ebd7c87a1375287bdfc69b2e7, 0x005f7a ] } , - BigNum { limbs: [ 0xd87c2f39e59e6deeeeca1aa16d8a80, 0x4238ed2bb9ed0e458ccb4bb37c4eb4, 0x003f04 ] } , - BigNum { limbs: [ 0xe527d3c618bd91111135e45e927581, 0x651a3c71c35b24f44b3cbdee5bb69e, 0x0034e9 ] } , - BigNum { limbs: [ 0xa8e932408ef8fe9af064101df4aaec, 0xc4e966202fc4204656c7ce183ff66a, 0x005271 ] } , - BigNum { limbs: [ 0x14bad0bf6f6300650f9beee20b5515, 0xe269c37d4d8412f381403b89980ee9, 0x00217b ] } , - BigNum { limbs: [ 0x4779b6793f73ecc5a0cf907ec9f18a, 0x341b5a6fc0f0ef6b4ff5f1398a4bff, 0x006a04 ] } , - BigNum { limbs: [ 0x762a4c86bee8123a5f306e81360e77, 0x7337cf2dbc5743ce881218684db954, 0x0009e9 ] } , - BigNum { limbs: [ 0x246c157d33115f38932b9a6e8cfe99, 0xcacb5733af7420048419c85f583b44, 0x0054d3 ] } , - BigNum { limbs: [ 0x9937ed82cb4a9fc76cd46491730168, 0xdc87d269cdd4133553ee41427fca0f, 0x001f19 ] } , - BigNum { limbs: [ 0x66cc3649b2a0f556e0ef5255a8bb66, 0x69cd542aaac08bfe20d50ef2cf5df9, 0x0027a8 ] } , - BigNum { limbs: [ 0x56d7ccb64bbb09a91f10acaa57449b, 0x3d85d572d287a73bb732faaf08a75a, 0x004c45 ] } , - BigNum { limbs: [ 0x4e1027da8563eb5e71b3ec6d0ee30f, 0x91127143ce15c9d42c534df287762f, 0x004394 ] } , - BigNum { limbs: [ 0x6f93db2578f813a18e4c1292f11cf2, 0x1640b859af326965abb4bbaf508f24, 0x003059 ] } , - BigNum { limbs: [ 0x5cd9c1c3e9eb0e96329d35d382cbea, 0x9acbe05086d6eb9fb0acf4176bf84d, 0x0007c7 ] } , - BigNum { limbs: [ 0x60ca413c1470f069cd62c92c7d3417, 0x0c87494cf671479a275b158a6c0d06, 0x006c26 ] } , - BigNum { limbs: [ 0x0c7f8078d990609eab3ef9be9764c6, 0x7e6893b89887fad48b354bc330882c, 0x002284 ] } , - BigNum { limbs: [ 0xb124828724cb9e6154c10541689b3b, 0x28ea95e4e4c038654cd2bddea77d27, 0x005169 ] } , - BigNum { limbs: [ 0xe745f877918fb9616de7a77c440a79, 0xadf0e9def788dbbedd6458f7949e6e, 0x003ec7 ] } , - BigNum { limbs: [ 0xd65e0a886ccc459e92185783bbf588, 0xf9623fbe85bf577afaa3b0aa4366e4, 0x003525 ] } , - BigNum { limbs: [ 0x83f0c9b72e57d78383877b779e75e0, 0xd17fadd4e9e678b200c8f2c29f103c, 0x005d7d ] } , - BigNum { limbs: [ 0x39b33948d004277c7c788388618a21, 0xd5d37bc89361ba87d73f16df38f517, 0x00166f ] } , - BigNum { limbs: [ 0xbc1f8283431f31e8a9c8bd0ac6a3a0, 0x8e3592f5016b397a2c35153ca7e451, 0x004ad6 ] } , - BigNum { limbs: [ 0x0184807cbb3ccd17563741f5395c61, 0x191d96a87bdcf9bfabd2f465302102, 0x002917 ] } , - BigNum { limbs: [ 0x4cef8200c1d124e7f3615720c1d1e5, 0xf506e1d066151a864b33dd2a624d24, 0x0005fb ] } , - BigNum { limbs: [ 0x70b480ff3c8ada180c9ea7df3e2e1c, 0xb24c47cd173318b38cd42c7775b82f, 0x006df1 ] } , - BigNum { limbs: [ 0xdd427388dae96f520501edf8907c06, 0xf0f7b16607e60cdbc9e07bc083b40a, 0x003ff5 ] } , - BigNum { limbs: [ 0xe0618f7723728fadfafe11076f83fb, 0xb65b78377562265e0e278de1545148, 0x0033f7 ] } , - BigNum { limbs: [ 0xd7cb9c3bed54f87277f026ca081a65, 0xaa222e0b7f2fec4b90825a95d695f4, 0x0063f3 ] } , - BigNum { limbs: [ 0xe5d866c41107068d880fd835f7e59c, 0xfd30fb91fe1846ee4785af0c016f5e, 0x000ff9 ] } , - BigNum { limbs: [ 0x097dccea879224b6f9a7a05fdd9b14, 0x28a020c17d24e31612606f18054974, 0x004147 ] } , - BigNum { limbs: [ 0xb426361576c9da4906585ea02264ed, 0x7eb308dc00235023c5a79a89d2bbdf, 0x0032a6 ] } , - BigNum { limbs: [ 0x14ecec793bc43b986b6176b24cbb42, 0xcad3b4615ff25b2d59f1a99bd50e4f, 0x0063df ] } , - BigNum { limbs: [ 0xa8b71686c297c367949e884db344bf, 0xdc7f753c1d55d80c7e16600602f704, 0x00100d ] } , - BigNum { limbs: [ 0xf82e16e5cbc1a9be0cc120c4606c68, 0x2f2c3c7946b0b13d8e366e81529353, 0x0048c4 ] } , - BigNum { limbs: [ 0xc575ec1a329a5541f33ede3b9f9399, 0x7826ed24369781fc49d19b208571ff, 0x002b29 ] } , - BigNum { limbs: [ 0xe91e410af1949521fd7c4f1e349a7d, 0x50fdeb3d61c65e129f2996d49223c1, 0x001613 ] } , - BigNum { limbs: [ 0xd485c1f50cc769de0283afe1cb6584, 0x56553e601b81d52738de72cd45e191, 0x005dda ] } , - BigNum { limbs: [ 0x9dbe5d372eb323eaa96815df473791, 0x5a83ef220beccff313358fd1c761af, 0x00728d ] } , - BigNum { limbs: [ 0x1fe5a5c8cfa8db155697e920b8c870, 0x4ccf3a7b715b6346c4d279d010a3a4, 0x000160 ] } , - BigNum { limbs: [ 0x242aaeca33f4000933a9753e0abf20, 0x7a7b59fcf9e1c016e54989054f05b8, 0x005e7b ] } , - BigNum { limbs: [ 0x99795435ca67fef6cc5689c1f540e1, 0x2cd7cfa083667322f2be809c88ff9b, 0x001572 ] } , - BigNum { limbs: [ 0x0366d7bcfa38432d011dfc07a888cf, 0x1bde864f28f6053fcaf72053efdce7, 0x004438 ] } , - BigNum { limbs: [ 0xba3d2b430423bbd2fee202f8577732, 0x8b74a34e54522dfa0d10e94de8286c, 0x002fb5 ] } , - BigNum { limbs: [ 0xe1e0504e9a05e6693171d0bad3fc18, 0x3f7f0d04c44d9b10859932b310adc7, 0x003001 ] } , - BigNum { limbs: [ 0xdbc3b2b164561896ce8e2e452c03e9, 0x67d41c98b8fa9829526ed6eec7578b, 0x0043ec ] } , - BigNum { limbs: [ 0x8368375b1b209f9180d58bcc836816, 0xf5c5d88faac59bbd3b83fc9c5c40ab, 0x00613f ] } , - BigNum { limbs: [ 0x3a3bcba4e33b5f6e7f2a73337c97eb, 0xb18d510dd282977c9c840d057bc4a8, 0x0012ad ] } , - BigNum { limbs: [ 0x6934c02d0c489448f3e5672b5a5d76, 0x55c023f6d9fb32948fe30dce0ec074, 0x004135 ] } , - BigNum { limbs: [ 0x546f42d2f2136ab70c1a97d4a5a28b, 0x519305a6a34d00a54824fbd3c944df, 0x0032b8 ] } , - BigNum { limbs: [ 0x674aca38cfce36722959330e00c1b7, 0xcb76fd46b0cae810ffcce44015aec9, 0x0045d5 ] } , - BigNum { limbs: [ 0x565938c72e8dc88dd6a6cbf1ff3e4a, 0xdbdc2c56cc7d4b28d83b2561c2568a, 0x002e17 ] } , - BigNum { limbs: [ 0x45e97541c060f8d7f6ba92fa1dc369, 0x92ec171bc4a381862e49d3aeb0ea55, 0x005ab8 ] } , - BigNum { limbs: [ 0x77ba8dbe3dfb062809456c05e23c98, 0x14671281b8a4b1b3a9be35f3271afe, 0x001935 ] } , - BigNum { limbs: [ 0xad0d0eafb77eac566095f1ecc2f957, 0x2138ae7a25020d22ca75d2225ca6da, 0x002516 ] } , - BigNum { limbs: [ 0x1096f45046dd52a99f6a0d133d06aa, 0x861a7b23584626170d92377f7b5e79, 0x004ed7 ] } , - BigNum { limbs: [ 0xdbf8e4a46a63dc2f46b14cc8eef262, 0x47b203b8df8f96138258e226307ec6, 0x0009fb ] } , - BigNum { limbs: [ 0xe1ab1e5b93f822d0b94eb237110d9f, 0x5fa125e49db89d2655af277ba7868c, 0x0069f2 ] } , - BigNum { limbs: [ 0x4feb043497fc58b38d8515a5b0eafd, 0x596d4b0068ab29a7a06b463b79c9d3, 0x000691 ] } , - BigNum { limbs: [ 0x6db8fecb665fa64c727ae95a4f1504, 0x4de5de9d149d0992379cc3665e3b80, 0x006d5c ] } , - BigNum { limbs: [ 0x5ab545d2d158ceedab2d0434639a15, 0x0fca138f01bc235290c82563e205b1, 0x006ce6 ] } , - BigNum { limbs: [ 0x62eebd2d2d03301254d2facb9c65ec, 0x9789160e7b8c0fe7473fe43df5ffa2, 0x000707 ] } , - BigNum { limbs: [ 0x88a9431dd26a69f8f5bf7c94f575df, 0x5deb23c6669863555db3acc5836ceb, 0x002e0f ] } , - BigNum { limbs: [ 0x34fabfe22bf195070a40826b0a8a22, 0x496805d716afcfe47a545cdc549868, 0x0045de ] } , - BigNum { limbs: [ 0x2f6d5e0df66e85cb505dc0b299b048, 0xc617f0fc99ad5824a217b990170bd6, 0x00548d ] } , - BigNum { limbs: [ 0x8e36a4f207ed7934afa23e4d664fb9, 0xe13b38a0e39adb1535f05011c0f97d, 0x001f5f ] } , - BigNum { limbs: [ 0xaea85f522d185f3259fd9f313a07a3, 0x836f8b619f8fd6da5b98ea681cbb10, 0x00327b ] } , - BigNum { limbs: [ 0x0efba3add1439fcda6025fcec5f85e, 0x23e39e3bddb85c5f7c6f1f39bb4a43, 0x004172 ] } , - BigNum { limbs: [ 0x6ca6cc85fa3a8466074ca2b011338f, 0x6c6432cafb55a9ee26912d35d4469c, 0x0072f3 ] } , - BigNum { limbs: [ 0x50fd367a04217a99f8b35c4feecc72, 0x3aeef6d281f2894bb176dc6c03beb7, 0x0000fa ] } , - BigNum { limbs: [ 0x82e5156b496a9bb41782536fec3a1b, 0x2ace5c821d2c46e331920498fb10c0, 0x004818 ] } , - BigNum { limbs: [ 0x3abeed94b4f1634be87dab9013c5e6, 0x7c84cd1b601bec56a6760508dcf493, 0x002bd5 ] } , - BigNum { limbs: [ 0x367d4298555040edfdb0754da8119f, 0x794af8128e9b7f31a086992b47b188, 0x00086f ] } , - BigNum { limbs: [ 0x8726c067a90bbe12024f89b257ee62, 0x2e08318aeeacb408378170769053cb, 0x006b7e ] } , - BigNum { limbs: [ 0xec1460768b2c9675a11fcd56dba52e, 0xeb44c4d3ab2e8a64751841896dd82e, 0x004a83 ] } , - BigNum { limbs: [ 0xd18fa289732f688a5ee031a9245ad3, 0xbc0e64c9d219a8d562efc8186a2d24, 0x002969 ] } , - BigNum { limbs: [ 0x7b27c5aecba7d424a40f2d877906ed, 0x8bd7381214061075bbaf735c62728a, 0x006a32 ] } , - BigNum { limbs: [ 0x427c3d5132b42adb5bf0d17886f914, 0x1b7bf18b694222c41c5896457592c9, 0x0009bb ] } , - BigNum { limbs: [ 0xc900da291efb3abe2b290659fca460, 0x9905074ea83b6627c0df94b27365dd, 0x005dee ] } , - BigNum { limbs: [ 0xf4a328d6df60c441d4d6f8a6035ba1, 0x0e4e224ed50ccd12172874ef649f75, 0x0015ff ] } , - BigNum { limbs: [ 0x8ab9244d137048c402cc7b2dc9edbb, 0xe6f824d478f86c73e771bd4ea2c90e, 0x0027bc ] } , - BigNum { limbs: [ 0x32eadeb2eaebb63bfd3383d2361246, 0xc05b04c9044fc6c5f0964c53353c45, 0x004c30 ] } , - BigNum { limbs: [ 0xd755e8f2d005f191eb6617ea425abe, 0x7fc6baaff653d471cedcf5b54d8685, 0x002ba0 ] } , - BigNum { limbs: [ 0xe64e1a0d2e560d6e1499e715bda543, 0x278c6eed86f45ec8092b13ec8a7ecd, 0x00484d ] } , - BigNum { limbs: [ 0x1afd71f847b27e4b7dbb8ad705dc13, 0x31f14b65a3e9d26c7142926b9087a9, 0x0059c1 ] } , - BigNum { limbs: [ 0xa2a69107b6a980b482447428fa23ee, 0x7561de37d95e60cd66c57736477daa, 0x001a2c ] } , - BigNum { limbs: [ 0x88fbcfaaf5caa2625a2f32ed8dbce9, 0x2e58570ef3f0f35b75415536727b44, 0x004fc1 ] } , - BigNum { limbs: [ 0x34a8335508915c9da5d0cc12724318, 0x78fad28e89573fde62c6b46b658a0f, 0x00242c ] } , - BigNum { limbs: [ 0xe632270915026095198d2484b905d5, 0x6d45265665ab6722f9d50533ea0803, 0x002177 ] } , - BigNum { limbs: [ 0xd771dbf6e9599e6ae672da7b46fa2c, 0x3a0e0347179ccc16de33046dedfd4f, 0x005276 ] } , - BigNum { limbs: [ 0x6cafe8dae5e7cb2abfe1f0c02c3040, 0x5595dd0c70084ffd4705ba2749c170, 0x000555 ] } , - BigNum { limbs: [ 0x50f41a25187433d5401e0e3fd3cfc1, 0x51bd4c910d3fe33c91024f7a8e43e3, 0x006e98 ] } , - BigNum { limbs: [ 0x5472ccdbb2142b6ff9012b3255ff9b, 0x04de4f38c29ec387bd5674cd63e796, 0x0073a3 ] } , - BigNum { limbs: [ 0x693136244c47d39006fed3cdaa0066, 0xa274da64baa96fb21ab194d4741dbd, 0x00004a ] } , - BigNum { limbs: [ 0x2796b14093750a1b54a53a70d4265b, 0x9575b02b97ede59ff02d7965b2143c, 0x000e69 ] } , - BigNum { limbs: [ 0x960d51bf6ae6f4e4ab5ac48f2bd9a6, 0x11dd7971e55a4d99e7da903c25f117, 0x006584 ] } , - BigNum { limbs: [ 0x5ce232818f6d02784a153b636d653e, 0xc132013455cccb72eb7f83ff4b32f9, 0x00168d ] } , - BigNum { limbs: [ 0x60c1d07e6eeefc87b5eac39c929ac3, 0xe6212869277b67c6ec8885a28cd25a, 0x005d5f ] } , - BigNum { limbs: [ 0xdfae94d32a526430c7ec90435fd3d8, 0xfb315c99b3560f738ec8f0d52f0eb7, 0x0039ac ] } , - BigNum { limbs: [ 0xddf56e2cd4099acf38136ebca02c29, 0xac21cd03c9f223c6493f18cca8f69b, 0x003a40 ] } , - BigNum { limbs: [ 0xbaf1d05095002fdd8017c1ac3e2213, 0x162593515198ee00a3b7b4351ee023, 0x0008fc ] } , - BigNum { limbs: [ 0x02b232af695bcf227fe83d53c1ddee, 0x912d964c2baf45393450556cb92530, 0x006af1 ] } , - BigNum { limbs: [ 0x1761e1b0f909021a23424d59fe3fde, 0xe21a8e1305f1f85d77efa39074c1e1, 0x005721 ] } , - BigNum { limbs: [ 0xa642214f0552fce5dcbdb1a601c023, 0xc5389b8a77563adc60186611634372, 0x001ccb ] } , - BigNum { limbs: [ 0x5ae294d8dd573fffb41b3f2f682eed, 0xb7d1bdda337e9d5126d86f1fed63e9, 0x003911 ] } , - BigNum { limbs: [ 0x62c16e272104bf004be4bfd097d114, 0xef816bc349c995e8b12f9a81eaa16a, 0x003adb ] } , - BigNum { limbs: [ 0xd8da20debfe655515bbca46b58ca6f, 0x2ba635623a828636d4648656a208e1, 0x0014e8 ] } , - BigNum { limbs: [ 0xe4c9e2213e75a9aea4435a94a73592, 0x7bacf43b42c5ad0303a3834b35fc71, 0x005f05 ] } , - BigNum { limbs: [ 0x0eff902da996a111c53e42d167a2f3, 0x5f36c9c99822cc2f7ab68a9c648979, 0x001626 ] } , - BigNum { limbs: [ 0xaea472d254c55dee3ac1bc2e985d0e, 0x481c5fd3e525670a5d517f05737bda, 0x005dc7 ] } , - BigNum { limbs: [ 0x2832b9e94931ba5e2e4bcb392b8c79, 0xb0281754e39497f22b5e1206600631, 0x006a95 ] } , - BigNum { limbs: [ 0x95714916b52a44a1d1b433c6d47388, 0xf72b124899b39b47aca9f79b77ff22, 0x000957 ] } , - BigNum { limbs: [ 0x7ff86c9800ce933f46ed02914494b4, 0xfdfbe2924212794dff836b2b5a7639, 0x0001af ] } , - BigNum { limbs: [ 0x3dab9667fd8d6bc0b912fc6ebb6b4d, 0xa957470b3b35b9ebd8849e767d8f1a, 0x00723d ] } , - BigNum { limbs: [ 0xa33631f8fd1d6facd34d18272a545a, 0x479e3532f624056dfaea780689ee8d, 0x002751 ] } , - BigNum { limbs: [ 0x1a6dd107013e8f532cb2e6d8d5aba7, 0x5fb4f46a87242dcbdd1d919b4e16c6, 0x004c9c ] } , - BigNum { limbs: [ 0xdea62d1f54d511e3bc85d76ea76833, 0x123c1d3102d814f924706550b0ee18, 0x002ff2 ] } , - BigNum { limbs: [ 0xdefdd5e0a986ed1c437a27915897ce, 0x95170c6c7a701e40b397a45127173a, 0x0043fb ] } , - BigNum { limbs: [ 0x01fd6e8903fd24ca9e402838e7b804, 0xe66208321109df5658c6934f9225a0, 0x0038b7 ] } , - BigNum { limbs: [ 0xbba69476fa5eda3561bfd6c71847fd, 0xc0f1216b6c3e53e37f41765245dfb3, 0x003b35 ] } , - BigNum { limbs: [ 0x9f54c6d7b59e1bc86d5f8eb280c2a5, 0x033574a96bc88ca392e40dc1957a56, 0x004b03 ] } , - BigNum { limbs: [ 0x1e4f3c2848bde33792a0704d7f3d5c, 0xa41db4f4117fa6964523fbe0428afd, 0x0028ea ] } , - BigNum { limbs: [ 0x7412898d6ec5a684b8c9b4446fd582, 0xa0bc8b54424d416ef204603f8b860b, 0x004d22 ] } , - BigNum { limbs: [ 0x499179728f96587b47364abb902a7f, 0x06969e493afaf1cae603a9624c7f48, 0x0026cb ] } , - BigNum { limbs: [ 0x8ef8cfb50c7a249284f53bac1d176d, 0xe03a90185ce536cb0bbf36a5147dbd, 0x003f05 ] } , - BigNum { limbs: [ 0x2eab334af1e1da6d7b0ac353e2e894, 0xc71899852062fc6ecc48d2fcc38796, 0x0034e7 ] } , - BigNum { limbs: [ 0x02f98d2c83947e2dba2893980d82a1, 0x3e116737fbc055192d14fd3355fac4, 0x006a2e ] } , - BigNum { limbs: [ 0xbaaa75d37ac780d245d76b67f27d60, 0x6941c2658187de20aaf30c6e820a8f, 0x0009bf ] } , - BigNum { limbs: [ 0x704befa1add72aad7c381607a6dc93, 0xd71fcfdec95d9e6f0df792f71cd2b9, 0x004429 ] } , - BigNum { limbs: [ 0x4d58135e5084d45283c7e8f859236e, 0xd03359beb3ea94caca1076aabb329a, 0x002fc3 ] } , - BigNum { limbs: [ 0xacbe2262b418a2638837860d447b9d, 0xb031c71b320491e8eac686cb1238e2, 0x005248 ] } , - BigNum { limbs: [ 0x10e5e09d4a435c9c77c878f2bb8464, 0xf72162824b43a150ed4182d6c5cc71, 0x0021a4 ] } , - BigNum { limbs: [ 0xc886804b43a5dacc3ea2ee65d4ecb0, 0xe237f84bb358a39307fe3d83d27933, 0x006cd8 ] } , - BigNum { limbs: [ 0xf51d82b4bab62433c15d109a2b1351, 0xc51b3151c9ef8fa6d009cc1e058c1f, 0x000714 ] } , - BigNum { limbs: [ 0x88b4c47ce02d29745cf81a1cf54e2d, 0x9e819ea54579f978a898349e337379, 0x000665 ] } , - BigNum { limbs: [ 0x34ef3e831e2ed58ba307e4e30ab1d4, 0x08d18af837ce39c12f6fd503a491da, 0x006d88 ] } , - BigNum { limbs: [ 0x8a365beaee9aa1222a95355823a93a, 0x2a0011d0128b4df1c0100c05fb20e5, 0x0033dc ] } , - BigNum { limbs: [ 0x336da7150fc15dddd56ac9a7dc56c7, 0x7d5317cd6abce54817f7fd9bdce46e, 0x004011 ] } , - BigNum { limbs: [ 0x4eda2c912d8baded283c9c8d205bfe, 0xe1810ab167f245b80dec4d09a98c31, 0x00552b ] } , - BigNum { limbs: [ 0x6ec9d66ed0d05112d7c36272dfa403, 0xc5d21eec1555ed81ca1bbc982e7922, 0x001ec1 ] } , - BigNum { limbs: [ 0xc31471f92176911381369eee0865c5, 0x8c9032027765b113e55827adc0428d, 0x0020ff ] } , - BigNum { limbs: [ 0xfa8f9106dce56dec7ec96011f79a3c, 0x1ac2f79b05e28225f2afe1f417c2c5, 0x0052ee ] } , - BigNum { limbs: [ 0xb518d7c5636f87a2aab21fcede5484, 0xacff35d604c8bf73e9ca8faec02fe6, 0x003e6d ] } , - BigNum { limbs: [ 0x088b2b3a9aec775d554ddf3121ab7d, 0xfa53f3c7787f73c5ee3d79f317d56d, 0x00357f ] } , - BigNum { limbs: [ 0x1286d896cbfaaefcabcc3fa54d8ae9, 0x13027cc426755f5419542774017907, 0x006214 ] } , - BigNum { limbs: [ 0xab1d2a69326150035433bf5ab27518, 0x9450acd956d2d3e5beb3e22dd68c4c, 0x0011d9 ] } , - BigNum { limbs: [ 0x09812ba3c0f58f7970653080f3fa54, 0x9e591bf80a2cb8ea6c14c8a4a47832, 0x004267 ] } , - BigNum { limbs: [ 0xb422d75c3d666f868f9ace7f0c05ad, 0x08fa0da5731b7a4f6bf340fd338d21, 0x003186 ] } , - BigNum { limbs: [ 0x1c675954836f9c7261f7a14309d84e, 0x7a684366240451bc61eab00baea204, 0x0011f6 ] } , - BigNum { limbs: [ 0xa13ca9ab7aec628d9e085dbcf627b3, 0x2ceae6375943e17d761d599629634f, 0x0061f7 ] } , - BigNum { limbs: [ 0x6360aeba1c512d9fcacc28c5b97ee3, 0x96d85c56965d5c00d547b7fce38aca, 0x006354 ] } , - BigNum { limbs: [ 0x5a435445e20ad1603533d63a46811e, 0x107acd46e6ead73902c051a4f47a89, 0x001099 ] } , - BigNum { limbs: [ 0xae4e968224f635199d5428ad4548ef, 0x7eea765f85d55b02af61b8a3169be9, 0x003a3f ] } , - BigNum { limbs: [ 0x0f556c7dd965c9e662abd652bab712, 0x2868b33df772d83728a650fec1696a, 0x0039ae ] } , - BigNum { limbs: [ 0xb44b7a25558c2344733b2c1242b92e, 0xf905524c46db336792732ae950f775, 0x006c09 ] } , - BigNum { limbs: [ 0x095888daa8cfdbbb8cc4d2edbd46d3, 0xae4dd751366cffd24594deb8870dde, 0x0007e3 ] } , - BigNum { limbs: [ 0x62b737fa19789e9f7fc03621b99719, 0x8e1c05c1d8cd5a6e1f37c1ae346a47, 0x0032a2 ] } , - BigNum { limbs: [ 0x5aeccb05e4e36060803fc8de4668e8, 0x193723dba47ad8cbb8d047f3a39b0c, 0x00414b ] } , - BigNum { limbs: [ 0xa5504e11f3ccdbfa9af80fd15595f8, 0x9cc25f53a7f44defe519c94b64d289, 0x0046cc ] } , - BigNum { limbs: [ 0x1853b4ee0a8f23056507ef2eaa6a09, 0x0a90ca49d553e549f2ee40567332ca, 0x002d21 ] } , - BigNum { limbs: [ 0x977f0e8581983b79cde8dbf0bb8e08, 0xfdc7ec01cb9fc5c6f227e1ebd71b3d, 0x003bc0 ] } , - BigNum { limbs: [ 0x2624f47a7cc3c3863217230f4471f9, 0xa98b3d9bb1a86d72e5e027b600ea16, 0x00382c ] } , - BigNum { limbs: [ 0x3a6768f3b303ee0a4b3949fb7851e2, 0x855f6e0a87bae9f8a2392c25156520, 0x005809 ] } , - BigNum { limbs: [ 0x833c9a0c4b5810f5b4c6b50487ae1f, 0x21f3bb92f58d494135cedd7cc2a033, 0x001be4 ] } , - BigNum { limbs: [ 0xca21303074bde2995b954a966b763b, 0xdc985ccb1c3452822e1847322d7020, 0x004be9 ] } , - BigNum { limbs: [ 0xf382d2cf899e1c66a46ab4699489c6, 0xcabaccd26113e0b7a9efc26faa9532, 0x002803 ] } , - BigNum { limbs: [ 0x54932cc64f5de78ab495ab0223b36d, 0x1e85b426c5243ebbdbafc9bba6611a, 0x00521d ] } , - BigNum { limbs: [ 0x6910d639aefe17754b6a53fddc4c94, 0x88cd7576b823f47dfc583fe631a439, 0x0021d0 ] } , - BigNum { limbs: [ 0xb042c63c9261c9707b77dd1bca9b98, 0x9e01c27b06aa40abf1469ded1c171d, 0x0044c2 ] } , - BigNum { limbs: [ 0x0d613cc36bfa358f848821e4356469, 0x09516722769df28de6c16bb4bbee36, 0x002f2b ] } , - BigNum { limbs: [ 0x47d12a3e69b4fc51eec449971cc3c5, 0xa9b76b7237ecdcbceec5bd388b5d99, 0x001a7e ] } , - BigNum { limbs: [ 0x75d2d8c194a702ae113bb568e33c3c, 0xfd9bbe2b455b567ce9424c694ca7ba, 0x00596e ] } , - BigNum { limbs: [ 0xe72dbe134c6fdb4a1d36cf8df8f992, 0x70e938e86c9842198f6ce41536c829, 0x00675d ] } , - BigNum { limbs: [ 0xd67644ecb1ec23b5e2c92f7207066f, 0x3669f0b510aff120489b258ca13d29, 0x000c90 ] } , - BigNum { limbs: [ 0xfa90da84ad6d9214ef82ee886d1cd0, 0xb15e939a0f6dbd6391899119cc2cb9, 0x00545a ] } , - BigNum { limbs: [ 0xc313287b50ee6ceb107d107792e331, 0xf5f496036dda75d6467e78880bd899, 0x001f92 ] } , - BigNum { limbs: [ 0xb1cf1c5815d3657a771377ed444ace, 0xe2ec3fa911ac9989acfafbf7f39399, 0x004085 ] } , - BigNum { limbs: [ 0x0bd4e6a7e888998588ec8712bbb533, 0xc466e9f46b9b99b02b0d0da9e471ba, 0x003367 ] } , - BigNum { limbs: [ 0x81ba8e7f3907e60ba25204854a8ad0, 0xbcbce618e9430273f54bd20084ca90, 0x000d38 ] } , - BigNum { limbs: [ 0x3be97480c55418f45dadfa7ab57531, 0xea964384940530c5e2bc37a1533ac3, 0x0066b4 ] } , - BigNum { limbs: [ 0xfb60fcbc1643d1cacdc1127f8b8baa, 0xaa957b88a51a4ed6c2aa55822b6178, 0x0013cb ] } , - BigNum { limbs: [ 0xc2430643e8182d35323eec80747457, 0xfcbdae14d82de463155db41faca3da, 0x006021 ] } , - BigNum { limbs: [ 0xf6013a54b1701bdd62d7512f905e61, 0x709ec2e4ae5c12c3256f89c16f7e9a, 0x005c84 ] } , - BigNum { limbs: [ 0xc7a2c8ab4cebe3229d28add06fa1a0, 0x36b466b8ceec2076b2987fe06886b8, 0x001769 ] } , - BigNum { limbs: [ 0xe4fb89e9608365e5f72a1a1d1fecbe, 0x8e2378d075aa842a7367e53ce7ad5c, 0x000c53 ] } , - BigNum { limbs: [ 0xd8a879169dd8991a08d5e4e2e01343, 0x192fb0cd079daf0f64a02464f057f6, 0x00679a ] } , - BigNum { limbs: [ 0x085bae7ee5110f59a4d711ae82bcad, 0xc91bd75f1873557efa4e10935a9bd9, 0x0073d3 ] } , - BigNum { limbs: [ 0xb5485481194aefa65b28ed517d4354, 0xde37523e64d4ddbaddb9f90e7d697a, 0x000019 ] } , - BigNum { limbs: [ 0x2695152f6b5142e0be1f5c13db389d, 0x30a683d17da6a1837e5b131e431c9c, 0x0008be ] } , - BigNum { limbs: [ 0x970eedd0930abc1f41e0a2ec24c764, 0x76aca5cbffa191b659acf68394e8b7, 0x006b2f ] } , - BigNum { limbs: [ 0xd361931cc62e593329dcd088c58421, 0xea840c7c1995eabfe2b2e8b314fbe6, 0x00142c ] } , - BigNum { limbs: [ 0xea426fe3382da5ccd6232e773a7be0, 0xbccf1d2163b24879f55520eec3096c, 0x005fc0 ] } , - BigNum { limbs: [ 0x5fb6ea66dac1767674faaa2de759e5, 0xd63332a582db767b4506131aef995a, 0x002f2b ] } , - BigNum { limbs: [ 0x5ded1899239a88898b0554d218a61c, 0xd11ff6f7fa6cbcbe9301f686e86bf9, 0x0044c1 ] } , - BigNum { limbs: [ 0x5b024105902954e4ad61be21e283b4, 0x4fcaf05b2bafb727f1ca264d950f2d, 0x001f07 ] } , - BigNum { limbs: [ 0x62a1c1fa6e32aa1b529e40de1d7c4d, 0x5788394251987c11e63de35442f626, 0x0054e6 ] } , - BigNum { limbs: [ 0x9a5bc71498515bed93e370bba575a6, 0x94b0ff14fd213c43dd5ed570047253, 0x001cc7 ] } , - BigNum { limbs: [ 0x23483beb660aa3126c1c8e445a8a5b, 0x12a22a888026f6f5faa93431d39300, 0x005726 ] } , - BigNum { limbs: [ 0xea597cd61bb86ea86b9b5b82cb3fe2, 0xbdf521012435a0ccc0cf85b8c3e0c9, 0x000bec ] } , - BigNum { limbs: [ 0xd34a8629e2a390579464a37d34c01f, 0xe95e089c5912926d173883e9142489, 0x006800 ] } , - BigNum { limbs: [ 0xaaac595d440f8fdd767be7f73b818b, 0x1a01d84f100c913ebd351085edf455, 0x000791 ] } , - BigNum { limbs: [ 0x12f7a9a2ba4c6f2289841708c47e76, 0x8d51514e6d3ba1fb1ad2f91bea10fe, 0x006c5c ] } , - BigNum { limbs: [ 0xad1f311ba4999ab05556eb7751a8b4, 0xb9c6e5b1499251bb55939bfc3554dd, 0x002c15 ] } , - BigNum { limbs: [ 0x1084d1e459c2644faaa91388ae574d, 0xed8c43ec33b5e17e82746da5a2b076, 0x0047d7 ] } , - BigNum { limbs: [ 0xc41cf5f649c2caa6b10cd443088a48, 0xd4193fdfabdf6a36f4dc4f41628b76, 0x0051e1 ] } , - BigNum { limbs: [ 0xf9870d09b49934594ef32abcf775b9, 0xd339e9bdd168c902e32bba607579dc, 0x00220b ] } , - BigNum { limbs: [ 0x034e7b311b4055dde7503cb04c0494, 0x805eadb082b5d28e3de3258a2c9729, 0x0072e1 ] } , - BigNum { limbs: [ 0xba5587cee31ba92218afc24fb3fb6d, 0x26f47becfa9260ab9a24e417ab6e2a, 0x00010c ] } , - BigNum { limbs: [ 0x0c93e7b593f4021a04e45cdc589b09, 0x4da1d947613f44b714ea7b8d817caa, 0x005454 ] } , - BigNum { limbs: [ 0xb1101b4a6a67fce5fb1ba223a764f8, 0x59b150561c08ee82c31d8e145688a9, 0x001f99 ] } , - BigNum { limbs: [ 0x89bc1b0ba34703c87c4d9db4144f3f, 0x3d4962ba6f83539c469cd2fecbb14f, 0x0012b7 ] } , - BigNum { limbs: [ 0x33e7e7f45b14fb3783b2614bebb0c2, 0x6a09c6e30dc4df9d916b36a30c5404, 0x006136 ] } , - BigNum { limbs: [ 0x7eec846c006128d2a2f0a2ccaca02b, 0x7557a89b76dab0a2fe5e4300c9e041, 0x000f96 ] } , - BigNum { limbs: [ 0x3eb77e93fdfad62d5d0f5c33535fd6, 0x31fb8102066d8296d9a9c6a10e2512, 0x006457 ] } , - BigNum { limbs: [ 0x2dce7fa62abef76ef474639997b524, 0x29c6dfb12d903ca9ca762e25f67b62, 0x00208a ] } , - BigNum { limbs: [ 0x8fd58359d39d07910b8b9b66684add, 0x7d8c49ec4fb7f6900d91db7be189f1, 0x005363 ] } , - BigNum { limbs: [ 0x62091eff70e87c654f15578a055fef, 0x3070991cc8391661416356317928c9, 0x003197 ] } , - BigNum { limbs: [ 0x5b9ae4008d73829ab0eaa775faa012, 0x76e29080b50f1cd896a4b3705edc8a, 0x004256 ] } , - BigNum { limbs: [ 0x698e3b1cd304260eb391595bd738ae, 0x7ee150e18bb4ab3522894f9558bca1, 0x00154a ] } , - BigNum { limbs: [ 0x5415c7e32b57d8f14c6ea5a428c753, 0x2871d8bbf1938804b57eba0c7f48b2, 0x005ea3 ] } , - BigNum { limbs: [ 0x7857428dac417e211b67cf18c0fb8b, 0xe5f7dcd8c7dea2e01e9d23c8f5d8b3, 0x00452b ] } , - BigNum { limbs: [ 0x454cc072521a80dee4982fe73f0476, 0xc15b4cc4b5699059b96ae5d8e22ca0, 0x002ec1 ] } , - BigNum { limbs: [ 0x53628e062aca3b3e43f1d08abbb190, 0xd4907a9e2dcc23063173a924477b65, 0x001b8d ] } , - BigNum { limbs: [ 0x6a4174f9d391c3c1bc0e2e75444e71, 0xd2c2aeff4f7c1033a694607d9089ee, 0x00585f ] } , - BigNum { limbs: [ 0xb62450509f2296b6734e3efb28ae27, 0x07b8b435dcf86444e95bfbb6755b71, 0x0044ac ] } , - BigNum { limbs: [ 0x077fb2af5f3968498cb1c004d751da, 0x9f9a7567a04fcef4eeac0deb62a9e2, 0x002f41 ] } , - BigNum { limbs: [ 0x3e58e0117792f291c40fe2b678bf0b, 0xe2497ad927d2bdc9f8d4e596394c91, 0x0030ca ] } , - BigNum { limbs: [ 0x7f4b22ee86c90c6e3bf01c498740f6, 0xc509aec45575756fdf33240b9eb8c2, 0x004322 ] } , - BigNum { limbs: [ 0x5aa4a233e87d5e371d22c02ef82b68, 0x9a759829c14af4ad4275ba9c8f396e, 0x0027d1 ] } , - BigNum { limbs: [ 0x62ff60cc15dea0c8e2dd3ed107d499, 0x0cdd9173bbfd3e8c95924f0548cbe5, 0x004c1c ] } , - BigNum { limbs: [ 0xf3aa58e99269933f868ef74e34cedd, 0x6f2c61079dc8e838f3f4089133567b, 0x005b57 ] } , - BigNum { limbs: [ 0xc9f9aa166bf26bc0797107b1cb3124, 0x3826c895df7f4b00e4140110a4aed7, 0x001896 ] } , - BigNum { limbs: [ 0x5284eb9442ac1780f17eea495f2fba, 0xc09d6c47080906b54811a792aaebb3, 0x0051f2 ] } , - BigNum { limbs: [ 0x6b1f176bbbafe77f0e8114b6a0d047, 0xe6b5bd56753f2c848ff6620f2d19a0, 0x0021fa ] } , - BigNum { limbs: [ 0x98c422100bf610460bbc401371b569, 0xd623e1132e47a55bd37ad1ae91d283, 0x000936 ] } , - BigNum { limbs: [ 0x24dfe0eff265eeb9f443beec8e4a98, 0xd12f488a4f008dde048d37f34632d0, 0x006ab6 ] } , - BigNum { limbs: [ 0x346b65fb9f8e796ed42fc106e8beda, 0x50dab151a016e7d060c85744e084cb, 0x006a04 ] } , - BigNum { limbs: [ 0x89389d045ecd85912bd03df9174127, 0x5678784bdd314b69773fb25cf78088, 0x0009e9 ] } , - BigNum { limbs: [ 0x0adfc6d985a5ae6c8200cb4d658f9a, 0x9751fa53b16c827980386401953d4b, 0x0040f7 ] } , - BigNum { limbs: [ 0xb2c43c2678b650937dff33b29a7067, 0x10012f49cbdbb0c057cfa5a042c808, 0x0032f6 ] } , - BigNum { limbs: [ 0x33c8f960a3b828e30637eec3c90efb, 0xa350bec134a6681543e548f045c8cf, 0x0031de ] } , - BigNum { limbs: [ 0x89db099f5aa3d61cf9c8103c36f106, 0x04026adc48a1cb249422c0b1923c84, 0x00420f ] } , - BigNum { limbs: [ 0xaa8aa2ae8d483855c0e05deca56e9e, 0xf72ff852fa6c34f6da3a469aee95f2, 0x000430 ] } , - BigNum { limbs: [ 0x131960517113c6aa3f1fa1135a9163, 0xb023314a82dbfe42fdcdc306e96f61, 0x006fbc ] } , - BigNum { limbs: [ 0x14c45026a15310452a6be7a15f8884, 0xd5f6165507cff94f5f321dcc8058eb, 0x006447 ] } , - BigNum { limbs: [ 0xa8dfb2d95d08eebad594175ea0777d, 0xd15d1348757839ea78d5ebd557ac68, 0x000fa5 ] } , - BigNum { limbs: [ 0x090554eb33fa5104a58b430e6996b2, 0x2e6efad085ce099ee55f6c643d7050, 0x006f48 ] } , - BigNum { limbs: [ 0xb49eae14ca61adfb5a74bbf196694f, 0x78e42eccf77a299af2a89d3d9a9503, 0x0004a5 ] } , - BigNum { limbs: [ 0xf8278851c1fee5d03c6ec52cf53357, 0x3d1b421904d628771e64628611266c, 0x0020ee ] } , - BigNum { limbs: [ 0xc57c7aae3c5d192fc39139d30accaa, 0x6a37e78478720ac2b9a3a71bc6dee6, 0x0052ff ] } , - BigNum { limbs: [ 0xfdbf32b43aaca442be6ce09527043d, 0xf330ba7045942a14415e06f2962639, 0x00210d ] } , - BigNum { limbs: [ 0xbfe4d04bc3af5abd41931e6ad8fbc4, 0xb4226f2d37b4092596aa02af41df19, 0x0052df ] } , - BigNum { limbs: [ 0x605780acc9fc3e25679d4205bead5c, 0xf0d824781574c5a95982ab88f5b571, 0x005d86 ] } , - BigNum { limbs: [ 0x5d4c8253345fc0da9862bcfa4152a5, 0xb67b052567d36d907e855e18e24fe2, 0x001666 ] } , - BigNum { limbs: [ 0x9338ba645487f7e22b885d570466be, 0x78365db99a53bb71d2203317320520, 0x001c0a ] } , - BigNum { limbs: [ 0x2a6b489ba9d4071dd477a1a8fb9943, 0x2f1ccbe3e2f477c805e7d68aa60033, 0x0057e3 ] } , - BigNum { limbs: [ 0xa2eeb13cd7baac4a7da843d1a28e26, 0xeafd1a52ea67ca3184a7653385a26c, 0x0027f3 ] } , - BigNum { limbs: [ 0x1ab551c326a152b58257bb2e5d71db, 0xbc560f4a92e069085360a46e5262e7, 0x004bf9 ] } , - BigNum { limbs: [ 0x650a86f42f3f803712a3528462d455, 0xf451d76cf84877a580dbf24a0a84e3, 0x005a54 ] } , - BigNum { limbs: [ 0x58997c0bcf1c7ec8ed5cac7b9d2bac, 0xb301523084ffbb94572c1757cd8070, 0x001998 ] } , - BigNum { limbs: [ 0xfe1e6e95d0aec327463e76b0c70fbe, 0x79260464e8ae99392a6eec4a9e9cda, 0x006da8 ] } , - BigNum { limbs: [ 0xbf85946a2dad3bd8b9c1884f38f043, 0x2e2d253894999a00ad991d57396878, 0x000645 ] } , - BigNum { limbs: [ 0x43d3573392c9879302a025f9ab23ba, 0x149d6f7fbd6ce4d8804dbd8dc283b8, 0x0058ba ] } , - BigNum { limbs: [ 0x79d0abcc6b92776cfd5fd90654dc47, 0x92b5ba1dbfdb4e6157ba4c1415819b, 0x001b33 ] } , - BigNum { limbs: [ 0x54d02ff707ac89dc982deab639eb06, 0x2c879036d62fae65b5bdd485b39aa9, 0x005561 ] } , - BigNum { limbs: [ 0x68d3d308f6af752367d21449c614fb, 0x7acb9966a71884d4224a351c246aaa, 0x001e8c ] } , - BigNum { limbs: [ 0xec6f87c86e9c681df925ed5a2c9cfb, 0x9d4188a6785336fb4d3828a9b3a648, 0x001da1 ] } , - BigNum { limbs: [ 0xd1347b378fbf96e206da11a5d36306, 0x0a11a0f704f4fc3e8acfe0f8245f0a, 0x00564c ] } , - BigNum { limbs: [ 0x105880c703465c32a08467ac2436b1, 0x1edd08521ea1e7c6431e5ed67dde34, 0x004837 ] } , - BigNum { limbs: [ 0xad4b8238fb15a2cd5f7b9753dbc950, 0x8876214b5ea64b7394e9aacb5a271f, 0x002bb6 ] } , - BigNum { limbs: [ 0x59a409cc7e6f2bec383fc00e85dfce, 0xfb64ad9af424672ed81a5a6a224a05, 0x0057b3 ] } , - BigNum { limbs: [ 0x63fff9337fecd313c7c03ef17a2033, 0xabee7c028923cc0affedaf37b5bb4e, 0x001c39 ] } , - BigNum { limbs: [ 0x2c020814b3252933ddfe46cb18b5fd, 0x17f7a1c5dcf7a24ece69d503c0a1b8, 0x001392 ] } , - BigNum { limbs: [ 0x91a1faeb4b36d5cc2201b834e74a04, 0x8f5b87d7a05090eb099e349e17639b, 0x00605b ] } , - BigNum { limbs: [ 0x1ac4b576dc734f0e79877c1f463519, 0xdc11933326e6bab294408812d20036, 0x006cf9 ] } , - BigNum { limbs: [ 0xa2df4d8921e8aff1867882e0b9cae8, 0xcb41966a5661788743c7818f06051d, 0x0006f3 ] } , - BigNum { limbs: [ 0x6146b71a452f83a5498f85c0acb37c, 0x283cd146ddd312b729e1be36f038c6, 0x0039e4 ] } , - BigNum { limbs: [ 0x5c5d4be5b92c7b5ab670793f534c85, 0x7f1658569f752082ae264b6ae7cc8d, 0x003a09 ] } , - BigNum { limbs: [ 0x566e02605d2bed6065f959c6233844, 0xb1b1fdace98f0b8e3d39277bb259bf, 0x00209b ] } , - BigNum { limbs: [ 0x6736009fa130119f9a06a539dcc7bd, 0xf5a12bf093b927ab9acee22625ab94, 0x005351 ] } , - BigNum { limbs: [ 0x98e105959c45d394c82e5f7c447821, 0xface0536e215d0655a98d9383150aa, 0x0052a6 ] } , - BigNum { limbs: [ 0x24c2fd6a62162b6b37d19f83bb87e0, 0xac8524669b3262d47d6f3069a6b4a9, 0x002146 ] } , - BigNum { limbs: [ 0x1b59672b8d8e9735f5fdde513fd05d, 0x6bab49ec3a4032bec9c0ddf3eb781a, 0x001c0d ] } , - BigNum { limbs: [ 0xa24a9bd470cd67ca0a0220aec02fa4, 0x3ba7dfb14308007b0e472badec8d39, 0x0057e0 ] } , - BigNum { limbs: [ 0xfe232c77e099e5f37af228a5555107, 0x604a7d36bde4eb9bf8f241eea27b8f, 0x005842 ] } , - BigNum { limbs: [ 0xbf80d6881dc2190c850dd65aaaaefa, 0x4708ac66bf63479ddf15c7b33589c3, 0x001bab ] } , - BigNum { limbs: [ 0xe6dc9e07d85957dd743e3e181c020c, 0x5a641cf84e20bae9ce1c8b230a5b4f, 0x006d95 ] } , - BigNum { limbs: [ 0xd6c764f82602a7228bc1c0e7e3fdf5, 0x4cef0ca52f27785009eb7e7ecdaa03, 0x000658 ] } , - BigNum { limbs: [ 0x490e86e2d7338abbcf6ee1d10fd295, 0xa69185ee8e032bfd6b56e99da531ec, 0x000b63 ] } , - BigNum { limbs: [ 0x74957c1d2728744430911d2ef02d6c, 0x00c1a3aeef45073c6cb1200432d367, 0x00688a ] } , - BigNum { limbs: [ 0x0a04502ae38471b8c15bec5cf65885, 0x0e3dc84e44464df690801e7d69a869, 0x0036b0 ] } , - BigNum { limbs: [ 0xb39fb2d51ad78d473ea412a309a77c, 0x9915614f3901e5434787eb246e5cea, 0x003d3d ] } , - BigNum { limbs: [ 0x4ba05c89541c50c9fbe64484b58cd2, 0x86c754f73a316f5b3e6a6d45087bff, 0x0053e0 ] } , - BigNum { limbs: [ 0x7203a676aa3fae360419ba7b4a732f, 0x208bd4a64316c3de999d9c5ccf8954, 0x00200d ] } , - BigNum { limbs: [ 0xf28b0bf4e7f5b784b6000d14e250c9, 0x58bfeea7581bc57449c63c5f5a46f3, 0x007351 ] } , - BigNum { limbs: [ 0xcb18f70b1666477b49fff1eb1daf38, 0x4e933af6252c6dc58e41cd427dbe5f, 0x00009c ] } , - BigNum { limbs: [ 0x783c383a36e40ab3a904c6992c57f8, 0xa79f979d52ecfbb250856e03cd4840, 0x000c39 ] } , - BigNum { limbs: [ 0x4567cac5c777f44c56fb3866d3a809, 0xffb392002a5b378787829b9e0abd13, 0x0067b3 ] } , - BigNum { limbs: [ 0xe10354b641c46fd6140cc679fff377, 0xfb8d71dd416366c2aa155935f02c7b, 0x002015 ] } , - BigNum { limbs: [ 0xdca0ae49bc978f29ebf33886000c8a, 0xabc5b7c03be4cc772df2b06be7d8d7, 0x0053d7 ] } , - BigNum { limbs: [ 0x299b9b052b53f2009e25cba2de7398, 0x0a08ba66c215b3285fed26b654cc6e, 0x001a83 ] } , - BigNum { limbs: [ 0x940867fad3080cff61da335d218c69, 0x9d4a6f36bb328011781ae2eb8338e5, 0x00596a ] } , - BigNum { limbs: [ 0x69789b07c212e561c334712a894f0c, 0xf99bf33815af9dee448a6bfa62fce9, 0x0029ab ] } , - BigNum { limbs: [ 0x542b67f83c49199e3ccb8dd576b0f5, 0xadb736656798954b937d9da775086a, 0x004a41 ] } , - BigNum { limbs: [ 0x46d45a9773ae6b86c9d7e18da89b3b, 0xcccaaa691dce3ee4751eb94379dff6, 0x0018cb ] } , - BigNum { limbs: [ 0x76cfa8688aad937936281d725764c6, 0xda887f345f79f45562e9505e5e255d, 0x005b21 ] } , - BigNum { limbs: [ 0xd2a67b43235e5634958f1eb0ad95e0, 0x734ae388017271fe8e78b97091cf88, 0x004a15 ] } , - BigNum { limbs: [ 0xeafd87bcdafda8cb6a70e04f526a21, 0x340846157bd5c13b498f50314635ca, 0x0029d8 ] } , - BigNum { limbs: [ 0xa001a9afc07ac661370d2ef55e633f, 0xe7e3351eae01f339c80d8abb20ba62, 0x00519c ] } , - BigNum { limbs: [ 0x1da259503de1389ec8f2d00aa19cc2, 0xbf6ff47ecf4640000ffa7ee6b74af1, 0x002250 ] } , - BigNum { limbs: [ 0xb9c9516fb972965a1ac3122c925449, 0xaaa7eec63b5c6d153148e0de7980e1, 0x001abe ] } , - BigNum { limbs: [ 0x03dab19044e968a5e53cecd36dabb8, 0xfcab3ad741ebc624a6bf28c35e8472, 0x00592e ] } , - BigNum { limbs: [ 0x2046acd0462dd5291f6caf69385d7e, 0x54cb8802be0be7b58b1aabbe621d88, 0x006a27 ] } , - BigNum { limbs: [ 0x9d5d562fb82e29d6e0934f96c7a283, 0x5287a19abf3c4b844ced5de375e7cb, 0x0009c6 ] } , - BigNum { limbs: [ 0x4b3eeb312542d52b6ef4b5e4f07753, 0x48916408e1403ddc5cc045c61c74b1, 0x006327 ] } , - BigNum { limbs: [ 0x726517ced91929d4910b491b0f88ae, 0x5ec1c5949c07f55d7b47c3dbbb90a2, 0x0010c6 ] } , - BigNum { limbs: [ 0x29b73e056bf13feaaf86f52a8c2998, 0x797773363ea48510d4a6c7bf4703e5, 0x003aa3 ] } , - BigNum { limbs: [ 0x93ecc4fa926abf15507909d573d669, 0x2ddbb6673ea3ae29036141e291016e, 0x00394a ] } , - BigNum { limbs: [ 0xe217f3e61986866cebadf86d5ef842, 0x51b588c5486f9e4a3c935036d7e4ad, 0x000692 ] } , - BigNum { limbs: [ 0xdb8c0f19e4d5789314520692a107bf, 0x559da0d834d894ef9b74b96b0020a5, 0x006d5b ] } , - BigNum { limbs: [ 0x70ba2c4850053795878746ef294988, 0xd6873cec26b5ad7a0348fef3d1481d, 0x002514 ] } , - BigNum { limbs: [ 0x4ce9d6b7ae56c76a7878b810d6b679, 0xd0cbecb1569285bfd4bf0aae06bd36, 0x004ed8 ] } , - BigNum { limbs: [ 0x2326a7250b148905c0719e56d6fd15, 0x28e8540547c82ea819c9f75581beae, 0x00214b ] } , - BigNum { limbs: [ 0x9a7d5bdaf34775fa3f8e60a92902ec, 0x7e6ad59835800491be3e124c5646a5, 0x0052a2 ] } , - BigNum { limbs: [ 0x2a99c98beb4f0ce0f40a4dd1d52a86, 0xfec5ede539564d9fc90c4fa5fd592a, 0x0034ec ] } , - BigNum { limbs: [ 0x930a3974130cf21f0bf5b12e2ad57b, 0xa88d3bb843f1e59a0efbb9fbdaac29, 0x003f00 ] } , - BigNum { limbs: [ 0xb10116cf84071cc2198afed5e23a69, 0xbca7f7fff62cc3b7655c2a495f7bb8, 0x0060c5 ] } , - BigNum { limbs: [ 0x0ca2ec307a54e23de675002a1dc598, 0xeaab319d871b6f8272abdf5878899b, 0x001327 ] } , - BigNum { limbs: [ 0x422b4706016552e5731ff5b7e4f90d, 0xda29cd8e836193bb3960bdb203fa67, 0x000bd0 ] } , - BigNum { limbs: [ 0x7b78bbf9fcf6ac1a8ce009481b06f4, 0xcd295c0ef9e69f7e9ea74befd40aec, 0x00681c ] } , - BigNum { limbs: [ 0x555798eb4755185b1ba72cfa6bf59c, 0xf2983cfa6f6538e38a562e53e2aa7e, 0x005ddd ] } , - BigNum { limbs: [ 0x684c6a14b706e6a4e458d205940a65, 0xb4baeca30de2fa564db1db4df55ad5, 0x00160f ] } , - BigNum { limbs: [ 0x8832dd3f5ef62c0943fb0d33375fa6, 0x316646121226ce3015ae580132b4b1, 0x004573 ] } , - BigNum { limbs: [ 0x357125c09f65d2f6bc04f1ccc8a05b, 0x75ece38b6b216509c259b1a0a550a2, 0x002e7a ] } , - BigNum { limbs: [ 0x9c6ffecb2dacc1f1d431c78293c8b9, 0x543fac296aec7a34c5516a0a165973, 0x00428b ] } , - BigNum { limbs: [ 0x21340434d0af3d0e2bce377d6c3748, 0x53137d74125bb90512b69f97c1abe0, 0x003162 ] } , - BigNum { limbs: [ 0x064543e057b3b60d232820cad187ef, 0xad4cc8249a0bad4e635a0383373bf5, 0x001864 ] } , - BigNum { limbs: [ 0xb75ebf1fa6a848f2dcd7de352e7812, 0xfa066178e33c85eb74ae061ea0c95e, 0x005b88 ] } , - BigNum { limbs: [ 0x456225029cb18a7502d8d6f4e2d92c, 0xf177268722515b549d34a1faf96665, 0x002cb6 ] } , - BigNum { limbs: [ 0x7841ddfd61aa748afd27280b1d26d5, 0xb5dc03165af6d7e53ad367a6de9eee, 0x004736 ] } , - BigNum { limbs: [ 0x19a75e369fc40f9d1b43bbcb2db55f, 0x1043f5e5d8aa7b1cb6f0e1b5086227, 0x005f63 ] } , - BigNum { limbs: [ 0xa3fca4c95e97ef62e4bc4334d24aa2, 0x970f33b7a49db81d211727eccfa32c, 0x00148a ] } , - BigNum { limbs: [ 0xa2acecf84b9591015b5a9e7efdcc8f, 0xf40c787ed436bd55fc1ce1a15d2bd6, 0x003d0a ] } , - BigNum { limbs: [ 0x1af71607b2c66dfea4a56081023372, 0xb346b11ea91175e3dbeb28007ad97d, 0x0036e2 ] } , - BigNum { limbs: [ 0xe415a5bdd1fee3d8007db2ad235e31, 0x7e6aa480cbd5388721c3067cad8763, 0x00255e ] } , - BigNum { limbs: [ 0xd98e5d422c5d1b27ff824c52dca1d0, 0x28e8851cb172fab2b64503252a7def, 0x004e8f ] } , - BigNum { limbs: [ 0x75ffd5b8aa14c8c2bb0fc195a9a46a, 0xe8cdba31be2bd5e4e45ff85fceda4a, 0x002284 ] } , - BigNum { limbs: [ 0x47a42d475447363d44f03d6a565b97, 0xbe856f6bbf1c5d54f3a81142092b09, 0x005168 ] } , - BigNum { limbs: [ 0x8bcd8e668308241d4f6d303fae354e, 0x5b0cdb84eb576f71a79480496183ec, 0x005489 ] } , - BigNum { limbs: [ 0x31d674997b53dae2b092cec051cab3, 0x4c464e1891f0c3c830738958768167, 0x001f64 ] } , - BigNum { limbs: [ 0x1539aec479a3eae71c612ef0f04618, 0x7aeb402a1579d6fb7196875d5e30ee, 0x003678 ] } , - BigNum { limbs: [ 0xa86a543b84b81418e39ed00f0fb9e9, 0x2c67e97367ce5c3e6671824479d465, 0x003d75 ] } , - BigNum { limbs: [ 0x3a2b43df04e837f25c4b9ba792b486, 0xd9a47f020288b6790a020273b05fcb, 0x003946 ] } , - BigNum { limbs: [ 0x8378bf20f973c70da3b463586d4b7b, 0xcdaeaa9b7abf7cc0ce06072e27a588, 0x003aa6 ] } , - BigNum { limbs: [ 0xbc9e7d1f83ead2f498d6cba7e71967, 0x7ba713b76b71dceef4a2a7aecba80e, 0x003d50 ] } , - BigNum { limbs: [ 0x010585e07a712c0b6729335818e69a, 0x2bac15e611d6564ae36561f30c5d45, 0x00369d ] } , - BigNum { limbs: [ 0x187dab62963f68a56f00f6b6f40225, 0x9d592f067d015a66f6c67f6a57f8c9, 0x004c40 ] } , - BigNum { limbs: [ 0xa526579d681c965a90ff08490bfddc, 0x09f9fa970046d8d2e1418a37800c8a, 0x0027ad ] } , - BigNum { limbs: [ 0x9d647a3422178d6b7347fd24da80dd, 0x03b6b7bd0d68ebebb9a5e00c1c5325, 0x007365 ] } , - BigNum { limbs: [ 0x203f88cbdc4471948cb801db257f24, 0xa39c71e06fdf474e1e622995bbb22e, 0x000088 ] } , - BigNum { limbs: [ 0xe43ffe9845c09c44c99b42a258cf41, 0xb4f5f124689404a42f39cbf6436f5a, 0x006ce0 ] } , - BigNum { limbs: [ 0xd9640467b89b62bb3664bc5da730c0, 0xf25d387914b42e95a8ce3dab9495f8, 0x00070c ] } , - BigNum { limbs: [ 0xf287b6874e6d31bce75b32ad6219bb, 0x1ca1a8e76b30cc68dc1098dbbe0fc2, 0x000ccb ] } , - BigNum { limbs: [ 0xcb1c4c78afeecd4318a4cc529de646, 0x8ab180b6121766d0fbf770c619f590, 0x006722 ] } , - BigNum { limbs: [ 0xcb71cf8107705aab63cccb2a32517a, 0x8bd5c55fb197d2e741eae670a33295, 0x0062bc ] } , - BigNum { limbs: [ 0xf232337ef6eba4549c3333d5cdae87, 0x1b7d643dcbb06052961d233134d2bd, 0x001131 ] } , - BigNum { limbs: [ 0xeafdaec40db2db47455c390c6aee58, 0xaca36c4d48fb5a07ecb98c1fb03e79, 0x003ffb ] } , - BigNum { limbs: [ 0xd2a6543bf0a923b8baa3c5f39511a9, 0xfaafbd50344cd931eb4e7d8227c6d9, 0x0033f1 ] } , - BigNum { limbs: [ 0xa62c54921a1fc333c30ba9fc5d9408, 0x5e23254e166fcbe0d031bf45a819bc, 0x001de8 ] } , - BigNum { limbs: [ 0x1777ae6de43c3bcc3cf45503a26bf9, 0x4930044f66d8675907d64a5c2feb97, 0x005605 ] } , - BigNum { limbs: [ 0x473f185d274859384e4f2050b77241, 0xc886cf3718c89bb53756647b160952, 0x006fe1 ] } , - BigNum { limbs: [ 0x7664eaa2d713a5c7b1b0deaf488dc0, 0xdecc5a66647f9784a0b1a526c1fc01, 0x00040b ] } , - BigNum { limbs: [ 0x0fe7e8d3b75fd27289e93465edcd24, 0x65deb6aea5b7e996c18b09a54722d4, 0x001c17 ] } , - BigNum { limbs: [ 0xadbc1a2c46fc2c8d7616ca9a1232dd, 0x417472eed79049a3167cfffc90e27f, 0x0057d6 ] } , - BigNum { limbs: [ 0xc341474427a5cd5bd296e845dcbfb5, 0x6707fe5efd07cd1011849e902ff6bd, 0x0055d3 ] } , - BigNum { limbs: [ 0xfa62bbbbd6b631a42d6916ba23404c, 0x404b2b3e80406629c6836b11a80e95, 0x001e1a ] } , - BigNum { limbs: [ 0xe9223244954aaa734d619f973237e7, 0xfcaf5204ab299e5ef812ad351829d3, 0x0010de ] } , - BigNum { limbs: [ 0xd481d0bb6911548cb29e5f68cdc81a, 0xaaa3d798d21e94dadff55c6cbfdb7f, 0x00630e ] } , - BigNum { limbs: [ 0xba94880d17053f5ef86d28dc13f876, 0xf7ff81a4ec0c19ed2d449ee8246672, 0x0053fd ] } , - BigNum { limbs: [ 0x030f7af2e756bfa10792d623ec078b, 0xaf53a7f8913c194caac36ab9b39ee1, 0x001fef ] } , - BigNum { limbs: [ 0xf356ccaa4665a4858c20d032f1dfd1, 0x323a6fa047f372483da0a591748216, 0x0028d0 ] } , - BigNum { limbs: [ 0xca4d3655b7f65a7a73df2ecd0e2030, 0x7518b9fd3554c0f19a67641063833c, 0x004b1d ] } , - BigNum { limbs: [ 0xea9f6b8c112bc277e7985eccea0a2e, 0x7c085d210cfbe40133b24b6a04e398, 0x002b38 ] } , - BigNum { limbs: [ 0xd3049773ed303c881867a03315f5d3, 0x2b4acc7c704c4f38a455be37d321ba, 0x0048b5 ] } , - BigNum { limbs: [ 0xfacd9bdaeced92f1c63a3e21536c74, 0x2c49512b58044e2cb934051e4bcc10, 0x003768 ] } , - BigNum { limbs: [ 0xc2d66725116e6c0e39c5c0deac938d, 0x7b09d8722543e50d1ed404838c3942, 0x003c85 ] } , - BigNum { limbs: [ 0xf8afc0ab3e780e673fe1436f1188a3, 0x39b67add49c6894b9bffa0bac8addb, 0x003031 ] } , - BigNum { limbs: [ 0xc4f44254bfe3f098c01ebb90ee775e, 0x6d9caec03381a9ee3c0868e70f5777, 0x0043bc ] } , - BigNum { limbs: [ 0xbfc6dfa383c3529f74186ef551cf01, 0x050ea80c2905e5d8ec0e13f53e1413, 0x001736 ] } , - BigNum { limbs: [ 0xfddd235c7a98ac608be7900aae3100, 0xa244819154424d60ebf9f5ac99f13f, 0x005cb7 ] } , - BigNum { limbs: [ 0x73942e79cb0c8527f72a3e2c51e0ef, 0x09a87758062390936779b0cf57423e, 0x001924 ] } , - BigNum { limbs: [ 0x4a0fd486334f79d808d5c0d3ae1f12, 0x9daab2457724a2a6708e58d280c315, 0x005ac9 ] } , - BigNum { limbs: [ 0xd3177ffb8458b6f6d43ea8eba51c43, 0x42ba55ccf0777efa9276273f44b642, 0x006154 ] } , - BigNum { limbs: [ 0xea8c83047a0348092bc156145ae3be, 0x6498d3d08cd0b43f4591e262934f10, 0x001299 ] } , - BigNum { limbs: [ 0xf3bce46524da0b064118870afa5991, 0x00e63443e6f22ebb4b1bfd25f5d94b, 0x005e00 ] } , - BigNum { limbs: [ 0xc9e71e9ad981f3f9bee777f505a670, 0xa66cf5599656047e8cec0c7be22c07, 0x0015ed ] } , - BigNum { limbs: [ 0x130e41e9b742cb2dc5b5edb7ed29cb, 0x92313662237252147de2718db6063f, 0x00212d ] } , - BigNum { limbs: [ 0xaa95c116471933d23a4a114812d636, 0x1521f33b59d5e1255a25981421ff14, 0x0052c0 ] } , - BigNum { limbs: [ 0xe8597f0a34401b1da30162c605bbd6, 0xb3b34e0e308633c7af6db3c3b90ee3, 0x0043aa ] } , - BigNum { limbs: [ 0xd54a83f5ca1be3e25cfe9c39fa442b, 0xf39fdb8f4cc1ff72289a55de1ef66f, 0x003042 ] } , - BigNum { limbs: [ 0x4fb2cf08cc41d90df31729861ca313, 0x035bb4abde283b9127bae17944e80b, 0x005b27 ] } , - BigNum { limbs: [ 0x6df133f7321a25f20ce8d579e35cee, 0xa3f774f19f1ff7a8b04d2828931d48, 0x0018c6 ] } , - BigNum { limbs: [ 0xae06c77e2589c0212b5a0ca9563807, 0xbf06653c93d29d34ba2c335b34dd86, 0x0052cf ] } , - BigNum { limbs: [ 0x0f9d3b81d8d23eded4a5f256a9c7fa, 0xe84cc460e97596051ddbd646a327cd, 0x00211d ] } , - BigNum { limbs: [ 0x50713e4385fe1f707b23379bcba192, 0x634395da771c85f87b25332f515a54, 0x0016b0 ] } , - BigNum { limbs: [ 0x6d32c4bc785ddf8f84dcc764345e6f, 0x440f93c3062bad415ce2d67286aaff, 0x005d3d ] } , - BigNum { limbs: [ 0x57ac09af457179cbdfcf1745c64c5b, 0x56b7e031e508dcdbf68fb0adb51274, 0x0048ec ] } , - BigNum { limbs: [ 0x65f7f950b8ea85342030e7ba39b3a6, 0x509b496b983f565de17858f422f2df, 0x002b01 ] } , - BigNum { limbs: [ 0xb0b2cc3152108317ed7d2589d7b63c, 0x5ff559f439878728eeeca63fee7606, 0x0025e8 ] } , - BigNum { limbs: [ 0x0cf136ceac4b7be81282d9762849c5, 0x475dcfa943c0ac10e91b6361e98f4d, 0x004e05 ] } , - BigNum { limbs: [ 0xc80073fd2d821b091fc9ffdfd7d77f, 0x1467eaed726a422df44415007b2179, 0x0024a5 ] } , - BigNum { limbs: [ 0xf5a38f02d0d9e3f6e035ff20282882, 0x92eb3eb00addf10be3c3f4a15ce3d9, 0x004f48 ] } , - BigNum { limbs: [ 0xa7f81e23d36f6f25f9f9f54d4b827c, 0x93d1e4854df3e6af6f2ffdd6318a61, 0x000a0f ] } , - BigNum { limbs: [ 0x15abe4dc2aec8fda060609b2b47d85, 0x138145182f544c8a68d80bcba67af2, 0x0069de ] } , - BigNum { limbs: [ 0xa52d5408323ba0de51bd26d82135d1, 0x3829379642e4d0d36e40493b4633f2, 0x006326 ] } , - BigNum { limbs: [ 0x1876aef7cc205e21ae42d827deca30, 0x6f29f2073a63626669c7c06691d161, 0x0010c7 ] } , - BigNum { limbs: [ 0xe4ba764571d6dfac24331044e513b5, 0x29ae1feabce0702f2744e5c4fed20f, 0x001512 ] } , - BigNum { limbs: [ 0xd8e98cba8c851f53dbcceebb1aec4c, 0x7da509b2c067c30ab0c323dcd93343, 0x005edb ] } , - BigNum { limbs: [ 0x895d972c82f6b08a041d8b710913e0, 0xaf9532cb25e21fb2b962b42131ff6e, 0x00444e ] } , - BigNum { limbs: [ 0x34466bd37b654e75fbe2738ef6ec21, 0xf7bdf6d2576613871ea55580a605e5, 0x002f9e ] } , - BigNum { limbs: [ 0xd9ce39a69afbe2107836056af69cc9, 0x2ed220f013a27dfa3990a028e97425, 0x00512d ] } , - BigNum { limbs: [ 0xe3d5c95963601cef87c9f995096338, 0x788108ad69a5b53f9e776978ee912d, 0x0022c0 ] } , - BigNum { limbs: [ 0x187c9ee6adf533c974076c2dc30417, 0x5756db628954ec7daade0b32e44f53, 0x00734c ] } , - BigNum { limbs: [ 0xa52764195066cb368bf892d23cfbea, 0x4ffc4e3af3f346bc2d29fe6ef3b600, 0x0000a1 ] } , - BigNum { limbs: [ 0xd63fb9b7fafea8b3edd31ab94c4da5, 0xaf6eb9f0152e04a80c76d8935220ce, 0x0035a1 ] } , - BigNum { limbs: [ 0xe7644948035d564c122ce446b3b25c, 0xf7e46fad681a2e91cb91310e85e484, 0x003e4b ] } , - BigNum { limbs: [ 0xcaca432aea4e95633bd1bbc7d18f5d, 0x9f21e0d26ceffe9af70c7893f1db92, 0x005810 ] } , - BigNum { limbs: [ 0xf2d9bfd5140d699cc42e43382e70a4, 0x083148cb1058349ee0fb910de629c0, 0x001bdd ] } , - BigNum { limbs: [ 0xbe19e082013e12c70598422b07bb90, 0xe9d581aa4ab0a8c672a4f8f68b994a, 0x000d08 ] } , - BigNum { limbs: [ 0xff8a227dfd1dec38fa67bcd4f84471, 0xbd7da7f332978a73656310ab4c6c08, 0x0066e4 ] } , - BigNum { limbs: [ 0xe2deabb39325d6a0d9e8d24251896b, 0x60daa8d9f6384d473d87e5ceecf2f1, 0x005979 ] } , - BigNum { limbs: [ 0xdac5574c6b36285f26172cbdae7696, 0x467880c3870fe5f29a8023d2eb1261, 0x001a74 ] } , - BigNum { limbs: [ 0xb479c93959ccb963acc1ca749100a2, 0x899b596612cfe0aea93acaf92998fd, 0x006208 ] } , - BigNum { limbs: [ 0x092a39c6a48f459c533e348b6eff5f, 0x1db7d0376a78528b2ecd3ea8ae6c56, 0x0011e5 ] } , - BigNum { limbs: [ 0x9d079ac4df49870ec14b55e4495b09, 0xcc2ac820468dc1db121b7963b0541e, 0x002204 ] } , - BigNum { limbs: [ 0x209c683b1f1277f13eb4a91bb6a4f8, 0xdb28617d36ba715ec5ec903e27b135, 0x0051e8 ] } , - BigNum { limbs: [ 0x83ca443cb7cd40ee65fc7e14f4422d, 0xb15636eb2bb9e5fc39130c6530b939, 0x002aaf ] } , - BigNum { limbs: [ 0x39d9bec3468ebe119a0380eb0bbdd4, 0xf5fcf2b2518e4d3d9ef4fd3ca74c1a, 0x00493d ] } , - BigNum { limbs: [ 0xfd6d39831f8f23ecf617061b8850b6, 0x44133d6bd9d998e74601d1d2dc51b2, 0x002034 ] } , - BigNum { limbs: [ 0xc036c97cdeccdb1309e8f8e477af4b, 0x633fec31a36e9a52920637cefbb3a0, 0x0053b9 ] } , - BigNum { limbs: [ 0x056933371c5f5fed08d8ece11f69b7, 0x5a07024a754ebd820039fcef3cce97, 0x005bf3 ] } , - BigNum { limbs: [ 0xb83acfc8e1fc9f12f727121ee0964a, 0x4d4c275307f975b7d7ce0cb29b36bc, 0x0017fa ] } , - BigNum { limbs: [ 0x63e588093bc82f2d7c0c4bfb6be312, 0x865b29bbfa764ccf377245b9783c3a, 0x000137 ] } , - BigNum { limbs: [ 0x59be7af6c293cfd283f3b304941cef, 0x20f7ffe182d1e66aa095c3e85fc919, 0x0072b6 ] } , - BigNum { limbs: [ 0xba7f667bd4638097bbacda69feb898, 0xb712479f80a37f2a4e2a3316cf4575, 0x0072d6 ] } , - BigNum { limbs: [ 0x03249c8429f87e6844532496014769, 0xf040e1fdfca4b40f89ddd68b08bfde, 0x000116 ] } , - BigNum { limbs: [ 0x2a4d28be53ec6ffd187c934c549ff4, 0x428cb4ba35be18b7da0c0ea7f5cd3a, 0x000ade ] } , - BigNum { limbs: [ 0x9356da41aa6f8f02e7836bb3ab600d, 0x64c674e3478a1a81fdfbfaf9e23819, 0x00690f ] } , - BigNum { limbs: [ 0xee2004f51c7559cb15699d00d9ee84, 0xa9402312add15fb4822a16eb1965ec, 0x0015a5 ] } , - BigNum { limbs: [ 0xcf83fe0ae1e6a534ea9661ff26117d, 0xfe13068acf76d38555ddf2b6be9f66, 0x005e47 ] } , - BigNum { limbs: [ 0x108cc229f8d6c118bab557fd5c3da9, 0x308a9b762e456ef216be93050d2c03, 0x00734d ] } , - BigNum { limbs: [ 0xad1740d605853de7454aa702a3c258, 0x76c88e274f02c447c149769ccad950, 0x0000a0 ] } , - BigNum { limbs: [ 0x0ee0295a818ecc68b8d0deab01302c, 0xeded10438c3b18b7ed0ac50a32d509, 0x001f0f ] } , - BigNum { limbs: [ 0xaec3d9a57ccd3297472f2054fecfd5, 0xb9661959f10d1a81eafd4497a5304a, 0x0054dd ] } , - BigNum { limbs: [ 0xe63ed4ea14bfaf5ab63cd842a137c8, 0x28e5ee053064ff92383bdd9e9beab4, 0x004a0d ] } , - BigNum { limbs: [ 0xd7652e15e99c4fa549c326bd5ec839, 0x7e6d3b984ce333a79fcc2c033c1a9e, 0x0029e0 ] } , - BigNum { limbs: [ 0x711b036c0eb5b4d0f5bf82ad6a0469, 0xac9318bed9079bf9206768a4848d3a, 0x001b6a ] } , - BigNum { limbs: [ 0x4c88ff93efa64a2f0a407c5295fb98, 0xfac010dea4409740b7a0a0fd537819, 0x005882 ] } , - BigNum { limbs: [ 0x5f1f2d950d6234b08072ac0f23c66f, 0x7639706a1bdb575857f681ca6e986d, 0x005c7b ] } , - BigNum { limbs: [ 0x5e84d56af0f9ca4f7f8d52f0dc3992, 0x3119b933616cdbe1801187d7696ce6, 0x001772 ] } , - BigNum { limbs: [ 0x9e43326bdfc93195f3a9915d6294b3, 0x7065bfbb28beb08aab619910e4fb02, 0x006c23 ] } , - BigNum { limbs: [ 0x1f60d0941e92cd6a0c566da29d6b4e, 0x36ed69e2548982af2ca67090f30a51, 0x0007ca ] } , - BigNum { limbs: [ 0xd42052ca20e48a9e24c75ff38d109a, 0xfcacef081b66d6c7795cafe9525076, 0x0069c9 ] } , - BigNum { limbs: [ 0xe983b035dd777461db389f0c72ef67, 0xaaa63a9561e15c725eab59b885b4dc, 0x000a23 ] } , - BigNum { limbs: [ 0xad7d478339b2d24e5a6e8ff3fc3883, 0x54cbfcb378453798a21053866185c8, 0x000cb0 ] } , - BigNum { limbs: [ 0x1026bb7cc4a92cb1a5916f0c03c77e, 0x52872cea0502fba135f7b61b767f8b, 0x00673d ] } , - BigNum { limbs: [ 0xf10d38b070804c4bd4f9a657120496, 0x6374f94ac6e3a90254b47d85af5823, 0x001751 ] } , - BigNum { limbs: [ 0xcc96ca4f8ddbb2b42b0658a8edfb6b, 0x43de3052b6648a3783538c1c28ad2f, 0x005c9c ] } , - BigNum { limbs: [ 0xcc515f3f0c99cd00b68da4e78fc8a5, 0xaf7f64afb412337743f5b51e5dbe80, 0x00086a ] } , - BigNum { limbs: [ 0xf152a3c0f1c231ff49725a1870375c, 0xf7d3c4edc935ffc2941254837a46d2, 0x006b82 ] } , - BigNum { limbs: [ 0x1e12c653d194858811917c402c5e08, 0xfa3926888d559d1b2936451c8f7add, 0x00037e ] } , - BigNum { limbs: [ 0x9f913cac2cc77977ee6e82bfd3a1f9, 0xad1a0314eff2961eaed1c485488a76, 0x00706e ] } , - BigNum { limbs: [ 0x92ba88adc64481790af5ddb9c22acb, 0x1e099e5346fbdf496a976fef3b3a4f, 0x002cca ] } , - BigNum { limbs: [ 0x2ae97a5238177d86f50a21463dd536, 0x89498b4a364c53f06d7099b29ccb04, 0x004723 ] } , - BigNum { limbs: [ 0x09f1ed4d5c907482a1d5036a7dde43, 0x05e4e7546a4be8391505888956422e, 0x005204 ] } , - BigNum { limbs: [ 0xb3b215b2a1cb8a7d5e2afb958221be, 0xa16e424912fc4b00c302811881c325, 0x0021e9 ] } , - BigNum { limbs: [ 0x6f1e1629beffc7859d673e27dcf1b2, 0x33454c9c9c3b0833c643b07594d33a, 0x0010f3 ] } , - BigNum { limbs: [ 0x4e85ecd63f5c377a6298c0d8230e4f, 0x740ddd00e10d2b0611c4592c433219, 0x0062fa ] } , - BigNum { limbs: [ 0xd43c77fd9ffb0c74e9e52495016ac9, 0xafad8f93b1602de884f80e0737d375, 0x004c34 ] } , - BigNum { limbs: [ 0xe9678b025e60f28b161ada6afe9538, 0xf7a59a09cbe80551530ffb9aa031dd, 0x0027b8 ] } , - BigNum { limbs: [ 0x3db2a6bf5f6ca33c56d10c35c02735, 0xac06901cc1b3e8e451f06b9f0228cb, 0x002b83 ] } , - BigNum { limbs: [ 0x7ff15c409eef5bc3a92ef2ca3fd8cc, 0xfb4c9980bb944a5586179e02d5dc88, 0x004869 ] } , - BigNum { limbs: [ 0x383365ea4a31c0f3eb464aec60b835, 0xf3c0b970e4aa60221457cddd0c0487, 0x0012e8 ] } , - BigNum { limbs: [ 0x85709d15b42a3e0c14b9b4139f47cc, 0xb392702c989dd317c3b03bc4cc00cc, 0x006104 ] } , - BigNum { limbs: [ 0xeccfb97272ff11cf848e3e50cda39f, 0x09bddb51ba1b12c8c56f873f3bdd12, 0x004c5f ] } , - BigNum { limbs: [ 0xd0d4498d8b5ced307b71c0af325c62, 0x9d954e4bc32d2071129882629c2840, 0x00278e ] } , - BigNum { limbs: [ 0x6b4884745ca9b167279585d68a7334, 0x9178ac407b980f436697ede4973b18, 0x00088f ] } , - BigNum { limbs: [ 0x525b7e8ba1b24d98d86a7929758ccd, 0x15da7d5d01b023f671701bbd40ca3b, 0x006b5e ] } , - BigNum { limbs: [ 0x2d15aea2c97985c3f79855b4db7495, 0x2a31eeafe44ae800d2e1bf6394ed6e, 0x000821 ] } , - BigNum { limbs: [ 0x908e545d34e2793c0867a94b248b6c, 0x7d213aed98fd4b3905264a3e4317e5, 0x006bcc ] } , - BigNum { limbs: [ 0xf45703f48ab34541d52f5909c78b47, 0xba1a4868699dbdd6e8e04610d3ec59, 0x001cf3 ] } , - BigNum { limbs: [ 0xc94cff0b73a8b9be2ad0a5f63874ba, 0xed38e13513aa7562ef27c3910418f9, 0x0056f9 ] } , - BigNum { limbs: [ 0x86a5e162cf3f5bdaae2dad9c5a827b, 0x01c060b5dfcf47eafe8ddaffd64e42, 0x0044d5 ] } , - BigNum { limbs: [ 0x36fe219d2f1ca32551d25163a57d86, 0xa592c8e79d78eb4ed97a2ea201b711, 0x002f18 ] } , - BigNum { limbs: [ 0x192bb4a30e9240d1e467f0b3501bce, 0x4fdbb8d9fb62675835dec0468c6b8c, 0x003112 ] } , - BigNum { limbs: [ 0xa4784e5cefc9be2e1b980e4cafe433, 0x577770c381e5cbe1a229495b4b99c7, 0x0042db ] } , - BigNum { limbs: [ 0x09e139d6bbd9b69af7b5cd1346db07, 0x7d345a381015903274a58f39519525, 0x00578b ] } , - BigNum { limbs: [ 0xb3c2c92942824865084a31ecb924fa, 0x2a1ecf656d32a30763627a6886702e, 0x001c62 ] } , - BigNum { limbs: [ 0x8013d3fca94bb50ed8283b6c1dfd41, 0xad8356666fdb9ef5c05e0d824b069e, 0x006e81 ] } , - BigNum { limbs: [ 0x3d902f03551049f127d7c393e202c0, 0xf9cfd3370d6c944417a9fc1f8cfeb5, 0x00056b ] } , - BigNum { limbs: [ 0x71fe306af8cf5bf85d4bf58c8c10a7, 0x219dceeb0fbd6fa994d8e06c822299, 0x0056cd ] } , - BigNum { limbs: [ 0x4ba5d295058ca307a2b4097373ef5a, 0x85b55ab26d8ac390432f293555e2ba, 0x001d20 ] } , - BigNum { limbs: [ 0xfadfcde9b8919e2ff271d61a681448, 0x13d3a81036ea07afb63c2b91533d80, 0x005a35 ] } , - BigNum { limbs: [ 0xc2c4351645ca60d00d8e28e597ebb9, 0x937f818d465e2b8a21cbde1084c7d2, 0x0019b8 ] } , - BigNum { limbs: [ 0x7906dca3ece0ce3db5369706c27500, 0xf09385afcbdc2fd9c2783331adcd6a, 0x005fcd ] } , - BigNum { limbs: [ 0x449d265c117b30c24ac967f93d8b01, 0xb6bfa3edb16c0360158fd6702a37e9, 0x00141f ] } , - BigNum { limbs: [ 0x87528d64ba56c8884660f035c6c17d, 0x0738118ffd848e761e10bf4b0e0010, 0x006c72 ] } , - BigNum { limbs: [ 0x3651759b44053677b99f0eca393e84, 0xa01b180d7fc3a4c3b9f74a56ca0543, 0x00077b ] } , - BigNum { limbs: [ 0x6171b5078cc40ef8bfe32b7c159bce, 0x8d75706fe3cd1f88f7086a8c38c2c5, 0x0008ca ] } , - BigNum { limbs: [ 0x5c324df87197f007401cd383ea6433, 0x19ddb92d997b13b0e0ff9f159f428e, 0x006b23 ] } , - BigNum { limbs: [ 0x19b67682a91fc89d6bc983c110f9ba, 0x3c414dc54a4913850eafd58a85f62e, 0x006b3b ] } , - BigNum { limbs: [ 0xa3ed8c7d553c366294367b3eef0647, 0x6b11dbd832ff1fb4c9583417520f25, 0x0008b2 ] } , - BigNum { limbs: [ 0x1e2c66de9929159ab20064303d8cae, 0xec32f58f347d1f901fa0e5adbaa196, 0x005087 ] } , - BigNum { limbs: [ 0x9f779c216532e9654dff9acfc27353, 0xbb20340e48cb13a9b86723f41d63bd, 0x002365 ] } , - BigNum { limbs: [ 0x71f6451a4b122baed0f2a3a2e645dd, 0x43edd4494970b2ffbd723442149001, 0x002597 ] } , - BigNum { limbs: [ 0x4badbde5b349d3512f0d5b5d19ba24, 0x6365555433d7803a1a95d55fc37552, 0x004e56 ] } , - BigNum { limbs: [ 0xb2d4b877e5d93a626a47b687c4500b, 0x385e4ef9e3149a4d054ba99e2c10b5, 0x0028df ] } , - BigNum { limbs: [ 0x0acf4a881882c49d95b848783baff6, 0x6ef4daa39a3398ecd2bc6003abf49e, 0x004b0e ] } , - BigNum { limbs: [ 0xbe26511df591a79d2c82cfafebd3e4, 0x8fba5cd40537bd55568168a8a11259, 0x000e92 ] } , - BigNum { limbs: [ 0xff7db1e208ca5762d37d2f50142c1d, 0x1798ccc9781075e48186a0f936f2f9, 0x00655b ] } , - BigNum { limbs: [ 0xd96ba85a6ae2ceb14780f80cfadf8d, 0xeeab26fc085dfb9e36c28aa5a9dcd1, 0x0061f3 ] } , - BigNum { limbs: [ 0xe4385aa59379304eb87f06f3052074, 0xb8a802a174ea379ba1457efc2e2881, 0x0011f9 ] } , - BigNum { limbs: [ 0xd15302d7104b78cc10425e8e6a87e9, 0x186a0c11ddf42522b8f2050df6b564, 0x00704c ] } , - BigNum { limbs: [ 0xec510028ee108633efbda071957818, 0x8ee91d8b9f540e171f160493e14fee, 0x0003a1 ] } , - BigNum { limbs: [ 0x15e84d13abe6a745b05eb0ab44120b, 0x65d678b551a83620b9115cddf265b6, 0x00678f ] } , - BigNum { limbs: [ 0xa7bbb5ec527557ba4fa14e54bbedf6, 0x417cb0e82b9ffd191ef6acc3e59f9d, 0x000c5e ] } , - BigNum { limbs: [ 0xfd7fedc0683984e97c364ca861398e, 0x1dc59ac33c4fd50a587da736b8e541, 0x003df1 ] } , - BigNum { limbs: [ 0xc024153f96227a1683c9b2579ec673, 0x898d8eda40f85e2f7f8a626b1f2011, 0x0035fc ] } , - BigNum { limbs: [ 0xd45160abcd98453ea16d486047890f, 0x59fa83e4013b133fc818223cb8913a, 0x002996 ] } , - BigNum { limbs: [ 0xe952a25430c3b9c15e92b69fb876f2, 0x4d58a5b97c0d1ffa0fefe7651f7418, 0x004a57 ] } , - BigNum { limbs: [ 0xfc35bb116b1718dc5a5fd408cad7bb, 0x91e27a7ece6f9e05c56bc5763cb4a2, 0x003a3b ] } , - BigNum { limbs: [ 0xc16e47ee9344e623a5a02af7352846, 0x1570af1eaed89534129c442b9b50b0, 0x0039b2 ] } , - BigNum { limbs: [ 0xf3a4973e7f7b3ecff232b6e9ecc897, 0xb2dabc6d4c222ec34fa2ef898b83c2, 0x003c9c ] } , - BigNum { limbs: [ 0xc9ff6bc17ee0c0300dcd481613376a, 0xf4786d303126047688651a184c8190, 0x003750 ] } , - BigNum { limbs: [ 0xd92aca9fd6c310d0154353e14a3a81, 0x1b7c2f7f55ab633892aeaf7c08e258, 0x0068f9 ] } , - BigNum { limbs: [ 0xe47938602798ee2feabcab1eb5c580, 0x8bd6fa1e279cd00145595a25cf22fa, 0x000af4 ] } , - BigNum { limbs: [ 0x3b5ef541f72016e9d101990e3d4671, 0xc24c3c695c8adeaeb1bebd4775e6db, 0x0050b7 ] } , - BigNum { limbs: [ 0x82450dbe073be8162efe65f1c2b990, 0xe506ed3420bd548b26494c5a621e78, 0x002335 ] } , - BigNum { limbs: [ 0xa313c570ab8955f200997b72638044, 0x1d4a924ff12c414d5089f0005021b8, 0x002766 ] } , - BigNum { limbs: [ 0x1a903d8f52d2a90dff66838d9c7fbd, 0x8a08974d8c1bf1ec877e19a187e39b, 0x004c87 ] } , - BigNum { limbs: [ 0x26e08e98f535f7d926780461c4412e, 0x04d7414d275f813645eb330abba16f, 0x0025c8 ] } , - BigNum { limbs: [ 0x96c3746709260726d987fa9e3bbed3, 0xa27be85055e8b203921cd6971c63e4, 0x004e25 ] } , - BigNum { limbs: [ 0xffb58180dbddb697e6464586a3c1f2, 0xa73ddf3c08fb77c24e3f7bf07ef1a5, 0x0066ea ] } , - BigNum { limbs: [ 0xbdee817f227e486819b9b9795c3e0f, 0x00154a61744cbb7789c88db15913ad, 0x000d03 ] } , - BigNum { limbs: [ 0xb5fd1b6520b64f5cef645780dae73a, 0x20d7559308f9f5d546e12b96e676d1, 0x001003 ] } , - BigNum { limbs: [ 0x07a6e79adda5afa3109ba77f2518c7, 0x867bd40a744e3d649126de0af18e82, 0x0063ea ] } , - BigNum { limbs: [ 0x622b2b52a6ab0b7ab8ee9ac98a8d7e, 0xa97cc93ad09290d0a58bfaa779a8c7, 0x002ed8 ] } , - BigNum { limbs: [ 0x5b78d7ad57b0f38547116436757283, 0xfdd66062acb5a269327c0efa5e5c8c, 0x004514 ] } , - BigNum { limbs: [ 0x1834a15ff80aa4e841ea9826658b7e, 0x58030ec6229b305f1185818dcbc279, 0x003028 ] } , - BigNum { limbs: [ 0xa56f61a006515a17be1566d99a7483, 0x4f501ad75aad02dac68288140c42da, 0x0043c5 ] } , - BigNum { limbs: [ 0xb74e7e1fdce2dfec6ebe6bc75f4525, 0xbf28f8d74d24bce4247004ed136470, 0x003a9b ] } , - BigNum { limbs: [ 0x065584e021791f1391419338a0badc, 0xe82a30c630237655b39804b4c4a0e3, 0x003951 ] } , - BigNum { limbs: [ 0xc4791e8b2f6ad1aeba5359ffa6d38a, 0x0a347a817232d7a9657681f941e95b, 0x006771 ] } , - BigNum { limbs: [ 0xf92ae474cef12d5145aca500592c77, 0x9d1eaf1c0b155b90729187a8961bf7, 0x000c7c ] } , - BigNum { limbs: [ 0x25b8b09f6d68bc07f823c58292eb13, 0x93642325a070e27236b5fb2b67dff3, 0x001171 ] } , - BigNum { limbs: [ 0x97eb526090f342f807dc397d6d14ee, 0x13ef0677dcd750c7a1520e76702560, 0x00627c ] } , - BigNum { limbs: [ 0x28b98366702bc829412db575a279c9, 0x62c80c40bea15372b6a1865386e2db, 0x003acb ] } , - BigNum { limbs: [ 0x94ea7f998e3036d6bed2498a5d8638, 0x448b1d5cbea6dfc72166834e512278, 0x003922 ] } , - BigNum { limbs: [ 0xbe42bfce5c9610be93f312c8292e1e, 0x71cc91fbe8bc55509e3b4f24bdf9fc, 0x000adb ] } , - BigNum { limbs: [ 0xff614331a1c5ee416c0cec37d6d1e3, 0x358697a1948bdde939ccba7d1a0b56, 0x006912 ] } , - BigNum { limbs: [ 0xc950bec8ad26d22a13d83cf7fe22f5, 0xc3b812a28583c6722be5eb5afcebf6, 0x001fc4 ] } , - BigNum { limbs: [ 0xf453443751352cd5ec27c20801dd0c, 0xe39b16faf7c46cc7ac221e46db195c, 0x005428 ] } , - BigNum { limbs: [ 0x67c8dc89f09e243ff24af474baab89, 0xce0753afea368a5fd8a9bc16edad3c, 0x0058e9 ] } , - BigNum { limbs: [ 0x55db26760dbddac00db50a8b455478, 0xd94bd5ed9311a8d9ff5e4d8aea5817, 0x001b03 ] } , - BigNum { limbs: [ 0x73eda682de6efb0a4c7b59c7d6a001, 0x2b19e6a3004a984c6f376fdbecb6f1, 0x001165 ] } , - BigNum { limbs: [ 0x49b65c7d1fed03f5b384a538296000, 0x7c3942fa7cfd9aed68d099c5eb4e62, 0x006288 ] } , - BigNum { limbs: [ 0x8348c02148773d4992bd10577109a9, 0xcffdb77a352e52a72bbf71903cdef4, 0x00533a ] } , - BigNum { limbs: [ 0x3a5b42deb5e4c1b66d42eea88ef658, 0xd75572234819e092ac4898119b265f, 0x0020b2 ] } , - BigNum { limbs: [ 0x261a04909fee7713defee0e6ef1c0b, 0xc9550322543e26ce6a4863fe9f1cdc, 0x001149 ] } , - BigNum { limbs: [ 0x9789fe6f5e6d87ec21011e1910e3f6, 0xddfe267b290a0c6b6dbfa5a338e877, 0x0062a3 ] } , - BigNum { limbs: [ 0x764a23f8363f09771ecf1f6fa8792a, 0xc56474a0f17aa463d85b83fa4718d9, 0x0068fa ] } , - BigNum { limbs: [ 0x4759df07c81cf588e130df905786d7, 0xe1eeb4fc8bcd8ed5ffac85a790ec7a, 0x000af2 ] } , - BigNum { limbs: [ 0x6c1d7063470830757bd66f2c220cb5, 0xed2db84f3edf32aa2c85ef62f777ef, 0x001366 ] } , - BigNum { limbs: [ 0x5186929cb753ce8a84298fd3ddf34c, 0xba25714e3e69008fab821a3ee08d64, 0x006086 ] } , - BigNum { limbs: [ 0xd603ce746ead3cab0f50466269c017, 0x42a7ef7453c90311dc3948a8a406e7, 0x0034ff ] } , - BigNum { limbs: [ 0xe7a0348b8faec254f0afb89d963fea, 0x64ab3a29297f3027fbcec0f933fe6b, 0x003eee ] } , - BigNum { limbs: [ 0x821fa799ff4830fb47e38af27634ad, 0xd2847f687ad2ad383e88c3a78dba53, 0x002a34 ] } , - BigNum { limbs: [ 0x3b845b65ff13ce04b81c740d89cb54, 0xd4ceaa3502758601997f45fa4a4b00, 0x0049b8 ] } , - BigNum { limbs: [ 0xda3e276fa1003fd0ee13c9ad8f4e2a, 0x3aeaba501cdc2b763df246a12c816d, 0x00288e ] } , - BigNum { limbs: [ 0xe365db905d5bbf2f11ec355270b1d7, 0x6c686f4d606c07c39a15c300ab83e5, 0x004b5f ] } , - BigNum { limbs: [ 0xdacec25d6009316354a7f9039f6bd0, 0xed21ad0a48522a8233d495ca0acbf0, 0x000f9c ] } , - BigNum { limbs: [ 0xe2d540a29e52cd9cab5805fc609431, 0xba317c9334f608b7a43373d7cd3962, 0x006450 ] } , - BigNum { limbs: [ 0x925ac87b1ea89669495a35b9b32bee, 0x827813b10130fbda6e7f6370fde30e, 0x000537 ] } , - BigNum { limbs: [ 0x2b493a84dfb36896b6a5c9464cd413, 0x24db15ec7c17375f6988a630da2245, 0x006eb6 ] } , - BigNum { limbs: [ 0x2256e0b4f93336c2fb95f6d8e94354, 0x2101c9e0a907b81fe8d1ce7384f2fc, 0x005389 ] } , - BigNum { limbs: [ 0x9b4d224b0528c83d046a082716bcad, 0x86515fbcd4407b19ef363b2e531257, 0x002064 ] } , - BigNum { limbs: [ 0xd29117d89c89f2887be86b0d1e0c44, 0xb031bcc3d43362dd843f9a791b1361, 0x000baf ] } , - BigNum { limbs: [ 0xeb12eb2761d20c77841793f2e1f3bd, 0xf7216cd9a914d05c53c86f28bcf1f1, 0x00683d ] } , - BigNum { limbs: [ 0x31b895251749649a40cec3efed2c3e, 0x420f5edb247c94c48f770ce0a1ccc0, 0x0035c0 ] } , - BigNum { limbs: [ 0x8beb6ddae7129a65bf313b1012d3c3, 0x6543cac258cb9e754890fcc1363893, 0x003e2d ] } , - BigNum { limbs: [ 0xcfd0128fae8e6fd88afa448df10020, 0xfeaa3bb550388157cf773ac768ee2f, 0x003049 ] } , - BigNum { limbs: [ 0xedd3f0704fcd8f277505ba720effe1, 0xa8a8ede82d0fb1e20890ceda6f1723, 0x0043a3 ] } , - BigNum { limbs: [ 0xebd5683b5107351786986f25b8c4eb, 0xf9071049a3423066636befa7cbb4bf, 0x001d21 ] } , - BigNum { limbs: [ 0xd1ce9ac4ad54c9e879678fda473b16, 0xae4c1953da0602d3749c19fa0c5093, 0x0056cb ] } , - BigNum { limbs: [ 0x181a5532aa4292094e5a3c1c23592f, 0xaa4a68971dac44f6a415a105636a2c, 0x006632 ] } , - BigNum { limbs: [ 0xa589adcd54196cf6b1a5c2e3dca6d2, 0xfd08c1065f9bee4333f2689c749b27, 0x000dba ] } , - BigNum { limbs: [ 0x8e1608aed6392964c09997f7309548, 0xd74bfed628785090e796f4b22649a5, 0x004799 ] } , - BigNum { limbs: [ 0x2f8dfa512822d59b3f666708cf6ab9, 0xd0072ac754cfe2a8f07114efb1bbae, 0x002c53 ] } , - BigNum { limbs: [ 0xfa89ec51ae21e144b2c50f69db0fe9, 0xc071fe99d99bf32a65c1fc98d27474, 0x0027b5 ] } , - BigNum { limbs: [ 0xc31a16ae503a1dbb4d3aef9624f018, 0xe6e12b03a3ac400f72460d090590de, 0x004c37 ] } , - BigNum { limbs: [ 0x30cd0539d2e3cc474383fc894b14a5, 0x9afbf01afa63607f5ced1ef06cd3cc, 0x002fa8 ] } , - BigNum { limbs: [ 0x8cd6fdc62b7832b8bc7c0276b4eb5c, 0x0c57398282e4d2ba7b1aeab16b3187, 0x004445 ] } , - BigNum { limbs: [ 0x66aa267ff0c40dce36e2bba383cde2, 0xc10478f686c30ad95b286b5e390d81, 0x002d4f ] } , - BigNum { limbs: [ 0x56f9dc800d97f131c91d435c7c321f, 0xe64eb0a6f68528607cdf9e439ef7d2, 0x00469d ] } , - BigNum { limbs: [ 0x729323e6a43d9c3a0c5e0027bcb06b, 0x2bcbbf4106de149a775096aade316d, 0x0068f0 ] } , - BigNum { limbs: [ 0x4b10df195a1e62c5f3a1fed8434f96, 0x7b876a5c766a1e9f60b772f6f9d3e6, 0x000afd ] } , - BigNum { limbs: [ 0xc1d2d20d7a9648616dd104dfe7af57, 0x3a83f4de55e827ccf4829061077400, 0x005461 ] } , - BigNum { limbs: [ 0xfbd130f283c5b69e922efa201850aa, 0x6ccf34bf27600b6ce3857940d09152, 0x001f8c ] } , - BigNum { limbs: [ 0x16fcab115bdccf5650dc547f83d420, 0xa1b445fbc70549cf76cd4ebc162b97, 0x0020e7 ] } , - BigNum { limbs: [ 0xa6a757eea27f2fa9af23aa807c2be1, 0x059ee3a1b642e96a613abae5c1d9bc, 0x005306 ] } , - BigNum { limbs: [ 0xd13c4436bf8446033d7714239677a3, 0xf550da968bdde1bb8f3f820cb9c88a, 0x002ea5 ] } , - BigNum { limbs: [ 0xec67bec93ed7b8fcc288eadc69885e, 0xb2024f06f16a517e48c887951e3cc8, 0x004547 ] } , - BigNum { limbs: [ 0x9b4cf1f2482fe576d7a99b526711e2, 0x560163280fb149acc815cf032264a5, 0x005319 ] } , - BigNum { limbs: [ 0x2257110db62c1989285663ad98ee1f, 0x5151c6756d96e98d0ff23a9eb5a0ae, 0x0020d4 ] } , - BigNum { limbs: [ 0xaec88ee881235a52b32a60b8e455b4, 0x092de46650cd0a4168c082b342d2bd, 0x0006ef ] } , - BigNum { limbs: [ 0x0edb74177d38a4ad4cd59e471baa4d, 0x9e2545372c7b28f86f4786ee953296, 0x006cfe ] } , - BigNum { limbs: [ 0x7c7657a8c39c6ae7e70b8702985801, 0x11ce67638bb48bb0d072e80f7dbcd6, 0x003052 ] } , - BigNum { limbs: [ 0x412dab573abf941818f477fd67a800, 0x9584c239f193a789079521925a487d, 0x00439b ] } , - BigNum { limbs: [ 0x3e81d1369fa1548f60145b42872396, 0xdd44261bb43655881ecf77aed1d51a, 0x001c1e ] } , - BigNum { limbs: [ 0x7f2231c95ebaaa709feba3bd78dc6b, 0xca0f0381c911ddb1b93891f3063039, 0x0057ce ] } , - BigNum { limbs: [ 0xdf9313ca3ceb5bd7da4dfded322a18, 0xda37eff9531314ebea19ff20f2882c, 0x004817 ] } , - BigNum { limbs: [ 0xde10ef35c170a32825b20112cdd5e9, 0xcd1b39a42a351e4dedee0a80e57d26, 0x002bd5 ] } , - BigNum { limbs: [ 0xe08d7e57dce7cb8e7f2b66b0e143c1, 0x75dc018fdac1261437ec1d7ff86534, 0x00492f ] } , - BigNum { limbs: [ 0xdd1684a82174337180d4984f1ebc40, 0x3177280da2870d25a01bec21dfa01e, 0x002abe ] } , - BigNum { limbs: [ 0x8024d8a958b35f3758bb58975ab90a, 0x7728642ed36848283f2acbea394743, 0x00697c ] } , - BigNum { limbs: [ 0x3d7f2a56a5a89fc8a744a668a546f7, 0x302ac56ea9dfeb1198dd3db79ebe10, 0x000a71 ] } , - BigNum { limbs: [ 0xb874bf6cb7b34ea4edd77166b4b890, 0xed98566aef05c3d07bc26629fa07d5, 0x000bbe ] } , - BigNum { limbs: [ 0x052f439346a8b05b12288d994b4771, 0xb9bad3328e426f695c45a377ddfd7e, 0x00682e ] } , - BigNum { limbs: [ 0x0341523b1e2b0fe0a7c47729521908, 0xa605bd0ee4ef607e046f5c3b891fc1, 0x005196 ] } , - BigNum { limbs: [ 0xba62b0c4e030ef1f583b87d6ade6f9, 0x014d6c8e9858d2bbd398ad664ee592, 0x002257 ] } , - BigNum { limbs: [ 0x9bbdace5e53b4df38dc6e275e33ea8, 0x90587e54f7412291c3c77522e38952, 0x007007 ] } , - BigNum { limbs: [ 0x21e6561a1920b10c72391c8a1cc159, 0x16faab48860710a81440947ef47c01, 0x0003e6 ] } , - BigNum { limbs: [ 0x32fabbeba001df136f22d12184a412, 0x91f315218990b06ca75e06153bf7e9, 0x0021df ] } , - BigNum { limbs: [ 0x8aa947145e5a1fec90dd2dde7b5bef, 0x1560147bf3b782cd30aa038c9c0d6a, 0x00520e ] } , - BigNum { limbs: [ 0x93ad8b63401f10af2066d9230d5cd5, 0x4b10febd33b59aa62fc828bd43ad4f, 0x00060c ] } , - BigNum { limbs: [ 0x29f6779cbe3cee50df9925dcf2a32c, 0x5c422ae049929893a83fe0e4945804, 0x006de1 ] } , - BigNum { limbs: [ 0xa17a38edf3fd86725b9b9768dc6c42, 0x6fad8fe1409d5946033c46cd4570f9, 0x0006c4 ] } , - BigNum { limbs: [ 0x1c29ca120a5e788da46467972393bf, 0x37a599bc3caad9f3d4cbc2d492945a, 0x006d29 ] } , - BigNum { limbs: [ 0x31c76f5cf068468d458327b73ddc7c, 0x99e7cf9a16e8c07575d1ac569a2e9e, 0x005e45 ] } , - BigNum { limbs: [ 0x8bdc93a30df3b872ba7cd748c22385, 0x0d6b5a03665f72c462365d4b3dd6b5, 0x0015a8 ] } , - BigNum { limbs: [ 0x6456f1dcb438470271551075bccd1c, 0x3b981d99b43c13781ac98060c1eb67, 0x00204e ] } , - BigNum { limbs: [ 0x594d11234a23b7fd8eaaee8a4332e5, 0x6bbb0c03c90c1fc1bd3e89411619ec, 0x00539f ] } , - BigNum { limbs: [ 0xff6d0f9930affa01cc0dd7e85165c9, 0x8b60b927f0cb455f4edbe4e9d60558, 0x00541e ] } , - BigNum { limbs: [ 0xbe36f366cdac04fe33f22717ae9a38, 0x1bf270758c7cedda892c24b801fffa, 0x001fcf ] } , - BigNum { limbs: [ 0x1ae7ec2e0a1721c279ce0685994266, 0xeee6d9bb26c1b31edccc596a1562b0, 0x00066b ] } , - BigNum { limbs: [ 0xa2bc16d1f444dd3d8631f87a66bd9b, 0xb86c4fe25686801afb3bb037c2a2a3, 0x006d81 ] } , - BigNum { limbs: [ 0x7b043e49e87f7604514c414efd30e9, 0x4489831b6ef6706407321a7a10207e, 0x003862 ] } , - BigNum { limbs: [ 0x429fc4b615dc88fbaeb3bdb102cf18, 0x62c9a6820e51c2d5d0d5ef27c7e4d5, 0x003b8b ] } , - BigNum { limbs: [ 0xc6323b77e26860686d36176ddfe315, 0xb2be18ac0f4ffe7781bcf9fc62302a, 0x006ce4 ] } , - BigNum { limbs: [ 0xf771c7881bf39e9792c9e792201cec, 0xf49510f16df834c2564b0fa575d528, 0x000708 ] } , - BigNum { limbs: [ 0xba818950e3ad44cfce9094a3418d85, 0xc0355241ba5b5ced48fbd3227676bc, 0x006786 ] } , - BigNum { limbs: [ 0x032279af1aaeba30316f6a5cbe727c, 0xe71dd75bc2ecd64c8f0c367f618e97, 0x000c66 ] } , - BigNum { limbs: [ 0x287ba3ce0ab1253d479d495d655bfd, 0x5c6751cc1fb679433492a76830cc04, 0x001791 ] } , - BigNum { limbs: [ 0x95285f31f3aad9c2b862b5a29aa404, 0x4aebd7d15d91b9f6a3756239a7394f, 0x005c5c ] } , - BigNum { limbs: [ 0x5f7e97974a735a32c5d56bd1ffcdc4, 0x90c4d7ad1cd6cbcd66b46cc97a21c7, 0x005556 ] } , - BigNum { limbs: [ 0x5e256b68b3e8a4cd3a2a932e00323d, 0x168e51f06071676c71539cd85de38c, 0x001e97 ] } , - BigNum { limbs: [ 0x35bfcb67912b816dac73fc55d091eb, 0xf0e031a2782306dbca9dae7b5d14e2, 0x00136c ] } , - BigNum { limbs: [ 0x87e437986d307d92538c02aa2f6e16, 0xb672f7fb05252c5e0d6a5b267af071, 0x006080 ] } , - BigNum { limbs: [ 0xb17f8097e31d12382dcf2d892dafd6, 0xd5ecb54ee9145778eb237dd16e40c3, 0x0019bb ] } , - BigNum { limbs: [ 0x0c2482681b3eecc7d230d176d2502b, 0xd166744e9433dbc0ece48bd069c490, 0x005a31 ] } , - BigNum { limbs: [ 0x36eb496169c1fc5f729abc6eb11977, 0x7d17a51de7d1e0bd881d012a6c7be2, 0x0062c4 ] } , - BigNum { limbs: [ 0x86b8b99e949a02a08d6542914ee68a, 0x2a3b847f9576527c4feb08776b8971, 0x001129 ] } , - BigNum { limbs: [ 0x6fd885fe5230545957f71245653af6, 0x4de4ef29d6cf7d8757bee5707cb352, 0x004ea8 ] } , - BigNum { limbs: [ 0x4dcb7d01ac2baaa6a808ecba9ac50b, 0x596e3a73a678b5b2804924315b5201, 0x002545 ] } , - BigNum { limbs: [ 0x112d36bfb47e859afdab17da13db8e, 0x9920289a696c6a617e128cdffa0355, 0x0023bd ] } , - BigNum { limbs: [ 0xac76cc4049dd79650254e725ec2473, 0x0e33010313dbc8d859f57cc1de01fe, 0x005030 ] } , - BigNum { limbs: [ 0x241aa91192721cbefec621a2f60004, 0xb5d66d51e4f10991cd3d2baef8de85, 0x005ee9 ] } , - BigNum { limbs: [ 0x998959ee6be9e2410139dd5d09fffd, 0xf17cbc4b985729a80acaddf2df26ce, 0x001503 ] } , - BigNum { limbs: [ 0x4c90665827e4d53a421b9e5d4221ba, 0x9708c2cdf26eea1254d370dc314cfd, 0x0047f6 ] } , - BigNum { limbs: [ 0x71139ca7d67729c5bde460a2bdde47, 0x104a66cf8ad94927833498c5a6b856, 0x002bf7 ] } , - BigNum { limbs: [ 0x321401e2c769844e074f0425cb136a, 0xff0986f64e4112350962aa0adf28fe, 0x003d48 ] } , - BigNum { limbs: [ 0x8b90011d36f27ab1f8b0fada34ec97, 0xa849a2a72f072104cea55f96f8dc55, 0x0036a4 ] } , - BigNum { limbs: [ 0xcdba97c146f639f479a99e1ab97a9c, 0xcb4ac95cf3a7b4f9604884d16bc683, 0x00005c ] } , - BigNum { limbs: [ 0xefe96b3eb765c50b865660e5468565, 0xdc08604089a07e4077bf84d06c3ecf, 0x007390 ] } , - BigNum { limbs: [ 0xdea74b06b8b9a9e1995f98f6b289cb, 0xa45fa2977566e3961c2ae88454cd7e, 0x002fcc ] } , - BigNum { limbs: [ 0xdefcb7f945a2551e66a066094d7636, 0x02f3870607e14fa3bbdd211d8337d4, 0x004421 ] } , - BigNum { limbs: [ 0x65814cb1f2c0d8c8c597d89f89e6bd, 0xff64346aeec01a3bb18fecadd8741c, 0x0057b6 ] } , - BigNum { limbs: [ 0x5822b64e0b9b26373a682660761944, 0xa7eef5328e8818fe26781cf3ff9137, 0x001c36 ] } , - BigNum { limbs: [ 0xc270a8f22ec94c03a385716bcf1636, 0xfff1a6485ebf5b305a3cb85581b075, 0x0014c7 ] } , - BigNum { limbs: [ 0xfb335a0dcf92b2fc5c7a8d9430e9cb, 0xa76183551e88d8097dcb514c5654dd, 0x005f25 ] } , - BigNum { limbs: [ 0x8c6dd18d29c73c9047c6550507e773, 0x7ab3c60342ed7dd32ed780d459538f, 0x0007d3 ] } , - BigNum { limbs: [ 0x31363172d494c26fb839a9faf8188e, 0x2c9f639a3a5ab566a93088cd7eb1c4, 0x006c1a ] } , - BigNum { limbs: [ 0x13877ba98302fb17c6ea4cfca0515a, 0x4fa1ced6752b8983c878dd0222bcf0, 0x002b3d ] } , - BigNum { limbs: [ 0xaa1c87567b5903e83915b2035faea7, 0x57b15ac7081ca9b60f8f2c9fb54863, 0x0048b0 ] } , - BigNum { limbs: [ 0x0de8919442238235ecefabf33fbb07, 0x5151c56254c55a99d0ba0e80f533ef, 0x0052ce ] } , - BigNum { limbs: [ 0xafbb716bbc387cca1310530cc044fa, 0x5601643b2882d8a0074dfb20e2d164, 0x00211f ] } , - BigNum { limbs: [ 0xacc25a0d08100ae5d108c29934483b, 0x18503620f023dd4b38affba8859523, 0x005cb3 ] } , - BigNum { limbs: [ 0x10e1a8f2f64bf41a2ef73c66cbb7c6, 0x8f02f37c8d2455ee9f580df9527030, 0x00173a ] } , - BigNum { limbs: [ 0x1791d39aa1c282d2c06b15735b6446, 0xc94cd608deb704b81640a01580902d, 0x005faf ] } , - BigNum { limbs: [ 0xa6122f655c997c2d3f94e98ca49bbb, 0xde0653949e912e81c1c7698c577526, 0x00143d ] } , - BigNum { limbs: [ 0xac7f2efa3ee1532072aae9e10b0615, 0xe38f6ac83fc008609f8b7832c58009, 0x005397 ] } , - BigNum { limbs: [ 0x1124d405bf7aabdf8d55151ef4f9ec, 0xc3c3bed53d882ad9387c916f12854a, 0x002055 ] } , - BigNum { limbs: [ 0x912fd965ed7435a1f6f6f489b09c71, 0xe767672552b5d22a99a4734dd9c937, 0x0004f0 ] } , - BigNum { limbs: [ 0x2c74299a10e7c95e09090a764f6390, 0xbfebc2782a92610f3e639653fe3c1c, 0x006efc ] } , - BigNum { limbs: [ 0x353846fb59dfbe77eed0ac01d3bbcf, 0x695563e43133b3a64d286b7caa8550, 0x0004fe ] } , - BigNum { limbs: [ 0x886bbc04a47c4088112f52fe2c4432, 0x3dfdc5b94c147f938adf9e252d8003, 0x006eef ] } , - BigNum { limbs: [ 0x0094a6d7937bc4d3a02f10d659ef99, 0x5c4645aed47db9e9fc04049a2c5cf9, 0x0043db ] } , - BigNum { limbs: [ 0xbd0f5c286ae03a2c5fd0ee29a61068, 0x4b0ce3eea8ca794fdc040507aba85a, 0x003012 ] } , - BigNum { limbs: [ 0x86ec15296d70c9a4422eac799f38d4, 0x5b794b0b66b091529f2516782c7748, 0x00629b ] } , - BigNum { limbs: [ 0x36b7edd690eb355bbdd1528660c72d, 0x4bd9de921697a1e738e2f329ab8e0b, 0x001152 ] } , - BigNum { limbs: [ 0xe6792ca0b784d887c11b15fcf4ede4, 0x57f8ff83873576de834c6c9d4e65db, 0x004101 ] } , - BigNum { limbs: [ 0xd72ad65f46d726783ee4e9030b121d, 0x4f5a2a19f612bc5b54bb9d04899f77, 0x0032ec ] } , - BigNum { limbs: [ 0xfa1640611812e542a4f2d15e024fb2, 0xf978f827945ace309f9cd3bb8c6710, 0x001ee4 ] } , - BigNum { limbs: [ 0xc38dc29ee64919bd5b0d2da1fdb04f, 0xadda3175e8ed6509386b35e64b9e42, 0x005508 ] } , - BigNum { limbs: [ 0x2f27a524ea1827f90f24728ede060e, 0x263a0e318da3c45e1486741e6219d6, 0x005d87 ] } , - BigNum { limbs: [ 0x8e7c5ddb1443d706f0db8c7121f9f3, 0x81191b6befa46edbc381958375eb7d, 0x001666 ] } , - BigNum { limbs: [ 0x8782d903064cc4f3ca01e033ab015b, 0x34223e2a7565a8a26bc74583e2e452, 0x002f80 ] } , - BigNum { limbs: [ 0x362129fcf80f3a0c35fe1ecc54fea6, 0x7330eb7307e28a976c40c41df52101, 0x00446d ] } , - BigNum { limbs: [ 0x343f994997c69b3ea3321f09ec193e, 0x4c7bf53152d35e37e27004bb52bc36, 0x002e40 ] } , - BigNum { limbs: [ 0x896469b6669563c15ccddff613e6c3, 0x5ad7346c2a74d501f59804e685491d, 0x0045ad ] } , - BigNum { limbs: [ 0x4bb75fa2abe942ee4d4fce11edeeea, 0xfb1c4dc5a45ac3f903d2e1f4df683d, 0x0027b2 ] } , - BigNum { limbs: [ 0x71eca35d5272bc11b2b030ee121117, 0xac36dbd7d8ed6f40d43527acf89d16, 0x004c3a ] } , - BigNum { limbs: [ 0xbaf1f3abe8931102c7773d56ed08cc, 0x297c74fdf046da34802c41a29d928e, 0x00018a ] } , - BigNum { limbs: [ 0x02b20f5415c8edfd3888c1a912f735, 0x7dd6b49f8d01590557dbc7ff3a72c5, 0x007263 ] } , - BigNum { limbs: [ 0xb5f4e0a9aed70607c51335da7f4757, 0x4d107aa3bd21933e63be9f172f30f4, 0x00247f ] } , - BigNum { limbs: [ 0x07af22564f84f8f83aecc92580b8aa, 0x5a42aef9c0269ffb74496a8aa8d45f, 0x004f6e ] } , - BigNum { limbs: [ 0x2133dc64414ab86fcaf0b0c072095c, 0x1d71ac229105382542dd4f28fc70f1, 0x005c23 ] } , - BigNum { limbs: [ 0x9c70269bbd114690350f4e3f8df6a5, 0x89e17d7aec42fb14952aba78db9462, 0x0017ca ] } , - BigNum { limbs: [ 0x641f0c6747e1af7b1feb89ca03b33a, 0x079ea8ce63e5f0ed0b7087f6223096, 0x001728 ] } , - BigNum { limbs: [ 0x5984f698b67a4f84e0147535fc4cc7, 0x9fb480cf1962424ccc9781abb5d4bd, 0x005cc5 ] } , - BigNum { limbs: [ 0xf1654b43591f44eb1bbc95cbf8c309, 0x04b668f3cbd178895538f58e3b6119, 0x00680c ] } , - BigNum { limbs: [ 0xcc3eb7bca53cba14e4436934073cf8, 0xa29cc0a9b176bab082cf14139ca439, 0x000be1 ] } , - BigNum { limbs: [ 0x66253f0138106a005f897ecbca7f98, 0x784f02660155dd99dbada73039e278, 0x005779 ] } , - BigNum { limbs: [ 0x577ec3fec64b94ffa0768034358069, 0x2f0427377bf2559ffc5a62719e22db, 0x001c74 ] } , - BigNum { limbs: [ 0x8a3fe004d9d74056ae0516246cba9d, 0x1a56c5a8aef02991e3d4eaab720e54, 0x00538d ] } , - BigNum { limbs: [ 0x336422fb2484bea951fae8db934564, 0x8cfc63f4ce5809a7f4331ef665f6ff, 0x002060 ] } , - BigNum { limbs: [ 0x8db5aa88a154d9f32095c4ca130a82, 0x47df8dd211c6b824cdca9007b7600a, 0x0055cf ] } , - BigNum { limbs: [ 0x2fee58775d07250cdf6a3a35ecf57f, 0x5f739bcb6b817b150a3d799a20a549, 0x001e1e ] } , - BigNum { limbs: [ 0x10d29d21246db3117a425fbb152505, 0x1aec5eb41b1766ad339a747a987ff3, 0x003043 ] } , - BigNum { limbs: [ 0xacd165ded9ee4bee85bd9f44eadafc, 0x8c66cae96230cc8ca46d95273f8560, 0x0043aa ] } , - BigNum { limbs: [ 0x177d01486ba745d8bd7f77aef4b971, 0x59574bf36dd81a93e13e32b362c919, 0x0067af ] } , - BigNum { limbs: [ 0xa62701b792b4b927428087510b4690, 0x4dfbddaa0f7018a5f6c9d6ee753c3a, 0x000c3e ] } , - BigNum { limbs: [ 0x91eb5c10513dd708dc53fc436ac554, 0x8e01fcdc0d7e2ba9f08e2ae872a6fd, 0x004c12 ] } , - BigNum { limbs: [ 0x2bb8a6efad1e27f723ac02bc953aad, 0x19512cc16fca078fe779deb9655e56, 0x0027db ] } , - BigNum { limbs: [ 0x727708895e84f5f25cbffb7e0338b3, 0x6f98e9536fafb797cd439a1b38f750, 0x00498e ] } , - BigNum { limbs: [ 0x4b2cfa769fd7090da3400381fcc74e, 0x37ba404a0d987ba20ac46f869f0e03, 0x002a5f ] } , - BigNum { limbs: [ 0x71406ca58dfd2f6167a380e712c26d, 0x3fe3e3b130fc4db90fcb03ab8b8d3a, 0x000fd2 ] } , - BigNum { limbs: [ 0x4c63965a705ecf9e985c7e18ed3d94, 0x676f45ec4c4be580c83d05f64c7819, 0x00641b ] } , - BigNum { limbs: [ 0x7cfe5c411500894f5db9ec17dc2ec4, 0xf50f4a7ee4f48cc0def334cfc94486, 0x0026af ] } , - BigNum { limbs: [ 0x40a5a6bee95b75b0a24612e823d13d, 0xb243df1e9853a678f914d4d20ec0cd, 0x004d3d ] } , - BigNum { limbs: [ 0xd91d5763e143e1cda5b3da3835833a, 0x6f49185f6f6777e146de1cc9711cb8, 0x006f06 ] } , - BigNum { limbs: [ 0xe486ab9c1d181d325a4c24c7ca7cc7, 0x380a113e0de0bb589129ecd866e89a, 0x0004e7 ] } , - BigNum { limbs: [ 0xe2cb2be68ea808a3e6be78c2ee9734, 0x17229a86e06194b65d827dffe32966, 0x005f13 ] } , - BigNum { limbs: [ 0xdad8d7196fb3f65c1941863d1168cd, 0x90308f169ce69e837a858ba1f4dbec, 0x0014da ] } , - BigNum { limbs: [ 0x48e670c23af1a5d33f284034b0778b, 0x462cfa754f7d4a0a66962a66901779, 0x0018d2 ] } , - BigNum { limbs: [ 0x74bd923dc36a592cc0d7becb4f8876, 0x61262f282dcae92f7171df3b47edda, 0x005b1b ] } , - BigNum { limbs: [ 0x502652187591b7ca72fca801a36230, 0x6b5d836aba048356118b3e0612af7e, 0x0032ec ] } , - BigNum { limbs: [ 0x6d7db0e788ca47358d0356fe5c9dd1, 0x3bf5a632c343afe3c67ccb9bc555d5, 0x004101 ] } , - BigNum { limbs: [ 0x392b42a74453e4565ace73aac4afac, 0x8707dc856ee8838a6706e4a3733924, 0x0043b2 ] } , - BigNum { limbs: [ 0x8478c058ba081aa9a5318b553b5055, 0x204b4d180e5fafaf710124fe64cc2f, 0x00303b ] } , - BigNum { limbs: [ 0xdec558c2b992f629b7efa78ed49d26, 0xf8f34e0e4e0ac55d1d1a405c996e82, 0x005835 ] } , - BigNum { limbs: [ 0xdedeaa3d44c908d6481057712b62db, 0xae5fdb8f2f3d6ddcbaedc9453e96d0, 0x001bb7 ] } , - BigNum { limbs: [ 0xf6e5a9119212860548495f4ad6481e, 0x3b498490bb280f3f8e7d2b4d558fce, 0x000902 ] } , - BigNum { limbs: [ 0xc6be59ee6c4978fab7b69fb529b7e3, 0x6c09a50cc22023fa498ade54827584, 0x006aeb ] } , - BigNum { limbs: [ 0x2e1db88ee84b9a5e6daac66fc8728a, 0x8f6521310f40f3657493bba35e9907, 0x002d55 ] } , - BigNum { limbs: [ 0x8f864a71161064a192553890378d77, 0x17ee086c6e073fd463744dfe796c4c, 0x004698 ] } , - BigNum { limbs: [ 0x230a9941083f8ecf9f8111b1ef9dc0, 0xd562459e2aafcfd1d4c7782ecb99b6, 0x0068c0 ] } , - BigNum { limbs: [ 0x9a9969bef61c7030607eed4e106241, 0xd1f0e3ff52986368034091730c6b9d, 0x000b2c ] } , - BigNum { limbs: [ 0x6d2595664fbc4930c0a4aa4b5136a8, 0xa262e9116b0c4794df08ce274be96c, 0x00716e ] } , - BigNum { limbs: [ 0x507e6d99ae9fb5cf3f5b54b4aec959, 0x04f0408c123beba4f8ff3b7a8c1be7, 0x00027f ] } , - BigNum { limbs: [ 0xe3c5291a4615c8b789f8deea4a149c, 0xb416a79063d5e0fda13cd92590b8ec, 0x0047af ] } , - BigNum { limbs: [ 0xd9ded9e5b846364876072015b5eb65, 0xf33c820d1972523c36cb307c474c66, 0x002c3d ] } , - BigNum { limbs: [ 0xd2881ff9961ba65476b8b150105d16, 0xf9c51e9e0a4a55da9ec7d3b0c908fd, 0x00327b ] } , - BigNum { limbs: [ 0xeb1be306684058ab89474dafefa2eb, 0xad8e0aff72fddd5f394035f10efc55, 0x004171 ] } , - BigNum { limbs: [ 0x9854adbe0ee2ce5cce5be38c085457, 0xe1e13d2d0424b9a069094b52cd35aa, 0x0052d7 ] } , - BigNum { limbs: [ 0x254f5541ef7930a331a41b73f7abaa, 0xc571ec70792379996efebe4f0acfa9, 0x002115 ] } , - BigNum { limbs: [ 0x0984935991fa79b66236ce89c824b3, 0x73a8febdd972fc8273f2840979b017, 0x006dd6 ] } , - BigNum { limbs: [ 0xb41f6fa66c6185499dc9307637db4e, 0x33aa2adfa3d536b7641585985e553c, 0x000617 ] } , - BigNum { limbs: [ 0xc3d514392193fd7d1588a9667bf5cc, 0xa8658a8fcca827aaf3f848275fa49e, 0x001a70 ] } , - BigNum { limbs: [ 0xf9ceeec6dcc80182ea775599840a35, 0xfeed9f0db0a00b8ee40fc17a7860b4, 0x00597c ] } , - BigNum { limbs: [ 0x4169069c77fdf1a5415faa6c06805b, 0x2052630abbd3810f51c6dc13078865, 0x003344 ] } , - BigNum { limbs: [ 0x7c3afc63865e0d5abea05493f97fa6, 0x8700c692c174b22a86412d8ed07cee, 0x0040a9 ] } , - BigNum { limbs: [ 0x4dd56603f78dab949e1e06c9aa4b0c, 0xd0c0c2f38069a0df956135ae881807, 0x003315 ] } , - BigNum { limbs: [ 0x6fce9cfc06ce536b61e1f83655b4f5, 0xd69266a9fcde925a42a6d3f34fed4c, 0x0040d7 ] } , - BigNum { limbs: [ 0x4ffa9a7c55e8b8d333d3d20b839c22, 0x0c7d84a763b48e15665fbded415e90, 0x006bf7 ] } , - BigNum { limbs: [ 0x6da96883a873462ccc2c2cf47c63df, 0x9ad5a4f61993a52471a84bb496a6c3, 0x0007f6 ] } , - BigNum { limbs: [ 0xeff6572f4ad10993fca26054dfc243, 0x2aaed4076db69d9e66dd3f254fe954, 0x00523c ] } , - BigNum { limbs: [ 0xcdadabd0b38af56c035d9eab203dbe, 0x7ca455960f91959b712aca7c881bfe, 0x0021b1 ] } , - BigNum { limbs: [ 0xdd9e6e6daea7fc2932eb01d81da901, 0x632d1326807e3f7d9a11e261feb981, 0x004267 ] } , - BigNum { limbs: [ 0xe00594924fb402d6cd14fd27e25700, 0x44261676fcc9f3bc3df6273fd94bd1, 0x003186 ] } , - BigNum { limbs: [ 0xaebc2ff1eba9c1e54bb87d7fe80ddf, 0xe09ad55921e98cc04d67baba3c2a12, 0x000b42 ] } , - BigNum { limbs: [ 0x0ee7d30e12b23d1ab447818017f222, 0xc6b854445b5ea6798aa04ee79bdb41, 0x0068aa ] } , - BigNum { limbs: [ 0xbf001d3f3525a47688aacce68620f2, 0x922ca880037b7fcd69e7d304c3f591, 0x004381 ] } , - BigNum { limbs: [ 0xfea3e5c0c9365a897755321979df0f, 0x1526811d79ccb36c6e20369d140fc1, 0x00306c ] } , - BigNum { limbs: [ 0x4909862b885f44761c5fc029fddad4, 0x6a0c04aaf3370750b9af1ababac1fe, 0x000973 ] } , - BigNum { limbs: [ 0x749a7cd475fcba89e3a03ed602252d, 0x3d4724f28a112be91e58eee71d4355, 0x006a7a ] } , - BigNum { limbs: [ 0xae928fadcd4831d72fdcbaf7e14265, 0x3cafdcc0abe82be6e18149672cebda, 0x000144 ] } , - BigNum { limbs: [ 0x0f1173523113cd28d02344081ebd9c, 0x6aa34cdcd1600752f686c03aab1979, 0x0072a9 ] } , - BigNum { limbs: [ 0xa4236514a460db28328df1ab654d16, 0x2c1ebcd59783fc8a065a163d9f4cc2, 0x0054c0 ] } , - BigNum { limbs: [ 0x19809deb59fb23d7cd720d549ab2eb, 0x7b346cc7e5c436afd1adf36438b891, 0x001f2d ] } , - BigNum { limbs: [ 0x5bdcb3774f915b07ae73cc5f0adfc4, 0x794f3d382a9ccd9ef0b2fc42184788, 0x006189 ] } , - BigNum { limbs: [ 0x61c74f88aecaa3f8518c32a0f5203d, 0x2e03ec6552ab659ae7550d5fbfbdcb, 0x001264 ] } , - BigNum { limbs: [ 0xae2ef914eb9c84ed29493ec7ff16ad, 0xd608aab2f155d1e0a3f39ccd56f235, 0x0006ff ] } , - BigNum { limbs: [ 0x0f7509eb12bf7a12d6b6c03800e954, 0xd14a7eea8bf2615934146cd481131e, 0x006ced ] } , - BigNum { limbs: [ 0x64311239b1d895ff006b399cdbad03, 0xf3bc93ece7b957cbd49e76a47e6512, 0x00739c ] } , - BigNum { limbs: [ 0x5972f0c64c836900ff94c5632452fe, 0xb39695b0958edb6e036992fd59a041, 0x000050 ] } , - BigNum { limbs: [ 0x3b1278ed8877796416ae308bf28026, 0xecb778afffb6cfe57afc10020d61be, 0x001d15 ] } , - BigNum { limbs: [ 0x82918a1275e4859be951ce740d7fdb, 0xba9bb0ed7d9163545d0bf99fcaa395, 0x0056d7 ] } , - BigNum { limbs: [ 0xa7a25b9dd49a5104134f5eb300e02c, 0x2cf64bb4d0a54cca2d246e68177c5c, 0x004abe ] } , - BigNum { limbs: [ 0x1601a76229c1adfbecb0a04cff1fd5, 0x7a5cdde8aca2e66faae39b39c088f7, 0x00292f ] } , - BigNum { limbs: [ 0x07912ff3f641530cb1faaca0788fe0, 0x5b54c3244b32b3a7469982c86c9c23, 0x0027fb ] } , - BigNum { limbs: [ 0xb612d30c081aabf34e05525f877021, 0x4bfe667932157f92916e86d96b6930, 0x004bf2 ] } , - BigNum { limbs: [ 0xe7b9caf31b2d93d22bd425ce277f07, 0xc32b66342b515ec60810c9256a359e, 0x000564 ] } , - BigNum { limbs: [ 0xd5ea380ce32e6b2dd42bd931d880fa, 0xe427c36951f6d473cff7407c6dcfb4, 0x006e88 ] } , - BigNum { limbs: [ 0xae1fbbafdb5d6b6b8fb9a311fecf6a, 0x4e985960df8adb247d8460b76bd1c3, 0x004713 ] } , - BigNum { limbs: [ 0x0f84475022fe939470465bee013097, 0x58bad03c9dbd58155a83a8ea6c3390, 0x002cda ] } , - BigNum { limbs: [ 0x1c350aec0b3d9f7c4974a6e2de02ce, 0xd22add877c74eb8ef78a912f31cc39, 0x0021ea ] } , - BigNum { limbs: [ 0xa16ef813f31e5f83b68b581d21fd33, 0xd5284c1600d347aae07d7872a6391a, 0x005202 ] } , - BigNum { limbs: [ 0x759ee4f8b7872c89cb2ac2efe4b7b2, 0x800723e729779ba9d6565fe057d9ec, 0x003192 ] } , - BigNum { limbs: [ 0x48051e0746d4d27634d53c101b484f, 0x274c05b653d0979001b1a9c1802b67, 0x00425b ] } , - BigNum { limbs: [ 0x38a0f2f40967a84ca08409a8a384de, 0x618531f3c2fb417a3bfc90d1ed929a, 0x0004ec ] } , - BigNum { limbs: [ 0x8503100bf4f456b35f7bf5575c7b23, 0x45cdf7a9ba4cf1bf9c0b78cfea72b9, 0x006f01 ] } , - BigNum { limbs: [ 0xc906e310e55dba95694d065456b35c, 0xa3d1543a026c52e78ec8b9131c2f04, 0x00238b ] } , - BigNum { limbs: [ 0xf49d1fef18fe446a96b2f8aba94ca5, 0x0381d5637adbe052493f508ebbd64e, 0x005062 ] } , - BigNum { limbs: [ 0xd6a06a8ea8362d01ba2547d610515c, 0x5e81e1a39cccacce6386bde5684344, 0x004ba2 ] } , - BigNum { limbs: [ 0xe70398715625d1fe45dab729efaea5, 0x48d147f9e07b866b74814bbc6fc20e, 0x00284b ] } , - BigNum { limbs: [ 0x79c270ed45b1b10c5a52a76e566b29, 0x5346918b58427c4d071c8074d853cf, 0x00661a ] } , - BigNum { limbs: [ 0x43e19212b8aa4df3a5ad5791a994d8, 0x540c98122505b6ecd0eb892cffb184, 0x000dd3 ] } , - BigNum { limbs: [ 0x51ddab9f8df2c2482b0a82571dcb2f, 0x2f50118af61c42047f4bca9c77227c, 0x000a93 ] } , - BigNum { limbs: [ 0x6bc6576070693cb7d4f57ca8e234d2, 0x78031812872bf13558bc3f0560e2d7, 0x00695a ] } , - BigNum { limbs: [ 0xbf8cff018d3fd547f1ac6f4f247155, 0xcc0f804e21cc7faa9e96bbb32656c8, 0x005f2f ] } , - BigNum { limbs: [ 0xfe1703fe711c29b80e538fb0db8eac, 0xdb43a94f5b7bb38f39714deeb1ae8a, 0x0014bd ] } , - BigNum { limbs: [ 0x993df5d2cd1e9be0a6e50591758013, 0xe5bb862b5850c6978a71db0ad7bdf4, 0x003f70 ] } , - BigNum { limbs: [ 0x24660d2d313d631f591af96e8a7fee, 0xc197a37224f76ca24d962e9700475f, 0x00347c ] } , - BigNum { limbs: [ 0x34cfeeea5489476fa1d2dc33b87eb2, 0x2622ab24e5ffb43d418e35f370eda4, 0x004a49 ] } , - BigNum { limbs: [ 0x88d41415a9d2b7905e2d22cc47814f, 0x81307e7897487efc9679d3ae6717af, 0x0029a4 ] } , - BigNum { limbs: [ 0xcc9b1e11e2ec48e9d8784aae9773f1, 0x1124d3b9bfe874aaaf084d7b70b146, 0x0067b0 ] } , - BigNum { limbs: [ 0xf108e4ee1b6fb6162787b451688c10, 0x962e55e3bd5fbe8f28ffbc2667540c, 0x000c3d ] } , - BigNum { limbs: [ 0x9d37098b72d8216927d7dda99b8de7, 0xbf19bfc7397c6472ebcd00e3e0a89e, 0x000981 ] } , - BigNum { limbs: [ 0x206cf9748b83dd96d828215664721a, 0xe83969d643cbcec6ec3b08bdf75cb5, 0x006a6b ] } , - BigNum { limbs: [ 0x791aa5b86eb2212ed6e368e6007ac7, 0x1aca575977854a79661981546231af, 0x0024f9 ] } , - BigNum { limbs: [ 0x44895d478fa9ddd1291c9619ff853a, 0x8c88d24405c2e8c071ee884d75d3a4, 0x004ef4 ] } , - BigNum { limbs: [ 0x6361c0c83281e576d1c74060f9d9f0, 0x9596a94aa9644272a5534fff051983, 0x006959 ] } , - BigNum { limbs: [ 0x5a424237cbda19892e38be9f062611, 0x11bc8052d3e3f0c732b4b9a2d2ebd0, 0x000a94 ] } , - BigNum { limbs: [ 0x401a70e8f8cbe0a21f95f3fed2fdbe, 0x4e034aea9a403f57dcda1e2ae449e2, 0x0007a8 ] } , - BigNum { limbs: [ 0x7d89921705901e5de06a0b012d0243, 0x594fdeb2e307f3e1fb2deb76f3bb71, 0x006c45 ] } , - BigNum { limbs: [ 0x161b4692e743eadc386425ab8aab6d, 0xa2d15922fea8fe36a849146f5f686e, 0x0012d2 ] } , - BigNum { limbs: [ 0xa788bc6d17181423c79bd954755494, 0x0481d07a7e9f35032fbef532789ce5, 0x00611b ] } , - BigNum { limbs: [ 0xa750313e41edce715dd2986b7a9257, 0xf286e40a4b9ce1ed373801462466b6, 0x002384 ] } , - BigNum { limbs: [ 0x1653d1c1bc6e308ea22d6694856daa, 0xb4cc459331ab514ca0d0085bb39e9d, 0x005068 ] } , - BigNum { limbs: [ 0xb854c4f8a2e9617ef67285b215a900, 0x3c93e82d71aff0937862b0585b7d43, 0x002450 ] } , - BigNum { limbs: [ 0x054f3e075b729d81098d794dea5701, 0x6abf41700b9842a65fa559497c8810, 0x004f9d ] } , - BigNum { limbs: [ 0x6d4c2d88fa625681ed9dc9132bcfdb, 0x32a32b4731cda80193295d0332a122, 0x005cb7 ] } , - BigNum { limbs: [ 0x5057d57703f9a87e126235ecd43026, 0x74affe564b7a8b3844deac9ea56431, 0x001736 ] } , - BigNum { limbs: [ 0x092646563372f4041dde43174ff8f2, 0x904b3a9c77ed4c2656dd12459b2213, 0x000580 ] } , - BigNum { limbs: [ 0xb47dbca9cae90afbe221bbe8b0070f, 0x1707ef01055ae713812af75c3ce340, 0x006e6d ] } , - BigNum { limbs: [ 0x4e6db419340260d5a8183c1c7d60a4, 0xe7628bbdcfe505c5ba7a29fc028164, 0x0011f8 ] } , - BigNum { limbs: [ 0x6f364ee6ca599e2a57e7c2e3829f5d, 0xbff09ddfad632d741d8ddfa5d583ef, 0x0061f4 ] } , - BigNum { limbs: [ 0xb273c4c4e5e000d2d6dc93b545d3d1, 0x29eabb6b5e70507a712031421c144f, 0x002493 ] } , - BigNum { limbs: [ 0x0b303e3b187bfe2d29236b4aba2c30, 0x7d686e321ed7e2bf66e7d85fbbf104, 0x004f5a ] } , - BigNum { limbs: [ 0x32aeac741053b05036d7b13a37da4e, 0x88c65b382599eefe3235831ae791af, 0x005792 ] } , - BigNum { limbs: [ 0x8af5568bee084eafc9284dc5c825b3, 0x1e8cce6557ae443ba5d28686f073a4, 0x001c5b ] } , - BigNum { limbs: [ 0x3f9a1ad0e21d61b104e66aca30e6b0, 0x49daefeb804b39e99a78b1fd01a405, 0x0038d9 ] } , - BigNum { limbs: [ 0x7e09e82f1c3e9d4efb199435cf1951, 0x5d7839b1fcfcf9503d8f57a4d6614e, 0x003b14 ] } , - BigNum { limbs: [ 0x67d2fb4e3c58144e842f43a452ee7f, 0x0ac7d65a912aeea58ac8967cec90d3, 0x005734 ] } , - BigNum { limbs: [ 0x55d107b1c203eab17bd0bb5bad1182, 0x9c8b5342ec1d44944d3f7324eb7480, 0x001cb9 ] } , - BigNum { limbs: [ 0xf10b1d38230a77273e2bf34ef523a8, 0xe6ebd737831a36e840b2491a34dcdc, 0x0037b9 ] } , - BigNum { limbs: [ 0xcc98e5c7db5187d8c1d40bb10adc59, 0xc0675265fa2dfc519755c087a32876, 0x003c33 ] } , - BigNum { limbs: [ 0xfaa4c4c7bead221b56c03124edee0d, 0x86c54a1b49bb820b0ddf66b3c1736f, 0x003e29 ] } , - BigNum { limbs: [ 0xc2ff3e383faedce4a93fcddb1211f4, 0x208ddf82338cb12eca28a2ee1691e3, 0x0035c4 ] } , - BigNum { limbs: [ 0x469cb25cd4ff1eec7ba01b17e50b58, 0x494c8cab7d73812de96735cf6688a8, 0x003317 ] } , - BigNum { limbs: [ 0x770750a3295ce013845fe3e81af4a9, 0x5e069cf1ffd4b20beea0d3d2717cab, 0x0040d6 ] } , - BigNum { limbs: [ 0x72368c797565e8c08510a472a5b7b6, 0xe2728652b4c6b69946eab3d642742c, 0x004085 ] } , - BigNum { limbs: [ 0x4b6d768688f6163f7aef5a8d5a484b, 0xc4e0a34ac8817ca0911d55cb959127, 0x003367 ] } , - BigNum { limbs: [ 0xb94f1ca3a9bd8bf3d7051250e172df, 0x509b0cc257d447db8b8b423ffac033, 0x00165b ] } , - BigNum { limbs: [ 0x0454e65c549e730c28faecaf1e8d22, 0x56b81cdb2573eb5e4c7cc761dd4520, 0x005d92 ] } , - BigNum { limbs: [ 0x6bb5fe8d5e45b673d8489859f77d08, 0x9602a9b4e6a2e9ab20ea944819b8ba, 0x00212b ] } , - BigNum { limbs: [ 0x51ee0472a016488c27b766a60882f9, 0x11507fe896a5498eb71d7559be4c99, 0x0052c2 ] } , - BigNum { limbs: [ 0xf7e761b97ce7a28928ab67d4fbe85a, 0x77cc5fc4a9b82148dff4f9ae19f5ca, 0x005afd ] } , - BigNum { limbs: [ 0xc5bca14681745c76d754972b0417a7, 0x2f86c9d8d39011f0f8130ff3be0f88, 0x0018f0 ] } , - BigNum { limbs: [ 0x5a1ea9c9e6198d7539d5a391a52aea, 0x379f0c5b5c3dc1297225341c962c66, 0x0032ed ] } , - BigNum { limbs: [ 0x638559361842718ac62a5b6e5ad517, 0x6fb41d42210a721065e2d58541d8ed, 0x004100 ] } , - BigNum { limbs: [ 0xa4538de6dd29c4a9e8e4fa46c83252, 0x13d54af0dccc73270105c2ef5a44ee, 0x004eff ] } , - BigNum { limbs: [ 0x1950751921323a56171b04b937cdaf, 0x937ddeaca07bc012d70246b27dc065, 0x0024ee ] } , - BigNum { limbs: [ 0x937263e012729d28d1651b41efe2b7, 0x0b142233f8c7f31b135d880851e762, 0x0028e8 ] } , - BigNum { limbs: [ 0x2a319f1febe961d72e9ae3be101d4a, 0x9c3f07698480401ec4aa8199861df1, 0x004b05 ] } , - BigNum { limbs: [ 0x566208104461d1a5579f6349687577, 0x85bb9b792dab1ecc4227299facc750, 0x0059e6 ] } , - BigNum { limbs: [ 0x6741faefb9fa2d5aa8609bb6978a8a, 0x21978e244f9d146d95e0e0022b3e03, 0x001a07 ] } , - BigNum { limbs: [ 0x77c63b3b77e9eeed612a225d770254, 0xcd4f66b0b0e4832b6f68d3b35bb63c, 0x0072a7 ] } , - BigNum { limbs: [ 0x45ddc7c4867210129ed5dca288fdad, 0xda03c2eccc63b00e689f35ee7c4f17, 0x000145 ] } , - BigNum { limbs: [ 0x06588af11d1029002cb711bc971596, 0xbefc3f42bd087254cc0fd0034dce28, 0x00432c ] } , - BigNum { limbs: [ 0xb74b780ee14bd5ffd348ed4368ea6b, 0xe856ea5ac03fc0e50bf8399e8a372b, 0x0030c0 ] } , - BigNum { limbs: [ 0x0c2336f9e61c22dc74f23404eb8927, 0x0c964d2d7d883aae4b3ac7ead974e1, 0x00063f ] } , - BigNum { limbs: [ 0xb180cc06183fdc238b0dcafb1476da, 0x9abcdc6fffbff88b8ccd41b6fe9072, 0x006dae ] } , - BigNum { limbs: [ 0x1cf9b7b8480164564616bbd772ec8a, 0x8d1edc2e23c4478bfd09ecbbbdc6fe, 0x0052b4 ] } , - BigNum { limbs: [ 0xa0aa4b47b65a9aa9b9e943288d1377, 0x1a344d6f5983ebaddafe1ce61a3e55, 0x002139 ] } , - BigNum { limbs: [ 0xe377e99a434db10c0f7e279f57a840, 0x35d54b136c4d829d0f613311012bdd, 0x0048c1 ] } , - BigNum { limbs: [ 0xda2c1965bb0e4df3f081d760a857c1, 0x717dde8a10fab09cc8a6d690d6d975, 0x002b2c ] } , - BigNum { limbs: [ 0x728b2895f1a7f160cdc15b28b34c14, 0xce4f6d72faba28a8cc1d1221bbc909, 0x000b49 ] } , - BigNum { limbs: [ 0x4b18da6a0cb40d9f323ea3d74cb3ed, 0xd903bc2a828e0a910beaf7801c3c4a, 0x0068a3 ] } , - BigNum { limbs: [ 0xe1a662c4aa0118276accb748e4d89e, 0x670db981524a47cec7375b11fc9e50, 0x002595 ] } , - BigNum { limbs: [ 0xdbfda03b545ae6d8953347b71b2763, 0x4045701c2afdeb6b10d0ae8fdb6702, 0x004e58 ] } , - BigNum { limbs: [ 0x93b25df1c5d206aebe55785d5a1303, 0xefa29c0e679a51ad809b1f883ad5ab, 0x007263 ] } , - BigNum { limbs: [ 0x29f1a50e3889f85141aa86a2a5ecfe, 0xb7b08d8f15ade18c576cea199d2fa8, 0x000189 ] } , - BigNum { limbs: [ 0x06b4f4499c5282c7b70da33ed1aa1c, 0x9849c77eb6af7035fb35b7472f237e, 0x005371 ] } , - BigNum { limbs: [ 0xb6ef0eb662097c3848f25bc12e55e5, 0x0f09621ec698c303dcd2525aa8e1d5, 0x00207c ] } , - BigNum { limbs: [ 0xbebaa1ce05b935db9e49df73e8d8f1, 0x6e2d2fe8b4ece620312bd8e49b0b74, 0x003f1d ] } , - BigNum { limbs: [ 0xfee96131f8a2c92461b61f8c172710, 0x3925f9b4c85b4d19a6dc30bd3cf9de, 0x0034d0 ] } , - BigNum { limbs: [ 0xa985c5cb9a543a8e76cfb0a9bd652c, 0xee418fee10f76ebcbc0b13644a62c4, 0x001cf7 ] } , - BigNum { limbs: [ 0x141e3d346407c47189304e56429ad5, 0xb91199af6c50c47d1bfcf63d8da28f, 0x0056f5 ] } , - BigNum { limbs: [ 0x31dc8f1706ed3a709273516579f331, 0x1c8a17580f2aaad415f10ea7010c0a, 0x0031c5 ] } , - BigNum { limbs: [ 0x8bc773e8f76ec48f6d8cad9a860cd0, 0x8ac912456e1d8865c216fafad6f949, 0x004228 ] } , - BigNum { limbs: [ 0xb66b1f4eb128dd523d0a0385f06888, 0xc40a1167be106bbe3f83200cb8fb5e, 0x006167 ] } , - BigNum { limbs: [ 0x0738e3b14d3321adc2f5fb7a0f9779, 0xe3491835bf37c77b9884e9951f09f5, 0x001285 ] } , - BigNum { limbs: [ 0xcfc03eb6e95d51948dedf2e20d5b4a, 0xbe94dba5e67293cd864eef861ffbed, 0x001bfa ] } , - BigNum { limbs: [ 0xede3c44914fead6b72120c1df2a4b7, 0xe8be4df796d59f6c51b91a1bb80965, 0x0057f2 ] } , - BigNum { limbs: [ 0xbac8bfc1513538e100b1bdf0ae0ac0, 0xfac6dcad545ec7e422cc83ee2d55ee, 0x0024db ] } , - BigNum { limbs: [ 0x02db433ead26c61eff4e410f51f541, 0xac8c4cf028e96b55b53b85b3aaaf65, 0x004f11 ] } , - BigNum { limbs: [ 0xefcffc9af0153626748a03879e0d37, 0x2a9373fe92fd694eeb2bd03f8d907c, 0x004070 ] } , - BigNum { limbs: [ 0xcdd406650e46c8d98b75fb7861f2ca, 0x7cbfb59eea4ac9eaecdc39624a74d6, 0x00337d ] } , - BigNum { limbs: [ 0x17e7d20dae6fc433c290af7f64f5ae, 0x387ce6b4b7ade1ed539aaa93936de6, 0x0053da ] } , - BigNum { limbs: [ 0xa5bc30f24fec3acc3d6f4f809b0a53, 0x6ed642e8c59a514c846d5f0e44976d, 0x002013 ] } , - BigNum { limbs: [ 0xdeec5af6fbb2391020c32f171ac5dd, 0x8d0230e1f2caa09529a68c5f6b71fa, 0x000333 ] } , - BigNum { limbs: [ 0xdeb7a80902a9c5efdf3ccfe8e53a24, 0x1a50f8bb8a7d92a4ae617d426c9358, 0x0070ba ] } , - BigNum { limbs: [ 0x55750280dba07d02285256da202718, 0xed10000b9ef7cd9032ed9e65bd172e, 0x003765 ] } , - BigNum { limbs: [ 0x682f007f22bb81fdd7ada825dfd8e9, 0xba432991de5065a9a51a6b3c1aee25, 0x003c87 ] } , - BigNum { limbs: [ 0xe18ebff3faaa15c07ff0fe704ed51b, 0xfc4a8e963bac7c488aa66d37ff6cec, 0x000d91 ] } , - BigNum { limbs: [ 0xdc15430c03b1e93f800f008fb12ae6, 0xab089b07419bb6f14d619c69d89866, 0x00665b ] } , - BigNum { limbs: [ 0x1f11f349f4a1c972a3152f1e2004bf, 0x25d3d25f448997c39c697f9a4a7df7, 0x003359 ] } , - BigNum { limbs: [ 0x9e920fb609ba358d5ceacfe1dffb42, 0x817f573e38be9b763b9e8a078d875c, 0x004094 ] } , - BigNum { limbs: [ 0x5e57ac26862783ef21328babd5fa04, 0x94639d51faf4990ae7084f19b5df2a, 0x001795 ] } , - BigNum { limbs: [ 0x5f4c56d978347b10decd73542a05fd, 0x12ef8c4b82539a2ef0ffba88222629, 0x005c58 ] } , - BigNum { limbs: [ 0xa39e7e33ace0d6fa3bd23976ea9f58, 0x0a1f420a6063467da7a7de6c6c36e3, 0x005d3d ] } , - BigNum { limbs: [ 0x1a0584cc517b2805c42dc5891560a9, 0x9d33e7931ce4ecbc30602b356bce70, 0x0016b0 ] } , - BigNum { limbs: [ 0x5b15a2f585cdfa548af4799af142e6, 0x61cf901b03ed04d3a263e87c253ec2, 0x00243e ] } , - BigNum { limbs: [ 0x628e600a788e04ab750b85650ebd1b, 0x45839982795b2e6635a42125b2c691, 0x004faf ] } , - BigNum { limbs: [ 0x5dd35fe7be02f7accb3df2106b22cc, 0xa0b8ea2b075ac4232584e7abca8f90, 0x00595f ] } , - BigNum { limbs: [ 0x5fd0a3184059075334c20cef94dd35, 0x069a3f7275ed6f16b28321f60d75c3, 0x001a8e ] } , - BigNum { limbs: [ 0x6a821d00e629fd93613ce0a87ffacc, 0x3774bbfdf052b2398fc6e2083e9b6d, 0x001b1b ] } , - BigNum { limbs: [ 0x5321e5ff1832016c9ec31e57800535, 0x6fde6d9f8cf58100484127999969e6, 0x0058d2 ] } , - BigNum { limbs: [ 0x98bfd85728ad3e731ca9103f4a7e3e, 0x110afa78821dcb338fdd3ad2c5d3d2, 0x002917 ] } , - BigNum { limbs: [ 0x24e42aa8d5aec08ce356eec0b581c3, 0x96482f24fb2a6806482acecf123181, 0x004ad6 ] } , - BigNum { limbs: [ 0x8934b96bcdafc077cb1cbb417e9523, 0x8ad90b23cabd42c3100194a5edb528, 0x0040c9 ] } , - BigNum { limbs: [ 0x346f499430ac3e8834e343be816ade, 0x1c7a1e79b28af076c80674fbea502b, 0x003324 ] } , - BigNum { limbs: [ 0x661273fcbe39288ecfc80649bbea18, 0x8d55b0a862c0325bc18ab7d404d31a, 0x00733b ] } , - BigNum { limbs: [ 0x57918f034022d6713037f8b64415e9, 0x19fd78f51a8800de167d51cdd33239, 0x0000b2 ] } , - BigNum { limbs: [ 0xc80822660ea03fe161180add8e7c8b, 0x7e83f7559203e2d33d092ee2863043, 0x000682 ] } , - BigNum { limbs: [ 0xf59be099efbbbf1e9ee7f422718376, 0x28cf3247eb4450669afedabf51d50f, 0x006d6b ] } , - BigNum { limbs: [ 0x4c2f6c4c6979d6421e03245e1d83f5, 0xde31f4afed60227bf324ee9c8da296, 0x0054b3 ] } , - BigNum { limbs: [ 0x717496b394e228bde1fcdaa1e27c0c, 0xc92134ed8fe810bde4e31b054a62bd, 0x001f39 ] } , - BigNum { limbs: [ 0x409a32c508c48e0e2f03376cb187b7, 0xc4fa5038c7b49e5786f239167df4d9, 0x001d9b ] } , - BigNum { limbs: [ 0x7d09d03af59770f1d0fcc7934e784a, 0xe258d964b59394e25115d08b5a107a, 0x005651 ] } , - BigNum { limbs: [ 0x12b89113eeea90974fda386cb940f8, 0x1ea72000b80557717ad996adf91de3, 0x006f23 ] } , - BigNum { limbs: [ 0xaaeb71ec0f716e68b025c69346bf09, 0x88ac099cc542dbc85d2e72f3dee770, 0x0004ca ] } , - BigNum { limbs: [ 0x7e952bc943fa25a7b96ed42f328d19, 0xfddc9652c4229346cfaabd2dbb7ca0, 0x005ba2 ] } , - BigNum { limbs: [ 0x3f0ed736ba61d95846912ad0cd72e8, 0xa976934ab9259ff3085d4c741c88b3, 0x00184a ] } , - BigNum { limbs: [ 0x5af17137d56fc0450d9f977ea8ee05, 0xebd0c8e9101be155cb4893f9e9ac56, 0x00110c ] } , - BigNum { limbs: [ 0x62b291c828ec3ebaf26067815711fc, 0xbb8260b46d2c51e40cbf75a7ee58fd, 0x0062e0 ] } , - BigNum { limbs: [ 0xcc0fb37f9b79c8d0286f742cd86675, 0xac722393d117a6e3d0a41fee9e1750, 0x0016cc ] } , - BigNum { limbs: [ 0xf1944f8062e2362fd7908ad327998c, 0xfae10609ac308c560763e9b339ee02, 0x005d20 ] } , - BigNum { limbs: [ 0x9a22de5f232c4d70421c223a460e6d, 0x852f62cc2d5663da0c93f30179ec54, 0x004de8 ] } , - BigNum { limbs: [ 0x238124a0db2fb18fbde3dcc5b9f194, 0x2223c6d14ff1cf5fcb7416a05e18ff, 0x002605 ] } , - BigNum { limbs: [ 0x8e8be7eb4f8aef0919810f5154f302, 0xfff8289d7770e0c52bcccf7ea4d54d, 0x0026e3 ] } , - BigNum { limbs: [ 0x2f181b14aed10ff6e67eefaeab0cff, 0xa75b010005d75274ac3b3a23333006, 0x004d09 ] } , - BigNum { limbs: [ 0x38adb8945c016b768a01c2f8d0a0a5, 0xea004abaa750911e29712487a533b6, 0x002365 ] } , - BigNum { limbs: [ 0x84f64a6ba25a938975fe3c072f5f5c, 0xbd52dee2d5f7a21bae96e51a32d19d, 0x005087 ] } , - BigNum { limbs: [ 0x92c321e18a980d935ad036ebc7abf4, 0x9e8bb1654c1e72f742d644c47a0ee6, 0x005530 ] } , - BigNum { limbs: [ 0x2ae0e11e73c3f16ca52fc81438540d, 0x08c778383129c0429531c4dd5df66d, 0x001ebd ] } , - BigNum { limbs: [ 0xd5a99e920c0a4d6dc7c97b1a613397, 0xdf54cf455645e7251723c4c73b05ca, 0x0064f8 ] } , - BigNum { limbs: [ 0xe7fa646df251b192383683e59ecc6a, 0xc7fe5a5827024c14c0e444da9cff88, 0x000ef4 ] } , - BigNum { limbs: [ 0xceb34626e61426bedac33c56d72943, 0x6fe1a695922d9dbff7487228f5f976, 0x0019e1 ] } , - BigNum { limbs: [ 0xeef0bcd91847d841253cc2a928d6be, 0x37718307eb1a9579e0bf9778e20bdc, 0x005a0c ] } , - BigNum { limbs: [ 0x16a24a1c573a1e01031ac8046f9bdd, 0x2ea35c2dbfb86866a52cf7b2121414, 0x0031df ] } , - BigNum { limbs: [ 0xa701b8e3a721e0fefce536fb906424, 0x78afcd6fbd8fcad332db11efc5f13f, 0x00420e ] } , - BigNum { limbs: [ 0x96a06bc56604838f809e93711a4398, 0x71af9d3a27456dda1cad96fbf924ab, 0x0051cd ] } , - BigNum { limbs: [ 0x2703973a98577b707f616b8ee5bc69, 0x35a38c635602c55fbb5a72a5dee0a8, 0x002220 ] } , - BigNum { limbs: [ 0xe97d34c43ae230455fd6f6087dd940, 0x6bee2d12f0119b845d7232728e5d66, 0x000ebc ] } , - BigNum { limbs: [ 0xd426ce3bc379cebaa02908f78226c1, 0x3b64fc8a8d3697b57a95d72f49a7ec, 0x006531 ] } , - BigNum { limbs: [ 0xa2b5788f5d0442c24a231c74c130ec, 0xfe123c89cf7fd132123b65bf8f4969, 0x000d45 ] } , - BigNum { limbs: [ 0x1aee8a70a157bc3db5dce28b3ecf15, 0xa940ed13adc86207c5cca3e248bbea, 0x0066a7 ] } , - BigNum { limbs: [ 0x3021a882ed13f223669e65d81db790, 0x66a367686ff336b8fac82b124e1a66, 0x006135 ] } , - BigNum { limbs: [ 0x8d825a7d11480cdc99619927e24871, 0x40afc2350d54fc80dd3fde8f89eaed, 0x0012b8 ] } , - BigNum { limbs: [ 0x501a3130ac41ac068cf15833359558, 0x200bf29daceeee865dac2a421569c5, 0x007273 ] } , - BigNum { limbs: [ 0x6d89d1cf521a52f9730ea6ccca6aa9, 0x874736ffd05944b37a5bdf5fc29b8e, 0x00017a ] } , - BigNum { limbs: [ 0x8ee89022ade12b1c8f51a262773c9a, 0xdc80918b0b6cfa8a8e8fdd7c0b9ad0, 0x004a6a ] } , - BigNum { limbs: [ 0x2ebb72dd507ad3e370ae5c9d88c367, 0xcad2981271db38af49782c25cc6a83, 0x002982 ] } , - BigNum { limbs: [ 0x7ce86999d8cf80bbb10a3f606150a4, 0x56825c92e0ad63179e83cc6765cc83, 0x005063 ] } , - BigNum { limbs: [ 0x40bb9966258c7e444ef5bf9f9eaf5d, 0x50d0cd0a9c9ad02239843d3a7238d0, 0x00238a ] } , - BigNum { limbs: [ 0xe543fdc7ad70c6cc6f28934c0bd42b, 0x5d3d5da2d1df6f11cd203efbcb13a8, 0x00348f ] } , - BigNum { limbs: [ 0xd860053850eb383390d76bb3f42bd6, 0x4a15cbfaab68c4280ae7caa60cf1aa, 0x003f5e ] } , - BigNum { limbs: [ 0x0eafc16384819efb1f7297f3ac5bb3, 0xaf9617a212761ffed2078420af12b8, 0x0009f0 ] } , - BigNum { limbs: [ 0xaef4419c79da6004e08d670c53a44e, 0xf7bd11fb6ad2133b0600858128f29b, 0x0069fc ] } , - BigNum { limbs: [ 0x3e1383fdf44745e84faa392042d2a5, 0xc6f466851b52cbedfd0f227650fbb2, 0x000ac5 ] } , - BigNum { limbs: [ 0x7f907f020a14b917b055c5dfbd2d5c, 0xe05ec31861f5674bdaf8e72b8709a1, 0x006927 ] } , - BigNum { limbs: [ 0xd1e24827161b3c52ec094346a13715, 0xdc280419fc05f8f27ebdced81d8465, 0x006848 ] } , - BigNum { limbs: [ 0xebc1bad8e840c2ad13f6bbb95ec8ec, 0xcb2b258381423a47594a3ac9ba80ed, 0x000ba4 ] } , - BigNum { limbs: [ 0x929c27acbf6f07e83f6a18cfeb518f, 0x92649b4e9d41974e3c2e23fd3b703c, 0x00482e ] } , - BigNum { limbs: [ 0x2b07db533eecf717c095e63014ae72, 0x14ee8e4ee0069beb9bd9e5a49c9517, 0x002bbf ] } , - BigNum { limbs: [ 0xc0c01151e77ac9d0d89977bf0bdc0d, 0x539ffb8491bff9d6f3e18ece1fce90, 0x006c77 ] } , - BigNum { limbs: [ 0xfce3f1ae16e1352f27668740f423f4, 0x53b32e18eb883962e4267ad3b836c2, 0x000776 ] } , - BigNum { limbs: [ 0xb0f2c94bef0fd91021d2e0c26e422a, 0x46d640cb3d4962a382204a061caeb3, 0x004441 ] } , - BigNum { limbs: [ 0x0cb139b40f4c25efde2d1e3d91bdd7, 0x607ce8d23ffed09655e7bf9bbb56a0, 0x002fac ] } , - BigNum { limbs: [ 0x2d4d3e1c7d479fde7a6da7ca691b18, 0x89ab62c4fbddb1edd8487c81091411, 0x0065e4 ] } , - BigNum { limbs: [ 0x9056c4e381145f218592573596e4e9, 0x1da7c6d8816a814bffbf8d20cef142, 0x000e09 ] } , - BigNum { limbs: [ 0x37d271538939c9dc447a0c2580c1b0, 0xf4efefcd2cb6512b61ac434fabc80a, 0x004ff1 ] } , - BigNum { limbs: [ 0x85d191ac75223523bb85f2da7f3e51, 0xb26339d05091e20e765bc6522c3d49, 0x0023fb ] } , - BigNum { limbs: [ 0x7ac6ac2c5fc6aae82bf72f1e101f27, 0x397b76ce414298f3e9d95db1ff77c6, 0x006167 ] } , - BigNum { limbs: [ 0x42dd56d39e955417d408cfe1efe0da, 0x6dd7b2cf3c059a45ee2eabefd88d8d, 0x001286 ] } , - BigNum { limbs: [ 0x2dad77d8f9f9d1724c4670bbdc03b1, 0x201e6f07e5f85293c7255fd588af84, 0x005226 ] } , - BigNum { limbs: [ 0x8ff68b2704622d8db3b98e4423fc50, 0x8734ba95974fe0a610e2a9cc4f55cf, 0x0021c7 ] } , - BigNum { limbs: [ 0x31b85da4bc237714688a4f1fa7f14b, 0xe109ecf6858d35608d567d9e92a1ff, 0x0071cd ] } , - BigNum { limbs: [ 0x8beba55b423887eb9775afe0580eb6, 0xc6493ca6f7bafdd94ab18c03456354, 0x00021f ] } , - BigNum { limbs: [ 0xdfada603e1dce57091bb8ff457fef0, 0xab1fc1eafe4d5857d4623954c55217, 0x001f6e ] } , - BigNum { limbs: [ 0xddf65cfc1c7f198f6e446f0ba80111, 0xfc3367b27efadae203a5d04d12b33b, 0x00547e ] } , - BigNum { limbs: [ 0x0b92f0a63d757c8460d2f1041e0261, 0xbd0c7be45dbf29f747b2321911161e, 0x002e04 ] } , - BigNum { limbs: [ 0xb2111259c0e6827b9f2d0dfbe1fda0, 0xea46adb91f8909429055d788c6ef35, 0x0045e8 ] } , - BigNum { limbs: [ 0xe9526f62cf5f89cf2db8050e4f9564, 0x351ea0bfcade890fcc4f70e7158b78, 0x0045de ] } , - BigNum { limbs: [ 0xd451939d2efc7530d247f9f1b06a9d, 0x723488ddb269aa2a0bb898bac279da, 0x002e0f ] } , - BigNum { limbs: [ 0xefa682f06d4e5af29e4a823ec62ff7, 0x380508a24e273fcd7c23d264335814, 0x004fb7 ] } , - BigNum { limbs: [ 0xcdfd800f910da40d61b57cc139d00a, 0x6f4e20fb2f20f36c5be4373da4ad3e, 0x002436 ] } , - BigNum { limbs: [ 0x104a8fd24d2920608f5c5a9da5d75f, 0x767fcf95e5dcc416e94fc1bb33428e, 0x006f98 ] } , - BigNum { limbs: [ 0xad59732db132de9f70a3a4625a28a2, 0x30d35a07976b6f22eeb847e6a4c2c5, 0x000455 ] } , - BigNum { limbs: [ 0x1564f59be4c7d6869518116781cfd0, 0x408ea8993fc364be7c6db10b5df2f9, 0x0005dc ] } , - BigNum { limbs: [ 0xa83f0d64199428796ae7ed987e3031, 0x66c481043d84ce7b5b9a58967a125a, 0x006e11 ] } , - BigNum { limbs: [ 0xbeb7b108aa8f9683962950a20d381c, 0xa5ebff173102585496360c27273617, 0x004ec3 ] } , - BigNum { limbs: [ 0xfeec51f753cc687c69d6ae5df2c7e5, 0x01672a864c45dae541d1fd7ab0cf3b, 0x00252a ] } , - BigNum { limbs: [ 0x866c926ee97c85cab4e46baa195ab3, 0x66ba6bf3cfddced0628be5092707ba, 0x000975 ] } , - BigNum { limbs: [ 0x3737709114df79354b1b9355e6a54e, 0x4098bda9ad6a6469757c2498b0fd99, 0x006a78 ] } , - BigNum { limbs: [ 0x6bb67b96015a3f6ba02586580c9828, 0x321737cad727f948868a959d3c7c45, 0x00240a ] } , - BigNum { limbs: [ 0x51ed8769fd01bf945fda78a7f367d9, 0x753bf1d2a62039f1517d74049b890e, 0x004fe3 ] } , - BigNum { limbs: [ 0x7dbc3842f33819408fa144b9f541ac, 0x76014b996424530f5e45c2611e3a91, 0x006b1e ] } , - BigNum { limbs: [ 0x3fe7cabd0b23e5bf705eba460abe55, 0x3151de041923e02a79c24740b9cac2, 0x0008cf ] } , - BigNum { limbs: [ 0x56dea51579fdb5cc2f4681123413c8, 0xe8ffdea9ed490a6e19acb0cb846939, 0x00508a ] } , - BigNum { limbs: [ 0x66c55dea845e4933d0b97dedcbec39, 0xbe534af38fff28cbbe5b58d6539c1a, 0x002362 ] } , - BigNum { limbs: [ 0xd6571e990bd165950279356e9dfd8b, 0x3d3e7ee64c0ec1c2a36b9ce85c8901, 0x0013f0 ] } , - BigNum { limbs: [ 0xe74ce466f28a996afd86c991620276, 0x6a14aab731397177349c6cb97b7c51, 0x005ffd ] } , - BigNum { limbs: [ 0xc11ba5bf07249ec7835c8b97119fcb, 0xa9a6734e0f793fe0112cac148f858d, 0x003bdc ] } , - BigNum { limbs: [ 0xfc885d40f73760387ca37368ee6036, 0xfdacb64f6dcef359c6db5d8d487fc5, 0x003810 ] } , - BigNum { limbs: [ 0xd7368a349bef3ec3325d7e2208398b, 0xfcf888e8f994ad436c377f84b369ff, 0x000955 ] } , - BigNum { limbs: [ 0xe66d78cb626cc03ccda280ddf7c676, 0xaa5aa0b483b385f66bd08a1d249b53, 0x006a97 ] } , - BigNum { limbs: [ 0xd66488af38b113a247a51814034c74, 0xeaacd919cae8b4513d56b918973abe, 0x0057d7 ] } , - BigNum { limbs: [ 0xe73f7a50c5aaeb5db85ae6ebfcb38d, 0xbca65083b25f7ee89ab1508940ca94, 0x001c15 ] } , - BigNum { limbs: [ 0x8d622f705bc6369880ad615f24c9eb, 0x459f44dd3178e6798708085902bdb9, 0x000862 ] } , - BigNum { limbs: [ 0x3041d38fa295c8677f529da0db3616, 0x61b3e4c04bcf4cc051000148d5479a, 0x006b8b ] } , - BigNum { limbs: [ 0x86e9a5a65c5e4b6e74700c9a834868, 0x343f0ef8705f52f54fb1d96b6f222d, 0x00597e ] } , - BigNum { limbs: [ 0x36ba5d59a1fdb3918b8ff2657cb799, 0x73141aa50ce8e0448856303668e326, 0x001a6f ] } , - BigNum { limbs: [ 0x50d85d8ad46cc4d1964cd9073d2ef3, 0x59eeaf17f736c403e5b3483713226b, 0x0066ab ] } , - BigNum { limbs: [ 0x6ccba57529ef3a2e69b325f8c2d10e, 0x4d647a8586116f35f254c16ac4e2e8, 0x000d42 ] } , - BigNum { limbs: [ 0xe6ffd25f4248045e3c716690129f4a, 0xd8f43be1f980e923fcf665ec834f7f, 0x000b94 ] } , - BigNum { limbs: [ 0xd6a430a0bc13faa1c38e986fed60b7, 0xce5eedbb83c74a15db11a3b554b5d3, 0x006858 ] } , - BigNum { limbs: [ 0x023a51166735d2a0748a13a6cddfec, 0xf9b143ccc689086fcc5417b6e8fc68, 0x003b04 ] } , - BigNum { limbs: [ 0xbb69b1e997262c5f8b75eb59322015, 0xada1e5d0b6bf2aca0bb3f1eaef08eb, 0x0038e8 ] } , - BigNum { limbs: [ 0x03ddaf59606760210583c72f63c95f, 0xf95a24ed152ce2246ee4ea42a23ecc, 0x002a3a ] } , - BigNum { limbs: [ 0xb9c653a69df49edefa7c37d09c36a2, 0xadf904b0681b511569231f5f35c687, 0x0049b2 ] } , - BigNum { limbs: [ 0x6955f410ce4d4396ddead18be25981, 0xb2edaa2a3b71b1423003a85b6aef57, 0x0010ad ] } , - BigNum { limbs: [ 0x544e0eef300ebb6922152d741da680, 0xf4657f7341d681f7a80461466d15fc, 0x00633f ] } , - BigNum { limbs: [ 0x80ec5c6b7891fdd631490f7fcf4d23, 0x42ea86c90e67d6071fb0171d806107, 0x0003be ] } , - BigNum { limbs: [ 0x3cb7a69485ca0129ceb6ef8030b2de, 0x6468a2d46ee05d32b857f28457a44c, 0x00702f ] } , - BigNum { limbs: [ 0x5499261f2a06642f454a0ed4ca515e, 0x19d8c18e2de6d9d035b87b80d10d39, 0x001626 ] } , - BigNum { limbs: [ 0x690adce0d4559ad0bab5f02b35aea3, 0x8d7a680f4f615969a24f8e2106f81a, 0x005dc7 ] } , - BigNum { limbs: [ 0xfe3e9c089ca0545a715ae4ea34d56e, 0x031c6da66e8b98f1c7c41393106f03, 0x0030f3 ] } , - BigNum { limbs: [ 0xbf6566f761bbaaa58ea51a15cb2a93, 0xa436bbf70ebc9a481043f60ec7964f, 0x0042fa ] } , - BigNum { limbs: [ 0x81421cca1ced58197c87517f584501, 0x8f2e6492dbd866656b7bff443c202c, 0x0026b0 ] } , - BigNum { limbs: [ 0x3c61e635e16ea6e68378ad80a7bb00, 0x1824c50aa16fccd46c8c0a5d9be527, 0x004d3d ] } , - BigNum { limbs: [ 0x8b9ea6291a21d8101af8cc9a89a9d4, 0x6d133ddbe0d3532d52df95788823b3, 0x000dca ] } , - BigNum { limbs: [ 0x32055cd6e43a26efe507326576562d, 0x3a3febc19c74e00c852874294fe1a0, 0x006623 ] } , - BigNum { limbs: [ 0x2b972840261178ff3be3802b3c98d0, 0xc2711ac35b6476c07c2f1743ea9660, 0x006ab5 ] } , - BigNum { limbs: [ 0x920cdabfd84a8600c41c7ed4c36731, 0xe4e20eda21e3bc795bd8f25ded6ef3, 0x000937 ] } , - BigNum { limbs: [ 0xf3867a9619ff48810d0abb9247631c, 0x64c6583d90b0094502db0777c644fc, 0x0036d5 ] } , - BigNum { limbs: [ 0xca1d8869e45cb67ef2f5436db89ce5, 0x428cd15fec9829f4d52d022a11c056, 0x003d18 ] } , - BigNum { limbs: [ 0xf8913245901cde2587ef05f5eb129e, 0xbded6f52d232bdfe1f88215a311d08, 0x005fec ] } , - BigNum { limbs: [ 0xc512d0ba6e3f20da7810f90a14ed63, 0xe965ba4aab15753bb87fe847a6e84a, 0x001400 ] } , - BigNum { limbs: [ 0x0a1edcd2f0555740fb90fa96cc6ea5, 0x778745c49bde40dcc6ace097f8a5a5, 0x000348 ] } , - BigNum { limbs: [ 0xb385262d0e06a7bf046f046933915c, 0x2fcbe3d8e169f25d115b2909df5fae, 0x0070a5 ] } , - BigNum { limbs: [ 0x304383b117c250fae29bdd9109add1, 0xefaa375735aeb6cc2deecbf063a8ec, 0x003f86 ] } , - BigNum { limbs: [ 0x8d607f4ee699ae051d64216ef65230, 0xb7a8f24647997c6daa193db1745c67, 0x003466 ] } , - BigNum { limbs: [ 0xe7ac34fc2134eb59db6ee89a045876, 0x443c0ca047b91ea16a7bde084fb549, 0x004b8b ] } , - BigNum { limbs: [ 0xd5f7ce03dd2713a624911665fba78b, 0x63171cfd358f14986d8c2b99885009, 0x002862 ] } , - BigNum { limbs: [ 0xbf33615ffd9e1021257e7872974ff7, 0xcf8dfa2422928f6defc1516ea78a1a, 0x001043 ] } , - BigNum { limbs: [ 0xfe70a1a000bdeededa81868d68b00a, 0xd7c52f795ab5a3cbe846b833307b38, 0x0063a9 ] } , - BigNum { limbs: [ 0xdb9251f06f19baa8c33edce87e1f45, 0xfd64d9aff0aa435418c04418536bef, 0x007122 ] } , - BigNum { limbs: [ 0xe211b10f8f4244573cc1221781e0bc, 0xa9ee4fed8c9defe5bf47c589849963, 0x0002ca ] } , - BigNum { limbs: [ 0x862745d40aec32c13d971297725adf, 0x8af8c1fd7749c84a8ca472f3dba4c7, 0x0030dd ] } , - BigNum { limbs: [ 0x377cbd2bf36fcc3ec268ec688da522, 0x1c5a67a005fe6aef4b6396adfc608c, 0x004310 ] } , - BigNum { limbs: [ 0x98161a5481f008b6d28dd8a3744d7b, 0x9475bf2751a2effef2e2d97a2f97e7, 0x005596 ] } , - BigNum { limbs: [ 0x258de8ab7c6bf6492d72265c8bb286, 0x12dd6a762ba5433ae5253027a86d6c, 0x001e57 ] } , - BigNum { limbs: [ 0xc141bd3dd6ef00ad461d1b271c9c0c, 0x17c1f08b58500624ce1d9620ecc224, 0x000cc9 ] } , - BigNum { limbs: [ 0xfc6245c2276cfe52b9e2e3d8e363f5, 0x8f91391224f82d1509ea7380eb432e, 0x006724 ] } , - BigNum { limbs: [ 0x120b7188c4e4d3c0315a59f5503426, 0x7b96b545ff4fcabe0bdfb8abd5275e, 0x004850 ] } , - BigNum { limbs: [ 0xab98917739772b3fcea5a50aafcbdb, 0x2bbc74577df8687bcc2850f602ddf5, 0x002b9d ] } , - BigNum { limbs: [ 0x642f6354efb709352b2ae5d10ed00c, 0xb7490ef28001950c6ea6d3140de0dd, 0x004c65 ] } , - BigNum { limbs: [ 0x59749fab0ea4f5cad4d5192ef12ff5, 0xf00a1aaafd469e2d6961368dca2476, 0x002787 ] } , - BigNum { limbs: [ 0xf6586deb66249928e1e77c1e2280d9, 0x14d9b5bd55c1afe3fdc49208d90c4a, 0x0000e1 ] } , - BigNum { limbs: [ 0xc74b9514983765d71e1882e1dd7f28, 0x927973e027868355da437798fef908, 0x00730c ] } , - BigNum { limbs: [ 0xdc19f540cb73e3dd53d7add08cc541, 0x1e70e21dbdce879291f82fde77193e, 0x000d69 ] } , - BigNum { limbs: [ 0xe18a0dbf32e81b22ac28512f733ac0, 0x88e2477fbf79aba7460fd9c360ec14, 0x006684 ] } , - BigNum { limbs: [ 0x55ad3ac9782d2b7c9743bf0601fbe4, 0x67ecc4d30489ba019131e55fa34d46, 0x0015da ] } , - BigNum { limbs: [ 0x67f6c836862ed38368bc3ff9fe041d, 0x3f6664ca78be793846d6244234b80d, 0x005e13 ] } , - BigNum { limbs: [ 0x2842f43465c239c49152fe89b787e5, 0xb05e79e40675fc3fa4b049f9861bf2, 0x005112 ] } , - BigNum { limbs: [ 0x95610ecb9899c53b6ead007648781c, 0xf6f4afb976d236fa3357bfa851e961, 0x0022da ] } , - BigNum { limbs: [ 0x1388a4cb42e47774dc9fc905db3b7b, 0x120f170d6e72f2b163a947af169f22, 0x00231d ] } , - BigNum { limbs: [ 0xaa1b5e34bb77878b236035fa24c486, 0x954412900ed54088745ec1f2c16631, 0x0050d0 ] } , - BigNum { limbs: [ 0x337fe716c09367b1fd4ee32c5de83f, 0x22ad9a9beffb98289d0281dff4ad47, 0x001b7d ] } , - BigNum { limbs: [ 0x8a241be93dc8974e02b11bd3a217c2, 0x84a58f018d4c9b113b0587c1e3580c, 0x005870 ] } , - BigNum { limbs: [ 0x2fe991895b47fac719e5d3246b8306, 0x2a1cb432bda14c5b90a7407f9b61f6, 0x000652 ] } , - BigNum { limbs: [ 0x8dba7176a3140438e61a2bdb947cfb, 0x7d36756abfa6e6de4760c9223ca35d, 0x006d9b ] } , - BigNum { limbs: [ 0x431054cb34d3fb33ec73192134d8d2, 0x09c07d447dcf49302bc8edc2679bdd, 0x004b76 ] } , - BigNum { limbs: [ 0x7a93ae34c98803cc138ce5decb272f, 0x9d92ac58ff78ea09ac3f1bdf706976, 0x002877 ] } , - BigNum { limbs: [ 0xcd6fe8ec4b05a42d79cba08538b82b, 0x2b50ec245e3c56d1a55a68fd2c29a0, 0x005f7a ] } , - BigNum { limbs: [ 0xf0341a13b3565ad286345e7ac747d6, 0x7c023d791f0bdc6832ada0a4abdbb2, 0x001473 ] } , - BigNum { limbs: [ 0x71545d0ad81ef7404a64280c1cbef2, 0x897717d8457c34faffa2843da18d5f, 0x000fd2 ] } , - BigNum { limbs: [ 0x4c4fa5f5263d07bfb59bd6f3e3410f, 0x1ddc11c537cbfe3ed86585643677f4, 0x00641b ] } , - BigNum { limbs: [ 0x9c5f519777a7ca20c8c8277bd772b8, 0x0e6424004bc267145a9e28800a80a0, 0x000c98 ] } , - BigNum { limbs: [ 0x2144b16886b434df3737d784288d49, 0x98ef059d3185cc257d69e121cd84b3, 0x006755 ] } , - BigNum { limbs: [ 0xe2cb11b8e507e7071c4f795885040f, 0xd35030c90bd06be11063f8748d7968, 0x0038ed ] } , - BigNum { limbs: [ 0xdad8f147195417f8e3b085a77afbf2, 0xd402f8d47177c758c7a4112d4a8bea, 0x003aff ] } , - BigNum { limbs: [ 0xa9ebe0f7a4e8d76014cf9e21188ccb, 0xbb4e6a8384a97bde3c12e3747e84e1, 0x004619 ] } , - BigNum { limbs: [ 0x13b822085973279feb3060dee77336, 0xec04bf19f89eb75b9bf5262d598072, 0x002dd3 ] } , - BigNum { limbs: [ 0xef72956c37abf34af7aaaa86fd3fc3, 0x0f88dc7101de272092f76d82b96918, 0x00070a ] } , - BigNum { limbs: [ 0xce316d93c6b00bb50855547902c03e, 0x97ca4d2c7b6a0c1945109c1f1e9c3a, 0x006ce3 ] } , - BigNum { limbs: [ 0x54619b1123c8ed46437e2d1a0ae920, 0x4f0c5c5a4696aa5b5b7cf8418a7563, 0x00043d ] } , - BigNum { limbs: [ 0x694267eeda9311b9bc81d1e5f516e1, 0x5846cd4336b188de7c8b11604d8ff0, 0x006fb0 ] } , - BigNum { limbs: [ 0x98b1ef36e487c1a9d1b6edc719fe23, 0xc4c3ffa3004ddb76546e0860fe1298, 0x006c0f ] } , - BigNum { limbs: [ 0x24f213c919d43d562e491138e601de, 0xe28f29fa7cfa57c3839a0140d9f2bb, 0x0007dd ] } , - BigNum { limbs: [ 0x5225a30b2a3612dd51799cb5fd9272, 0xb62aa9bcf696b0e8b6ea41c6d1740d, 0x001bb2 ] } , - BigNum { limbs: [ 0x6b7e5ff4d425ec22ae86624a026d8f, 0xf1287fe086b18251211dc7db069146, 0x00583a ] } , - BigNum { limbs: [ 0x3cf1afccea050c8bf981972d758408, 0xc157c59ba9e9a7f26bca77a1bb63cd, 0x006669 ] } , - BigNum { limbs: [ 0x80b253331456f274067e67d28a7bf9, 0xe5fb6401d35e8b476c3d92001ca186, 0x000d83 ] } , - BigNum { limbs: [ 0xe416464e90f0d3373b0bfefcf32a40, 0x905b8655c1b0a809631c69ebcebc4f, 0x002c3c ] } , - BigNum { limbs: [ 0xd98dbcb16d6b2bc8c4f400030cd5c1, 0x16f7a347bb978b3074eb9fb6094903, 0x0047b1 ] } , - BigNum { limbs: [ 0x0a731b9e24201dbc92e2666bd98e2c, 0x016f4632e15501509b448bc138b2df, 0x000664 ] } , - BigNum { limbs: [ 0xb330e761da3be1436d1d98942671d5, 0xa5e3e36a9bf331e93cc37de09f5274, 0x006d89 ] } , - BigNum { limbs: [ 0x7df07c8d76839dfc7346f3a061da9d, 0x85fc7f11c541b93fa635ccce15f4a5, 0x005efe ] } , - BigNum { limbs: [ 0x3fb3867287d861038cb90b5f9e2564, 0x2156aa8bb80679fa31d23cd3c210ae, 0x0014ef ] } , - BigNum { limbs: [ 0x8b7288d32271993a73ed0e14baa196, 0x60ba6fb95b03875cb66f4ba9da1ff1, 0x004fa2 ] } , - BigNum { limbs: [ 0x32317a2cdbea65c58c12f0eb455e6b, 0x4698b9e42244abdd2198bdf7fde562, 0x00244b ] } , - BigNum { limbs: [ 0x2ed26dcce2c397d7f7055b33550184, 0x0404be4c3a804eb94238db863afb59, 0x00605e ] } , - BigNum { limbs: [ 0x8ed195331b98672808faa3ccaafe7d, 0xa34e6b5142c7e48095cf2e1b9d09fa, 0x00138f ] } , - BigNum { limbs: [ 0x50bef6179b3e22c8368bda8176c1ca, 0xec56fb1bfac1b59a50f6a6332576cf, 0x0030a4 ] } , - BigNum { limbs: [ 0x6ce50ce8631ddc37c974247e893e37, 0xbafc2e8182867d9f8711636eb28e84, 0x004348 ] } , - BigNum { limbs: [ 0xe266e5c9c83b37fa6d8632b98df179, 0x5b8e714077c35363220d789b598e6e, 0x006692 ] } , - BigNum { limbs: [ 0xdb3d1d363620c7059279cc46720e88, 0x4bc4b85d0584dfd6b5fa91067e76e4, 0x000d5b ] } , - BigNum { limbs: [ 0x52cc381c35e5d7367094c4b720a5d9, 0xd2ccee56d3f16a5ce9fe7ac94f551b, 0x0049f1 ] } , - BigNum { limbs: [ 0x6ad7cae3c87627c98f6b3a48df5a28, 0xd4863b46a956c8dcee098ed888b038, 0x0029fb ] } , - BigNum { limbs: [ 0xf3eef0e8dbc8437ec6900bec2c4481, 0x901c7dc6acfcec0012dcb9f62d5075, 0x001644 ] } , - BigNum { limbs: [ 0xc9b512172293bb81396ff313d3bb80, 0x1736abd6d04b4739c52b4fabaab4dd, 0x005da9 ] } , - BigNum { limbs: [ 0x2629bd332c676dc00f86c35bcb6885, 0x1b881ea7f2f61a0f3eae93cad1c0ff, 0x0038f8 ] } , - BigNum { limbs: [ 0x977a45ccd1f4913ff0793ba434977c, 0x8bcb0af58a52192a995975d7064454, 0x003af5 ] } , - BigNum { limbs: [ 0xce744ed17bb2e2c550ff6c874b4bad, 0xb7f01bb3756aab78670e6701bfaeae, 0x007061 ] } , - BigNum { limbs: [ 0xef2fb42e82a91c3aaf009278b4b454, 0xef630dea07dd87c170f9a2a01856a4, 0x00038b ] } , - BigNum { limbs: [ 0xf4bcc3e04dc69453991724037e01e3, 0xa1b42edfe266fabc93ca2bb460577f, 0x0041d1 ] } , - BigNum { limbs: [ 0xc8e73f1fb0956aac66e8dafc81fe1e, 0x059efabd9ae1387d443ddded77add3, 0x00321c ] } , - BigNum { limbs: [ 0x8470414123dbac1e5f55aa54a7bfd0, 0xc636a252bb48e1088335d44389c3dd, 0x006de7 ] } , - BigNum { limbs: [ 0x3933c1beda8052e1a0aa54ab584031, 0xe11c874ac1ff523154d2355e4e4176, 0x000605 ] } , - BigNum { limbs: [ 0x7a5855f765a13a9bf559997eb9a267, 0xf7fb7c3aed0a5508f84c0117aaf087, 0x004bac ] } , - BigNum { limbs: [ 0x434bad0898bac4640aa66581465d9a, 0xaf57ad62903dde30dfbc088a2d14cc, 0x002840 ] } , - BigNum { limbs: [ 0x1b0e3b20190bd8d1bdb8e8290455d4, 0xcdc95eb6e1d397581d7998656c0f17, 0x0071c8 ] } , - BigNum { limbs: [ 0xa295c7dfe550262e424716d6fbaa2d, 0xd989cae69b749be1ba8e713c6bf63c, 0x000224 ] } , - BigNum { limbs: [ 0xbb28bae56463270ec112748503a635, 0x8a89b08eee1c1580b324ae690d0e9e, 0x006b81 ] } , - BigNum { limbs: [ 0x027b481a99f8d7f13eed8a7afc59cc, 0x1cc9790e8f2c1db924e35b38caf6b5, 0x00086c ] } , - BigNum { limbs: [ 0x8e6e545d6dafa949fb3db31c712d0f, 0xfcf12d76afe8e6bf54ef4f796796d7, 0x0027fb ] } , - BigNum { limbs: [ 0x2f35aea290ac55b604c24be38ed2f2, 0xaa61fc26cd5f4c7a8318ba28706e7c, 0x004bf1 ] } , - BigNum { limbs: [ 0x78db29ce8ac2214b3ccae1e07a5b6d, 0x4b4a2be5c752a6975f7096c5b91f53, 0x002171 ] } , - BigNum { limbs: [ 0x44c8d9317399ddb4c3351d1f85a494, 0x5c08fdb7b5f58ca2789772dc1ee600, 0x00527c ] } , - BigNum { limbs: [ 0x10cb417026d3476ef714fba6067a59, 0x015808014394d9ba003a51d63941fa, 0x005328 ] } , - BigNum { limbs: [ 0xacd8c18fd788b79108eb0359f985a8, 0xa5fb219c39b3597fd7cdb7cb9ec359, 0x0020c5 ] } , - BigNum { limbs: [ 0x8a3577f1545a01116eceec8e11ba5e, 0x3c3716a507e155691873bf136a9049, 0x00350a ] } , - BigNum { limbs: [ 0x336e8b0eaa01fdee91311271ee45a3, 0x6b1c12f87566ddd0bf944a8e6d750a, 0x003ee3 ] } , - BigNum { limbs: [ 0xaf69b8d3eb54778eed1c02c2b53190, 0x31706075d57e61356b27e1fcc425df, 0x005913 ] } , - BigNum { limbs: [ 0x0e3a4a2c1307877112e3fc3d4ace71, 0x75e2c927a7c9d2046ce027a513df74, 0x001ada ] } , - BigNum { limbs: [ 0x6a8701ef94eaf2e552420e264134db, 0xa91a0744c00bdb867760c3ba9fa4d0, 0x002188 ] } , - BigNum { limbs: [ 0x531d011069710c1aadbdf0d9becb26, 0xfe392258bd3c57b360a745e7386083, 0x005264 ] } , - BigNum { limbs: [ 0xd48b8eab94d2ba5388a6e5eabeab40, 0x1acd7eec4a7442ecf758ff40de70ea, 0x005633 ] } , - BigNum { limbs: [ 0xe9187454698944ac775919154154c1, 0x8c85aab132d3f04ce0af0a60f99468, 0x001dba ] } , - BigNum { limbs: [ 0x518dfe4db63b5b88fcbf85f2aa23b5, 0x370ad80b91f136c286f7165f193e60, 0x00358d ] } , - BigNum { limbs: [ 0x6c1604b24820a3770340790d55dc4c, 0x70485191eb56fc775110f342bec6f3, 0x003e60 ] } , - BigNum { limbs: [ 0xd2a8c071c5b8f5d73dddb928d44d5e, 0xd92031b41a4e07fba6583023b7b96f, 0x002aea ] } , - BigNum { limbs: [ 0xeafb428e38a30928c22245d72bb2a3, 0xce32f7e962fa2b3e31afd97e204be3, 0x004902 ] } , - BigNum { limbs: [ 0x835eed7b54edf00ca067fa6f033fae, 0xd26d2ed3085ee14964a632778e10a2, 0x005cb1 ] } , - BigNum { limbs: [ 0x3a451584a96e0ef35f980490fcc053, 0xd4e5faca74e951f07361d72a49f4b1, 0x00173b ] } , - BigNum { limbs: [ 0x8f8e5be00aa093e86c146ea8025c66, 0x3a3479db5f0279bdf58d29d91d2c62, 0x005ce1 ] } , - BigNum { limbs: [ 0x2e15a71ff3bb6b1793eb9057fda39b, 0x6d1eafc21e45b97be27adfc8bad8f1, 0x00170c ] } , - BigNum { limbs: [ 0x2c03e64ee03ec670444ae78e553245, 0x520f461bf4acfa7b2d3b32b7658ce8, 0x003620 ] } , - BigNum { limbs: [ 0x91a01cb11e1d388fbbb51771aacdbc, 0x5543e381889b38beaaccd6ea72786b, 0x003dcd ] } , - BigNum { limbs: [ 0xa277d70a802c047400f28818861029, 0x93e4b02a38bdc4b585376eab030748, 0x004e74 ] } , - BigNum { limbs: [ 0x1b2c2bf57e2ffa8bff0d76e779efd8, 0x136e7973448a6e8452d09af6d4fe0b, 0x002579 ] } , - BigNum { limbs: [ 0x2752ee507d860cc847b7608bb32497, 0x72ab18821edbe737cee8a3d2f844d9, 0x006c55 ] } , - BigNum { limbs: [ 0x965114af80d5f237b8489e744cdb6a, 0x34a8111b5e6c4c02091f65cedfc07a, 0x000798 ] } , - BigNum { limbs: [ 0xd5d7310b6c434221f5c649b8a8450d, 0x51a1d28fd7c178f914e9d363c2fea8, 0x000783 ] } , - BigNum { limbs: [ 0xe7ccd1f49218bcde0a39b54757baf4, 0x55b1570da586ba40c31e363e1506aa, 0x006c6a ] } , - BigNum { limbs: [ 0xe649b6e2f4144275a809846d88e77b, 0xaf6c15fc2de1fc37ebff50507b437e, 0x00239f ] } , - BigNum { limbs: [ 0xd75a4c1d0a47bc8a57f67a92771886, 0xf7e713a14f663701ec08b9515cc1d4, 0x00504d ] } , - BigNum { limbs: [ 0x7334b1a80ff50012f6d0fcfcb4bbda, 0x9ec015b1c1e48828ab99c1ab863fe8, 0x00246d ] } , - BigNum { limbs: [ 0x4a6f5157ee66feed092f02034b4427, 0x089313ebbb63ab112c6e47f651c56b, 0x004f80 ] } , - BigNum { limbs: [ 0x2799d54092d2d6d446d7483d43c505, 0x09725e673920f35b87f5473faef876, 0x0064c2 ] } , - BigNum { limbs: [ 0x960a2dbf6b89282bb928b6c2bc3afc, 0x9de0cb3644273fde5012c262290cdd, 0x000f2b ] } , - BigNum { limbs: [ 0xe4ab021bf6a40ad743181bf3995f80, 0xfdb4df5a01f7d5a3f836a69f95c324, 0x0019ce ] } , - BigNum { limbs: [ 0xd8f900e407b7f428bce7e30c66a081, 0xa99e4a437b505d95dfd1630242422e, 0x005a1e ] } , - BigNum { limbs: [ 0x403f76060a0de6fb311559ee0b0518, 0x3d7c276b68ccf930cc3d6405609a28, 0x003209 ] } , - BigNum { limbs: [ 0x7d648cf9f44e1804ceeaa511f4fae9, 0x69d70232147b3a090bcaa59c776b2b, 0x0041e4 ] } , - BigNum { limbs: [ 0x97c9d4fb8e28000443006ef0337d82, 0xa46763572fc3c3a10cfe101b7a8183, 0x002694 ] } , - BigNum { limbs: [ 0x25da2e047033fefbbcff900fcc827f, 0x02ebc6464d846f98cb09f9865d83d0, 0x004d59 ] } , - BigNum { limbs: [ 0xcf940508e5e3e09f4ec853b7df991d, 0xeac5b0c9b97ba1c6303e45d8434d4b, 0x005f93 ] } , - BigNum { limbs: [ 0xee0ffdf718781e60b137ab482066e4, 0xbc8d78d3c3cc9173a7c9c3c994b807, 0x001459 ] } , - BigNum { limbs: [ 0x6b483f2e315844ec7abcf910ab4efd, 0x39d0383014c2f7421c93535e2bfd8a, 0x006a97 ] } , - BigNum { limbs: [ 0x525bc3d1cd03ba13854305ef54b104, 0x6d82f16d68853bf7bb74b643ac07c9, 0x000956 ] } , - BigNum { limbs: [ 0x5f74f25ae307f516cade22890eb478, 0x3d3b3c65ae6c6059e06b34576964ec, 0x006802 ] } , - BigNum { limbs: [ 0x5e2f10a51b5409e93521dc76f14b89, 0x6a17ed37cedbd2dff79cd54a6ea067, 0x000beb ] } , - BigNum { limbs: [ 0x6830a4e946304e5df8c04e1fd5899a, 0x2835311c95860b59b3a1cbe1b04a6f, 0x00097d ] } , - BigNum { limbs: [ 0x55735e16b82bb0a2073fb0e02a7667, 0x7f1df880e7c227e024663dc027bae4, 0x006a70 ] } , - BigNum { limbs: [ 0x816d865e2c5c181d51a84f4db96996, 0xc66aaa0738343a5c1dcbb68b1018de, 0x006005 ] } , - BigNum { limbs: [ 0x3c367ca1d1ffe6e2ae57afb246966b, 0xe0e87f964513f8ddba3c5316c7ec75, 0x0013e7 ] } , - BigNum { limbs: [ 0x09c2ec7e394b5822a595c06ef6a23a, 0x747bdfda702a6eb07ff6d8245ffdd1, 0x0033d4 ] } , - BigNum { limbs: [ 0xb3e11681c510a6dd5a6a3e91095dc7, 0x32d749c30d1dc4895811317d780782, 0x004019 ] } , - BigNum { limbs: [ 0x005ec34ecba796d3201623f00bc8b6, 0x0ab8f3ac593e84547f014f9368d681, 0x0041c8 ] } , - BigNum { limbs: [ 0xbd453fb132b4682cdfe9db0ff4374b, 0x9c9a35f12409aee55906ba0e6f2ed2, 0x003225 ] } , - BigNum { limbs: [ 0xf6aec9a949dd0573e1b9cb5e186571, 0xaeaccd9d736b4d62a1eab09aecde18, 0x004fa8 ] } , - BigNum { limbs: [ 0xc6f53956b47ef98c1e4633a1e79a90, 0xf8a65c0009dce5d7361d5906eb273a, 0x002444 ] } , - BigNum { limbs: [ 0x49fd686bced7f42e2ba69e1629d925, 0xa8db777b42a2ab6faa2a76aa9abce5, 0x005b77 ] } , - BigNum { limbs: [ 0x73a69a942f840ad1d45960e9d626dc, 0xfe77b2223aa587ca2ddd92f73d486e, 0x001875 ] } , - BigNum { limbs: [ 0x359f01d863d263311797307a785ec6, 0x183824ddac3bc0e940a0e4e72a8de6, 0x005afc ] } , - BigNum { limbs: [ 0x880501279a899bcee868ce8587a13b, 0x8f1b04bfd10c7250976724baad776d, 0x0018f1 ] } , - BigNum { limbs: [ 0x09d049afcd3cfc57db0f446570d69e, 0x2a99aed23b0261e36aa745fb1dae33, 0x003d19 ] } , - BigNum { limbs: [ 0xb3d3b950311f02a824f0ba9a8f2963, 0x7cb97acb4245d1566d60c3a6ba5720, 0x0036d4 ] } , - BigNum { limbs: [ 0x3411624b4f9d9c3ce8934f4459131f, 0x6914e72a4a1345f60d088cf58860cf, 0x001d88 ] } , - BigNum { limbs: [ 0x8992a0b4aebe62c3176cafbba6ece2, 0x3e3e42733334ed43caff7cac4fa484, 0x005665 ] } , - BigNum { limbs: [ 0x7f70c48ce1ee7815d0fcee9ab3e398, 0x617008f760cf025c91c7517c47be59, 0x00010d ] } , - BigNum { limbs: [ 0x3e333e731c6d86ea2f0310654c1c69, 0x45e320a61c7930dd4640b8259046fa, 0x0072e0 ] } , - BigNum { limbs: [ 0x08a93f36d66515f2e98be25d15e60e, 0x78aca0cee7df2385f091abb4beac52, 0x001429 ] } , - BigNum { limbs: [ 0xb4fac3c927f6e90d16741ca2ea19f3, 0x2ea688ce95690fb3e7765ded195901, 0x005fc4 ] } , - BigNum { limbs: [ 0x857ef8141e71e5bc61d3efc013feb5, 0x9aea88d057e045d8104307a80b8fd7, 0x00148b ] } , - BigNum { limbs: [ 0x38250aebdfea19439e2c0f3fec014c, 0x0c68a0cd2567ed61c7c501f9cc757c, 0x005f62 ] } , - BigNum { limbs: [ 0x8c53be2d93aae380a283ff1f4cfa39, 0x3380d7113fc000f1edc5c284064466, 0x00106c ] } , - BigNum { limbs: [ 0x315044d26ab11b7f5d7bffe0b305c8, 0x73d2528c3d883247ea42471dd1c0ed, 0x006381 ] } , - BigNum { limbs: [ 0x3cb7b786911fdf5db8e93e9ab4c037, 0x312e325b3ea5140386ddcd5ef68396, 0x000aeb ] } , - BigNum { limbs: [ 0x80ec4b796d3c1fa24716c0654b3fca, 0x7624f7423ea31f36512a3c42e181bd, 0x006902 ] } , - BigNum { limbs: [ 0xe84772bc40ead03dc8b5f6a5fb308a, 0x598494746f8ec57d696fed1a0bf819, 0x003a10 ] } , - BigNum { limbs: [ 0xd55c9043bd712ec2374a085a04cf77, 0x4dce95290db96dbc6e981c87cc0d39, 0x0039dd ] } , - BigNum { limbs: [ 0xfe2f90251981c69f406193091ce7ef, 0xf48779fa3d8faec1c98ba14dabc640, 0x00081b ] } , - BigNum { limbs: [ 0xbf7472dae4da3860bf9e6bf6e31812, 0xb2cbafa33fb884780e7c68542c3f12, 0x006bd1 ] } , - BigNum { limbs: [ 0xe088aadb655540600f8630a750ce68, 0xd877c086dabbc6935525c93afcc8cc, 0x005775 ] } , - BigNum { limbs: [ 0xdd1b58249906be9ff079ce58af3199, 0xcedb6916a28c6ca682e24066db3c86, 0x001c77 ] } , - BigNum { limbs: [ 0x0adf8f2a0e6a4ce94b164c81822ef6, 0xa25f73dcc3cfba674e9566fb87b437, 0x0020f7 ] } , - BigNum { limbs: [ 0xb2c473d5eff1b216b4e9b27e7dd10b, 0x04f3b5c0b97878d28972a2a650511c, 0x0052f6 ] } , - BigNum { limbs: [ 0x32cc2e54c34449e0e07885187e87e6, 0x16402efe1052b1c83e96eab6218112, 0x003282 ] } , - BigNum { limbs: [ 0x8ad7d4ab3b17b51f1f8779e781781b, 0x9112fa9f6cf5817199711eebb68441, 0x00416b ] } , - BigNum { limbs: [ 0x851b025f7c6c3044912e382a3b60e5, 0xf25614b12b99689c33b5ed2b4ab367, 0x0056cf ] } , - BigNum { limbs: [ 0x388900a081efcebb6ed1c6d5c49f1c, 0xb4fd14ec51aeca9da4521c768d51ec, 0x001d1d ] } , - BigNum { limbs: [ 0x41da53f8e7e56dbbb9b52fe0c93f2f, 0xb1be40dbcc5d47aa1206c5f9825841, 0x00070d ] } , - BigNum { limbs: [ 0x7bc9af0716769144464acf1f36c0d2, 0xf594e8c1b0eaeb8fc60143a855ad12, 0x006cdf ] } , - BigNum { limbs: [ 0x21727c631d1b957e330eba542ea25b, 0x6a726d6bc6c05eefdf763a90100e35, 0x004146 ] } , - BigNum { limbs: [ 0x9c31869ce1406981ccf144abd15da6, 0x3ce0bc31b687d449f891cf11c7f71e, 0x0032a7 ] } , - BigNum { limbs: [ 0x8b1c21115956ae0930097f14fdeb5e, 0x7877d3137c9d849ae4eb96398565d8, 0x005f84 ] } , - BigNum { limbs: [ 0x3287e1eea50550f6cff67feb0214a3, 0x2edb568a00aaae9ef31c7368529f7b, 0x001469 ] } , - BigNum { limbs: [ 0xa63e1f8de49664fe8bb14fdd09e32c, 0x0165226ffd3e155a8d961161faea81, 0x00192c ] } , - BigNum { limbs: [ 0x1765e37219c59a01744eaf22f61cd5, 0xa5ee072d800a1ddf4a71f83fdd1ad2, 0x005ac1 ] } , - BigNum { limbs: [ 0x20f42f0eb8c840f724930154b0a345, 0x7e9b4faf7cbf5a3c85944fbd15cac9, 0x001c39 ] } , - BigNum { limbs: [ 0x9cafd3f14593be08db6cfdab4f5cbc, 0x28b7d9ee0088d8fd5273b9e4c23a8a, 0x0057b4 ] } , - BigNum { limbs: [ 0xa0054d10202811fee903fba4610e1d, 0xe96abc1a3341b736d5f1f9e96ab5cf, 0x005ece ] } , - BigNum { limbs: [ 0x1d9eb5efde33ed0116fc035b9ef1e4, 0xbde86d834a067c0302160fb86d4f84, 0x00151e ] } , - BigNum { limbs: [ 0x554e12d462472b84dab4b2e95130b8, 0xbba73e5ffe53a6f04f5111b851a159, 0x003f22 ] } , - BigNum { limbs: [ 0x6855f02b9c14d37b254b4c16aecf49, 0xebabeb3d7ef48c4988b6f7e98663fa, 0x0034ca ] } , - BigNum { limbs: [ 0xbc16cbda5b145cce510c752e9afea8, 0xc5f4eecc92c39560d4dd8010ec3a9f, 0x006e91 ] } , - BigNum { limbs: [ 0x018d3725a347a231aef389d1650159, 0xe15e3ad0ea849dd9032a8990ebcab4, 0x00055b ] } , - BigNum { limbs: [ 0x9487106e50a7a420b0a6a5816df662, 0x47da8a826ab344a6ab01d9bcfd31c6, 0x005d47 ] } , - BigNum { limbs: [ 0x291cf291adb45adf4f59597e92099f, 0x5f789f1b1294ee932d062fe4dad38d, 0x0016a6 ] } , - BigNum { limbs: [ 0x5127d2ce1d47aa81efa96afbcfa4b3, 0x9b560dbdf2b0494dee5461ad67ec9e, 0x001687 ] } , - BigNum { limbs: [ 0x6c7c3031e114547e10569404305b4e, 0x0bfd1bdf8a97e9ebe9b3a7f47018b5, 0x005d66 ] } , - BigNum { limbs: [ 0xe488ba25233af2db84e57d6860ca41, 0x3c8e10853ef5edfb2c4b7f83c45f1b, 0x000e18 ] } , - BigNum { limbs: [ 0xd91b48dadb210c247b1a81979f35c0, 0x6ac519183e52453eabbc8a1e13a637, 0x0065d5 ] } , - BigNum { limbs: [ 0xc3e30a9c9e349ae707d84319ddac01, 0xc946fd62c42899c1ce48bc34beb258, 0x004d11 ] } , - BigNum { limbs: [ 0xf9c0f86360276418f827bbe6225400, 0xde0c2c3ab91f997809bf4d6d1952fa, 0x0026db ] } , - BigNum { limbs: [ 0x3cca4f65f52989ee41c70ef01f1ea6, 0x98827284acd332c7b653236e45470c, 0x00086c ] } , - BigNum { limbs: [ 0x80d9b39a09327511be38f00fe0e15b, 0x0ed0b718d075007221b4e63392be47, 0x006b81 ] } , - BigNum { limbs: [ 0x85ce0a5e920ceffae1e55a50fe59ca, 0xa263d506576489a7189ae1af6d2bb3, 0x000ce7 ] } , - BigNum { limbs: [ 0x37d5f8a16c4f0f051e1aa4af01a637, 0x04ef549725e3a992bf6d27f26ad9a0, 0x006706 ] } , - BigNum { limbs: [ 0xea8f78b1c7780e8daf0c2fcc0f7dbe, 0x95a004664ba541a2cca536b326c6a3, 0x00575f ] } , - BigNum { limbs: [ 0xd3148a4e36e3f07250f3cf33f08243, 0x11b3253731a2f1970b62d2eeb13eaf, 0x001c8e ] } , - BigNum { limbs: [ 0xe4827df1bfc8c29d71a9797d136ab7, 0x437a3ecb3b178208a3952410f28789, 0x006301 ] } , - BigNum { limbs: [ 0xd921850e3e933c628e568582ec954a, 0x63d8ead24230b1313472e590e57dc9, 0x0010ec ] } , - BigNum { limbs: [ 0xf34b7193b7d22f8fba8bc5cc0ffb3d, 0x9ac7c491f9b3ab3dda081a19c5b2aa, 0x004e08 ] } , - BigNum { limbs: [ 0xca58916c4689cf7045743933f004c4, 0x0c8b650b839487fbfdffef881252a8, 0x0025e5 ] } , - BigNum { limbs: [ 0x2503d854265cab6b758b1728d5f934, 0x6a81d8bebd70bb5cc98cbcca59cfc3, 0x0012c4 ] } , - BigNum { limbs: [ 0x98a02aabd7ff53948a74e7d72a06cd, 0x3cd150debfd777dd0e7b4cd77e3590, 0x006129 ] } , - BigNum { limbs: [ 0x3067a571d3783c88d51cd8faa6c9e3, 0x7d7a15e293eb6038ec7934693189a4, 0x0011ba ] } , - BigNum { limbs: [ 0x8d3c5d8e2ae3c2772ae3260559361e, 0x29d913bae95cd300eb8ed538a67baf, 0x006233 ] } , - BigNum { limbs: [ 0x40ea21cd2bc670b57de2e62ffe6fa6, 0x5a348f8f4b87a6ae456985d7320362, 0x00312c ] } , - BigNum { limbs: [ 0x7cb9e132d2958e4a821d18d001905b, 0x4d1e9a0e31c08c8b929e83caa601f1, 0x0042c1 ] } , - BigNum { limbs: [ 0x06fdf260767ff556ba2201ce6b292d, 0x3cf80782e52ef5885bf4688c2ae109, 0x00085d ] } , - BigNum { limbs: [ 0xb6a6109f87dc09a945ddfd3194d6d4, 0x6a5b221a98193db17c13a115ad244a, 0x006b90 ] } , - BigNum { limbs: [ 0x099a5dc4afe8a3c1df667e6c0fcb30, 0x66209952919a9f65d23d4922a4152e, 0x004621 ] } , - BigNum { limbs: [ 0xb409a53b4e735b3e20998093f034d1, 0x4132904aebad93d405cac07f33f025, 0x002dcc ] } , - BigNum { limbs: [ 0x892a9b3c41eda72ed74a199a41d737, 0xcf8ebffa762814c3dc07af56614e4c, 0x003314 ] } , - BigNum { limbs: [ 0x347967c3bc6e57d128b5e565be28ca, 0xd7c469a307201e75fc005a4b76b707, 0x0040d8 ] } , - BigNum { limbs: [ 0xd75f694f269112f4ff8f61e952657e, 0xf2069c2a93bab9e5924a0d41b3f5f1, 0x003d8d ] } , - BigNum { limbs: [ 0xe64499b0d7caec0b00709d16ad9a83, 0xb54c8d72e98d795445bdfc60240f61, 0x00365f ] } , - BigNum { limbs: [ 0xe6006a8087c0313356177fa580e7c8, 0x7e92df8ec1cb44267d2050bea1e4ba, 0x00693e ] } , - BigNum { limbs: [ 0xd7a3987f769bcdcca9e87f5a7f1839, 0x28c04a0ebb7cef135ae7b8e3362098, 0x000aaf ] } , - BigNum { limbs: [ 0x775193a915287b84658d7d1fba4133, 0xdd16b97880c226a96b6d8623b90e8a, 0x002229 ] } , - BigNum { limbs: [ 0x46526f56e933837b9a7281e045bece, 0xca3c7024fc860c906c9a837e1ef6c9, 0x0051c3 ] } , - BigNum { limbs: [ 0x41b1af6da69a808552db669eded8ae, 0x3e0af1e4442b2ada31fc6aa05994ea, 0x003d4d ] } , - BigNum { limbs: [ 0x7bf2539257c17e7aad249861212753, 0x694837b9391d085fa60b9f017e7069, 0x0036a0 ] } , - BigNum { limbs: [ 0xb4f8d8d52c4296113c3a206b452964, 0xe5cc5a9cc9fef2d4ce0992aba0f475, 0x001f24 ] } , - BigNum { limbs: [ 0x08ab2a2ad21968eec3c5de94bad69d, 0xc186cf00b349406509fe76f63710de, 0x0054c8 ] } , - BigNum { limbs: [ 0x295502c8f18cafec046e38bc04d29b, 0x11ac973c619f06b06560b2a86b51e7, 0x00382f ] } , - BigNum { limbs: [ 0x944f00370ccf4f13fb91c643fb2d66, 0x95a692611ba92c8972a756f96cb36c, 0x003bbe ] } , - BigNum { limbs: [ 0x9677a297282aeadb959e844a4e2840, 0xdd65a7e2c22b1762743dbc35f832be, 0x0023c6 ] } , - BigNum { limbs: [ 0x272c6068d63114246a617ab5b1d7c1, 0xc9ed81babb1d1bd763ca4d6bdfd295, 0x005026 ] } , - BigNum { limbs: [ 0x288589876680569020a30d23f2a1d4, 0xb75e90e4ece8683424612c970a35b3, 0x00415e ] } , - BigNum { limbs: [ 0x951e797897dba86fdf5cf1dc0d5e2d, 0xeff498b8905fcb05b3a6dd0acdcfa0, 0x00328e ] } , - BigNum { limbs: [ 0x51520e22b49fe02051377a9ed75075, 0xbabe0b4395278ff370d2deb802290a, 0x001d8e ] } , - BigNum { limbs: [ 0x6c51f4dd49bc1edfaec8846128af8c, 0xec951e59e820a34667352ae9d5dc49, 0x00565e ] } , - BigNum { limbs: [ 0x6759855e4559199350c2d655365c3d, 0xf1c4c5df150a7de30a079f63d17b84, 0x0040f9 ] } , - BigNum { limbs: [ 0x564a7da1b902e56caf3d28aac9a3c4, 0xb58e63be683db556ce006a3e0689cf, 0x0032f3 ] } , - BigNum { limbs: [ 0xf5900e4241e72c4acf2dc369d0d5ce, 0xcb3d9e338aa71593618765dd07560c, 0x002eec ] } , - BigNum { limbs: [ 0xc813f4bdbc74d2b530d23b962f2a33, 0xdc158b69f2a11da67680a3c4d0af46, 0x004500 ] } , - BigNum { limbs: [ 0x629fe3a0675366707251cda7455b11, 0xa89d316b91fcf2d7d2aa4cd3a69ba2, 0x004e6e ] } , - BigNum { limbs: [ 0x5b041f5f9708988f8dae3158baa4f0, 0xfeb5f831eb4b4062055dbcce3169b1, 0x00257e ] } , - BigNum { limbs: [ 0xe52518ea76badc588032481fe037fc, 0xc9a252a5634898a2c832f7e0bb3d3b, 0x0022db ] } , - BigNum { limbs: [ 0xd87eea1587a122a77fcdb6e01fc805, 0xddb0d6f819ff9a970fd511c11cc817, 0x005111 ] } , - BigNum { limbs: [ 0xf1f0d4132d250b42c946df433b264b, 0x574e5601a1206d2e86027d377a6c26, 0x003d18 ] } , - BigNum { limbs: [ 0xcbb32eecd136f3bd36b91fbcc4d9b6, 0x5004d39bdc27c60b52058c6a5d992c, 0x0036d5 ] } , - BigNum { limbs: [ 0x8c2cadf8ead00a2aa8ef4fbdb41629, 0xd8814fb60ce038b34d9642aa5a23e6, 0x000937 ] } , - BigNum { limbs: [ 0x31775507138bf4d55710af424be9d8, 0xced1d9e77067fa868a71c6f77de16d, 0x006ab5 ] } , - BigNum { limbs: [ 0x9ae5c815d97b7558c3d2f76b1bd02b, 0x793269b8e6dbb818eb33b979def799, 0x004dac ] } , - BigNum { limbs: [ 0x22be3aea24e089a73c2d0794e42fd6, 0x2e20bfe4966c7b20ecd45027f90dba, 0x002641 ] } , - BigNum { limbs: [ 0x78ba38db4f1cdb24a6b39ca1aae2d2, 0xfce29dfca40fb376eda680b7645699, 0x001c55 ] } , - BigNum { limbs: [ 0x44e9ca24af3f23db594c625e551d2f, 0xaa708ba0d9387fc2ea6188ea73aeba, 0x005797 ] } , - BigNum { limbs: [ 0xa36b63449abbb4a0cab19968e21b28, 0x515e659079aaf2ff01783547804f4d, 0x0031bf ] } , - BigNum { limbs: [ 0x1a389fbb63a04a5f354e65971de4d9, 0x55f4c40d039d403ad68fd45a57b606, 0x00422e ] } , - BigNum { limbs: [ 0x06d617f09bed2ef9ae4e979277aba0, 0x741b204bbd57f96d993d6e12c5cce4, 0x003ff7 ] } , - BigNum { limbs: [ 0xb6cdeb0f626ed00651b1676d885461, 0x33380951bff039cc3eca9b8f12386f, 0x0033f6 ] } , - BigNum { limbs: [ 0xe3340f2ae98eca067e2dba9b24f61e, 0x9da24e43f5d43b6bbfbd662301caaf, 0x006bf6 ] } , - BigNum { limbs: [ 0xda6ff3d514cd34f981d24464db09e3, 0x09b0db598773f7ce184aa37ed63aa3, 0x0007f7 ] } , - BigNum { limbs: [ 0xebb3139c9ad2dbade21b3a3cd24656, 0xe823f3fce58ed957eff9de108501bc, 0x005220 ] } , - BigNum { limbs: [ 0xd1f0ef63638923521de4c4c32db9ab, 0xbf2f35a097b959e1e80e2b91530396, 0x0021cc ] } , - BigNum { limbs: [ 0xe91075fcd0291b97f3e9395da55eab, 0x6a5c272196ab6d32c28aa4a46d2ca8, 0x0002dd ] } , - BigNum { limbs: [ 0xd4938d032e32e3680c16c5a25aa156, 0x3cf7027be69cc607157d64fd6ad8aa, 0x007110 ] } , - BigNum { limbs: [ 0x73b2e732d845809adfb930e334f4fd, 0x9c9d8466da8be8561b7e6e02ae6816, 0x0004c9 ] } , - BigNum { limbs: [ 0x49f11bcd26167e652046ce1ccb0b04, 0x0ab5a536a2bc4ae3bc899b9f299d3d, 0x006f24 ] } , - BigNum { limbs: [ 0x36d387d5880f88740d4211cf4b61ac, 0x718aa3845032654d2552a736366d29, 0x00568f ] } , - BigNum { limbs: [ 0x86d07b2a764c768bf2bded30b49e55, 0x35c886192d15cdecb2b5626ba1982a, 0x001d5e ] } , - BigNum { limbs: [ 0x498636362aa3c779beb798f3a00898, 0x40090410e2e8d5490e38c676766ee1, 0x002f49 ] } , - BigNum { limbs: [ 0x741dccc9d3b837864148660c5ff769, 0x674a258c9a5f5df0c9cf432b619672, 0x0044a4 ] } , - BigNum { limbs: [ 0xca5a4286b8761e124bbc225b422504, 0xf47dd1a3c0b8c2f43d6687ac253e41, 0x006ad2 ] } , - BigNum { limbs: [ 0xf349c07945e5e0edb443dca4bddafd, 0xb2d557f9bc8f70459aa181f5b2c711, 0x00091a ] } , - BigNum { limbs: [ 0xbcd3ad2d54ab429275afaabae52f1e, 0x725786b9a807da743c6e51998823e2, 0x000394 ] } , - BigNum { limbs: [ 0x00d055d2a9b0bc6d8a5054451ad0e3, 0x34fba2e3d54058c59b99b8084fe171, 0x007059 ] } , - BigNum { limbs: [ 0xde6b475254cb83a3e64b2e15d30aaf, 0xc43faa63a0cb7182c82aa0f115c918, 0x000f4c ] } , - BigNum { limbs: [ 0xdf38bbada9907b5c19b4d0ea2cf552, 0xe3137f39dc7cc1b70fdd68b0c23c3a, 0x0064a0 ] } , - BigNum { limbs: [ 0xca65fecc2631453714c31ae064c79c, 0x21ea16f520e2288c72980aeb1545ef, 0x0007ce ] } , - BigNum { limbs: [ 0xf33e0433d82ab9c8eb3ce41f9b3865, 0x856912a85c660aad656ffeb6c2bf63, 0x006c1f ] } , - BigNum { limbs: [ 0x16421580a82bd1697f65430e7d8926, 0xc5f9be2b838bda9fb1ca2b236e8c02, 0x001ee7 ] } , - BigNum { limbs: [ 0xa761ed7f56302d96809abbf18276db, 0xe1596b71f9bc589a263dde7e697951, 0x005505 ] } , - BigNum { limbs: [ 0x740a79a4750d83c4331bb22dabce03, 0x9db6e6d9b9a73f57df3ef8abc751b8, 0x003f4f ] } , - BigNum { limbs: [ 0x4999895b894e7b3bcce44cd25431fe, 0x099c42c3c3a0f3e1f8c910f610b39b, 0x00349e ] } , - BigNum { limbs: [ 0xce6da570a80e789a2682de2575b781, 0xa5b4f42d200a39dfc4ffe6d45fa3cb, 0x0016e4 ] } , - BigNum { limbs: [ 0xef365d8f564d8665d97d20da8a4880, 0x019e35705d3df95a130822cd786187, 0x005d09 ] } , - BigNum { limbs: [ 0x01899a6e8c892f68701dcd9b0c8a90, 0xb66954ac9f3507fbff4f43f48c1aa3, 0x00001d ] } , - BigNum { limbs: [ 0xbc1a689171d2cf978fe23164f37571, 0xf0e9d4f0de132b3dd8b8c5ad4beab0, 0x0073cf ] } , - BigNum { limbs: [ 0x7da87388ac4bff0d5dc4a9f5b54d26, 0x9c2e3fbd9c201ac58a85b06268d07d, 0x001c1e ] } , - BigNum { limbs: [ 0x3ffb8f77520ffff2a23b550a4ab2db, 0x0b24e9dfe12818744d82593f6f34d6, 0x0057cf ] } , - BigNum { limbs: [ 0x242bdc4035aec661da1c0093106616, 0x2ede8cd6749ee99560b2cddee30920, 0x00693a ] } , - BigNum { limbs: [ 0x997826bfc8ad389e25e3fe6cef99eb, 0x78749cc708a949a477553bc2f4fc33, 0x000ab3 ] } , - BigNum { limbs: [ 0x65427edee03d972b0e3d7e78722eab, 0xc8c077701fa3ebf8f101b20d9d11d5, 0x001a11 ] } , - BigNum { limbs: [ 0x586184211e1e67d4f1c280878dd156, 0xde92b22d5da44740e70657943af37e, 0x0059db ] } , - BigNum { limbs: [ 0xefff9f572c94b32efc9641f7f690dc, 0xb906971d8b054118b80dc81110f323, 0x006df6 ] } , - BigNum { limbs: [ 0xcda463a8d1c74bd10369bd08096f25, 0xee4c927ff242f2211ffa4190c7122f, 0x0005f6 ] } , - BigNum { limbs: [ 0xb75870c4c8211ca9c40a0456e12db6, 0xece5902c99b3ae9b030aa830eaa90b, 0x00123c ] } , - BigNum { limbs: [ 0x064b923b363ae2563bf5faa91ed24b, 0xba6d9970e394849ed4fd6170ed5c48, 0x0061b0 ] } , - BigNum { limbs: [ 0x117b84ab14fc7b1edb256398ddf097, 0x0ccc5cee8965e6938b85e4e3d64348, 0x001407 ] } , - BigNum { limbs: [ 0xac287e54e95f83e124da9b67220f6a, 0x9a86ccaef3e24ca64c8224be01c20b, 0x005fe6 ] } , - BigNum { limbs: [ 0xffdb443b3406f5f5eea61bcdd90225, 0xa60dff5a4839966ccd7d38c82c9a37, 0x002600 ] } , - BigNum { limbs: [ 0xbdc8bec4ca55090a1159e33226fddc, 0x01452a43350e9ccd0a8ad0d9ab6b1b, 0x004ded ] } , - BigNum { limbs: [ 0x5f87ae86d28d9b633e898f782ed47e, 0xaac8c3d5841e89a2182aba6bf41831, 0x0040b3 ] } , - BigNum { limbs: [ 0x5e1c54792bce639cc1766f87d12b83, 0xfc8a65c7f929a997bfdd4f35e3ed22, 0x003339 ] } , - BigNum { limbs: [ 0x1969238e7fecaa9d20ccca190af9fe, 0x2e637d1c6e0ea47b2f6af351fd869e, 0x005aa3 ] } , - BigNum { limbs: [ 0xa43adf717e6f5462df3334e6f50603, 0x78efac810f398ebea89d164fda7eb5, 0x00194a ] } , - BigNum { limbs: [ 0xfb55aa711369bb49d53fcf1ce11cd3, 0x1d2287835f3748e3dec226f6c6f251, 0x002c88 ] } , - BigNum { limbs: [ 0xc24e588eeaf243b62ac02fe31ee32e, 0x8a30a21a1e10ea55f945e2ab111301, 0x004765 ] } , - BigNum { limbs: [ 0xf6dd75bd09e197a9f2312a022e05a9, 0x32124bae0fe0614404b0d3bd1aa717, 0x0044ec ] } , - BigNum { limbs: [ 0xc6c68d42f47a67560dced4fdd1fa58, 0x7540ddef6d67d1f5d35735e4bd5e3b, 0x002f01 ] } , - BigNum { limbs: [ 0xf305c7e99e5e6aa4afb4c34cb19b26, 0x49249e90814dd17cb3336f18767a2e, 0x006140 ] } , - BigNum { limbs: [ 0xca9e3b165ffd945b504b3bb34e64db, 0x5e2e8b0cfbfa61bd24d49a89618b24, 0x0012ad ] } , - BigNum { limbs: [ 0x26b1113683fde4c5c17faf037889c3, 0xebba3e1e092e8c324415613cad2c66, 0x0047e5 ] } , - BigNum { limbs: [ 0x96f2f1c97a5e1a3a3e804ffc87763e, 0xbb98eb7f7419a70793f2a8652ad8ed, 0x002c07 ] } , - BigNum { limbs: [ 0xa9a0db0b34ea1ede327157965f6b59, 0xfc53b370591c32daa4b465b06dbbd7, 0x004a93 ] } , - BigNum { limbs: [ 0x140327f4c971e021cd8ea769a094a8, 0xaaff762d242c005f3353a3f16a497c, 0x002959 ] } , - BigNum { limbs: [ 0xae321d438c77b8023e8b849c35853e, 0x0c56c89282b7d760415eca1922948f, 0x0047bb ] } , - BigNum { limbs: [ 0x0f71e5bc71e446fdc1747a63ca7ac3, 0x9afc610afa905bd996a93f88b570c4, 0x002c32 ] } , - BigNum { limbs: [ 0xc8d4479c1b96b08b55ba558bf62e69, 0x0eb7d18adbfc9d8692aa47a58b380d, 0x002cbf ] } , - BigNum { limbs: [ 0xf4cfbb63e2c54e74aa45a97409d198, 0x989b5812a14b95b3455dc1fc4ccd45, 0x00472e ] } , - BigNum { limbs: [ 0x29d7916dae0478b241fbe936b66f37, 0xe6ca815304f4c417723f7e8cf0daa0, 0x003d08 ] } , - BigNum { limbs: [ 0x93cc71925057864dbe0415c94990ca, 0xc088a84a78536f2265c88b14e72ab3, 0x0036e4 ] } , - BigNum { limbs: [ 0x397a781738b3b5e970fb8a83922a0b, 0xf7b2a57f970f05f4b19cb92e0a2ff9, 0x004c6c ] } , - BigNum { limbs: [ 0x84298ae8c5a849168f04747c6dd5f6, 0xafa0841de6392d45266b5073cdd55a, 0x002780 ] } , - BigNum { limbs: [ 0x7f98a9899b09f107628888b1c39684, 0x0e6f51cd821faf3bd230ac8958510b, 0x0065c0 ] } , - BigNum { limbs: [ 0x3e0b597663520df89d77764e3c697d, 0x98e3d7cffb2883fe05d75d187fb448, 0x000e2d ] } , - BigNum { limbs: [ 0xa3d5c235d931b6d05ef70fe260277e, 0x0194e402203f38537fb08af96247ce, 0x00203b ] } , - BigNum { limbs: [ 0x19ce40ca252a482fa108ef1d9fd883, 0xa5be459b5d08fae658577ea875bd85, 0x0053b2 ] } , - BigNum { limbs: [ 0x2f20b762ee3f3bfaac7e6ff713c86f, 0x34265e0a3e91c3b794ffd2d7ab5326, 0x004963 ] } , - BigNum { limbs: [ 0x8e834b9d101cc30553818f08ec3792, 0x732ccb933eb66f82430836ca2cb22d, 0x002a8a ] } , - BigNum { limbs: [ 0x661795b2956e8135674296a42d5526, 0xd7fe80253c68dd3367575a3ea8243e, 0x007144 ] } , - BigNum { limbs: [ 0x578c6d4d68ed7dca98bd685bd2aadb, 0xcf54a97840df560670b0af632fe115, 0x0002a8 ] } , - BigNum { limbs: [ 0x88d14d8f37e3333f346bd9f36a745b, 0x920060e6ef18fa82f6d278d180f76d, 0x004e45 ] } , - BigNum { limbs: [ 0x34d2b570c678cbc0cb94250c958ba6, 0x1552c8b68e2f38b6e13590d0570de6, 0x0025a8 ] } , - BigNum { limbs: [ 0xac1f5d57348b38e36bbce2212a63cc, 0x95440a71a18ab8a14ef31198396f92, 0x00136f ] } , - BigNum { limbs: [ 0x1184a5a8c9d0c61c94431cded59c35, 0x120f1f2bdbbd7a988914f8099e95c1, 0x00607e ] } , - BigNum { limbs: [ 0xe6a504a18c774fc31aae93a4a789b1, 0x7299864a75f84d5e8e8781e124f966, 0x0044cb ] } , - BigNum { limbs: [ 0xd6fefe5e71e4af3ce5516b5b587650, 0x34b9a353074fe5db498087c0b30bec, 0x002f22 ] } , - BigNum { limbs: [ 0x42a5d3cc4b8962fe1c086de6f5da2a, 0x8fe193c27659d1330d3410a8ea3344, 0x0063ef ] } , - BigNum { limbs: [ 0x7afe2f33b2d29c01e3f791190a25d7, 0x177195db06ee6206cad3f8f8edd20f, 0x000ffe ] } , - BigNum { limbs: [ 0x699dce905fd33550c1a79631e1b05d, 0xb42e1e8c39f592be1d257779a5c2cd, 0x003c4b ] } , - BigNum { limbs: [ 0x5406346f9e88c9af3e5868ce1e4fa4, 0xf3250b114352a07bbae29228324286, 0x0037a1 ] } , - BigNum { limbs: [ 0x8b9ed63214a7551997e408b97bce64, 0x862cacba5107108b3080269638d37b, 0x001e8c ] } , - BigNum { limbs: [ 0x32052ccde9b4a9e6681bf64684319d, 0x21267ce32c4122aea787e30b9f31d8, 0x005561 ] } , - BigNum { limbs: [ 0x4b0c14c774f6f4389352e8b94b89e6, 0x6ac46d037a6dd60e0fac3e5e7a621d, 0x007263 ] } , - BigNum { limbs: [ 0x7297ee3889650ac76cad1646b4761b, 0x3c8ebc9a02da5d2bc85bcb435da336, 0x00018a ] } , - BigNum { limbs: [ 0x985d9d19380f197e151d3a231b3e78, 0x7e58f6e1a06851b9d0772360c130a5, 0x0006ac ] } , - BigNum { limbs: [ 0x254665e6c64ce581eae2c4dce4c189, 0x28fa32bbdcdfe1800790e64116d4ae, 0x006d41 ] } , - BigNum { limbs: [ 0xca5fe535e826bd5b6937e0ff00ed8b, 0xe96ad0d858b497db2a263132908303, 0x000c5f ] } , - BigNum { limbs: [ 0xf3441dca163541a496c81e00ff1276, 0xbde858c524939b5eade1d86f47824f, 0x00678d ] } , - BigNum { limbs: [ 0xd88546ef48e09b5a161546ead4b7c8, 0xb93d533c07f677a8f48b572fa1f711, 0x002460 ] } , - BigNum { limbs: [ 0xe51ebc10b57b63a5e9eab8152b4839, 0xee15d6617551bb90e37cb272360e41, 0x004f8c ] } , - BigNum { limbs: [ 0x9ad546e71d7c14ac7ee04cc702d7ed, 0x16af5aa3a2d464cf88e7700128f058, 0x005232 ] } , - BigNum { limbs: [ 0x22cebc18e0dfea53811fb238fd2814, 0x90a3cef9da73ce6a4f2099a0af14fb, 0x0021bb ] } , - BigNum { limbs: [ 0xc3890d637678376a8aa8842c120e36, 0x7ffcfe32e30065a095ef29cc5fab63, 0x006dd3 ] } , - BigNum { limbs: [ 0xfa1af59c87e3c79575577ad3edf1cb, 0x27562b6a9a47cd994218dfd57859ef, 0x00061a ] } , - BigNum { limbs: [ 0x3ac4576f96133763c39d4b0e166260, 0x7e9761af6173f7cd6fa185f4964620, 0x006115 ] } , - BigNum { limbs: [ 0x82dfab906848c79c3c62b3f1e99da1, 0x28bbc7ee1bd43b6c686683ad41bf33, 0x0012d8 ] } , - BigNum { limbs: [ 0x67f848cf0997e22a8c8de045bb9a27, 0x896b82dc575fff9e012abd7f304fb7, 0x005f3d ] } , - BigNum { limbs: [ 0x55abba30f4c41cd573721eba4465da, 0x1de7a6c125e8339bd6dd4c22a7b59c, 0x0014b0 ] } , - BigNum { limbs: [ 0x90513502f2c375e33b993aeb09c041, 0x7b429320b8e1f2e077f4eb284fe428, 0x005073 ] } , - BigNum { limbs: [ 0x2d52cdfd0b98891cc466c414f63fc0, 0x2c10967cc466405960131e7988212b, 0x00237a ] } , - BigNum { limbs: [ 0xa1857d2f8e75fd7956dad32b8d0a3e, 0xfe66e1a7b3ec40f446c5d40849a17e, 0x00416a ] } , - BigNum { limbs: [ 0x1c1e85d06fe60186a9252bd472f5c3, 0xa8ec47f5c95bf245914235998e63d5, 0x003282 ] } , - BigNum { limbs: [ 0xbb9779133dd76b8a25577e679b4638, 0xdc01f2176efa9c80845ef8964c3e31, 0x002c09 ] } , - BigNum { limbs: [ 0x020c89ecc0849375daa8809864b9c9, 0xcb5137860e4d96b953a9110b8bc722, 0x0047e3 ] } , - BigNum { limbs: [ 0xe14206334e32eb03c6b115fa8b964f, 0x51fd9fd6499d325ae512c2f6c6479f, 0x000bac ] } , - BigNum { limbs: [ 0xdc61fcccb02913fc394ee9057469b2, 0x555589c733ab00def2f546ab11bdb3, 0x006841 ] } , - BigNum { limbs: [ 0x4b35df11689e1cdad2999d9fd28bcc, 0x807f19e28e957da5d5fc832ca27132, 0x00133f ] } , - BigNum { limbs: [ 0x726e23ee95bde2252d6661602d7435, 0x26d40fbaeeb2b594020b8675359421, 0x0060ae ] } , - BigNum { limbs: [ 0x239da0394619241b42111e75ffa2de, 0x4d4153fcebff90e32df6a88417e9b0, 0x0056b9 ] } , - BigNum { limbs: [ 0x9a0662c6b842dae4bdeee08a005d23, 0x5a11d5a09148a256aa11611dc01ba3, 0x001d34 ] } , - BigNum { limbs: [ 0x11505668518d1efe128ce4fa8ac47f, 0x78c31421a7309c88d579eeacc0f648, 0x0069c1 ] } , - BigNum { limbs: [ 0xac53ac97accee001ed731a05753b82, 0x2e90157bd61796b1028e1af5170f0b, 0x000a2c ] } , - BigNum { limbs: [ 0x06ae14d1b79c4335eb183dc422640a, 0x8f5184b71164781986bd93773e5637, 0x002fd1 ] } , - BigNum { limbs: [ 0xb6f5ee2e46bfbbca14e7c13bdd9bf7, 0x1801a4e66be3bb20514a762a99af1c, 0x00441c ] } , - BigNum { limbs: [ 0x7a0931b726555733207e7b49c12a9a, 0x1ac970b554c0ffa4fe8374633bb790, 0x006309 ] } , - BigNum { limbs: [ 0x439ad148d806a7ccdf8183b63ed567, 0x8c89b8e828873394d984953e9c4dc3, 0x0010e4 ] } , - BigNum { limbs: [ 0x7f9c45b6a32a7fe188f870b56dddfa, 0x4b45d2076249a0877937067755110e, 0x003224 ] } , - BigNum { limbs: [ 0x3e07bd495b317f1e77078e4a922207, 0x5c0d57961afe92b25ed1032a82f445, 0x0041c9 ] } , - BigNum { limbs: [ 0x82f38d734058842d8dcdcfd164e2f2, 0xd916df60a3a3a29313c9c65bc5aef1, 0x006909 ] } , - BigNum { limbs: [ 0x3ab0758cbe037ad272322f2e9b1d0f, 0xce3c4a3cd9a490a6c43e4346125662, 0x000ae3 ] } , - BigNum { limbs: [ 0x773969049ee00fe19fe84f9dcfe7d6, 0x28a2939948c79dc1fde4fb754fdf47, 0x00700e ] } , - BigNum { limbs: [ 0x466a99fb5f7bef1e6017af6230182b, 0x7eb0960434809577da230e2c88260c, 0x0003df ] } , - BigNum { limbs: [ 0x4eca9a1a3dc9bef693d2f66ea91514, 0x47638538c2a5de60572e3406b89f96, 0x00183a ] } , - BigNum { limbs: [ 0x6ed968e5c09240096c2d089156eaed, 0x5fefa464baa254d980d9d59b1f65bd, 0x005bb3 ] } , - BigNum { limbs: [ 0x24078d713653f447161c9211568e4a, 0x92e6227ae5cf1c4b074bb508d359b3, 0x005199 ] } , - BigNum { limbs: [ 0x999c758ec8080ab8e9e36ceea971b7, 0x146d0722977916eed0bc549904aba0, 0x002254 ] } , - BigNum { limbs: [ 0x703181b5d0f52e776a16e848a3fa7b, 0x9444edb69626534973f4a669b6cfe5, 0x00502b ] } , - BigNum { limbs: [ 0x4d72814a2d66d08895e916b75c0586, 0x130e3be6e721dff06413633821356e, 0x0023c2 ] } , - BigNum { limbs: [ 0x6e663848f5963874ab5bb1a14a0dc8, 0xf7a64a7cdbc61169d51c32cc603cd6, 0x00287e ] } , - BigNum { limbs: [ 0x4f3dcab708c5c68b54a44d5eb5f239, 0xafacdf20a18221d002ebd6d577c87d, 0x004b6e ] } , - BigNum { limbs: [ 0x80cba8ff738a6ebeb24233ea2f2541, 0x8e8fe041ca9e7e78b1aa989751d5f4, 0x000ca4 ] } , - BigNum { limbs: [ 0x3cd85a008ad190414dbdcb15d0dac0, 0x18c3495bb2a9b4c1265d710a862f5f, 0x006749 ] } , - BigNum { limbs: [ 0xc14847a01783a30eca3f7baed36019, 0xac861a7439ba70c010d2d73f755e3d, 0x002fb0 ] } , - BigNum { limbs: [ 0xfc5bbb5fe6d85bf135c083512c9fe8, 0xfacd0f29438dc279c735326262a715, 0x00443c ] } , - BigNum { limbs: [ 0xdfcd68ca9f03f7332831ded7618faa, 0xe01551e64535a0e782d3666b5efbca, 0x00522f ] } , - BigNum { limbs: [ 0xddd69a355f5807ccd7ce20289e7057, 0xc73dd7b7381292525534a336790988, 0x0021bd ] } , - BigNum { limbs: [ 0x8f3200a219bb37ed5bea61c7118122, 0x143fef6311d69f89c3e794fd90cf35, 0x0052de ] } , - BigNum { limbs: [ 0x2e72025de4a0c712a4159d38ee7edf, 0x93133a3a6b7193b0142074a447361e, 0x00210f ] } , - BigNum { limbs: [ 0x57184ce1529cd8101748390b324477, 0x26fd32a8105940931e03e65fd4fc46, 0x002284 ] } , - BigNum { limbs: [ 0x668bb61eabbf26efe8b7c5f4cdbb8a, 0x8055f6f56ceef2a6ba04234203090d, 0x005169 ] } , - BigNum { limbs: [ 0xa886037e2af329cd2418acfeeb838d, 0xb1ef4cf90614ef0a0b1c55ef657509, 0x005e42 ] } , - BigNum { limbs: [ 0x151dff81d368d532dbe75201147c74, 0xf563dca47733442fccebb3b272904a, 0x0015aa ] } , - BigNum { limbs: [ 0xb3164314530cf88b71ecbd64ce63f1, 0x89dc01efa36b1fdcad3774362e77db, 0x00215f ] } , - BigNum { limbs: [ 0x0a8dbfebab4f06748e13419b319c10, 0x1d7727add9dd135d2ad0956ba98d78, 0x00528e ] } , - BigNum { limbs: [ 0x1e959b97cb00e1d465de0ab477c622, 0xd75904f78fc1510e7f9ddb69f253e9, 0x003a37 ] } , - BigNum { limbs: [ 0x9f0e6768335b1d2b9a21f44b8839df, 0xcffa24a5ed86e22b586a2e37e5b16a, 0x0039b5 ] } , - BigNum { limbs: [ 0xdc74a175fb66d8c91dd7bcb6d98a10, 0x91da4bc176b7f308325617d0f4ab25, 0x002d93 ] } , - BigNum { limbs: [ 0xe12f618a02f52636e22842492675f1, 0x1578dddc06904031a5b1f1d0e35a2d, 0x00465a ] } , - BigNum { limbs: [ 0xc12e6f5533730efb7366728e74e707, 0xf6207ecf39e022e09ecf9355057e16, 0x00154d ] } , - BigNum { limbs: [ 0xfc7593aacae8f0048c998c718b18fa, 0xb132aace436810593938764cd2873c, 0x005e9f ] } , - BigNum { limbs: [ 0x38476a0fc00d35443787b67158e459, 0x5805a8b95c24d107e4978e049164ba, 0x001c88 ] } , - BigNum { limbs: [ 0x855c98f03e4ec9bbc878488ea71ba8, 0x4f4d80e421236231f3707b9d46a099, 0x005765 ] } , - BigNum { limbs: [ 0x13bdbd833f6491e033219803a77284, 0x3dee46db6ac6ba5b0e618c35e16aa2, 0x002782 ] } , - BigNum { limbs: [ 0xa9e6457cbef76d1fccde66fc588d7d, 0x6964e2c2128178dec9a67d6bf69ab1, 0x004c6b ] } , - BigNum { limbs: [ 0xb2eb02022e105e3d85e5ec2f0d384d, 0x11c3a2cac9bb1f6b1d367bf8f96d95, 0x00240c ] } , - BigNum { limbs: [ 0x0ab900fdd04ba0c27a1a12d0f2c7b4, 0x958f86d2b38d13cebad18da8de97be, 0x004fe1 ] } , - BigNum { limbs: [ 0xbedcf99899365c7c5177831c4f9a2f, 0x7576c538f99a8b4d3c9304ac1777b8, 0x00254a ] } , - BigNum { limbs: [ 0xfec709676525a283ae887be3b065d2, 0x31dc646483ada7ec9b7504f5c08d9a, 0x004ea3 ] } , - BigNum { limbs: [ 0x5b6dc2f31cbbc9b9c47e1ba8f9236e, 0x2e11b4adcd5e7787fe07c20b42c015, 0x006b42 ] } , - BigNum { limbs: [ 0x6236400ce1a035463b81e35706dc93, 0x794174efafe9bbb1da00479695453e, 0x0008ab ] } , - BigNum { limbs: [ 0x11640d7051b71b12524eeee9de0742, 0x230691e53394b528798f8fbbd97f75, 0x00369b ] } , - BigNum { limbs: [ 0xac3ff58faca4e3edadb1101621f8bf, 0x844c97b849b37e115e7879e5fe85de, 0x003d52 ] } , - BigNum { limbs: [ 0x411e4600a81ddbe179dc1bad1ae3cc, 0xd9533ba2a5bad3515b61eeb82c44c4, 0x0048a9 ] } , - BigNum { limbs: [ 0x7c85bcff563e231e8623e352e51c35, 0xcdffedfad78d5fe87ca61ae9abc08f, 0x002b43 ] } , - BigNum { limbs: [ 0x15a00083daa205ac897fd06e1fa419, 0xbd8e5aa6b1584c7063ea804b7fba65, 0x005711 ] } , - BigNum { limbs: [ 0xa804027c23b9f95376802e91e05be8, 0xe9c4cef6cbefe6c9741d8956584aee, 0x001cdb ] } , - BigNum { limbs: [ 0xaf972db429b19d7d92d2c706b5bb82, 0x4401fc3875583b5289d11dedd15a09, 0x000e27 ] } , - BigNum { limbs: [ 0x0e0cd54bd4aa61826d2d37f94a447f, 0x63512d6507eff7e74e36ebb406ab4a, 0x0065c6 ] } , - BigNum { limbs: [ 0xa014a92d1d8309e82e0aa92105b69c, 0xd948bca95f4361465a64f064150d72, 0x0065b3 ] } , - BigNum { limbs: [ 0x1d8f59d2e0d8f517d1f555defa4965, 0xce0a6cf41e04d1f37da3193dc2f7e1, 0x000e39 ] } , - BigNum { limbs: [ 0xd3c547fe572181d2d0270c4778605d, 0x0973e490e8443c67ef980a8ddf85f8, 0x00633e ] } , - BigNum { limbs: [ 0xe9debb01a73a7d2d2fd8f2b8879fa4, 0x9ddf450c9503f6d1e86fff13f87f5a, 0x0010af ] } , - BigNum { limbs: [ 0x3afb994f8855e421398aef9d860b7a, 0xc6e357c81e7222b26285673daa078a, 0x002124 ] } , - BigNum { limbs: [ 0x82a869b076061adec6750f6279f487, 0xe06fd1d55ed610877582a2642dfdc9, 0x0052c8 ] } , - BigNum { limbs: [ 0xf09f8b074b5b1c17f8d231005dd5b6, 0xa32b4d7ea8dc9d9c75f44fa63b6207, 0x0006f2 ] } , - BigNum { limbs: [ 0xcd0477f8b300e2e8072dcdffa22a4b, 0x0427dc1ed46b959d6213b9fb9ca34b, 0x006cfb ] } , - BigNum { limbs: [ 0x4f08fd6dcea734b249b692a0b899f1, 0x27f23f1999b6efc301c5e49f94ce3a, 0x002508 ] } , - BigNum { limbs: [ 0x6e9b05922fb4ca4db6496c5f476610, 0x7f60ea83e3914376d6422502433719, 0x004ee5 ] } , - BigNum { limbs: [ 0x177442f762f8b140d553d92828a013, 0xcbbeda9124c5bc6e587fa3e9fe4b15, 0x003dff ] } , - BigNum { limbs: [ 0xa62fc0089b634dbf2aac25d7d75fee, 0xdb944f0c588276cb7f8865b7d9ba3e, 0x0035ed ] } , - BigNum { limbs: [ 0x257af85747aeab0dfbc55b0bfe2025, 0x9debe9dd427956302b849b853091e9, 0x00200c ] } , - BigNum { limbs: [ 0x98290aa8b6ad53f2043aa3f401dfdc, 0x09673fc03acedd09ac836e1ca7736a, 0x0053e1 ] } , - BigNum { limbs: [ 0x592fba384dac4713e39e87a5485424, 0x1eb46ad5a72ccfc7c03fdd0aba6704, 0x0021b4 ] } , - BigNum { limbs: [ 0x647448c7b0afb7ec1c61775ab7abdd, 0x889ebec7d61b637217c82c971d9e4f, 0x005239 ] } , - BigNum { limbs: [ 0xbfd757e7476ce106aeba3062ddf0c0, 0xf8f34b722df00c34ac2d837b92b02e, 0x00403a ] } , - BigNum { limbs: [ 0xfdccab18b6ef1df95145ce9d220f41, 0xae5fde2b4f5827052bda8626455524, 0x0033b2 ] } , - BigNum { limbs: [ 0x756db692fb7d2eff951fd448b52298, 0x9f72b95270b0848c7bb9c4bb948f90, 0x006760 ] } , - BigNum { limbs: [ 0x48364c6d02ded0006ae02ab74add69, 0x07e0704b0c97aead5c4e44e64375c3, 0x000c8d ] } , - BigNum { limbs: [ 0xadfbd518c6cfa8b8fbe433942b9035, 0x491bead48f2c76ad48b4a8cfe0546e, 0x002ee3 ] } , - BigNum { limbs: [ 0x0fa82de7378c5647041bcb6bd46fcc, 0x5e373ec8ee1bbc8c8f5360d1f7b0e5, 0x00450a ] } , - BigNum { limbs: [ 0xe611b9760956d35b7c13c367df99c0, 0xff3be50b2748c4899e7a646aacc401, 0x006b1c ] } , - BigNum { limbs: [ 0xd7924989f5052ba483ec3b98206641, 0xa817449255ff6eb0398da5372b4151, 0x0008d0 ] } , - BigNum { limbs: [ 0xf2f6a508d187634179beb1cd1e7923, 0xcc7c00a55e325b4c3815cd0d035171, 0x002ab0 ] } , - BigNum { limbs: [ 0xcaad5df72cd49bbe86414d32e186de, 0xdad728f81f15d7ed9ff23c94d4b3e1, 0x00493c ] } , - BigNum { limbs: [ 0xab5c0fedd6a42a61cd5d3d62aa072e, 0xc87f3ae15bea544f91e928d45a707d, 0x0054de ] } , - BigNum { limbs: [ 0x1247f31227b7d49e32a2c19d55f8d3, 0xded3eebc215ddeea461ee0cd7d94d6, 0x001f0e ] } , - BigNum { limbs: [ 0xe11afba2966e80ce8faf067b35a896, 0x7f3796dfd4a818ff607c0131e323a5, 0x007200 ] } , - BigNum { limbs: [ 0xdc89075d67ed7e317050f884ca576b, 0x281b92bda8a01a3a778c086ff4e1ad, 0x0001ed ] } , - BigNum { limbs: [ 0xefeb8648ebd480f409f1829c3dbc86, 0x58580639d21913424b58076d571c59, 0x00597e ] } , - BigNum { limbs: [ 0xcdb87cb712877e0bf60e7c63c2437b, 0x4efb2363ab2f1ff78cb0023480e8f9, 0x001a6f ] } , - BigNum { limbs: [ 0xe9477f9e3464d58ee8e6bd894cb034, 0xfb96180a3e34627cd57adbafff3268, 0x000e70 ] } , - BigNum { limbs: [ 0xd45c8361c9f7297117194176b34fcd, 0xabbd11933f13d0bd028d2df1d8d2ea, 0x00657c ] } , - BigNum { limbs: [ 0xc629875055acc88c58f9d6d7e4efd1, 0x6f9cc8f77ccdcc1d0703d7849a612f, 0x0021b0 ] } , - BigNum { limbs: [ 0xf77a7bafa8af3673a70628281b1030, 0x37b660a6007a671cd104321d3da423, 0x00523d ] } , - BigNum { limbs: [ 0x17f60a78c4b441628070272a1e82b5, 0x0301700c800f342129044f9aaa7325, 0x004300 ] } , - BigNum { limbs: [ 0xa5adf88739a7bd9d7f8fd7d5e17d4c, 0xa451b990fd38ff18af03ba072d922e, 0x0030ed ] } , - BigNum { limbs: [ 0xe844b92948ba04b58ea30f7eb1bdc8, 0x1a80fa0b342688238b143dd481c6e5, 0x0018b2 ] } , - BigNum { limbs: [ 0xd55f49d6b5a1fa4a715cef814e4239, 0x8cd22f924921ab164cf3cbcd563e6d, 0x005b3b ] } , - BigNum { limbs: [ 0x132e9bed0b9ffda9ee552adea093e4, 0x62e5b807220da519125d9617a4dfdf, 0x0059d3 ] } , - BigNum { limbs: [ 0xaa756712f2bc015611aad4215f6c1d, 0x446d71965b3a8e20c5aa738a332574, 0x001a1a ] } , - BigNum { limbs: [ 0xde89cbd800e9e1df5cdaddae536761, 0x99ef4b2c56e815c6515638564fa4c2, 0x0057ad ] } , - BigNum { limbs: [ 0xdf1a3727fd721d20a3252151ac98a0, 0x0d63de7126601d7386b1d14b886090, 0x001c40 ] } , - BigNum { limbs: [ 0xc2815184e2cc30e6c010840fccc2d0, 0x19fe37f0ee6dee1595b04d22ea9082, 0x00607a ] } , - BigNum { limbs: [ 0xfb22b17b1b8fce193fef7af0333d31, 0x8d54f1ac8eda45244257bc7eed74d0, 0x001373 ] } , - BigNum { limbs: [ 0xe4554a900c6ec287cc3255fe0dc830, 0x3aa6d0b5a8760b4cf0d79c87070e17, 0x003fa7 ] } , - BigNum { limbs: [ 0xd94eb86ff1ed3c7833cda901f237d1, 0x6cac58e7d4d227ece7306d1ad0f73b, 0x003446 ] } , - BigNum { limbs: [ 0xb398953cca0d67bf5567d7621e2d8f, 0x6de41de1db47c728f80c42bf0b0834, 0x00301f ] } , - BigNum { limbs: [ 0x0a0b6dc3344e9740aa98279de1d272, 0x396f0bbba2006c10dffbc6e2ccfd1f, 0x0043ce ] } , - BigNum { limbs: [ 0x962f58342576bdf166f48059f66ac8, 0x97619427b6ddd5b79de31ec4e3c51f, 0x0072b3 ] } , - BigNum { limbs: [ 0x2774aacbd8e5410e990b7ea6099539, 0x0ff19575c66a5d823a24eadcf44034, 0x00013a ] } , - BigNum { limbs: [ 0x24d440d730af9a3f0b4ecfd90411f1, 0x46d0f8ddf3531046cd85dba9cb19a8, 0x00082f ] } , - BigNum { limbs: [ 0x98cfc228cdac64c0f4b12f26fbee10, 0x608230bf89f522f30a822df80cebab, 0x006bbe ] } , - BigNum { limbs: [ 0xc0f5a75f604f6086c92529fb22df29, 0xd608500cb76ee87d768eb9b41c8a1b, 0x006eef ] } , - BigNum { limbs: [ 0xfcae5ba09e0c9e7936dad504dd20d8, 0xd14ad990c5d94abc61794fedbb7b37, 0x0004fd ] } , - BigNum { limbs: [ 0x8fd135f2bac00562079583a7c19587, 0x740334326a8734ec83c707588b1d40, 0x0070da ] } , - BigNum { limbs: [ 0x2dd2cd0d439bf99df86a7b583e6a7a, 0x334ff56b12c0fe4d544102494ce813, 0x000313 ] } , - BigNum { limbs: [ 0xbc79366d5312ce42ae9328d457d99d, 0xdfd5d8732182e7e61605fb8ca6470e, 0x006b3b ] } , - BigNum { limbs: [ 0x012acc92ab4930bd516cd62ba82664, 0xc77d512a5bc54b53c2020e1531be45, 0x0008b1 ] } , - BigNum { limbs: [ 0x1d1a93ef7d9a101b62c435099a7877, 0x605a65de60878e7fe6cae78b960e2d, 0x004a43 ] } , - BigNum { limbs: [ 0xa0896f1080c1eee49d3bc9f665878a, 0x46f8c3bf1cc0a4b9f13d221641f726, 0x0029aa ] } , - BigNum { limbs: [ 0x6a116620a108087fb95fcb72e614e0, 0x5883b7d44749255e7f3c61139fa69f, 0x0003d1 ] } , - BigNum { limbs: [ 0x53929cdf5d53f68046a0338d19eb21, 0x4ecf71c935ff0ddb58cba88e385eb4, 0x00701c ] } , - BigNum { limbs: [ 0x70929550bc0873f7377ba08b5891c5, 0x6961bfe01725b6235ded61020645c1, 0x00137a ] } , - BigNum { limbs: [ 0x4d116daf42538b08c8845e74a76e3c, 0x3df169bd66227d167a1aa89fd1bf92, 0x006073 ] } , - BigNum { limbs: [ 0x3edbb7342cf4976ef77052f3b06fcf, 0x7820854ed9924e04a376d0731e9b62, 0x002ac5 ] } , - BigNum { limbs: [ 0x7ec84bcbd1676791088fac0c4f9032, 0x2f32a44ea3b5e5353491392eb969f1, 0x004928 ] } , - BigNum { limbs: [ 0x1db462dc6290c075d7248297a6ec98, 0xfbbccaba9fe556ba6e9c1ff7c93bdb, 0x004b0c ] } , - BigNum { limbs: [ 0x9fefa0239bcb3e8a28db7c68591369, 0xab965ee2dd62dc7f696be9aa0ec978, 0x0028e0 ] } , - BigNum { limbs: [ 0x0bc4f580ed569fcac071cabb962a26, 0xb929d1b14af78528bb0c2d58675a46, 0x000967 ] } , - BigNum { limbs: [ 0xb1df0d7f11055f353f8e344469d5db, 0xee2957ec3250ae111cfbdc4970ab0d, 0x006a85 ] } , - BigNum { limbs: [ 0xf2b2b3e610defb5f0f2901209a5489, 0x8a4971053e16433d9e6d7000e78e07, 0x00570a ] } , - BigNum { limbs: [ 0xcaf14f19ed7d03a0f0d6fddf65ab78, 0x1d09b8983f31effc399a99a0f0774b, 0x001ce3 ] } , - BigNum { limbs: [ 0xaeeadc9eb27a597732034e9cec8131, 0xc8d87807e0fc6c96eb013622c18b50, 0x00336d ] } , - BigNum { limbs: [ 0x0eb926614be1a588cdfcb063137ed0, 0xde7ab1959c4bc6a2ed06d37f167a03, 0x00407f ] } , - BigNum { limbs: [ 0x3f01b6d19f9306559c7997221ca6f4, 0x53df6a7eeb6e34485fffdb5ceb448c, 0x004709 ] } , - BigNum { limbs: [ 0x7ea24c2e5ec8f8aa638667dde3590d, 0x5373bf1e91d9fef178082e44ecc0c7, 0x002ce4 ] } , - BigNum { limbs: [ 0x2d1821cf05358cc529e0772df8cf72, 0xd5dbfa25969f4496961f856ce6724f, 0x0029a0 ] } , - BigNum { limbs: [ 0x908be130f926723ad61f87d207308f, 0xd1772f77e6a8eea341e88434f19304, 0x004a4c ] } , - BigNum { limbs: [ 0xd581d5bbd55c08c56583ab7638c172, 0x37b60ab2728a3f7f1331bf6b847aee, 0x00008a ] } , - BigNum { limbs: [ 0xe8222d4428fff63a9a7c5389c73e8f, 0x6f9d1eeb0abdf3bac4d64a36538a64, 0x007363 ] } , - BigNum { limbs: [ 0x2a88a374919e32868b8cf3a3c456dd, 0x430c8c82b07f36d6e90ea2d1b2c9d4, 0x003d78 ] } , - BigNum { limbs: [ 0x931b5f8b6cbdcc7974730b5c3ba924, 0x64469d1accc8fc62eef966d0253b7f, 0x003675 ] } , - BigNum { limbs: [ 0x55c0b4dd526cae73628c95bfe36318, 0x3a81a2f8ab890f7a2cb4b2760f1f29, 0x000274 ] } , - BigNum { limbs: [ 0x67e34e22abef508c9d7369401c9ce9, 0x6cd186a4d1bf23bfab53572bc8e62a, 0x007179 ] } , - BigNum { limbs: [ 0x6b650565be27d5c4349c6479217ea0, 0x366d6c2a685ba9c8d69636987d3766, 0x00462a ] } , - BigNum { limbs: [ 0x523efd9a4034293bcb639a86de8161, 0x70e5bd7314ec89710171d3095acded, 0x002dc3 ] } , - BigNum { limbs: [ 0xe11d37c118ad24f23bb876e6e3996d, 0x2250ca2db691fd4bc57e64f23b3e4a, 0x0069ea ] } , - BigNum { limbs: [ 0xdc86cb3ee5aeda0dc44788191c6694, 0x85025f6fc6b635ee1289a4af9cc708, 0x000a03 ] } , - BigNum { limbs: [ 0xc2834a13648ab0bb2696da85c46161, 0x19badcaac1644af1730c4eab0deb39, 0x0039d6 ] } , - BigNum { limbs: [ 0xfb20b8ec99d14e44d969247a3b9ea0, 0x8d984cf2bbe3e84864fbbaf6ca1a19, 0x003a17 ] } , - BigNum { limbs: [ 0x7f57194f4989607224b93b7826bd78, 0x0b4418d8f2e9507988b500bdc6892a, 0x0005ec ] } , - BigNum { limbs: [ 0x3e4ce9b0b4d29e8ddb46c387d94289, 0x9c0f10c48a5ee2c04f5308e4117c29, 0x006e01 ] } , - BigNum { limbs: [ 0xb5608c82fae9cac0e0e70700397886, 0x37dfecd3e929e61aaee3afa8db4c18, 0x0064d4 ] } , - BigNum { limbs: [ 0x0843767d0372343f1f18f7ffc6877b, 0x6f733cc9941e4d1f292459f8fcb93b, 0x000f19 ] } , - BigNum { limbs: [ 0x34f400a2f13a75858c7dd04232ef0d, 0xf9d6eccc062a45cecaaeac73df696b, 0x004e91 ] } , - BigNum { limbs: [ 0x88b0025d0d21897a73822ebdcd10f4, 0xad7c3cd1771ded6b0d595d2df89be8, 0x00255b ] } , - BigNum { limbs: [ 0x8a03366e20394efdef59ead89e81cf, 0xb64ba063e5a79520a209516f517261, 0x00358d ] } , - BigNum { limbs: [ 0x33a0cc91de22b00210a61427617e32, 0xf107893997a09e1935feb8328692f2, 0x003e5f ] } , - BigNum { limbs: [ 0x11ff8298b69043c12c3995a8873bed, 0x3bd361c7384135ed4d5518c8374264, 0x005418 ] } , - BigNum { limbs: [ 0xaba4806747cbbb3ed3c6695778c414, 0x6b7fc7d64506fd4c8ab2f0d9a0c2ef, 0x001fd5 ] } , - BigNum { limbs: [ 0x2610353aab356f247373610da0eec2, 0xde9a82dea97a04f74216d11d4ec6d1, 0x001d52 ] } , - BigNum { limbs: [ 0x9793cdc553268fdb8c8c9df25f113f, 0xc8b8a6bed3ce2e4295f13884893e82, 0x00569a ] } , - BigNum { limbs: [ 0x74dcdd07aec63dbe50506c03bb3eb1, 0x788a1c17378fdf1d97dca907f97dad, 0x000fbd ] } , - BigNum { limbs: [ 0x48c725f84f95c141afaf92fc44c150, 0x2ec90d8645b8541c402b6099de87a6, 0x006430 ] } , - BigNum { limbs: [ 0x807a77c0216d6a62dcea75fb24beb3, 0x4c241cc0c3ccd4454efbffb2164b6b, 0x0047a3 ] } , - BigNum { limbs: [ 0x3d298b3fdcee949d23158904db414e, 0x5b2f0cdcb97b5ef4890c09efc1b9e8, 0x002c4a ] } , - BigNum { limbs: [ 0x68e775a1fdfeee59b11294a7e75b42, 0x90f74d6a8f6eb5ad0f7f6d17ae7cd2, 0x001936 ] } , - BigNum { limbs: [ 0x54bc8d5e005d10a64eed6a5818a4bf, 0x165bdc32edd97d8cc8889c8a298881, 0x005ab7 ] } , - BigNum { limbs: [ 0x604fc97c42876dd9cdbdfe6d7541f7, 0x247e9f45832c426726cdf205c7d4ce, 0x001585 ] } , - BigNum { limbs: [ 0x5d543983bbd49126324200928abe0a, 0x82d48a57fa1bf0d2b13a179c103085, 0x005e68 ] } , - BigNum { limbs: [ 0x744a20a8aa638c81b32209443061d3, 0x98b84933a8c2f0d7db9ab6d438be24, 0x005753 ] } , - BigNum { limbs: [ 0x4959e25753f8727e4cddf5bbcf9e2e, 0x0e9ae069d4854261fc6d52cd9f472f, 0x001c9a ] } , - BigNum { limbs: [ 0xc2515e5bf61bb549b9ca5d035c832d, 0x104d23867d1d1f9c39b2f742016478, 0x006d4c ] } , - BigNum { limbs: [ 0xfb52a4a4084049b64635a1fca37cd4, 0x97060617002b139d9e55125fd6a0da, 0x0006a1 ] } , - BigNum { limbs: [ 0x76ecab2c881551a0912629b1438204, 0x95f5102a751cdc20bb57d12d8ac579, 0x001a40 ] } , - BigNum { limbs: [ 0x46b757d37646ad5f6ed9d54ebc7dfd, 0x115e1973082b57191cb038744d3fda, 0x0059ad ] } , - BigNum { limbs: [ 0x836427d83015de36fc877aa7a41114, 0x2baad6dbc9e85c4b92dd71e06d41cb, 0x0027c4 ] } , - BigNum { limbs: [ 0x3a3fdb27ce4620c9037884585beeed, 0x7ba852c1b35fd6ee452a97c16ac388, 0x004c29 ] } , - BigNum { limbs: [ 0x6d9c1f736d9ca4ebf95617bb8f14e5, 0x79e0d2e2b5e3ea1612d2158040bcc5, 0x001a46 ] } , - BigNum { limbs: [ 0x5007e38c90bf5a1406a9e74470eb1c, 0x2d7256bac7644923c535f42197488e, 0x0059a7 ] } , - BigNum { limbs: [ 0x654a9626e64c9bae1125f30e062ea5, 0xcba6e09da50cd7e8dc62c6b3d3a626, 0x00672b ] } , - BigNum { limbs: [ 0x58596cd9180f6351eeda0bf1f9d15c, 0xdbac48ffd83b5b50fba542ee045f2d, 0x000cc1 ] } , - BigNum { limbs: [ 0xe36bb0a67bfd6f08218b88d7bb4a66, 0x1a35f6af3b5db3945bfc5926357f34, 0x0029e6 ] } , - BigNum { limbs: [ 0xda385259825e8ff7de74762844b59b, 0x8d1d32ee41ea7fa57c0bb07ba2861e, 0x004a07 ] } , - BigNum { limbs: [ 0x5768e9d7df8cdeb5ec36f5f5a21cbd, 0x3aa1719ae038e49285fd6b82920681, 0x007189 ] } , - BigNum { limbs: [ 0x663b19281ecf204a13c9090a5de344, 0x6cb1b8029d0f4ea7520a9e1f45fed2, 0x000264 ] } , - BigNum { limbs: [ 0x7b57a78366b52c82e77e4704d5ee1b, 0x1c2cf0569225e688d9618730b8ae84, 0x006ec7 ] } , - BigNum { limbs: [ 0x424c5b7c97a6d27d1881b7fb2a11e6, 0x8b263946eb224cb0fea682711f56cf, 0x000526 ] } , - BigNum { limbs: [ 0xfe423d0c2dd8d7693ad2dd0439e0f2, 0xf3d960853d4bb1fe08f795f4eb622d, 0x0064f8 ] } , - BigNum { limbs: [ 0xbf61c5f3d0832796c52d21fbc61f0f, 0xb379c9183ffc813bcf1073aceca325, 0x000ef4 ] } , - BigNum { limbs: [ 0xd9fd35aa2bbfbb8c9503b572273e30, 0x05bb00c2e29d2dd5225f389aac6127, 0x002f8f ] } , - BigNum { limbs: [ 0xe3a6cd55d29c43736afc498dd8c1d1, 0xa19828da9aab0564b5a8d1072ba42b, 0x00445e ] } , - BigNum { limbs: [ 0xd2cb62bb6f8d444320edc98ad4f10e, 0xbe649765ecb10065379a8efc594e37, 0x000821 ] } , - BigNum { limbs: [ 0xead8a0448ecebabcdf1235752b0ef3, 0xe8ee9237909732d4a06d7aa57eb71b, 0x006bcb ] } , - BigNum { limbs: [ 0x7c8a5578c84776b299104a012dd867, 0xcdc31e229aed9d5a2a1702bde80275, 0x001906 ] } , - BigNum { limbs: [ 0x4119ad873614884d66efb4fed2279a, 0xd9900b7ae25a95dfadf106e3f002de, 0x005ae6 ] } , - BigNum { limbs: [ 0x08ac6c80801959025b7be7e7bdffad, 0x781374808ca11d675ca5b7a5a6e93c, 0x0010f2 ] } , - BigNum { limbs: [ 0xb4f7967f7e42a5fda4841718420054, 0x2f3fb51cf0a715d27b6251fc311c17, 0x0062fb ] } , - BigNum { limbs: [ 0xa595f474d96adbf60dc6079f47dd9a, 0xecefbc8636b585df84c7c43f7a703f, 0x001b29 ] } , - BigNum { limbs: [ 0x180e0e8b24f12309f239f760b82267, 0xba636d174692ad5a534045625d9514, 0x0058c3 ] } , - BigNum { limbs: [ 0xf5bb72eec65cfdac56c4a94b015f16, 0xe2ac9526a34be782e4bbed4937aec4, 0x006570 ] } , - BigNum { limbs: [ 0xc7e8901137ff0153a93b55b4fea0eb, 0xc4a69476d9fc4bb6f34c1c58a0568e, 0x000e7c ] } , - BigNum { limbs: [ 0x4afe3f0ae233c9db14908599f458d8, 0x5a8a3d18edaf004071a725364d01f1, 0x001f5f ] } , - BigNum { limbs: [ 0x72a5c3f51c283524eb6f79660ba729, 0x4cc8ec848f9932f96660e46b8b0362, 0x00548e ] } , - BigNum { limbs: [ 0x0705a55c75bde3d9ec04f35f2f3748, 0x5e606bdb83de8fe2870b3be481aa77, 0x002df9 ] } , - BigNum { limbs: [ 0xb69e5da3889e1b2613fb0ba0d0c8b9, 0x48f2bdc1f969a35750fccdbd565adc, 0x0045f4 ] } , - BigNum { limbs: [ 0xcef5f118418cbff7d307b014884ac8, 0xd388423fff7c831771fe812b8f6eb9, 0x00095a ] } , - BigNum { limbs: [ 0xeeae11e7bccf3f082cf84eeb77b539, 0xd3cae75d7dcbb02266098876489699, 0x006a92 ] } , - BigNum { limbs: [ 0x1ec708bbc371e5fa577a3377bed03b, 0x3556719ba7731c0f315db71f58b945, 0x005fe1 ] } , - BigNum { limbs: [ 0x9edcfa443aea1905a885cb88412fc6, 0x71fcb801d5d5172aa6aa52827f4c0e, 0x00140c ] } , - BigNum { limbs: [ 0x910e53a43ccc546cf05fee43e8e8bb, 0x299156861231c856d226dd94c8cd0e, 0x003d94 ] } , - BigNum { limbs: [ 0x2c95af5bc18faa930fa010bc171746, 0x7dc1d3176b166ae305e12c0d0f3845, 0x003659 ] } , - BigNum { limbs: [ 0x37fefa20da0900106899c9038863f5, 0x52dedc5a4703a562353ce9bd0d48f3, 0x00234f ] } , - BigNum { limbs: [ 0x85a508df2452feef976635fc779c0c, 0x54744d4336448dd7a2cb1fe4cabc60, 0x00509e ] } , - BigNum { limbs: [ 0x935e883e4d0aa099350f3f1f238e44, 0xc8fe302847e6d49fb3acce09aa7c18, 0x0003b9 ] } , - BigNum { limbs: [ 0x2a457ac1b1515e66caf0bfe0dc71bd, 0xde54f97535615e9a245b3b982d893b, 0x007033 ] } , - BigNum { limbs: [ 0xd722035fae8abada32dfeaccbbf98d, 0xc8f0f02e65e6adf7ec62c5a0ca3e70, 0x00421a ] } , - BigNum { limbs: [ 0xe681ffa04fd14425cd201433440674, 0xde62396f17618541eba544010dc6e2, 0x0031d2 ] } , - BigNum { limbs: [ 0x6ac76bd2157ee41f10aafa2f7fbc90, 0xcf831ef6a8c992d7830ab787d21df8, 0x001029 ] } , - BigNum { limbs: [ 0x52dc972de8dd1ae0ef5504d0804371, 0xd7d00aa6d47ea06254fd521a05e75b, 0x0063c3 ] } , - BigNum { limbs: [ 0x759f24fda4b6da6df6c3189cbc8b17, 0x32b15a073d13cf474f049a8b1ebcfb, 0x0053b6 ] } , - BigNum { limbs: [ 0x4804de0259a52492093ce6634374ea, 0x74a1cf96403463f289036f16b94858, 0x002037 ] } , - BigNum { limbs: [ 0xb2599ddc09e1df071f4fb2c4e50cab, 0x239d05c466a485cd8b8d46589593ab, 0x001960 ] } , - BigNum { limbs: [ 0x0b4a6523f47a1ff8e0b04c3b1af356, 0x83b623d916a3ad6c4c7ac3494271a8, 0x005a8d ] } , - BigNum { limbs: [ 0x82d6a42408ebfba758401acfc3a4e3, 0xf227985f08e736aa15960e38ab6d8f, 0x00524a ] } , - BigNum { limbs: [ 0x3acd5edbf5700358a7bfe4303c5b1e, 0xb52b913e7460fc8fc271fb692c97c4, 0x0021a2 ] } , - BigNum { limbs: [ 0x4884b372244337d996b4c2f8f76766, 0x326b21953ae15c5d6659010049a650, 0x0066be ] } , - BigNum { limbs: [ 0x751f4f8dda18c726694b3c0708989b, 0x74e808084266d6dc71af08a18e5f03, 0x000d2f ] } , - BigNum { limbs: [ 0x7008ba672b6ffecf52e7e950d7ce36, 0xed9f21961bdda1125478cf63050484, 0x0036a0 ] } , - BigNum { limbs: [ 0x4d9b4898d2ec0030ad1815af2831cb, 0xb9b40807616a9227838f3a3ed300cf, 0x003d4c ] } , - BigNum { limbs: [ 0x6742385645cc833663bf62cd3416c5, 0x25546b9ee920c8af2a8001fc010048, 0x000c86 ] } , - BigNum { limbs: [ 0x5661caa9b88f7bc99c409c32cbe93c, 0x81febdfe94276a8aad8807a5d7050b, 0x006767 ] } , - BigNum { limbs: [ 0xdbeb27b4f1ed5b54c2328a543f533c, 0x55c402a5abf4018ec3efdabca1f40e, 0x0040e4 ] } , - BigNum { limbs: [ 0xe1b8db4b0c6ea3ab3dcd74abc0acc5, 0x518f26f7d15431ab14182ee5361144, 0x003309 ] } , - BigNum { limbs: [ 0xce790549f609fbe3c0cb56782c3c20, 0xdc1e22b772c643008b7465767c9269, 0x006da0 ] } , - BigNum { limbs: [ 0xef2afdb60852031c3f34a887d3c3e1, 0xcb3506e60a81f0394c93a42b5b72e9, 0x00064c ] } , - BigNum { limbs: [ 0x30c88c5bd7e5324e7832b3aecf9672, 0x6577edca0ac752c221798af662989b, 0x000a94 ] } , - BigNum { limbs: [ 0x8cdb76a42676ccb187cd4b5130698f, 0x41db3bd37280e077b68e7eab756cb8, 0x006959 ] } , - BigNum { limbs: [ 0x059822e7d4b19094b1e227591be522, 0x39714ea4ece87942ccf7b13be45384, 0x002769 ] } , - BigNum { limbs: [ 0xb80be01829aa6e6b4e1dd7a6e41adf, 0x6de1daf8905fb9f70b105865f3b1cf, 0x004c84 ] } , - BigNum { limbs: [ 0xf2d09fcf74e76420b19c2ee509f657, 0x9b6ec98cd695a36ba9772cbf4d979f, 0x0036af ] } , - BigNum { limbs: [ 0xcad3633089749adf4e63d01af609aa, 0x0be46010a6b28fce2e90dce28a6db3, 0x003d3e ] } , - BigNum { limbs: [ 0x7dbe95ea0cbc252c5770679627a97f, 0x04f09abf773987aaaab008f919ca44, 0x00116c ] } , - BigNum { limbs: [ 0x3fe56d15f19fd9d3a88f9769d85682, 0xa2628ede060eab8f2d5800a8be3b0f, 0x006281 ] } , - BigNum { limbs: [ 0x89ec85d2983ba229bc9875532a7597, 0x990197530953ac7302f242c61aae7b, 0x000dd0 ] } , - BigNum { limbs: [ 0x33b77d2d66205cd6436789acd58a6a, 0x0e51924a73f486c6d515c6dbbd56d8, 0x00661d ] } , - BigNum { limbs: [ 0x01ced787cf278151fbf767f4b554e7, 0x3fc67f0c11ff40a392bdb1e33dc781, 0x006e99 ] } , - BigNum { limbs: [ 0xbbd52b782f347dae0408970b4aab1a, 0x678caa916b48f296454a57be9a3dd2, 0x000554 ] } , - BigNum { limbs: [ 0x3dc385727c108e594fa0e65cc3cd50, 0x673a84a1d3b13023e031e604da0995, 0x002544 ] } , - BigNum { limbs: [ 0x7fe07d8d824b70a6b05f18a33c32b1, 0x4018a4fba9970315f7d6239cfdfbbe, 0x004ea9 ] } , - BigNum { limbs: [ 0x6ce4b54501596cf2781be8bda5e0a6, 0x639aa68bf9fec36fd92c67d7c08684, 0x0027a6 ] } , - BigNum { limbs: [ 0x50bf4dbafd02920d87e416425a1f5b, 0x43b8831183496fc9fedba1ca177ecf, 0x004c47 ] } , - BigNum { limbs: [ 0x21118adbe582580972ed9f7ecbb2d3, 0x6c6f11cc76a3be0f6070d801b9f139, 0x006e49 ] } , - BigNum { limbs: [ 0x9c92782418d9a6f68d125f81344d2e, 0x3ae417d106a4752a779731a01e141a, 0x0005a4 ] } , - BigNum { limbs: [ 0x144d82672248d583ec65f5c105ee71, 0x87cdf0c1f63094287cd50c6cde22fc, 0x002f06 ] } , - BigNum { limbs: [ 0xa9568098dc13297c139a093efa1190, 0x1f8538db87179f115b32fd34f9e257, 0x0044e7 ] } , - BigNum { limbs: [ 0xe24a606a0fba04276e0830b73cc727, 0x9b918ea9251565fb701bc24d7e2b2a, 0x005997 ] } , - BigNum { limbs: [ 0xdb59a295eea1fad891f7ce48c338da, 0x0bc19af45832cd3e67ec475459da28, 0x001a56 ] } , - BigNum { limbs: [ 0x40dbec56ee09e2708088fdd2629b2f, 0xa9fb9fdc9c0182b7ee3870e5d92b7d, 0x002bb2 ] } , - BigNum { limbs: [ 0x7cc816a910521c8f7f77012d9d64d2, 0xfd5789c0e146b081e9cf98bbfed9d6, 0x00483a ] } , - BigNum { limbs: [ 0xfa4d44c2ef59645bf62610ffa7adee, 0xf60be477e51ef481c73fef2f82c89b, 0x004e39 ] } , - BigNum { limbs: [ 0xc356be3d0f029aa409d9ee00585213, 0xb147452598293eb810c81a72553cb7, 0x0025b3 ] } , - BigNum { limbs: [ 0x0532f9855f4f8fac0e8bd216764a5f, 0xc9d0a8ad81e50c626caf505e88968e, 0x000b7d ] } , - BigNum { limbs: [ 0xb871097a9f0c6f53f1742ce989b5a2, 0xdd8280effb6326d76b58b9434f6ec5, 0x00686f ] } , - BigNum { limbs: [ 0xa39164ec7f5bc53d0345da045598c1, 0xf7be0fd2fc71a5d21b9f7d77b605ab, 0x002d02 ] } , - BigNum { limbs: [ 0x1a129e137f0039c2fcba24fbaa6740, 0xaf9519ca80d68d67bc688c2a21ffa8, 0x0046ea ] } , - BigNum { limbs: [ 0xb626254a88418bb1d5fe80b00497cb, 0xc56e390ec55c151603d47dffda4920, 0x006a52 ] } , - BigNum { limbs: [ 0x077dddb5761a734e2a017e4ffb6836, 0xe1e4f08eb7ec1e23d4338ba1fdbc33, 0x00099a ] } , - BigNum { limbs: [ 0xfd94cab1a77ca44f6750a9c17a7225, 0x302cefbc8a6775409b257d8f2686b8, 0x0036a0 ] } , - BigNum { limbs: [ 0xc00f384e56df5ab098af553e858ddc, 0x772639e0f2e0bdf93ce28c12b17e9a, 0x003d4d ] } , - BigNum { limbs: [ 0x01d6fea8a72d5a4590fb84c6e1f834, 0xcbb9c03d291f51375434d9889b7931, 0x00516f ] } , - BigNum { limbs: [ 0xbbcd0457572ea4ba6f047a391e07cd, 0xdb9969605428e20283d330193c8c22, 0x00227d ] } , - BigNum { limbs: [ 0x802b5bea2afd97a0a9f89ef141717c, 0x6196529a00b086ddebab03555cd5b2, 0x000b2d ] } , - BigNum { limbs: [ 0x3d78a715d35e675f5607600ebe8e85, 0x45bcd7037c97ac5bec5d064c7b2fa1, 0x0068c0 ] } , - BigNum { limbs: [ 0x6b4e0984cefc74c554c63af2afb1ba, 0x6e2164b4da11d8983b9ed9cd573654, 0x005104 ] } , - BigNum { limbs: [ 0x5255f97b2f5f8a3aab39c40d504e47, 0x3931c4e8a3365aa19c692fd480ceff, 0x0022e9 ] } , - BigNum { limbs: [ 0xd541777839ea7f8bd671afe094fa49, 0x20535364de01977ceb1990603fb3c9, 0x000664 ] } , - BigNum { limbs: [ 0xe8628b87c4717f74298e4f1f6b05b8, 0x86ffd6389f469bbcecee7941985189, 0x006d89 ] } , - BigNum { limbs: [ 0xf8f0251724c0e15a647e6dcb47ca88, 0x6817f7ffab8e8a6dd0b401644d8e74, 0x005f77 ] } , - BigNum { limbs: [ 0xc4b3dde8d99b1da59b819134b83579, 0x3f3b319dd1b9a8cc0754083d8a76de, 0x001476 ] } , - BigNum { limbs: [ 0x5f469035e99cc9a4d3bf8c4fcccf57, 0xaa996ac3db7772fff165c179333442, 0x002f21 ] } , - BigNum { limbs: [ 0x5e5d72ca14bf355b2c4072b03330aa, 0xfcb9bed9a1d0c039e6a24828a4d111, 0x0044cb ] } , - BigNum { limbs: [ 0x16ec9bf89cf3ce0358f775c9c2f7f1, 0x600912f445e7ad22e3a16bbb048aad, 0x0032ed ] } , - BigNum { limbs: [ 0xa6b76707616830fca70889363d0810, 0x474a16a937608616f4669de6d37aa6, 0x004100 ] } , - BigNum { limbs: [ 0xba571d0d5d7a9238e5a8d971a61dfc, 0x5d17bfcbfc033fc30d75fd7033e761, 0x0016a3 ] } , - BigNum { limbs: [ 0x034ce5f2a0e16cc71a57258e59e205, 0x4a3b69d18144f376ca920c31a41df2, 0x005d4a ] } , - BigNum { limbs: [ 0x7607fc49b1f9f0ab6ec59f5299b6c3, 0xbe665e5d5f048803dcf046b2d12354, 0x0024de ] } , - BigNum { limbs: [ 0x479c06b64c620e54913a5fad66493e, 0xe8eccb401e43ab35fb17c2ef06e1ff, 0x004f0e ] } , - BigNum { limbs: [ 0x3aa2ecd06359932070f57560611be8, 0x19bb44b32906d1e89751284bee59dd, 0x005947 ] } , - BigNum { limbs: [ 0x8301162f9b026bdf8f0a899f9ee419, 0x8d97e4ea5441615140b6e155e9ab76, 0x001aa6 ] } , - BigNum { limbs: [ 0x2193da7b724a2ed4f7fe00b2fc0b4e, 0xc9a644b9f6307d3d8aa18a0fb8fea0, 0x0062dc ] } , - BigNum { limbs: [ 0x9c1028848c11d02b0801fe4d03f4b3, 0xddace4e38717b5fc4d667f921f06b3, 0x001110 ] } , - BigNum { limbs: [ 0x8b1b0866c7e6384fff1402328d75f0, 0x73bf2b4e9e7fe2931ebed4802d27a6, 0x00080b ] } , - BigNum { limbs: [ 0x3288fa993675c6b000ebfccd728a11, 0x3393fe4edec850a6b9493521aaddad, 0x006be2 ] } , - BigNum { limbs: [ 0xa409ca98c13f86b9bb09182ef3249c, 0x4fef885548a0adffa477bc9a6960ba, 0x006def ] } , - BigNum { limbs: [ 0x199a38673d1c784644f6e6d10cdb65, 0x5763a14834a7853a33904d076ea499, 0x0005fe ] } , - BigNum { limbs: [ 0x6cca349415b0806502e850e3864c35, 0x3816a7c7228a09f4a5b7f4482c854a, 0x0035db ] } , - BigNum { limbs: [ 0x50d9ce6be8ab7e9afd17ae1c79b3cc, 0x6f3c81d65abe294532501559ab8009, 0x003e12 ] } , - BigNum { limbs: [ 0x9d1d609cf552644d76baf4d37387a5, 0x2eef89e1832e1970e162b522e73a1c, 0x00173f ] } , - BigNum { limbs: [ 0x2086a26309099ab289450a2c8c785c, 0x78639fbbfa1a19c8f6a5547ef0cb37, 0x005cae ] } , - BigNum { limbs: [ 0x4b3993ee00fee0be5d9e782f0826a7, 0x5f453c927323104cb49afc53121c94, 0x0018b4 ] } , - BigNum { limbs: [ 0x726a6f11fd5d1e41a26186d0f7d95a, 0x480ded0b0a2522ed236d0d4ec5e8bf, 0x005b39 ] } , - BigNum { limbs: [ 0x11052786cd325992d5cad82d3d1b97, 0x666295f0258c22bef1bc975729ef5a, 0x000bbc ] } , - BigNum { limbs: [ 0xac9edb793129a56d2a3526d2c2e46a, 0x40f093ad57bc107ae64b724aae15f9, 0x006831 ] } , - BigNum { limbs: [ 0x53262b159e08f6628e7ed94876759a, 0xade45d322bf487485f31a07f1a5f88, 0x0018b0 ] } , - BigNum { limbs: [ 0x6a7dd7ea6053089d718125b7898a67, 0xf96ecc6b5153abf178d66922bda5cb, 0x005b3c ] } , - BigNum { limbs: [ 0x1d5bba0219d6895408b020f663cda2, 0x2efb303338971cc3fcd0c1ce0073ac, 0x004058 ] } , - BigNum { limbs: [ 0xa04848fde48575abf74fde099c325f, 0x7857f96a44b11675db3747d3d791a7, 0x003395 ] } , - BigNum { limbs: [ 0x53f234cd300a031bd7d5251daacccd, 0x38b109dadbb26abefbbcd14355009d, 0x00181d ] } , - BigNum { limbs: [ 0x69b1ce32ce51fbe4282ad9e2553334, 0x6ea21fc2a195c87adc4b385e8304b6, 0x005bd0 ] } , - BigNum { limbs: [ 0x5e37ff0f0ce29a94f46ca0a3870da8, 0x7ed44dccff1d2e850e9f1de1c2dec3, 0x001a58 ] } , - BigNum { limbs: [ 0x5f6c03f0f179646b0b935e5c78f259, 0x287edbd07e2b04b4c968ebc0152690, 0x005995 ] } , - BigNum { limbs: [ 0x5ed133e6e72dbdd1a6bad2de8c3917, 0xeebd69853c99635f49d643a2d7ee1a, 0x001d96 ] } , - BigNum { limbs: [ 0x5ed2cf19172e412e59452c2173c6ea, 0xb895c01840aecfda8e31c5ff001739, 0x005656 ] } , - BigNum { limbs: [ 0x1fd8836d13f16372bbb5a3113c5552, 0x9f6d22e092377163b1cccd2866cc54, 0x000ea0 ] } , - BigNum { limbs: [ 0x9dcb7f92ea6a9b8d444a5beec3aaaf, 0x07e606bceb10c1d6263b3c797138ff, 0x00654d ] } , - BigNum { limbs: [ 0x03f0628b5ffb33789736068a49c981, 0x7e39a7bbd6485a16e8c7f8a475d50d, 0x00394f ] } , - BigNum { limbs: [ 0xb9b3a0749e60cb8768c9f875b63680, 0x291981e1a6ffd922ef4010fd623046, 0x003a9e ] } , - BigNum { limbs: [ 0xcb8cd738b7236cba69d6489456ff43, 0xbc2a388c4f23853232901c46fc6d1f, 0x00352a ] } , - BigNum { limbs: [ 0xf2172bc7473892459629b66ba900be, 0xeb28f1112e24ae07a577ed5adb9833, 0x003ec2 ] } , - BigNum { limbs: [ 0x5130a061491b14c06aab54a53aee18, 0xed10a657d19d6fed60d6e5f5149987, 0x002962 ] } , - BigNum { limbs: [ 0x6c73629eb540ea3f9554aa5ac511e9, 0xba428345abaac34c773123acc36bcc, 0x004a8a ] } , - BigNum { limbs: [ 0xeaf16376953f8b97928bae3cc2a5ce, 0x118cadfeda5891c73dbe74f5a56a06, 0x001c38 ] } , - BigNum { limbs: [ 0xd2b29f89691c73686d7450c33d5a33, 0x95c67b9ea2efa1729a4994ac329b4c, 0x0057b5 ] } , - BigNum { limbs: [ 0xb003a39d5c3ba4fc789b57b9af2f3c, 0x8104510684c19ad30ca0397b870bdf, 0x005ac1 ] } , - BigNum { limbs: [ 0x0da05f62a2205a038764a74650d0c5, 0x264ed896f8869866cb67d02650f974, 0x00192c ] } , - BigNum { limbs: [ 0xb5b14a01e2c2a290ae3553e9f8bb28, 0x619b3a1686b7ebd44101019555917b, 0x0001a1 ] } , - BigNum { limbs: [ 0x07f2b8fe1b995c6f51caab160744d9, 0x45b7ef86f69047659707080c8273d8, 0x00724c ] } , - BigNum { limbs: [ 0xd6fad2860fdf3236cb1b78133eda41, 0x71f55b1ece11a3c3a06bdd7972c742, 0x0053bc ] } , - BigNum { limbs: [ 0xe6a93079ee7cccc934e486ecc125c0, 0x355dce7eaf368f76379c2c28653e10, 0x002031 ] } , - BigNum { limbs: [ 0xc6043f28bc9cdc9ade96929e86d685, 0x0c70678728262bd9d3ee45abc6aa67, 0x001031 ] } , - BigNum { limbs: [ 0xf79fc3d741bf226521696c6179297c, 0x9ae2c216552207600419c3f6115aeb, 0x0063bc ] } , - BigNum { limbs: [ 0xf8c5290042b9bea91a211125d8dbb6, 0x17cd2826f284778021f3e00d8af92e, 0x0052af ] } , - BigNum { limbs: [ 0xc4ded9ffbba24056e5deedda27244b, 0x8f8601768ac3bbb9b61429944d0c24, 0x00213e ] } , - BigNum { limbs: [ 0xc88b4e6d99405bb8529937b284359d, 0x56ee48526d3e00529bffc0ff7e3872, 0x002fe4 ] } , - BigNum { limbs: [ 0xf518b492651ba347ad66c74d7bca64, 0x5064e14b100a32e73c0848a259cce0, 0x004409 ] } , - BigNum { limbs: [ 0x8c4db3258a41208f488b7ba09d11c5, 0x8a6f105a5ab1ed324fc370e60c78e2, 0x005568 ] } , - BigNum { limbs: [ 0x31564fda741ade70b774835f62ee3c, 0x1ce4194322964607884498bbcb8c71, 0x001e85 ] } , - BigNum { limbs: [ 0xdfb76fcc99f3ef2e36ce4e08e77393, 0x78c04fcf27c6976a055907015d654c, 0x006f97 ] } , - BigNum { limbs: [ 0xddec933364680fd1c931b0f7188c6e, 0x2e92d9ce55819bcfd2af02a07aa006, 0x000456 ] } , - BigNum { limbs: [ 0x2794393b64c6ad671e1ac90f9997a1, 0x482e48023e59e541e8221283cd460f, 0x001f48 ] } , - BigNum { limbs: [ 0x960fc9c499955198e1e535f0666860, 0x5f24e19b3eee4df7efe5f71e0abf44, 0x0054a5 ] } , - BigNum { limbs: [ 0xa1ddc75e0d3056956918cce43fbdf1, 0x488b1115b853f4b262a0a3604e9005, 0x002e0e ] } , - BigNum { limbs: [ 0x1bc63ba1f12ba86a96e7321bc04210, 0x5ec81887c4f43e877567664189754e, 0x0045df ] } , - BigNum { limbs: [ 0x412254e276f261dda2ca369b882a76, 0x6744f107ef803dc19c3bdf25367a3b, 0x00315a ] } , - BigNum { limbs: [ 0x7c81ae1d87699d225d35c86477d58b, 0x400e38958dc7f5783bcc2a7ca18b18, 0x004293 ] } , - BigNum { limbs: [ 0x979234398086b31ae741d718f6c0b3, 0x100f74bca8dedad0529118858dd6db, 0x006203 ] } , - BigNum { limbs: [ 0x2611cec67dd54be518be27e7093f4e, 0x9743b4e0d46958698576f11c4a2e78, 0x0011ea ] } , - BigNum { limbs: [ 0xbb808de48c51f20d254e363b5e7602, 0xca9bc098278f20bec201c796f9dacd, 0x004923 ] } , - BigNum { limbs: [ 0x0223751b720a0cf2dab1c8c4a189ff, 0xdcb7690555b9127b1606420ade2a86, 0x002ac9 ] } , - BigNum { limbs: [ 0x17c6b083273c47689538090938d579, 0x463b2b65db138d2f903943d6bd7f6d, 0x0054d1 ] } , - BigNum { limbs: [ 0xa5dd527cd71fb7976ac7f5f6c72a88, 0x6117fe37a234a60a47cec5cb1a85e6, 0x001f1c ] } , - BigNum { limbs: [ 0x3291fd8ab7b8b642a8e3f963efbfed, 0xf13bb32a2dbe623d82b77b9a1c94bb, 0x000a50 ] } , - BigNum { limbs: [ 0x8b12057546a348bd571c059c104014, 0xb61776734f89d0fc55508e07bb7098, 0x00699c ] } , - BigNum { limbs: [ 0x1f1890248f3dd8ac02d6ead2c7e65f, 0xd359e6062c9dfa965d0ba0f0dd0a71, 0x001f4b ] } , - BigNum { limbs: [ 0x9e8b72db6f1e2653fd29142d3819a2, 0xd3f9439750aa38a37afc68b0fafae2, 0x0054a1 ] } , - BigNum { limbs: [ 0xe5e2608711fb77ff5641fc667e835d, 0x51fffd82c1989448ba090df1a9a6f0, 0x006c4d ] } , - BigNum { limbs: [ 0xd7c1a278ec608700a9be0299817ca4, 0x55532c1abbaf9ef11dfefbb02e5e62, 0x0007a0 ] } , - BigNum { limbs: [ 0x9dcebb41b2ef1c4d8a04d5be70b3a4, 0x64c7140ea7043aeb824eb4e3fd3964, 0x004377 ] } , - BigNum { limbs: [ 0x1fd547be4b6ce2b275fb29418f4c5d, 0x428c158ed643f84e55b954bddacbef, 0x003076 ] } , - BigNum { limbs: [ 0xf5392ff8fd8d87b5c472d0f0a69fe1, 0xed235608f4f047c36b65e92f931341, 0x0009ae ] } , - BigNum { limbs: [ 0xc86ad30700ce774a3b8d2e0f596020, 0xba2fd3948857eb766ca2207244f211, 0x006a3e ] } , - BigNum { limbs: [ 0x38528bcc8ea5ef235d35a226631c3e, 0xc67c761f23e094e69c75c169385c92, 0x0041a2 ] } , - BigNum { limbs: [ 0x855177336fb60fdca2ca5cd99ce3c3, 0xe0d6b37e59679e533b9248389fa8c1, 0x00324a ] } , - BigNum { limbs: [ 0x145c44951dae3498eed14fcb160943, 0x6fd4a9038301ece754238f49aeec55, 0x0058ca ] } , - BigNum { limbs: [ 0xa947be6ae0adca67112eaf34e9f6be, 0x377e8099fa46465283e47a582918fe, 0x001b23 ] } , - BigNum { limbs: [ 0xa02a3a8f443648361e8ea8ae06b126, 0xc10c0dfb6cca3d4067ca08e2b3a4ac, 0x00482e ] } , - BigNum { limbs: [ 0x1d79c870ba25b6c9e1715651f94edb, 0xe6471ba2107df5f9703e00bf2460a7, 0x002bbe ] } , - BigNum { limbs: [ 0xa5996b9f82e08911f56487df01e717, 0x45887ccfa095013d5570900a2cc0c0, 0x003fac ] } , - BigNum { limbs: [ 0x180a97607b7b75ee0a9b7720fe18ea, 0x61caaccddcb331fc82977997ab4493, 0x003441 ] } , - BigNum { limbs: [ 0x43572573c9fccdebea518f9b735b3d, 0x95bc1bbe7784ebcaf90db966da6949, 0x005c3f ] } , - BigNum { limbs: [ 0x7a4cdd8c345f311415ae6f648ca4c4, 0x11970ddf05c3476edefa503afd9c0a, 0x0017ae ] } , - BigNum { limbs: [ 0x9972cf91fe9ebf0cfdfcd1bbc2a72e, 0xccbe64c4fa6fca7c90fd2d1917187b, 0x004d2a ] } , - BigNum { limbs: [ 0x2431336dffbd3ff302032d443d58d3, 0xda94c4d882d868bd470adc88c0ecd8, 0x0026c2 ] } , - BigNum { limbs: [ 0x32307b85cb65d3201698dd593284c3, 0xa5219841a0022f57ba9019925bf0a5, 0x002492 ] } , - BigNum { limbs: [ 0x8b73877a32f62bdfe96721a6cd7b3e, 0x0231915bdd4603e21d77f00f7c14ae, 0x004f5b ] } , - BigNum { limbs: [ 0xd83d1ec03ea851355b9de44b95b2d1, 0xc28c767944d14367669032d38157cb, 0x001bb2 ] } , - BigNum { limbs: [ 0xe566e43fbfb3adcaa4621ab46a4d30, 0xe4c6b3243876efd27177d6ce56ad87, 0x00583a ] } , - BigNum { limbs: [ 0x3f8025bfea2f9f6bdd2d3bbefeedb5, 0x0bcb96a72c189fea5ede6d51c3d916, 0x004f03 ] } , - BigNum { limbs: [ 0x7e23dd40142c5f9422d2c34101124c, 0x9b8792f6512f934f79299c50142c3d, 0x0024ea ] } , - BigNum { limbs: [ 0xd107fef95dccd8a331d3ceccc4e782, 0x3aae4071ac9a9ec9ebafe2d5d493b5, 0x0071e7 ] } , - BigNum { limbs: [ 0xec9c0406a08f265cce2c30333b187f, 0x6ca4e92bd0ad946fec5826cc03719d, 0x000206 ] } , - BigNum { limbs: [ 0x3e6fb94740c896941525459bfa51c7, 0x8c9d09da7bec3df8adc3ca1380140b, 0x003a88 ] } , - BigNum { limbs: [ 0x7f3449b8bd93686beadab96405ae3a, 0x1ab61fc3015bf5412a443f8e57f148, 0x003965 ] } , - BigNum { limbs: [ 0xe3de91cc18ee042c15d7f2a087d0d6, 0xbc7d81cc3c664f39e6433c4529f2d7, 0x004f2a ] } , - BigNum { limbs: [ 0xd9c57133e56dfad3ea280c5f782f2b, 0xead5a7d140e1e3fff1c4cd5cae127b, 0x0024c2 ] } , - BigNum { limbs: [ 0x15a837273c8d7808ae9877710b3d4a, 0x95cdc32a7090a6eadb2faabb9eacca, 0x0002dd ] } , - BigNum { limbs: [ 0xa7fbcbd8c1ce86f75167878ef4c2b7, 0x118566730cb78c4efcd85ee6395889, 0x007110 ] } , - BigNum { limbs: [ 0x9da748c3eb9fd36116f4c1ee3d22e0, 0x97243165f72c550d62b60fc1e6710e, 0x006d36 ] } , - BigNum { limbs: [ 0x1ffcba3c12bc2b9ee90b3d11c2dd21, 0x102ef837861bde2c7551f9dff19445, 0x0006b7 ] } , - BigNum { limbs: [ 0xed8c1fe30d90f611070cf87b316fdb, 0x1a16a817a5730a109bdab4d5a019ad, 0x00224f ] } , - BigNum { limbs: [ 0xd017e31cf0cb08eef8f30684ce9026, 0x8d3c8185d7d529293c2d54cc37eba5, 0x00519e ] } , - BigNum { limbs: [ 0x430b9d9a3bb62d3641d7d4eea0c50c, 0x0bd6a3b0dd4962c44176116ccc35dc, 0x0045ef ] } , - BigNum { limbs: [ 0x7a986565c2a5d1c9be282a115f3af5, 0x9b7c85ec9ffed0759691f8350bcf77, 0x002dfe ] } , - BigNum { limbs: [ 0x13c088c385b50ec3a1732e853d869a, 0xffd7355557b16f2b69601d8be620e3, 0x000a95 ] } , - BigNum { limbs: [ 0xa9e37a3c78a6f03c5e8cd07ac27967, 0xa77bf4482596c40e6ea7ec15f1e470, 0x006957 ] } , - BigNum { limbs: [ 0xe386e6d514fc902b94387bd69765b3, 0xd3543c2bd157abf240c4a6ca3e804e, 0x001497 ] } , - BigNum { limbs: [ 0xda1d1c2ae95f6ed46bc78329689a4e, 0xd3feed71abf08747974362d7998504, 0x005f55 ] } , - BigNum { limbs: [ 0xe124d1731ad29dd65983a63ee50d91, 0x739ffc076d28e27be6d8f7e7ac615c, 0x002fe6 ] } , - BigNum { limbs: [ 0xdc7f318ce3896129a67c58c11af270, 0x33b32d96101f50bdf12f11ba2ba3f6, 0x004407 ] } , - BigNum { limbs: [ 0x962747c183e480114ff72774fe6bcd, 0xab54a9e32de069ac3dbc658030baf5, 0x000b5a ] } , - BigNum { limbs: [ 0x277cbb3e7a777eeeb008d78b019434, 0xfbfe7fba4f67c98d9a4ba421a74a5e, 0x006892 ] } , - BigNum { limbs: [ 0x9d0a87e020f541ac13e711a9f1a3f5, 0x32af41b8cee217553faf392299de16, 0x00680e ] } , - BigNum { limbs: [ 0x20997b1fdd66bd53ec18ed560e5c0c, 0x74a3e7e4ae661be49858d07f3e273d, 0x000bdf ] } , - BigNum { limbs: [ 0xd61154e4ce2cff2f4f0de0a22e721b, 0x89c629a53b58a6c167d21637d0defc, 0x00221c ] } , - BigNum { limbs: [ 0xe792ae1b302effd0b0f21e5dd18de6, 0x1d8cfff841ef8c787035f36a072656, 0x0051d1 ] } , - BigNum { limbs: [ 0xa3a236d6ff5ded09bc416a14308d8f, 0x6d20a2a34c82e7f9eee2a9990ee000, 0x002ad1 ] } , - BigNum { limbs: [ 0x1a01cc28fefe11f643be94ebcf7272, 0x3a3286fa30c54b3fe9256008c92553, 0x00491c ] } , - BigNum { limbs: [ 0x7dc51868375de59b8f8d7ad621af1f, 0x9d3eb4aae9101bf5980d8fb415c4f9, 0x003511 ] } , - BigNum { limbs: [ 0x3fdeea97c6fe196470728429de50e2, 0x0a1474f2943817443ffa79edc2405a, 0x003edc ] } , - BigNum { limbs: [ 0xd2fe056e12d128f968ad7099b97076, 0xb21084d26ef18a1152b98a5b16fdd9, 0x003c22 ] } , - BigNum { limbs: [ 0xeaa5fd91eb8ad60697528e66468f8b, 0xf542a4cb0e56a928854e7f46c10779, 0x0037ca ] } , - BigNum { limbs: [ 0xaa11b314df6f5e0efba42a693de65d, 0x8b7661f61aa0915703b6d3f45be85c, 0x0070ea ] } , - BigNum { limbs: [ 0x13924feb1eeca0f1045bd496c219a4, 0x1bdcc7a762a7a1e2d45135ad7c1cf7, 0x000303 ] } , - BigNum { limbs: [ 0x6ff9b86622a64ec04533a09238ecea, 0x189e7e6f84f5f23c04e4e3829054e6, 0x00482e ] } , - BigNum { limbs: [ 0x4daa4a99dbb5b03fbacc5e6dc71317, 0x8eb4ab2df85240fdd323261f47b06d, 0x002bbf ] } , - BigNum { limbs: [ 0x52b15f20a914999b354046f332069c, 0xfe97cbd7990a988f82e9ccef42142e, 0x0007f1 ] } , - BigNum { limbs: [ 0x6af2a3df55476564cabfb80ccdf965, 0xa8bb5dc5e43d9aaa551e3cb295f125, 0x006bfb ] } , - BigNum { limbs: [ 0x65d863abed8e4dc1b68d3f990b7d3b, 0x9d46b0cb885ea6f40321eb76dd1270, 0x000eb9 ] } , - BigNum { limbs: [ 0x57cb9f5410cdb13e4972bf66f482c6, 0x0a0c78d1f4e98c45d4e61e2afaf2e3, 0x006534 ] } , - BigNum { limbs: [ 0x75c4884c21a9831bb130c38730526a, 0x49a8ad01eb6dcb5747ca54efa581fd, 0x006739 ] } , - BigNum { limbs: [ 0x47df7ab3dcb27be44ecf3b78cfad97, 0x5daa7c9b91da67e2903db4b2328356, 0x000cb4 ] } , - BigNum { limbs: [ 0x8a4f6d4c1ada58e7fc4a5cc7f2f2d1, 0xcafbc2707cb125e66be24431f05f44, 0x00521b ] } , - BigNum { limbs: [ 0x335495b3e381a61803b5a2380d0d30, 0xdc57672d00970d536c25c56fe7a60f, 0x0021d1 ] } , - BigNum { limbs: [ 0x078a7b97ec66cb9826953a213d583c, 0x86f6cffe4ca2b740471bc3e68d79ea, 0x0034fc ] } , - BigNum { limbs: [ 0xb619876811f53367d96ac4dec2a7c5, 0x205c599f30a57bf990ec45bb4a8b69, 0x003ef1 ] } , - BigNum { limbs: [ 0x7bc126c341b17ce26b0d732d3987cc, 0x87e27aea917b0836b22d3975a12725, 0x005f34 ] } , - BigNum { limbs: [ 0x41e2dc3cbcaa821d94f28bd2c67835, 0x1f70aeb2ebcd2b0325dad02c36de2e, 0x0014b9 ] } , - BigNum { limbs: [ 0x72a73fa70deb9998674a8201ccde57, 0xb0b796f20d83de527d49e939938236, 0x005d98 ] } , - BigNum { limbs: [ 0x4afcc358f070656798b57cfe3321aa, 0xf69b92ab6fc454e75abe206844831d, 0x001654 ] } , - BigNum { limbs: [ 0x075d2d564fde1a04d829b1de6dbacd, 0x7d56c69e9b58fc0912c19f3dd3ad55, 0x0037da ] } , - BigNum { limbs: [ 0xb646d5a9ae7de4fb27d64d21924534, 0x29fc62fee1ef3730c5466a640457fe, 0x003c13 ] } , - BigNum { limbs: [ 0x33cbe11e505548c3c2a6f22bd08bd3, 0x43a59e5aa608e0f662860d70233a18, 0x002e22 ] } , - BigNum { limbs: [ 0x89d821e1ae06b63c3d590cd42f742e, 0x63ad8b42d73f52437581fc31b4cb3b, 0x0045cb ] } , - BigNum { limbs: [ 0xe5dd3d2181bf89676bd0ffef6cabc2, 0x5ff8dbb07cb90da58bce5909401f4e, 0x0005c4 ] } , - BigNum { limbs: [ 0xd7c6c5de7c9c7598942eff1093543f, 0x475a4ded008f25944c39b09897e604, 0x006e29 ] } , - BigNum { limbs: [ 0x114bdf41b1c3df750ff68d57b6c10f, 0x8a1cec524e32b2df3cb71d94aa818d, 0x004278 ] } , - BigNum { limbs: [ 0xac5823be4c981f8af00971a8493ef2, 0x1d363d4b2f15805a9b50ec0d2d83c6, 0x003175 ] } , - BigNum { limbs: [ 0x1e43458668425774dca1c772360585, 0x2569e0ef21823529bc7bb192bce311, 0x000c3d ] } , - BigNum { limbs: [ 0x9f60bd799619a78b235e378dc9fa7c, 0x81e948ae5bc5fe101b8c580f1b2242, 0x0067b0 ] } , - BigNum { limbs: [ 0xcf1f7011c0b9cf0c1c1e68d08a5949, 0x497b2a2e23ae5f67b0d137737a844b, 0x00001a ] } , - BigNum { limbs: [ 0xee8492ee3da22ff3e3e1962f75a6b8, 0x5dd7ff6f5999d3d22736d22e5d8107, 0x0073d3 ] } , - BigNum { limbs: [ 0xeedcc20126d7f09245265cc18d07e5, 0xedad53fed6f4d40a09e788275f2d8f, 0x002c67 ] } , - BigNum { limbs: [ 0xcec740fed7840e6dbad9a23e72f81c, 0xb9a5d59ea6535f2fce20817a78d7c3, 0x004785 ] } , - BigNum { limbs: [ 0xb7093b9e98f6d9e7499381717b4806, 0x3f2ef2202935a8d50b5eb8317e35e8, 0x003ffc ] } , - BigNum { limbs: [ 0x069ac76165652518b66c7d8e84b7fb, 0x6824377d54128a64cca9517059cf6b, 0x0033f1 ] } , - BigNum { limbs: [ 0xaed66bb0d420ae910126f599901dda, 0x2da36b64e15499910cf7fdf89f1469, 0x001541 ] } , - BigNum { limbs: [ 0x0ecd974f2a3b506efed909666fe227, 0x79afbe389bf399a8cb100ba938f0ea, 0x005eac ] } , - BigNum { limbs: [ 0xbc9dd11fe19f5fa8d347b20d3a45f8, 0x2137c5523a84bd8f820f78380057c0, 0x001894 ] } , - BigNum { limbs: [ 0x010631e01cbc9f572cb84cf2c5ba09, 0x861b644b42c375aa55f89169d7ad93, 0x005b59 ] } , - BigNum { limbs: [ 0xba39145bcdbba78ac12835b04f1148, 0x65379305265a848c32bbb50a2d3284, 0x004949 ] } , - BigNum { limbs: [ 0x036aeea430a057753ed7c94fb0eeb9, 0x421b969856edaeada54c5497aad2cf, 0x002aa4 ] } , - BigNum { limbs: [ 0x95b22268ee4b2985c37e9595dee022, 0xfe3416ff570f824b4d761e1639df88, 0x000dfb ] } , - BigNum { limbs: [ 0x27f1e0971010d57a3c81696a211fdf, 0xa91f129e2638b0ee8a91eb8b9e25cb, 0x0065f1 ] } , - BigNum { limbs: [ 0x06eddb367ab22c18cba752864f8b13, 0x805987aa81e48a37216e17279547b0, 0x000d3f ] } , - BigNum { limbs: [ 0xb6b627c983a9d2e73458ac79b074ee, 0x26f9a1f2fb63a902b699f27a42bda3, 0x0066ae ] } , - BigNum { limbs: [ 0x9a5e3de88156e4cc9afc55e1681a2a, 0xbf288c1aab244d3270a4a7a3a721ee, 0x004888 ] } , - BigNum { limbs: [ 0x2345c5177d051a336503a91e97e5d7, 0xe82a9d82d223e607676361fe30e365, 0x002b64 ] } , - BigNum { limbs: [ 0x07d379a9febdde1fb7f54e0265ce07, 0x3f8df309239dec0cf477a2bad1560a, 0x0017f8 ] } , - BigNum { limbs: [ 0xb5d08955ff9e20e0480ab0fd9a31fa, 0x67c5369459aa472ce39066e706af49, 0x005bf5 ] } , - BigNum { limbs: [ 0x9bfdee3322cefba92913a02e1ee754, 0x5a9880940a36deeacc6ea144da8591, 0x003cd8 ] } , - BigNum { limbs: [ 0x21a614ccdb8d0356d6ec5ed1e118ad, 0x4cbaa9097311544f0b99685cfd7fc2, 0x003715 ] } , - BigNum { limbs: [ 0x7d9f9cf1425f7dc910b69f60179974, 0xd4a655ec4bf92ebc4ba97b0d9a8a44, 0x005e60 ] } , - BigNum { limbs: [ 0x4004660ebbfc8136ef495f9fe8668d, 0xd2acd3b1314f047d8c5e8e943d7b0f, 0x00158c ] } , - BigNum { limbs: [ 0xce2749a3e7bddb90cbb6d92d8ca8f6, 0xba05a063fee29157720be9ef013a11, 0x003a16 ] } , - BigNum { limbs: [ 0xef7cb95c169e236f344925d273570b, 0xed4d89397e65a1e265fc1fb2d6cb41, 0x0039d6 ] } , - BigNum { limbs: [ 0xfdcb07de349fcdd55057b470cd3b3e, 0x34f45015013abc92a0384fb547d2e1, 0x000414 ] } , - BigNum { limbs: [ 0xbfd8fb21c9bc312aafa84a8f32c4c3, 0x725ed9887c0d76a737cfb9ec903271, 0x006fd9 ] } , - BigNum { limbs: [ 0x114ead526d0f6c9eb7af15de4af4ac, 0x1ec50ddabc5814388398313eb99e6b, 0x004bf1 ] } , - BigNum { limbs: [ 0xac5555ad914c92614850e921b50b55, 0x888e1bc2c0f01f01546fd8631e66e8, 0x0027fc ] } , - BigNum { limbs: [ 0x68a842739e0ff337d811ff60ab359e, 0xc976b9f0a9a40bb5ccb89f56980717, 0x007320 ] } , - BigNum { limbs: [ 0x54fbc08c604c0bc827edff9f54ca63, 0xdddc6facd3a427840b4f6a4b3ffe3c, 0x0000cc ] } , - BigNum { limbs: [ 0xc8ab8c2a2d43656b226bace742443f, 0xac1bbad652cfcba311b18a46c1f320, 0x00155d ] } , - BigNum { limbs: [ 0xf4f876d5d1189994dd945218bdbbc2, 0xfb376ec72a786796c6567f5b161232, 0x005e8f ] } , - BigNum { limbs: [ 0x89a7fd21c6a294a3f6d32151d20b37, 0x12e86d3610e95a25f8fca72a9ab596, 0x006bcb ] } , - BigNum { limbs: [ 0x33fc05de37b96a5c092cddae2df4ca, 0x946abc676c5ed913df0b62773d4fbd, 0x000822 ] } , - BigNum { limbs: [ 0x20234d525d4189f6f85b16482a7197, 0x6b41073677d0b816428ad1181b4606, 0x00188f ] } , - BigNum { limbs: [ 0x9d80b5ada11a750907a4e8b7d58e6a, 0x3c12226705777b23957d3889bcbf4d, 0x005b5e ] } , - BigNum { limbs: [ 0xdef08e9f8fe77d54634c953cad3108, 0x6ee4233b8ba040dbeaad947c194b39, 0x004327 ] } , - BigNum { limbs: [ 0xdeb374606e7481ab9cb369c352cef9, 0x386f0661f1a7f25ded5a7525beba19, 0x0030c6 ] } , - BigNum { limbs: [ 0x6289e19b477ee6691938fa1af85975, 0x0642e00678e059e18426bda8673157, 0x000083 ] } , - BigNum { limbs: [ 0x5b1a2164b6dd1896e6c704e507a68c, 0xa11049970467d95853e14bf970d3fc, 0x00736a ] } , - BigNum { limbs: [ 0x1ce04aa33cf9a2e7776243b37036c2, 0x52085568d9a0c03606c2c05e4fdb76, 0x004635 ] } , - BigNum { limbs: [ 0xa0c3b85cc1625c18889dbb4c8fc93f, 0x554ad434a3a77303d14549438829dd, 0x002db8 ] } , - BigNum { limbs: [ 0x7449c397155417e44c19c7837357d9, 0x6476568299bd844ed5fd5e07959511, 0x006080 ] } , - BigNum { limbs: [ 0x495a3f68e907e71bb3e6377c8ca828, 0x42dcd31ae38aaeeb020aab9a427042, 0x00136d ] } , - BigNum { limbs: [ 0xb9a75fc516517f37c4c85b461ed199, 0x64dead8a2259e177e3e6193883aabd, 0x005cf5 ] } , - BigNum { limbs: [ 0x03fca33ae80a7fc83b37a3b9e12e68, 0x42747c135aee51c1f421f069545a96, 0x0016f8 ] } , - BigNum { limbs: [ 0x8f8f9ae3653ba2c10454d0a75656ff, 0xcdcd00bd35dfdc0497061091ff6592, 0x004a77 ] } , - BigNum { limbs: [ 0x2e14681c99205c3efbab2e58a9a902, 0xd98628e0476857354101f90fd89fc1, 0x002975 ] } , - BigNum { limbs: [ 0x3221fd149285bcec3d3b9bfa8672aa, 0xdeaaf8838aea65f252a5ef29e7e550, 0x004a44 ] } , - BigNum { limbs: [ 0x8b8205eb6bd64213c2c46305798d57, 0xc8a83119f25dcd4785621a77f02003, 0x0029a8 ] } , - BigNum { limbs: [ 0x832a8ddbf216ca980ac50eadacd9de, 0x41a396c88646d98739228dab7885bd, 0x0011c2 ] } , - BigNum { limbs: [ 0x3a7975240c453467f53af052532623, 0x65af92d4f70159b29ee57bf65f7f96, 0x00622b ] } , - BigNum { limbs: [ 0x59c20216257919cfa08b067bb9f2a7, 0xade7d1cb81f4be59f9d8819237c63a, 0x005044 ] } , - BigNum { limbs: [ 0x63e200e9d8e2e5305f74f884460d5a, 0xf96b57d1fb5374dfde2f880fa03f19, 0x0023a8 ] } , - BigNum { limbs: [ 0xd6b05b5583bbd72a10a702aaa59abc, 0xe3b0bc10503cd0039b925d26760b4c, 0x0054ee ] } , - BigNum { limbs: [ 0xe6f3a7aa7aa027d5ef58fc555a6545, 0xc3a26d8d2d0b63363c75ac7b61fa06, 0x001efe ] } , - BigNum { limbs: [ 0x30df1d6d8c9fd9b98a1bb116534f78, 0x16f0fc8249b31002f8c65f40ff07cb, 0x0049d7 ] } , - BigNum { limbs: [ 0x8cc4e59271bc254675e44de9acb089, 0x90622d1b33952336df41aa60d8fd88, 0x002a16 ] } , - BigNum { limbs: [ 0x635a7e42ce28cc95ceb3a7c3f9f188, 0x644ac89c6c6ee30939aaa120a0eb0f, 0x004ece ] } , - BigNum { limbs: [ 0x5a4984bd3033326a314c573c060e79, 0x4308610110d950309e5d6881371a44, 0x00251f ] } , - BigNum { limbs: [ 0x5b42281bc799f0e519aa0539834b13, 0x8477f7f1f011372039d0730e94c564, 0x001ae0 ] } , - BigNum { limbs: [ 0x6261dae436c20e1ae655f9c67cb4ee, 0x22db31ab8d36fc199e379693433fef, 0x00590d ] } , - BigNum { limbs: [ 0x25c4877daa4e7fadf05c8931874788, 0xd4fb5470bb003b0bbfe46301320074, 0x006008 ] } , - BigNum { limbs: [ 0x97df7b82540d7f520fa375ce78b879, 0xd257d52cc247f82e1823a6a0a604df, 0x0013e4 ] } , - BigNum { limbs: [ 0x95c175f84df85ee22337d6a6b4d9fb, 0x8ed3222b9fc8ef1e7bab4f23cf3f49, 0x000573 ] } , - BigNum { limbs: [ 0x27e28d07b063a01ddcc828594b2606, 0x18800771dd7f441b5c5cba7e08c60a, 0x006e7a ] } , - BigNum { limbs: [ 0xab799725fe3e86e5e29d73edf9b572, 0xe8613b6571fbfab57fce98c8eae62b, 0x006683 ] } , - BigNum { limbs: [ 0x122a6bda001d781a1d628b12064a8f, 0xbef1ee380b4c3884583970d8ed1f28, 0x000d69 ] } , - BigNum { limbs: [ 0x7c9a2ad9232c0cfcfe995f8ce96836, 0xb76df721aa94ec2607bb4a7497beba, 0x001a53 ] } , - BigNum { limbs: [ 0x4109d826db2ff20301669f731697cb, 0xefe5327bd2b34713d04cbf2d404699, 0x005999 ] } , - BigNum { limbs: [ 0x96087b2d17a877030a01c3fba22e80, 0x877a9a4bc0fe44d7149486f1a2cec3, 0x0024d7 ] } , - BigNum { limbs: [ 0x279b87d2e6b387fcf5fe3b045dd181, 0x1fd88f51bc49ee62c37382b0353690, 0x004f16 ] } , - BigNum { limbs: [ 0x07d1539bec93a9c8ed49e38f0af025, 0xa85ab7c3a6e3a8b6a4e49982b9c2d1, 0x003632 ] } , - BigNum { limbs: [ 0xb5d2af6411c8553712b61b70f50fdc, 0xfef871d9d6648a833323701f1e4282, 0x003dba ] } , - BigNum { limbs: [ 0xa7dbf3fe81c15c5f962e22648fbd45, 0x022c8dab73e858993b5f0d2db61f5c, 0x005a0d ] } , - BigNum { limbs: [ 0x15c80f017c9aa2a069d1dc9b7042bc, 0xa5269bf2095fdaa09ca8fc7421e5f7, 0x0019e0 ] } , - BigNum { limbs: [ 0x5ac8ea014a76f8077360c673f98822, 0x6bb47ac1219097cab375c68c973a4b, 0x002068 ] } , - BigNum { limbs: [ 0x62db18feb3e506f88c9f388c0677df, 0x3b9eaedc5bb79b6f2492431540cb08, 0x005385 ] } , - BigNum { limbs: [ 0x584f7240cfa636bd45630811115166, 0xd50bde8c87fd94fb7b9c68842675f7, 0x00366d ] } , - BigNum { limbs: [ 0x655490bf2eb5c842ba9cf6eeeeae9b, 0xd2474b10f54a9e3e5c6ba11db18f5c, 0x003d7f ] } , - BigNum { limbs: [ 0xe1d1ad657619b928d6ae78b2705727, 0x93dd70dccdccbfbadb3219831a4bf6, 0x005437 ] } , - BigNum { limbs: [ 0xdbd2559a884245d72951864d8fa8da, 0x1375b8c0af7b737efcd5f01ebdb95c, 0x001fb6 ] } , - BigNum { limbs: [ 0x652abfd013e1adddd51226fc305a36, 0x5ecc3199d02a86122406bbb3dd183f, 0x0058d8 ] } , - BigNum { limbs: [ 0x5879432fea7a51222aedd803cfa5cb, 0x4886f803ad1dad27b4014dedfaed14, 0x001b15 ] } , - BigNum { limbs: [ 0xf406133d5bcaa5435a2f30de64b8f0, 0x353f2952ccaac9d6b49339924dd6c1, 0x005cb6 ] } , - BigNum { limbs: [ 0xc99defc2a29159bca5d0ce219b4711, 0x7214004ab09d69632374d00f8a2e91, 0x001737 ] } , - BigNum { limbs: [ 0x74a2472d9a3301c9f7d9956c33efa1, 0xb01655fa4c689900cf9da058fd7ff1, 0x0024b3 ] } , - BigNum { limbs: [ 0x4901bbd26428fd3608266993cc1060, 0xf73cd3a330df9a39086a6948da8562, 0x004f39 ] } , - BigNum { limbs: [ 0xb6269c66cd9ea74aea456e92403ed8, 0x43872bda1625e247909bd09f25d090, 0x004e02 ] } , - BigNum { limbs: [ 0x077d669930bd57b515ba906dbfc129, 0x63cbfdc3672250f2476c3902b234c3, 0x0025eb ] } , - BigNum { limbs: [ 0x5a0013f5f09b115a91acc63e34dd72, 0x59860918371f0f37ba376d671b8c6c, 0x003671 ] } , - BigNum { limbs: [ 0x63a3ef0a0dc0eda56e5338c1cb228f, 0x4dcd2085462924021dd09c3abc78e7, 0x003d7c ] } , - BigNum { limbs: [ 0xa5ac77f6c4fb7b12641cc0cf09d557, 0xf1027f92360b275ff16089e8022e89, 0x000083 ] } , - BigNum { limbs: [ 0x17f78b09396083ed9be33e30f62aaa, 0xb650aa0b473d0bd9e6a77fb9d5d6ca, 0x007369 ] } , - BigNum { limbs: [ 0x09f7a1f066ddcb5a2eedfa20412664, 0xec07e6ce5e0d9829ecc1055c9c50c8, 0x002d0d ] } , - BigNum { limbs: [ 0xb3ac610f977e33a5d11204dfbed99d, 0xbb4b42cf1f3a9b0feb4704453bb48b, 0x0046df ] } , - BigNum { limbs: [ 0x67f6a0a3e63ca99f9a43275fe3cf0f, 0x2f38ad7b4399aabfa1b7d99197e71d, 0x002492 ] } , - BigNum { limbs: [ 0x55ad625c181f556065bcd7a01c30f2, 0x781a7c2239ae887a36503010401e36, 0x004f5b ] } , - BigNum { limbs: [ 0x7bb64e7fe7ea4b78aacbac1829e88a, 0xd4b784d73e60cdf1026306ef8e1d62, 0x000623 ] } , - BigNum { limbs: [ 0x41edb4801671b387553452e7d61777, 0xd29ba4c63ee76548d5a502b249e7f1, 0x006dc9 ] } , - BigNum { limbs: [ 0xf9a997ed4aa4b03748f531630f279c, 0x7b3bd3bf0cda72ab9d67d68c0d8aef, 0x003889 ] } , - BigNum { limbs: [ 0xc3fa6b12b3b74ec8b70acd9cf0d865, 0x2c1755de706dc08e3aa03315ca7a63, 0x003b64 ] } , - BigNum { limbs: [ 0xce3b00be1eb868c317059dd88012e7, 0x5bb41e2b5e9673b0cf9669bfeb9c09, 0x00155d ] } , - BigNum { limbs: [ 0xef690241dfa3963ce8fa61277fed1a, 0x4b9f0b721eb1bf8908719fe1ec6949, 0x005e90 ] } , - BigNum { limbs: [ 0xd612399cd1fd5bf9319c49ec52b321, 0xc39882e88d1c2cb02a551099a84ef3, 0x0025b6 ] } , - BigNum { limbs: [ 0xe791c9632c5ea306ce63b513ad4ce0, 0xe3baa6b4f02c0689adb2f9082fb65f, 0x004e36 ] } , - BigNum { limbs: [ 0xb0c5c8e83264e0a09dd4dfaf26022f, 0x7a6158bba26d2f24766227892c1715, 0x0053eb ] } , - BigNum { limbs: [ 0x0cde3a17cbf71e5f622b1f50d9fdd2, 0x2cf1d0e1dadb041561a5e218abee3e, 0x002002 ] } , - BigNum { limbs: [ 0x6a25bf2718d0db8d07a435743bf1a7, 0xbcab553742f7fd698182e76a0e2c30, 0x004f6b ] } , - BigNum { limbs: [ 0x537e43d8e58b2372f85bc98bc40e5a, 0xeaa7d4663a5035d056852237c9d923, 0x002481 ] } , - BigNum { limbs: [ 0x75f111bb6910eaf442e76e4498fa1a, 0xa7d84eb54da1ddaa7c1f2496515ebd, 0x005ce5 ] } , - BigNum { limbs: [ 0x47b2f144954b140bbd1890bb6705e7, 0xff7adae82fa6558f5be8e50b86a696, 0x001707 ] } , - BigNum { limbs: [ 0xd7230d2501faab5ece55ee029cd201, 0x9406fabda4e4250a808af9ae504cad, 0x0013fa ] } , - BigNum { limbs: [ 0xe680f5dafc6153a131aa10fd632e00, 0x134c2edfd8640e2f577d0ff387b8a5, 0x005ff3 ] } , - BigNum { limbs: [ 0x6ad2e042aad2a71b34ffc9d3de0eee, 0x3bbcaf9ab4fca968ad8109348066b2, 0x004c15 ] } , - BigNum { limbs: [ 0x52d122bd538957e4cb00352c21f113, 0x6b967a02c84b89d12a87006d579ea1, 0x0027d8 ] } , - BigNum { limbs: [ 0x5d3a47398b9f28c039180b85a4d960, 0x945afd93f458b16fb2ba629de4ed9c, 0x0047a3 ] } , - BigNum { limbs: [ 0x6069bbc672bcd63fc6e7f37a5b26a1, 0x12f82c0988ef81ca254da703f317b7, 0x002c4a ] } , - BigNum { limbs: [ 0x689692eb7b25966053559a2c9ef52c, 0x9fdecf31f40bf5a1cb2d5615368f49, 0x0070f5 ] } , - BigNum { limbs: [ 0x550d70148336689facaa64d3610ad5, 0x07745a6b893c3d980cdab38ca1760a, 0x0002f8 ] } , - BigNum { limbs: [ 0xf39ff25e34baf49d3ef8f5d59aca9e, 0x1d9e09417b9afc4ecd345253d5e766, 0x004945 ] } , - BigNum { limbs: [ 0xca0410a1c9a10a62c107092a653563, 0x89b5205c01ad36eb0ad3b74e021dec, 0x002aa8 ] } , - BigNum { limbs: [ 0xb79c3943ac1fcd8bd220a010b2b157, 0x1e350be857b08979233122f597fc09, 0x005e90 ] } , - BigNum { limbs: [ 0x0607c9bc523c31742ddf5eef4d4eaa, 0x891e1db52597a9c0b4d6e6ac40094a, 0x00155d ] } , - BigNum { limbs: [ 0xe2c65bfd04bf58dca8b817dba3570e, 0x0eb6f8267379fbd7fb64711a3fa064, 0x000bf8 ] } , - BigNum { limbs: [ 0xdadda702f99ca6235747e7245ca8f3, 0x989c317709ce3761dca398879864ee, 0x0067f5 ] } , - BigNum { limbs: [ 0x96d8c9d06188845ddc8e88c84d5c67, 0x2ba716e37086ea162629ac9c880f86, 0x006b41 ] } , - BigNum { limbs: [ 0x26cb392f9cd37aa223717637b2a39a, 0x7bac12ba0cc14923b1de5d054ff5cd, 0x0008ac ] } , - BigNum { limbs: [ 0xf146c793cf473ede1a5241284ba49a, 0xfdfbe50f1c4ce4654e3ebec5e91f08, 0x002fb4 ] } , - BigNum { limbs: [ 0xcc5d3b6c2f14c021e5adbdd7b45b67, 0xa957448e60fb4ed489c94adbeee64a, 0x004438 ] } , - BigNum { limbs: [ 0x0061d8df8ef094de5ffe6221755cbf, 0x5955edf50e27e2e55483e50308938f, 0x005c61 ] } , - BigNum { limbs: [ 0xbd422a206f6b6a21a0019cde8aa342, 0x4dfd3ba86f2050548384249ecf71c4, 0x00178c ] } , - BigNum { limbs: [ 0xf1588f7d54fa38fbd323adf49ef38c, 0x7037c1b7cb64c9862b3109914410b1, 0x0030cf ] } , - BigNum { limbs: [ 0xcc4b7382a961c6042cdc510b610c75, 0x371b67e5b1e369b3acd7001093f4a1, 0x00431e ] } , - BigNum { limbs: [ 0x4dd20117088fbe5c501a4cf6b03ed9, 0xa8ec0db5c210c27b9feaec4c8daa13, 0x005b2d ] } , - BigNum { limbs: [ 0x6fd201e8f5cc40a3afe5b2094fc128, 0xfe671be7bb3770be381d1d554a5b40, 0x0018bf ] } , - BigNum { limbs: [ 0xcd7e27c7c354fbf3a6b645601f30e9, 0x7e18302ac1414cb500e92e068f3c57, 0x001ed9 ] } , - BigNum { limbs: [ 0xf025db383b07030c5949b99fe0cf18, 0x293af972bc06e684d71edb9b48c8fb, 0x005514 ] } , - BigNum { limbs: [ 0x884138fa5c39749e9af296f4759a6c, 0x0c75d9017e950e72cf85870542bcd2, 0x00345e ] } , - BigNum { limbs: [ 0x3562ca05a2228a61650d680b8a6595, 0x9add509bfeb324c70882829c954881, 0x003f8f ] } , - BigNum { limbs: [ 0x5267d1c55501107d09bae2f00261b6, 0x39cbc2fce90de30b74e346514dc7f6, 0x005605 ] } , - BigNum { limbs: [ 0x6b3c313aa95aee82f6451c0ffd9e4b, 0x6d8766a0943a502e6324c3508a3d5d, 0x001de8 ] } , - BigNum { limbs: [ 0x58571af014fb7c5e1bc554847de159, 0xb027976d188774d04895a5c048349a, 0x004725 ] } , - BigNum { limbs: [ 0x654ce80fe96082a1e43aaa7b821ea8, 0xf72b923064c0be698f7263e18fd0b9, 0x002cc7 ] } , - BigNum { limbs: [ 0x68f56a0dbafbccb765983579922754, 0xc281fdaa0ce70dd9b615c0da4778f8, 0x001577 ] } , - BigNum { limbs: [ 0x54ae98f2436032489a67c9866dd8ad, 0xe4d12bf37061256021f248c7908c5b, 0x005e75 ] } , - BigNum { limbs: [ 0x390c063b61515af4bd62c61cada647, 0x0db0bccb91d3f2ffc4c766cb3649ef, 0x003f78 ] } , - BigNum { limbs: [ 0x8497fcc49d0aa40b429d38e35259ba, 0x99a26cd1eb74403a1340a2d6a1bb64, 0x003475 ] } , - BigNum { limbs: [ 0x81bd34f2699504d50c4e98120cdefd, 0xc9cc335251efe65d6b3c179cef6bd1, 0x003b80 ] } , - BigNum { limbs: [ 0x3be6ce0d94c6fa2af3b166edf32104, 0xdd86f64b2b584cdc6ccbf204e89982, 0x00386c ] } , - BigNum { limbs: [ 0xbf80faba84c8baabe2d2dc178be06c, 0xef347d1311b4421bf5e873a415ff19, 0x005a49 ] } , - BigNum { limbs: [ 0xfe230845799344541d2d22e8741f95, 0xb81eac8a6b93f11de21f95fdc20639, 0x0019a3 ] } , - BigNum { limbs: [ 0xbf169edf84aae71d467bea820605f5, 0x52f2fa1b856d55858eae83d3485a96, 0x004d63 ] } , - BigNum { limbs: [ 0xfe8d642079b117e2b984147df9fa0c, 0x54602f81f7daddb4495985ce8faabc, 0x00268a ] } , - BigNum { limbs: [ 0x1193fea88d9b73739f00822e34bb4a, 0x52c66a80b4b7d9d2886b1f6c306d07, 0x004f98 ] } , - BigNum { limbs: [ 0xac10045770c08b8c60ff7cd1cb44b7, 0x548cbf1cc89059674f9cea35a7984c, 0x002455 ] } , - BigNum { limbs: [ 0x872121227052105e4099f61a0fdfa0, 0x5dec50398d08443b87e30d1a49e37e, 0x00039b ] } , - BigNum { limbs: [ 0x3682e1dd8e09eea1bf6608e5f02061, 0x4966d963f03feefe5024fc878e21d5, 0x007052 ] } , - BigNum { limbs: [ 0x8f9ed648b5863e3fb520bbb4b1f602, 0xb4974317a16598980d416fff7671c6, 0x005262 ] } , - BigNum { limbs: [ 0x2e052cb748d5c0c04adf434b4e09ff, 0xf2bbe685dbe29aa1cac699a261938d, 0x00218a ] } , - BigNum { limbs: [ 0x507b618a0393d78c417c33ffdeca80, 0xa1b183c913bad44ff7774d083e02f2, 0x004cdd ] } , - BigNum { limbs: [ 0x6d28a175fac82773be83cb00213581, 0x05a1a5d4698d5ee9e090bc999a0261, 0x002710 ] } , - BigNum { limbs: [ 0xf68931f0e1a6802c786836995d2cdd, 0x4d135b59eaa27cd5bb18e2c41ce742, 0x001fb3 ] } , - BigNum { limbs: [ 0xc71ad10f1cb57ed38797c866a2d324, 0x5a3fce4392a5b6641cef26ddbb1e10, 0x00543a ] } , - BigNum { limbs: [ 0x82958410dbd8601ba80c56cca4836c, 0x2992a46c85584f96b2f249b8d371f3, 0x0069af ] } , - BigNum { limbs: [ 0x3b0e7eef22839ee457f3a8335b7c95, 0x7dc08530f7efe3a32515bfe9049360, 0x000a3e ] } , - BigNum { limbs: [ 0xbc96f152857581148241dca8af9765, 0xe58499b8083582a2eec09391da9381, 0x005f74 ] } , - BigNum { limbs: [ 0x010d11ad78e67deb7dbe225750689c, 0xc1ce8fe57512b096e947760ffd71d2, 0x001478 ] } , - BigNum { limbs: [ 0xb028c2fb9c7f475961cac72b144310, 0xaeec0c5d2514cfc5fb2c96fc930c8c, 0x006941 ] } , - BigNum { limbs: [ 0x0d7b400461dcb7a69e3537d4ebbcf1, 0xf8671d4058336373dcdb72a544f8c7, 0x000aab ] } , - BigNum { limbs: [ 0x00ee8af06f8295cd4e7f66999a9d5d, 0xe9e136da92e82601031434b768b0b4, 0x003196 ] } , - BigNum { limbs: [ 0xbcb5780f8ed96932b18098666562a4, 0xbd71f2c2ea600d38d4f3d4ea6f549f, 0x004256 ] } , - BigNum { limbs: [ 0x84d28eab79ecc6be0b628a8caa8f17, 0x90f36c44b79fbddc1274822e776645, 0x007000 ] } , - BigNum { limbs: [ 0x38d17454846f3841f49d74735570ea, 0x165fbd58c5a8755dc5938773609f0e, 0x0003ed ] } , - BigNum { limbs: [ 0xc0eaec39d77b1543d609e7c548f49c, 0x6a4bef01277a5adb35e4ada38abd4e, 0x001892 ] } , - BigNum { limbs: [ 0xfcb916c626e0e9bc29f6173ab70b65, 0x3d073a9c55cdd85ea2235bfe4d4804, 0x005b5b ] } , - BigNum { limbs: [ 0xfa2868e203acbd6c8db30fd92b4d87, 0x0b2994a75f36d49ace76c23633120c, 0x00290a ] } , - BigNum { limbs: [ 0xc37b9a1dfaaf4193724cef26d4b27a, 0x9c2994f61e115e9f0991476ba4f346, 0x004ae3 ] } , - BigNum { limbs: [ 0x8629db93e208d53efe71a07d7bd9e3, 0xcf4867cedd66bddda42e03ff6e3c43, 0x001fef ] } , - BigNum { limbs: [ 0x377a276c1c5329c1018e5e8284261e, 0xd80ac1ce9fe1755c33da05a269c910, 0x0053fd ] } , - BigNum { limbs: [ 0x77c7de2400a37e39e9c4369a227407, 0x1707f8ce66d560149d58cdb2ea0e53, 0x0040ef ] } , - BigNum { limbs: [ 0x45dc24dbfdb880c6163bc865dd8bfa, 0x904b30cf1672d3253aaf3beeedf700, 0x0032fe ] } , - BigNum { limbs: [ 0x038de285af828ba4c94db292287758, 0x61483b9bfc1053f394179b89f4c3bd, 0x0058f6 ] } , - BigNum { limbs: [ 0xba16207a4ed9735b36b24c6dd788a9, 0x460aee018137df4643f06e17e34196, 0x001af7 ] } , - BigNum { limbs: [ 0x6d5251db59ceba5331484331b33c6c, 0x5da934aae20e330e175a52a4170eef, 0x000422 ] } , - BigNum { limbs: [ 0x5051b124a48d44acceb7bbce4cc395, 0x49a9f4f29b3a002bc0adb6fdc0f664, 0x006fcb ] } , - BigNum { limbs: [ 0xe0bd10cddb648736b42261c538f92f, 0x25f8242967a050dd051ee286b0f015, 0x006f98 ] } , - BigNum { limbs: [ 0xdce6f23222f777c94bdd9d3ac706d2, 0x815b057415a7e25cd2e9271b27153d, 0x000455 ] } , - BigNum { limbs: [ 0x576cc833e78378312250dd18803aea, 0xfdc18ad866ddad6ad778d8bf584693, 0x00633c ] } , - BigNum { limbs: [ 0x66373acc16d886ceddaf21e77fc517, 0xa9919ec5166a85cf008f30e27fbec0, 0x0010b0 ] } , - BigNum { limbs: [ 0xee460732127a7b191df927420054b8, 0x925f5a3508e397dbf67215eace13e3, 0x0066e4 ] } , - BigNum { limbs: [ 0xcf5dfbcdebe183e6e206d7bdffab49, 0x14f3cf6874649b5de195f3b709f16f, 0x000d09 ] } , - BigNum { limbs: [ 0x5b95d4fb4f1f478b29f850793eca34, 0x6fb8ced65c418b45fe191aff57c67b, 0x0053bb ] } , - BigNum { limbs: [ 0x620e2e04af3cb774d607ae86c135cd, 0x379a5ac72106a7f3d9eeeea2803ed8, 0x002032 ] } , - BigNum { limbs: [ 0xff1a7f48766b64c025e947fc51862a, 0xe32cb3c01c0cfeb0259c57826bdfc3, 0x001d12 ] } , - BigNum { limbs: [ 0xbe8983b787f09a3fda16b703ae79d7, 0xc42675dd613b3489b26bb21f6c258f, 0x0056da ] } , - BigNum { limbs: [ 0x6f1071ab3e1fa6f533d4a00ade90a0, 0x141eb30243d3588a4a9a1de181f035, 0x005540 ] } , - BigNum { limbs: [ 0x4e939154c03c580acc2b5ef5216f61, 0x9334769b3974daaf8d6debc056151e, 0x001ead ] } , - BigNum { limbs: [ 0x52721fdee87e6c6693e659a973980d, 0x540b388a4dfb14e1db399e9bdf01d3, 0x003d26 ] } , - BigNum { limbs: [ 0x6b31e32115dd92996c19a5568c67f4, 0x5347f1132f4d1e57fcce6b05f90380, 0x0036c7 ] } , - BigNum { limbs: [ 0xcae63648f3ed07f63435a3859a554f, 0xea4e31a6c8de5f5bd8f365861a6780, 0x003cfb ] } , - BigNum { limbs: [ 0xf2bdccb70a6ef709cbca5b7a65aab2, 0xbd04f7f6b469d3ddff14a41bbd9dd2, 0x0036f1 ] } , - BigNum { limbs: [ 0x56b2c7e548f3a2273238ea947f8dfd, 0x12e979c354cdf32736645b9577588a, 0x00241b ] } , - BigNum { limbs: [ 0x66f13b1ab5685cd8cdc7146b807204, 0x9469afda287a4012a1a3ae0c60acc9, 0x004fd2 ] } , - BigNum { limbs: [ 0x45504c949c86defc8d1abfab70731e, 0x1f84fec8e50405dbd67580fea06de5, 0x0038ea ] } , - BigNum { limbs: [ 0x7853b66b61d5200372e53f548f8ce3, 0x87ce2ad498442d5e019288a337976e, 0x003b03 ] } , - BigNum { limbs: [ 0x4ce40f50b8403e35ce3bdd58ac1061, 0x01152c187d9972a92b80782a5fd1f8, 0x001d38 ] } , - BigNum { limbs: [ 0x70bff3af461bc0ca31c421a753efa0, 0xa63dfd84ffaec090ac87917778335b, 0x0056b5 ] } , - BigNum { limbs: [ 0xf86cc4363627c3e1b35b2631dd61cb, 0x4a308f9944ca96dc7de6bc9d4f1463, 0x002e8f ] } , - BigNum { limbs: [ 0xc5373ec9c8343b1e4ca4d8ce229e36, 0x5d229a04387d9c5d5a214d0488f0ef, 0x00455e ] } , - BigNum { limbs: [ 0x5fd614efd2205680d0b70b14a2772e, 0x0027318cdd69f2df7bbe0bd155bfd3, 0x00600f ] } , - BigNum { limbs: [ 0x5dcdee102c3ba87f2f48f3eb5d88d3, 0xa72bf8109fde405a5c49fdd0824580, 0x0013de ] } , - BigNum { limbs: [ 0xeb21a28c003fc16abeebd0b41405ce, 0x1bb8717e4be60c00dc90fe325a5455, 0x0010cc ] } , - BigNum { limbs: [ 0xd2826073fe1c3d9541142e4bebfa33, 0x8b9ab81f31622738fb770b6f7db0fd, 0x006321 ] } , - BigNum { limbs: [ 0x974e5e0d574aab43e9bdb5370951b5, 0xb9b3ad9246e1d77825ea593b657667, 0x0050e2 ] } , - BigNum { limbs: [ 0x2655a4f2a71153bc164249c8f6ae4c, 0xed9f7c0b36665bc1b21db066728eec, 0x00230a ] } , - BigNum { limbs: [ 0x75e1775600f121bbaca7e9d0161cf3, 0x59dd69a4c0c3e65f63afefdb3173c0, 0x00726b ] } , - BigNum { limbs: [ 0x47c28ba9fd6add445358152fe9e30e, 0x4d75bff8bc844cda745819c6a69193, 0x000182 ] } , - BigNum { limbs: [ 0xd0d82aeb2455759bab4eda84a8ac63, 0xc8e232a4decc97c175c5f45f115771, 0x00472a ] } , - BigNum { limbs: [ 0xeccbd814da06896454b1247b57539e, 0xde70f6f89e7b9b7862421542c6ade1, 0x002cc2 ] } , - BigNum { limbs: [ 0x28caa1b4f5dcc2e67ffba41b4878de, 0xcdd90cbc7967b4cb7255c2e484d53e, 0x002f0f ] } , - BigNum { limbs: [ 0x94d9614b087f3c1980045ae4b78723, 0xd97a1ce103e07e6e65b246bd533015, 0x0044dd ] } , - BigNum { limbs: [ 0x6ba83974d45c4463a5bcaa4445a757, 0x6aa063a7fea280cebabe1727cf1ffc, 0x0034b0 ] } , - BigNum { limbs: [ 0x51fbc98b29ffba9c5a4354bbba58aa, 0x3cb2c5f57ea5b26b1d49f27a08e557, 0x003f3d ] } , - BigNum { limbs: [ 0x5bc8e5e46250f63488caad8a71355d, 0xc3d470f8769b4140bb8cb3c69d796f, 0x001ab2 ] } , - BigNum { limbs: [ 0x61db1d1b9c0b08cb773551758ecaa4, 0xe37eb8a506acf1f91c7b55db3a8be4, 0x00593a ] } , - BigNum { limbs: [ 0x795678cfd1ce5591c84045b8ae1a73, 0x40c27b793e4ebc4325c5e1c47b5300, 0x00152d ] } , - BigNum { limbs: [ 0x444d8a302c8da96e37bfb94751e58e, 0x6690ae243ef976f6b24227dd5cb253, 0x005ec0 ] } , - BigNum { limbs: [ 0x7fa63cff661af7325cd87e588070a2, 0x060090169c5a7d5c39dacbd0b17daa, 0x00453b ] } , - BigNum { limbs: [ 0x3dfdc600984107cda32780a77f8f5f, 0xa1529986e0edb5dd9e2d3dd12687a9, 0x002eb2 ] } , - BigNum { limbs: [ 0x991aceb5b8f0b7351de1c328eaf50a, 0xbd4e055e35513b5e6f88531447da88, 0x001c9c ] } , - BigNum { limbs: [ 0x2489344a456b47cae21e3bd7150af7, 0xea05243f47f6f7db687fb68d902acb, 0x005750 ] } , - BigNum { limbs: [ 0xf39e5ca57cc17d729a0d7b69f39b0b, 0xaa8cb19984ed95a7e2d7812ca75df1, 0x0027b6 ] } , - BigNum { limbs: [ 0xca05a65a819a818d65f283960c64f6, 0xfcc67803f85a9d91f530887530a761, 0x004c36 ] } , - BigNum { limbs: [ 0x616a02d0b6703ad2f896d315ba0c6b, 0x0158e6b2c1a2d1ff7b686e6fa6419d, 0x00025b ] } , - BigNum { limbs: [ 0x5c3a002f47ebc42d07692bea45f396, 0xa5fa42eabba5613a5c9f9b3231c3b6, 0x007192 ] } , - BigNum { limbs: [ 0xd0b955fd626f8216bc064d99f44e58, 0x4d53dabfd281345366eb688bd119b2, 0x005d95 ] } , - BigNum { limbs: [ 0xeceaad029bec7ce943f9b1660bb1a9, 0x59ff4eddaac6fee6711ca11606eba0, 0x001658 ] } , - BigNum { limbs: [ 0x9c14e52bc510a84b6ac1bcc463fb21, 0x2051920a9bdd4ea23a4aa97e1e90db, 0x002a7d ] } , - BigNum { limbs: [ 0x218f1dd4394b56b4953e423b9c04e0, 0x87019792e16ae4979dbd6023b97478, 0x004970 ] } , - BigNum { limbs: [ 0x85accfbc474212121ea1319f4c209c, 0x45072395009186090b2f1559eafd49, 0x001a33 ] } , - BigNum { limbs: [ 0x37f73343b719ecede15ecd60b3df65, 0x624c06087cb6ad30ccd8f447ed080a, 0x0059ba ] } , - BigNum { limbs: [ 0x77273c168c4afecd3a13164faa1758, 0x448036ea67a81e009a3bc645424619, 0x007179 ] } , - BigNum { limbs: [ 0x467cc6e972110032c5ece8b055e8a9, 0x62d2f2b315a015393dcc435c95bf3a, 0x000274 ] } , - BigNum { limbs: [ 0xfb0fe542131cff79443d7ce5836ab4, 0x58f3481488a9e3b1e0051d79650c14, 0x003025 ] } , - BigNum { limbs: [ 0xc2941dbdeb3eff86bbc2821a7c954d, 0x4e5fe188f49e4f87f802ec2872f93e, 0x0043c8 ] } , - BigNum { limbs: [ 0x6a8e4feaf68d462d556c078f463720, 0x164c3b63394b20b1c9a919c629da9d, 0x002852 ] } , - BigNum { limbs: [ 0x5315b31507ceb8d2aa93f770b9c8e1, 0x9106ee3a43fd12880e5eefdbae2ab6, 0x004b9b ] } , - BigNum { limbs: [ 0xf1d1e1ee7c5d6abf88187f0cefb20c, 0xfd01910f25effbe45bccaae3d95c6a, 0x001326 ] } , - BigNum { limbs: [ 0xcbd2211181fe944077e77ff3104df5, 0xaa51988e575837557c3b5ebdfea8e8, 0x0060c6 ] } , - BigNum { limbs: [ 0xd5b9a214819d3df400587e7902066a, 0xb136ddd3155c5d55da3642c5ab1acc, 0x001470 ] } , - BigNum { limbs: [ 0xe7ea60eb7cbec10bffa78086fdf997, 0xf61c4bca67ebd5e3fdd1c6dc2cea86, 0x005f7c ] } , - BigNum { limbs: [ 0x0fc0d3ae1aa2d1484cdb4a155aaa58, 0xae33d68783f3051e4221527d0a2065, 0x006b37 ] } , - BigNum { limbs: [ 0xade32f51e3b92db7b324b4eaa555a9, 0xf91f5315f9552e1b95e6b724cde4ee, 0x0008b5 ] } , - BigNum { limbs: [ 0xc4ff9cf2d729fef74bd60178700563, 0x29d7d5f229224f89c41c27748d079e, 0x003ceb ] } , - BigNum { limbs: [ 0xf8a4660d27320008b429fd878ffa9e, 0x7d7b53ab5425e3b013ebe22d4afdb4, 0x003702 ] } , - BigNum { limbs: [ 0xea02fae48098b68635281af47fd8ad, 0xf5e9dbbb9e4a6986d249c9701d557b, 0x0026a0 ] } , - BigNum { limbs: [ 0xd3a1081b7dc34879cad7e40b802754, 0xb1694de1defdc9b305be4031baafd7, 0x004d4c ] } , - BigNum { limbs: [ 0x02561f7d23ef1264986d880916d32c, 0x25a175e388babcfb00df37a0949d0e, 0x00260b ] } , - BigNum { limbs: [ 0xbb4de382da6cec9b679276f6e92cd5, 0x81b1b3b9f48d763ed728d201436845, 0x004de2 ] } , - BigNum { limbs: [ 0xbefc6e3f1d854a96bf0e6143e7a4be, 0xbd844b3abbbc9faabcffc9f0533fe4, 0x007284 ] } , - BigNum { limbs: [ 0xfea794c0e0d6b46940f19dbc185b43, 0xe9cede62c18b938f1b083fb184c56e, 0x000168 ] } , - BigNum { limbs: [ 0x0faf9d413f633214052a7687ecf4c4, 0xe3bd53a46b952f6b110f047b7d5739, 0x002f82 ] } , - BigNum { limbs: [ 0xadf465bebef8ccebfad58878130b3d, 0xc395d5f911b303cec6f905265aae1a, 0x00446a ] } , - BigNum { limbs: [ 0x1e86284e29617c6cd5143e69a5bdff, 0xb3e386e8ff6cd8c61121b609d38b03, 0x007088 ] } , - BigNum { limbs: [ 0x9f1ddab1d4fa82932aebc0965a4202, 0xf36fa2b47ddb5a73c6e65398047a50, 0x000364 ] } , - BigNum { limbs: [ 0xf63a085bbe2cd5c3ceb69a02bbf738, 0x22b6914a019b6d86e16b5c842a1f07, 0x005c72 ] } , - BigNum { limbs: [ 0xc769faa4402f293c314964fd4408c9, 0x849c98537bacc5b2f69cad1dade64b, 0x00177b ] } , - BigNum { limbs: [ 0x446da37ee104956d95c3f201bffa3e, 0x2db01167b5656686f2ee9c93ecd9ae, 0x003b89 ] } , - BigNum { limbs: [ 0x79365f811d5769926a3c0cfe4005c3, 0x79a31835c7e2ccb2e5196d0deb2ba5, 0x003864 ] } , - BigNum { limbs: [ 0x4fafbcc6ec0cd357e41926122589c9, 0x40cf15dd6368efc528f51ee23fdcc0, 0x000466 ] } , - BigNum { limbs: [ 0x6df44639124f2ba81be6d8edda7638, 0x668413c019df4374af12eabf982893, 0x006f87 ] } , - BigNum { limbs: [ 0x79fafb3f5f55fad82cd67c85567002, 0xeefc67e8504eea0cd3cbdb2d08e238, 0x003ea1 ] } , - BigNum { limbs: [ 0x43a907c09f060427d329827aa98fff, 0xb856c1b52cf9492d043c2e74cf231b, 0x00354b ] } , - BigNum { limbs: [ 0x03e470451674007695d27fd2fee785, 0x97ff52d8313ef19051e9ad2f273030, 0x007176 ] } , - BigNum { limbs: [ 0xb9bf92bae7e7fe896a2d7f2d01187c, 0x0f53d6c54c0941a9861e5c72b0d523, 0x000277 ] } , - BigNum { limbs: [ 0xa2966253c4c42767006b5a67069fea, 0x342df5bfce2e228919530ab9368eb6, 0x000bec ] } , - BigNum { limbs: [ 0x1b0da0ac3997d798ff94a498f96017, 0x732533ddaf1a10b0beb4fee8a1769d, 0x006801 ] } , - BigNum { limbs: [ 0x96e0f32404a1c9ff3b116ecd50336d, 0x96f6a673d6b2d68d08f22c00ff5850, 0x0043ee ] } , - BigNum { limbs: [ 0x26c30fdbf9ba3500c4ee9032afcc94, 0x105c8329a6955caccf15dda0d8ad03, 0x002fff ] } , - BigNum { limbs: [ 0x9a3970c682e5ca65f0f59f60448c4a, 0x38d2e2bdd570825e310ae003a7c836, 0x00672b ] } , - BigNum { limbs: [ 0x236a92397b76349a0f0a5f9fbb73b7, 0x6e8046dfa7d7b0dba6fd299e303d1d, 0x000cc2 ] } , - BigNum { limbs: [ 0x821f42c6a8f8b162502ca5c43ef99c, 0x2caa9a98600ac4f1f0bfebe4674e1b, 0x0024b3 ] } , - BigNum { limbs: [ 0x3b84c03955634d9dafd3593bc10665, 0x7aa88f051d3d6e47e7481dbd70b738, 0x004f3a ] } , - BigNum { limbs: [ 0xb30b386db1c3ab3206626a98fa1d9c, 0xef32bfda0292d34160996c56d80441, 0x004885 ] } , - BigNum { limbs: [ 0x0a98ca924c9853cdf99d946705e265, 0xb82069c37ab55ff8776e9d4b000112, 0x002b67 ] } , - BigNum { limbs: [ 0x6d40e40f75f4714fc4876bfdbec485, 0xd9e82da96ed0f5349fc357ca134467, 0x002e8e ] } , - BigNum { limbs: [ 0x50631ef088678db03b789302413b7c, 0xcd6afbf40e773e053844b1d7c4c0ec, 0x00455e ] } , - BigNum { limbs: [ 0xab2a28bc1a67a3e121a2157e140709, 0xd8b424faf036d46d88f1825bc65411, 0x006638 ] } , - BigNum { limbs: [ 0x1279da43e3f45b1ede5de981ebf8f8, 0xce9f04a28d115ecc4f16874611b142, 0x000db4 ] } , - BigNum { limbs: [ 0x2bbf84c8922da39008296d4ce674de, 0xbf321096e64bd5cb0b6d859bf7af2a, 0x0022b9 ] } , - BigNum { limbs: [ 0x91e47e376c2e5b6ff7d691b3198b23, 0xe821190696fc5d6ecc9a8405e05629, 0x005133 ] } , - BigNum { limbs: [ 0xf87b21e445689c444c101276c0d6b2, 0x9722ff6e4389c6193e3d606f8bae7a, 0x001d74 ] } , - BigNum { limbs: [ 0xc528e11bb8f362bbb3efec893f294f, 0x10302a2f39be6d2099caa9324c56d8, 0x005679 ] } , - BigNum { limbs: [ 0xe5677e12d7fdae688163b978201af9, 0x33b4a59d415bba9eeab1548a339c68, 0x007377 ] } , - BigNum { limbs: [ 0xd83c84ed265e50977e9c4587dfe508, 0x739e84003bec789aed56b517a468ea, 0x000076 ] } , - BigNum { limbs: [ 0x9a479cf2311426840eb2f9317fb817, 0xb7ce9c4a0ddd37396661f4b1338e47, 0x000fb0 ] } , - BigNum { limbs: [ 0x235c660dcd47d87bf14d05ce8047ea, 0xef848d536f6afc0071a614f0a4770c, 0x00643c ] } , - BigNum { limbs: [ 0x3e8532cebebdef1eaf415a7072e217, 0xc63b4d0b4485938016bdfb5461cb53, 0x004f23 ] } , - BigNum { limbs: [ 0x7f1ed0313f9e0fe150bea48f8d1dea, 0xe117dc9238c29fb9c14a0e4d763a00, 0x0024c9 ] } , - BigNum { limbs: [ 0x3c2ae3c59b53b9b3ae44e7cb60f87e, 0xc7115960bc307fd1f7ee628144edd0, 0x0056bf ] } , - BigNum { limbs: [ 0x81791f3a6308454c51bb17349f0783, 0xe041d03cc117b367e019a720931783, 0x001d2d ] } , - BigNum { limbs: [ 0xf9e9ef2dab9b1670e7afef7c69a573, 0x433df099fdd1141e5457db3a858b05, 0x001e37 ] } , - BigNum { limbs: [ 0xc3ba13d252c0e88f18500f83965a8e, 0x641539037f771f1b83b02e67527a4d, 0x0055b6 ] } , - BigNum { limbs: [ 0x68a15b851828cf599ffdaa5828ab43, 0x5a76f2a4f9373d621818d2c39c8d1f, 0x00716f ] } , - BigNum { limbs: [ 0x5502a77ae6332fa6600254a7d754be, 0x4cdc36f88410f5d7bfef36de3b7834, 0x00027e ] } , - BigNum { limbs: [ 0x306235854ce6c058cfc39bead3e9c1, 0x5d30925b46ce8455249678a7313d7e, 0x00245c ] } , - BigNum { limbs: [ 0x8d41cd7ab1753ea7303c63152c1640, 0x4a2297423679aee4b37190faa6c7d5, 0x004f91 ] } , - BigNum { limbs: [ 0x35d85fba3cf6739bd8edbd9e625acf, 0x60a4b705db2da3f6c73ae7819e68cb, 0x003c1b ] } , - BigNum { limbs: [ 0x87cba345c1658b64271241619da532, 0x46ae7297a21a8f4310cd2220399c88, 0x0037d2 ] } , - BigNum { limbs: [ 0x97522aac346f55acbc19b9e9811e79, 0x94214cf9539d6046ecb5b3db813c51, 0x004e62 ] } , - BigNum { limbs: [ 0x2651d853c9eca95343e645167ee188, 0x1331dca429aad2f2eb5255c656c902, 0x00258b ] } , - BigNum { limbs: [ 0x6a133219f27c4b46c6f847a6d15a7b, 0xc33cdb958a9cdb339a547401f71630, 0x003e56 ] } , - BigNum { limbs: [ 0x5390d0e60bdfb3b93907b7592ea586, 0xe4164e07f2ab58063db3959fe0ef23, 0x003596 ] } , - BigNum { limbs: [ 0x04f1f91672ddefd059ee663821842d, 0x317283b968e87fee2aa8bb04da4e60, 0x003bdc ] } , - BigNum { limbs: [ 0xb8b209e98b7e0f2fa61198c7de7bd4, 0x75e0a5e4145fb34bad5f4e9cfdb6f3, 0x003811 ] } , - BigNum { limbs: [ 0x4f2d33b0870055dbd33167d427d29c, 0x262813fd1aebfdb5e6174636ee325e, 0x00621d ] } , - BigNum { limbs: [ 0x6e76cf4f775ba9242cce972bd82d65, 0x812b15a0625c3583f1f0c36ae9d2f5, 0x0011d0 ] } , - BigNum { limbs: [ 0x487f2463fba3e20afba5ddb9d9a632, 0x47ac35d9a1b93726d0ae30d44be5b6, 0x005c2e ] } , - BigNum { limbs: [ 0x7524de9c02b81cf5045a21462659cf, 0x5fa6f3c3db8efc130759d8cd8c1f9d, 0x0017bf ] } , - BigNum { limbs: [ 0x578ca4bdcffdfaaf63cac2aa631f1d, 0xe4afdde0bb69b179b89dd0bd9b9403, 0x004aed ] } , - BigNum { limbs: [ 0x66175e422e5e04509c353c559ce0e4, 0xc2a34bbcc1de81c01f6a38e43c7150, 0x0028ff ] } , - BigNum { limbs: [ 0xfc2415d104453e40daadc83f8ccfe2, 0x118ca40bd8269a29dc197173759a0b, 0x0002ae ] } , - BigNum { limbs: [ 0xc17fed2efa16c0bf255236c073301f, 0x95c68591a521990ffbee982e626b47, 0x00713f ] } , - BigNum { limbs: [ 0x863ad646e716596e1f5a12e244baea, 0x7c40f2cf5dcf75ca3f9ac816918bd4, 0x000fd5 ] } , - BigNum { limbs: [ 0x37692cb91745a591e0a5ec1dbb4517, 0x2b1236ce1f78bd6f986d418b46797f, 0x006418 ] } , - BigNum { limbs: [ 0x4969282006d47c6c16853c3840a0de, 0x5f550357b97b68dce2abbcb3941d48, 0x0016cd ] } , - BigNum { limbs: [ 0x743adadff7878293e97ac2c7bf5f23, 0x47fe2645c3ccca5cf55c4cee43e80b, 0x005d20 ] } , - BigNum { limbs: [ 0x9e48bfbae909be6b14bd4c94283139, 0x49ce67bc6827aeadc5ae3427f905f2, 0x000909 ] } , - BigNum { limbs: [ 0x1f5b434515524094eb42b26bd7cec8, 0x5d84c1e11520848c1259d579deff61, 0x006ae4 ] } , - BigNum { limbs: [ 0x43200e4c9c51733e54abcc7fe8b49c, 0x576f19800705eb819e54033c1e5a22, 0x00269f ] } , - BigNum { limbs: [ 0x7a83f4b3620a8bc1ab543280174b65, 0x4fe4101d764247b839b40665b9ab31, 0x004d4e ] } , - BigNum { limbs: [ 0xa6bd0a70c528eb9a612cafe45838a9, 0x5fb3bc9a0f8a1dcb6aa8eccffead1e, 0x0024e8 ] } , - BigNum { limbs: [ 0x16e6f88f393313659ed34f1ba7c758, 0x479f6d036dbe156e6d5f1cd1d95835, 0x004f05 ] } , - BigNum { limbs: [ 0x092fb3730a4a38abbb613cb100e2b7, 0xf911e2710139da2cf40994d2ee391d, 0x00120d ] } , - BigNum { limbs: [ 0xb4744f8cf411c654449ec24eff1d4a, 0xae41472c7c0e590ce3fe74cee9cc36, 0x0061df ] } , - BigNum { limbs: [ 0xa2253f5bc8037e9a47ee7220984b39, 0x61d89f56f16020832570c9e52d88dc, 0x0036a4 ] } , - BigNum { limbs: [ 0x1b7ec3a436588065b8118cdf67b4c8, 0x457a8a468be812b6b2973fbcaa7c77, 0x003d49 ] } , - BigNum { limbs: [ 0x89913932d3c0c7ce1654daec319bfe, 0x19917a4999aa2b8b9e48b90848614c, 0x002d67 ] } , - BigNum { limbs: [ 0x3412c9cd2a9b3731e9ab2413ce6403, 0x8dc1af53e39e07ae39bf50998fa407, 0x004686 ] } , - BigNum { limbs: [ 0x33e245d22b042fdf0ff0e077e600ca, 0x78468f37f795022461abcc7e0370b5, 0x003436 ] } , - BigNum { limbs: [ 0x89c1bd2dd357cf20f00f1e8819ff37, 0x2f0c9a6585b33115765c3d23d4949e, 0x003fb7 ] } , - BigNum { limbs: [ 0xe05db7e375ee86fbd310a26d1cce6c, 0x51d7b5e598bd0f16826188eac00fcc, 0x004e0f ] } , - BigNum { limbs: [ 0xdd464b1c886d78042cef5c92e33195, 0x557b73b7e48b242355a680b717f586, 0x0025de ] } , - BigNum { limbs: [ 0xcfaf6910cde540bb8a3b2ad485b4c9, 0x4729d4a170a178f3d3dbcc6f73fe79, 0x001f0f ] } , - BigNum { limbs: [ 0xedf499ef3076be4475c4d42b7a4b38, 0x602954fc0ca6ba46042c3d326406d9, 0x0054de ] } , - BigNum { limbs: [ 0xc0d0e78fd085783b8197ec325ea3e8, 0xb47ecf33eb1c82990742cf3687d963, 0x001b8b ] } , - BigNum { limbs: [ 0xfcd31b702dd686c47e6812cda15c19, 0xf2d45a69922bb0a0d0c53a6b502bef, 0x005861 ] } , - BigNum { limbs: [ 0x397ea1d516758ddc84002bfb1b01b1, 0xad611232a12aea50b5077b3ffe3fc5, 0x003385 ] } , - BigNum { limbs: [ 0x8425612ae7e671237bffd304e4fe50, 0xf9f2176adc1d48e923008e61d9c58e, 0x004067 ] } , - BigNum { limbs: [ 0x0362f1e803401e44eb0b0b9a3e4a01, 0x4e9674490468fec5cc5a26899d272b, 0x0070b8 ] } , - BigNum { limbs: [ 0xba411117fb1be0bb14f4f365c1b600, 0x58bcb55478df34740bade3183ade28, 0x000335 ] } , - BigNum { limbs: [ 0x1dd7b6248f4fee578fb63e4a768788, 0x132ef74a6587a6a22616bb3764f286, 0x0010c4 ] } , - BigNum { limbs: [ 0x9fcc4cdb6f0c10a87049c0b5897879, 0x9424325317c08c97b1f14e6a7312cd, 0x006329 ] } , - BigNum { limbs: [ 0x1e1a6bfcf82e1e2c455e524b1a4f0c, 0x9e48c18c6db7a093a40ba4d2e2e399, 0x000e02 ] } , - BigNum { limbs: [ 0x9f899703062de0d3baa1acb4e5b0f5, 0x090a68110f9092a633fc64cef521ba, 0x0065eb ] } , - BigNum { limbs: [ 0xe4341032732cd0b8d349e52553b42f, 0x98256d5409c63f2802e90233939e74, 0x001cb3 ] } , - BigNum { limbs: [ 0xd96ff2cd8b2f2e472cb619daac4bd2, 0x0f2dbc497381f411d51f076e4466de, 0x00573a ] } , - BigNum { limbs: [ 0x0557aeb787b2377655734c979c6933, 0x0421ed19688e75854acd974b777ea3, 0x000631 ] } , - BigNum { limbs: [ 0xb84c544876a9c789aa8cb2686396ce, 0xa3313c8414b9bdb48d3a72566086b0, 0x006dbc ] } , - BigNum { limbs: [ 0xd642ca6b54a6369ccc21031e150139, 0xba9f79a5fb1a6a2a047b5be3ed4fd4, 0x00224c ] } , - BigNum { limbs: [ 0xe7613894a9b5c86333defbe1eafec8, 0xecb3aff7822dc90fd38cadbdeab57e, 0x0051a0 ] } , - BigNum { limbs: [ 0x000a2c08272f66da36ccf2e993cd4b, 0x41e9a4f570435bba8fb2e09f6beef7, 0x006afa ] } , - BigNum { limbs: [ 0xbd99d6f7d72c9825c9330c166c32b6, 0x656984a80d04d77f485529026c165c, 0x0008f3 ] } , - BigNum { limbs: [ 0xbcf785dcdf4e328808e9517b13c0b3, 0x409be07b0180970e859cb664f191e6, 0x0061b7 ] } , - BigNum { limbs: [ 0x00ac7d231f0dcc77f716ad84ec3f4e, 0x66b749227bc79c2b526b533ce6736d, 0x001236 ] } , - BigNum { limbs: [ 0x78c4bdcf9bc483ca5781d76f4e559e, 0x36ae045a7a20a073d4d045c3beb72b, 0x002749 ] } , - BigNum { limbs: [ 0x44df453062977b35a87e2790b1aa63, 0x70a52543032792c60337c3de194e28, 0x004ca4 ] } , - BigNum { limbs: [ 0xbd07bf07c3447388b9c737630a23e2, 0x67e4a7679099fa34c274b0c1047698, 0x006329 ] } , - BigNum { limbs: [ 0x009c43f83b178b774638c79cf5dc1f, 0x3f6e8235ecae3905159358e0d38ebb, 0x0010c4 ] } , - BigNum { limbs: [ 0x931c9fae3bb9dda8a614cffe125c7a, 0xdc15fde5f343f0127db7a6df4e56f9, 0x00223e ] } , - BigNum { limbs: [ 0x2a876351c2a2215759eb2f01eda387, 0xcb3d2bb78a0443275a5062c289ae5a, 0x0051ae ] } , - BigNum { limbs: [ 0x15005b0d6d37abfde128a69e40ea4f, 0xf16fc09ed8024721545355d82c1794, 0x002121 ] } , - BigNum { limbs: [ 0xa8a3a7f2912453021ed75861bf15b2, 0xb5e368fea545ec1883b4b3c9abedbf, 0x0052cb ] } , - BigNum { limbs: [ 0x23e4c65209e6feb99be60e5325becf, 0x97a825dfd84f013ee58a04c05b1238, 0x002bbc ] } , - BigNum { limbs: [ 0x99bf3cadf47500466419f0acda4132, 0x0fab03bda4f931faf27e04e17cf31b, 0x004831 ] } , - BigNum { limbs: [ 0x92b0c71537657e791422ab0d1fa475, 0x8e737ba8e6b9c7011799b6ac26732b, 0x00349b ] } , - BigNum { limbs: [ 0x2af33beac6f68086ebdd53f2e05b8c, 0x18dfadf4968e6c38c06e52f5b19228, 0x003f52 ] } , - BigNum { limbs: [ 0x6a7922e7a83dee9dcbcd42681999e0, 0x29dda824854795fc5d88196ec7c833, 0x0037ad ] } , - BigNum { limbs: [ 0x532ae018561e10623432bc97e66621, 0x7d758178f8009d3d7a7ff033103d20, 0x003c40 ] } , - BigNum { limbs: [ 0x5dc87d9d11ad1b7f6aaf9450d12b19, 0x66588b0ae62cf7f58fc006cf477672, 0x0020c6 ] } , - BigNum { limbs: [ 0x5fdb8562ecaee38095506aaf2ed4e8, 0x40fa9e92971b3b44484802d2908ee1, 0x005327 ] } , - BigNum { limbs: [ 0xfd9e7bab7d04be833d3e49aebddc79, 0x831f7ed103e1e3648d02b64300acf9, 0x006d29 ] } , - BigNum { limbs: [ 0xc00587548157407cc2c1b551422388, 0x2433aacc79664fd54b05535ed75859, 0x0006c4 ] } , - BigNum { limbs: [ 0x11aa53881673c8aa46fedd8a5733c6, 0xbed352e860abf11334d33265ec3a28, 0x00687a ] } , - BigNum { limbs: [ 0xabf9af77e7e83655b9012175a8cc3b, 0xe87fd6b51c9c4226a334d73bebcb2b, 0x000b72 ] } , - BigNum { limbs: [ 0x9de727acba114354fe7e4233ead48f, 0xb98ed4682ac06c7aa6c0e0aa70e4ef, 0x000b09 ] } , - BigNum { limbs: [ 0x1fbcdb53444abbab0181bccc152b72, 0xedc455355287c6bf314728f7672064, 0x0068e3 ] } , - BigNum { limbs: [ 0x67a0e092307f59eb82e18c2d4a2f93, 0xe6277af5413f13df9e22c199ab7d4c, 0x000f49 ] } , - BigNum { limbs: [ 0x5603226dcddca5147d1e72d2b5d06e, 0xc12baea83c091f5a39e548082c8807, 0x0064a3 ] } , - BigNum { limbs: [ 0x8ecbb2fc779498b7371af24c69e915, 0xb7ebefc2ea8bdc9f2f2d8d631bdace, 0x0019bb ] } , - BigNum { limbs: [ 0x2ed8500386c76648c8e50cb39616ec, 0xef6739da92bc569aa8da7c3ebc2a85, 0x005a31 ] } , - BigNum { limbs: [ 0xbf69d4846895b869cf30c3f74acc2d, 0x7cc3fb72f7b698679992371f25319c, 0x000beb ] } , - BigNum { limbs: [ 0xfe3a2e7b95c6469630cf3b08b533d4, 0x2a8f2e2a85919ad23e75d282b2d3b6, 0x006802 ] } , - BigNum { limbs: [ 0xf2baf504c25b9a39edc05aa04d73d3, 0xd287d6fa2f0abe2070fb003e94ce7e, 0x00501e ] } , - BigNum { limbs: [ 0xcae90dfb3c0064c6123fa45fb28c2e, 0xd4cb52a34e3d7519670d09634336d4, 0x0023ce ] } , - BigNum { limbs: [ 0x61030f7a6df8cd67febb6c8cbe4070, 0xc60d84f924f255bef584e05d609204, 0x000a88 ] } , - BigNum { limbs: [ 0x5ca0f385906331980144927341bf91, 0xe145a4a45855dd7ae283294477734f, 0x006964 ] } , - BigNum { limbs: [ 0x192612437c0d705dd8aa1f184468b1, 0xac20308d7fa75d32092f3b381bf3aa, 0x002d1d ] } , - BigNum { limbs: [ 0xa47df0bc824e8ea22755dfe7bb9750, 0xfb32f90ffda0d607ced8ce69bc11a9, 0x0046cf ] } , - BigNum { limbs: [ 0xd10e7623a9b5c2385693e2fcd877bc, 0x930d0b536c1638fea19a2f6d48ccbf, 0x006c5c ] } , - BigNum { limbs: [ 0xec958cdc54a63cc7a96c1c03278845, 0x14461e4a1131fa3b366dda348f3893, 0x000791 ] } , - BigNum { limbs: [ 0x07f80a3c191747313bf2252bfe6544, 0xc3710f7d372068f5ddce3a6ac23aa6, 0x0048dd ] } , - BigNum { limbs: [ 0xb5abf8c3e544b7cec40dd9d4019abd, 0xe3e21a204627ca43fa39cf3715caad, 0x002b0f ] } , - BigNum { limbs: [ 0x7d31d54a5b5e0bf66850fc4356cc38, 0x5090296540c55c8ea24dbc4424135c, 0x000b63 ] } , - BigNum { limbs: [ 0x40722db5a2fdf30997af02bca933c9, 0x56c300383c82d6ab35ba4d5db3f1f7, 0x00688a ] } , - BigNum { limbs: [ 0x6754373db6852853633cba573000a7, 0xbbd2ed7a061996cedcf10a4bedd504, 0x0028da ] } , - BigNum { limbs: [ 0x564fcbc247d6d6ac9cc344a8cfff5a, 0xeb803c23772e9c6afb16ff55ea304f, 0x004b12 ] } , - BigNum { limbs: [ 0xefd2ccb27161336c0774388484c8e0, 0x40f3fe19d6697b3c0956d65c80f6ed, 0x005149 ] } , - BigNum { limbs: [ 0xcdd1364d8cfacb93f88bc67b7b3721, 0x665f2b83a6deb7fdceb13345570e65, 0x0022a4 ] } , - BigNum { limbs: [ 0xaf06cd4910e551088ec10c7b3f9602, 0xd80f951236ac65f6c38129c1631553, 0x004683 ] } , - BigNum { limbs: [ 0x0e9d35b6ed76adf7713ef284c069ff, 0xcf43948b469bcd431486dfe074f000, 0x002d69 ] } , - BigNum { limbs: [ 0x55cbf4fc7d9221d6816541aa07b714, 0x36935603e9159f28a666a615905a5d, 0x0043f2 ] } , - BigNum { limbs: [ 0x67d80e0380c9dd297e9abd55f848ed, 0x70bfd3999432941131a1638c47aaf6, 0x002ffb ] } , - BigNum { limbs: [ 0x3d713401b12579ff39b32afc7b0bc8, 0xbfc21f080b804db92c2e4bb771d4c2, 0x00566d ] } , - BigNum { limbs: [ 0x8032cefe4d368500c64cd40384f439, 0xe7910a9571c7e580abd9bdea663091, 0x001d7f ] } , - BigNum { limbs: [ 0xab8672e395976ddc3fce2d7273d9b8, 0xce96912a183ea6587ecd8746ffc65e, 0x000424 ] } , - BigNum { limbs: [ 0x121d901c68c49123c031d18d8c2649, 0xd8bc987365098ce1593a825ad83ef5, 0x006fc8 ] } , - BigNum { limbs: [ 0xd3cae6a6c85eb50b49338d697169d1, 0xfbbeff1e545584842b429aacfafecc, 0x003fd8 ] } , - BigNum { limbs: [ 0xe9d91c5935fd49f4b6cc71968e9630, 0xab942a7f28f2aeb5acc56ef4dd0686, 0x003414 ] } , - BigNum { limbs: [ 0x7cd05c252cdf03a7dac369758af536, 0xd634c2939a3328200b75d372ed58da, 0x0023af ] } , - BigNum { limbs: [ 0x40d3a6dad17cfb58253c958a750acb, 0xd11e6709e3150b19cc92362eeaac79, 0x00503d ] } , - BigNum { limbs: [ 0x981ce7693de7d08ae9eb8b6995ac0a, 0xa4253becc4b5eb2b624ae2bcf538a0, 0x0065ab ] } , - BigNum { limbs: [ 0x25871b96c0742e75161473966a53f7, 0x032dedb0b892480e75bd26e4e2ccb3, 0x000e42 ] } , - BigNum { limbs: [ 0x8d13ae231a5bdcc9fea91649dcfec3, 0xec6589730d57a091ebada7f04c5566, 0x00406b ] } , - BigNum { limbs: [ 0x309054dce40022360156e8b623013e, 0xbaeda02a6ff092a7ec5a61b18bafed, 0x003381 ] } , - BigNum { limbs: [ 0x13cf484f4959217912415ab836bd2c, 0x9d1f8742b93e0c418fd6b7d55b84cb, 0x00134b ] } , - BigNum { limbs: [ 0xa9d4bab0b502dd86edbea447c942d5, 0x0a33a25ac40a26f8483151cc7c8088, 0x0060a2 ] } , - BigNum { limbs: [ 0x97082543d2be0a3165acb7ba4029ee, 0xbbfa9954466c540e4ea7938b5f4ce7, 0x005448 ] } , - BigNum { limbs: [ 0x269bddbc2b9df4ce9a534745bfd613, 0xeb58904936dbdf2b8960761678b86c, 0x001fa4 ] } , - BigNum { limbs: [ 0xf8db8f62b9e688a40f1700385650df, 0xd3af97013194cff7b6d0a1aea46d99, 0x0047a0 ] } , - BigNum { limbs: [ 0xc4c8739d4475765bf0e8fec7a9af22, 0xd3a3929c4bb36342213767f33397b9, 0x002c4c ] } , - BigNum { limbs: [ 0x3129692575239a8f8cf7befeeb90de, 0x12cac8686c064244cec8b2e392eca6, 0x0068e9 ] } , - BigNum { limbs: [ 0x8c7a99da8938647073084001146f23, 0x948861351141f0f5093f56be4518ad, 0x000b04 ] } , - BigNum { limbs: [ 0x121bcca49e268a7218bcb84d7c3ebc, 0xff2e2a28d2d40b336334dc00d24146, 0x002455 ] } , - BigNum { limbs: [ 0xab88365b6035748de74346b283c145, 0xa824ff74aa74280674d32da105c40d, 0x004f97 ] } , - BigNum { limbs: [ 0x46d17864183203961a252dd8543362, 0x2856c609b4784ae25ffab9dc598650, 0x00391b ] } , - BigNum { limbs: [ 0x76d28a9be629fb69e5dad127abcc9f, 0x7efc6393c8cfe857780d4fc57e7f03, 0x003ad2 ] } -]; diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/smaller_config.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/smaller_config.nr index 40521353f01..23ad7978e4b 100644 --- a/noir-projects/noir-protocol-circuits/crates/blob/src/smaller_config.nr +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/smaller_config.nr @@ -2,35 +2,68 @@ use dep::bigint::{BigNum, fields::bls12_381Fr::BLS12_381_Fr_Params}; type F = BigNum<3, BLS12_381_Fr_Params>; -global FIELDS_PER_BLOB: u64 = 8; // actually 4096 -global LOG_FIELDS_PER_BLOB: u64 = 3; // actually 12 +global FIELDS_PER_BLOB: u32 = 8; // actually 4096 +global LOG_FIELDS_PER_BLOB: u32 = 3; // actually 12 // The following three fields are more meaningful computation in the proper config.nr: -global EXTRA_FIELDS_PER_BLOB: u64 = 0; // 0 = floor(8 FIELDS_PER_BLOB / 254 noir_field_bits). +global EXTRA_FIELDS_PER_BLOB: u32 = 0; // 0 = floor(8 FIELDS_PER_BLOB / 254 noir_field_bits). global NOIR_FIELDS_PER_BLOB = FIELDS_PER_BLOB + EXTRA_FIELDS_PER_BLOB; // It's a more meaningful computation in the proper config.nr. -global FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB: u64 = 0; // EXTRA_FIELDS_PER_BLOB * 254 = 0. It's a more meaningful computation in the proper config.nr. +global FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB: u32 = 0; // EXTRA_FIELDS_PER_BLOB * 254 = 0. It's a more meaningful computation in the proper config.nr. global D: F = BigNum { limbs: [8, 0, 0] }; -global D_INV = BigNum { limbs: [0x45ef829ffe907f1fffffff20000001, 0xf268c469cd9f2cd29d07086d9d04a9, 0x656f] }; +global D_INV = + BigNum { limbs: [0x45ef829ffe907f1fffffff20000001, 0xf268c469cd9f2cd29d07086d9d04a9, 0x656f] }; -global ROOTS: [F; FIELDS_PER_BLOB] = [ - BigNum { limbs: [ 0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000 ] } , - BigNum { limbs: [ 0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed ] } , - BigNum { limbs: [ 0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000 ] } , - BigNum { limbs: [ 0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed ] } , - BigNum { limbs: [ 0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457 ] } , - BigNum { limbs: [ 0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96 ] } , - BigNum { limbs: [ 0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333 ] } , - BigNum { limbs: [ 0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9 ] } +global ROOTS: [F; FIELDS_PER_BLOB] = [ + BigNum { + limbs: [0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000], + }, + BigNum { + limbs: [0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed], + }, + BigNum { + limbs: [0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000], + }, + BigNum { + limbs: [0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed], + }, + BigNum { + limbs: [0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457], + }, + BigNum { + limbs: [0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96], + }, + BigNum { + limbs: [0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333], + }, + BigNum { + limbs: [0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9], + }, ]; global NEGATIVE_ROOTS = [ - BigNum { limbs: [ 0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed ] } , - BigNum { limbs: [ 0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000 ] } , - BigNum { limbs: [ 0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed ] } , - BigNum { limbs: [ 0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000 ] } , - BigNum { limbs: [ 0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96 ] } , - BigNum { limbs: [ 0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457 ] } , - BigNum { limbs: [ 0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9 ] } , - BigNum { limbs: [ 0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333 ] } + BigNum { + limbs: [0xbda402fffe5bfeffffffff00000000, 0xa753299d7d483339d80809a1d80553, 0x0073ed], + }, + BigNum { + limbs: [0x000000000000000000000000000001, 0x000000000000000000000000000000, 0x000000], + }, + BigNum { + limbs: [0xbaa40089fb5bfefffeffff00000001, 0xa753299d7d47a5e80b39939ed33467, 0x0073ed], + }, + BigNum { + limbs: [0x030002760300000001000000000000, 0x0000000000008d51ccce760304d0ec, 0x000000], + }, + BigNum { + limbs: [0x32824078eaa4fe8dd702cb688bc087, 0x405d25a31660a733b23a98ca5b22a0, 0x003f96], + }, + BigNum { + limbs: [0x8b21c28713b7007228fd3397743f7a, 0x66f603fa66e78c0625cd70d77ce2b3, 0x003457], + }, + BigNum { + limbs: [0x4913cc6b4e0c269fc8017d5166afd3, 0xf524ccbc6d03787d7d083f1b189fc5, 0x0060b9], + }, + BigNum { + limbs: [0x74903694b04fd86037fe81ae99502e, 0xb22e5ce11044babc5affca86bf658e, 0x001333], + }, ]; diff --git a/noir-projects/noir-protocol-circuits/crates/blob/src/unconstrained_config.nr b/noir-projects/noir-protocol-circuits/crates/blob/src/unconstrained_config.nr new file mode 100644 index 00000000000..0a794453d0a --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/blob/src/unconstrained_config.nr @@ -0,0 +1,106 @@ +use bigint::{BigNum, fields::bls12_381Fr::BLS12_381_Fr_Params}; +use types::constants::FIELDS_PER_BLOB; + +// TODO(#9982): Delete this file and go back to using config.nr - calculating ROOTS in unconstrained is insecure. + +pub type F = BigNum<3, 255, BLS12_381_Fr_Params>; + +pub global LOG_FIELDS_PER_BLOB: u32 = 12; +pub global EXTRA_FIELDS_PER_BLOB: u32 = 16; // 16 = floor(4096 FIELDS_PER_BLOB / 254 noir_field_bits), wasting only 32 bits. +pub global NOIR_FIELDS_PER_BLOB: u32 = FIELDS_PER_BLOB + EXTRA_FIELDS_PER_BLOB; +pub global FIELDS_CARRYING_AN_EXTRA_BIT_PER_BLOB: u32 = EXTRA_FIELDS_PER_BLOB * 254; // EXTRA_FIELDS_PER_BLOB * 254 = 4064. So the first 4064 bls Fr fields in the blob will carry an extra bit in their 255th bit position, that will be used to reconstitute 16 extra fields. +pub global D: F = BigNum { limbs: [4096, 0, 0] }; +pub global D_INV: F = + BigNum { limbs: [0x686828bfce5c19400fffff00100001, 0x6878b46ae3705eb6a46a89213de7d3, 0x73e6] }; + +unconstrained fn compute_level(idx_: u32) -> u32 { + // Count the number of trailing ones. + let mut count = 0; + let mut idx = idx_; + for _i in 0..LOG_FIELDS_PER_BLOB { + if (idx & 1 == 0) { + break; + } else { + count += 1; + idx >>= 1; + } + } + + count +} + +unconstrained fn compute_big_minus_arr( + _big_minus: u32, + _next_diff: u32, +) -> [u32; LOG_FIELDS_PER_BLOB - 2] { + let mut res: [u32; LOG_FIELDS_PER_BLOB - 2] = [0; LOG_FIELDS_PER_BLOB - 2]; + let mut big_minus = _big_minus; + let mut next_diff = _next_diff; + res[0] = big_minus; + for i in 1..LOG_FIELDS_PER_BLOB - 2 { + next_diff >>= 1; + big_minus += next_diff; + res[i] = big_minus; + } + assert(next_diff == 3); + res +} + +unconstrained fn bit_reversal_permutation(arr: [F; FIELDS_PER_BLOB]) -> [F; FIELDS_PER_BLOB] { + let mut arr_brp: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; + let PLUS = FIELDS_PER_BLOB >> 1; + let MINUS = PLUS >> 1; + let mut I = 0; + let mut next_diff = PLUS - (MINUS >> 1); + let mut big_minus = next_diff + MINUS; + + let big_minus_arr = compute_big_minus_arr(big_minus, next_diff); + + arr_brp[0] = arr[0]; + I += PLUS; + arr_brp[1] = arr[I]; + I -= MINUS; + arr_brp[2] = arr[I]; + I += PLUS; + arr_brp[3] = arr[I]; + + for i in 0..FIELDS_PER_BLOB / 4 - 1 { + let j = 4 * i + 4; + let level = compute_level(i); + I -= big_minus_arr[level]; + arr_brp[j] = arr[I]; + I += PLUS; + arr_brp[j + 1] = arr[I]; + I -= MINUS; + arr_brp[j + 2] = arr[I]; + I += PLUS; + arr_brp[j + 3] = arr[I]; + } + arr_brp +} + +// x ^ i for i in 0..4096 +unconstrained fn compute_powers(x: F) -> [F; FIELDS_PER_BLOB] { + let mut powers: [F; FIELDS_PER_BLOB] = [BigNum::new(); FIELDS_PER_BLOB]; + let mut current_power: F = BigNum::one(); + for i in 0..FIELDS_PER_BLOB { + powers[i] = current_power; + current_power = current_power.__mul(x); + } + powers +} + +pub unconstrained fn compute_roots_of_unity() -> [F; FIELDS_PER_BLOB] { + // The below const is found from: + // let order: F = BigNum { limbs: [ FIELDS_PER_BLOB, 0, 0 ]; + // let exp = BLS_MODULUS_SUB_1.udiv_mod(order); + // let exp: F = BigNum { limbs: [ 0x553bda402fffe5bfeffffffff00000, 0x3eda753299d7d483339d80809a1d80, 0x000007 ] }; // (MODULUS - 1) // 4096 + // let root_of_unity = PRIMITIVE_ROOT_OF_UNITY.__pow(exp); + let root_of_unity: F = BigNum { + limbs: [0xd1347b378fbf96e206da11a5d36306, 0x0a11a0f704f4fc3e8acfe0f8245f0a, 0x00564c], + }; + let mut roots_of_unity = compute_powers(root_of_unity); + bit_reversal_permutation(roots_of_unity) + // bit_reversal_permutation(&mut roots_of_unity); + // roots_of_unity +} diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-init-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-init-simulated/src/main.nr index a3585b3a092..71a33b6531a 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-init-simulated/src/main.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-init-simulated/src/main.nr @@ -10,6 +10,7 @@ unconstrained fn main( protocol_contract_tree_root: Field, private_call: PrivateCallDataWithoutPublicInputs, app_public_inputs: PrivateCircuitPublicInputs, + is_private_only: bool, ) -> pub PrivateKernelCircuitPublicInputs { let private_inputs = PrivateKernelInitCircuitPrivateInputs::new( tx_request, @@ -17,6 +18,7 @@ unconstrained fn main( protocol_contract_tree_root, private_call, app_public_inputs, + is_private_only, ); private_inputs.execute() } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-init/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml similarity index 85% rename from noir-projects/noir-protocol-circuits/crates/private-kernel-init/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml index b0418b86e78..a963c0846cc 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-init/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-init/Prover.toml @@ -1,11 +1,12 @@ -vk_tree_root = "0x1670ae061c166e83659fcd052460c6cce31d3b57fffaa427d421f47b5102e13f" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" +is_private_only = true [tx_request] -args_hash = "0x17c1d44955020bd97b3df8517cc23322eb20ddc316faca6c1aa4a9975f28ac4c" +args_hash = "0x23516c9ddf3cc536b189e0d22fb5a3c577804e50a0142020f8c16affe3ecd735" [tx_request.origin] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [tx_request.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -16,12 +17,12 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [tx_request.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [tx_request.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [tx_request.function_data] is_private = true @@ -30,7 +31,7 @@ fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be0 inner = "0x0000000000000000000000000000000000000000000000000000000027e740b2" [private_call] -contract_class_artifact_hash = "0x227923b97aa63a19d8bf1172a6165f896cd1db0f15fac550f96c5fdb0e05de62" +contract_class_artifact_hash = "0x04592586e3066000e9d91ee7a543d5df904fe72ca117509aa8dfdc9c5b8938ad" contract_class_public_bytecode_commitment = "0x0000000000000000000000000000000000000000000000000000000000000000" protocol_contract_sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -41,190 +42,190 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [private_call.vk] key = [ - "0x0000000000000000000000000000000000000000000000000000000000010000", + "0x0000000000000000000000000000000000000000000000000000000000100000", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000001e965c85", - "0x0000000000000000000000000000000000000000000000000000000023c1ca18", - "0x0000000000000000000000000000000000000000000000000000000031d68272", - "0x00000000000000000000000000000000000000000000000000000000679ec723", - "0x000000000000000000000000000000000000000000000000000000008df6ae9b", - "0x000000000000000000000000000000000000000000000000000000006a4609af", - "0x000000000000000000000000000000000000000000000000000000005b9b5343", - "0x00000000000000000000000000000000000000000000000000000000eb2cb8e2", - "0x00000000000000000000000000000000000000000000000000000000bcf6f48d", - "0x00000000000000000000000000000000000000000000000000000000123862d7", - "0x00000000000000000000000000000000000000000000000000000000f524ad21", - "0x0000000000000000000000000000000000000000000000000000000028fbc96e", - "0x0000000000000000000000000000000000000000000000000000000078f8ee90", - "0x000000000000000000000000000000000000000000000000000000008bd64fb7", - "0x00000000000000000000000000000000000000000000000000000000c8a418db", - "0x000000000000000000000000000000000000000000000000000000002b424553", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000061d135180a0faa43e4c47b7310e9f1bf0c", - "0x00000000000000000000000000000000001658bf6bf174282355ac659891168e", - "0x0000000000000000000000000000003338bad090b784b1a028d6828ab53a09c2", - "0x0000000000000000000000000000000000130a0709ffabd2c4387d2442363429", - "0x000000000000000000000000000000452660da50c0606b85065a46a512d25043", - "0x00000000000000000000000000000000000e1590532080edd1df6bb60aff65a7", - "0x00000000000000000000000000000083becad5246ebde21bae08469506495026", - "0x00000000000000000000000000000000000dc31904bf61a78ff4bec0dacc5b69", - "0x000000000000000000000000000000782edbf9c74bf193af2f3fbdbabfcbfd8f", - "0x00000000000000000000000000000000000807ce421b234a019f1ea1f5d155c6", - "0x000000000000000000000000000000a89c147e40d339618434bd0b6a5a1b0a05", - "0x00000000000000000000000000000000002c40573bd6cafcd8e1af05f28992d8", - "0x0000000000000000000000000000000d6084a6b2f7f6e33839d99b12f7a83507", - "0x0000000000000000000000000000000000038590e384d038c9a8aba0b12b524d", - "0x00000000000000000000000000000086fb57de3a7b524f961e8aa897b8da4621", - "0x000000000000000000000000000000000008cbaa5e8b8c28f0fe6aef99610b63", - "0x000000000000000000000000000000902c29ec143190ca2a4f1140f7bbf057b0", - "0x000000000000000000000000000000000017cc4e114fa65e03c8217b50312b5c", - "0x000000000000000000000000000000271ff29cf447ffce0c95892cc50ca6f4f3", - "0x000000000000000000000000000000000003563838e009fc27856460483c7def", - "0x000000000000000000000000000000cf5ae650eea5bbcbf08c2078dd2d0090f6", - "0x00000000000000000000000000000000000100f242be3d78879d8e7f5d923e13", - "0x00000000000000000000000000000081b0ca169da42b45b3c3d9900c63f48457", - "0x00000000000000000000000000000000001d74ad55ca5c0315fe8498cc1455e2", - "0x000000000000000000000000000000bcb1aa7a1a246715232917dedd7f7003e3", - "0x000000000000000000000000000000000011306d06231eb5511b6a4af622ac19", - "0x000000000000000000000000000000b53cc1f3e6a754b82245d5834b4bbdf771", - "0x00000000000000000000000000000000000f6c9f78dad05f58e768c807784356", - "0x0000000000000000000000000000004ce4eb4ae6e97cfdeffb672918c11f647b", - "0x000000000000000000000000000000000020d941e20084d60d676af26b1e9ee3", - "0x000000000000000000000000000000966a3844bd2d4b1818b901745ac4bc2927", - "0x00000000000000000000000000000000001ccca85ecf31d56bd627b193bdebd0", - "0x0000000000000000000000000000004a6fb14492f58234b982b2628272dd4356", - "0x00000000000000000000000000000000000c907d7f59c7f18fc96f50f4dab720", - "0x000000000000000000000000000000fd158294f3cc6a1dd9a1a393cf2d1b7615", - "0x000000000000000000000000000000000025c9af83172871dbc4dba70cb42e26", - "0x000000000000000000000000000000ffbfb55bca932dccc9ebc2d2e34802e8d1", - "0x00000000000000000000000000000000000a7b08b746de1ab34ffdde76fef2e3", - "0x000000000000000000000000000000cc65ffce64ec87cf6f2346e754df199362", - "0x00000000000000000000000000000000001ee9ade615b85a41a10d53cb6a217b", - "0x00000000000000000000000000000055caee039603fc4bd0dcee2726853174e6", - "0x00000000000000000000000000000000000edabfae614dda5a7f44e74b328ee5", - "0x000000000000000000000000000000542c541c61d24d16159b9ee6dc8c2fc9ad", - "0x0000000000000000000000000000000000294289b0906b0492260afd406b50cd", - "0x000000000000000000000000000000d44cb8e8a89a7e63815ee416c43f61a0d8", - "0x00000000000000000000000000000000000ab4a4913d05f5bbddf9a72af06a1e", - "0x00000000000000000000000000000073b1d12418546469860b34c927f952c003", - "0x000000000000000000000000000000000012fa447a175ca57520bddada69fd75", - "0x000000000000000000000000000000b642acfd331b5e36fa98f7515a02e72828", - "0x00000000000000000000000000000000001abe65dd5cc39575bdac595fbddd90", - "0x0000000000000000000000000000009bc3cc315d7afeff36c61b6e22769ab040", - "0x00000000000000000000000000000000000576aa1a7d3d5fa7f0d369ce1363c0", - "0x00000000000000000000000000000004f7515b12402ea97bdefb0f584fa5bdec", - "0x0000000000000000000000000000000000067867206a9694b31a0ee4ff595fe9", - "0x0000000000000000000000000000006508a49b7fd2d469907ac35e60236ec07f", - "0x000000000000000000000000000000000009730ce1de8f3b456a4edb8869e6fc", - "0x00000000000000000000000000000037e7bb23eb47901b97ae838d696cba3e18", - "0x000000000000000000000000000000000021a49b45fd52009176c18f14f94d1e", - "0x00000000000000000000000000000024b3a26104397c4eacf55931a4bc63885a", - "0x0000000000000000000000000000000000269e3a0bb44f011efeb3443026def4", - "0x000000000000000000000000000000b22457a1122d5c1681ab120b52dc16aa7e", - "0x00000000000000000000000000000000002094f7e95dc3f30735e10a4dffba29", - "0x000000000000000000000000000000489d0664e4d9fc221f8d5ef0b1a90de4dd", - "0x000000000000000000000000000000000020cf4ae2b144f1f07e6dd8d116d4b7", - "0x000000000000000000000000000000a38e7f89f0e7a9d754b6ab345dc7652d6b", - "0x0000000000000000000000000000000000253c2f7e2df9079883485f2054dce8", - "0x00000000000000000000000000000064b70129b77871c6097cd1ac60a593f9e7", - "0x00000000000000000000000000000000000f9d53d4500f29c933f812b651ccd4", - "0x000000000000000000000000000000d1eb3a8dd3ef1b4ff0884e9e03f4420dbf", - "0x00000000000000000000000000000000000e12903824ede285f005ee465d87a6", - "0x000000000000000000000000000000c3d4180a0f2b4d664f13a8b95f7ccd3b5d", - "0x00000000000000000000000000000000002b04b2425e577623ff33fc540db4e4", - "0x00000000000000000000000000000022f2afb9c4bc4121fce28f2bb3a95fbba4", - "0x000000000000000000000000000000000005d40bad34840cc4d0552a06fbd4a2", - "0x000000000000000000000000000000582c29c58c0340bcc8adebd28754417155", - "0x000000000000000000000000000000000021b88651541b4bf9443d6d71cd4766", - "0x000000000000000000000000000000729b9aa4cbb02b8f373f3577ba5ffd90a4", - "0x000000000000000000000000000000000026af6990035543d3c49c85c25bf926", - "0x0000000000000000000000000000009b8beec693252530d2f6a0222144d3ac0b", - "0x00000000000000000000000000000000001746e229b31a8709d88a701660d805", - "0x00000000000000000000000000000077c01d8ba86adf2ecee6efabb616a1b6f0", - "0x00000000000000000000000000000000002803c7e751f4099588e16a8471b01e", - "0x0000000000000000000000000000000b4c1b2e54e981d46994919bbe0a50a42a", - "0x000000000000000000000000000000000027e2e46467a2d7c6474840495dff60", - "0x000000000000000000000000000000cfc419f576f101014fe533038b35fd2243", - "0x000000000000000000000000000000000015f3e88a44a31731ddee4ba283ce4b", - "0x0000000000000000000000000000000bfa0706d2589692d9a4b1fd401ffc1716", - "0x00000000000000000000000000000000002d0acfeb6514502d32304e81e283f6", - "0x00000000000000000000000000000005a2c75ab8a16e790cab2957df56d49161", - "0x00000000000000000000000000000000000defffd94f1d9f3443a1819131d867", - "0x000000000000000000000000000000cd299a2f1216218ae863b32d620a024538", - "0x00000000000000000000000000000000000acfa138fe8ac867c22a5411305963", - "0x000000000000000000000000000000b840830389cba71793971d07e1eeef34a4", - "0x0000000000000000000000000000000000180e6976d7b76e75a1692acc0611f6", - "0x00000000000000000000000000000075341e2120aeb40f3891eebb4d1ba293e2", - "0x00000000000000000000000000000000000ba855cec960f7c1778a2efa4fc063", - "0x000000000000000000000000000000141bbf43dea286ad4f3a9a465f91681b3f", - "0x0000000000000000000000000000000000297597caef980736419dc4f64df076", - "0x0000000000000000000000000000008a46250aadf1da47d3c158ce6885827cc7", - "0x0000000000000000000000000000000000134c179667d27e33241d2760dd093d", - "0x000000000000000000000000000000f4b61bc74c53360770558d49d9419fa4dd", - "0x00000000000000000000000000000000000f31906d90dc2fba342c6320c718d9", - "0x000000000000000000000000000000a60de15e90ba1c168bf6a18c3c3999ef10", - "0x00000000000000000000000000000000002c44d1fa1e4cd66616106cdd88a57a", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000a698075eea5084f7acd85a095150ac9292", + "0x00000000000000000000000000000000001e3a5f098d47b12af2f26690ef1814", + "0x000000000000000000000000000000902b0e17d845f64f95bd415bf6e790a3c6", + "0x00000000000000000000000000000000000dd76855c5fde12df8c18daeac12ce", + "0x000000000000000000000000000000a1456dc4c4b01f1c9df3d72015a0d2ee54", + "0x000000000000000000000000000000000013a3195ccc7438c5d3200b6f24e966", + "0x000000000000000000000000000000f4b88f6cfb3e0aac00b47103841c8ab577", + "0x00000000000000000000000000000000001aa7a3a9bd157615d6f291008ed091", + "0x000000000000000000000000000000b636d5874da152de58fa6cbc410b0212e9", + "0x00000000000000000000000000000000001261245776e4cdf4ccd4d99079f2f2", + "0x000000000000000000000000000000ea7e718d5deb58a4f97a3382789bf06830", + "0x00000000000000000000000000000000001163d7e4bd4647595237ece72d3442", + "0x00000000000000000000000000000049c150c843ddca31fcdebce524c2a78421", + "0x000000000000000000000000000000000026cf800a923716c266302bf3732453", + "0x0000000000000000000000000000008b09c6914f7da24b6d6de2adc1c76ee2da", + "0x000000000000000000000000000000000000fb3f8b6fb17e9e6a1658bbfe103b", + "0x0000000000000000000000000000005ab3aea5dcaea08bb80f7ed137e0192f80", + "0x000000000000000000000000000000000005a4e65cabfbe23bca1c1c65989a53", + "0x000000000000000000000000000000b38288f2b68b81157df6c9be9d4f3ea441", + "0x00000000000000000000000000000000002a54a74db2dd7f1223bbe2a17c491f", + "0x0000000000000000000000000000002a8b33965e5ad9044d9a84600ee3272758", + "0x000000000000000000000000000000000012a2e5076bd722d64fdca0a4f8effe", + "0x000000000000000000000000000000539be2d35e1c1f977ccbee60f628e7101b", + "0x00000000000000000000000000000000001ecf20c0a7532e13491c9023002108", + "0x00000000000000000000000000000017030219502b29b77d6087584f63e1f50b", + "0x00000000000000000000000000000000002a8710ad87a3c05ed5cacf8d4108d1", + "0x00000000000000000000000000000018ca9f36f974fea905e3f37e91ea88aaf5", + "0x000000000000000000000000000000000016471423bfd9ec69b6a0a90225b0c1", + "0x00000000000000000000000000000096cd9057bf18b6f3e3a47c1ba198c5e34b", + "0x00000000000000000000000000000000000e581076722752a33e38d955bd3d99", + "0x000000000000000000000000000000afe19eb7ab1b01cb03206edf503f280c21", + "0x00000000000000000000000000000000002c4af3a8249c34e719274cc51af545", + "0x000000000000000000000000000000d39c2b6cdaf2f6b899babc3236650decde", + "0x00000000000000000000000000000000000a13aa702d358ecff2773aff90483d", + "0x000000000000000000000000000000cad946b254842248764737b3a159e7febe", + "0x00000000000000000000000000000000000d89f4659f4b92a0ad16178a70f07a", + "0x0000000000000000000000000000003cef05bb04c87e3bf2fc49eb4a8cf3a8b3", + "0x00000000000000000000000000000000000b9e6791c86a30770a222aab4a71e3", + "0x000000000000000000000000000000a944f72c15e6d4c07a9f7afc737d25230b", + "0x000000000000000000000000000000000029637e80820c79a3f1837349afbde0", + "0x00000000000000000000000000000015033e79697ff3c58fe6328c1ea89e4df4", + "0x0000000000000000000000000000000000099a0a4bc57e68502bffbb94b2683e", + "0x000000000000000000000000000000f267a94bd90100e3e0850273e0a8a13bb6", + "0x00000000000000000000000000000000002125c06918f2bd4286e85601d9d835", + "0x0000000000000000000000000000008c25e7297f35b9e584b146c106e3734aa5", + "0x000000000000000000000000000000000008b6df9d9d0c0ea380bc48310ede84", + "0x00000000000000000000000000000012d16400949298c4ed8775dbd099f604eb", + "0x0000000000000000000000000000000000046a45b2ffff0b15bccb769410f0c6", + "0x000000000000000000000000000000e7e947762d2d048ce7f6665b3baa04ead7", + "0x00000000000000000000000000000000001ea232831783a7582dcc51bf4eadbf", + "0x00000000000000000000000000000086e830c4d43c3c29749b2fc7f4b5b155ce", + "0x00000000000000000000000000000000000fda317a4ac514b23a25922bbd9a1d", + "0x000000000000000000000000000000fedab61215f4a9d23814bb5a23834313c5", + "0x000000000000000000000000000000000000b858f7229c2c222a0ab6caa1880e", + "0x0000000000000000000000000000001793dceaabd48a03734262746faff95935", + "0x00000000000000000000000000000000000a4f22db0efc68cf0df17322429f0a", + "0x000000000000000000000000000000adce0e85866dc46f5f66f47df146b685c6", + "0x00000000000000000000000000000000002a231cf2a01920132b5eab94bb7405", + "0x00000000000000000000000000000033b541568e24a22ce145ae952bf21af48c", + "0x000000000000000000000000000000000007288a618a7842270c8bcdbb60fccc", + "0x000000000000000000000000000000400d4b7c71992b27cb933430e5d1264a65", + "0x000000000000000000000000000000000016817d0b7a7a4b9b6c8a5f2ceba157", + "0x000000000000000000000000000000c7b21a1f18cf4640baa93d3f2fb65da502", + "0x000000000000000000000000000000000020a2282ed1c56eede59a639225b55d", + "0x0000000000000000000000000000003caedac6fce55f60f28b97d869da639648", + "0x000000000000000000000000000000000002031183bb12a7fecfec0492f5df73", + "0x0000000000000000000000000000000deda85dbacbaf8d5b1cf52239dd6870c6", + "0x000000000000000000000000000000000013af7b44a599c0379087cccf300fc8", + "0x000000000000000000000000000000c847575824e9ee7fe7be6d249e5660cfa6", + "0x000000000000000000000000000000000019858d6072f5df05d83eef72e0d501", + "0x00000000000000000000000000000031cbd81d9d86f8edb4f1ce8c585be3ff64", + "0x00000000000000000000000000000000001ad5009483ff80711683d9c9c1eaef", + "0x00000000000000000000000000000093b62d92a5e4e671f9ff68ef459bbe41d8", + "0x00000000000000000000000000000000002bddbd810b63e9e9c1bd43c89840ee", + "0x00000000000000000000000000000014232dd2fa6be991c87d44f36ca2ef5e44", + "0x00000000000000000000000000000000000209fcd92633224af40926d1bdb534", + "0x000000000000000000000000000000645e35183a9277848e16eb402c05de12f2", + "0x0000000000000000000000000000000000242fae97ae1bbb614d2e0d4b78a004", + "0x0000000000000000000000000000008e2da2cd9211062f76b93b0f0e732e4076", + "0x00000000000000000000000000000000000b7457323fee9a61b7747f65790906", + "0x000000000000000000000000000000ef0c941754878d36cefb2bcb1b8c02b9d7", + "0x0000000000000000000000000000000000197a92707897563b7643e7b2f42280", + "0x000000000000000000000000000000c64f9f72c79dbdf07596b8f037873f29a1", + "0x000000000000000000000000000000000002b39ad1dc0e1e02ccf298a282f134", + "0x000000000000000000000000000000d2f0b7c0fec1444279003f14d31953a858", + "0x00000000000000000000000000000000002bc6486c744d35650250409cc7df8b", + "0x0000000000000000000000000000002229681f78ecec88d895ca9ac605699c6f", + "0x00000000000000000000000000000000002906b041a9bd4056ffaa884dc30a72", + "0x000000000000000000000000000000fc9c079ed09284e2586572101690a8d49e", + "0x000000000000000000000000000000000026066cbec6b411dc55a1676017dec6", + "0x0000000000000000000000000000000278fdbe7102117c64d8d409f40ca99dbd", + "0x0000000000000000000000000000000000135353d6af44393fc6c805faff5504", + "0x00000000000000000000000000000016122ef57f9df0e6b692e636f9d26883ea", + "0x00000000000000000000000000000000002b82e72b1d69fbc47688535a91ca85", + "0x0000000000000000000000000000007aa7e5d696f811195e98bc74f5732fe602", + "0x000000000000000000000000000000000025170300af048efc7b80ee01ad0950", + "0x0000000000000000000000000000008fe6566761478873a72aa49317797e588a", + "0x00000000000000000000000000000000000cd28e457786e419c674c69531c51c", + "0x000000000000000000000000000000b11c3cabf77f3cc89b2f6f16a5909b6d70", + "0x00000000000000000000000000000000000463fed5d9336e9cefa6689837a121", + "0x00000000000000000000000000000005cf6516f4d3d8934958d1a29934738886", + "0x00000000000000000000000000000000000398aade14c4fe058031eed7009d20", + "0x00000000000000000000000000000026c7c75fc879abb769520b1f061da5141f", + "0x000000000000000000000000000000000023d40f309c37a501553e8872e78be0", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000067795c8bb8e4d065c1c07ab3cadc2a88a0", - "0x000000000000000000000000000000000006f082c65ab597245435c7c67333a9", - "0x00000000000000000000000000000041cf61b7574ed3b4437c1a058cad2c9301", - "0x00000000000000000000000000000000000174705abbd0fc53397c365c26a9ca", + "0x00000000000000000000000000000089ee6829d8b3a1a96f698988dd09bf2628", + "0x00000000000000000000000000000000002314ad42c59d31b78255e0f3898d19", + "0x000000000000000000000000000000fcae2710f830d60dbd1cf6625a01c91f62", + "0x00000000000000000000000000000000002107696d6ce53fa63967b840d7e538", "0x000000000000000000000000000000b5c1eac95b264c302dc854e6f22d7330df", "0x00000000000000000000000000000000000fcbbf9d3cf402baa3eeda5f0a9e49", "0x000000000000000000000000000000def9d58fc2920836194261f7b163fefbaf", "0x0000000000000000000000000000000000283edfda89c9480597f0b3442e9752", - "0x0000000000000000000000000000008ca9a0451964a7bbabbd9e369db7556253", - "0x000000000000000000000000000000000014567e2c3e84fc1e3e69d81f6ce580", - "0x000000000000000000000000000000d609c59feecf899f2b95aff519bbf3fb3c", - "0x00000000000000000000000000000000000378926f150c30c760965df469ae6e" + "0x0000000000000000000000000000004264681c9136a2fde7137335ef716fecde", + "0x000000000000000000000000000000000027ca9ccf01429923a61d872c7c224c", + "0x0000000000000000000000000000006df5ee4c1358443f5a14086b5196e13e46", + "0x0000000000000000000000000000000000192b1a6d3b14dfe5a9ad63951d2d76" ] - hash = "0x04f18d1cc78068fba96539ed2515afa5b226ddc16f3c53343638a10b867711ef" + hash = "0x04039ee25228755a2145821cc1cd15e67baed7a5d008f159beec6bfd18424d1a" [private_call.function_leaf_membership_witness] leaf_index = "0" sibling_path = [ - "0x0bda86e761cc9e791b05c88935d57a60d03c4da15513cc94875f1b4a5257132e", - "0x10cf52ce4f44780dc9937dace0f1d9223e2c28f785714798cdeaf1be3d152914", + "0x1dd321a6e7f97125661870111830152aafd73449199f3904d3da783c92073ea5", + "0x14a5577a8fcd6b732358c3f6295e6732907ae05ea7004399d5be652d1ebf6c59", "0x0e1ce4f11f4d51a7d3136abbd625315fff3876d322e46ad8401da96f8e43a614", "0x1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac937", "0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854" ] [private_call.public_keys.npk_m.inner] -x = "0x150dbf5d64a13fd671eaaa0681e595837780f22fe0d38ad94d9140ed061ad952" -y = "0x14544de9c05cf7c4eb10c32db726430a67dbddcebdfbf434679697eda4c7835a" +x = "0x175d325f91f136d09f7b5b30ee6e82a8720dcd4fadd87e9828a989461ffe5828" +y = "0x161bf54b24e177c5cbb154fc01a12732e92c21c5a04985cea5374033ed510b4c" is_infinite = false [private_call.public_keys.ivpk_m.inner] -x = "0x1ae2b18223ae2bfd683a51e1c47b46246aa1419cfd063dd6954d20be37c1e7a8" -y = "0x060b3f86bca6bac389c9bb6344447c592b236cf3090d5062cd18582f961edbd7" +x = "0x084470117b40e59472a550c5bb74fad0de825061d5116ea28b85d3a0b3634d9e" +y = "0x06a03b6a63d51193e916edec42b78bccf90846afa4c9987be4e3ee3462daf638" is_infinite = false [private_call.public_keys.ovpk_m.inner] -x = "0x2fefed0c2c7b3544e41b04e1ca4f50e4a23121e5db4df6b46a18151a90b69de6" -y = "0x2ab5e458c1105d879bb664e827addd79174cfe223f5ef26a957214a14bb3b3d0" +x = "0x09249dbe7627ff4d52c0487e62b399965ceb57300fad2bc7bbbd7b79ab7d44b9" +y = "0x24f2152543be84b54ba5f22bf6963471c20e444404750bbd5e7a0d66b503da2b" is_infinite = false [private_call.public_keys.tpk_m.inner] -x = "0x29a6ccd88329f0f9cbe2bf3202bde98dfb0d0ec60b7a34ff3d9366967249a642" -y = "0x087e5019dd66c4b4294a005445570e575a3517ac1c3bd62a37a30906791c2154" +x = "0x1c181f5eeddf86600e1c59df6e221cb8565df5e87f411ed76579c47fc43ce754" +y = "0x098969bc1d70e363cf0c5b76044acd6cf01e077cb70e3da7005569c39d118f16" is_infinite = false [private_call.salted_initialization_hash] - inner = "0x0048cf09401a929af76b5b21ab77a331a253552e91e2f6364db0117bae9763b8" + inner = "0x12b797eecc7e6f3aff2a5e4f784c85141d8762484adf39130aed92c17c442b53" [app_public_inputs] -args_hash = "0x17c1d44955020bd97b3df8517cc23322eb20ddc316faca6c1aa4a9975f28ac4c" +args_hash = "0x23516c9ddf3cc536b189e0d22fb5a3c577804e50a0142020f8c16affe3ecd735" returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000001" -end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000000000000000d" min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" is_fee_payer = false @@ -239,13 +240,13 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000" [app_public_inputs.call_context.contract_address] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [app_public_inputs.call_context.function_selector] inner = "0x0000000000000000000000000000000000000000000000000000000027e740b2" [[app_public_inputs.note_hash_read_requests]] - value = "0x07815728ae22eb417a33941d9ea2db173b62ea36e752e352759c2d8dfaa866c1" + value = "0x1808fa11f6b6ffdbd9f9e94a8f4c91aa954111d43f44544ed0ffbbf73ccf9a63" counter = "0x0000000000000000000000000000000000000000000000000000000000000002" [[app_public_inputs.note_hash_read_requests]] @@ -693,22 +694,22 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [[app_public_inputs.private_call_requests]] - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + args_hash = "0x0af1e29b064dedd2a9cf35f6bd87361362530e6618692827c46333566e356220" returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" + end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000000000000000c" [app_public_inputs.private_call_requests.call_context] is_static_call = false [app_public_inputs.private_call_requests.call_context.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [app_public_inputs.private_call_requests.call_context.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [app_public_inputs.private_call_requests.call_context.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000000000000000000000000000000000009462d279" [[app_public_inputs.private_call_requests]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1487,51 +1488,51 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" length = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header] - total_fees = "0x00000000000000000000000000000000000000000000000000038bd721a7d000" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004800" + total_fees = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000016771" [app_public_inputs.historical_header.last_archive] - root = "0x10b72dd1e4620ef566d12591a67a3678d2b9921902d0b0c8848c51d0add78ace" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" [app_public_inputs.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" - txs_effects_hash = "0x005da0d1417244507fda9d2c696b6f83fbc1be888d452fb3822399d176287c79" + blobs_hash = "0x0008822f60476d6dc34ec6109d3ad69dd1747a9484777021d8e717166bc7d5e6" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [app_public_inputs.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000090" [app_public_inputs.historical_header.state.partial.note_hash_tree] -root = "0x1ed67c0a1cd8518f1344cb75e530bc05611d37637eec0b148692ea5e2d57d71e" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" [app_public_inputs.historical_header.state.partial.nullifier_tree] -root = "0x016a632fba015e6dbbd777d83608c5252a31ce4c9c8c757c048cf7306faae4d1" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" +root = "0x0a639c242b766d8bd94d437483546e33c4a8c27feadf50bc4ef523e9f191e927" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000500" [app_public_inputs.historical_header.state.partial.public_data_tree] -root = "0x1e5d4d46e7c5f0c9659360ce1dbc0e56e594cfd1a7e9e65396b4cae9c15498af" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" +root = "0x2528ba08e1171e992f4744a8d8761bbe5611447c52d673882bde6a9e3b716e1a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" [app_public_inputs.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x000000000000000000000000000000000000000000000000000000000000000a" - timestamp = "0x00000000000000000000000000000000000000000000000000000000675984f7" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" [app_public_inputs.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [app_public_inputs.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [app_public_inputs.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -1542,9 +1543,9 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [app_public_inputs.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [app_public_inputs.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-init/src/main.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-init/src/main.nr index 1553c4a86fa..1192e49cb74 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-init/src/main.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-init/src/main.nr @@ -9,6 +9,7 @@ fn main( vk_tree_root: Field, protocol_contract_tree_root: Field, private_call: PrivateCallDataWithoutPublicInputs, + is_private_only: bool, app_public_inputs: call_data(1) PrivateCircuitPublicInputs, ) -> return_data PrivateKernelCircuitPublicInputs { let private_inputs = PrivateKernelInitCircuitPrivateInputs::new( @@ -17,6 +18,7 @@ fn main( protocol_contract_tree_root, private_call, app_public_inputs, + is_private_only, ); private_inputs.execute() } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml similarity index 92% rename from noir-projects/noir-protocol-circuits/crates/private-kernel-inner/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml index c7aeeec3fb3..491eb826213 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-inner/Prover.toml @@ -1,215 +1,216 @@ [previous_kernel] -vk_index = "0x0000000000000000000000000000000000000000000000000000000000000003" +vk_index = "0x0000000000000000000000000000000000000000000000000000000000000002" vk_path = [ - "0x1c17b99295850f5efe7c6257d8aaf1193b3e577fef1918232147773d8a027465", - "0x1867f6023f71543c6d9ad5a6534a4c57456da8c19d233e2312c0d2d1ac3fb1a3", - "0x21fbbc9f502a3205540d50985dc44518d3ea76a0441c31f850d06ae327f04b14", - "0x16689f45f3440063faf62389449732a5d04a721e5133f1d532400d2f690a7af3", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x0a889b72ac9f79e9a8c4c5934e62f265fe1b862799220c8fef796558ef921a6f", + "0x2788666fcc1fce27d0ac10e13716483d548ddc3411f466e5caef85cea2384902", + "0x281a8c9b2c044cffa01e5f56858d1d71aa11c4b28a1e90407565ca646ea0ee5d", + "0x25e71fd64ecaa6b98ef492c6d93da8164a259284041220c258edb94fe47706ab", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] [previous_kernel.vk] key = [ - "0x0000000000000000000000000000000000000000000000000000000000010000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000001e965c85", - "0x0000000000000000000000000000000000000000000000000000000023c1ca18", - "0x0000000000000000000000000000000000000000000000000000000031d68272", - "0x00000000000000000000000000000000000000000000000000000000679ec723", - "0x000000000000000000000000000000000000000000000000000000008df6ae9b", - "0x000000000000000000000000000000000000000000000000000000006a4609af", - "0x000000000000000000000000000000000000000000000000000000005b9b5343", - "0x00000000000000000000000000000000000000000000000000000000eb2cb8e2", - "0x00000000000000000000000000000000000000000000000000000000bcf6f48d", - "0x00000000000000000000000000000000000000000000000000000000123862d7", - "0x00000000000000000000000000000000000000000000000000000000f524ad21", - "0x0000000000000000000000000000000000000000000000000000000028fbc96e", - "0x0000000000000000000000000000000000000000000000000000000078f8ee90", - "0x000000000000000000000000000000000000000000000000000000008bd64fb7", - "0x00000000000000000000000000000000000000000000000000000000c8a418db", - "0x000000000000000000000000000000000000000000000000000000002b424553", - "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000100000", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000074024e079dd9967040b15a853728072118", - "0x00000000000000000000000000000000001cc53339c5f3734eb1ddd34668ce3f", - "0x0000000000000000000000000000009e864693f0d79ce021021d8d93980aabce", - "0x000000000000000000000000000000000025524eb8da6a0478cd1452d9a1a7d7", - "0x00000000000000000000000000000005d4c914b37f6d72056a3c39b5de5da57c", - "0x00000000000000000000000000000000001e782a51c46c44c16a6252b079c650", - "0x000000000000000000000000000000d6facfe4f462e1f645edf8316e09bf97e1", - "0x00000000000000000000000000000000001960f20e0cd2b6862e494809028ec3", - "0x0000000000000000000000000000000da5e26de2552572c513a24f0380509270", - "0x00000000000000000000000000000000002e9b7ba661af740c3edaf32091d64f", - "0x000000000000000000000000000000713b71ba2038895044caec9d3f4c860cb2", - "0x00000000000000000000000000000000002985a17a800d8e90394d0bde10f0de", - "0x0000000000000000000000000000005d640919f822d5abc1ccca1cfa002ec160", - "0x000000000000000000000000000000000021be21f1d91678b87d67c55b51bd79", - "0x0000000000000000000000000000002575f01393f6f41b6e345ccf68575d0b28", - "0x00000000000000000000000000000000002b7ab4147fc2f6b9e19c81d59f276a", - "0x00000000000000000000000000000075d6754f9378e781762a463206bc74300a", - "0x00000000000000000000000000000000001dcd708042e9b60449b1f2fcc25ac3", - "0x000000000000000000000000000000acd62334dc3a247e1b630447a53e3d4dee", - "0x00000000000000000000000000000000000c359c90b7f8ad5152f0a66d281ed7", - "0x00000000000000000000000000000051ccb8a1e61f2b5547bdbf68dc958caa2b", - "0x000000000000000000000000000000000006f5e8330db77175608147ead48b49", - "0x00000000000000000000000000000049debd542e4299d3f6c4ccf933f61ad454", - "0x000000000000000000000000000000000025bfc7acfc5452d7be93872193b584", - "0x00000000000000000000000000000098f70e0f6d607c8885181f8c9461b0d0cd", - "0x00000000000000000000000000000000000d6defd5d6b35fad5c910e0f3bb7bc", - "0x000000000000000000000000000000401faf2eec00ba744fb38151355ca11ec1", - "0x0000000000000000000000000000000000202a3b449ef80b3454295c322f6141", - "0x000000000000000000000000000000bbfdc0fc558565254b4756652c8a2fac0d", - "0x00000000000000000000000000000000001632677a0a775fef0103bb444cd952", - "0x000000000000000000000000000000ea9ad4e123c9b9946b56c420c878242f89", - "0x0000000000000000000000000000000000241d3c6b783b65256ff89c6edcaead", - "0x00000000000000000000000000000068069ba562545bc5db3bcfc846633aceca", - "0x000000000000000000000000000000000016558f942f2d51cffd4730664ac8db", - "0x00000000000000000000000000000050d38ed08dc0d200812abbdf8c2f38381b", - "0x000000000000000000000000000000000014153c6b36b8b66e7e81bd0fe98063", - "0x00000000000000000000000000000038d694cfae00c24db6eb90a942f679f70c", - "0x00000000000000000000000000000000002e355b889018b05e0994fd038d4fde", - "0x000000000000000000000000000000bb8b77d9cbe50bac34e48e3433ab8e2de0", - "0x000000000000000000000000000000000015343bbd7f66f1dff3c86ba64c19b6", - "0x00000000000000000000000000000063eddb9c7f3088817c7cb9a80fcfa8f053", - "0x00000000000000000000000000000000002ac5c6bf0e5b5860d4dfc0a8d6c218", - "0x0000000000000000000000000000001b85e158012b760b801f5d2c043f6b90d1", - "0x00000000000000000000000000000000001ad84f9d6e4122881acdaae31e9a4e", - "0x0000000000000000000000000000002de3b96f6383921203fe809165ce1b58d6", - "0x00000000000000000000000000000000003035a65b38821d6d75337268664e83", - "0x00000000000000000000000000000036df9de596ca7166a1b2c3f64beac93ff4", - "0x000000000000000000000000000000000017ba88f448de144f4cd51a8ee7e713", - "0x0000000000000000000000000000001bbc3c8560163afa15e75b847338ab2ebc", - "0x00000000000000000000000000000000001a0d00887d6792b992e4b8537b3eca", - "0x000000000000000000000000000000f4d2592cd2e8cccc1eb9f860d9cc9c1027", - "0x00000000000000000000000000000000001de3c6a0c9c955f547640b9ba2f7b4", - "0x0000000000000000000000000000003cef2754bbb0604a3f894cf236a084d501", - "0x000000000000000000000000000000000001d3188f1d9a3997c1f33de933561b", - "0x0000000000000000000000000000001f565e88f37195ae6b293f1d55b8677a04", - "0x00000000000000000000000000000000000c87495f25e75937a3f5d5d20b0b58", - "0x000000000000000000000000000000e409d030dcda1b95832685fe49a0343ac6", - "0x000000000000000000000000000000000000b2a07da2e2978a42d3d663ce8890", - "0x000000000000000000000000000000f08ba0ef9f4b8f8cfe5b34dccbe35e6ff7", - "0x000000000000000000000000000000000000ae86b233c316efe3d52f106819dd", - "0x000000000000000000000000000000e30b0f5a4ee208f12c33bb0934814486eb", - "0x00000000000000000000000000000000002ceed799a468cb0cce2e15540bdb15", - "0x00000000000000000000000000000042820b6f1c2e1905d8043db196ef1afcd7", - "0x00000000000000000000000000000000001e88e8a82abc06de466ccb22502ffd", - "0x00000000000000000000000000000008a88619847ef5d5555cc8fcbb6f0049fd", - "0x0000000000000000000000000000000000199b373c92e111da8e96fbad5411d3", - "0x000000000000000000000000000000c31927349edd57e1c4530d30e5377673fb", - "0x000000000000000000000000000000000015f35446b555995f3b52af0643ec8c", - "0x000000000000000000000000000000c656c645ce779642b2da9d044185de68c5", - "0x00000000000000000000000000000000000e1316e7640c78ed5b5907603efca9", - "0x0000000000000000000000000000005789f66266190bf3d9666deaa3d180e6d8", - "0x000000000000000000000000000000000000b5959aa475dadbd307665deb7d0d", - "0x000000000000000000000000000000cf4b027acaabe3e60d954ae2e4baf7f1b5", - "0x0000000000000000000000000000000000287e447454af8d44ec2ccc5a0971f0", - "0x00000000000000000000000000000027246442ac3aa21c262330201cfe8684ee", - "0x00000000000000000000000000000000000f29e3a097fbf473ae4d36cc00c073", - "0x00000000000000000000000000000022da8d50e0fd2c17c49bfc64aee07c361d", - "0x00000000000000000000000000000000002e180c7fc80909b0d463685f69242d", - "0x000000000000000000000000000000e41a3b2130bccaef8f0946ab3e43670c40", - "0x00000000000000000000000000000000000ec09c8cae8323f41a6c1a6dac30dd", - "0x00000000000000000000000000000064e1de32ea23e296790bf3557495fa9cd9", - "0x000000000000000000000000000000000000558244d2d9af8990e2725c48cfa9", - "0x0000000000000000000000000000004b22f532a8c4a53859923eef554b2e8670", - "0x000000000000000000000000000000000025182a1e5d23bf869d6c6944ca894e", - "0x000000000000000000000000000000a28f3fbf04a5844ca5b1aca5c6d9cb30c8", - "0x000000000000000000000000000000000016796b6f5ab852d2c27da9f69e18dd", - "0x000000000000000000000000000000f6b4245f76b5a714942abdf74a4524561d", - "0x000000000000000000000000000000000021f1d865c282c433255ddfae6bbfad", - "0x000000000000000000000000000000706955c206990d792f637b6078f615eda1", - "0x000000000000000000000000000000000019a6d36a2feff9bae37378a92abb28", - "0x000000000000000000000000000000656697aa0c1d5fd99f39eb4a2b1628dd04", - "0x00000000000000000000000000000000002b537e0756a357b71f2dcf5ec0a2aa", - "0x000000000000000000000000000000692136362f6d1f4d425b9f0ab108472221", - "0x00000000000000000000000000000000002545045bac7e6023a329535cd37207", - "0x000000000000000000000000000000ed300b801a8bad905b5c1eef277532dff6", - "0x0000000000000000000000000000000000008247821a1c4b6b5dcce33cab7cea", - "0x000000000000000000000000000000a864cd31e6fd0fad0757ea697e2c158ca1", - "0x000000000000000000000000000000000026a578b6f065f4de6ea88088703e11", - "0x000000000000000000000000000000c885b51a2922a5f39f5f498d79620fc14c", - "0x0000000000000000000000000000000000277c03bdf386a0f78ab57602ae4761", - "0x000000000000000000000000000000895e363e0ec3a10bac5c9159495803fb84", - "0x000000000000000000000000000000000013b6cd9ee2401e0b569e155e9fb4f7", - "0x00000000000000000000000000000016e12cad61f9bb5fa728cf28ced7cba5c1", - "0x00000000000000000000000000000000001fcd3ef5d518990bdc35d6041d5e1f", + "0x000000000000000000000000000000bdb8660741b22e5395cf00707303a0e4c8", + "0x00000000000000000000000000000000002266b354cecbdcd902681044894a40", + "0x00000000000000000000000000000091dbe6a75026367f305570bb6d89ffd01a", + "0x00000000000000000000000000000000002df3821751607e164aac7a0f1e988a", + "0x000000000000000000000000000000a0d7c77a0348ffd2a3d7d0581e1f6e135b", + "0x00000000000000000000000000000000002f036e9b41e66011a655a1c7d2311d", + "0x0000000000000000000000000000007403d15119a43b300f9c2ac0cd70e3ca32", + "0x00000000000000000000000000000000000b0dab18c4ab6483313257848783af", + "0x0000000000000000000000000000000d54a8d88b562565d66de776cdf643c0f0", + "0x0000000000000000000000000000000000130261a5af72d3f78c0d3010922443", + "0x000000000000000000000000000000e14e72474d15d503b27bb52fa006c3f695", + "0x00000000000000000000000000000000000d296a70c531e671c30c89a0385998", + "0x000000000000000000000000000000138d63a21f7617000e69d553510dbf0732", + "0x00000000000000000000000000000000002652790fab7c8c9fb84430f9dabf4b", + "0x0000000000000000000000000000009c5b9cb7588749b754a396655371eeb5b6", + "0x00000000000000000000000000000000001f54ffb7a5861a48cfd0eb06d2e7ed", + "0x00000000000000000000000000000055d8a96d4c53a2e49482208646aeea7d48", + "0x00000000000000000000000000000000000e859d51221c006931b23eff9e41eb", + "0x0000000000000000000000000000006187dc541ee307c50471c643b69c48655d", + "0x00000000000000000000000000000000001ef8708f693f87ad5c769966aa5d2c", + "0x00000000000000000000000000000026afb3476659464895e3958e99f1c96f3e", + "0x00000000000000000000000000000000001003d236df13109f69e5197c80fa40", + "0x000000000000000000000000000000db97c1d2a0b2dac79c02cc8a2a78241c9f", + "0x000000000000000000000000000000000005b0d5a1f330ed1b52bfa4f60c6a70", + "0x000000000000000000000000000000370e33673be61a8764bbf6146285166ec0", + "0x000000000000000000000000000000000019852450b5c11f8a30a211ef326032", + "0x0000000000000000000000000000005a23caff4441e0422506d8e723b8a7df0c", + "0x000000000000000000000000000000000007dfb5c3da9c3785a97694a386d52b", + "0x000000000000000000000000000000163ab938fa99acf8fb18a3932ac86c0ab9", + "0x00000000000000000000000000000000000bc533f878640075d319513683e78b", + "0x0000000000000000000000000000000c0d9e5d79b2e1ec0fa93e17248d6996a7", + "0x00000000000000000000000000000000001aacf7a929cbaf57bcaae75a2fda0d", + "0x000000000000000000000000000000f012ee85ba4f7291ae8d67836381c52de0", + "0x0000000000000000000000000000000000302ae5d46e8b8dd08c8eb9f2efbff9", + "0x000000000000000000000000000000c3585cbfb93c8c90bdae7692f2636e42ba", + "0x0000000000000000000000000000000000098b254b6c438b1e6a0c872a21a3db", + "0x0000000000000000000000000000008283e6ad48f41eeadadeae2c02f4fadf44", + "0x00000000000000000000000000000000001cb3cdb38a62d0033d2afd233b8940", + "0x000000000000000000000000000000bb5e9a1635fe20062208fa2a10999a62ee", + "0x0000000000000000000000000000000000169029b757a992e183a19bbf71ba26", + "0x00000000000000000000000000000074a419c349bdc6348b0b9adcc827856d09", + "0x0000000000000000000000000000000000295b0410acc9ae763804d3a5435a8c", + "0x00000000000000000000000000000085a05861f709d5eddef694cea642ffbbd2", + "0x00000000000000000000000000000000000054f63cbfb675285771f5cee257db", + "0x00000000000000000000000000000032ae6474dfe95e5012c2153ddd686f5f9e", + "0x000000000000000000000000000000000004f2f7ac11ee3e22d13dfe52157e39", + "0x000000000000000000000000000000f4e53bd173ab4dcc66ec752d663fd3e088", + "0x00000000000000000000000000000000001fee153e7e029bae80a357547d36ec", + "0x000000000000000000000000000000bbe500b1fdd6f919a3d086eeabb7274fa0", + "0x000000000000000000000000000000000004195cb88ad976cb0be546ccc955b9", + "0x000000000000000000000000000000767a7a1e09af613c44cb79195452540e2b", + "0x00000000000000000000000000000000002c66c96813190de991b3d56b1389c3", + "0x000000000000000000000000000000d24f0a0cf38ca9316be400c743bbbb3bec", + "0x000000000000000000000000000000000027822ff7bb9483b29df97785ee5f9d", + "0x000000000000000000000000000000468d47d31fb480e2c192ddb6673e5cbea8", + "0x000000000000000000000000000000000001d6ab1aaf7944c2be04aea4060d71", + "0x000000000000000000000000000000df89af614d1302d28d8f2f6e77e629dae3", + "0x00000000000000000000000000000000000c614fd715cadfbe1020a2c51a0e36", + "0x0000000000000000000000000000007544d6bb83b52ab4563d3065283da2dd82", + "0x00000000000000000000000000000000001e0f70f9633083be89ddad18d65bec", + "0x0000000000000000000000000000006d4bb2fac93fe99fd8ecb5dd6c084683d0", + "0x00000000000000000000000000000000002a549eeb5211fbb0e1eba68b77f250", + "0x0000000000000000000000000000001a7dc8d0631a266642a2f6568f1ab25039", + "0x00000000000000000000000000000000002ceb12947ea1786013a46163d60f9d", + "0x000000000000000000000000000000bb181c2111d296ec712e24876a9e17b290", + "0x0000000000000000000000000000000000031ae8eff97ebe7a6137ae4f19cb92", + "0x0000000000000000000000000000000074f9eebc9b8da31320f7b65bebfb5b16", + "0x000000000000000000000000000000000007164f19e5c047c1f1df60850b8851", + "0x0000000000000000000000000000008c20f837c5b831a4e4cca2e5e3797628d5", + "0x00000000000000000000000000000000001bec99c63538ce35dd4d9a702db5fd", + "0x0000000000000000000000000000007900304a2c97c080d35843a6fe3bffc41d", + "0x0000000000000000000000000000000000115df5e5cd01f3cd8447ac1a8abc9b", + "0x000000000000000000000000000000ad0e4d84f585e1887c7aad232fd3060eab", + "0x000000000000000000000000000000000006ca86ad7d5f868b9ffba04f9201db", + "0x000000000000000000000000000000fb3976491af8495625d43818e7bae726ed", + "0x0000000000000000000000000000000000067b3d5dace1ea73eac1d3af2a6ebb", + "0x000000000000000000000000000000a68ed47659e767bb5c822514b9f439085a", + "0x00000000000000000000000000000000000511a4b4410521c27534b4aea4a451", + "0x0000000000000000000000000000003f7d9f327f15b00f8ede106392fe793a85", + "0x000000000000000000000000000000000024c5dfa3f030bdcf2c11320c0a222e", + "0x00000000000000000000000000000034e161a6743254fa3244d07d1930d1e1c9", + "0x0000000000000000000000000000000000095840cec5bec315796d34281c391e", + "0x000000000000000000000000000000346d4b8700fb7fb7f109dc4ad34d181502", + "0x00000000000000000000000000000000001d42289e290e17dae176e4db0cfdee", + "0x000000000000000000000000000000b97b4d7fbcfcc599dea5de717113099c41", + "0x000000000000000000000000000000000008c140ddf2bcdc25c47a7e0a1f775d", + "0x000000000000000000000000000000e6b230b09e3803ef5860b718006873291b", + "0x0000000000000000000000000000000000285cb5b457d1e20dea2f9863ee5245", + "0x0000000000000000000000000000003acc6def4164d878b56e5b2fe2bfa52199", + "0x000000000000000000000000000000000022cf69996ae471056bcae7b3c38cbc", + "0x000000000000000000000000000000239623839c51be6ffe83c77c80b8f94ad5", + "0x0000000000000000000000000000000000075cc2c3c9e3079bec86764aa5cfd0", + "0x0000000000000000000000000000008c88b485298919bf7164440942d6f6c5ad", + "0x00000000000000000000000000000000000c5dd6e29eac9076cc2f5995fcf27c", + "0x0000000000000000000000000000005b7ac436f888999a48f79ef212e6483f14", + "0x000000000000000000000000000000000009fc56f5a2122d1ed9353860ba68ab", + "0x000000000000000000000000000000dace4e23bf41b55e3098bd8e82e74b1c1e", + "0x00000000000000000000000000000000000883499c226658d83b4d0cc7b08c15", + "0x0000000000000000000000000000005c0373d8b286bf727301571a54e1636e77", + "0x00000000000000000000000000000000001f268c0945bdea494fbfc52e8581c1", + "0x000000000000000000000000000000c6b7e770c1e62e2504ce986f21324ff939", + "0x000000000000000000000000000000000001b92f92042ae2556e31cf72cc3990", + "0x0000000000000000000000000000007007220c2c02f4ec2c1c5fada9056b8c37", + "0x00000000000000000000000000000000003038ffe6284e174445a0eb11a63e0b", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000de7040de6380b5f13c857a7bc546596cec", - "0x00000000000000000000000000000000001e6ec2009f0164242d5a547450badd", - "0x000000000000000000000000000000f97b381745236c55008b2c28db506e2f49", - "0x00000000000000000000000000000000002147efeed610a043eda6c37a26a27e", - "0x000000000000000000000000000000b5c1eac95b264c302dc854e6f22d7330df", - "0x00000000000000000000000000000000000fcbbf9d3cf402baa3eeda5f0a9e49", - "0x000000000000000000000000000000def9d58fc2920836194261f7b163fefbaf", - "0x0000000000000000000000000000000000283edfda89c9480597f0b3442e9752", - "0x0000000000000000000000000000008ca9a0451964a7bbabbd9e369db7556253", - "0x000000000000000000000000000000000014567e2c3e84fc1e3e69d81f6ce580", - "0x000000000000000000000000000000d609c59feecf899f2b95aff519bbf3fb3c", - "0x00000000000000000000000000000000000378926f150c30c760965df469ae6e" + "0x0000000000000000000000000000008344e7cd358bb008fa2594f42e2058a4da", + "0x000000000000000000000000000000000028d98153e26aa139c5f995a12d6b82", + "0x000000000000000000000000000000ebbd996ba82dd482c0cd9f93dba5c948f1", + "0x00000000000000000000000000000000000abbbdb042fe5de7714689b4b198cb", + "0x0000000000000000000000000000006241ca0c75be2d15e6b9188983d6b41e2d", + "0x00000000000000000000000000000000001a71ab9767b295f9337074850d2d40", + "0x000000000000000000000000000000ec7f970d2da2ca7f41836eb044f5a75b01", + "0x00000000000000000000000000000000001a9a63c00430414d47f85b2352b1d7", + "0x0000000000000000000000000000004264681c9136a2fde7137335ef716fecde", + "0x000000000000000000000000000000000027ca9ccf01429923a61d872c7c224c", + "0x0000000000000000000000000000006df5ee4c1358443f5a14086b5196e13e46", + "0x0000000000000000000000000000000000192b1a6d3b14dfe5a9ad63951d2d76" ] - hash = "0x2f3154da5d44e350196dbee4f92a7f45ad5de77f60e166d763413dbea9a7f0bc" + hash = "0x0adf52c61cdf9eff768b463c554a67f3cac73b0c1cea2d3fcee90db3d7fccc20" [previous_kernel_public_inputs] min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +is_private_only = true [previous_kernel_public_inputs.constants] - vk_tree_root = "0x1670ae061c166e83659fcd052460c6cce31d3b57fffaa427d421f47b5102e13f" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [previous_kernel_public_inputs.constants.historical_header] - total_fees = "0x00000000000000000000000000000000000000000000000001390723b0ae9bdc" - total_mana_used = "0x000000000000000000000000000000000000000000000000000000000018d25a" + total_fees = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000016771" [previous_kernel_public_inputs.constants.historical_header.last_archive] - root = "0x20e7c0a4ec7dd65a2d372d97cff40ef24f6ace2b69a7f2e75e6e38345d04156e" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" [previous_kernel_public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" - txs_effects_hash = "0x00f568bf6779b4e792307d1669e1c2310a152a48765914e444318d46b64df78e" + blobs_hash = "0x0008822f60476d6dc34ec6109d3ad69dd1747a9484777021d8e717166bc7d5e6" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [previous_kernel_public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000070" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000090" [previous_kernel_public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x0b5a7c1b586e5d9912483bac3c3978275313397bb7ce2a21e49f6501f2f6ff40" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" [previous_kernel_public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x0f0bea91ac18f935a883cbee97bb2545ee979636584a1259ad257fb4d6162c7f" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" +root = "0x0a639c242b766d8bd94d437483546e33c4a8c27feadf50bc4ef523e9f191e927" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000500" [previous_kernel_public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x1e5d4d46e7c5f0c9659360ce1dbc0e56e594cfd1a7e9e65396b4cae9c15498af" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" +root = "0x2528ba08e1171e992f4744a8d8761bbe5611447c52d673882bde6a9e3b716e1a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" [previous_kernel_public_inputs.constants.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000009" - timestamp = "0x00000000000000000000000000000000000000000000000000000000675984df" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" [previous_kernel_public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [previous_kernel_public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9c6ebe66" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [previous_kernel_public_inputs.constants.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -220,12 +221,12 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [previous_kernel_public_inputs.constants.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [previous_kernel_public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [previous_kernel_public_inputs.validation_requests.for_rollup.max_block_number._opt] _is_some = false @@ -233,19 +234,19 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] -value = "0x09e69d1e767f980a045f8e2cd01759ead0ea0ddc41e6ea9e3d468d08417590ef" +value = "0x1808fa11f6b6ffdbd9f9e94a8f4c91aa954111d43f44544ed0ffbbf73ccf9a63" counter = "0x0000000000000000000000000000000000000000000000000000000000000002" [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.contract_address] -inner = "0x2884fa1816fa277e0032ea572e53684ee247ca8048d9460e9971352262ed311b" +inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] -value = "0x00e7c558ed2d7d35f9d6cb66e921cecb8e50213f3ce6f24ebe19d3d2fb06fe77" -counter = "0x0000000000000000000000000000000000000000000000000000000000000009" +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] @@ -745,11 +746,11 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.nullifier_read_requests]] [previous_kernel_public_inputs.validation_requests.nullifier_read_requests.read_request] -value = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" -counter = "0x0000000000000000000000000000000000000000000000000000000000000004" +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.nullifier_read_requests.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.nullifier_read_requests]] [previous_kernel_public_inputs.validation_requests.nullifier_read_requests.read_request] @@ -1257,18 +1258,18 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators]] [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] -sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000030" +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0ececb1ae62976ca0e0e1ba1f414bfde52313ef3a5b655f106b48bcf01dbb4ee" + sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x150dbf5d64a13fd671eaaa0681e595837780f22fe0d38ad94d9140ed061ad952" - y = "0x14544de9c05cf7c4eb10c32db726430a67dbddcebdfbf434679697eda4c7835a" + x = "0x0000000000000000000000000000000000000000000000000000000000000000" + y = "0x0000000000000000000000000000000000000000000000000000000000000000" is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators]] [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] @@ -2221,19 +2222,19 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] -value = "0x26549bd453f923d80b3caeb30b018cd36b151ac153f1ae9b7074000c464de05b" -counter = "0x000000000000000000000000000000000000000000000000000000000000000b" +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.note_hashes.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] -value = "0x1a93ff4db2135762aac6aad79f1a616227b253168c31e20fb925eafbcc6365f4" -counter = "0x000000000000000000000000000000000000000000000000000000000000000d" +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.note_hashes.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] @@ -2733,7 +2734,7 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x003b93a2691bd05ab7b15e711e03a43325d83b05116d8467b1ac70bdf6ff81ff" +value = "0x1e4c23d7a900532cdb5687c5806be8da481285afb0abbbe8a3801d71451d08d8" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2742,21 +2743,21 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x2a4aafecb6176267444ebd9e93a1f1e80103e23794eb61e93e2aab995b10b7e0" -counter = "0x0000000000000000000000000000000000000000000000000000000000000008" +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.nullifiers.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x21d7abf387b3e4cad2a97adcb029fe0ab2833e8ec4577742d3928aced9ee5525" -counter = "0x000000000000000000000000000000000000000000000000000000000000000a" +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.nullifiers.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] @@ -3397,63 +3398,63 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] -note_hash_counter = "0x000000000000000000000000000000000000000000000000000000000000000b" -counter = "0x000000000000000000000000000000000000000000000000000000000000000c" +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x2a2ccf020dcc97a53aae5833431183c58b074540867bd3c06d0f987d61121532", - "0x002ac4043cb97821136c5c4a87c1a30469c024793b4e4f98ca77ed600f833824", - "0x00c41b1744aa9ceae3b076945cfd54ef9419a7e04328cb4023977ad1000ffdf5", - "0x001a3121fe08a4bb3b5102cdb581cfbc88761100000000000000000000000000", - "0x000000485c9d2181867dc4378aabf3319724c2821bae167ec5ad04b67126ef81", - "0x001ea8a7cc12ab3b7f2024ba54c8cd52adf9ff60090e4760e414906810b95e44", - "0x00dfbda68d27c50a7be2d27770df6a90c85b0d5a8979c365b221ee78a405c14e", - "0x006b3eff15aa42700c18445f0c24e629da3222cff607e4783f773316517b2bad", - "0x00e8bf4f2c8b22947742ff4f567236e5a4ad56dddf125572626784b97bc8aefa", - "0x002390bc1745b1d052ac60d8e2cb637a21d4b5e4b47c14e9914ef5b6461a84d7", - "0x00fddf1e7d3e665ea0106c1abef892a59403ee4b9fe5ddca7558822770bc73fc", - "0x0055c64dd036e6b293d609ae3407dc351fbfe1b89892c42d02bdc6d18b4ecbeb", - "0x006731c1847d3bae9cc303860b40f9157911a46ce396da2995256f92880d6bc3", - "0x000231953aad7b8140f8fab5111c51ad51f1e6051f0845be06d6b28e7da33a64", - "0x0032e84f69936e7c51492d05a3faeaab49f8a9439551a5617272fa2ccf7518fe", - "0x00d0589fe10ae6b708e96bc2f1e90df059b1df3898ad9a35260ac7017fe3f535", - "0x00c6dfdf06af4884cfe5a32daf22cb3f59b6f97f186964b9084d4ead0bc02c4a", - "0x00ef26c1026baf0da13d6cfc5a32bad373e7de052d6e43097456054236f5593f" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] -note_hash_counter = "0x000000000000000000000000000000000000000000000000000000000000000d" -counter = "0x000000000000000000000000000000000000000000000000000000000000000e" +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x011e6a1d0e0f0540856e72dcd63fb656cbb62903c11371385e0d0aa9b4669a68", - "0x001463a3c3fa98f7c783dc3de21be54a2e4c70e01b9809c667dd5e0b6936b275", - "0x006818af286742bb96fc7cb155c8f41bb58245180edad3a30c020f89386be5d1", - "0x004cbc11a61a532a1803093ba8a020e8633a0800000000000000000000000000", - "0x00000055eae4c94b22d3f9aae30518c1a49daacd1045106c309a4a35f39ff31b", - "0x009ac509b11c2808afd3ad83dfb2b1cd2f55819590900203a3a0f8823f3b08c6", - "0x001c4e0bae46531c38a62faf382537e89b65c9cd41e9bb2da4fb2593fe4860c2", - "0x00798f97290b20c1256a6be605b0dd99e525d7aad02102463c1e9ddf0dda76b6", - "0x0092689bedcd5183a211900818e376675186ab07c4bbb17f47d4f355783e304f", - "0x0035b74e0fb27ead69341686aa3e3f811f235f376f129fea5272a2db90976252", - "0x007350d34ff89f5b0fd498de736eab96c4e67e34e6d17a578b3d5b8e0dceba0c", - "0x00ec9f24e2b699d266ad6de93aff57597825c920ddbcbf3273c79639238463b5", - "0x00e651e4971cd37e7f2cf8a0b30e98649268ea73ffec2091ff896ac1c1543c50", - "0x003e6036cd933c07918b3c256c80424ed474285c4d91fa8378c4afd187c8cfc3", - "0x00e9007a2dc543d0452fe3c0171e32c78a1ea66f1801b4c992a249ee2b236f8c", - "0x00c2130f9df2e967a32eef1934c84a03f1d2efe251ff6ba535149b0b9188779e", - "0x009ca9745e528e2743d341acc179f21c81dd6ff4b2c58ae9016787eda456629d", - "0x00e4e501a02e7a424aa5aee80637b71b32c38804b2d6ea9250905217465cd07e" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [previous_kernel_public_inputs.end.private_logs.contract_address] -inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] @@ -4877,22 +4878,22 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_call_stack]] -args_hash = "0x05b8b2675b3840bb280f9ed06ae211d62805db7c6b6411e07f2c5f99c3853d87" -returns_hash = "0x0abe801b19f8d5462d186f6bfa961b5c5274080d93a33e57064eec4e0591f6d7" -start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000005" -end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" +args_hash = "0x0af1e29b064dedd2a9cf35f6bd87361362530e6618692827c46333566e356220" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000000000000000c" [previous_kernel_public_inputs.end.private_call_stack.call_context] - is_static_call = true + is_static_call = false [previous_kernel_public_inputs.end.private_call_stack.call_context.msg_sender] - inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [previous_kernel_public_inputs.end.private_call_stack.call_context.contract_address] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [previous_kernel_public_inputs.end.private_call_stack.call_context.function_selector] - inner = "0x00000000000000000000000000000000000000000000000000000000c7784917" + inner = "0x000000000000000000000000000000000000000000000000000000009462d279" [[previous_kernel_public_inputs.end.private_call_stack]] args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -5037,8 +5038,8 @@ end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000 inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [private_call] -contract_class_artifact_hash = "0x227923b97aa63a19d8bf1172a6165f896cd1db0f15fac550f96c5fdb0e05de62" -contract_class_public_bytecode_commitment = "0x0000000000000000000000000000000000000000000000000000000000000000" +contract_class_artifact_hash = "0x0424707a0cdc4d897d1b49d429215da2458ac13b12eff665fb9257768657cad1" +contract_class_public_bytecode_commitment = "0x21ccd598b3f1e106121adb5c23e2a6013bf5f8fa6e4f8711c540bd350971ce83" protocol_contract_sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -5048,190 +5049,190 @@ acir_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [private_call.vk] key = [ - "0x0000000000000000000000000000000000000000000000000000000000010000", + "0x0000000000000000000000000000000000000000000000000000000000100000", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000000000000000000000000000000070c235e", - "0x0000000000000000000000000000000000000000000000000000000008e84fbc", - "0x0000000000000000000000000000000000000000000000000000000047c2c261", - "0x000000000000000000000000000000000000000000000000000000002bd345be", - "0x00000000000000000000000000000000000000000000000000000000d6763312", - "0x0000000000000000000000000000000000000000000000000000000063f04af5", - "0x000000000000000000000000000000000000000000000000000000005300de2e", - "0x00000000000000000000000000000000000000000000000000000000fb3280eb", - "0x0000000000000000000000000000000000000000000000000000000010815d2a", - "0x0000000000000000000000000000000000000000000000000000000006d0b6c9", - "0x00000000000000000000000000000000000000000000000000000000f50e3d58", - "0x000000000000000000000000000000000000000000000000000000000b095acd", - "0x00000000000000000000000000000000000000000000000000000000a99eae65", - "0x0000000000000000000000000000000000000000000000000000000052ef5716", - "0x000000000000000000000000000000000000000000000000000000001b9421f0", - "0x000000000000000000000000000000000000000000000000000000009b866525", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000003d9bdcdcbf430a507cc9f8ae201b99d816", - "0x00000000000000000000000000000000000933a87d8a5ac733f6b01ef3796592", - "0x000000000000000000000000000000e35ac47866dd7cf4d871f9483744b18276", - "0x00000000000000000000000000000000001df5a33454fe6b1dc617766782e2b8", - "0x000000000000000000000000000000cb6d315636f99a83752b69990bdaf788d6", - "0x00000000000000000000000000000000001e45b394e139696de0306dd4d15e42", - "0x000000000000000000000000000000846d0e9c86238e694a88a8daa9a51afd13", - "0x000000000000000000000000000000000026b10360b3d8c32fc1bc926db16214", - "0x000000000000000000000000000000a9fdd74f827e8b93e2854974b6930f7c3b", - "0x00000000000000000000000000000000002c59ac7fae62c810001910ddeaee4d", - "0x000000000000000000000000000000e8a34b574c576ea437d5fede74437b74fc", - "0x00000000000000000000000000000000000302e48aca30ee32d8232313ff0213", - "0x000000000000000000000000000000584330fdeb11b2c75a7fe21ac57d8f72e0", - "0x000000000000000000000000000000000021e0917c64c0ab9ed179bc80b3b482", - "0x0000000000000000000000000000006dd2a6710d4cb4529b9ea5c86e9f755ce7", - "0x00000000000000000000000000000000000369353560a142b672c6ca1ded1b53", - "0x000000000000000000000000000000bb949295225400e2a060e8fa54b77becac", - "0x00000000000000000000000000000000000f8b19b41cbb75c9a65829e4bda87e", - "0x000000000000000000000000000000a3be29b044d47cc172b818dcbb03a17deb", - "0x00000000000000000000000000000000002ccb91c482243ea32d5912d2e1c280", - "0x0000000000000000000000000000003700fad879aba452a79c6b6bf0589394ea", - "0x000000000000000000000000000000000026787019bf34d3488b8e7c7986adc2", - "0x0000000000000000000000000000006b5e5817e0e789e9e161ed3a73b8f80cb8", - "0x00000000000000000000000000000000002c437d774ec8e4fdc28e7dae8c45fc", - "0x000000000000000000000000000000bcb1aa7a1a246715232917dedd7f7003e3", - "0x000000000000000000000000000000000011306d06231eb5511b6a4af622ac19", - "0x000000000000000000000000000000b53cc1f3e6a754b82245d5834b4bbdf771", - "0x00000000000000000000000000000000000f6c9f78dad05f58e768c807784356", - "0x000000000000000000000000000000c1a26d42a39641bbf8a3b3b6daed2af73d", - "0x000000000000000000000000000000000017348e45d7764d1558fde85c5a4c8f", - "0x000000000000000000000000000000c2047a2dd615bf69beaccb1c46873f4bd2", - "0x00000000000000000000000000000000003051ff2357286de2be440013f41722", - "0x00000000000000000000000000000046a7f872486efe0449ec27e0919897a761", - "0x0000000000000000000000000000000000292e78202115b80ede8cdeb3b9924b", - "0x000000000000000000000000000000b1366c2cadef63ec2b16b2698995b67099", - "0x00000000000000000000000000000000000e11c9bca74a313b9b3d6224483657", - "0x0000000000000000000000000000006b1cf7a6d7b481fe9219097cc6e0461c81", - "0x00000000000000000000000000000000002b9f3b77cb821951c144bcbc458059", - "0x00000000000000000000000000000041b57eaadc3aae0acd498d8ad9639b76b5", - "0x000000000000000000000000000000000018f854e2addd95de2694659c946771", - "0x000000000000000000000000000000ece540fc8e1fccd9b0c84eada56a982e9e", - "0x0000000000000000000000000000000000085b7b13f0029a363b2f9895374c65", - "0x00000000000000000000000000000046dfd7eb67e18da8fc4417fcfa4d77a5d4", - "0x0000000000000000000000000000000000015950aa9946b49184eab38b1821a2", - "0x000000000000000000000000000000a90f228e2440c0822be907b2cfcb0fdc5a", - "0x0000000000000000000000000000000000138d1c007d67d30ebf58b183d247d7", - "0x000000000000000000000000000000baa4491d011e0639b1d34efffeb6169c98", - "0x00000000000000000000000000000000000d5c355fed9ee2333ca39482b64080", - "0x0000000000000000000000000000005241728a06f59044652c2b52c1f16a3c61", - "0x00000000000000000000000000000000000c2c0eb4f82c16183f0318ea186032", - "0x0000000000000000000000000000008ef5e4c002254eed96c2641aff3e8ccd38", - "0x00000000000000000000000000000000003024e61a366c9340cdf260a4d18173", - "0x000000000000000000000000000000f3337aa61db17c60d6fd13c6e630034106", - "0x00000000000000000000000000000000000fbf8f9234348bf82040f57d3117fe", - "0x00000000000000000000000000000035df9f45c71a16f3599761d6356415e682", - "0x00000000000000000000000000000000001fe74382b44bbada6f3225f44a50a3", - "0x000000000000000000000000000000948548bdf5ceb732df43b6ba83cfdce1a5", - "0x00000000000000000000000000000000001af13565f5b64a2f420816807e1870", - "0x0000000000000000000000000000001918ac158aae24aa92207bdc3c41769813", - "0x00000000000000000000000000000000001f1a077cd4a53bd41e8520013cc914", - "0x000000000000000000000000000000f0f284926a4bf6fae5b1686c1b205cdc66", - "0x00000000000000000000000000000000000d0bfec6c059403dbb02061119b140", - "0x000000000000000000000000000000cf0641c394b1e04a72e01cabeb14e214ab", - "0x0000000000000000000000000000000000188b9c6fd8e2816fa9cd64243043ae", - "0x0000000000000000000000000000008991c340a8d0a2ea61065a60f7571868c3", - "0x0000000000000000000000000000000000011d7f93fa792b56764210933f76c5", - "0x0000000000000000000000000000004eb7e44258a1b5a4ab3679f13b480cef5e", - "0x00000000000000000000000000000000001b36ac02549cce56d3cd0eae534446", - "0x000000000000000000000000000000ca31f9a188811e5a54ab8a896aa6ab9833", - "0x00000000000000000000000000000000002ee1da14271746bb1a403707550e7c", - "0x00000000000000000000000000000008eac606d7939d5dbb82800db2f084e13a", - "0x00000000000000000000000000000000000d079723de5cc2e73224d9cf4be50c", - "0x000000000000000000000000000000ab67042292123149246fe0a0d3a3b6cda5", - "0x00000000000000000000000000000000001a0903e310f18f6c802ada6e1a0e59", - "0x000000000000000000000000000000837fde8ca1ef081cda7fa840c8a37e7f8e", - "0x000000000000000000000000000000000014d004ecb2b25798f96ca758fac094", - "0x000000000000000000000000000000f3ddb766b82d68fce89d71218d5a8a39a2", - "0x00000000000000000000000000000000001e4217125fdbb8994b27de709e3e49", - "0x00000000000000000000000000000011c661cf611a1cc2af212e6185c12aec06", - "0x00000000000000000000000000000000002fdda59f7a64c0ecab97f3083140ff", - "0x000000000000000000000000000000f705cc6913f0a0bc5dcf1abbc8defc16b6", - "0x000000000000000000000000000000000017e8cf6bc6f435ff379ffd53fd3ae6", - "0x00000000000000000000000000000020753435fb0e57cfdbdf6d871e8c599fb3", - "0x00000000000000000000000000000000002acb1436301ed00cb666003f027bef", - "0x000000000000000000000000000000c323b8a3042101a0176485e5bd6c5f772a", - "0x00000000000000000000000000000000000528e8d7421f9dd47428992bfec03a", - "0x00000000000000000000000000000007611143ff948d8f588065991c7bca1ffa", - "0x000000000000000000000000000000000009af56d0073585979a4b9c1e46e392", - "0x00000000000000000000000000000005a2c75ab8a16e790cab2957df56d49161", - "0x00000000000000000000000000000000000defffd94f1d9f3443a1819131d867", - "0x000000000000000000000000000000cd299a2f1216218ae863b32d620a024538", - "0x00000000000000000000000000000000000acfa138fe8ac867c22a5411305963", - "0x000000000000000000000000000000b840830389cba71793971d07e1eeef34a4", - "0x0000000000000000000000000000000000180e6976d7b76e75a1692acc0611f6", - "0x00000000000000000000000000000075341e2120aeb40f3891eebb4d1ba293e2", - "0x00000000000000000000000000000000000ba855cec960f7c1778a2efa4fc063", - "0x000000000000000000000000000000141bbf43dea286ad4f3a9a465f91681b3f", - "0x0000000000000000000000000000000000297597caef980736419dc4f64df076", - "0x0000000000000000000000000000008a46250aadf1da47d3c158ce6885827cc7", - "0x0000000000000000000000000000000000134c179667d27e33241d2760dd093d", - "0x000000000000000000000000000000f4b61bc74c53360770558d49d9419fa4dd", - "0x00000000000000000000000000000000000f31906d90dc2fba342c6320c718d9", - "0x000000000000000000000000000000a60de15e90ba1c168bf6a18c3c3999ef10", - "0x00000000000000000000000000000000002c44d1fa1e4cd66616106cdd88a57a", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000004ffc4a8fec69c23c38b2709c7b6596e906", + "0x00000000000000000000000000000000000d2d9137618e1ee3157b4f582d82fb", + "0x000000000000000000000000000000fdfcb8f2423374357b71251f3baab6646a", + "0x00000000000000000000000000000000000dc11bdb9429fd416ada9bfcf7c008", + "0x000000000000000000000000000000e6f92df2eae6c429d871a74e6ce13bca01", + "0x00000000000000000000000000000000002e7d850bb9772b539e5a9989233475", + "0x000000000000000000000000000000c82aa7857704c6feaaf887f272e0b86af6", + "0x0000000000000000000000000000000000005af1f32b671a0be86ab2928fd5a2", + "0x000000000000000000000000000000dbe05cd162d37468ab4bd7f15fa9eec485", + "0x0000000000000000000000000000000000221b13ed2e24aaa5d67acda629a6e8", + "0x000000000000000000000000000000f29192b4d57f19687137c5c71418f87cba", + "0x000000000000000000000000000000000021ed4ad98cf96edd0c3450346edcf7", + "0x000000000000000000000000000000c9df496ed2620244e8e6680b9d0bbeb4f2", + "0x00000000000000000000000000000000000fc5f41c89ce12e8ab9ca2cfe1966b", + "0x000000000000000000000000000000c7fbc2691a9a59c886c2596219a50ffbaf", + "0x00000000000000000000000000000000001cc74b638831fc664d582756258eeb", + "0x0000000000000000000000000000008f7a10c5f1056a1afee5670894cb5c2caf", + "0x00000000000000000000000000000000002181f0f88062817a52355af62397e1", + "0x000000000000000000000000000000ba1fa5a75c07ddbc190e8fe4fab17b237e", + "0x0000000000000000000000000000000000159bd289c66f6a122c603c353f9200", + "0x00000000000000000000000000000099bbbf1206b7ae8ee533f37ba1237b839b", + "0x00000000000000000000000000000000001537d9f1b14a261e8a4c1b2b77e34d", + "0x00000000000000000000000000000053dc7a561f4c8aa59aa0a220717421e33c", + "0x00000000000000000000000000000000001172fc73409bddb5ffeb01d1b68447", + "0x00000000000000000000000000000017030219502b29b77d6087584f63e1f50b", + "0x00000000000000000000000000000000002a8710ad87a3c05ed5cacf8d4108d1", + "0x00000000000000000000000000000018ca9f36f974fea905e3f37e91ea88aaf5", + "0x000000000000000000000000000000000016471423bfd9ec69b6a0a90225b0c1", + "0x0000000000000000000000000000003e97384c4ad27f230d62c9797654f9ad3a", + "0x000000000000000000000000000000000016a6824fd8fc1bfd86ccab1274d579", + "0x000000000000000000000000000000a82adcb400ab2be7bda2d637a74090f482", + "0x0000000000000000000000000000000000132650fd94352eafae0c32736bd391", + "0x000000000000000000000000000000e3dac4b9f849a77ae2890c3a54cb495f4b", + "0x0000000000000000000000000000000000152bada98ff08b61d95b6b3f7c2a7f", + "0x000000000000000000000000000000a1be3a1d0b0d05f23606940078f33d522c", + "0x00000000000000000000000000000000000ab759acc3f8bd536118dc91f070a2", + "0x000000000000000000000000000000a4131ae0e0c6afa7749209320bbf516d20", + "0x0000000000000000000000000000000000169b0d745bd756995cdb871880cbdb", + "0x000000000000000000000000000000f7dca26dd4087f0023c8bae4c36a397389", + "0x000000000000000000000000000000000018773e0f6134ea2caf74aa1fd0d585", + "0x000000000000000000000000000000f0498abb5caa5d6b440d52ef999c6f16b1", + "0x000000000000000000000000000000000023e17cbecef250daa9999f85d11976", + "0x0000000000000000000000000000004f9c8b5a5b7b6d85331ad304163d451fb0", + "0x00000000000000000000000000000000000a085224e337a4c86ef0b5ae8ff6ed", + "0x000000000000000000000000000000df165d33587d261f4b35bd0f74858eaa7b", + "0x00000000000000000000000000000000002fc49ae5b0e2996586ba3cf3401a8c", + "0x00000000000000000000000000000042f10b486a2e880591bd780636316e87b3", + "0x000000000000000000000000000000000023fdb65abe577aba416f4a34ad7259", + "0x000000000000000000000000000000c36279dcffdfb2365944fbb00509e3e3d2", + "0x00000000000000000000000000000000001cc3e6c6789c5dc08b0d04bccb45cd", + "0x0000000000000000000000000000004c07257aa5e2105352a59d954b0bd6ba73", + "0x00000000000000000000000000000000002dc50309a5ef86cd90dbb6c7a30bbb", + "0x000000000000000000000000000000d24f0a0cf38ca9316be400c743bbbb3bec", + "0x000000000000000000000000000000000027822ff7bb9483b29df97785ee5f9d", + "0x000000000000000000000000000000468d47d31fb480e2c192ddb6673e5cbea8", + "0x000000000000000000000000000000000001d6ab1aaf7944c2be04aea4060d71", + "0x000000000000000000000000000000acd6e1ecb360a2b22fb49c7766e97f5d69", + "0x000000000000000000000000000000000022aaedd8191a5ec18c5118eeb69b57", + "0x00000000000000000000000000000093470cf48813d1a18e21d6e95aa50b7c7b", + "0x00000000000000000000000000000000000da822dc968e65bb2c22570c142a32", + "0x00000000000000000000000000000086c58f4fff2784632dbcd99a232c84f225", + "0x00000000000000000000000000000000002b88e4f102a1274a8a494cb8f25102", + "0x0000000000000000000000000000009c59213866e8541a3d0ecd0de9e57a9650", + "0x00000000000000000000000000000000001cceb595e765064fa0ef13dac07acc", + "0x0000000000000000000000000000002467a62e4b37330d4dc4feec06fdd80fa6", + "0x00000000000000000000000000000000002087474e690c59d77ae0d6239b5897", + "0x000000000000000000000000000000c255ce3660b905dcbeaf219c0a3e54950e", + "0x0000000000000000000000000000000000210cabca81c99532b9dbd55d00b499", + "0x000000000000000000000000000000e70d7d72c617fafed3122e114a215e55fc", + "0x000000000000000000000000000000000023afe52923d3bf10819581adbb4813", + "0x00000000000000000000000000000097419920a9d12da73bead6ce1f0ff5da80", + "0x000000000000000000000000000000000002ee216992dcd8c715b8266ca7cce5", + "0x000000000000000000000000000000f4cb33d7153848f34cb1fbf1189e9bd4ca", + "0x00000000000000000000000000000000000df3b7b6a86a5b7b969e131814252c", + "0x000000000000000000000000000000da4c1c6c9a655fc71b463159dd36cabb0e", + "0x00000000000000000000000000000000002b5005b6035cbd01df0e077e742f64", + "0x00000000000000000000000000000031351d32d261212126098628328a5faa9c", + "0x000000000000000000000000000000000021dcce6f03155af52cb0f960089a1f", + "0x000000000000000000000000000000fea34958e93eeb2655c5ea625202c85d92", + "0x0000000000000000000000000000000000181643d812babe4a2bd9d0cde9bf5a", + "0x0000000000000000000000000000001d2cfe12f41c43843aa42384cff8d79c7e", + "0x000000000000000000000000000000000012dd5b3437eb0c7bc707c438424b53", + "0x0000000000000000000000000000008bbb3e4557582389e92ff21b40fd47a504", + "0x00000000000000000000000000000000001c3a9dcc9599ac268f52209071590e", + "0x000000000000000000000000000000c48c6be8596355abde35aba01e747f1fcd", + "0x0000000000000000000000000000000000177ff828c89347b6ff04b7d456298c", + "0x0000000000000000000000000000000d68b89f5f5b74f182ff5c96f6e1fed030", + "0x00000000000000000000000000000000002cf5efa1ff0a0774a9e1fb6873d85a", + "0x0000000000000000000000000000003acc6def4164d878b56e5b2fe2bfa52199", + "0x000000000000000000000000000000000022cf69996ae471056bcae7b3c38cbc", + "0x000000000000000000000000000000239623839c51be6ffe83c77c80b8f94ad5", + "0x0000000000000000000000000000000000075cc2c3c9e3079bec86764aa5cfd0", + "0x0000000000000000000000000000008c88b485298919bf7164440942d6f6c5ad", + "0x00000000000000000000000000000000000c5dd6e29eac9076cc2f5995fcf27c", + "0x0000000000000000000000000000005b7ac436f888999a48f79ef212e6483f14", + "0x000000000000000000000000000000000009fc56f5a2122d1ed9353860ba68ab", + "0x000000000000000000000000000000dace4e23bf41b55e3098bd8e82e74b1c1e", + "0x00000000000000000000000000000000000883499c226658d83b4d0cc7b08c15", + "0x0000000000000000000000000000005c0373d8b286bf727301571a54e1636e77", + "0x00000000000000000000000000000000001f268c0945bdea494fbfc52e8581c1", + "0x000000000000000000000000000000c6b7e770c1e62e2504ce986f21324ff939", + "0x000000000000000000000000000000000001b92f92042ae2556e31cf72cc3990", + "0x0000000000000000000000000000007007220c2c02f4ec2c1c5fada9056b8c37", + "0x00000000000000000000000000000000003038ffe6284e174445a0eb11a63e0b", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000062bfec2bfafc5b17038ff733928ba9e084", - "0x00000000000000000000000000000000001f00dbc31d7eadb4453be1bd27e1af", - "0x000000000000000000000000000000a5b5b18ac4116af8b1087952e460272001", - "0x0000000000000000000000000000000000144a84387f448b4a8a5aa04776d03d", + "0x0000000000000000000000000000008344e7cd358bb008fa2594f42e2058a4da", + "0x000000000000000000000000000000000028d98153e26aa139c5f995a12d6b82", + "0x000000000000000000000000000000ebbd996ba82dd482c0cd9f93dba5c948f1", + "0x00000000000000000000000000000000000abbbdb042fe5de7714689b4b198cb", "0x000000000000000000000000000000b5c1eac95b264c302dc854e6f22d7330df", "0x00000000000000000000000000000000000fcbbf9d3cf402baa3eeda5f0a9e49", "0x000000000000000000000000000000def9d58fc2920836194261f7b163fefbaf", "0x0000000000000000000000000000000000283edfda89c9480597f0b3442e9752", - "0x0000000000000000000000000000008ca9a0451964a7bbabbd9e369db7556253", - "0x000000000000000000000000000000000014567e2c3e84fc1e3e69d81f6ce580", - "0x000000000000000000000000000000d609c59feecf899f2b95aff519bbf3fb3c", - "0x00000000000000000000000000000000000378926f150c30c760965df469ae6e" + "0x0000000000000000000000000000004264681c9136a2fde7137335ef716fecde", + "0x000000000000000000000000000000000027ca9ccf01429923a61d872c7c224c", + "0x0000000000000000000000000000006df5ee4c1358443f5a14086b5196e13e46", + "0x0000000000000000000000000000000000192b1a6d3b14dfe5a9ad63951d2d76" ] - hash = "0x25ad52a5dec3ef01f643c4b2daa49f7ac171e33487cc54cc4439b0c0a91905bb" + hash = "0x2da9a2696ba9c946d2944aa5c3a2dce8b694eb53b8f9e2070f94b7d7bfdba5df" [private_call.function_leaf_membership_witness] - leaf_index = "1" + leaf_index = "7" sibling_path = [ - "0x25d5e2a71dc9ddfaeb9173d3fa3f65e7f93dae69c9b84c6acfd3034aa4e18d73", - "0x10cf52ce4f44780dc9937dace0f1d9223e2c28f785714798cdeaf1be3d152914", - "0x0e1ce4f11f4d51a7d3136abbd625315fff3876d322e46ad8401da96f8e43a614", - "0x1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac937", + "0x1895598e097615ceb187eeb360e0e2644bbb63fd37fcdc05eea0680c9303853f", + "0x25b93bbfa26d245fcc662c969e0cb8838f4a2d3636c2d87aef792014741e9b59", + "0x0173b6277638068ad3e9a1597860070f0bd6b16dcb2c5ecde6bd733ef75b2de1", + "0x050f0ce64bdfcba5470ecd90e35d5d622a1bd2c4457e7a39f0eb60323bdb2d3a", "0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854" ] [private_call.public_keys.npk_m.inner] -x = "0x150dbf5d64a13fd671eaaa0681e595837780f22fe0d38ad94d9140ed061ad952" -y = "0x14544de9c05cf7c4eb10c32db726430a67dbddcebdfbf434679697eda4c7835a" +x = "0x01498945581e0eb9f8427ad6021184c700ef091d570892c437d12c7d90364bbd" +y = "0x170ae506787c5c43d6ca9255d571c10fa9ffa9d141666e290c347c5c9ab7e344" is_infinite = false [private_call.public_keys.ivpk_m.inner] -x = "0x1ae2b18223ae2bfd683a51e1c47b46246aa1419cfd063dd6954d20be37c1e7a8" -y = "0x060b3f86bca6bac389c9bb6344447c592b236cf3090d5062cd18582f961edbd7" +x = "0x00c044b05b6ca83b9c2dbae79cc1135155956a64e136819136e9947fe5e5866c" +y = "0x1c1f0ca244c7cd46b682552bff8ae77dea40b966a71de076ec3b7678f2bdb151" is_infinite = false [private_call.public_keys.ovpk_m.inner] -x = "0x2fefed0c2c7b3544e41b04e1ca4f50e4a23121e5db4df6b46a18151a90b69de6" -y = "0x2ab5e458c1105d879bb664e827addd79174cfe223f5ef26a957214a14bb3b3d0" +x = "0x1b00316144359e9a3ec8e49c1cdb7eeb0cedd190dfd9dc90eea5115aa779e287" +y = "0x080ffc74d7a8b0bccb88ac11f45874172f3847eb8b92654aaa58a3d2b8dc7833" is_infinite = false [private_call.public_keys.tpk_m.inner] -x = "0x29a6ccd88329f0f9cbe2bf3202bde98dfb0d0ec60b7a34ff3d9366967249a642" -y = "0x087e5019dd66c4b4294a005445570e575a3517ac1c3bd62a37a30906791c2154" +x = "0x019c111f36ad3fc1d9b7a7a14344314d2864b94f030594cd67f753ef774a1efb" +y = "0x2039907fe37f08d10739255141bb066c506a12f7d1e8dfec21abc58494705b6f" is_infinite = false [private_call.salted_initialization_hash] - inner = "0x0048cf09401a929af76b5b21ab77a331a253552e91e2f6364db0117bae9763b8" + inner = "0x2c7c17507841a9554cc2aee348b1e0277d59cc584e77c6af36e1091ebad92211" [app_public_inputs] -args_hash = "0x05b8b2675b3840bb280f9ed06ae211d62805db7c6b6411e07f2c5f99c3853d87" -returns_hash = "0x0abe801b19f8d5462d186f6bfa961b5c5274080d93a33e57064eec4e0591f6d7" -start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000005" -end_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" +args_hash = "0x0af1e29b064dedd2a9cf35f6bd87361362530e6618692827c46333566e356220" +returns_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +start_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +end_side_effect_counter = "0x000000000000000000000000000000000000000000000000000000000000000c" min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" is_fee_payer = false @@ -5240,20 +5241,20 @@ _is_some = false _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.call_context] - is_static_call = true + is_static_call = false [app_public_inputs.call_context.msg_sender] - inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [app_public_inputs.call_context.contract_address] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [app_public_inputs.call_context.function_selector] - inner = "0x00000000000000000000000000000000000000000000000000000000c7784917" + inner = "0x000000000000000000000000000000000000000000000000000000009462d279" [[app_public_inputs.note_hash_read_requests]] - value = "0x07815728ae22eb417a33941d9ea2db173b62ea36e752e352759c2d8dfaa866c1" - counter = "0x0000000000000000000000000000000000000000000000000000000000000006" + value = "0x1eeef2e1c70a7794a3586b4cf25058ac1b892b7d874294bf7dc5d1282591e04b" + counter = "0x0000000000000000000000000000000000000000000000000000000000000005" [[app_public_inputs.note_hash_read_requests]] value = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -5316,8 +5317,8 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [[app_public_inputs.nullifier_read_requests]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" + counter = "0x0000000000000000000000000000000000000000000000000000000000000004" [[app_public_inputs.nullifier_read_requests]] value = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -5380,14 +5381,14 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [[app_public_inputs.key_validation_requests_and_generators]] - sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" + sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000030" [app_public_inputs.key_validation_requests_and_generators.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" + sk_app = "0x0d6dd1f75adac84b209ad26497e2f6796dc1d1a99a694303a18319a2d475df33" [app_public_inputs.key_validation_requests_and_generators.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" + x = "0x175d325f91f136d09f7b5b30ee6e82a8720dcd4fadd87e9828a989461ffe5828" + y = "0x161bf54b24e177c5cbb154fc01a12732e92c21c5a04985cea5374033ed510b4c" is_infinite = false [[app_public_inputs.key_validation_requests_and_generators]] @@ -5556,12 +5557,12 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" is_infinite = false [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x250eff94c845907e4b441ec3e2ab9c7f96c90b19c35d98298903720596c8ae96" + counter = "0x0000000000000000000000000000000000000000000000000000000000000007" [[app_public_inputs.note_hashes]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x080d7e517a580a3e7e87d11e50504e3931844836624eef2031f2c29d27fcec98" + counter = "0x0000000000000000000000000000000000000000000000000000000000000009" [[app_public_inputs.note_hashes]] value = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -5620,8 +5621,8 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [[app_public_inputs.nullifiers]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x08b671e5822c135c559a7b5a7ef58783ef97faed29ca80ac2d28bc1c77fbbbd2" + counter = "0x0000000000000000000000000000000000000000000000000000000000000006" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [[app_public_inputs.nullifiers]] @@ -6073,81 +6074,81 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" + counter = "0x0000000000000000000000000000000000000000000000000000000000000008" [app_public_inputs.private_logs.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x2d79cc0637eb70f6c46f8680291f1401502fe4d39564606106584b776d308ecf", + "0x00961dca5785af4bf09cf75a77cdfcfa8fa41413b16bee86604c1826795edeec", + "0x00f7933d99a2ac43f613e021cc11c6200bdf7d703ba411bfda70998dbbe91d18", + "0x005c34531ec16f9cba02c2f74e5b68f53ec6bc00000000000000000000000000", + "0x000000343ccbf71927c63534206273c8611b72a04d4db62e0d1e7a1f358dbfe9", + "0x00bbb6167707e40e023148c03968226c73db4574f5991f9d06194dd1782e9d92", + "0x00c2cfe592e585e6319b54b39631393055f7ff2e2fab8ed76f5ca49bc3e7c83b", + "0x0036f9cd24f2727bc025371ca810245a9267c936e7edf92bd90a302d44b9a6ff", + "0x00dabe139092b735a4288ee4a9379e4afdfa51708650fe26e91e239fa23f9375", + "0x00eae9418604595e2d9a6ad7d46b2fc1967d2d7da56c4072a76bb3f709982f49", + "0x00989ffa26ac3a205dc0b99de3a6507411d11fdba8c61d3c81aabed1f119dd27", + "0x008ee4cadeaf75aa216d88a2a3aad40ba71c9ca39176a9ac78da77e47cab5caa", + "0x009927c6b18981dfcabf0a63dfd61d0491d8ee2c893844bb2ca602012783d756", + "0x00a18c50eb974c9146d791e09d883b3ad300430e1bac3f225b96041bcee15fce", + "0x00d527b9e3f664614bdf0f851d75ac6acaf59d4dbbe565a36424dee99bbf878d", + "0x00ae2f375a95ac5c40bf04f2c3f117c27132f413368d5d56edc746174594f8ca", + "0x004ff8ae2b0b2ae2b61a01a94b966654d26714edd486f5acacb2feb360f09059", + "0x00fb3c03d810569bdb758dbcb063020c6119ae59bd66308035a17f93ec1a8e98" ] [[app_public_inputs.private_logs]] - note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000009" + counter = "0x000000000000000000000000000000000000000000000000000000000000000a" [app_public_inputs.private_logs.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x08f720b2dc01d9f869376d21c019e00d91ba4a2df4c411b8351967bc22f30833", + "0x0082d4f053d20f9e5d0133a2279d7e5e1edcee80e8ae64e2b31759ea2c9d8357", + "0x00b4293fe37ff8a12620c49682fe04fc280a5808fc52884c40905c8a9fd12c22", + "0x00a08522ae6abbcca7fa0574ba7dc99f9f881c00000000000000000000000000", + "0x000000b32f2e9c3feb52a65be2321e91560925b83d0be9ea0c8e41c5e71c4df1", + "0x00fa5845ce219f1a7dd626caa3c96b536a79a3a65b1e184bda69fbc6eb61bdfc", + "0x0028181637f8949f88e4a53422f95c86122248723091b21e8f469fc86b3f7bf6", + "0x00c45756c940e72b7532073a35d77febff4f9d61a7f15706ba058f552c4c4dec", + "0x00ff7429d367c5fb82596c900dae746bd4988941db33121f03a8d01d92646560", + "0x004ca4b6be792d1c2167e998174d676e6462d0995063cd2d28bed4a7a0205ee0", + "0x0075c3cbed81825b7d47fe05ffa7446ee7b637ead0b04f1fb74e5d5d8f6a2b61", + "0x0036e4ebe9d34f8cf36254dc26d3b8c4829781d742edd48bd4babc79d4f8e019", + "0x001e85147052819f92807729600faf577839327b3c9d6ddada8869a19fdc2f7c", + "0x00062d400f543f81e1379c1e275b50e2bd025e4adc8111ae7ee30615c4733c58", + "0x0036d19ebc307f6a255369bb16287ec77fe0671c2dc6b3151ffa75e99a560d55", + "0x00250cf6a0581f297c606cde1b35e500648010bd4e9bda5b8a98a5824e0ee3bd", + "0x00b16603236f00e2f4263ecb587c0bb087fdcfa9075b3dde4501dff76177d091", + "0x0046729300d452d6dfe8200e1958ea4c78b2ddb8108a5c9b11fe2f61ca2c092b" ] [[app_public_inputs.private_logs]] note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" - counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + counter = "0x000000000000000000000000000000000000000000000000000000000000000b" [app_public_inputs.private_logs.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x2d24207cbf1dc0a827042e09794dba8765971047eb2f6890b2ba4c398ba95b1f", + "0x002fe17d85df96d8b9bc15c91d0d62b0173174cda5d991cd73e9b9da65e2956b", + "0x00da7b08beac5d98c229d91728587646f72777453b785d0624e59f0a8075661d", + "0x0089323120a21d889aee547c21faa1c03a1ead00000000000000000000000000", + "0x0000001a851e3ed1265dde6b01175571a83d0777b0c17791db74cd2b33589139", + "0x00d1f4a53e67b2221c1ce7bd6d5dc105b0b3a086dcabd173b2b874f6f13fa338", + "0x002ccc3ee9f522a252f7523703c162fb8807c24eb052d2871609e249c67bd5bb", + "0x006e1fd58f3479bb18d1abd812bef996dfc0a36d72d1472a930e77805f243952", + "0x007043fae6b109a981b1e34acf7281480b879f280fd607fa1df718c9a31acaf2", + "0x008c4f91880f265b065cea8a705bc508875182fe5a3837e2b5b8a14e231cbd59", + "0x0071c17f4d52aecdfb4d8c6b1e764ae137c836c0672bf3cc589a45878f2686a8", + "0x00c95d01a6e57b41af4f265b2c88f6ff3de54aa5c895ca6faa21e26a8d6134a5", + "0x00a54c12af2499afd7651644686c671c3d77ff4af32a6b181646c976329a0063", + "0x004567a7724f750c4b0c9c205f35f4a175ea93015792fc78fbd985e7c751cc1b", + "0x001b0870e32b1c3c28116435e5132496bdeb8a1d3b9acc62b7d57d82f230bdaf", + "0x0058272cd1119bc153b18b3a3c896138be6f5b9144f216cd6e6f1b5db7d8ef08", + "0x00c1c848fc01d649f264a3cf8ba8cade698e2c1dbd14f7a0077356f8381de748", + "0x00328549fac9e2e1ff6fc6aaef17fbb1fd5c973e01df61985fe056548fd4b5df" ] [[app_public_inputs.private_logs]] @@ -6494,51 +6495,51 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" length = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header] - total_fees = "0x00000000000000000000000000000000000000000000000001390723b0ae9bdc" - total_mana_used = "0x000000000000000000000000000000000000000000000000000000000018d25a" + total_fees = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000016771" [app_public_inputs.historical_header.last_archive] - root = "0x20e7c0a4ec7dd65a2d372d97cff40ef24f6ace2b69a7f2e75e6e38345d04156e" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" [app_public_inputs.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" - txs_effects_hash = "0x00f568bf6779b4e792307d1669e1c2310a152a48765914e444318d46b64df78e" + blobs_hash = "0x0008822f60476d6dc34ec6109d3ad69dd1747a9484777021d8e717166bc7d5e6" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [app_public_inputs.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000070" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000090" [app_public_inputs.historical_header.state.partial.note_hash_tree] -root = "0x0b5a7c1b586e5d9912483bac3c3978275313397bb7ce2a21e49f6501f2f6ff40" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" [app_public_inputs.historical_header.state.partial.nullifier_tree] -root = "0x0f0bea91ac18f935a883cbee97bb2545ee979636584a1259ad257fb4d6162c7f" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" +root = "0x0a639c242b766d8bd94d437483546e33c4a8c27feadf50bc4ef523e9f191e927" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000500" [app_public_inputs.historical_header.state.partial.public_data_tree] -root = "0x1e5d4d46e7c5f0c9659360ce1dbc0e56e594cfd1a7e9e65396b4cae9c15498af" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" +root = "0x2528ba08e1171e992f4744a8d8761bbe5611447c52d673882bde6a9e3b716e1a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" [app_public_inputs.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000009" - timestamp = "0x00000000000000000000000000000000000000000000000000000000675984df" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" [app_public_inputs.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [app_public_inputs.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [app_public_inputs.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9c6ebe66" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [app_public_inputs.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -6549,9 +6550,9 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [app_public_inputs.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [app_public_inputs.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr index 0a5021808b2..80d790b76b2 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/previous_kernel_validator.nr @@ -27,11 +27,19 @@ impl PreviousKernelValidator { } pub fn validate_for_private_tail(self) { + assert( + self.previous_kernel.public_inputs.is_private_only, + "Must be private only to be processed in tail", + ); self.validate_common(); self.validate_empty_data(); } pub fn validate_for_private_tail_to_public(self) { + assert( + !self.previous_kernel.public_inputs.is_private_only, + "Must not be private only to be processed in tail to public", + ); self.validate_common(); self.validate_non_empty_data(); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr index d1d0042e115..0bc6be18878 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_output_validator.nr @@ -34,12 +34,14 @@ impl PrivateKernelCircuitOutputValidator { private_call_array_lengths: PrivateCircuitPublicInputsArrayLengths, vk_tree_root: Field, protocol_contract_tree_root: Field, + is_private_only: bool, ) { self.validate_initial_values( tx_request, private_call, vk_tree_root, protocol_contract_tree_root, + is_private_only, ); let mut offsets = PrivateKernelCircuitPublicInputsArrayLengths::empty(); offsets.nullifiers = 1; // The first nullifier is not propagated from the private call. @@ -77,8 +79,10 @@ impl PrivateKernelCircuitOutputValidator { private_call: PrivateCircuitPublicInputs, vk_tree_root: Field, protocol_contract_tree_root: Field, + is_private_only: bool, ) { // Constants. + assert_eq(self.output.is_private_only, is_private_only, "mismatch is_private_only"); assert_eq(self.output.constants.tx_context, tx_request.tx_context, "mismatch tx_context"); assert_eq( self.output.constants.historical_header, @@ -193,6 +197,11 @@ impl PrivateKernelCircuitOutputValidator { previous_kernel: PrivateKernelCircuitPublicInputs, array_lengths: PrivateKernelCircuitPublicInputsArrayLengths, ) { + assert_eq( + self.output.is_private_only, + previous_kernel.is_private_only, + "mismatch is_private_only", + ); assert_eq(self.output.constants, previous_kernel.constants, "mismatch constants"); assert_eq( diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr index 78655c65d27..b44d3a5211f 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/private_kernel_circuit_public_inputs_composer.nr @@ -47,8 +47,10 @@ impl PrivateKernelCircuitPublicInputsComposer { private_call_public_inputs: PrivateCircuitPublicInputs, vk_tree_root: Field, protocol_contract_tree_root: Field, + is_private_only: bool, ) -> Self { let mut public_inputs = PrivateKernelCircuitPublicInputsBuilder::empty(); + public_inputs.is_private_only = is_private_only; public_inputs.constants = TxConstantData { historical_header: private_call_public_inputs.historical_header, @@ -71,6 +73,7 @@ impl PrivateKernelCircuitPublicInputsComposer { ) -> Self { let mut public_inputs = PrivateKernelCircuitPublicInputsBuilder::empty(); + public_inputs.is_private_only = previous_kernel_public_inputs.is_private_only; public_inputs.constants = previous_kernel_public_inputs.constants; public_inputs.min_revertible_side_effect_counter = previous_kernel_public_inputs.min_revertible_side_effect_counter; diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_composer.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_composer.nr index 20816db17ac..519e53caf81 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_composer.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_composer.nr @@ -11,7 +11,10 @@ use dep::types::{ }, address::AztecAddress, constants::{MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX}, - hash::{compute_siloed_private_log_field, silo_note_hash, silo_nullifier}, + hash::{ + compute_siloed_private_log_field, compute_unique_siloed_note_hash, silo_note_hash, + silo_nullifier, + }, utils::arrays::sort_by_counter_asc, }; @@ -73,10 +76,23 @@ impl [ScopedNoteHash; MAX_NOTE_HASHES_PER_TX] { - let mut note_hashes = sort_by_counter_asc(self.hints.kept_note_hashes); + let is_private_only = self.previous_kernel.is_private_only; + let min_revertible_side_effect_counter = + self.previous_kernel.min_revertible_side_effect_counter; let first_nullifier = self.previous_kernel.end.nullifiers[0].value(); + let mut note_hashes = sort_by_counter_asc(self.hints.kept_note_hashes); for i in 0..note_hashes.len() { - note_hashes[i].note_hash.value = silo_note_hash(note_hashes[i], first_nullifier, i); + let note_hash = note_hashes[i]; + let siloed_note_hash = silo_note_hash(note_hash); + let unique_note_hash = + compute_unique_siloed_note_hash(siloed_note_hash, first_nullifier, i); + // We don't silo with nonce revertible note hashes, since we don't know their final position in the tx + note_hashes[i].note_hash.value = if is_private_only + | (note_hash.counter() < min_revertible_side_effect_counter) { + unique_note_hash + } else { + siloed_note_hash + }; note_hashes[i].contract_address = AztecAddress::zero(); } note_hashes diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr index 2d6e53a5067..3bed8657187 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/components/reset_output_validator.nr @@ -11,7 +11,10 @@ use dep::types::{ side_effect::scoped::Scoped, }, constants::PRIVATE_LOG_SIZE_IN_FIELDS, - hash::{compute_siloed_private_log_field, silo_note_hash, silo_nullifier}, + hash::{ + compute_siloed_private_log_field, compute_unique_siloed_note_hash, silo_note_hash, + silo_nullifier, + }, traits::is_empty, utils::arrays::assert_sorted_transformed_value_array_capped_size, }; @@ -77,6 +80,7 @@ impl Self { Self { tx_request, vk_tree_root, protocol_contract_tree_root, private_call: private_call.to_private_call_data(app_public_inputs), + is_private_only, } } @@ -43,6 +46,7 @@ impl PrivateKernelInitCircuitPrivateInputs { private_call_public_inputs, self.vk_tree_root, self.protocol_contract_tree_root, + self.is_private_only, ) .with_private_call(private_call_public_inputs) .finish() @@ -73,6 +77,7 @@ impl PrivateKernelInitCircuitPrivateInputs { private_call_data_validator.array_lengths, self.vk_tree_root, self.protocol_contract_tree_root, + self.is_private_only, ); } output @@ -106,6 +111,7 @@ mod tests { private_call, vk_tree_root: FixtureBuilder::vk_tree_root(), protocol_contract_tree_root: 0, + is_private_only: false, } .execute() } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr index 2adb5603760..7914b5bbcec 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_reset.nr @@ -149,7 +149,7 @@ mod tests { private_log::PrivateLogData, side_effect::scoped::Scoped, }, address::AztecAddress, - hash::{silo_note_hash, silo_nullifier, silo_private_log}, + hash::{compute_unique_siloed_note_hash, silo_note_hash, silo_nullifier, silo_private_log}, point::Point, tests::{fixture_builder::FixtureBuilder, utils::{assert_array_eq, swap_items}}, traits::is_empty_array, @@ -245,14 +245,27 @@ mod tests { } pub fn compute_output_note_hashes( - self, + self: Self, note_hashes: [ScopedNoteHash; N], ) -> [ScopedNoteHash; N] { - // First nullifier is tx hash. - let tx_hash = self.previous_kernel.nullifiers.get_unchecked(0).value(); + let first_nullifier = self.previous_kernel.nullifiers.get_unchecked(0).value(); + let is_private_only = self.previous_kernel.is_private_only; + let min_revertible_side_effect_counter = + self.previous_kernel.min_revertible_side_effect_counter; + let mut output = note_hashes; for i in 0..N { - output[i].note_hash.value = silo_note_hash(note_hashes[i], tx_hash, i); + let note_hash = note_hashes[i]; + let siloed_note_hash = silo_note_hash(note_hash); + let unique_note_hash = + compute_unique_siloed_note_hash(siloed_note_hash, first_nullifier, i); + // We don't silo with nonce revertible note hashes, since we don't know their final position in the tx + output[i].note_hash.value = if is_private_only + | (note_hash.counter() < min_revertible_side_effect_counter) { + unique_note_hash + } else { + siloed_note_hash + }; output[i].contract_address = AztecAddress::zero(); } output diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr index 27276bed959..8ca0bd0d934 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/private_kernel_tail.nr @@ -84,6 +84,7 @@ mod tests { let mut previous_kernel = FixtureBuilder::new().in_vk_tree(PRIVATE_KERNEL_INNER_INDEX); previous_kernel.tx_context.gas_settings.gas_limits = Gas::new(1_000_000, 1_000_000); previous_kernel.set_first_nullifier(); + previous_kernel.is_private_only = true; PrivateKernelTailInputsBuilder { previous_kernel } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/validate_no_transient_data.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/validate_no_transient_data.nr index d74f3c3bafb..03cb38c03e4 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/validate_no_transient_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/previous_kernel_validator_builder/validate_no_transient_data.nr @@ -15,13 +15,16 @@ impl PreviousKernelValidatorBuilder { #[test] fn validate_no_transient_data_no_extra_nullifiers_succeeds() { - let builder = PreviousKernelValidatorBuilder::new(); + let mut builder = PreviousKernelValidatorBuilder::new(); + builder.previous_kernel.is_private_only = true; + builder.validate_for_private_tail(); } #[test] fn validate_no_transient_data_no_transient_nullifiers_succeeds() { let mut builder = PreviousKernelValidatorBuilder::new(); + builder.previous_kernel.is_private_only = true; builder.previous_kernel.append_siloed_nullifiers(3); @@ -31,6 +34,7 @@ fn validate_no_transient_data_no_transient_nullifiers_succeeds() { #[test] fn validate_no_transient_data_nullifiers_for_note_hashes_succeeds() { let mut builder = PreviousKernelValidatorBuilder::new(); + builder.previous_kernel.is_private_only = true; let siloed_note_hashes = builder.append_same_inner_note_hashes(); builder.previous_kernel.add_siloed_nullifier(1); @@ -44,6 +48,7 @@ fn validate_no_transient_data_nullifiers_for_note_hashes_succeeds() { #[test(should_fail_with = "Cannot link a note hash emitted after a nullifier")] fn validate_no_transient_data_nullifiers_for_note_hashes_emitted_after_fails() { let mut builder = PreviousKernelValidatorBuilder::new(); + builder.previous_kernel.is_private_only = true; builder.previous_kernel.append_siloed_nullifiers(2); // Emit the note hashes after the nullifiers @@ -59,6 +64,7 @@ fn validate_no_transient_data_nullifiers_for_note_hashes_emitted_after_fails() { #[test(should_fail_with = "Hinted siloed note hash does not match nullified note hash")] fn validate_no_transient_data_nullifiers_for_note_hashes_not_found_fails() { let mut builder = PreviousKernelValidatorBuilder::new(); + builder.previous_kernel.is_private_only = true; let siloed_note_hashes = builder.append_same_inner_note_hashes(); builder.previous_kernel.add_siloed_nullifier(1); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr index 0604a83155e..3341a76c071 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/mod.nr @@ -56,7 +56,7 @@ impl PrivateKernelCircuitOutputValidatorBuilder { self.output.counter = 777; } - pub fn validate_as_first_call(self) { + pub fn validate_as_first_call(self, is_private_only: bool) { let private_call = self.private_call.to_private_call_data(); let array_lengths = PrivateCircuitPublicInputsArrayLengths::new(private_call.public_inputs); let output = self.output.to_private_kernel_circuit_public_inputs(); @@ -66,6 +66,7 @@ impl PrivateKernelCircuitOutputValidatorBuilder { array_lengths, FixtureBuilder::vk_tree_root(), self.private_call.protocol_contract_tree_root, + is_private_only, ); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr index 5e9d29a5674..809437b6ec8 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_initial_values.nr @@ -4,7 +4,7 @@ use dep::types::address::AztecAddress; #[test] fn validate_initial_values_empty_data_succeeds() { let builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } /** @@ -16,16 +16,25 @@ fn validate_initial_values_constants_mismatch_chain_id_fails() { builder.output.tx_context.chain_id += 1; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); +} + +#[test(should_fail_with = "mismatch is_private_only")] +fn validate_initial_values_is_private_only_mismatch_fails() { + let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); + + builder.output.is_private_only = true; + + builder.validate_as_first_call(false); } #[test(should_fail_with = "mismatch historical_header")] -fn validate_initial_values_constants_mismatch_txs_effects_hash_fails() { +fn validate_initial_values_constants_mismatch_out_hash_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - builder.output.historical_header.content_commitment.txs_effects_hash += 1; + builder.output.historical_header.content_commitment.out_hash += 1; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } /** @@ -39,7 +48,7 @@ fn validate_initial_values_constants_incorrect_first_nullifier_fails() { nullifier.nullifier.value += 1; builder.output.nullifiers.set(0, nullifier); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "first nullifier must be the tx request nullifier")] @@ -48,7 +57,7 @@ fn validate_initial_values_constants_empty_first_nullifier_fails() { builder.output.nullifiers = BoundedVec::new(); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } /** @@ -61,7 +70,7 @@ fn validate_initial_values_min_revertible_side_effect_counter_succeeds() { builder.private_call.min_revertible_side_effect_counter = 8989; builder.output.min_revertible_side_effect_counter = 8989; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial min_revertible_side_effect_counter")] @@ -71,7 +80,7 @@ fn validate_initial_values_min_revertible_side_effect_counter_mismatch_fails() { builder.private_call.min_revertible_side_effect_counter = 8989; builder.output.min_revertible_side_effect_counter = 50; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial min_revertible_side_effect_counter")] @@ -80,7 +89,7 @@ fn validate_initial_values_min_revertible_side_effect_counter_empty_output_fails builder.private_call.min_revertible_side_effect_counter = 8989; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial min_revertible_side_effect_counter")] @@ -89,7 +98,7 @@ fn validate_initial_values_min_revertible_side_effect_counter_random_output_fail builder.output.min_revertible_side_effect_counter = 8989; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } /** @@ -102,7 +111,7 @@ fn validate_initial_values_max_block_number_succeeds() { builder.private_call.set_max_block_number(123); builder.output.set_max_block_number(123); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial max_block_number")] @@ -112,7 +121,7 @@ fn validate_initial_values_max_block_number_mismatch_fails() { builder.private_call.set_max_block_number(4567); builder.output.set_max_block_number(123); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial max_block_number")] @@ -121,7 +130,7 @@ fn validate_initial_values_max_block_number_empty_output_fails() { builder.private_call.set_max_block_number(4567); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial max_block_number")] @@ -130,7 +139,7 @@ fn validate_initial_values_max_block_number_random_output_fails() { builder.output.set_max_block_number(123); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } /** @@ -143,7 +152,7 @@ fn validate_initial_values_public_teardown_call_request_succeeds() { builder.private_call.set_public_teardown_call_request(); builder.output.set_public_teardown_call_request(); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial public_teardown_call_request")] @@ -155,7 +164,7 @@ fn validate_initial_values_public_teardown_call_request_mismatch_fails() { // Tweak the output. builder.output.public_teardown_call_request.args_hash += 1; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial public_teardown_call_request")] @@ -164,7 +173,7 @@ fn validate_initial_values_public_teardown_call_request_empty_output_fails() { builder.private_call.set_public_teardown_call_request(); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial public_teardown_call_request")] @@ -173,7 +182,7 @@ fn validate_initial_values_public_teardown_call_request_random_output_fails() { builder.output.set_public_teardown_call_request(); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } /** @@ -186,7 +195,7 @@ fn validate_initial_values_fee_payer_succeeds() { let fee_payer = builder.private_call.make_fee_payer(); builder.output.set_fee_payer(fee_payer); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial fee_payer")] @@ -198,7 +207,7 @@ fn validate_initial_values_fee_payer_mismatch_fails() { // Tweak the output. builder.output.fee_payer.inner += 1; - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial fee_payer")] @@ -207,7 +216,7 @@ fn validate_initial_values_fee_payer_empty_output_fails() { let _ = builder.private_call.make_fee_payer(); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } #[test(should_fail_with = "incorrect initial fee_payer")] @@ -216,5 +225,5 @@ fn validate_initial_values_fee_payer_random_output_fails() { builder.output.set_fee_payer(AztecAddress::from_field(123)); - builder.validate_as_first_call(); + builder.validate_as_first_call(false); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_propagated_from_previous_kernel.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_propagated_from_previous_kernel.nr index 47eb0b63a25..9491db1f739 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_propagated_from_previous_kernel.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_output_validator_builder/validate_propagated_from_previous_kernel.nr @@ -18,15 +18,6 @@ fn validate_propagated_from_previous_kernel_constants_mismatch_chain_id_fails() builder.validate_as_inner_call(); } -#[test(should_fail_with = "mismatch constants")] -fn validate_propagated_from_previous_kernel_constants_mismatch_txs_effects_hash_fails() { - let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); - - builder.output.historical_header.content_commitment.txs_effects_hash += 1; - - builder.validate_as_inner_call(); -} - #[test(should_fail_with = "mismatch constants")] fn validate_propagated_from_previous_kernel_constants_mismatch_protocol_contract_tree_root_fails() { let mut builder = PrivateKernelCircuitOutputValidatorBuilder::new(); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr index 91559e7c9f1..17142c3e007 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/mod.nr @@ -34,13 +34,17 @@ impl PrivateKernelCircuitPublicInputsComposerBuilder { } } - pub fn new_from_tx_request(self) -> PrivateKernelCircuitPublicInputsComposer { + pub fn new_from_tx_request( + self, + is_private_only: bool, + ) -> PrivateKernelCircuitPublicInputsComposer { let private_call = self.private_call.to_private_circuit_public_inputs(); PrivateKernelCircuitPublicInputsComposer::new_from_tx_request( self.tx_request, private_call, FixtureBuilder::vk_tree_root(), self.private_call.protocol_contract_tree_root, + is_private_only, ) } @@ -51,10 +55,16 @@ impl PrivateKernelCircuitPublicInputsComposerBuilder { } } - pub fn compose_from_tx_request(self) -> PrivateKernelCircuitPublicInputs { + pub fn compose_from_tx_request( + self, + is_private_only: bool, + ) -> PrivateKernelCircuitPublicInputs { let private_call = self.private_call.to_private_call_data(); unsafe { - self.new_from_tx_request().with_private_call(private_call.public_inputs).finish() + self + .new_from_tx_request(is_private_only) + .with_private_call(private_call.public_inputs) + .finish() } } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_tx_request.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_tx_request.nr index b332fe9fb49..6fdd5a7332e 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_tx_request.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/new_from_tx_request.nr @@ -20,9 +20,10 @@ fn new_from_tx_request_succeeds() { builder.private_call.historical_header.content_commitment.out_hash = 122122; let historical_header = builder.private_call.historical_header; - let output = builder.new_from_tx_request().public_inputs.finish(); + let output = builder.new_from_tx_request(false).public_inputs.finish(); // Check output constants. + assert_eq(output.is_private_only, false); assert_eq(output.constants.tx_context, tx_request.tx_context); assert_eq(output.constants.historical_header, historical_header); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr index 4446d2f45ad..43c35f3506d 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/private_kernel_circuit_public_inputs_composer_builder/propagate_from_private_call.nr @@ -14,7 +14,7 @@ fn propagate_from_private_call_empty_data_succeeds() { let tx_request = builder.tx_request; let first_nullifier = create_first_nullifier(tx_request); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_eq(output.end.nullifiers[0], first_nullifier); @@ -36,7 +36,7 @@ fn propagate_from_private_call_min_revertible_side_effect_counter_succeeds() { builder.private_call.min_revertible_side_effect_counter = 123; - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_eq(output.min_revertible_side_effect_counter, 123); } @@ -47,7 +47,7 @@ fn propagate_from_private_call_max_block_number_succeeds() { builder.private_call.set_max_block_number(123); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_eq(output.validation_requests.for_rollup.max_block_number.unwrap(), 123); } @@ -59,7 +59,7 @@ fn propagate_from_private_call_note_hash_read_requests_succeeds() { builder.private_call.append_note_hash_read_requests(2); let res = builder.private_call.note_hash_read_requests.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq( output.validation_requests.note_hash_read_requests, @@ -74,7 +74,7 @@ fn propagate_from_private_call_nullifier_read_requests_succeeds() { builder.private_call.append_nullifier_read_requests(2); let res = builder.private_call.nullifier_read_requests.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq( output.validation_requests.nullifier_read_requests, @@ -89,7 +89,7 @@ fn propagate_from_private_call_key_validation_requests_succeeds() { builder.private_call.append_key_validation_requests(2); let res = builder.private_call.scoped_key_validation_requests_and_generators.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq( output.validation_requests.scoped_key_validation_requests_and_generators, @@ -104,7 +104,7 @@ fn propagate_from_private_call_note_hashes_succeeds() { builder.private_call.append_note_hashes(2); let res = builder.private_call.note_hashes.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq(output.end.note_hashes, [res[0], res[1]]); } @@ -119,7 +119,7 @@ fn propagate_from_private_call_nullifiers_succeeds() { let tx_request = builder.tx_request; let first_nullifier = create_first_nullifier(tx_request); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq(output.end.nullifiers, [first_nullifier, res[0], res[1]]); } @@ -131,7 +131,7 @@ fn propagate_from_private_call_l2_to_l1_msgs_succeeds() { builder.private_call.append_l2_to_l1_msgs(2); let res = builder.private_call.l2_to_l1_msgs.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq(output.end.l2_to_l1_msgs, [res[0], res[1]]); } @@ -143,7 +143,7 @@ fn propagate_from_private_call_private_logs_succeeds() { builder.private_call.append_private_logs(2); let res = builder.private_call.private_logs.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq(output.end.private_logs, [res[0], res[1]]); } @@ -155,7 +155,7 @@ fn propagate_from_private_call_contract_class_log_hashes_succeeds() { builder.private_call.add_contract_class_log_hash(2, 200); let res = builder.private_call.contract_class_logs_hashes.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq(output.end.contract_class_logs_hashes, [res[0]]); } @@ -167,7 +167,7 @@ fn propagate_from_private_call_private_call_requests_succeeds() { builder.private_call.append_private_call_requests(2); let res = builder.private_call.private_call_requests.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); // Call requests will be propagated in reversed order. assert_array_eq(output.end.private_call_stack, [res[1], res[0]]); @@ -180,7 +180,7 @@ fn propagate_from_private_call_public_call_requests_succeeds() { builder.private_call.append_public_call_requests(2); let res = builder.private_call.public_call_requests.storage(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_array_eq(output.end.public_call_requests, [res[0], res[1]]); } @@ -192,7 +192,7 @@ fn propagate_from_private_call_public_teardown_call_request_succeeds() { builder.private_call.set_public_teardown_call_request(); let res = builder.private_call.public_teardown_call_request; - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_eq(output.public_teardown_call_request, res); } @@ -203,7 +203,7 @@ fn propagate_from_private_call_fee_payer_succeeds() { let fee_payer = builder.private_call.make_fee_payer(); - let output = builder.compose_from_tx_request(); + let output = builder.compose_from_tx_request(false); assert_eq(output.fee_payer, fee_payer); } diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_validator_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_validator_builder/mod.nr index c84cbeaab2b..e147656197e 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_validator_builder/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-lib/src/tests/tail_output_validator_builder/mod.nr @@ -30,6 +30,7 @@ impl TailOutputValidatorBuilder { Gas::new(DEFAULT_GAS_LIMIT, DEFAULT_GAS_LIMIT), Gas::new(DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT), GasFees::new(10, 10), + GasFees::new(3, 3), ); let mut output = FixtureBuilder::new(); diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/Prover.toml similarity index 97% rename from noir-projects/noir-protocol-circuits/crates/private-kernel-reset/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/private-kernel-reset/Prover.toml index 4d09c95f174..014404d3e37 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/Prover.toml @@ -1,215 +1,216 @@ [previous_kernel] -vk_index = "0x0000000000000000000000000000000000000000000000000000000000000002" +vk_index = "0x0000000000000000000000000000000000000000000000000000000000000003" vk_path = [ - "0x2f3154da5d44e350196dbee4f92a7f45ad5de77f60e166d763413dbea9a7f0bc", - "0x1867f6023f71543c6d9ad5a6534a4c57456da8c19d233e2312c0d2d1ac3fb1a3", - "0x1bab5e0ed3aced3f9bc58d3f96a0252a380994c4bd9819e83ccd1afcaff3ed0f", - "0x16689f45f3440063faf62389449732a5d04a721e5133f1d532400d2f690a7af3", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x0adf52c61cdf9eff768b463c554a67f3cac73b0c1cea2d3fcee90db3d7fccc20", + "0x2788666fcc1fce27d0ac10e13716483d548ddc3411f466e5caef85cea2384902", + "0x281a8c9b2c044cffa01e5f56858d1d71aa11c4b28a1e90407565ca646ea0ee5d", + "0x25e71fd64ecaa6b98ef492c6d93da8164a259284041220c258edb94fe47706ab", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] [previous_kernel.vk] key = [ - "0x0000000000000000000000000000000000000000000000000000000000010000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000001e965c85", - "0x0000000000000000000000000000000000000000000000000000000023c1ca18", - "0x0000000000000000000000000000000000000000000000000000000031d68272", - "0x00000000000000000000000000000000000000000000000000000000679ec723", - "0x000000000000000000000000000000000000000000000000000000008df6ae9b", - "0x000000000000000000000000000000000000000000000000000000006a4609af", - "0x000000000000000000000000000000000000000000000000000000005b9b5343", - "0x00000000000000000000000000000000000000000000000000000000eb2cb8e2", - "0x00000000000000000000000000000000000000000000000000000000bcf6f48d", - "0x00000000000000000000000000000000000000000000000000000000123862d7", - "0x00000000000000000000000000000000000000000000000000000000f524ad21", - "0x0000000000000000000000000000000000000000000000000000000028fbc96e", - "0x0000000000000000000000000000000000000000000000000000000078f8ee90", - "0x000000000000000000000000000000000000000000000000000000008bd64fb7", - "0x00000000000000000000000000000000000000000000000000000000c8a418db", - "0x000000000000000000000000000000000000000000000000000000002b424553", - "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000100000", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000080d1cc1e8a0052aa9b90a200653dd422d2", - "0x00000000000000000000000000000000001bde92bd26c3e4950f3b741821c986", - "0x000000000000000000000000000000311c5b4624a2f98920a56d5d8aa33acffa", - "0x00000000000000000000000000000000002ed497dde07da602fcbe7200dcede8", - "0x000000000000000000000000000000d2c2303932c390b15b2e2cd9e50f93467d", - "0x000000000000000000000000000000000006e7ec0215862713d7d3fe9bf91ddf", - "0x000000000000000000000000000000e8a1c818be9c892ca08cbfdd926cc9f0cb", - "0x00000000000000000000000000000000002e236e7809bc609ae66b472dffceec", - "0x00000000000000000000000000000081a3b0ed1645220c1e9c393e3ed4266916", - "0x000000000000000000000000000000000004502e5d9ad2af9f227b28bdc76dd0", - "0x00000000000000000000000000000088b295973a674600ccb3aeee7eaf59b5dc", - "0x00000000000000000000000000000000000204dacad87ba087760da5ce59e4ec", - "0x000000000000000000000000000000568ffcdd258fbc908ef8cb3f523724ebbb", - "0x00000000000000000000000000000000001449af8b222cd56f08bb2d4d0eab62", - "0x00000000000000000000000000000058e814dbee31163c88e65a018703cbd25e", - "0x00000000000000000000000000000000000273c12779deadec18fef6c61a385a", - "0x0000000000000000000000000000007cfb6a0b456c4f46f4936d82bbf4361228", - "0x0000000000000000000000000000000000119ede625ecc28afb633286cc7a656", - "0x00000000000000000000000000000043eab1f171867fa2b043957a9ee2b29a9e", - "0x0000000000000000000000000000000000042eaa4eb027930197ce6b600be338", - "0x000000000000000000000000000000a7f02356e0556cde5b62df3a8db287e94c", - "0x00000000000000000000000000000000001b01202990f8590e970c45e39d6098", - "0x000000000000000000000000000000db250162480ade3b48e517f2fb82d4f5ef", - "0x00000000000000000000000000000000001a33afb466343efec94ff065384292", - "0x000000000000000000000000000000782cc9806e3faf458b64057b60d21fead6", - "0x00000000000000000000000000000000002784a14f6507f109dc8792b6dda8de", - "0x000000000000000000000000000000c412364eea07c4018a0d66bc421e1d1103", - "0x000000000000000000000000000000000004a2c1476960cd953e32d6a4e599a4", - "0x0000000000000000000000000000006a41290728ca7b2df13debc3203ca186a0", - "0x00000000000000000000000000000000000746aa799d74814c50e7c735e8215c", - "0x00000000000000000000000000000059a3a77051813aac6258a4da543f5415cb", - "0x00000000000000000000000000000000000f7eff39e8ab5d6df18a1bebe620e8", - "0x000000000000000000000000000000a638da11ef0b34653dd5b751ede787064f", - "0x000000000000000000000000000000000027dec1070ec57786ae952bc935affb", - "0x000000000000000000000000000000ff241408596b6a4876807254fe777f355b", - "0x000000000000000000000000000000000006c60609a6bd7d1d937e9bb8eb10eb", - "0x000000000000000000000000000000d6d7486b45c8cbdc37ca896f712904afe3", - "0x000000000000000000000000000000000023ca50b92e2686b2a4f500ad1a32df", - "0x000000000000000000000000000000ba4d49c250c6a747ccb80817a52f8354c9", - "0x0000000000000000000000000000000000131b4039e8562f2c279ab64023cf2b", - "0x000000000000000000000000000000e7bfab35ced53fe9983ffd9f664a6f5ec7", - "0x00000000000000000000000000000000002abc5fa369a4a2076e4c9a9a73c13b", - "0x000000000000000000000000000000f90145562147642fc141023ce7398ff4d8", - "0x0000000000000000000000000000000000130f4d01b034b4b7024632e6a84c1f", - "0x000000000000000000000000000000387b054f66b34898be8b41bb1735fd6ac0", - "0x00000000000000000000000000000000002d425d547dab883a46e81dc6f3cf6f", - "0x000000000000000000000000000000d89a9b307c9fe79abcdaacd9cf9c2a1beb", - "0x00000000000000000000000000000000001ecd39889bc6ab3fd94f2ea0ef67be", - "0x000000000000000000000000000000b02de601095082fcac49babecb0a3750bd", - "0x000000000000000000000000000000000027e05def21d1cf1c8573c44f4626f4", - "0x000000000000000000000000000000a8f281e87ff537b5c592634b821fa78d58", - "0x0000000000000000000000000000000000030c18e72e6f39c4c768d80919b0b4", - "0x00000000000000000000000000000002c9461d46ea0bb78dc58426271926189f", - "0x000000000000000000000000000000000022bf974876cf8ec1f54a14ba1324d8", - "0x000000000000000000000000000000316be292070b9e8de40862ef21004a8d4a", - "0x00000000000000000000000000000000002a10056158edaacac74a5d66e5ed9e", - "0x0000000000000000000000000000000c494c09f17b7262d079208c6eb0a00145", - "0x00000000000000000000000000000000000d9a4149e43f78295e0d4fea2f948e", - "0x000000000000000000000000000000e84bb8800b9e05167febb41a30cd47e390", - "0x00000000000000000000000000000000000db6da2b1bae28dd39e21d0ede4d08", - "0x000000000000000000000000000000f3c2772dce20d1c32600a51712749de50d", - "0x000000000000000000000000000000000011f08e7c3f4212b82226c281a63979", - "0x00000000000000000000000000000034ff22874f83ce60b7386940ee74e468b2", - "0x00000000000000000000000000000000001b77b23d3a7a743c543e7ced19249a", - "0x0000000000000000000000000000009e83e3cf99aeef964426ee6150b79ac916", - "0x00000000000000000000000000000000001270f91aebe8cdceb78a9a183428d6", - "0x00000000000000000000000000000090c8a7f186b644cfb911d91ac5d89862d2", - "0x00000000000000000000000000000000002a5b0bf49e5d28bdc7c0860622a12f", - "0x000000000000000000000000000000b9ffbf90a0ed1cb7d4b3332a313c7aab2a", - "0x00000000000000000000000000000000000a70fddfa04ec305d6d15f14e77f48", - "0x0000000000000000000000000000003324f41b970cc329ece5e61a09335f43fa", - "0x00000000000000000000000000000000001966380d7f44f6631c50007af07faf", - "0x0000000000000000000000000000008ff202341b29a2b75931e282b9ba2bed7d", - "0x00000000000000000000000000000000001ca2f20440c025993fa231674a7dd7", - "0x000000000000000000000000000000d051535a873c455fbd58670d23a868ffdb", - "0x00000000000000000000000000000000001e9e04adc96f05722f862c85b0fe84", - "0x000000000000000000000000000000b0ce4b33e6baa16caebbb51daea2159ee0", - "0x0000000000000000000000000000000000176055375539cfb6e39fa53d08dd31", - "0x0000000000000000000000000000001cef11535c666a1dfcba37802e73ad3175", - "0x00000000000000000000000000000000000c4396ba541edbb1ba4f2b5169d01c", - "0x000000000000000000000000000000ebfe64961fe0f20647555f12d884a68d47", - "0x00000000000000000000000000000000001a003f506dd29323b5a165a856f470", - "0x000000000000000000000000000000add694f9d6eb2572fc6b8f97f061e0c59b", - "0x000000000000000000000000000000000021d937752f0ea0f14cbeabefd3cf68", - "0x00000000000000000000000000000055db222772758209727c7aaae9481ec01b", - "0x00000000000000000000000000000000001394f4c938e9032ddb81c7cc9f5142", - "0x000000000000000000000000000000978be6ae78a6323e4df1fde96a97ffbf5f", - "0x00000000000000000000000000000000001808d013744d71ef9c3620c7239887", - "0x000000000000000000000000000000706955c206990d792f637b6078f615eda1", - "0x000000000000000000000000000000000019a6d36a2feff9bae37378a92abb28", - "0x000000000000000000000000000000656697aa0c1d5fd99f39eb4a2b1628dd04", - "0x00000000000000000000000000000000002b537e0756a357b71f2dcf5ec0a2aa", - "0x000000000000000000000000000000692136362f6d1f4d425b9f0ab108472221", - "0x00000000000000000000000000000000002545045bac7e6023a329535cd37207", - "0x000000000000000000000000000000ed300b801a8bad905b5c1eef277532dff6", - "0x0000000000000000000000000000000000008247821a1c4b6b5dcce33cab7cea", - "0x000000000000000000000000000000a864cd31e6fd0fad0757ea697e2c158ca1", - "0x000000000000000000000000000000000026a578b6f065f4de6ea88088703e11", - "0x000000000000000000000000000000c885b51a2922a5f39f5f498d79620fc14c", - "0x0000000000000000000000000000000000277c03bdf386a0f78ab57602ae4761", - "0x000000000000000000000000000000895e363e0ec3a10bac5c9159495803fb84", - "0x000000000000000000000000000000000013b6cd9ee2401e0b569e155e9fb4f7", - "0x00000000000000000000000000000016e12cad61f9bb5fa728cf28ced7cba5c1", - "0x00000000000000000000000000000000001fcd3ef5d518990bdc35d6041d5e1f", + "0x0000000000000000000000000000009684c4ae9fe82713e3a8eea60d3c922fc9", + "0x00000000000000000000000000000000002200dda0dd6e67887e87dc8a8baed1", + "0x000000000000000000000000000000978d7bed9447855574ffcdb0d427640e74", + "0x0000000000000000000000000000000000130900428fccae8619c304961d2ab8", + "0x0000000000000000000000000000008f5d78eac245f24be1f1c35bcdffbb02f1", + "0x0000000000000000000000000000000000244072d67bf7f88a81d7c42ed506cd", + "0x0000000000000000000000000000001e2b25afb1eaff68309bbf6d0541e1765f", + "0x000000000000000000000000000000000026aaef79836ac6d9353c15fdc3d891", + "0x0000000000000000000000000000009299e3410bbc560396f32dc6f6eeaa68a0", + "0x0000000000000000000000000000000000179f5bb2e51449740274e9f9314d55", + "0x0000000000000000000000000000008b0e3b331bd5b80e6c1acc13c828f74d24", + "0x000000000000000000000000000000000007cb7696845757843ce9f1310efc92", + "0x000000000000000000000000000000eecc82922d49e9ac4932c91bf0f4d2e296", + "0x00000000000000000000000000000000002a4c4068f2cf06ac38db246df53067", + "0x00000000000000000000000000000044e020bcdd66ebd04570373bb18b0afc29", + "0x0000000000000000000000000000000000006922fdaa63918e64274d7f2f08ff", + "0x000000000000000000000000000000ac4ffa7d0e0489bd543204fcb8d5f490f3", + "0x0000000000000000000000000000000000246504badbfd2f04128d8a38182d16", + "0x00000000000000000000000000000078f915207cac9102f739c0d4e9b2ef7f35", + "0x00000000000000000000000000000000002d1d9f61a48a0cc1e932048f293e79", + "0x000000000000000000000000000000781cce35230238001a9124d65570d66cd0", + "0x00000000000000000000000000000000000a238a917967b7a390b395eab5a277", + "0x000000000000000000000000000000b517a64c56e67d4ed15901642ac2005f8c", + "0x000000000000000000000000000000000017688b33eb1a0b39547a17250aa2d2", + "0x000000000000000000000000000000fcf716ca9b2f777751df2a339a6ed69e0c", + "0x000000000000000000000000000000000024ddb4dd78bd8b18179c69efa2c73c", + "0x0000000000000000000000000000002d5fa8ac91e41a8f17d6bce5166bdf7f27", + "0x0000000000000000000000000000000000228f4a2b555cea5235e25e037135db", + "0x00000000000000000000000000000065ba05104dc21c3d6d986ed80d332c155d", + "0x00000000000000000000000000000000001579bf3418bf598eb69cfdb4b72f3c", + "0x000000000000000000000000000000bbccb29ad8caedd39ceb51b581522b92be", + "0x00000000000000000000000000000000002d375a0cb7863f71f059cf3c2dd966", + "0x0000000000000000000000000000004c34ea8547375e7795bb3beba7caa35e3a", + "0x00000000000000000000000000000000002b32c570a22732f30f06dd9fd4dcbf", + "0x00000000000000000000000000000088c5549f44ac0b2a05666c05f0071d14b9", + "0x00000000000000000000000000000000001c7a1568edd62fce047c0c7204ff52", + "0x0000000000000000000000000000008283e6ad48f41eeadadeae2c02f4fadf44", + "0x00000000000000000000000000000000001cb3cdb38a62d0033d2afd233b8940", + "0x000000000000000000000000000000bb5e9a1635fe20062208fa2a10999a62ee", + "0x0000000000000000000000000000000000169029b757a992e183a19bbf71ba26", + "0x0000000000000000000000000000002607173eefef8bd097b55ca7d21bb56902", + "0x00000000000000000000000000000000002bd04414a7a10f42826c1175f6b33b", + "0x0000000000000000000000000000001fe1da1a19100e2630c67ede5a97c0c96b", + "0x000000000000000000000000000000000011f88b7e597282bf11163d156f9aa3", + "0x000000000000000000000000000000aa209f011ce13ef1085635ab23eb66ed51", + "0x000000000000000000000000000000000025ebd54362b7760a60ad40905fec62", + "0x00000000000000000000000000000070633515d456282fd993ce44f4cabe2fc8", + "0x00000000000000000000000000000000000ce13df53e45761d5ca123593f51e8", + "0x00000000000000000000000000000076cfc7160e0914e9ac8c6eee0ab5849fb1", + "0x00000000000000000000000000000000002360b1c0221f9ec4e6def11e95e272", + "0x0000000000000000000000000000000044107195b405f828ae4099c3e2cf9e9c", + "0x00000000000000000000000000000000002ff5986cad78f0c745b4328a21f32c", + "0x000000000000000000000000000000d24f0a0cf38ca9316be400c743bbbb3bec", + "0x000000000000000000000000000000000027822ff7bb9483b29df97785ee5f9d", + "0x000000000000000000000000000000468d47d31fb480e2c192ddb6673e5cbea8", + "0x000000000000000000000000000000000001d6ab1aaf7944c2be04aea4060d71", + "0x000000000000000000000000000000352186c0ac198fcc43c147882dc38791ea", + "0x000000000000000000000000000000000026beb91f1a840b0027108fabff0526", + "0x000000000000000000000000000000984b3c4c7a109a6ba0eff050bc6352df53", + "0x00000000000000000000000000000000002351567eebd7207c2e3be8959f6f99", + "0x0000000000000000000000000000006feb796c33f7353b4e86be299ad338aafa", + "0x00000000000000000000000000000000001534436809cc52d83079a54e8b0c0f", + "0x000000000000000000000000000000f11b5463e81dac230c23b794cccb5531e9", + "0x00000000000000000000000000000000000ba332ef495a65ba8ed7ae9565dff7", + "0x00000000000000000000000000000037dfee070ea527ac5b0e30a795f9e92c50", + "0x0000000000000000000000000000000000141383125e1a3a4d9db9eb76c6d379", + "0x0000000000000000000000000000007b7bc3dd2e73a977ddb1c5f3a24c4c2cb0", + "0x000000000000000000000000000000000008bb35d27b1697fb726fa96565cf7e", + "0x0000000000000000000000000000005ceae614147425f8862ea29e131bdb1c22", + "0x0000000000000000000000000000000000238c39a25e7801303bf2b783cbca1a", + "0x00000000000000000000000000000058e2a565b371b2fb67d963bfa3fd24f260", + "0x00000000000000000000000000000000000430cca2ea66e13847c9eca22e3d50", + "0x00000000000000000000000000000023329893dcb782ff96ec94332b3be42781", + "0x000000000000000000000000000000000027d8e1c6ab2755ddfac71af70042ea", + "0x00000000000000000000000000000060e31e36a7177c94f13116e322e94f6c17", + "0x0000000000000000000000000000000000150a041538553900f4fcef7d7412fa", + "0x0000000000000000000000000000009cd8490bd0731d1977420e0ceb62fe14ea", + "0x00000000000000000000000000000000000133a20b88cf37e3a954be40b1efc7", + "0x0000000000000000000000000000002cbac70f6fcc2727b6a02ad66a3cf92665", + "0x00000000000000000000000000000000000172934f5f81cef8e4abc61d5e5f6d", + "0x000000000000000000000000000000f7d03783cdfa0502b891d7a7ad2ee5d20c", + "0x00000000000000000000000000000000002e09a8f26c5a2c086b0de83d5cab77", + "0x00000000000000000000000000000009281fb84ee048857c9f2067b045520cc7", + "0x00000000000000000000000000000000001e63cdca7c3207312fc760d45ab3f6", + "0x000000000000000000000000000000d0250f372687da1b79cda4f648582a76c8", + "0x00000000000000000000000000000000000f7628cb1a63b8357eb8bcc6f63c40", + "0x000000000000000000000000000000b79e44954dd5aee1fed23c97db5faf3aae", + "0x0000000000000000000000000000000000087e6b3370846649ec0a03cfc881ea", + "0x0000000000000000000000000000003acc6def4164d878b56e5b2fe2bfa52199", + "0x000000000000000000000000000000000022cf69996ae471056bcae7b3c38cbc", + "0x000000000000000000000000000000239623839c51be6ffe83c77c80b8f94ad5", + "0x0000000000000000000000000000000000075cc2c3c9e3079bec86764aa5cfd0", + "0x0000000000000000000000000000008c88b485298919bf7164440942d6f6c5ad", + "0x00000000000000000000000000000000000c5dd6e29eac9076cc2f5995fcf27c", + "0x0000000000000000000000000000005b7ac436f888999a48f79ef212e6483f14", + "0x000000000000000000000000000000000009fc56f5a2122d1ed9353860ba68ab", + "0x000000000000000000000000000000dace4e23bf41b55e3098bd8e82e74b1c1e", + "0x00000000000000000000000000000000000883499c226658d83b4d0cc7b08c15", + "0x0000000000000000000000000000005c0373d8b286bf727301571a54e1636e77", + "0x00000000000000000000000000000000001f268c0945bdea494fbfc52e8581c1", + "0x000000000000000000000000000000c6b7e770c1e62e2504ce986f21324ff939", + "0x000000000000000000000000000000000001b92f92042ae2556e31cf72cc3990", + "0x0000000000000000000000000000007007220c2c02f4ec2c1c5fada9056b8c37", + "0x00000000000000000000000000000000003038ffe6284e174445a0eb11a63e0b", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000045b8524407b05f30d11cbd1cb427d95cea", - "0x000000000000000000000000000000000027f8e066f5fd8868da287ae4ac086c", - "0x000000000000000000000000000000227f39350d5738587cb09ddddeeafa3a83", - "0x00000000000000000000000000000000002daa96f285ceacdb2bd4b0de919779", - "0x000000000000000000000000000000b5c1eac95b264c302dc854e6f22d7330df", - "0x00000000000000000000000000000000000fcbbf9d3cf402baa3eeda5f0a9e49", - "0x000000000000000000000000000000def9d58fc2920836194261f7b163fefbaf", - "0x0000000000000000000000000000000000283edfda89c9480597f0b3442e9752", - "0x0000000000000000000000000000008ca9a0451964a7bbabbd9e369db7556253", - "0x000000000000000000000000000000000014567e2c3e84fc1e3e69d81f6ce580", - "0x000000000000000000000000000000d609c59feecf899f2b95aff519bbf3fb3c", - "0x00000000000000000000000000000000000378926f150c30c760965df469ae6e" -] - hash = "0x1c17b99295850f5efe7c6257d8aaf1193b3e577fef1918232147773d8a027465" + "0x0000000000000000000000000000008344e7cd358bb008fa2594f42e2058a4da", + "0x000000000000000000000000000000000028d98153e26aa139c5f995a12d6b82", + "0x000000000000000000000000000000ebbd996ba82dd482c0cd9f93dba5c948f1", + "0x00000000000000000000000000000000000abbbdb042fe5de7714689b4b198cb", + "0x000000000000000000000000000000f9e0b46413eb2fb09802dc6381d0c758d0", + "0x00000000000000000000000000000000000b7903a56c4534697c4609a32a627d", + "0x0000000000000000000000000000002047c7fa5c47cce84d3a096aece17ad007", + "0x0000000000000000000000000000000000103798affda545f221f27292077e83", + "0x0000000000000000000000000000004264681c9136a2fde7137335ef716fecde", + "0x000000000000000000000000000000000027ca9ccf01429923a61d872c7c224c", + "0x0000000000000000000000000000006df5ee4c1358443f5a14086b5196e13e46", + "0x0000000000000000000000000000000000192b1a6d3b14dfe5a9ad63951d2d76" +] + hash = "0x0a889b72ac9f79e9a8c4c5934e62f265fe1b862799220c8fef796558ef921a6f" [previous_kernel_public_inputs] min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +is_private_only = true [previous_kernel_public_inputs.constants] - vk_tree_root = "0x29b3f8723c40ed1bbe9a488b431c3c9f6cf2db42a459c26af94c1a51725598b6" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [previous_kernel_public_inputs.constants.historical_header] - total_fees = "0x00000000000000000000000000000000000000000000000000038bd721a50000" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004800" + total_fees = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000016771" [previous_kernel_public_inputs.constants.historical_header.last_archive] - root = "0x0444c9f614257a3b69bd98a69fde8cf2c166341ecaf22b5f2d46bb93d1295b86" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" [previous_kernel_public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" - txs_effects_hash = "0x00cddf5272e48fd0dd69860aa62246e9574a28fe38fe13ab5809bd3f7c3fc497" + blobs_hash = "0x0008822f60476d6dc34ec6109d3ad69dd1747a9484777021d8e717166bc7d5e6" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [previous_kernel_public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000090" [previous_kernel_public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x02b26b636ab372ec02aa2f064f3bfdc6648601c7b0de4f77cb59b55ee0e4a791" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" [previous_kernel_public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x2eff98c5d8e74c4d591ff7d37c86d23fe45bc70e5a92741a3a2743f0ffd0f69e" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" +root = "0x0a639c242b766d8bd94d437483546e33c4a8c27feadf50bc4ef523e9f191e927" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000500" [previous_kernel_public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x0585172a032b4d74f9357d16683d3bd352a06c17ca39388cf695b8b1d92ea55f" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" +root = "0x2528ba08e1171e992f4744a8d8761bbe5611447c52d673882bde6a9e3b716e1a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" [previous_kernel_public_inputs.constants.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x000000000000000000000000000000000000000000000000000000000000000a" - timestamp = "0x00000000000000000000000000000000000000000000000000000000675995c1" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" [previous_kernel_public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [previous_kernel_public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077a0" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [previous_kernel_public_inputs.constants.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -220,12 +221,12 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [previous_kernel_public_inputs.constants.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [previous_kernel_public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077a0" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [previous_kernel_public_inputs.validation_requests.for_rollup.max_block_number._opt] _is_some = false @@ -233,19 +234,19 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] -value = "0x2f230f264e440bc57470b6c764e9aeaebfce22b33be4c142a505f3706a068b13" +value = "0x1808fa11f6b6ffdbd9f9e94a8f4c91aa954111d43f44544ed0ffbbf73ccf9a63" counter = "0x0000000000000000000000000000000000000000000000000000000000000002" [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.contract_address] -inner = "0x0278e1c60c4e5973fb667f6da29d0998f9d45cf86dd9caeb10c06b61ed757466" +inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x1eeef2e1c70a7794a3586b4cf25058ac1b892b7d874294bf7dc5d1282591e04b" +counter = "0x0000000000000000000000000000000000000000000000000000000000000005" [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.validation_requests.note_hash_read_requests]] [previous_kernel_public_inputs.validation_requests.note_hash_read_requests.read_request] @@ -745,11 +746,11 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.nullifier_read_requests]] [previous_kernel_public_inputs.validation_requests.nullifier_read_requests.read_request] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" +counter = "0x0000000000000000000000000000000000000000000000000000000000000004" [previous_kernel_public_inputs.validation_requests.nullifier_read_requests.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.validation_requests.nullifier_read_requests]] [previous_kernel_public_inputs.validation_requests.nullifier_read_requests.read_request] @@ -1257,18 +1258,18 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators]] [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] -sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000000" +sk_app_generator = "0x0000000000000000000000000000000000000000000000000000000000000030" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request] - sk_app = "0x0000000000000000000000000000000000000000000000000000000000000000" + sk_app = "0x0d6dd1f75adac84b209ad26497e2f6796dc1d1a99a694303a18319a2d475df33" [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request.request.pk_m] - x = "0x0000000000000000000000000000000000000000000000000000000000000000" - y = "0x0000000000000000000000000000000000000000000000000000000000000000" + x = "0x175d325f91f136d09f7b5b30ee6e82a8720dcd4fadd87e9828a989461ffe5828" + y = "0x161bf54b24e177c5cbb154fc01a12732e92c21c5a04985cea5374033ed510b4c" is_infinite = false [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators]] [previous_kernel_public_inputs.validation_requests.scoped_key_validation_requests_and_generators.request] @@ -2221,19 +2222,19 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x250eff94c845907e4b441ec3e2ab9c7f96c90b19c35d98298903720596c8ae96" +counter = "0x0000000000000000000000000000000000000000000000000000000000000007" [previous_kernel_public_inputs.end.note_hashes.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x080d7e517a580a3e7e87d11e50504e3931844836624eef2031f2c29d27fcec98" +counter = "0x0000000000000000000000000000000000000000000000000000000000000009" [previous_kernel_public_inputs.end.note_hashes.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] @@ -2733,7 +2734,7 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x291b6a5faf8bf2ba4c44d1f3b1506ffdac77061631548247e6d123cacfe24229" +value = "0x1e4c23d7a900532cdb5687c5806be8da481285afb0abbbe8a3801d71451d08d8" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2742,12 +2743,12 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x08b671e5822c135c559a7b5a7ef58783ef97faed29ca80ac2d28bc1c77fbbbd2" +counter = "0x0000000000000000000000000000000000000000000000000000000000000006" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.nullifiers.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] @@ -3397,93 +3398,93 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] -note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" +counter = "0x0000000000000000000000000000000000000000000000000000000000000008" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x2d79cc0637eb70f6c46f8680291f1401502fe4d39564606106584b776d308ecf", + "0x00961dca5785af4bf09cf75a77cdfcfa8fa41413b16bee86604c1826795edeec", + "0x00f7933d99a2ac43f613e021cc11c6200bdf7d703ba411bfda70998dbbe91d18", + "0x005c34531ec16f9cba02c2f74e5b68f53ec6bc00000000000000000000000000", + "0x000000343ccbf71927c63534206273c8611b72a04d4db62e0d1e7a1f358dbfe9", + "0x00bbb6167707e40e023148c03968226c73db4574f5991f9d06194dd1782e9d92", + "0x00c2cfe592e585e6319b54b39631393055f7ff2e2fab8ed76f5ca49bc3e7c83b", + "0x0036f9cd24f2727bc025371ca810245a9267c936e7edf92bd90a302d44b9a6ff", + "0x00dabe139092b735a4288ee4a9379e4afdfa51708650fe26e91e239fa23f9375", + "0x00eae9418604595e2d9a6ad7d46b2fc1967d2d7da56c4072a76bb3f709982f49", + "0x00989ffa26ac3a205dc0b99de3a6507411d11fdba8c61d3c81aabed1f119dd27", + "0x008ee4cadeaf75aa216d88a2a3aad40ba71c9ca39176a9ac78da77e47cab5caa", + "0x009927c6b18981dfcabf0a63dfd61d0491d8ee2c893844bb2ca602012783d756", + "0x00a18c50eb974c9146d791e09d883b3ad300430e1bac3f225b96041bcee15fce", + "0x00d527b9e3f664614bdf0f851d75ac6acaf59d4dbbe565a36424dee99bbf878d", + "0x00ae2f375a95ac5c40bf04f2c3f117c27132f413368d5d56edc746174594f8ca", + "0x004ff8ae2b0b2ae2b61a01a94b966654d26714edd486f5acacb2feb360f09059", + "0x00fb3c03d810569bdb758dbcb063020c6119ae59bd66308035a17f93ec1a8e98" ] [previous_kernel_public_inputs.end.private_logs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] -note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000009" +counter = "0x000000000000000000000000000000000000000000000000000000000000000a" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x08f720b2dc01d9f869376d21c019e00d91ba4a2df4c411b8351967bc22f30833", + "0x0082d4f053d20f9e5d0133a2279d7e5e1edcee80e8ae64e2b31759ea2c9d8357", + "0x00b4293fe37ff8a12620c49682fe04fc280a5808fc52884c40905c8a9fd12c22", + "0x00a08522ae6abbcca7fa0574ba7dc99f9f881c00000000000000000000000000", + "0x000000b32f2e9c3feb52a65be2321e91560925b83d0be9ea0c8e41c5e71c4df1", + "0x00fa5845ce219f1a7dd626caa3c96b536a79a3a65b1e184bda69fbc6eb61bdfc", + "0x0028181637f8949f88e4a53422f95c86122248723091b21e8f469fc86b3f7bf6", + "0x00c45756c940e72b7532073a35d77febff4f9d61a7f15706ba058f552c4c4dec", + "0x00ff7429d367c5fb82596c900dae746bd4988941db33121f03a8d01d92646560", + "0x004ca4b6be792d1c2167e998174d676e6462d0995063cd2d28bed4a7a0205ee0", + "0x0075c3cbed81825b7d47fe05ffa7446ee7b637ead0b04f1fb74e5d5d8f6a2b61", + "0x0036e4ebe9d34f8cf36254dc26d3b8c4829781d742edd48bd4babc79d4f8e019", + "0x001e85147052819f92807729600faf577839327b3c9d6ddada8869a19fdc2f7c", + "0x00062d400f543f81e1379c1e275b50e2bd025e4adc8111ae7ee30615c4733c58", + "0x0036d19ebc307f6a255369bb16287ec77fe0671c2dc6b3151ffa75e99a560d55", + "0x00250cf6a0581f297c606cde1b35e500648010bd4e9bda5b8a98a5824e0ee3bd", + "0x00b16603236f00e2f4263ecb587c0bb087fdcfa9075b3dde4501dff76177d091", + "0x0046729300d452d6dfe8200e1958ea4c78b2ddb8108a5c9b11fe2f61ca2c092b" ] [previous_kernel_public_inputs.end.private_logs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x000000000000000000000000000000000000000000000000000000000000000b" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x2d24207cbf1dc0a827042e09794dba8765971047eb2f6890b2ba4c398ba95b1f", + "0x002fe17d85df96d8b9bc15c91d0d62b0173174cda5d991cd73e9b9da65e2956b", + "0x00da7b08beac5d98c229d91728587646f72777453b785d0624e59f0a8075661d", + "0x0089323120a21d889aee547c21faa1c03a1ead00000000000000000000000000", + "0x0000001a851e3ed1265dde6b01175571a83d0777b0c17791db74cd2b33589139", + "0x00d1f4a53e67b2221c1ce7bd6d5dc105b0b3a086dcabd173b2b874f6f13fa338", + "0x002ccc3ee9f522a252f7523703c162fb8807c24eb052d2871609e249c67bd5bb", + "0x006e1fd58f3479bb18d1abd812bef996dfc0a36d72d1472a930e77805f243952", + "0x007043fae6b109a981b1e34acf7281480b879f280fd607fa1df718c9a31acaf2", + "0x008c4f91880f265b065cea8a705bc508875182fe5a3837e2b5b8a14e231cbd59", + "0x0071c17f4d52aecdfb4d8c6b1e764ae137c836c0672bf3cc589a45878f2686a8", + "0x00c95d01a6e57b41af4f265b2c88f6ff3de54aa5c895ca6faa21e26a8d6134a5", + "0x00a54c12af2499afd7651644686c671c3d77ff4af32a6b181646c976329a0063", + "0x004567a7724f750c4b0c9c205f35f4a175ea93015792fc78fbd985e7c751cc1b", + "0x001b0870e32b1c3c28116435e5132496bdeb8a1d3b9acc62b7d57d82f230bdaf", + "0x0058272cd1119bc153b18b3a3c896138be6f5b9144f216cd6e6f1b5db7d8ef08", + "0x00c1c848fc01d649f264a3cf8ba8cade698e2c1dbd14f7a0077356f8381de748", + "0x00328549fac9e2e1ff6fc6aaef17fbb1fd5c973e01df61985fe056548fd4b5df" ] [previous_kernel_public_inputs.end.private_logs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" +inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] @@ -5044,8 +5045,8 @@ state = "0x0000000000000000000000000000000000000000000000000000000000000002" hint_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[hints.note_hash_read_request_hints.read_request_statuses]] -state = "0x0000000000000000000000000000000000000000000000000000000000000000" -hint_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +state = "0x0000000000000000000000000000000000000000000000000000000000000002" +hint_index = "0x0000000000000000000000000000000000000000000000000000000000000001" [[hints.note_hash_read_request_hints.read_request_statuses]] state = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -5555,7 +5556,7 @@ pending_value_index = "0x0000000000000000000000000000000000000000000000000000000 read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [hints.note_hash_read_request_hints.settled_read_hints.membership_witness] - leaf_index = "0" + leaf_index = "64" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", @@ -5563,10 +5564,10 @@ read_request_index = "0x00000000000000000000000000000000000000000000000000000000 "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x0ecb1a418857055abccedaee922d002252874973a1fc061f2f472ef67f8a63ba", - "0x2a355b921618fc9492f63d224f498688a1139f33e2c288c9b94a8ca5116404f0", + "0x18674fb10d20d823d1f6662ba72e75b0aec3c96597a26926faff64809b606464", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x0626f407b48c90bffc0306d77f9f4ab58f4f8e944068009340132c9c5a961a90", + "0x1352219a7f38a59a1ced55b5de4127dc73ae6e324e82a430ef1e8d49dd0678f9", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -5600,58 +5601,58 @@ read_request_index = "0x00000000000000000000000000000000000000000000000000000000 ] [hints.note_hash_read_request_hints.settled_read_hints.leaf_preimage] - value = "0x0b1ed5ead8436873934fd13c35a4195d19572c2cf1de6ba60834cbf1e356e5b3" + value = "0x1808fa11f6b6ffdbd9f9e94a8f4c91aa954111d43f44544ed0ffbbf73ccf9a63" [[hints.note_hash_read_request_hints.settled_read_hints]] -read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000040" +read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000001" [hints.note_hash_read_request_hints.settled_read_hints.membership_witness] - leaf_index = "0" + leaf_index = "768" sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x020fcd2bb8110357719fd398580862c643fe2c0bccfef7c2c43d27d72aabc12f", + "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x246218a1d11c91124c20e3394600ad16e5036e2b84aa6afcc8cf3422fd29b02c", + "0x1196b37a9f45bda9848dd661f2df18622a6b4efed01b1cb9eae812f3bf0bc0de", + "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", + "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] [hints.note_hash_read_request_hints.settled_read_hints.leaf_preimage] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x1eeef2e1c70a7794a3586b4cf25058ac1b892b7d874294bf7dc5d1282591e04b" [[hints.note_hash_read_request_hints.settled_read_hints]] read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000040" @@ -8816,7 +8817,7 @@ read_request_index = "0x00000000000000000000000000000000000000000000000000000000 value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[hints.nullifier_read_request_hints.read_request_statuses]] -state = "0x0000000000000000000000000000000000000000000000000000000000000000" +state = "0x0000000000000000000000000000000000000000000000000000000000000002" hint_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[hints.nullifier_read_request_hints.read_request_statuses]] @@ -9328,57 +9329,57 @@ read_request_index = "0x00000000000000000000000000000000000000000000000000000000 pending_value_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[hints.nullifier_read_request_hints.settled_read_hints]] -read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000040" +read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [hints.nullifier_read_request_hints.settled_read_hints.membership_witness] - leaf_index = "0" + leaf_index = "386" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x2400ff8fd292af7aef7aa4ad3a089eab0db06c2efa5f5ca6acdf437576a0803e", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x09c6c7fb7da021c7ffc8fe8192bd4803953f2a6d084ef6255ecdd71b36d8921f", + "0x17fceab5e6d15d0f76dd258329b0369a8c603e977a7b900046d484c9e616cca1", + "0x0424880a586d1288a51e34a5fccc9eff170c3280b8cee33ab0c8f091f2ed02bc", + "0x2bcbc5bc40a0f255336281e2157c74b9a9363f02e7f13782b63b3b79ee590c6f", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", + "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] [hints.nullifier_read_request_hints.settled_read_hints.leaf_preimage] - nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + nullifier = "0x144b73a1024ae49e8ba90c78acd884b038f1cbac5d4965c204d3b6db530de253" + next_nullifier = "0x163b0c52a7ec2a810b89962e6fc8a54e02d1cd8317f488801da02ae34733cd72" + next_index = "0x00000000000000000000000000000000000000000000000000000000000000c0" [[hints.nullifier_read_request_hints.settled_read_hints]] read_request_index = "0x0000000000000000000000000000000000000000000000000000000000000040" @@ -12720,11 +12721,11 @@ read_request_index = "0x00000000000000000000000000000000000000000000000000000000 next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[hints.key_validation_hints]] - request_index = "0x0000000000000000000000000000000000000000000000000000000000000040" + request_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [hints.key_validation_hints.sk_m] - hi = "0x0000000000000000000000000000000000000000000000000000000000000000" - lo = "0x0000000000000000000000000000000000000000000000000000000000000000" + hi = "0x000000000000000000000000000000001e44dbeede1e4c222b3b4c6fba97d4a2" + lo = "0x00000000000000000000000000000000345451835f952283fbb1498e21e4a0b0" [[hints.key_validation_hints]] request_index = "0x0000000000000000000000000000000000000000000000000000000000000040" diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/src/main.nr b/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/src/main.nr index 816dbc36271..c222c4d1ad5 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/src/main.nr +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-reset/src/main.nr @@ -19,7 +19,7 @@ global NULLIFIER_KEYS: u32 = MAX_KEY_VALIDATION_REQUESTS_PER_TX; // 64 global TRANSIENT_DATA_AMOUNT: u32 = MAX_NULLIFIERS_PER_TX; // 64 global NOTE_HASH_SILOING_AMOUNT: u32 = MAX_NOTE_HASHES_PER_TX; // 64 global NULLIFIER_SILOING_AMOUNT: u32 = MAX_NULLIFIERS_PER_TX; // 64 -global PRIVATE_LOG_SILOING_AMOUNT: u32 = MAX_PRIVATE_LOGS_PER_TX; // 64 +global PRIVATE_LOG_SILOING_AMOUNT: u32 = MAX_PRIVATE_LOGS_PER_TX; // 32 fn main( previous_kernel: PrivateKernelDataWithoutPublicInputs, diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-tail/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-tail-to-public/Prover.toml similarity index 96% rename from noir-projects/noir-protocol-circuits/crates/private-kernel-tail/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/private-kernel-tail-to-public/Prover.toml index 297e80df55a..56906ee628b 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-tail/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-tail-to-public/Prover.toml @@ -1,127 +1,127 @@ [previous_kernel] vk_index = "0x000000000000000000000000000000000000000000000000000000000000003d" vk_path = [ - "0x2c2fbbe37f9d391636cd0203ac75406410268dd17cac4e819751ed95601b6545", + "0x1244c900aaf510c80550db2a0494d131a07ec2684800cffed8ec133263b15333", "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1c8a90aab63d413063ab78dc95747482e54a43d2f6656e2d2795f61b93c52001", - "0x0c891ae59115a3d6560612b40b9616e96741743ef24a3adcea8cd5271bd79180", - "0x1de09d739ffa4f90754516aac77522c32a715c2a71ee8a448dbe4cb2b444e6b8", - "0x304624242284bce34078c5538a6d522ce35ffe0c1e05b78a65421374fdd9f1c3" + "0x088119e5ec3f249a7b799bddbe34331cf82f90c8906784d2e0968310179c7939", + "0x294627428812b68807885920cba841ce2106a57cecb487a57a2060f95d29d796", + "0x02dfdf8f45633da47ab6f47c909baf455131cf789f5ae4288ced1a5e0d09f031", + "0x0e65c2546de09afcb529706bce25d0237508d40bb8b24d173aef1d00e33cca8f" ] [previous_kernel.vk] key = [ "0x0000000000000000000000000000000000000000000000000000000000100000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000001e965c85", - "0x0000000000000000000000000000000000000000000000000000000023c1ca18", - "0x0000000000000000000000000000000000000000000000000000000031d68272", - "0x00000000000000000000000000000000000000000000000000000000679ec723", - "0x000000000000000000000000000000000000000000000000000000008df6ae9b", - "0x000000000000000000000000000000000000000000000000000000006a4609af", - "0x000000000000000000000000000000000000000000000000000000005b9b5343", - "0x00000000000000000000000000000000000000000000000000000000eb2cb8e2", - "0x00000000000000000000000000000000000000000000000000000000bcf6f48d", - "0x00000000000000000000000000000000000000000000000000000000123862d7", - "0x00000000000000000000000000000000000000000000000000000000f524ad21", - "0x0000000000000000000000000000000000000000000000000000000028fbc96e", - "0x0000000000000000000000000000000000000000000000000000000078f8ee90", - "0x000000000000000000000000000000000000000000000000000000008bd64fb7", - "0x00000000000000000000000000000000000000000000000000000000c8a418db", - "0x000000000000000000000000000000000000000000000000000000002b424553", - "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000016bfb3f1832ad90ef28f77dcda5ac0a734", - "0x000000000000000000000000000000000006f28d37976e91d6682ea1545c5155", - "0x000000000000000000000000000000a2b509fc38184e01858fed4f3632c1b04a", - "0x00000000000000000000000000000000002d08dc3047c5163f88c7de0bed3ce1", - "0x000000000000000000000000000000495a4b014f7c6d9648ea61408fabd8dbef", - "0x000000000000000000000000000000000016ca51195346fb8fd93418b2a7cb51", - "0x00000000000000000000000000000083b35506b7c5a786e909ce0a92317238e1", - "0x000000000000000000000000000000000024d28d12c49aad3853861bf5eb90ec", - "0x0000000000000000000000000000006920858c0060cee2701a670d30bb217788", - "0x00000000000000000000000000000000000b2c9ffc3dd965f82cfe14f3fa9b99", - "0x00000000000000000000000000000001cbf7576b81bc8387ae1c172a1c04ed6c", - "0x00000000000000000000000000000000002ad608e2ecfc42119941cf1c713f90", - "0x0000000000000000000000000000007ba22e64b3953756f2c38fc3c4b4973923", - "0x00000000000000000000000000000000001f9158ba44585ab85bb83b24fe8066", - "0x0000000000000000000000000000004144132be9a8177c1a8afd947ed7e85b2d", - "0x000000000000000000000000000000000006a4ddcd78b69f3402cd4a382ab7cd", - "0x0000000000000000000000000000001218da9c8aed2b11b4065c141a0dbca8fc", - "0x00000000000000000000000000000000000d784f4194ad06745a013f10a34825", - "0x000000000000000000000000000000632de6a328bc8b8e06151bf8547b32ff9b", - "0x000000000000000000000000000000000007cb5a6096713089e6282cb3bd6a31", - "0x000000000000000000000000000000a1708e991f8a2a14bc1ee09fee7d2a7690", - "0x00000000000000000000000000000000001f47d8d037cfef41606f0b5deb7893", - "0x00000000000000000000000000000069abb5eb895df621a90238104b223f56b9", - "0x00000000000000000000000000000000000a97a574408435518e99d67d269353", - "0x000000000000000000000000000000ffcc3affc0bf680513130a6685617daecf", - "0x000000000000000000000000000000000025099441f1dcb65d5ade44ee90f0a8", - "0x00000000000000000000000000000091ea4f12c332573e399918a0af06caf5da", - "0x00000000000000000000000000000000000995d9dcec0c26827fee769804d45c", - "0x0000000000000000000000000000002490c58de7421f9d13cbaf961099f1dcbd", - "0x000000000000000000000000000000000005e259512a10c3f05373915e40de19", - "0x0000000000000000000000000000003233391c28627b7ea6ecfa14664e2497c5", - "0x000000000000000000000000000000000018903bbdcbd06a0fe3ff2e9c5fe9fe", - "0x0000000000000000000000000000004f696649cba170d39b7d532628838f56da", - "0x00000000000000000000000000000000002a782c3738ea19588c3b969dcc847a", - "0x000000000000000000000000000000e2aaab5a33e4b6755525193e44a668fa2b", - "0x00000000000000000000000000000000002399ca72748755cffd247a3ccc5d11", - "0x0000000000000000000000000000003eddc4712c95e1c65b31a5d2fc868f94a5", - "0x000000000000000000000000000000000028f975a56305bf05cc1e6c1d0e13aa", - "0x000000000000000000000000000000686b59ed2a501be0a9aa67a2fea7638798", - "0x000000000000000000000000000000000029c706a1a782485788571b350d6ef3", - "0x0000000000000000000000000000009b8b2be0cef58ed8067a38edf1d1f8d624", - "0x00000000000000000000000000000000001096b67df478d73f07145be790a012", - "0x000000000000000000000000000000803596c64d2676b5b3edb459d3305adc7d", - "0x00000000000000000000000000000000002923097de8486a75448cab4b64d3c1", - "0x000000000000000000000000000000e815a9a5ef92cd35abd9302bc3e0586968", - "0x00000000000000000000000000000000001a11556c2a3e5e13c11ba5650f945f", - "0x000000000000000000000000000000b519dcb27222270a9614c5d7f56bc04208", - "0x00000000000000000000000000000000001f020b9cbfab935c388e0916fddd1b", - "0x0000000000000000000000000000001b8794af92b347d6650aee7846a137a1e6", - "0x000000000000000000000000000000000008eba1608afa9b8fba0cfe3a3fff06", - "0x00000000000000000000000000000046ccd638193c3fba3d4f128e4d950f63ba", - "0x0000000000000000000000000000000000113635c117cd7fc5df8a52be5838af", - "0x000000000000000000000000000000ca914b1888f7a6add94ff1af79b969cd41", - "0x00000000000000000000000000000000000b8b6e505823888994a2a5512e8ac0", - "0x00000000000000000000000000000046070796d3dec0ca855fbd0a6d615972b7", - "0x00000000000000000000000000000000002888ff2dbc05bf367b9cee07a4c294", - "0x000000000000000000000000000000780fc240103ce59360645c338d85059362", - "0x0000000000000000000000000000000000195fe0b3945089bd5fd3a554bb0166", - "0x0000000000000000000000000000006ebbff1583c51c346ea6ece51fed99dcbe", - "0x000000000000000000000000000000000007fcbe4fe8540430fd026f364a9b56", - "0x000000000000000000000000000000a0687b980a2e769e06496a8fb5e4af0078", - "0x000000000000000000000000000000000025a0ab444cefc72f89a26907819c14", - "0x000000000000000000000000000000b4d58acce5d3edea1c02db966b99a30d69", - "0x00000000000000000000000000000000002ec8a9d53c52c542a9fb7a190f4032", - "0x00000000000000000000000000000024be4295c337d4aff23358065ae7c3ee1c", - "0x00000000000000000000000000000000000bbac8b02ecb63f2118934f1de3b10", - "0x000000000000000000000000000000db46f2dcbe12680591173092e82ba5eb56", - "0x00000000000000000000000000000000000ed470e49bff4d0b6e25b46c822152", - "0x000000000000000000000000000000e3d98a6e1da66b15e05f49096236244e06", - "0x000000000000000000000000000000000010de7dad763b6f5f95906a437c64dd", - "0x0000000000000000000000000000009312b2d8cb87a411dd9185eec28e5e5fdc", - "0x00000000000000000000000000000000000a4ebb71b8ce212befa766e54de3a3", - "0x000000000000000000000000000000e2f4261682de133a06d62946aed0a120ab", - "0x00000000000000000000000000000000002b34c1c22c9cf603d107b06992bc5d", - "0x0000000000000000000000000000007668db370a00e6d35dbc828e7aecbc59c1", - "0x00000000000000000000000000000000000b6ccb26fa51821b0c9ff6fb6a5de1", - "0x000000000000000000000000000000578ae45db8be721d20903dd8e40d4e9c9a", - "0x00000000000000000000000000000000001d31c60b330026dd3b0095316da0b0", - "0x000000000000000000000000000000b6682feb61ccddc5bd2e4e47c6f48a5edd", - "0x00000000000000000000000000000000001dc6b82b849f7059e06ff9afd02bdb", - "0x000000000000000000000000000000a9a4c508a90cb60404de9d3fa76893eae6", - "0x0000000000000000000000000000000000139469aa5b87fa24158fca49fdbede", - "0x000000000000000000000000000000c5bdcfe59f04ebe2b276df24f43329a748", - "0x000000000000000000000000000000000022db621f41013179af89927a477efa", - "0x0000000000000000000000000000000fb3e97ed2e4f5041b86c6efc1d696c167", - "0x00000000000000000000000000000000002a1ec9431e07c86313260493a41c11", - "0x0000000000000000000000000000005e0735abf4a854978348efc16c97b3b63b", - "0x000000000000000000000000000000000013aaec53f3241f39be8e2da1078976", + "0x000000000000000000000000000000130e31704c2a47c1ee874b4cb721378539", + "0x00000000000000000000000000000000000c9bed5bed24c7cf91b75add97667c", + "0x0000000000000000000000000000006d0c7b8a7e421a1d6fb4f0506191159235", + "0x00000000000000000000000000000000000f2f1ba5ea0f3fad9af83840641021", + "0x00000000000000000000000000000075d2e1456fd08b8262c065954705847bb6", + "0x000000000000000000000000000000000028cc4e2095c2f5be8892d6dfba12e2", + "0x000000000000000000000000000000c34ac67056ccf87063339d1b0547b63037", + "0x00000000000000000000000000000000002104b51ca6a099e636b699e1f67d17", + "0x000000000000000000000000000000a56d3a40330acf7753554b4a0f423603de", + "0x0000000000000000000000000000000000288522a920f094ee2d2913115da69c", + "0x00000000000000000000000000000056e1174c0590dab5bd6ad41fba9622f099", + "0x00000000000000000000000000000000002101d4b2c0e86465881ff4a8eb68b0", + "0x000000000000000000000000000000b007f81970c6b9b5cfc1988f2af3e99082", + "0x00000000000000000000000000000000002227acd63272bcca1f87f53f25d107", + "0x000000000000000000000000000000728c951f74970e271d8baa3223e716814f", + "0x000000000000000000000000000000000003b1cb0551acd15baf3c5d519a548b", + "0x0000000000000000000000000000007ff9b5f797f4bc111132082e8f0993a774", + "0x000000000000000000000000000000000011ebb008b9f86edb39fe78a8a30b62", + "0x00000000000000000000000000000031892fd9fee47feb62de04f53a6019312c", + "0x00000000000000000000000000000000000c52342158bc6c4c6833b7f3d10e95", + "0x000000000000000000000000000000534821a37a5502a894f8e1ae499247c01d", + "0x000000000000000000000000000000000026c72000b86ef2ab367d07e08258e6", + "0x000000000000000000000000000000ff71dfca639d961652a70ff2c34951f97c", + "0x00000000000000000000000000000000000b249e7aa928eb7421ebe24ab7c7af", + "0x000000000000000000000000000000c5179cf7905a3b1f8d13c2a33617842ee3", + "0x0000000000000000000000000000000000145fccea7ff9b82a928819c82c36b5", + "0x00000000000000000000000000000088515ac576f48533495fee4d5d45f52f3f", + "0x00000000000000000000000000000000000b03cbac09e93bb52c04998b623ab1", + "0x0000000000000000000000000000001c0d89b7a23cdb3dfb3f796ad4d0042197", + "0x0000000000000000000000000000000000274e9eca3597c398a96fb8d3571327", + "0x000000000000000000000000000000875c2c60275064f7b194db45605f0f4296", + "0x0000000000000000000000000000000000122ec45d4235d2fe842973d6395d01", + "0x0000000000000000000000000000007f70171a761bac2f981dea063cedefc89c", + "0x000000000000000000000000000000000026cc06929618062e91765d2cd3e2a5", + "0x0000000000000000000000000000002725a9fca6eda440225bc2b1f6becd3313", + "0x000000000000000000000000000000000029a50332d67ad87a38d6e9dada0a6e", + "0x00000000000000000000000000000002bffa645fa2ddb84fc1f68c0eea0ff803", + "0x00000000000000000000000000000000002954a19cb0a188f4985be16203fb20", + "0x0000000000000000000000000000003948a12dc7d00190bae742460672bc1342", + "0x000000000000000000000000000000000006c3854ddae1b71dfc0d6fa20903ae", + "0x000000000000000000000000000000041f9bb7b06e543ffebeef2ffbce5553e3", + "0x0000000000000000000000000000000000078e7238d47fc00e2a1035b6c437f7", + "0x00000000000000000000000000000046644183098c51ccba33ad162d5515eab2", + "0x000000000000000000000000000000000019c5de425de37aa5ed4f18648edaf6", + "0x000000000000000000000000000000bfcc620070b10aa1b12915947dcb5a3f59", + "0x00000000000000000000000000000000001e7db7cb61f327fad3629608f671ec", + "0x00000000000000000000000000000037f6f9701daa047d5e658fd2de13d9c597", + "0x0000000000000000000000000000000000102c1703968f83f81c928cc4b7b2f8", + "0x000000000000000000000000000000acdd55eb177713ab172f975de7ab09d9fb", + "0x0000000000000000000000000000000000289143fbb21dd6261204446c3bb0b4", + "0x0000000000000000000000000000007233e128a5c5a00e40d5dc965f39805459", + "0x00000000000000000000000000000000001d6b1c72220e545662046d1ee93511", + "0x000000000000000000000000000000d24f0a0cf38ca9316be400c743bbbb3bec", + "0x000000000000000000000000000000000027822ff7bb9483b29df97785ee5f9d", + "0x000000000000000000000000000000468d47d31fb480e2c192ddb6673e5cbea8", + "0x000000000000000000000000000000000001d6ab1aaf7944c2be04aea4060d71", + "0x00000000000000000000000000000020ab6e18f40a7bf9ece2bfbd0a97abf5bb", + "0x00000000000000000000000000000000000a20b21648fdc847474f5d2818cf35", + "0x00000000000000000000000000000044dc86f177e1cbe3e841b683edf98f5e9f", + "0x00000000000000000000000000000000002f29add3293aa01415fcc8461b9c64", + "0x000000000000000000000000000000c0571dde036ceb0ae6e3738ae8dc6632f4", + "0x00000000000000000000000000000000001f883cee5e1ba1ce860782200386e8", + "0x000000000000000000000000000000da46a2dac6c82a0cb40d8dfefffd938b46", + "0x00000000000000000000000000000000000446f1ba13688a0f3b8bbf80607b58", + "0x000000000000000000000000000000ea51a707c02eb96579a3c792d23700972a", + "0x0000000000000000000000000000000000142d2ec5c800975448fcd61248a07c", + "0x000000000000000000000000000000ce8085ec44fdb639e426700edc2806ca20", + "0x0000000000000000000000000000000000013db816525ecd000ad4fc896410b0", + "0x00000000000000000000000000000068c1ccd2e5e937c4d67d45dcfd3e24ca5e", + "0x00000000000000000000000000000000000f9027ed9ee43a98a5798620c606a2", + "0x00000000000000000000000000000026bfe1e8280a21f35f424a5ef0aad97b87", + "0x000000000000000000000000000000000027ed1fbeef1043de6dfbbe2771e8bf", + "0x000000000000000000000000000000e88498d17df4e8fdcd7dd31f96055ea909", + "0x000000000000000000000000000000000024c02a3f689f9c7f00364247e72974", + "0x000000000000000000000000000000ef3300456167f78bef88d1c5d26a33d9c8", + "0x000000000000000000000000000000000002ddedaaa3d15fc4fbd4d3cb8b32fa", + "0x0000000000000000000000000000005fa233019988e8cd73cff686a5a089e753", + "0x00000000000000000000000000000000000548f450d1dec70918b516866c0cac", + "0x000000000000000000000000000000231a42d1bd55ead600686a7668cb0ae9f4", + "0x000000000000000000000000000000000017ebebf4ad7003ecd61e5da419499d", + "0x000000000000000000000000000000b348f3ea80255b656d72d398f11330d373", + "0x00000000000000000000000000000000002e79c4774370efb865f0a53fd7a1da", + "0x0000000000000000000000000000005f286832a1e94e23822b70380f7c11cf74", + "0x00000000000000000000000000000000000206c01a6cd3c0a48e7d83e62e3bda", + "0x000000000000000000000000000000603001b971ca6ae5337182969ec5c94780", + "0x0000000000000000000000000000000000233b83cbaf3a81f077345387ebed21", + "0x00000000000000000000000000000008f1d7f84761094fd902826b323e760375", + "0x0000000000000000000000000000000000228bfc02f04e4b94ee542b76609d00", "0x0000000000000000000000000000003acc6def4164d878b56e5b2fe2bfa52199", "0x000000000000000000000000000000000022cf69996ae471056bcae7b3c38cbc", "0x000000000000000000000000000000239623839c51be6ffe83c77c80b8f94ad5", @@ -142,74 +142,75 @@ vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000fb10431f059a29394060142c48296017a7", - "0x00000000000000000000000000000000002b0c833f535f222fd66d8891984166", - "0x000000000000000000000000000000c59fc49de920385651297505738dadfe5b", - "0x00000000000000000000000000000000002edf12a7c5fb2882c3ba3e4174ca63", - "0x000000000000000000000000000000b5c1eac95b264c302dc854e6f22d7330df", - "0x00000000000000000000000000000000000fcbbf9d3cf402baa3eeda5f0a9e49", - "0x000000000000000000000000000000def9d58fc2920836194261f7b163fefbaf", - "0x0000000000000000000000000000000000283edfda89c9480597f0b3442e9752", + "0x000000000000000000000000000000632b812c57322665c9c31350c654d385ed", + "0x0000000000000000000000000000000000084841b91bc6b6cb631252e78e0f02", + "0x0000000000000000000000000000001a9e16cac86681dcdf3546f9578e08526a", + "0x00000000000000000000000000000000002829104a2e6be16c214485eed9f98a", + "0x00000000000000000000000000000014947d5d9dde0b5b83e4f9654e47cda34c", + "0x00000000000000000000000000000000001117dac9f1a9d88480a7cea03ebc36", + "0x00000000000000000000000000000057c91392dd1031997791594682365ac349", + "0x000000000000000000000000000000000029f73c99a2c679dbda50b1331c5f6d", "0x0000000000000000000000000000004264681c9136a2fde7137335ef716fecde", "0x000000000000000000000000000000000027ca9ccf01429923a61d872c7c224c", "0x0000000000000000000000000000006df5ee4c1358443f5a14086b5196e13e46", "0x0000000000000000000000000000000000192b1a6d3b14dfe5a9ad63951d2d76" ] - hash = "0x2a63ea0e6de9343a8b350e66bf96ab92641c3bbe639da1094312263c05aac871" + hash = "0x1f6c06063226ba7edac4c5c7dce6272b5f5ea00eec55ad78e1ef4125504f5f87" [previous_kernel_public_inputs] min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +is_private_only = false [previous_kernel_public_inputs.constants] - vk_tree_root = "0x1670ae061c166e83659fcd052460c6cce31d3b57fffaa427d421f47b5102e13f" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [previous_kernel_public_inputs.constants.historical_header] - total_fees = "0x00000000000000000000000000000000000000000000000000038bd721a7d000" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004800" + total_fees = "0x00000000000000000000000000000000000000000000000000f63927a6ad1e54" + total_mana_used = "0x000000000000000000000000000000000000000000000000000000000013863f" [previous_kernel_public_inputs.constants.historical_header.last_archive] - root = "0x10b72dd1e4620ef566d12591a67a3678d2b9921902d0b0c8848c51d0add78ace" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + root = "0x29cbab120d0f56c90cfefc66cafa9f932f596a2f907016ea04bf3116054d024d" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000005" [previous_kernel_public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" - txs_effects_hash = "0x005da0d1417244507fda9d2c696b6f83fbc1be888d452fb3822399d176287c79" + blobs_hash = "0x0016c800a29df6af7f3e2e6e39d4f4f716a304cd602bbac9e33d67814d8c8b48" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [previous_kernel_public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000050" [previous_kernel_public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x1ed67c0a1cd8518f1344cb75e530bc05611d37637eec0b148692ea5e2d57d71e" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" +root = "0x04e8c491dbfeddc60045ecb277c87006799f491a47d6a32361cdabc1b964f153" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000280" [previous_kernel_public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x016a632fba015e6dbbd777d83608c5252a31ce4c9c8c757c048cf7306faae4d1" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" +root = "0x00ae279a916dc04b41f94ee1ed6ae6cd35e37a06787bd36a0af77db9bba8a126" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000300" [previous_kernel_public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x1e5d4d46e7c5f0c9659360ce1dbc0e56e594cfd1a7e9e65396b4cae9c15498af" +root = "0x0ff17010ab909b4a0c9581a9c33cf0af93280c6fcd6664cf27270b8762a9e418" next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" [previous_kernel_public_inputs.constants.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x000000000000000000000000000000000000000000000000000000000000000a" - timestamp = "0x00000000000000000000000000000000000000000000000000000000675984f7" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000005" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2d76" [previous_kernel_public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [previous_kernel_public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9c6e14ac" [previous_kernel_public_inputs.constants.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -220,12 +221,12 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [previous_kernel_public_inputs.constants.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [previous_kernel_public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" [previous_kernel_public_inputs.validation_requests.for_rollup.max_block_number._opt] _is_some = false @@ -2217,7 +2218,7 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.split_counter] _is_some = true -_value = "0x0000000000000000000000000000000000000000000000000000000000000000" +_value = "0x0000000000000000000000000000000000000000000000000000000000000003" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] @@ -2733,7 +2734,7 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x211ae2dd512b14b1cc22f7d9fc5393db47e456ec4c5c7365927721f15973c155" +value = "0x25ce2d71f7bbf18a1b3f947a879d8ab49914830266b484af969296ea60af8ffd" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -4365,20 +4366,20 @@ length = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000003" [previous_kernel_public_inputs.end.public_call_requests.inner] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + args_hash = "0x2667c69b043c8cc69b895e85758e845921c5626cc2cf2008614c131569b83949" [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" diff --git a/noir-projects/noir-protocol-circuits/crates/private-kernel-tail-to-public/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/private-kernel-tail/Prover.toml similarity index 95% rename from noir-projects/noir-protocol-circuits/crates/private-kernel-tail-to-public/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/private-kernel-tail/Prover.toml index b1da4435147..718a890b871 100644 --- a/noir-projects/noir-protocol-circuits/crates/private-kernel-tail-to-public/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/private-kernel-tail/Prover.toml @@ -1,127 +1,127 @@ [previous_kernel] vk_index = "0x000000000000000000000000000000000000000000000000000000000000003d" vk_path = [ - "0x2c2fbbe37f9d391636cd0203ac75406410268dd17cac4e819751ed95601b6545", + "0x1244c900aaf510c80550db2a0494d131a07ec2684800cffed8ec133263b15333", "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1c8a90aab63d413063ab78dc95747482e54a43d2f6656e2d2795f61b93c52001", - "0x0c891ae59115a3d6560612b40b9616e96741743ef24a3adcea8cd5271bd79180", - "0x1de09d739ffa4f90754516aac77522c32a715c2a71ee8a448dbe4cb2b444e6b8", - "0x304624242284bce34078c5538a6d522ce35ffe0c1e05b78a65421374fdd9f1c3" + "0x088119e5ec3f249a7b799bddbe34331cf82f90c8906784d2e0968310179c7939", + "0x294627428812b68807885920cba841ce2106a57cecb487a57a2060f95d29d796", + "0x02dfdf8f45633da47ab6f47c909baf455131cf789f5ae4288ced1a5e0d09f031", + "0x0e65c2546de09afcb529706bce25d0237508d40bb8b24d173aef1d00e33cca8f" ] [previous_kernel.vk] key = [ "0x0000000000000000000000000000000000000000000000000000000000100000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000001e965c85", - "0x0000000000000000000000000000000000000000000000000000000023c1ca18", - "0x0000000000000000000000000000000000000000000000000000000031d68272", - "0x00000000000000000000000000000000000000000000000000000000679ec723", - "0x000000000000000000000000000000000000000000000000000000008df6ae9b", - "0x000000000000000000000000000000000000000000000000000000006a4609af", - "0x000000000000000000000000000000000000000000000000000000005b9b5343", - "0x00000000000000000000000000000000000000000000000000000000eb2cb8e2", - "0x00000000000000000000000000000000000000000000000000000000bcf6f48d", - "0x00000000000000000000000000000000000000000000000000000000123862d7", - "0x00000000000000000000000000000000000000000000000000000000f524ad21", - "0x0000000000000000000000000000000000000000000000000000000028fbc96e", - "0x0000000000000000000000000000000000000000000000000000000078f8ee90", - "0x000000000000000000000000000000000000000000000000000000008bd64fb7", - "0x00000000000000000000000000000000000000000000000000000000c8a418db", - "0x000000000000000000000000000000000000000000000000000000002b424553", - "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000401", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000016bfb3f1832ad90ef28f77dcda5ac0a734", - "0x000000000000000000000000000000000006f28d37976e91d6682ea1545c5155", - "0x000000000000000000000000000000a2b509fc38184e01858fed4f3632c1b04a", - "0x00000000000000000000000000000000002d08dc3047c5163f88c7de0bed3ce1", - "0x000000000000000000000000000000495a4b014f7c6d9648ea61408fabd8dbef", - "0x000000000000000000000000000000000016ca51195346fb8fd93418b2a7cb51", - "0x00000000000000000000000000000083b35506b7c5a786e909ce0a92317238e1", - "0x000000000000000000000000000000000024d28d12c49aad3853861bf5eb90ec", - "0x0000000000000000000000000000006920858c0060cee2701a670d30bb217788", - "0x00000000000000000000000000000000000b2c9ffc3dd965f82cfe14f3fa9b99", - "0x00000000000000000000000000000001cbf7576b81bc8387ae1c172a1c04ed6c", - "0x00000000000000000000000000000000002ad608e2ecfc42119941cf1c713f90", - "0x0000000000000000000000000000007ba22e64b3953756f2c38fc3c4b4973923", - "0x00000000000000000000000000000000001f9158ba44585ab85bb83b24fe8066", - "0x0000000000000000000000000000004144132be9a8177c1a8afd947ed7e85b2d", - "0x000000000000000000000000000000000006a4ddcd78b69f3402cd4a382ab7cd", - "0x0000000000000000000000000000001218da9c8aed2b11b4065c141a0dbca8fc", - "0x00000000000000000000000000000000000d784f4194ad06745a013f10a34825", - "0x000000000000000000000000000000632de6a328bc8b8e06151bf8547b32ff9b", - "0x000000000000000000000000000000000007cb5a6096713089e6282cb3bd6a31", - "0x000000000000000000000000000000a1708e991f8a2a14bc1ee09fee7d2a7690", - "0x00000000000000000000000000000000001f47d8d037cfef41606f0b5deb7893", - "0x00000000000000000000000000000069abb5eb895df621a90238104b223f56b9", - "0x00000000000000000000000000000000000a97a574408435518e99d67d269353", - "0x000000000000000000000000000000ffcc3affc0bf680513130a6685617daecf", - "0x000000000000000000000000000000000025099441f1dcb65d5ade44ee90f0a8", - "0x00000000000000000000000000000091ea4f12c332573e399918a0af06caf5da", - "0x00000000000000000000000000000000000995d9dcec0c26827fee769804d45c", - "0x0000000000000000000000000000002490c58de7421f9d13cbaf961099f1dcbd", - "0x000000000000000000000000000000000005e259512a10c3f05373915e40de19", - "0x0000000000000000000000000000003233391c28627b7ea6ecfa14664e2497c5", - "0x000000000000000000000000000000000018903bbdcbd06a0fe3ff2e9c5fe9fe", - "0x0000000000000000000000000000004f696649cba170d39b7d532628838f56da", - "0x00000000000000000000000000000000002a782c3738ea19588c3b969dcc847a", - "0x000000000000000000000000000000e2aaab5a33e4b6755525193e44a668fa2b", - "0x00000000000000000000000000000000002399ca72748755cffd247a3ccc5d11", - "0x0000000000000000000000000000003eddc4712c95e1c65b31a5d2fc868f94a5", - "0x000000000000000000000000000000000028f975a56305bf05cc1e6c1d0e13aa", - "0x000000000000000000000000000000686b59ed2a501be0a9aa67a2fea7638798", - "0x000000000000000000000000000000000029c706a1a782485788571b350d6ef3", - "0x0000000000000000000000000000009b8b2be0cef58ed8067a38edf1d1f8d624", - "0x00000000000000000000000000000000001096b67df478d73f07145be790a012", - "0x000000000000000000000000000000803596c64d2676b5b3edb459d3305adc7d", - "0x00000000000000000000000000000000002923097de8486a75448cab4b64d3c1", - "0x000000000000000000000000000000e815a9a5ef92cd35abd9302bc3e0586968", - "0x00000000000000000000000000000000001a11556c2a3e5e13c11ba5650f945f", - "0x000000000000000000000000000000b519dcb27222270a9614c5d7f56bc04208", - "0x00000000000000000000000000000000001f020b9cbfab935c388e0916fddd1b", - "0x0000000000000000000000000000001b8794af92b347d6650aee7846a137a1e6", - "0x000000000000000000000000000000000008eba1608afa9b8fba0cfe3a3fff06", - "0x00000000000000000000000000000046ccd638193c3fba3d4f128e4d950f63ba", - "0x0000000000000000000000000000000000113635c117cd7fc5df8a52be5838af", - "0x000000000000000000000000000000ca914b1888f7a6add94ff1af79b969cd41", - "0x00000000000000000000000000000000000b8b6e505823888994a2a5512e8ac0", - "0x00000000000000000000000000000046070796d3dec0ca855fbd0a6d615972b7", - "0x00000000000000000000000000000000002888ff2dbc05bf367b9cee07a4c294", - "0x000000000000000000000000000000780fc240103ce59360645c338d85059362", - "0x0000000000000000000000000000000000195fe0b3945089bd5fd3a554bb0166", - "0x0000000000000000000000000000006ebbff1583c51c346ea6ece51fed99dcbe", - "0x000000000000000000000000000000000007fcbe4fe8540430fd026f364a9b56", - "0x000000000000000000000000000000a0687b980a2e769e06496a8fb5e4af0078", - "0x000000000000000000000000000000000025a0ab444cefc72f89a26907819c14", - "0x000000000000000000000000000000b4d58acce5d3edea1c02db966b99a30d69", - "0x00000000000000000000000000000000002ec8a9d53c52c542a9fb7a190f4032", - "0x00000000000000000000000000000024be4295c337d4aff23358065ae7c3ee1c", - "0x00000000000000000000000000000000000bbac8b02ecb63f2118934f1de3b10", - "0x000000000000000000000000000000db46f2dcbe12680591173092e82ba5eb56", - "0x00000000000000000000000000000000000ed470e49bff4d0b6e25b46c822152", - "0x000000000000000000000000000000e3d98a6e1da66b15e05f49096236244e06", - "0x000000000000000000000000000000000010de7dad763b6f5f95906a437c64dd", - "0x0000000000000000000000000000009312b2d8cb87a411dd9185eec28e5e5fdc", - "0x00000000000000000000000000000000000a4ebb71b8ce212befa766e54de3a3", - "0x000000000000000000000000000000e2f4261682de133a06d62946aed0a120ab", - "0x00000000000000000000000000000000002b34c1c22c9cf603d107b06992bc5d", - "0x0000000000000000000000000000007668db370a00e6d35dbc828e7aecbc59c1", - "0x00000000000000000000000000000000000b6ccb26fa51821b0c9ff6fb6a5de1", - "0x000000000000000000000000000000578ae45db8be721d20903dd8e40d4e9c9a", - "0x00000000000000000000000000000000001d31c60b330026dd3b0095316da0b0", - "0x000000000000000000000000000000b6682feb61ccddc5bd2e4e47c6f48a5edd", - "0x00000000000000000000000000000000001dc6b82b849f7059e06ff9afd02bdb", - "0x000000000000000000000000000000a9a4c508a90cb60404de9d3fa76893eae6", - "0x0000000000000000000000000000000000139469aa5b87fa24158fca49fdbede", - "0x000000000000000000000000000000c5bdcfe59f04ebe2b276df24f43329a748", - "0x000000000000000000000000000000000022db621f41013179af89927a477efa", - "0x0000000000000000000000000000000fb3e97ed2e4f5041b86c6efc1d696c167", - "0x00000000000000000000000000000000002a1ec9431e07c86313260493a41c11", - "0x0000000000000000000000000000005e0735abf4a854978348efc16c97b3b63b", - "0x000000000000000000000000000000000013aaec53f3241f39be8e2da1078976", + "0x000000000000000000000000000000130e31704c2a47c1ee874b4cb721378539", + "0x00000000000000000000000000000000000c9bed5bed24c7cf91b75add97667c", + "0x0000000000000000000000000000006d0c7b8a7e421a1d6fb4f0506191159235", + "0x00000000000000000000000000000000000f2f1ba5ea0f3fad9af83840641021", + "0x00000000000000000000000000000075d2e1456fd08b8262c065954705847bb6", + "0x000000000000000000000000000000000028cc4e2095c2f5be8892d6dfba12e2", + "0x000000000000000000000000000000c34ac67056ccf87063339d1b0547b63037", + "0x00000000000000000000000000000000002104b51ca6a099e636b699e1f67d17", + "0x000000000000000000000000000000a56d3a40330acf7753554b4a0f423603de", + "0x0000000000000000000000000000000000288522a920f094ee2d2913115da69c", + "0x00000000000000000000000000000056e1174c0590dab5bd6ad41fba9622f099", + "0x00000000000000000000000000000000002101d4b2c0e86465881ff4a8eb68b0", + "0x000000000000000000000000000000b007f81970c6b9b5cfc1988f2af3e99082", + "0x00000000000000000000000000000000002227acd63272bcca1f87f53f25d107", + "0x000000000000000000000000000000728c951f74970e271d8baa3223e716814f", + "0x000000000000000000000000000000000003b1cb0551acd15baf3c5d519a548b", + "0x0000000000000000000000000000007ff9b5f797f4bc111132082e8f0993a774", + "0x000000000000000000000000000000000011ebb008b9f86edb39fe78a8a30b62", + "0x00000000000000000000000000000031892fd9fee47feb62de04f53a6019312c", + "0x00000000000000000000000000000000000c52342158bc6c4c6833b7f3d10e95", + "0x000000000000000000000000000000534821a37a5502a894f8e1ae499247c01d", + "0x000000000000000000000000000000000026c72000b86ef2ab367d07e08258e6", + "0x000000000000000000000000000000ff71dfca639d961652a70ff2c34951f97c", + "0x00000000000000000000000000000000000b249e7aa928eb7421ebe24ab7c7af", + "0x000000000000000000000000000000c5179cf7905a3b1f8d13c2a33617842ee3", + "0x0000000000000000000000000000000000145fccea7ff9b82a928819c82c36b5", + "0x00000000000000000000000000000088515ac576f48533495fee4d5d45f52f3f", + "0x00000000000000000000000000000000000b03cbac09e93bb52c04998b623ab1", + "0x0000000000000000000000000000001c0d89b7a23cdb3dfb3f796ad4d0042197", + "0x0000000000000000000000000000000000274e9eca3597c398a96fb8d3571327", + "0x000000000000000000000000000000875c2c60275064f7b194db45605f0f4296", + "0x0000000000000000000000000000000000122ec45d4235d2fe842973d6395d01", + "0x0000000000000000000000000000007f70171a761bac2f981dea063cedefc89c", + "0x000000000000000000000000000000000026cc06929618062e91765d2cd3e2a5", + "0x0000000000000000000000000000002725a9fca6eda440225bc2b1f6becd3313", + "0x000000000000000000000000000000000029a50332d67ad87a38d6e9dada0a6e", + "0x00000000000000000000000000000002bffa645fa2ddb84fc1f68c0eea0ff803", + "0x00000000000000000000000000000000002954a19cb0a188f4985be16203fb20", + "0x0000000000000000000000000000003948a12dc7d00190bae742460672bc1342", + "0x000000000000000000000000000000000006c3854ddae1b71dfc0d6fa20903ae", + "0x000000000000000000000000000000041f9bb7b06e543ffebeef2ffbce5553e3", + "0x0000000000000000000000000000000000078e7238d47fc00e2a1035b6c437f7", + "0x00000000000000000000000000000046644183098c51ccba33ad162d5515eab2", + "0x000000000000000000000000000000000019c5de425de37aa5ed4f18648edaf6", + "0x000000000000000000000000000000bfcc620070b10aa1b12915947dcb5a3f59", + "0x00000000000000000000000000000000001e7db7cb61f327fad3629608f671ec", + "0x00000000000000000000000000000037f6f9701daa047d5e658fd2de13d9c597", + "0x0000000000000000000000000000000000102c1703968f83f81c928cc4b7b2f8", + "0x000000000000000000000000000000acdd55eb177713ab172f975de7ab09d9fb", + "0x0000000000000000000000000000000000289143fbb21dd6261204446c3bb0b4", + "0x0000000000000000000000000000007233e128a5c5a00e40d5dc965f39805459", + "0x00000000000000000000000000000000001d6b1c72220e545662046d1ee93511", + "0x000000000000000000000000000000d24f0a0cf38ca9316be400c743bbbb3bec", + "0x000000000000000000000000000000000027822ff7bb9483b29df97785ee5f9d", + "0x000000000000000000000000000000468d47d31fb480e2c192ddb6673e5cbea8", + "0x000000000000000000000000000000000001d6ab1aaf7944c2be04aea4060d71", + "0x00000000000000000000000000000020ab6e18f40a7bf9ece2bfbd0a97abf5bb", + "0x00000000000000000000000000000000000a20b21648fdc847474f5d2818cf35", + "0x00000000000000000000000000000044dc86f177e1cbe3e841b683edf98f5e9f", + "0x00000000000000000000000000000000002f29add3293aa01415fcc8461b9c64", + "0x000000000000000000000000000000c0571dde036ceb0ae6e3738ae8dc6632f4", + "0x00000000000000000000000000000000001f883cee5e1ba1ce860782200386e8", + "0x000000000000000000000000000000da46a2dac6c82a0cb40d8dfefffd938b46", + "0x00000000000000000000000000000000000446f1ba13688a0f3b8bbf80607b58", + "0x000000000000000000000000000000ea51a707c02eb96579a3c792d23700972a", + "0x0000000000000000000000000000000000142d2ec5c800975448fcd61248a07c", + "0x000000000000000000000000000000ce8085ec44fdb639e426700edc2806ca20", + "0x0000000000000000000000000000000000013db816525ecd000ad4fc896410b0", + "0x00000000000000000000000000000068c1ccd2e5e937c4d67d45dcfd3e24ca5e", + "0x00000000000000000000000000000000000f9027ed9ee43a98a5798620c606a2", + "0x00000000000000000000000000000026bfe1e8280a21f35f424a5ef0aad97b87", + "0x000000000000000000000000000000000027ed1fbeef1043de6dfbbe2771e8bf", + "0x000000000000000000000000000000e88498d17df4e8fdcd7dd31f96055ea909", + "0x000000000000000000000000000000000024c02a3f689f9c7f00364247e72974", + "0x000000000000000000000000000000ef3300456167f78bef88d1c5d26a33d9c8", + "0x000000000000000000000000000000000002ddedaaa3d15fc4fbd4d3cb8b32fa", + "0x0000000000000000000000000000005fa233019988e8cd73cff686a5a089e753", + "0x00000000000000000000000000000000000548f450d1dec70918b516866c0cac", + "0x000000000000000000000000000000231a42d1bd55ead600686a7668cb0ae9f4", + "0x000000000000000000000000000000000017ebebf4ad7003ecd61e5da419499d", + "0x000000000000000000000000000000b348f3ea80255b656d72d398f11330d373", + "0x00000000000000000000000000000000002e79c4774370efb865f0a53fd7a1da", + "0x0000000000000000000000000000005f286832a1e94e23822b70380f7c11cf74", + "0x00000000000000000000000000000000000206c01a6cd3c0a48e7d83e62e3bda", + "0x000000000000000000000000000000603001b971ca6ae5337182969ec5c94780", + "0x0000000000000000000000000000000000233b83cbaf3a81f077345387ebed21", + "0x00000000000000000000000000000008f1d7f84761094fd902826b323e760375", + "0x0000000000000000000000000000000000228bfc02f04e4b94ee542b76609d00", "0x0000000000000000000000000000003acc6def4164d878b56e5b2fe2bfa52199", "0x000000000000000000000000000000000022cf69996ae471056bcae7b3c38cbc", "0x000000000000000000000000000000239623839c51be6ffe83c77c80b8f94ad5", @@ -142,74 +142,75 @@ vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000fb10431f059a29394060142c48296017a7", - "0x00000000000000000000000000000000002b0c833f535f222fd66d8891984166", - "0x000000000000000000000000000000c59fc49de920385651297505738dadfe5b", - "0x00000000000000000000000000000000002edf12a7c5fb2882c3ba3e4174ca63", - "0x000000000000000000000000000000b5c1eac95b264c302dc854e6f22d7330df", - "0x00000000000000000000000000000000000fcbbf9d3cf402baa3eeda5f0a9e49", - "0x000000000000000000000000000000def9d58fc2920836194261f7b163fefbaf", - "0x0000000000000000000000000000000000283edfda89c9480597f0b3442e9752", + "0x000000000000000000000000000000632b812c57322665c9c31350c654d385ed", + "0x0000000000000000000000000000000000084841b91bc6b6cb631252e78e0f02", + "0x0000000000000000000000000000001a9e16cac86681dcdf3546f9578e08526a", + "0x00000000000000000000000000000000002829104a2e6be16c214485eed9f98a", + "0x00000000000000000000000000000014947d5d9dde0b5b83e4f9654e47cda34c", + "0x00000000000000000000000000000000001117dac9f1a9d88480a7cea03ebc36", + "0x00000000000000000000000000000057c91392dd1031997791594682365ac349", + "0x000000000000000000000000000000000029f73c99a2c679dbda50b1331c5f6d", "0x0000000000000000000000000000004264681c9136a2fde7137335ef716fecde", "0x000000000000000000000000000000000027ca9ccf01429923a61d872c7c224c", "0x0000000000000000000000000000006df5ee4c1358443f5a14086b5196e13e46", "0x0000000000000000000000000000000000192b1a6d3b14dfe5a9ad63951d2d76" ] - hash = "0x2a63ea0e6de9343a8b350e66bf96ab92641c3bbe639da1094312263c05aac871" + hash = "0x1f6c06063226ba7edac4c5c7dce6272b5f5ea00eec55ad78e1ef4125504f5f87" [previous_kernel_public_inputs] min_revertible_side_effect_counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +is_private_only = true [previous_kernel_public_inputs.constants] - vk_tree_root = "0x1670ae061c166e83659fcd052460c6cce31d3b57fffaa427d421f47b5102e13f" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [previous_kernel_public_inputs.constants.historical_header] - total_fees = "0x00000000000000000000000000000000000000000000000000038bd721a7d000" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004800" + total_fees = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000016771" [previous_kernel_public_inputs.constants.historical_header.last_archive] - root = "0x10b72dd1e4620ef566d12591a67a3678d2b9921902d0b0c8848c51d0add78ace" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" [previous_kernel_public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" - txs_effects_hash = "0x005da0d1417244507fda9d2c696b6f83fbc1be888d452fb3822399d176287c79" + blobs_hash = "0x0008822f60476d6dc34ec6109d3ad69dd1747a9484777021d8e717166bc7d5e6" in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [previous_kernel_public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000090" [previous_kernel_public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x1ed67c0a1cd8518f1344cb75e530bc05611d37637eec0b148692ea5e2d57d71e" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" [previous_kernel_public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x016a632fba015e6dbbd777d83608c5252a31ce4c9c8c757c048cf7306faae4d1" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" +root = "0x0a639c242b766d8bd94d437483546e33c4a8c27feadf50bc4ef523e9f191e927" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000500" [previous_kernel_public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x1e5d4d46e7c5f0c9659360ce1dbc0e56e594cfd1a7e9e65396b4cae9c15498af" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" +root = "0x2528ba08e1171e992f4744a8d8761bbe5611447c52d673882bde6a9e3b716e1a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" [previous_kernel_public_inputs.constants.historical_header.global_variables] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" version = "0x0000000000000000000000000000000000000000000000000000000000000001" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x000000000000000000000000000000000000000000000000000000000000000a" - timestamp = "0x00000000000000000000000000000000000000000000000000000000675984f7" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" [previous_kernel_public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [previous_kernel_public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [previous_kernel_public_inputs.constants.tx_context] chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" @@ -220,12 +221,12 @@ da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [previous_kernel_public_inputs.constants.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [previous_kernel_public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be077aa" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [previous_kernel_public_inputs.validation_requests.for_rollup.max_block_number._opt] _is_some = false @@ -2217,20 +2218,20 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.validation_requests.split_counter] _is_some = true -_value = "0x0000000000000000000000000000000000000000000000000000000000000003" +_value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x2a71725fe2200c633f538557e5ec1e8274322449e1d37aa4de1428609fe0bae0" +counter = "0x0000000000000000000000000000000000000000000000000000000000000007" [previous_kernel_public_inputs.end.note_hashes.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.note_hashes]] [previous_kernel_public_inputs.end.note_hashes.note_hash] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x0aa7177f2bd22dae7aea8ed1d2cee170870bb79f57b21ce5c54ea47a7fdb5af8" +counter = "0x0000000000000000000000000000000000000000000000000000000000000009" [previous_kernel_public_inputs.end.note_hashes.contract_address] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2733,7 +2734,7 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x1a5b1cbd746227ef63b380ff55c9d561bf9b3256ab58ea9f3e548e57b388d1dd" +value = "0x1e4c23d7a900532cdb5687c5806be8da481285afb0abbbe8a3801d71451d08d8" counter = "0x0000000000000000000000000000000000000000000000000000000000000000" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -2742,8 +2743,8 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.nullifiers]] [previous_kernel_public_inputs.end.nullifiers.nullifier] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +value = "0x07f80d2d42c91e838c0d22a45ac6c20db72a3a7507951a54491f2740d5a00b25" +counter = "0x0000000000000000000000000000000000000000000000000000000000000006" note_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.nullifiers.contract_address] @@ -3397,29 +3398,29 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] -note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000007" +counter = "0x0000000000000000000000000000000000000000000000000000000000000008" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x00a117133196dd4df85556e6527de2b0f07d12da194c4c63f8658b39b42329c0", + "0x00961dca5785af4bf09cf75a77cdfcfa8fa41413b16bee86604c1826795edeec", + "0x00f7933d99a2ac43f613e021cc11c6200bdf7d703ba411bfda70998dbbe91d18", + "0x005c34531ec16f9cba02c2f74e5b68f53ec6bc00000000000000000000000000", + "0x000000343ccbf71927c63534206273c8611b72a04d4db62e0d1e7a1f358dbfe9", + "0x00bbb6167707e40e023148c03968226c73db4574f5991f9d06194dd1782e9d92", + "0x00c2cfe592e585e6319b54b39631393055f7ff2e2fab8ed76f5ca49bc3e7c83b", + "0x0036f9cd24f2727bc025371ca810245a9267c936e7edf92bd90a302d44b9a6ff", + "0x00dabe139092b735a4288ee4a9379e4afdfa51708650fe26e91e239fa23f9375", + "0x00eae9418604595e2d9a6ad7d46b2fc1967d2d7da56c4072a76bb3f709982f49", + "0x00989ffa26ac3a205dc0b99de3a6507411d11fdba8c61d3c81aabed1f119dd27", + "0x008ee4cadeaf75aa216d88a2a3aad40ba71c9ca39176a9ac78da77e47cab5caa", + "0x009927c6b18981dfcabf0a63dfd61d0491d8ee2c893844bb2ca602012783d756", + "0x00a18c50eb974c9146d791e09d883b3ad300430e1bac3f225b96041bcee15fce", + "0x00d527b9e3f664614bdf0f851d75ac6acaf59d4dbbe565a36424dee99bbf878d", + "0x00ae2f375a95ac5c40bf04f2c3f117c27132f413368d5d56edc746174594f8ca", + "0x004ff8ae2b0b2ae2b61a01a94b966654d26714edd486f5acacb2feb360f09059", + "0x00fb3c03d810569bdb758dbcb063020c6119ae59bd66308035a17f93ec1a8e98" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3427,29 +3428,29 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] -note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000009" +counter = "0x000000000000000000000000000000000000000000000000000000000000000a" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x11326925f87bb7838ce97a37e1153690b7d7be43e3aba260312e9b49e3a2e952", + "0x0082d4f053d20f9e5d0133a2279d7e5e1edcee80e8ae64e2b31759ea2c9d8357", + "0x00b4293fe37ff8a12620c49682fe04fc280a5808fc52884c40905c8a9fd12c22", + "0x00a08522ae6abbcca7fa0574ba7dc99f9f881c00000000000000000000000000", + "0x000000b32f2e9c3feb52a65be2321e91560925b83d0be9ea0c8e41c5e71c4df1", + "0x00fa5845ce219f1a7dd626caa3c96b536a79a3a65b1e184bda69fbc6eb61bdfc", + "0x0028181637f8949f88e4a53422f95c86122248723091b21e8f469fc86b3f7bf6", + "0x00c45756c940e72b7532073a35d77febff4f9d61a7f15706ba058f552c4c4dec", + "0x00ff7429d367c5fb82596c900dae746bd4988941db33121f03a8d01d92646560", + "0x004ca4b6be792d1c2167e998174d676e6462d0995063cd2d28bed4a7a0205ee0", + "0x0075c3cbed81825b7d47fe05ffa7446ee7b637ead0b04f1fb74e5d5d8f6a2b61", + "0x0036e4ebe9d34f8cf36254dc26d3b8c4829781d742edd48bd4babc79d4f8e019", + "0x001e85147052819f92807729600faf577839327b3c9d6ddada8869a19fdc2f7c", + "0x00062d400f543f81e1379c1e275b50e2bd025e4adc8111ae7ee30615c4733c58", + "0x0036d19ebc307f6a255369bb16287ec77fe0671c2dc6b3151ffa75e99a560d55", + "0x00250cf6a0581f297c606cde1b35e500648010bd4e9bda5b8a98a5824e0ee3bd", + "0x00b16603236f00e2f4263ecb587c0bb087fdcfa9075b3dde4501dff76177d091", + "0x0046729300d452d6dfe8200e1958ea4c78b2ddb8108a5c9b11fe2f61ca2c092b" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -3458,28 +3459,28 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.private_logs]] [previous_kernel_public_inputs.end.private_logs.inner] note_hash_counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x000000000000000000000000000000000000000000000000000000000000000b" [previous_kernel_public_inputs.end.private_logs.inner.log] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x178dae7ea42c364f14500f4738db39475c916d0b506fc353245a8d558b551d5f", + "0x002fe17d85df96d8b9bc15c91d0d62b0173174cda5d991cd73e9b9da65e2956b", + "0x00da7b08beac5d98c229d91728587646f72777453b785d0624e59f0a8075661d", + "0x0089323120a21d889aee547c21faa1c03a1ead00000000000000000000000000", + "0x0000001a851e3ed1265dde6b01175571a83d0777b0c17791db74cd2b33589139", + "0x00d1f4a53e67b2221c1ce7bd6d5dc105b0b3a086dcabd173b2b874f6f13fa338", + "0x002ccc3ee9f522a252f7523703c162fb8807c24eb052d2871609e249c67bd5bb", + "0x006e1fd58f3479bb18d1abd812bef996dfc0a36d72d1472a930e77805f243952", + "0x007043fae6b109a981b1e34acf7281480b879f280fd607fa1df718c9a31acaf2", + "0x008c4f91880f265b065cea8a705bc508875182fe5a3837e2b5b8a14e231cbd59", + "0x0071c17f4d52aecdfb4d8c6b1e764ae137c836c0672bf3cc589a45878f2686a8", + "0x00c95d01a6e57b41af4f265b2c88f6ff3de54aa5c895ca6faa21e26a8d6134a5", + "0x00a54c12af2499afd7651644686c671c3d77ff4af32a6b181646c976329a0063", + "0x004567a7724f750c4b0c9c205f35f4a175ea93015792fc78fbd985e7c751cc1b", + "0x001b0870e32b1c3c28116435e5132496bdeb8a1d3b9acc62b7d57d82f230bdaf", + "0x0058272cd1119bc153b18b3a3c896138be6f5b9144f216cd6e6f1b5db7d8ef08", + "0x00c1c848fc01d649f264a3cf8ba8cade698e2c1dbd14f7a0077356f8381de748", + "0x00328549fac9e2e1ff6fc6aaef17fbb1fd5c973e01df61985fe056548fd4b5df" ] [previous_kernel_public_inputs.end.private_logs.contract_address] @@ -4365,68 +4366,68 @@ length = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] -counter = "0x0000000000000000000000000000000000000000000000000000000000000003" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = true - args_hash = "0x15f8d62bb070a9bc0c12de41a317fd5c6b7df9ba38b2e06a97ccc5c3a1b4bbb1" + is_static_call = false + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] -counter = "0x0000000000000000000000000000000000000000000000000000000000000004" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = true - args_hash = "0x245d1610354215dab4d4c4a1540d2de756681914402f0cf0110bf1c7a1957181" + is_static_call = false + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] -counter = "0x0000000000000000000000000000000000000000000000000000000000000005" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = true - args_hash = "0x099945ada8eb8479b839747873f4562390e88e79342e2ed8b191d44dd2c83661" + is_static_call = false + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] -counter = "0x0000000000000000000000000000000000000000000000000000000000000006" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner] - is_static_call = true - args_hash = "0x1a6f9b5ffa6d94ad298cc26a89f7ebd795db66746e088a932c88a48970f7ca91" + is_static_call = false + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.msg_sender] - inner = "0x2c783364f9fd93ccfaaeaa087d43b8468211b88ab0282f348a4e1a80ad409900" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.contract_address] - inner = "0x102431feda5d160d59215b7ea8b5fbee248562943ef4655f32a299b3ead04e60" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [previous_kernel_public_inputs.end.public_call_requests.inner.function_selector] - inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[previous_kernel_public_inputs.end.public_call_requests]] counter = "0x0000000000000000000000000000000000000000000000000000000000000000" diff --git a/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/note_hash_read_request_reset.nr b/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/note_hash_read_request_reset.nr index 6af738b950a..3ea0220d126 100644 --- a/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/note_hash_read_request_reset.nr +++ b/noir-projects/noir-protocol-circuits/crates/reset-kernel-lib/src/note_hash_read_request_reset.nr @@ -81,13 +81,14 @@ mod tests { let note_hashes = [10, 11, 12, 13]; let siloed_note_hashes = note_hashes.map(|n| compute_siloed_note_hash(contract_address, n)); - + // We don't need to hash it with a real nonce + let unique_note_hashes = siloed_note_hashes.map(|note_hash| note_hash + 1000); // Create 5 read requests. 0 and 3 are reading settled note hashes. 1, 2 and 4 are reading pending note hashes. let read_requests = [ - ReadRequest { value: note_hashes[1], counter: 11 }.scope(contract_address), // settled + ReadRequest { value: unique_note_hashes[1], counter: 11 }.scope(contract_address), // settled ReadRequest { value: note_hashes[3], counter: 13 }.scope(contract_address), // pending ReadRequest { value: note_hashes[2], counter: 39 }.scope(contract_address), // pending - ReadRequest { value: note_hashes[0], counter: 46 }.scope(contract_address), // settled + ReadRequest { value: unique_note_hashes[0], counter: 46 }.scope(contract_address), // settled ReadRequest { value: note_hashes[3], counter: 78 }.scope(contract_address), // pending ]; @@ -113,8 +114,8 @@ mod tests { ]; let leaf_preimages = [ - NoteHashLeafPreimage { value: siloed_note_hashes[0] }, - NoteHashLeafPreimage { value: siloed_note_hashes[1] }, + NoteHashLeafPreimage { value: unique_note_hashes[0] }, + NoteHashLeafPreimage { value: unique_note_hashes[1] }, ]; TestBuilder { diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-base-private/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml similarity index 97% rename from noir-projects/noir-protocol-circuits/crates/rollup-base-private/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml index eb287408e5a..7a70e53d040 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-base-private/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/rollup-base-private/Prover.toml @@ -6,8 +6,8 @@ _is_some = false _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants] - vk_tree_root = "0x0a2c34220aa778be6f9e8c76c1d65c5a35de6c9f5bffc69146d1863b20e1cbcd" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [inputs.tube_data.public_inputs.constants.historical_header] total_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -19,7 +19,7 @@ _value = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.historical_header.content_commitment] num_txs = "0x0000000000000000000000000000000000000000000000000000000000000000" - txs_effects_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + blobs_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" in_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -57,8 +57,8 @@ next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000 fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.tx_context] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.gas_limits] da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1350,6 +1350,10 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" value = "0x0000000000000000000000000000000000000000000000000000000000000000" + [[inputs.tube_data.public_inputs.end.public_data_writes]] + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + [inputs.tube_data.public_inputs.start_state.note_hash_tree] root = "0x0000000000000000000000000000000000000000000000000000000000000000" next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -1840,21 +1844,19 @@ fields = [ vk_index = "0x0000000000000000000000000000000000000000000000000000000000000001" vk_path = [ "0x1bac5dbe94e5f6fc3f2438c62bf353f447f595aabb7415e3f6777d02259c8f6b", - "0x19d697ba15c5656fe8ff1100f6fa95dfffa05a9b6569fc746cf7ab296d7dd824", - "0x2b0020121df0d92383847cd2f9f112ebdef7e1745435efa97acc68fe9425d1c7", - "0x16689f45f3440063faf62389449732a5d04a721e5133f1d532400d2f690a7af3", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x0c33ab6b1652829a9204dcabd2c6570028acf35ec4ceb6e9723ed19e1452a2a0", + "0x281a8c9b2c044cffa01e5f56858d1d71aa11c4b28a1e90407565ca646ea0ee5d", + "0x25e71fd64ecaa6b98ef492c6d93da8164a259284041220c258edb94fe47706ab", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] [inputs.tube_data.vk_data.vk] key = [ "0x0000000000000000000000000000000000000000000000000000000000100000", - "0x00000000000000000000000000000000000000000000000000000000000003cc", + "0x00000000000000000000000000000000000000000000000000000000000003ce", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x00000000000000000000000000000000000000000000000000000000000003bc", - "0x00000000000000000000000000000000000000000000000000000000000003bd", "0x00000000000000000000000000000000000000000000000000000000000003be", "0x00000000000000000000000000000000000000000000000000000000000003bf", "0x00000000000000000000000000000000000000000000000000000000000003c0", @@ -1869,90 +1871,92 @@ vk_path = [ "0x00000000000000000000000000000000000000000000000000000000000003c9", "0x00000000000000000000000000000000000000000000000000000000000003ca", "0x00000000000000000000000000000000000000000000000000000000000003cb", - "0x0000000000000000000000000000009c12c166d266b273e6b549cb4a6be9ba0c", - "0x000000000000000000000000000000000011265cbd52c0295607f541fb828968", - "0x000000000000000000000000000000ec00a7a00c16b6ccf32025615e526cb513", - "0x000000000000000000000000000000000007442dd21f5ac7a00b420f93d6f255", - "0x000000000000000000000000000000e4117d7f4b764dd4fa72ae65acbcc5a562", - "0x00000000000000000000000000000000002da7921ab81b0bf56c3ba0789d819e", - "0x00000000000000000000000000000078d1ec0b22eea157b9a453830e8f4abba2", - "0x000000000000000000000000000000000016f7d7c1dac2fe3fe9fa8bc2295fe6", - "0x000000000000000000000000000000549eedae1300b59143ffa735c48aecce79", - "0x000000000000000000000000000000000001344885fcef47c6f8160a7f39ff3a", - "0x000000000000000000000000000000926b29b32f5b68da1a64ad49bd6a384263", - "0x00000000000000000000000000000000001ebb461db0b32a2f8cfb1eb4387d4f", - "0x0000000000000000000000000000006cc9d45add003c77299972b0a6bd556a64", - "0x00000000000000000000000000000000001540b8289d68a53164f7b6c029cc16", - "0x0000000000000000000000000000008876680e7476816f8f3d9f5b3bc2630d65", - "0x0000000000000000000000000000000000072e6dbcc85ce3e93c08d41ab95bcc", - "0x000000000000000000000000000000147290d7bf7453f5d8c56e43e47765641d", - "0x0000000000000000000000000000000000300a0b44c611da1cf3286d27dc05b9", - "0x00000000000000000000000000000001c50459be8e1a892def9fdb4ea8bd38e5", - "0x000000000000000000000000000000000026cd1e3038c965df45b41be5c9b87c", - "0x000000000000000000000000000000debe0fb68b15ff34bf351ff713515b4a7d", - "0x00000000000000000000000000000000001b1b112b02dc98ed613ca4f798ec30", - "0x00000000000000000000000000000064cf85f161b0ff7138c7fc7560cb3b60f2", - "0x0000000000000000000000000000000000254c28504011950b9ae561a742dd1c", - "0x0000000000000000000000000000009256f7a8bbe796d1f23965c16dbc6f842b", - "0x0000000000000000000000000000000000045e5cda452b8677d9adca8bca431c", - "0x0000000000000000000000000000000dec3ef11b2f7997f932055ba3434ff1d2", - "0x0000000000000000000000000000000000124378791a25a78717984ec17fbacf", - "0x000000000000000000000000000000d5c1c1979154d77196400b75b3ea07cc15", - "0x0000000000000000000000000000000000053436c9d0d4a5ade6cc763a1c9d51", - "0x000000000000000000000000000000d49bf074489039df363098d59e84c56b87", - "0x000000000000000000000000000000000019271da339ef38494a45d4d837963b", - "0x0000000000000000000000000000006075298c725e9ac8709fc8c6dc23ed8ae7", - "0x000000000000000000000000000000000030509ecb958b36a4eef15e7c47e194", - "0x000000000000000000000000000000dd4b36ae3b3ebd3d40a51439bfbe6fedbf", - "0x0000000000000000000000000000000000130018bde74a2697539485d328ad57", - "0x000000000000000000000000000000978c7b66520b58127edc093992d83dbfce", - "0x00000000000000000000000000000000002d7297d0469447ea7c603e17abb4ad", - "0x000000000000000000000000000000f00fe35a281017eca0444a155021977e0e", - "0x00000000000000000000000000000000000dc4ad054aa48449349d3d781161f5", - "0x0000000000000000000000000000003b3fee05f39b58d7a3f81f0fd32c787faa", - "0x000000000000000000000000000000000007a214e8c31da88b55876eb4ce37bc", - "0x000000000000000000000000000000aca56a9129ae532e40f1e89f5d6bc3c34d", - "0x00000000000000000000000000000000000f5546bde302e1c5c92e2fa85c0500", - "0x000000000000000000000000000000ab8295bb8216c2cd6ac4cf6de7c0e9ef7b", - "0x000000000000000000000000000000000001e65f44972e300315d4cd17e30178", - "0x00000000000000000000000000000092b869b12dc427efe6d65b802fb9e12f85", - "0x000000000000000000000000000000000025fa5c19375d9ef6ba00702a4f155a", - "0x00000000000000000000000000000088c8c2faf994560eaa637a1661a4a936ef", - "0x000000000000000000000000000000000004b9f1a6f119baed0be0a2a16ad586", - "0x0000000000000000000000000000004fe75e2d4597a144bc99d92a2a6aa7bbc8", - "0x000000000000000000000000000000000011edd386812d88cf3580ee3a3f1029", - "0x000000000000000000000000000000e9d9f7d3fa1ee891334ca47279c894ee05", - "0x00000000000000000000000000000000000f5da9e575e806b5ddada6ca0d7947", - "0x0000000000000000000000000000002267e38f1958bf17c6e80986eaa42f9641", - "0x00000000000000000000000000000000002019b359b3820fa748c7c16582e57b", - "0x000000000000000000000000000000fa41e3f481606457d6d3a96759143dd320", - "0x00000000000000000000000000000000001761943b68737a1e559b81c2905bca", - "0x00000000000000000000000000000092faf7e07cd06733a9c3bffeaa7ff97e04", - "0x000000000000000000000000000000000018f06896fe263aef7c7d36e707a2f5", - "0x000000000000000000000000000000c8d8481f7180ebb3c36b2d5e80f511289e", - "0x000000000000000000000000000000000013d1e03d9dba9ef75d23359db45d98", - "0x000000000000000000000000000000d39630dc7332126d1ac45c96bf6c13d58d", - "0x000000000000000000000000000000000001d5dc34b8d16365a436974d051138", - "0x0000000000000000000000000000002848cabcc6eb4ff713d4baef4f6c8485ee", - "0x00000000000000000000000000000000001099b1da519fcbeb9e8f2bc8b5508f", - "0x0000000000000000000000000000006177fadc6f9f2dd278ac944cd047c431a0", - "0x00000000000000000000000000000000000ca589e7accca3757379702e618e71", - "0x0000000000000000000000000000004efb9bfd9093aea54933d1aa53cb9c7c80", - "0x000000000000000000000000000000000020c700f3fd6d9f0665225f54ca8983", - "0x000000000000000000000000000000bcee9b97c1b073f72e6dfa2155943a53a0", - "0x00000000000000000000000000000000000449479f7172887ec8304ff7b2ed91", - "0x000000000000000000000000000000fdbcad342a8b3f713a39f899af7c020ee4", - "0x00000000000000000000000000000000001ca778ba0c402260c1dbc525c4f018", - "0x0000000000000000000000000000006d440e7fc5575601db66cfc8b5864fbb14", - "0x00000000000000000000000000000000002509ae99479d2b566e24e503fbcc4e", - "0x0000000000000000000000000000000c80adcda75dadadb430893214afbcad01", - "0x00000000000000000000000000000000001670f8d7782a78484df1c425f943d1", - "0x00000000000000000000000000000019e4498b99b79534c2245a92f03aae8e9a", - "0x000000000000000000000000000000000010be70fd60de99562dbb75dd7ca840", - "0x00000000000000000000000000000001597d9c708f4276060d9f366bc927c34c", - "0x00000000000000000000000000000000002167ca541d322348ca7c57c6d0814d", - "0x00000000000000000000000000000015a06b68bebdd7cb9e29f20415d854522b", - "0x00000000000000000000000000000000002de9eab22ff376e1a5345fbb7cd58f", + "0x00000000000000000000000000000000000000000000000000000000000003cc", + "0x00000000000000000000000000000000000000000000000000000000000003cd", + "0x000000000000000000000000000000b01dcdd818b763ddcc3196110183a863ad", + "0x000000000000000000000000000000000010b97a764d80459e3ea66267e0ec36", + "0x0000000000000000000000000000008c61789e067608f101e4ad14836c35dd63", + "0x0000000000000000000000000000000000227f916198d023441650b4a171c625", + "0x000000000000000000000000000000a2c75ff34d33e05c2c38d10f31ca1ad0c3", + "0x00000000000000000000000000000000001469af5b6c7838ca13fef70f2d222d", + "0x000000000000000000000000000000baadbbfd0cd9fdb166aa4e338c754b11fa", + "0x000000000000000000000000000000000010763d0ffe3ae2563345dca1cc04f3", + "0x00000000000000000000000000000065871376c3131bc6ff1aba50b6a258367e", + "0x000000000000000000000000000000000008b7fffd65adaa37074ecee1e82c6b", + "0x000000000000000000000000000000eb8b40d304da7733050a325c3deb27c652", + "0x0000000000000000000000000000000000004de03f8cc6ebbab9c70b77d0bb25", + "0x00000000000000000000000000000098b5b1ecaf37e67200ee9edda87c3e7335", + "0x00000000000000000000000000000000002386a233bf3ae8bd12a3fb57674b5a", + "0x000000000000000000000000000000cb463c2eba7cf854a63069062aa2a62588", + "0x000000000000000000000000000000000010ff82136ecdcd03ed27a9e8f2740a", + "0x000000000000000000000000000000cc627c788b4e0dd3fb9e81b62d265b5a1e", + "0x00000000000000000000000000000000001af01d596c61d5a3b920612c9085ba", + "0x00000000000000000000000000000096dc86a247fbbd8fd491bfd38f9bfc4142", + "0x000000000000000000000000000000000011d5502d5f9cc7ada270a21bc9fea8", + "0x0000000000000000000000000000004d8b49b50e2b236f193e973eafda523e38", + "0x000000000000000000000000000000000029e00babe75c3ec5d10b71a513b01b", + "0x0000000000000000000000000000001ca9a40123edf4279d59f9ef93d1397432", + "0x000000000000000000000000000000000024847cd54688ae0389adc483207897", + "0x000000000000000000000000000000d031997148e9e5d9022fe85126410f1428", + "0x0000000000000000000000000000000000028aef4a4f12d9d720d12385338b61", + "0x0000000000000000000000000000006021bd4e397a73cf5e07ac343e6e58e923", + "0x0000000000000000000000000000000000203ea6ba299d820149e54a5fb96bab", + "0x00000000000000000000000000000012649851fa6159e2451485d8ce7217cc5b", + "0x00000000000000000000000000000000000e7ea0fe745b3ad0375ae52079f4d4", + "0x00000000000000000000000000000058fd78cbf8405da74ffac0a2165eda05a7", + "0x000000000000000000000000000000000022ba81404ecca56aab20f89eead81e", + "0x000000000000000000000000000000580b0dfe44ea39b59123690be70554d96f", + "0x00000000000000000000000000000000001ff008a106b062de32007e3719f210", + "0x0000000000000000000000000000005f4201182fe261eae2baa6152aa24d649e", + "0x00000000000000000000000000000000001ed1f024199f1541085a1c3d642c12", + "0x0000000000000000000000000000003d116b22e867bf7b3fa9e5521ec58ad780", + "0x00000000000000000000000000000000001c164e2fa54d93ecb0bb1179e406a5", + "0x000000000000000000000000000000bfa5aac725260e40cd531cee9bfd77b2bb", + "0x0000000000000000000000000000000000064f96893967ece029e28c9efd861b", + "0x000000000000000000000000000000c58e8afe82ddc1a87c3dde063cb807c6e5", + "0x00000000000000000000000000000000001252c9710709ad673d407fde40a8bc", + "0x000000000000000000000000000000e1f1a0e392f383423fb8e32b15df04e55e", + "0x00000000000000000000000000000000001b5e13b229f319c3bb56717fc6477a", + "0x000000000000000000000000000000508999c14ea9e5e289dffc4f1ce703ffef", + "0x000000000000000000000000000000000010315af4ce040653c21dd54ac79254", + "0x000000000000000000000000000000fbc8d0c00c5d9df5afd861045d1903fda1", + "0x0000000000000000000000000000000000225de32517a409ba15496cd71d8d0f", + "0x000000000000000000000000000000c63969628c3acb2027a741f317240ccec8", + "0x00000000000000000000000000000000002062a1ff9ff1a28d73a6103e6bce6e", + "0x0000000000000000000000000000005cd3c19234d72722e75312aab9c4a407dc", + "0x00000000000000000000000000000000000b08752fc23489958af833ac7ee92a", + "0x0000000000000000000000000000000bfb29ccebc4a214fa3ddbec2146241dbe", + "0x00000000000000000000000000000000000c9aae439752005c92fe04c18b5ec7", + "0x0000000000000000000000000000007884b5096d6f3013fb4820dfa036d30606", + "0x0000000000000000000000000000000000027e338f01ad196b0796ab610e100f", + "0x000000000000000000000000000000406aad63a9adba49deffe530927f701ec5", + "0x00000000000000000000000000000000001b5de9a425ec1f3d7e73b2c6831fea", + "0x000000000000000000000000000000926608961986848d4220f4875316e5f43a", + "0x00000000000000000000000000000000000444cf15b0338d65c8217b4cc732e7", + "0x0000000000000000000000000000007fced189975af80b95ef39c49cd997d4ed", + "0x00000000000000000000000000000000002ef7c1afef3dd70f5e42428207fdb2", + "0x000000000000000000000000000000e363eced2728878262866034dc93ca7fa5", + "0x00000000000000000000000000000000000554cc00deacbb487ae19c82ba133c", + "0x0000000000000000000000000000003ca6cadeacebd46bbb63fdd13153a3e5e7", + "0x000000000000000000000000000000000000466f33f3446469b690403adeb4ce", + "0x0000000000000000000000000000009092fc698f08280c87f30de9d5e07af47d", + "0x000000000000000000000000000000000014e7f3c4745fbc3c1f3be44f88589e", + "0x0000000000000000000000000000005eeb50188b2c9c0a6477ac2f528abab6c0", + "0x00000000000000000000000000000000000f617b59f7e11dc456b9c588203145", + "0x000000000000000000000000000000363328b414ac171f809b938ad6f32f8d5c", + "0x00000000000000000000000000000000000418c1e289821bbcdcb347244e16c4", + "0x0000000000000000000000000000005932073632f82445bb5dcc9615e9ca0445", + "0x00000000000000000000000000000000001de0c9779664b0de7084b26b602cbb", + "0x000000000000000000000000000000ee7cf83eb7b2fdb0f9007ee18d1be0c4c3", + "0x00000000000000000000000000000000002f7698d8b16391e521ff45d438bcca", + "0x000000000000000000000000000000a07dc87bae19be6e5b8b4c34b1113741e6", + "0x0000000000000000000000000000000000008b68fc95ddbf53703df928289dbf", + "0x00000000000000000000000000000086520d3ff63025666b56669a9fc2210d1b", + "0x00000000000000000000000000000000002017458a1b67a1603bdb18fb79e9d7", + "0x000000000000000000000000000000fd4db5556deebccf57f38ac9e2abda9b45", + "0x000000000000000000000000000000000026499030b0d739964d1e2e58b7bcc2", + "0x0000000000000000000000000000001eebba2c4c3142468f0e5af8665863c9a5", + "0x00000000000000000000000000000000000d5bf766f3c6153003528b7a498188", "0x0000000000000000000000000000003acc6def4164d878b56e5b2fe2bfa52199", "0x000000000000000000000000000000000022cf69996ae471056bcae7b3c38cbc", "0x000000000000000000000000000000239623839c51be6ffe83c77c80b8f94ad5", @@ -1973,24 +1977,43 @@ vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000353c6cf7bbbc64df1d17f3c6d380b1a254", - "0x00000000000000000000000000000000000e55221ae8e4c68a51d88fb3823821", - "0x00000000000000000000000000000074f3a8e8b81e9d41cc9e689841a0a4791b", - "0x00000000000000000000000000000000001b538bd02b6fcf6730a08d29211304" + "0x0000000000000000000000000000006157c1b0c396d9b2499334bd0eeecc05b1", + "0x0000000000000000000000000000000000116a8f041212e254f46df65af74a8e", + "0x000000000000000000000000000000bcb599d3a4a974f4a27a331cf552a4a444", + "0x00000000000000000000000000000000000818aec4979cfbad995d06cd63c7cb" ] - hash = "0x0fabe711c6293470b4d896d9d19d1bd2dad3a7a813480789083435054bae2350" + hash = "0x25788ad2f257dc7828abc3b3b93cd571a106a13f64ad6bfe0f715238a9593318" [inputs.start.note_hash_tree] -root = "0x1ff86e9f928f0badd7018ef95ea4cf3e8ecb335b6d6469898efbe277190dac3d" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000040" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" [inputs.start.nullifier_tree] -root = "0x0bd13db277549db39d850c20ff6525155c9bd7c300ab7fb699fba15983d34864" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000c0" +root = "0x0b3cd059f3a14d1fc149e845404ee3733e58010456792a3f61c3803f4ddd1248" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000440" [inputs.start.public_data_tree] -root = "0x20554bb19256cbe73a459d2192fc0fda5dfdaf27341157e30a529857ef9f23d7" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000bf" +root = "0x28b5d86e557e528de4452115c3b6ca2b8075465411e73f310c843fa8d2b5faad" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" + +[inputs.start_sponge_blob] +fields = "0x0000000000000000000000000000000000000000000000000000000000000009" +expected_fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.start_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000002328", + "0x0d38d167da0ccd3ba447ce36953062d88783b02447d5af2bd09519bcd2a928f4", + "0x00000000000000000000000000000000000000000000000000000000000003e8" +] + state = [ + "0x05dc8cfb21681a19bd8e67518d2b9e22d31ba0380ecbb3653e00daa9dabe7e56", + "0x0ebafbb8e482cfd14bfe06b18ba8ef29493892e5c55e9b5ed16ede0e4cfe7562", + "0x22fa4ea0b8f5633a4701f717c52914a96bc5be0e69d2e84d86b4a1a717dfac6d", + "0x0991732e4b69f8065c9beb388f953e963baab29beb67084560f6116c9fdec042" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000003" + squeeze_mode = false [inputs.state_diff_hints] sorted_nullifiers = [ @@ -2126,10 +2149,10 @@ sorted_nullifier_indexes = [ "0x000000000000000000000000000000000000000000000000000000000000003f" ] note_hash_subtree_sibling_path = [ - "0x031501cadda85bada60af8b284636cc568afa22eef40e355195a5b20c52fea06", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x0af87d98c040dfadabf7ef27165e88560ef39d0c923b6534466a98f672ed8c88", + "0x246218a1d11c91124c20e3394600ad16e5036e2b84aa6afcc8cf3422fd29b02c", + "0x1196b37a9f45bda9848dd661f2df18622a6b4efed01b1cb9eae812f3bf0bc0de", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -2162,11 +2185,11 @@ note_hash_subtree_sibling_path = [ "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] nullifier_subtree_sibling_path = [ - "0x07539b506d800baccc28cdc70fa65888fffe14b29e8d12549a1dc301464113f1", - "0x2a77ad460b585bb241644e96814d2ea68421a2b229322d8cbd5020ba5381d58c", + "0x073e1f0a657436e06a1f70e48c6ebba9ec9c868f289dd2f36eb04fe3f5b849d8", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0a06b6b89781f620b504e94f41d028f37551b3ee799e27e4f53d77e2cc8dfe70", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", @@ -5494,9 +5517,9 @@ fee_write_sibling_path = [ [inputs.archive_root_membership_witness] leaf_index = "0" sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x1c7e3b9ffdf0b6a594a190917fadf9225865e3b7cf6a2a4dbe96192dbc75321e", + "0x027d9785407aca38bbb69f8a7eb032c44f468906876de817b8b38d2b9fd6c485", + "0x08feef9a1f8a52eb745cf4123253b4f9d98bc0d090fa1c1a07e34f2a0fcefd19", "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", @@ -5526,29 +5549,29 @@ sibling_path = [ ] [inputs.constants] -vk_tree_root = "0x0a2c34220aa778be6f9e8c76c1d65c5a35de6c9f5bffc69146d1863b20e1cbcd" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [inputs.constants.last_archive] - root = "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000001" + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" [inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000001" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" [inputs.constants.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [inputs.constants.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.constants.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [inputs.fee_payer_fee_juice_balance_read_hint] leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-base-public/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml similarity index 54% rename from noir-projects/noir-protocol-circuits/crates/rollup-base-public/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml index 21b55d134fe..285ddf132c7 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-base-public/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/rollup-base-public/Prover.toml @@ -1,69 +1,69 @@ [inputs.tube_data.public_inputs.constants] -vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [inputs.tube_data.public_inputs.constants.historical_header] - total_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" - total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000000000" + total_fees = "0x0000000000000000000000000000000000000000000000000003a83680db4900" + total_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004a40" [inputs.tube_data.public_inputs.constants.historical_header.last_archive] - root = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + root = "0x12a67a275560c583960931231ad3a43c5446c4ecf990edce34f69e4a8924e2a6" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000006" [inputs.tube_data.public_inputs.constants.historical_header.content_commitment] - num_txs = "0x0000000000000000000000000000000000000000000000000000000000000000" - txs_effects_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - in_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" - out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + num_txs = "0x0000000000000000000000000000000000000000000000000000000000000002" + blobs_hash = "0x00537c616e473c341bec4ff523a3cb1047b172d24b3703433b40b75b61063994" + in_hash = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" + out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" [inputs.tube_data.public_inputs.constants.historical_header.state.l1_to_l2_message_tree] root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000060" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.note_hash_tree] -root = "0x1fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x1f1580bd0be976002f317f6c459793db2b87c64220c11f186943ae1b990bd520" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000300" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.nullifier_tree] -root = "0x0c499b373a1f0fe1b510a63563546d2d39e206895056a5af0143c5f30d639073" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +root = "0x2ac6b844105b8bb164508a4e42d67903629a92272fc5fddf367e3aeaa7ed775a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.tube_data.public_inputs.constants.historical_header.state.partial.public_data_tree] -root = "0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +root = "0x0ff17010ab909b4a0c9581a9c33cf0af93280c6fcd6664cf27270b8762a9e418" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" [inputs.tube_data.public_inputs.constants.historical_header.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000000" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000000" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000000" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000006" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000013" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e66" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.constants.historical_header.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" [inputs.tube_data.public_inputs.constants.tx_context] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.gas_limits] da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000b71b00" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [inputs.tube_data.public_inputs.constants.tx_context.gas_settings.max_fees_per_gas] -fee_per_da_gas = "0x000000000000000000000000000000000000000000000000000000000000000a" -fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000000a" +fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" [inputs.tube_data.public_inputs.rollup_validation_requests.max_block_number._opt] _is_some = false @@ -137,7 +137,7 @@ note_hashes = [ "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x0000000000000000000000000000000000000000000000000000000000004001", + "0x1f402bc61864bc9d78571eb2ff08bd21be788986bfc07e9e7865cbe3dd0a905b", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -1006,211 +1006,211 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x033ae6dc5bccdf0086648cf905a434f49cf7c0aeb79f070973e8613cdca07b73" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004111" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004112" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004113" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x269921e542e76afd4f4198d25b6d67cf4f6319e0dd00d5bbdd623aa2863bfadc" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004110" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004111" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004112" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x164e61b29ebfa6db467c9c4e43bc3396ec63eafaebba289ca35e2bcb30f24c48" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000410f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004110" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004111" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x299e412e5120463fe65a4843531f0f7698d8cdf5c0bc588ac4c445ee333c3979" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000410e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000410f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004110" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x2be31ef0920049fb92f7a18ed1825b7f1ca5e93007c085099318ced1ec0dddae" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000410d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000410e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000410f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x21c7ebc0f49da93df9f6f2e999a6019f394285c5976566f13aed97a18470f31b" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000410c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000410d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000410e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x305ef9d4cbea319bd666b1d10cece27ad9e60eb3ba7bc44688a4674212f4d270" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000410b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000410c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000410d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x2456ab2f1d222e704c4f187bcdfb7c09cd63555155caf98cd29d5535a0a330d2" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000410a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000410b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000410c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0d30030a2b1d1ced42c4bffb87d7e960147ee936452111ead37365fe53f04f4d" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004109" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000410a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000410b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0341cc1cd55cd264f845f627795bf483239ae95157fba363f29e147db026b271" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004108" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004109" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000410a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x15104e98f3b27fc350ea3a0812275e635959512835c0da8025d45c4530ddff54" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004107" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004108" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004109" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x1aeced3252e318b10536ab81a4ddf34c598ec0bf217710f37116a110534b353f" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004106" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004107" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004108" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x298fd3989b75b339d3db964dcd80b250ae47e85fb2ee867757b8d71aed166758" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004105" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004106" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004107" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x2aa32a709b8a6dafc249d6d7af34d9f20b6623acf31fb2bee150cc960c178700" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004104" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004105" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004106" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0e8dc217389f691fecdbb2ca825b9d828f4ccfbdcdf83ce0927c12f951971c4e" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004103" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004104" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004105" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x1990baf536f386e86d13034a540705c5c4066f8b3db3631471826f4fe551fdd0" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000004102" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000004103" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000004104" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.non_revertible_accumulated_data.public_call_requests]] is_static_call = false @@ -1422,1354 +1422,1354 @@ inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data] note_hashes = [ - "0x0000000000000000000000000000000000000000000000000000000000005000", - "0x0000000000000000000000000000000000000000000000000000000000005001", - "0x0000000000000000000000000000000000000000000000000000000000005002", - "0x0000000000000000000000000000000000000000000000000000000000005003", - "0x0000000000000000000000000000000000000000000000000000000000005004", - "0x0000000000000000000000000000000000000000000000000000000000005005", - "0x0000000000000000000000000000000000000000000000000000000000005006", - "0x0000000000000000000000000000000000000000000000000000000000005007", - "0x0000000000000000000000000000000000000000000000000000000000005008", - "0x0000000000000000000000000000000000000000000000000000000000005009", - "0x000000000000000000000000000000000000000000000000000000000000500a", - "0x000000000000000000000000000000000000000000000000000000000000500b", - "0x000000000000000000000000000000000000000000000000000000000000500c", - "0x000000000000000000000000000000000000000000000000000000000000500d", - "0x000000000000000000000000000000000000000000000000000000000000500e", - "0x000000000000000000000000000000000000000000000000000000000000500f", - "0x0000000000000000000000000000000000000000000000000000000000005010", - "0x0000000000000000000000000000000000000000000000000000000000005011", - "0x0000000000000000000000000000000000000000000000000000000000005012", - "0x0000000000000000000000000000000000000000000000000000000000005013", - "0x0000000000000000000000000000000000000000000000000000000000005014", - "0x0000000000000000000000000000000000000000000000000000000000005015", - "0x0000000000000000000000000000000000000000000000000000000000005016", - "0x0000000000000000000000000000000000000000000000000000000000005017", - "0x0000000000000000000000000000000000000000000000000000000000005018", - "0x0000000000000000000000000000000000000000000000000000000000005019", - "0x000000000000000000000000000000000000000000000000000000000000501a", - "0x000000000000000000000000000000000000000000000000000000000000501b", - "0x000000000000000000000000000000000000000000000000000000000000501c", - "0x000000000000000000000000000000000000000000000000000000000000501d", - "0x000000000000000000000000000000000000000000000000000000000000501e", - "0x000000000000000000000000000000000000000000000000000000000000501f", - "0x0000000000000000000000000000000000000000000000000000000000005020", - "0x0000000000000000000000000000000000000000000000000000000000005021", - "0x0000000000000000000000000000000000000000000000000000000000005022", - "0x0000000000000000000000000000000000000000000000000000000000005023", - "0x0000000000000000000000000000000000000000000000000000000000005024", - "0x0000000000000000000000000000000000000000000000000000000000005025", - "0x0000000000000000000000000000000000000000000000000000000000005026", - "0x0000000000000000000000000000000000000000000000000000000000005027", - "0x0000000000000000000000000000000000000000000000000000000000005028", - "0x0000000000000000000000000000000000000000000000000000000000005029", - "0x000000000000000000000000000000000000000000000000000000000000502a", - "0x000000000000000000000000000000000000000000000000000000000000502b", - "0x000000000000000000000000000000000000000000000000000000000000502c", - "0x000000000000000000000000000000000000000000000000000000000000502d", - "0x000000000000000000000000000000000000000000000000000000000000502e", - "0x000000000000000000000000000000000000000000000000000000000000502f", - "0x0000000000000000000000000000000000000000000000000000000000005030", - "0x0000000000000000000000000000000000000000000000000000000000005031", - "0x0000000000000000000000000000000000000000000000000000000000005032", - "0x0000000000000000000000000000000000000000000000000000000000005033", - "0x0000000000000000000000000000000000000000000000000000000000005034", - "0x0000000000000000000000000000000000000000000000000000000000005035", - "0x0000000000000000000000000000000000000000000000000000000000005036", - "0x0000000000000000000000000000000000000000000000000000000000005037", - "0x0000000000000000000000000000000000000000000000000000000000005038", - "0x0000000000000000000000000000000000000000000000000000000000005039", - "0x000000000000000000000000000000000000000000000000000000000000503a", - "0x000000000000000000000000000000000000000000000000000000000000503b", - "0x000000000000000000000000000000000000000000000000000000000000503c", - "0x000000000000000000000000000000000000000000000000000000000000503d", - "0x000000000000000000000000000000000000000000000000000000000000503e", - "0x000000000000000000000000000000000000000000000000000000000000503f" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x0000000000000000000000000000000000000000000000000000000000005100", - "0x0000000000000000000000000000000000000000000000000000000000005101", - "0x0000000000000000000000000000000000000000000000000000000000005102", - "0x0000000000000000000000000000000000000000000000000000000000005103", - "0x0000000000000000000000000000000000000000000000000000000000005104", - "0x0000000000000000000000000000000000000000000000000000000000005105", - "0x0000000000000000000000000000000000000000000000000000000000005106", - "0x0000000000000000000000000000000000000000000000000000000000005107", - "0x0000000000000000000000000000000000000000000000000000000000005108", - "0x0000000000000000000000000000000000000000000000000000000000005109", - "0x000000000000000000000000000000000000000000000000000000000000510a", - "0x000000000000000000000000000000000000000000000000000000000000510b", - "0x000000000000000000000000000000000000000000000000000000000000510c", - "0x000000000000000000000000000000000000000000000000000000000000510d", - "0x000000000000000000000000000000000000000000000000000000000000510e", - "0x000000000000000000000000000000000000000000000000000000000000510f", - "0x0000000000000000000000000000000000000000000000000000000000005110", - "0x0000000000000000000000000000000000000000000000000000000000005111", - "0x0000000000000000000000000000000000000000000000000000000000005112", - "0x0000000000000000000000000000000000000000000000000000000000005113", - "0x0000000000000000000000000000000000000000000000000000000000005114", - "0x0000000000000000000000000000000000000000000000000000000000005115", - "0x0000000000000000000000000000000000000000000000000000000000005116", - "0x0000000000000000000000000000000000000000000000000000000000005117", - "0x0000000000000000000000000000000000000000000000000000000000005118", - "0x0000000000000000000000000000000000000000000000000000000000005119", - "0x000000000000000000000000000000000000000000000000000000000000511a", - "0x000000000000000000000000000000000000000000000000000000000000511b", - "0x000000000000000000000000000000000000000000000000000000000000511c", - "0x000000000000000000000000000000000000000000000000000000000000511d", - "0x000000000000000000000000000000000000000000000000000000000000511e", - "0x000000000000000000000000000000000000000000000000000000000000511f", - "0x0000000000000000000000000000000000000000000000000000000000005120", - "0x0000000000000000000000000000000000000000000000000000000000005121", - "0x0000000000000000000000000000000000000000000000000000000000005122", - "0x0000000000000000000000000000000000000000000000000000000000005123", - "0x0000000000000000000000000000000000000000000000000000000000005124", - "0x0000000000000000000000000000000000000000000000000000000000005125", - "0x0000000000000000000000000000000000000000000000000000000000005126", - "0x0000000000000000000000000000000000000000000000000000000000005127", - "0x0000000000000000000000000000000000000000000000000000000000005128", - "0x0000000000000000000000000000000000000000000000000000000000005129", - "0x000000000000000000000000000000000000000000000000000000000000512a", - "0x000000000000000000000000000000000000000000000000000000000000512b", - "0x000000000000000000000000000000000000000000000000000000000000512c", - "0x000000000000000000000000000000000000000000000000000000000000512d", - "0x000000000000000000000000000000000000000000000000000000000000512e", - "0x000000000000000000000000000000000000000000000000000000000000512f", - "0x0000000000000000000000000000000000000000000000000000000000005130", - "0x0000000000000000000000000000000000000000000000000000000000005131", - "0x0000000000000000000000000000000000000000000000000000000000005132", - "0x0000000000000000000000000000000000000000000000000000000000005133", - "0x0000000000000000000000000000000000000000000000000000000000005134", - "0x0000000000000000000000000000000000000000000000000000000000005135", - "0x0000000000000000000000000000000000000000000000000000000000005136", - "0x0000000000000000000000000000000000000000000000000000000000005137", - "0x0000000000000000000000000000000000000000000000000000000000005138", - "0x0000000000000000000000000000000000000000000000000000000000005139", - "0x000000000000000000000000000000000000000000000000000000000000513a", - "0x000000000000000000000000000000000000000000000000000000000000513b", - "0x000000000000000000000000000000000000000000000000000000000000513c", - "0x000000000000000000000000000000000000000000000000000000000000513d", - "0x000000000000000000000000000000000000000000000000000000000000513e", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005201" -counter = "0x0000000000000000000000000000000000000000000000000000000000005202" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005200" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005203" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005202" -counter = "0x0000000000000000000000000000000000000000000000000000000000005203" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005201" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005204" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005203" -counter = "0x0000000000000000000000000000000000000000000000000000000000005204" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005202" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005205" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005204" -counter = "0x0000000000000000000000000000000000000000000000000000000000005205" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005203" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005206" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005205" -counter = "0x0000000000000000000000000000000000000000000000000000000000005206" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005204" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005207" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005206" -counter = "0x0000000000000000000000000000000000000000000000000000000000005207" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005205" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005208" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005207" -counter = "0x0000000000000000000000000000000000000000000000000000000000005208" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005206" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005209" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs]] [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005208" -counter = "0x0000000000000000000000000000000000000000000000000000000000005209" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005207" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x000000000000000000000000000000000000000000000000000000000000520a" - - [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] - fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005700", - "0x0000000000000000000000000000000000000000000000000000000000005701", - "0x0000000000000000000000000000000000000000000000000000000000005702", - "0x0000000000000000000000000000000000000000000000000000000000005703", - "0x0000000000000000000000000000000000000000000000000000000000005704", - "0x0000000000000000000000000000000000000000000000000000000000005705", - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711" -] - - [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] - fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005701", - "0x0000000000000000000000000000000000000000000000000000000000005702", - "0x0000000000000000000000000000000000000000000000000000000000005703", - "0x0000000000000000000000000000000000000000000000000000000000005704", - "0x0000000000000000000000000000000000000000000000000000000000005705", - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712" -] - - [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] - fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005702", - "0x0000000000000000000000000000000000000000000000000000000000005703", - "0x0000000000000000000000000000000000000000000000000000000000005704", - "0x0000000000000000000000000000000000000000000000000000000000005705", - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713" -] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005703", - "0x0000000000000000000000000000000000000000000000000000000000005704", - "0x0000000000000000000000000000000000000000000000000000000000005705", - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005704", - "0x0000000000000000000000000000000000000000000000000000000000005705", - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715" -] - - [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] - fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005705", - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005706", - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005707", - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005708", - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005709", - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000570a", - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000570b", - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000570c", - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000570d", - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000570e", - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000570f", - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005710", - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005711", - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005712", - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005713", - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724" -] + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005714", - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005715", - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005716", - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005717", - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005718", - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x0000000000000000000000000000000000000000000000000000000000005719", - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000571a", - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a", - "0x000000000000000000000000000000000000000000000000000000000000572b" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000571b", - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a", - "0x000000000000000000000000000000000000000000000000000000000000572b", - "0x000000000000000000000000000000000000000000000000000000000000572c" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000571c", - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a", - "0x000000000000000000000000000000000000000000000000000000000000572b", - "0x000000000000000000000000000000000000000000000000000000000000572c", - "0x000000000000000000000000000000000000000000000000000000000000572d" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000571d", - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a", - "0x000000000000000000000000000000000000000000000000000000000000572b", - "0x000000000000000000000000000000000000000000000000000000000000572c", - "0x000000000000000000000000000000000000000000000000000000000000572d", - "0x000000000000000000000000000000000000000000000000000000000000572e" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000571e", - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a", - "0x000000000000000000000000000000000000000000000000000000000000572b", - "0x000000000000000000000000000000000000000000000000000000000000572c", - "0x000000000000000000000000000000000000000000000000000000000000572d", - "0x000000000000000000000000000000000000000000000000000000000000572e", - "0x000000000000000000000000000000000000000000000000000000000000572f" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] fields = [ - "0x000000000000000000000000000000000000000000000000000000000000571f", - "0x0000000000000000000000000000000000000000000000000000000000005720", - "0x0000000000000000000000000000000000000000000000000000000000005721", - "0x0000000000000000000000000000000000000000000000000000000000005722", - "0x0000000000000000000000000000000000000000000000000000000000005723", - "0x0000000000000000000000000000000000000000000000000000000000005724", - "0x0000000000000000000000000000000000000000000000000000000000005725", - "0x0000000000000000000000000000000000000000000000000000000000005726", - "0x0000000000000000000000000000000000000000000000000000000000005727", - "0x0000000000000000000000000000000000000000000000000000000000005728", - "0x0000000000000000000000000000000000000000000000000000000000005729", - "0x000000000000000000000000000000000000000000000000000000000000572a", - "0x000000000000000000000000000000000000000000000000000000000000572b", - "0x000000000000000000000000000000000000000000000000000000000000572c", - "0x000000000000000000000000000000000000000000000000000000000000572d", - "0x000000000000000000000000000000000000000000000000000000000000572e", - "0x000000000000000000000000000000000000000000000000000000000000572f", - "0x0000000000000000000000000000000000000000000000000000000000005730" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[inputs.tube_data.public_inputs.revertible_accumulated_data.contract_class_logs_hashes]] -[inputs.tube_data.public_inputs.revertible_accumulated_data.contract_class_logs_hashes.log_hash] -value = "0x0000000000000000000000000000000000000000000000000000000000000000" -counter = "0x0000000000000000000000000000000000000000000000000000000000000000" -length = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.tube_data.public_inputs.revertible_accumulated_data.contract_class_logs_hashes.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005503" - - [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005500" - - [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005501" - - [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005502" - - [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] - is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005504" - + [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] + fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] + fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] + fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.tube_data.public_inputs.revertible_accumulated_data.private_logs]] + fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.tube_data.public_inputs.revertible_accumulated_data.contract_class_logs_hashes]] +[inputs.tube_data.public_inputs.revertible_accumulated_data.contract_class_logs_hashes.log_hash] +value = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" +length = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[inputs.tube_data.public_inputs.revertible_accumulated_data.contract_class_logs_hashes.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] + is_static_call = false + args_hash = "0x280e22beb48c4b01ec87a57a5320613e8bc1d6a1f6eccdaeef5e7bd70bd6b649" + + [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" + + [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] + inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" + + [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] + inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" + + [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] + is_static_call = false + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005501" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005502" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005503" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005505" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005502" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005503" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005504" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005506" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005503" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005504" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005505" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005507" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005504" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005505" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005506" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005508" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005505" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005506" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005507" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005509" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005506" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005507" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005508" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000550a" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005507" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005508" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005509" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000550b" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005508" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005509" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000550a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000550c" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005509" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000550a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000550b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000550d" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000550a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000550b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000550c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000550e" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000550b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000550c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000550d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000550f" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000550c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000550d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000550e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005510" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000550d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000550e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000550f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005511" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000550e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000550f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005510" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005512" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000550f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005510" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005511" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005513" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005510" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005511" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005512" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005514" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005511" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005512" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005513" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005515" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005512" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005513" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005514" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005516" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005513" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005514" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005515" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005517" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005514" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005515" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005516" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005518" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005515" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005516" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005517" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005519" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005516" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005517" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005518" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000551a" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005517" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005518" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005519" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000551b" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005518" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005519" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000551a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000551c" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000005519" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000551a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000551b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000551d" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000551a" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000551b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000551c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000551e" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000551b" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000551c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000551d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x000000000000000000000000000000000000000000000000000000000000551f" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000551c" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000551d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000551e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005520" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000551d" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000551e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x000000000000000000000000000000000000000000000000000000000000551f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005521" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000551e" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x000000000000000000000000000000000000000000000000000000000000551f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005520" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000005522" + args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.msg_sender] - inner = "0x000000000000000000000000000000000000000000000000000000000000551f" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000005520" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.revertible_accumulated_data.public_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000005521" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.public_teardown_call_request] is_static_call = false @@ -2785,8 +2785,8 @@ args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.tube_data.public_inputs.gas_used] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000000200" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000200" +da_gas = "0x0000000000000000000000000000000000000000000000000000000000000400" +l2_gas = "0x0000000000000000000000000000000000000000000000000000000000006500" [inputs.tube_data.public_inputs.fee_payer] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -3262,198 +3262,201 @@ fields = [ vk_index = "0x0000000000000000000000000000000000000000000000000000000000000006" vk_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x014a516f71dbd17eab1a40a2497fffcbdd814991b95195bb0bb4ccbaeb123d89", - "0x1d6c13ab80b548ef7fe2ad868331dd590e0ecc945265f603a17d53ea3dfa158a", - "0x16689f45f3440063faf62389449732a5d04a721e5133f1d532400d2f690a7af3", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x17ae608923d921cec098fa1fb04e11c0607e26cc76eeb692545e510f0a4a65cb", + "0x15ecc428fab93e00874151f32575661782fcb6438d7cf5c797dad068e4eed590", + "0x25e71fd64ecaa6b98ef492c6d93da8164a259284041220c258edb94fe47706ab", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] [inputs.tube_data.vk_data.vk] key = [ - "0x1a79ae232c7b8cc47917d1a94cc21662596f9382ecd0dc6053246c8c3efbcb19", - "0x226e9811bddf7f3996ebcdb55805cd9c2db13cff47bafe77becb13aaea31e2fa", - "0x2bcb438068b14d8f11f7384ddcf07c259831c837f320e121f35791d46e187248", - "0x02551288b17e5fdfdb5e79d760e7d0d9186e19fdcfcf99cbb0888299d9c4c2d8", - "0x2a73090b39f189e0bfcd69a799a2ef89eb648e0a37adeed07cda015c821fd36f", - "0x2a588fb37d8f61cf294a99554d95243797be71afaf5e71d31a011ea1cf612bfd", - "0x1d0a980fd36fba225cbb8611326aee9c2d144c5dd2f2f1a46e5546abe5abe7db", - "0x1af8ef3496d44c8f3b3ac10fb0773454c7a44f171b43690bdc5dc79145a6d238", - "0x16946547e6ea97afd0acb3c68ad168419ffcc75d41b1f6d5a9caff926f06004d", - "0x2a8576ee98a8d60599c0c5df9260ae01e2b737b955f491921456c6da9bd3ff3b", - "0x0ca7338c0b72ca6c619886936374f0675024f70ca4bddce98725631648a8b0ac", - "0x2862ae58bd32b9f9e4ed3a30a0f33dd18ac35e7b619266c447e2f4f0bfb43ff5", - "0x0dabc7e8cde54aee5cfaafa9677912def153e67278a9ead80eb01f02848cbec0", - "0x2797c95ee57f78753607acc3772facdb0e6c01e37621c34506a6edcceefc2915", - "0x0ff2f7edacb1065d2055aacaf42cd872dda783a7e959a3bdfc321b620da094bb", - "0x26f6ac62b9bb6f92f635e53bedcda9608c00e87af0be2901ac27e4e8903ba508", - "0x1697d1603999f2ce4e35ead85e693b489cc054593ca4e6a367e2d6319901b645", - "0x009bf8883e03828528bd4072e79cce83a1fac765bec1f4e64caf1346f64a765a", - "0x077e09128efd6f470ba4d66e155ac45fa4cb7201ba78333c20a630889922e603", - "0x1497af6981eef0bc4cad865ff43ca02d120690e19952de98cb3867eda73ab867", - "0x2e9d4b4fbdd47fe18841feff223624261f5ba4fdd53ffa945e450dd64f695423", - "0x0bed67c5fd197ae4068c609d45f722a303f2a3098a898ee260dd19a1b71c6278", - "0x101eaf429917615a6554ad37063d1fbb9dff44df97b4ea96c1c8afb38e1a4f37", - "0x01c7e996d1f446f483765f529267db825f329dc492baacdbcdeda0c1bf9074e8", - "0x2a3b08e9e26645db5da72e4c62cdb86552fdea4691f82df5970dd4d2ac51e685", - "0x17bba2b33598238ba0ba497ff02b98a40a39f7755ea1c123c0e9faee81175980", - "0x17bafe67970b0062288aef905b9634d4e4a9824ba9b49b9c9bc67600220153a4", - "0x271ad80bd14c10a1054c9526fdbab2d4183f99d71fc9d23e71f7d73daffe8014", - "0x0e7b8a53158c0d178f45754eaac71ceecd6cd140c671479d612ceda932ce8e32", - "0x2385c012d6dc666ec983077b28925a48863e347bc2986e49be8fd63c16de7eec", - "0x21089d43422303ce7d7aae9ade84030afb848cd7a98f8edc4c06bf96a6d66126", - "0x114de22302e2c77f46ce02eeb0b0a6a401423c923c03517ab6ee5520cdca1411", - "0x20d87eb37caa29ac448c193049b6625c94fee22676117bea9ca4fa2fc53cacb2", - "0x175a7e56937cf0ab3674bd736cfb823a208e149adeaed63445581ef303033c38", - "0x11c1c8719a96ec899c2cdd14e13aa997883f9984aa54cd2900fadfc01e277741", - "0x2a7a7ce650cc83e7e2cc247b948f268f7d10408cb75d7ee854e3806a76732796", - "0x0de80302be67cc20bb7f940908166b48a32c77622a83a2f2efbde338b6dbf922", - "0x238c913b473e76072d377027a3283e6e10135f4b6ed1fca25d594275e051c346", - "0x25521c795847e3120bb8738fd97cbc5fad9f66bd47585306ef9760a2f7d116e2", - "0x2ae9b8fad3e363b8bb72646370df1f66bf04260e0f16d1a74bb6a9b1fbe53eae", - "0x278883170e484872442633e1a60448a5160010ef7bfe7809109b2ed4468de58a", - "0x0f1077c3a2a65525f281a8b34883cb375f480bed727ba165c4e639b0a96caf31", - "0x12280cc74dc4a5ec3eef0d03ccfbcf472921eb35561ef00af576de7bf9758f47", - "0x0ca289765219bcbe03efb3218a4fb36c76a68e8682b25e97d730e587259e947e", - "0x27e0c576a9efe1f0b2752568707c11adf60774eb80d03b9577a2cf4016cfbbf4", - "0x2e95b380d33e6474c88539c27fee1a3cfa4206ae9b201f7c512e69040eb83abe", - "0x10c536d2d98f92a8203cfd31bdcfdff637af7976b030677178a2b59190550283", - "0x0057b1a78895ad1500e2a19c9f3cc5cf4d891e300c051a8407795643d3c0266f", - "0x1fd2f47f918e795ef67fed55587f2e562ccdef88651ddcfdf38359e9798ac56c", - "0x0870ad125d7f257bee24bc4620f63b6d88ed3a29286027591f989d5317ead23a", - "0x28afca3790558610e7270006706384f019240a8e323e7682a90c190d4b56136b", - "0x0a54f2f1e4034f42244af885066b5339bb05ef225980c97fc3f1d1e514f93d1e", - "0x0fd4384f0434766d0cbe0ac09aa26d1f4d9572d3b02c40159c4d6e2e6b929e0b", - "0x13c0742d2eaa8da65924ab35839d7138c926fa54e185414138df6b15829fc819", - "0x20c05a0a20f6a74bbe8c0c08fd0f127317a07e9bce923700cd1d786adb71e6c2", - "0x28ef8de2ffd9b205761b06abd941977c69b1c30040bd82e7ed162998c97646dc", - "0x300db352dba5df47bb44d29ebfc493308a09730f09b7d8cc703bb6e08f7560e4", - "0x0275ea91ba9ae573e7408911ce354f5957cc5766a5112599359d76515098bd00", - "0x16598c9fecf979e0213fba1c52ebaf9fd33aff4e7176cf7859f98b4416b49f9d", - "0x211a61afb3bb9ddaddbe8950a2edd86cdf5c64b4518cd1f23fcd509924ef3899", - "0x214a9e19533f30929c2014cc8519500a31b9b09c918dd1274148d89e373fe435", - "0x2f14e08a379c3882eb166d222ac85ce1c2b7f2f89d4bfbf78f257933322944a9", - "0x1e6b8138da22891e3cf80cee3e4a8bdb8e7618d44943a5d88d7d3700f62355b3", - "0x0ee4f01604b4c4de3d2655acaeb2725f987955baeb7d26fa3b8b62c68a6e9d8a", - "0x0ed0eecb91f8a80707f7b59a144759929e9a4ef2eb49392f931ff3f5eb08f34b", - "0x2d6f9c971841f6dd949b3097fb0f317a1fe19d5f9665f33610babc8809051cb1", - "0x12b0aaa8bdee3f895510395e3d33cf080518582346cbd1461b8dc8af1679d767", - "0x178822bd8c27fe3250e150bf273672791cca3dc440c1c1e185868840968e7298", - "0x1242f70b50232b787620adc803bd6ef039eab7a0f15842c6da41ee332712cfda", - "0x2f46c1324d110747be5b9d190af517ff3cda57cfc49bb05085f8d9f1462e01c9", - "0x14089a989b0f036de9f9109112350e0b75d4e43e2819bd8d216fbf9f99a8ad2c", - "0x1a918f556ee34b3b734423c7f78b266c410760274e8c43014bd7481b42b64bd4", - "0x208415846962dd8f37a54cdab0266341fdeb29b96b9bdb2eb13896cbfa36985c", - "0x2ddf0ed1e06ae51ef3ce7ab5604116a774f266a240ea38b16d5329494d6ee2e2", - "0x02cc009d06471f332449c583cda73f3464cff9f2716da4bc024bf10a765ede6e", - "0x18d3adde1b26d3791fa389af7b6cc1ef31d523c434a04c8a8e301c40b459ce3f", - "0x0bdb56292e534b6fc586cd93d5b2618f9d6a95ee7248e0db9a67f444528f3a4b", - "0x04046c043a8ce5267ff6f95acb896420b1f90199e3280c5bfc880eb10840bc6b", - "0x194926bf0591a4b9c892450d232ac10c50e61c8797c90ed52f244db3237bac0e", - "0x1f7d86ad4cbada5c0183c518a94a64822954e73f20019fc4006f747a6a32c85b", - "0x2cfad3020e8bffaa8aa50ce442c09a9c1cded46459f6e43a42909001a37ad2da", - "0x0790767b418590c52caa13f0b7c45cff0335c86d04a4bf345c7036ce8f5458fe", - "0x26f6f99a071a148136a0f3df3c92654fd9e91a336906bca814a0bcdb43242cee", - "0x2103e0488908ea23bdadb3c2389fc918bffa3a0bd3c2ab21fc838fcc6c811e0c", - "0x04a14cfb8f6f5403a11e4f02f9dd7afb51e26a52f712fc2dd412c4b427b50919", - "0x200c83d05a7fba5b99495642b7c8cd58a23e580fe5b8b795a26cfe462cb780da", - "0x1ba14c546b3753a1fbe36f6ffae2123093303241957589e3cb161e8d663dfcf0", - "0x036bd07307b20a312392aaeba1813b3e86e082d5da10477610249f51f8bed834", - "0x25c606dd4ee6b2e0f452429ed3d6d477ec8c7e1c41bffe6b2d6cf48c5f6fe3f8", - "0x2ce48a722f167b0faa0bac6e2802e35a43c0ae284e49f2f483fa4786b8a4ce0f", - "0x077488404d20fc9dbfd8ecd7b6f8ef42e1d45166a058bd0a64e0935b236243b4", - "0x1b5b6fb7ec47baa2982f049393d7e7fe838a36cd96b035b63d7b3314a7e492bd", - "0x1bdea8b1627937fe6314db3850d7af48033dda2dbd7530ac9e2244d95cf7864d", - "0x1e1ab5c314cc2f1539625d7db2d7af3cc100b7668af6887e5eeb31bb61473ae2", - "0x12742383ef04aa4aa865cc2e6e470dee4d214207e302df2680359faac10590b0", - "0x0428456df060df5f3005f56ca0d5457dd582d42137256ed1e2abdc2a8b0408b1", - "0x0d265f6a4f9d12c38f8ff680c3b106b9e3948ffbbea602112b2b6d115a3fdb06", - "0x21258377cd2fc25b2bf023c71f11e11768b759613b9b20efce3282ea9e13d715", - "0x0c046f08b4a501380332ea95284bb68f92555953aa52038792e50cae9c5056d7", - "0x278b1ebfa29c44d7abccc76278d7167916fb6f40ce4f1258550ad20705bb10c1", - "0x2eefcda2e11c6c05d9c42bc4c2e5d6721f93a9b713806fadb4730bf882602e17", - "0x13f492688be99e59052a3e1343b0280c875f98a3ef04df3c39182ca01de3d580", - "0x1ff6b4d9858f23153beaa059bbab7634364c53df4c665bfb74c024a8f33a4fd2", - "0x0e098b97a65376b0b44891fbbc2e47b901a1604f232fabf2ce02f1ebe6746a3e", - "0x0aedb3978d1f99443ce53f7b3e2f3bb6fd144e3b7ff51f775b099fd1bb4e7c11", - "0x266d43a33e1430ca4585caf4352d42ced52e7e2097aab49cf47a6180b96267fd", - "0x0fd13ddc777328e96d012f452a9240ee33d1c66d8767b7508cb65d72aa272cf2", - "0x0ab9c232abd48be494b54b512e03ab52a19162fe7246698f13dd5215029d2226", - "0x214d32c5fa21d06e886e967bc6283ec2fe56601eae328fc188f8cb67b0552c80", - "0x14aa607f8d42e8ff21f806c5843c94bb1d9f7ab7d5f5e5961a75ab2b56715c15", - "0x2586b1b3fec099b3784f4f37d4c3bdfb5f546fa30229c6bde87a0cecf6896baa", - "0x0f961497937dd7d7c9de16df50439037d4691742e5eb45b4b572bad8d8bdf581", - "0x278c0373942d44b7077d2e50d70ddc174c76f2d38fcbc9c74921b60c7f1e0ec0", - "0x023a4b33959a584c51222fa22c4ee65514020e6328d419faac012e437f74f094", - "0x279d8f48ea56490e982f602c9f1e833ba189641493ce10ff33c0fd61b744df96", - "0x0646f1eec1b309426560fbdca0c497f1e0707e143fcdffe43274c5a213557c96", - "0x2dfb5160e94f4aeed9ced0826dc7ff4f70531a2ac1edb3736b53ffd68344dfc8", - "0x2eb0e4288485db024cd7f88b41132d56ba1a11562951140253dfaad1921e4a56", - "0x252a76d773f72409693d433044bb1e094dc7ea5021e159845ca98816cd40986c", - "0x09a211c7441f272cf3e60c7ba872946d1708a79d8f60267a6e4a0aa064a8fd6e", - "0x122053b0811eae58e6589c688636800fa52b4a5b1942350f235557a979d6ee16", - "0x172a2b1127f1beb12a6734a3bec4c1568030aa3527cc9a2d5b3e3792bf601056", - "0x2d8a7a85f28ca07012baf4df9cafc6906ac2bd818af4b7aca1f5a47e98eeadf3", - "0x0dd6d60a8ccba6f4d01cd5a77c8a4a07afedd11b38dcb6ee084dc0c89369761f", - "0x23e7358b7fb88aa6af6ffe07a090e6544189ecfc05d2ce08eff29d149015d176", - "0x24542afd9d3cfb9a7497fb04bde79daa0a43c2eb61d871524688c2c3e3fa1477", - "0x2d05cc09923889ac8ba8f797b1ec685f3920ba4457e5799de61bf1070c45e2f7", - "0x2a901e30f5d3998b8939e0a1fd6947f6ebb5b5f605f5da9faca8329e2347fcae" + "0x1bfa44f2f20c04c211cf7626f15acbc2a367aa54b5b640d9853bd02042b7da37", + "0x143ba3a3a96ca51ef744edead75ae4ae51acc10f725789a14bad01f3e613c33b", + "0x2ed6d3b65a9f1e6279ecc5f48e9007425e5fd1f086879d029cfb4899fd1101f3", + "0x05328139f807dd4ee06f6aec2f2a481c61e3fa88373f573f6bcd5e4b272268f2", + "0x2a2158771f4c7cfdef039c333466495b029d6a17f5135ed629eb190ab9553833", + "0x22b00c839ee07a11fa2c60eca418bf8565e17c1b9e1dc3e512aa095b1ca6c431", + "0x0f2ba4928d2345bdcf7e84c98519a37f32fbd6b665eb59692e97afc2877639dc", + "0x15ecfd47994d230c490bd30c07830a658531d640504413d679b9d049a4833a91", + "0x2f7656a78e18d6bcfbfbeb2c2b8c1b259b6c9f00e5006d67e436ce6bc7dc78b3", + "0x16839047875d7003e3db5a06b7593807a49262e7e30209380c268e0daeb9ffb2", + "0x0012890b0d7f650ae68b7b6e607378dff5a966ca894be521971d2440b2b2112b", + "0x1203215d42762e87233fb464e2fd8597a916a59bdc04790a9e87ce5cf94fa201", + "0x2bc8c849a0849d132ad289388964c94b1195a9b08e8950dfd7e3ba399c62f80f", + "0x0e03d24b28d9d3899b34eafee1806fc9c26161bcbd1bab624d78088c9689a40a", + "0x12e75f437f428ed42d557b08992ecf13fbdf593b03da968e7fed7a9c5f09c919", + "0x062dd479c320a3b6e0c6aaae014cf5f1f912e35bdb362eddf0cd685dc5d346aa", + "0x2a0aef1ca28be42005a8a0e2d16a5d74fc57db026d7c9bbf9ef9417db500466f", + "0x2c7dac680bfeaccf991ad8952813bcaf64424202f68a2bf12cfe3f38fdad3257", + "0x0bde7a55f9f6c8389933fdb6a2b927aa7d5165f6c4c56d8bbcdaaafd5118b4f4", + "0x2bda2e0be0f51be81a867ecd54ada45677d74a34428f9210ae000f12da577bd1", + "0x28bd04d2d10479950f4632ece00144a2d1ab871a58f69673391ba1d5662a6cc4", + "0x0edb1b17d39016ebe4f6d8128ce3f84004d4d34d9d72d7d463d68961790622d6", + "0x14affee4e6d56ff596b93246ff0151c37b96ba14195a61ae03158081087f9e98", + "0x1f4407b4e5c8cd6f26bb115aec6a53c61bacf9cd22e7fd11ab37f6e63a403d2f", + "0x272ac9a2b4190e0fa9f67d0f08bd9db2e3052ce4c8666604f06572dcccb8b393", + "0x143e6c0e49356c95bcb62f98b300338d203ae832c46a137368e0a261f27601db", + "0x100601f67eb00d1db03bb753dfcf1665da009ec3f1f33716b74d72321725836a", + "0x274cd9ddf5e7828eded1fa24957ad66806ecd5c963fd9aff8ccc3f10569775d2", + "0x17c3285771175332941c66d716a13f13f988648859203f538be6dc250494c60d", + "0x2a9b1ed4c33b97e1c92cc700c4049a47e5b9edd384b31cbac9ffe0eb46ec3c02", + "0x0d832e6d39981c86353abf85e4c351dab9e60ca8c4016258c2963a235a840953", + "0x2045e9baa6f55ccd8c65e124c05bc6e4b0334223847ca1b6bfc4bca8afe5f612", + "0x0867082aba9af1eacb35b03904b532ab1aea1c35731d423f8339608bbed06283", + "0x1fb501c4a04a8bbe1b4d4222e7a833ea795f729fe26e9e5f18d6462a7588cb93", + "0x10a7b85e4ea34c0cde5cf51259a877c4cf70c7d203c90620c938c1840452e7a8", + "0x140607c05291dfde12216519435eecb83a743e0978e712a74352543af1edbcc1", + "0x0a013c4d75cb5af0c9e8258961419fae98d3de053da2d4d76d76aeb528d7b5ad", + "0x167e4236dfeeef6784674544ac7915908b7df162d9ce1863f8378e4f0d659d52", + "0x1cb318ae475604b565d5d479269136a20933bf5161217adb495e6b33e5cccb39", + "0x2526b6986d1315bd61d4669b4e31802e5283951244972032e945acabbbb9ee95", + "0x2c9b3b1acc537aecaba66b9cc1cafd93807c7468ec03dea3f1c5aceba878669c", + "0x1607c5011768c9baf11bbc71751a673c8c9ab940f2513a3f20ce0e01d9aab706", + "0x0ac418c24a52173efe17275d13100d007658f43253eb5115579ca8e604aa5535", + "0x0cecac75229351c5c18ca254328916896ad4f4d300d5759172f0d80058def78f", + "0x103159b6611fdcb61153038af6138d227d671720dd574613a3571b7b0f94ebcf", + "0x11e62d52049352fa56394820af2db6107023a7d2d063a8c402559a6ca2184377", + "0x13ee29727f3ac35e1f371f5b5e70f5addb4ff95c67811bd7c3a4420fe81127ca", + "0x0009476148f290db1e416c5bcea889cd4ad066eb7693699d458dbbfb6a1eb03e", + "0x17391a68c43569fe94ba12d097173c5b1912bb03fe0928e5717c4ebcc58be251", + "0x2add96e3c6ce33b0ecc9f2474feb159ea7900d2eddc9299bc434b9e82e77eb9a", + "0x23f7bc36aa3347b4801df208a081d8a8402ae932061d6d7fc0319b5e5604bf4b", + "0x102769e2c5aa79f846544584c282949226f1e5b31a04b72fda377e6c354dc005", + "0x27b6b053bc7f5e63b559f424184a8e136a8b48bfdedfabc54561191d509d279f", + "0x10f8aa1ac1025364d8ad0fdfa4ac023a1aa9af7dea939bbd2050fdc53d16a3c1", + "0x1e8a6f9d2c430f3afaee15f8d15ead974c7db2ab768575a908650ef3aa683f36", + "0x1b12bfba9249d88990ea5ddf35394086048b70cb5bfed55c4ccf06c29e65fb2c", + "0x174a138e164e4bdf00ed69d4fd3dd32a1784f634eff941b50cbffd0e24400768", + "0x0399de084d1726bad6a065698a987ad4997110e278bdb09318c562bfe05ba563", + "0x0b32893afa0eb1fceba7b4d215bb65b711d308be047577a144c39744d5ae3995", + "0x21cd0714212e232663c56f92a3f17e92e0da3ab2d6bbaef46ddeb050798d9b4a", + "0x1795d536cadbb08c6b91e036c895e091ea09981fbb69066ea5678a8fc63d8419", + "0x0636d428c27a9459ee23b13d50ef4bb20fddb57d875746bb91d298ec34e42ea3", + "0x2df36fa7c78cfe52686cad4bb8d3d38c8dd832543f5962028af449c751bfb211", + "0x07436d9cab818362931aea99596030d542824119eb3ecfecb9bbe5cfcebe7e47", + "0x0b7f6af7895aa4c5de67e75a720567c3f00386b8b73a929b187fcfc78bef8691", + "0x1ef006a7bcffb41819a2612edf3920de93f367c9811b4eac3867e524c5af287a", + "0x28e37a2ea5dcc7c44a53ac0e08a10f6c6ef537a6a395707a09c73d535eff7e2f", + "0x123b5656ca0872647debc465168577a36fb23c0dbde6412784184b10b96bcec0", + "0x0d6b03baf20cc22f046c3bbf40e2e8cfa952d3311d42d874649b05b8461077b7", + "0x121e9aaabc0e58f61c44e59fc73ec033db54d5310aebdcb903782f7ca57079ad", + "0x0bde5f62bf14b6387b6e5507ae381a26669fc7691fc139c1a321537735a94927", + "0x2839612303477b8dde27d8b3deb6950648edd235e9ee70c8b220b481b6caafb5", + "0x0c8e52f24016f43c233a0bac1c855ee131446f80095d007f6eec338e11b96854", + "0x29ad8b52faecf42ce230d9e9d42deca2227c2d294e872a27e40e124ff870032b", + "0x110724826589260fa30434de8a545c9eaa50d902a0014843bcdfe8f109d55f4c", + "0x15ef4bbf93a2f68cc4f250ea4e6c7966cba9c595aa37e2970cd3607b4ad69c88", + "0x22d9b073e01dba83b814d8348c6ac1957d80cd7e0fc6fd9a4efaa6d0462325cd", + "0x1152ceaf287a891beb53a2782010a3da4bda3344559e688d331a9afe19673969", + "0x20f1c2ebfc4eb797ebc1cf52f5dd0f44098f628f660e50e494da0914961d7346", + "0x201a62298b87227f306a93beda4ca8a38a9a55051e9e67f3c58c3af04beac565", + "0x1dc1546696189da5d8c8ae5db528af85971357b15383e1d2887323c741ecabb7", + "0x11ef64e3c8968143201d6a1120d5139f11401171959a746015152dd476bead25", + "0x03c09c508d63466363539de55c81ca6fcb46260364eaecd6a8e750d5154aa1e2", + "0x0282a96573afe35baa840f09cbdf9cd6f44eb67878351038f89a752324c91ee7", + "0x2a43b168334ee89f67e76faf49ee035d7ff778ea4d79420c8820e0b735679d78", + "0x11ed672bf231147011978ff01fb3901189392191a092476f118a71d2b851c24e", + "0x1845363d16d79c01c1c4ac3f896baef2c8a6d3db44d8701f54122a52cc6e6e64", + "0x1c25935b0d0867a1fed34eba8b6f6a1b652aebc0557765018671ba3e190548eb", + "0x150d3e82fcd9a280daf6c07db1667a61571fae6e40ce45b9d98af57161cbaf87", + "0x1b1e4f5d885b49cca8a246d98d0bf0155e15ca3b2798087a39dffa7e9555de25", + "0x1b6462b7f98e005ce77cfa53e7c3a21027951c594e0daa717790a3d43ed2e498", + "0x0f71ee59fbf70ad12b179b4b9b670f308800986f6dcdb34ae226bcbccfb6e5d7", + "0x0d2e2ba60c9e3155a7ab56f60ef65c4bbafe4fed7001aec0ffa6469ef818bf6d", + "0x23da423c893f95386865589fbde978ebfbfc66dd662de0a8658a3df7d007be0e", + "0x098a3186b1090123c5b851eb4076c284a2c6cd02b2fb28263b56977be746057b", + "0x24173add4aeed1e2f4b932801eec0bab1605eb123462d2a2da1d549b5d868cf3", + "0x27a1f109230062171ca702916926b8bf999c3f3df3f793fb20f107575b428f8c", + "0x03652bff5342c71639aff4cd16b1455685df1f941401132586e8ce65e4405e0b", + "0x27b565e407c8f2014b0ed7b79374c5fc4f9332c3e0950d02682742741bc86a66", + "0x2ceb40e1632f85dfe4033a17b0aa31e8568bd0861e1d032fba5164357ed08c4c", + "0x2e07c64d1e7d5be09473417fc582c43cd417abd19de4ccca5eafa604271113b2", + "0x15327662366516be153727a21890bb277c2c52386e8c6a4cffa0e13223e9c693", + "0x075de224ce418e9f116a3ace20a1cfb7c96a6596ba92f95c876b665ee229eac9", + "0x19dcda0666f09af378c56915d3e9ac8502182c38c267d401f2e8438d48bf05d1", + "0x144a2c515bd9003e000055d04be599c2e45b38caece41ff5183c1c9931555160", + "0x1d79b941ebbbaedeb4dae1541bf0af6a7811769acc172ed681450ee79d5e76dd", + "0x2c889cdbc0e0460a139612dbaea20f570fbdf128a3bd5a28e2329cec46a437ab", + "0x2d7d39573ff0479169c0ae552818f59bb434c4aee7495234056601a9977fbd9e", + "0x2b3bd2745a4d8987c71b5222abf0411fef35a847834e843ea8198612822879dd", + "0x1d1ea9db8eb76f88468464b685d607f805a1798c2f10cd7d688ef9ab2fc646f0", + "0x0e1956a0721dbff85e88dec712b75c3692de02a65ee93562a12d6b55341d00ad", + "0x1f28e97ca07aed66f25edceba51241261c126c6fe96f4f77a33c40ed61212c0b", + "0x208527aa8b9b0ce0e82c43382314429a84e15286218bb002af0262ff594dc42f", + "0x14df909c8fa0d0a15cd07363f48e4aba770612574f9f4c07132fc1e49e1272a6", + "0x1c05fb4c606ec8d46cc93c471c72a7396d98320c5acf005526d7d696b5a21f7a", + "0x239322e0b7372404a59979842d2e4abd97653bba3c7700b95e63dfb87761445f", + "0x2bd124577e51268259acdd0413da7a348e1de67caf5c4ddf549a0884f5ab767a", + "0x2cf12f77abae4cf611142349b8a24eb193af74138dd8635d18c6389583dbf14b", + "0x0bd29ad3efcb3d6f1e6ef4f43ecacb0718e8319e75bab92ad37a15b437d9611e", + "0x1307ff6546aeee08627e03ac79d75bc6cbd91e5a7dd946d08fca17ad0c7e9148", + "0x2afdb75a0b0f7d70825f9d2016774037b0933df20ce116b18e86f62e96801977", + "0x104d87f80aeb27e3710a3acc0f091a33625090dba11d6d7b37b49f70e83a5e7d", + "0x043f80b13a29d7867f495a19f5dca16f73f68d0229a5d2d4de07e5e416f2218f", + "0x05af6b2ca6b955c8039f507d2e5cbf06c76fbdd253ba32daf63ebb60fbf28165", + "0x1917ccfb7f3f2514b5c51ec604f3addf3b244dfb1eebe6e244c444459ea46b56", + "0x23c1cad21ba40c8c59df93b371b57e3e935fbd8bcfc814b2a5e727d1ac508d28", + "0x1de894d5450dc7299ea6290f89dbaf8837b9e011449072b20d7bc48b9d5a3e99", + "0x0b2d29b925eeec46af08b62bf1199811277ddd9ef33075f96faafdf9f2062d68" ] - hash = "0x2d53a0aa10bdde2008821f82cc8c6901d401093adc92ee92eae71f0513dfa0b0" + hash = "0x1aaed86df77de9a40ca890b6b82271a03456e45632a9f880fcfe4211352cf1bf" [inputs.avm_proof_data.public_inputs] -transaction_fee = "0x0000000000000000000000000000000000000000000000000000000000000000" +transaction_fee = "0x0000000000000000000000000000000000000000000000000011b417896f129a" reverted = false [inputs.avm_proof_data.public_inputs.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000001" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" [inputs.avm_proof_data.public_inputs.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" [inputs.avm_proof_data.public_inputs.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.l1_to_l2_message_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000070" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.note_hash_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.nullifier_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x085a35f42d569f7aac0404ce29055696f738a6c798a32632d15a8453e59115ff" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" [inputs.avm_proof_data.public_inputs.start_tree_snapshots.public_data_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x0ff17010ab909b4a0c9581a9c33cf0af93280c6fcd6664cf27270b8762a9e418" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" [inputs.avm_proof_data.public_inputs.start_gas_used] - da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + da_gas = "0x0000000000000000000000000000000000000000000000000000000000000400" + l2_gas = "0x0000000000000000000000000000000000000000000000000000000000006500" [inputs.avm_proof_data.public_inputs.gas_settings.gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" +da_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" +l2_gas = "0x000000000000000000000000000000000000000000000000000000003b9aca00" [inputs.avm_proof_data.public_inputs.gas_settings.teardown_gas_limits] -da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" +da_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" +l2_gas = "0x00000000000000000000000000000000000000000000000000000000005b8d80" [inputs.avm_proof_data.public_inputs.gas_settings.max_fees_per_gas] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" -fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" +fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" + + [inputs.avm_proof_data.public_inputs.fee_payer] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.public_setup_call_requests]] is_static_call = false @@ -3873,16 +3876,16 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 [[inputs.avm_proof_data.public_inputs.public_app_logic_call_requests]] is_static_call = false - args_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" + args_hash = "0x280e22beb48c4b01ec87a57a5320613e8bc1d6a1f6eccdaeef5e7bd70bd6b649" [inputs.avm_proof_data.public_inputs.public_app_logic_call_requests.msg_sender] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x30021904ae3832fa38613650b957c74abcc7ae86fda9e53bcd89e7b638cf9d67" [inputs.avm_proof_data.public_inputs.public_app_logic_call_requests.contract_address] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x1b5c85f852759a87b99af1b7a52bf7b9a1bda23e2792ad5384113b9c17cc4c50" [inputs.avm_proof_data.public_inputs.public_app_logic_call_requests.function_selector] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x00000000000000000000000000000000000000000000000000000000d5441b0d" [[inputs.avm_proof_data.public_inputs.public_app_logic_call_requests]] is_static_call = false @@ -4302,7 +4305,7 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 [inputs.avm_proof_data.public_inputs.previous_non_revertible_accumulated_data_array_lengths] note_hashes = "0x0000000000000000000000000000000000000000000000000000000000000000" - nullifiers = "0x0000000000000000000000000000000000000000000000000000000000000000" + nullifiers = "0x0000000000000000000000000000000000000000000000000000000000000001" l2_to_l1_msgs = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.previous_revertible_accumulated_data_array_lengths] @@ -4378,7 +4381,7 @@ fee_per_l2_gas = "0x000000000000000000000000000000000000000000000000000000000000 "0x0000000000000000000000000000000000000000000000000000000000000000" ] nullifiers = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x1f402bc61864bc9d78571eb2ff08bd21be788986bfc07e9e7865cbe3dd0a905b", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -4755,246 +4758,246 @@ counter = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.l1_to_l2_message_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000070" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.note_hash_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.nullifier_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x0b3cd059f3a14d1fc149e845404ee3733e58010456792a3f61c3803f4ddd1248" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000401" [inputs.avm_proof_data.public_inputs.end_tree_snapshots.public_data_tree] -root = "0x0000000000000000000000000000000000000000000000000000000000000000" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +root = "0x28b5d86e557e528de4452115c3b6ca2b8075465411e73f310c843fa8d2b5faad" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" [inputs.avm_proof_data.public_inputs.end_gas_used] - da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + da_gas = "0x0000000000000000000000000000000000000000000000000000000000000800" + l2_gas = "0x0000000000000000000000000000000000000000000000000000000000016771" [inputs.avm_proof_data.public_inputs.accumulated_data] note_hashes = [ - "0x0000000000000000000000000000000000000000000000000000000000005000", - "0x0000000000000000000000000000000000000000000000000000000000005001", - "0x0000000000000000000000000000000000000000000000000000000000005002", - "0x0000000000000000000000000000000000000000000000000000000000005003", - "0x0000000000000000000000000000000000000000000000000000000000005004", - "0x0000000000000000000000000000000000000000000000000000000000005005", - "0x0000000000000000000000000000000000000000000000000000000000005006", - "0x0000000000000000000000000000000000000000000000000000000000005007", - "0x0000000000000000000000000000000000000000000000000000000000005008", - "0x0000000000000000000000000000000000000000000000000000000000005009", - "0x000000000000000000000000000000000000000000000000000000000000500a", - "0x000000000000000000000000000000000000000000000000000000000000500b", - "0x000000000000000000000000000000000000000000000000000000000000500c", - "0x000000000000000000000000000000000000000000000000000000000000500d", - "0x000000000000000000000000000000000000000000000000000000000000500e", - "0x000000000000000000000000000000000000000000000000000000000000500f", - "0x0000000000000000000000000000000000000000000000000000000000005010", - "0x0000000000000000000000000000000000000000000000000000000000005011", - "0x0000000000000000000000000000000000000000000000000000000000005012", - "0x0000000000000000000000000000000000000000000000000000000000005013", - "0x0000000000000000000000000000000000000000000000000000000000005014", - "0x0000000000000000000000000000000000000000000000000000000000005015", - "0x0000000000000000000000000000000000000000000000000000000000005016", - "0x0000000000000000000000000000000000000000000000000000000000005017", - "0x0000000000000000000000000000000000000000000000000000000000005018", - "0x0000000000000000000000000000000000000000000000000000000000005019", - "0x000000000000000000000000000000000000000000000000000000000000501a", - "0x000000000000000000000000000000000000000000000000000000000000501b", - "0x000000000000000000000000000000000000000000000000000000000000501c", - "0x000000000000000000000000000000000000000000000000000000000000501d", - "0x000000000000000000000000000000000000000000000000000000000000501e", - "0x000000000000000000000000000000000000000000000000000000000000501f", - "0x0000000000000000000000000000000000000000000000000000000000005020", - "0x0000000000000000000000000000000000000000000000000000000000005021", - "0x0000000000000000000000000000000000000000000000000000000000005022", - "0x0000000000000000000000000000000000000000000000000000000000005023", - "0x0000000000000000000000000000000000000000000000000000000000005024", - "0x0000000000000000000000000000000000000000000000000000000000005025", - "0x0000000000000000000000000000000000000000000000000000000000005026", - "0x0000000000000000000000000000000000000000000000000000000000005027", - "0x0000000000000000000000000000000000000000000000000000000000005028", - "0x0000000000000000000000000000000000000000000000000000000000005029", - "0x000000000000000000000000000000000000000000000000000000000000502a", - "0x000000000000000000000000000000000000000000000000000000000000502b", - "0x000000000000000000000000000000000000000000000000000000000000502c", - "0x000000000000000000000000000000000000000000000000000000000000502d", - "0x000000000000000000000000000000000000000000000000000000000000502e", - "0x000000000000000000000000000000000000000000000000000000000000502f", - "0x0000000000000000000000000000000000000000000000000000000000005030", - "0x0000000000000000000000000000000000000000000000000000000000005031", - "0x0000000000000000000000000000000000000000000000000000000000005032", - "0x0000000000000000000000000000000000000000000000000000000000005033", - "0x0000000000000000000000000000000000000000000000000000000000005034", - "0x0000000000000000000000000000000000000000000000000000000000005035", - "0x0000000000000000000000000000000000000000000000000000000000005036", - "0x0000000000000000000000000000000000000000000000000000000000005037", - "0x0000000000000000000000000000000000000000000000000000000000005038", - "0x0000000000000000000000000000000000000000000000000000000000005039", - "0x000000000000000000000000000000000000000000000000000000000000503a", - "0x000000000000000000000000000000000000000000000000000000000000503b", - "0x000000000000000000000000000000000000000000000000000000000000503c", - "0x000000000000000000000000000000000000000000000000000000000000503d", - "0x000000000000000000000000000000000000000000000000000000000000503e", - "0x000000000000000000000000000000000000000000000000000000000000503f" -] - nullifiers = [ - "0x0000000000000000000000000000000000000000000000000000000000004001", - "0x0000000000000000000000000000000000000000000000000000000000005100", - "0x0000000000000000000000000000000000000000000000000000000000005101", - "0x0000000000000000000000000000000000000000000000000000000000005102", - "0x0000000000000000000000000000000000000000000000000000000000005103", - "0x0000000000000000000000000000000000000000000000000000000000005104", - "0x0000000000000000000000000000000000000000000000000000000000005105", - "0x0000000000000000000000000000000000000000000000000000000000005106", - "0x0000000000000000000000000000000000000000000000000000000000005107", - "0x0000000000000000000000000000000000000000000000000000000000005108", - "0x0000000000000000000000000000000000000000000000000000000000005109", - "0x000000000000000000000000000000000000000000000000000000000000510a", - "0x000000000000000000000000000000000000000000000000000000000000510b", - "0x000000000000000000000000000000000000000000000000000000000000510c", - "0x000000000000000000000000000000000000000000000000000000000000510d", - "0x000000000000000000000000000000000000000000000000000000000000510e", - "0x000000000000000000000000000000000000000000000000000000000000510f", - "0x0000000000000000000000000000000000000000000000000000000000005110", - "0x0000000000000000000000000000000000000000000000000000000000005111", - "0x0000000000000000000000000000000000000000000000000000000000005112", - "0x0000000000000000000000000000000000000000000000000000000000005113", - "0x0000000000000000000000000000000000000000000000000000000000005114", - "0x0000000000000000000000000000000000000000000000000000000000005115", - "0x0000000000000000000000000000000000000000000000000000000000005116", - "0x0000000000000000000000000000000000000000000000000000000000005117", - "0x0000000000000000000000000000000000000000000000000000000000005118", - "0x0000000000000000000000000000000000000000000000000000000000005119", - "0x000000000000000000000000000000000000000000000000000000000000511a", - "0x000000000000000000000000000000000000000000000000000000000000511b", - "0x000000000000000000000000000000000000000000000000000000000000511c", - "0x000000000000000000000000000000000000000000000000000000000000511d", - "0x000000000000000000000000000000000000000000000000000000000000511e", - "0x000000000000000000000000000000000000000000000000000000000000511f", - "0x0000000000000000000000000000000000000000000000000000000000005120", - "0x0000000000000000000000000000000000000000000000000000000000005121", - "0x0000000000000000000000000000000000000000000000000000000000005122", - "0x0000000000000000000000000000000000000000000000000000000000005123", - "0x0000000000000000000000000000000000000000000000000000000000005124", - "0x0000000000000000000000000000000000000000000000000000000000005125", - "0x0000000000000000000000000000000000000000000000000000000000005126", - "0x0000000000000000000000000000000000000000000000000000000000005127", - "0x0000000000000000000000000000000000000000000000000000000000005128", - "0x0000000000000000000000000000000000000000000000000000000000005129", - "0x000000000000000000000000000000000000000000000000000000000000512a", - "0x000000000000000000000000000000000000000000000000000000000000512b", - "0x000000000000000000000000000000000000000000000000000000000000512c", - "0x000000000000000000000000000000000000000000000000000000000000512d", - "0x000000000000000000000000000000000000000000000000000000000000512e", - "0x000000000000000000000000000000000000000000000000000000000000512f", - "0x0000000000000000000000000000000000000000000000000000000000005130", - "0x0000000000000000000000000000000000000000000000000000000000005131", - "0x0000000000000000000000000000000000000000000000000000000000005132", - "0x0000000000000000000000000000000000000000000000000000000000005133", - "0x0000000000000000000000000000000000000000000000000000000000005134", - "0x0000000000000000000000000000000000000000000000000000000000005135", - "0x0000000000000000000000000000000000000000000000000000000000005136", - "0x0000000000000000000000000000000000000000000000000000000000005137", - "0x0000000000000000000000000000000000000000000000000000000000005138", - "0x0000000000000000000000000000000000000000000000000000000000005139", - "0x000000000000000000000000000000000000000000000000000000000000513a", - "0x000000000000000000000000000000000000000000000000000000000000513b", - "0x000000000000000000000000000000000000000000000000000000000000513c", - "0x000000000000000000000000000000000000000000000000000000000000513d", - "0x000000000000000000000000000000000000000000000000000000000000513e" -] - - [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] -[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005201" -counter = "0x0000000000000000000000000000000000000000000000000000000000005202" - - [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005200" - -[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005203" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + nullifiers = [ + "0x1f402bc61864bc9d78571eb2ff08bd21be788986bfc07e9e7865cbe3dd0a905b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] +[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + +[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005202" -counter = "0x0000000000000000000000000000000000000000000000000000000000005203" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005201" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005204" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005203" -counter = "0x0000000000000000000000000000000000000000000000000000000000005204" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005202" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005205" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005204" -counter = "0x0000000000000000000000000000000000000000000000000000000000005205" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005203" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005206" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005205" -counter = "0x0000000000000000000000000000000000000000000000000000000000005206" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005204" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005207" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005206" -counter = "0x0000000000000000000000000000000000000000000000000000000000005207" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005205" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005208" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005207" -counter = "0x0000000000000000000000000000000000000000000000000000000000005208" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005206" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x0000000000000000000000000000000000000000000000000000000000005209" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs]] [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message] -content = "0x0000000000000000000000000000000000000000000000000000000000005208" -counter = "0x0000000000000000000000000000000000000000000000000000000000005209" +content = "0x0000000000000000000000000000000000000000000000000000000000000000" +counter = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.message.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000005207" + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.public_inputs.accumulated_data.l2_to_l1_msgs.contract_address] -inner = "0x000000000000000000000000000000000000000000000000000000000000520a" +inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.unencrypted_logs_hashes]] [inputs.avm_proof_data.public_inputs.accumulated_data.unencrypted_logs_hashes.log_hash] @@ -5069,256 +5072,260 @@ length = "0x0000000000000000000000000000000000000000000000000000000000000000" inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006000" - value = "0x000000000000000000000000000000000000000000000000000000000000600a" + leaf_slot = "0x0384c877dba0f9d849d02e07dac0d3105f8e09b0959c5ee77843b8c037b195bc" + value = "0x0000000000000000000000000000000000000000000000000000000000002328" + + [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] + leaf_slot = "0x0d38d167da0ccd3ba447ce36953062d88783b02447d5af2bd09519bcd2a928f4" + value = "0x00000000000000000000000000000000000000000000000000000000000003e8" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006001" - value = "0x000000000000000000000000000000000000000000000000000000000000600b" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006002" - value = "0x000000000000000000000000000000000000000000000000000000000000600c" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006003" - value = "0x000000000000000000000000000000000000000000000000000000000000600d" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006004" - value = "0x000000000000000000000000000000000000000000000000000000000000600e" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006005" - value = "0x000000000000000000000000000000000000000000000000000000000000600f" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006006" - value = "0x0000000000000000000000000000000000000000000000000000000000006010" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006007" - value = "0x0000000000000000000000000000000000000000000000000000000000006011" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006008" - value = "0x0000000000000000000000000000000000000000000000000000000000006012" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006009" - value = "0x0000000000000000000000000000000000000000000000000000000000006013" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000600a" - value = "0x0000000000000000000000000000000000000000000000000000000000006014" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000600b" - value = "0x0000000000000000000000000000000000000000000000000000000000006015" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000600c" - value = "0x0000000000000000000000000000000000000000000000000000000000006016" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000600d" - value = "0x0000000000000000000000000000000000000000000000000000000000006017" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000600e" - value = "0x0000000000000000000000000000000000000000000000000000000000006018" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000600f" - value = "0x0000000000000000000000000000000000000000000000000000000000006019" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006010" - value = "0x000000000000000000000000000000000000000000000000000000000000601a" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006011" - value = "0x000000000000000000000000000000000000000000000000000000000000601b" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006012" - value = "0x000000000000000000000000000000000000000000000000000000000000601c" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006013" - value = "0x000000000000000000000000000000000000000000000000000000000000601d" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006014" - value = "0x000000000000000000000000000000000000000000000000000000000000601e" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006015" - value = "0x000000000000000000000000000000000000000000000000000000000000601f" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006016" - value = "0x0000000000000000000000000000000000000000000000000000000000006020" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006017" - value = "0x0000000000000000000000000000000000000000000000000000000000006021" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006018" - value = "0x0000000000000000000000000000000000000000000000000000000000006022" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006019" - value = "0x0000000000000000000000000000000000000000000000000000000000006023" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000601a" - value = "0x0000000000000000000000000000000000000000000000000000000000006024" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000601b" - value = "0x0000000000000000000000000000000000000000000000000000000000006025" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000601c" - value = "0x0000000000000000000000000000000000000000000000000000000000006026" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000601d" - value = "0x0000000000000000000000000000000000000000000000000000000000006027" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000601e" - value = "0x0000000000000000000000000000000000000000000000000000000000006028" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000601f" - value = "0x0000000000000000000000000000000000000000000000000000000000006029" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006020" - value = "0x000000000000000000000000000000000000000000000000000000000000602a" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006021" - value = "0x000000000000000000000000000000000000000000000000000000000000602b" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006022" - value = "0x000000000000000000000000000000000000000000000000000000000000602c" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006023" - value = "0x000000000000000000000000000000000000000000000000000000000000602d" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006024" - value = "0x000000000000000000000000000000000000000000000000000000000000602e" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006025" - value = "0x000000000000000000000000000000000000000000000000000000000000602f" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006026" - value = "0x0000000000000000000000000000000000000000000000000000000000006030" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006027" - value = "0x0000000000000000000000000000000000000000000000000000000000006031" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006028" - value = "0x0000000000000000000000000000000000000000000000000000000000006032" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006029" - value = "0x0000000000000000000000000000000000000000000000000000000000006033" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000602a" - value = "0x0000000000000000000000000000000000000000000000000000000000006034" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000602b" - value = "0x0000000000000000000000000000000000000000000000000000000000006035" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000602c" - value = "0x0000000000000000000000000000000000000000000000000000000000006036" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000602d" - value = "0x0000000000000000000000000000000000000000000000000000000000006037" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000602e" - value = "0x0000000000000000000000000000000000000000000000000000000000006038" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000602f" - value = "0x0000000000000000000000000000000000000000000000000000000000006039" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006030" - value = "0x000000000000000000000000000000000000000000000000000000000000603a" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006031" - value = "0x000000000000000000000000000000000000000000000000000000000000603b" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006032" - value = "0x000000000000000000000000000000000000000000000000000000000000603c" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006033" - value = "0x000000000000000000000000000000000000000000000000000000000000603d" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006034" - value = "0x000000000000000000000000000000000000000000000000000000000000603e" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006035" - value = "0x000000000000000000000000000000000000000000000000000000000000603f" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006036" - value = "0x0000000000000000000000000000000000000000000000000000000000006040" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006037" - value = "0x0000000000000000000000000000000000000000000000000000000000006041" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006038" - value = "0x0000000000000000000000000000000000000000000000000000000000006042" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000006039" - value = "0x0000000000000000000000000000000000000000000000000000000000006043" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000603a" - value = "0x0000000000000000000000000000000000000000000000000000000000006044" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000603b" - value = "0x0000000000000000000000000000000000000000000000000000000000006045" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000603c" - value = "0x0000000000000000000000000000000000000000000000000000000000006046" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000603d" - value = "0x0000000000000000000000000000000000000000000000000000000000006047" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.avm_proof_data.public_inputs.accumulated_data.public_data_writes]] - leaf_slot = "0x000000000000000000000000000000000000000000000000000000000000603e" - value = "0x0000000000000000000000000000000000000000000000000000000000006048" + leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.avm_proof_data.proof] fields = [ @@ -9482,255 +9489,274 @@ fields = [ [inputs.avm_proof_data.vk_data] vk_index = "0x0000000000000000000000000000000000000000000000000000000000000007" vk_path = [ - "0x0406dedf4da1d5b7b91a6adf47099629f062d8bb5f42fac78579a973cf2759c9", - "0x014a516f71dbd17eab1a40a2497fffcbdd814991b95195bb0bb4ccbaeb123d89", - "0x1d6c13ab80b548ef7fe2ad868331dd590e0ecc945265f603a17d53ea3dfa158a", - "0x16689f45f3440063faf62389449732a5d04a721e5133f1d532400d2f690a7af3", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x14844598b76623839d27d176f959eb56da12634178ad72ed46f9e3a546127473", + "0x17ae608923d921cec098fa1fb04e11c0607e26cc76eeb692545e510f0a4a65cb", + "0x15ecc428fab93e00874151f32575661782fcb6438d7cf5c797dad068e4eed590", + "0x25e71fd64ecaa6b98ef492c6d93da8164a259284041220c258edb94fe47706ab", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] [inputs.avm_proof_data.vk_data.vk] key = [ - "0x126ab84b7bfc01e5f855e12992d35067c888bb320303688417d81ffb1eaa31ba", - "0x177a5c23f8b3e55faaf189df170fb7d5fa90398ee31c8d4c29797b9179a14350", - "0x0a1fcb621f2ffc844b20ed623a31835779e16daadd3998b6bd276802f27ec9d1", - "0x237169875d33249d2914b322e8d49830348a5ae21bda776d7cf25101b57f10c3", - "0x2171151657986b428a7f457e4069ab578917ccd5011adbc1adcef670b90e1093", - "0x1e9c2003a6c4b6f124d9808e022492a1f82db608d8d0ee7bcf9c96324435e58b", - "0x18825bbfe62e9c43edbfe30f9537549e6f044aa4af31a8bf1a1f10f78c0e85dd", - "0x1d2416be519eca2494c988016a7a7a0d96938d2e2472683c0d9a0273f8d5cc3a", - "0x10c620c178219e79cf099cb303a78180dc1ecadb2ccb95a4d0aada1ae4a237eb", - "0x0069335e62537abc9fbcd2544daa5163e8af954ee5d489c9989ba95b71ede63c", - "0x2b22cbfced2ee18e176eb38bba677fb1e3f09e1687df8eb6663522680abe9e90", - "0x2c022e41d7a6d1a5d9a202b98cea67bdd744953f4a9ef5fdc918d03fa6d705c0", - "0x2197d938251a92967f82b20c517baef15601a4a4212dc11f0f689cb820105397", - "0x1e30c56bee022f2abe59ad31c71408f50f9efe40ea8acfb1d70fdf1a08ee0184", - "0x2b89e9da89b0874cc31a3cd6fb0a4e553f87a6bbdb8a35972e8edb89a0886508", - "0x0b5e94a87ceb92487a14092777d7450923432132e5e60743d93d545c3e222c24", - "0x19f9b63e04f8f9b9db13ff4ec6bfe45ba240d9e58a846bc12901f9ab5f485c52", - "0x1f8758f9f48e2ec5a4735faca99031e4231bfcfa77bb6af1eb93d74cdea277a5", - "0x02d48ed432c38e6bc5ecde0f23bedd637d2fa2d33f7da7db3fdf983c8914cf79", - "0x16315b7456d7e798e47e52ba14580a81264f5fa7b5b3d37c78842e141d453a4f", - "0x0180751fca3500a75eb7d12129157eaa7182c66490c8df49b37a6c305d0f3dd1", - "0x16a1e582b75d5b76f399b9f2ce848d1c376d004eed7e959c59f3eb1ebdd008d5", - "0x2884a16f05b804db32b79057b18b19edf4c8b22457ecce60eb410682d86c90d6", - "0x08684433d6a4a13f108516bb0831e5811dd91f1f231a41c3dc9f83abf0e66773", - "0x14749e7674b6f876fdd69ecf97d2a4baa5201e22682d18b5d23965afd090fa6c", - "0x07f2c1367538f096f685d6edf442e15f8a67d79ec56fe6530a95b01d62854f02", - "0x0eeb98ff7882c1ffd70586ebb308773555ec590e6bdd465057a5a996d4daa87a", - "0x1b2894194730ecc1edff91f255acc56014685b6736d661a980b2d268bc655396", - "0x0c7b647b93606e95c022df04d6a4a79e8f00e2b836f1a05ee1a74071a43f33c1", - "0x0e4516f59108b1011ebcee696358764a213b8f8836f16bdbe71c1d641e8c39f3", - "0x28914d3b73edf246a726a5b6ce5338722f6c84ac771e5e4378659186ce710db0", - "0x2f75b3b7866d7d5a453b7d2cf1ebcda506f0bb011bd19cad50266dc3df51db6f", - "0x2eff1e918c5dbcb21c3151a72114f2820439e74d0017d00a65b904b1c400a517", - "0x0e137e32fcd179f82e3faefdadce4c2cb0925df886e2c73fc46a37eccee0bf90", - "0x0f0af2d7b0aae706e9415f55cbdb2b9586ddba082fcc16f1a98290258d43b1f3", - "0x227b493caa78aca2851e47725bb68439d90570a56d65d1916edb42ee03848783", - "0x0dd2f9a64685667287d4cca63d2e8fabdad94e1cf85bb1eb41fa60b0b4edd219", - "0x2e9d022cfeca2965f2ad84e151f3687fe4dea273b5a0625e8793c805b0b94ac2", - "0x02cf3d5668f2457384a484529eaf3d053b97e9f4dce7a9e69878948d8815e426", - "0x1fd04a2491c31e48a0d0fa6dfbb01403ddc0f5a2d7ec2970e8df0b955bcd0294", - "0x1a4c31d88453e55b0345f52d72f2b5abc943ed81b0c0c46a39c8d00bb39eeb40", - "0x03b6832cb504948a10639d9872268968972ee57fe3b27a3a245ed436961262a3", - "0x01eb13f5aea61f8e8a1ed8de6d65d4264cfc7d5b0f5ab0893bed657d2f922140", - "0x110043254d02d2d88a015be470abff8bca54eb63d1927dde0219654411ccef5c", - "0x187265a778824828d2a8886f9d1845035bc8dbcdd753d35cee4da3a81842fa9c", - "0x20907275e3e965c298838d5cd3f87197cf9a2ea28f3b63022791a37c1e85ed9d", - "0x301a37606971342eb6f78b822545eb18cd14e441e65fa998883c9e265a413956", - "0x10a498d5e56fe5a5aec03a10af48ab15074a775e21bccc018cd8aa7f8e970f4a", - "0x1c04f2d7342d5c629efa10dc2e313acdabe4608acb099db46ed00ad2492c2bbd", - "0x01594b8d1744cda3e25079dde8eb005e3fbe55ea3f24342a8708d26468d3a674", - "0x2573dd0a49018bc6f8b34a0de762bb08a76fc87f9d3dc110c3fc03386d36bb9b", - "0x07b45ec71a9e0bede8f012c90fd760f1d8c49f05db8ad38569a56a5836847d7d", - "0x08495ddfe9cdc242d00d8f59b9808cc30ecf6fe28ef2059b486f446df0d4d538", - "0x1ae5693d5f2f091bf47f25963d74c3d5a52fc19b494427e29175f6c247ed1724", - "0x3048dff8a7df49ff6f336e5be6200ac1634bd646f6022b6dccdcdf55a7120d82", - "0x0fc099a8fe8231a28f454443ef3c47200c491d82f3210facc1e344b3d7a1f579", - "0x14cea0b58e260991ddf77addc84c8ce77aba40c6a643034bb49c7b5c26225eae", - "0x097efba0ca26a2a604eabbada8169e40ecb31350bd7c1e1f187c76afe87f2eed", - "0x037414dba81039a73f449354eb4192be45e57216a45a4620660bc058bcfb0e67", - "0x0c3e54c1b8085711ef472c0918dfbc3ac3ea06143add179d35ed6862b4b69a54", - "0x1ac7e1648dbadcca1ba88bdfa7e117cc023b1230f0d8101ecc04d64dae650b72", - "0x12016e9889e791f57bc47fe44eec11d5b4628ee075b88dc91a8d7c46a01ce507", - "0x24462478da14d421bf51d84c36175ea85108cf12c7b247d6c4804358e2336d71", - "0x02136aea7c47ce25b8b90e65e86d3853fb73e6e03e5c836d23a48877f5c06c5f", - "0x2794fecb4c825cd9e0a0826993ad1552203f13a4f6307f01f56b82171028642a", - "0x127e6c0db8753c6e5033525fb9fb9c6e83336569b468b6b2556d988cbb54e89e", - "0x20acefd85f58646eb98a30250a6343d494ae794f458186c40069c63c9adfd075", - "0x0a9aa2349391ae1a9b752f497eed0ee576d182cd887ee17f6edbafe9b4da7c55", - "0x1fcf0d24f8191cc5dd8e4d45ebb5ebf8d642fbd0bb37ac086d9489a58323c689", - "0x0fa95ded5e01ec7a0459d94ed037ad5379120c80a84ca1fc285aedbeb80643c3", - "0x0e626cd999469102fbf8ecb69a798f69dcadd7a0a9bc4959405c5cc8fee7bf3d", - "0x27a209e71c3d082dedc262a7b961abd99e60423df4cde9430ca9dbdee9f886e5", - "0x2e247299161313da43161c82fb1b4983c701d70d7a563594e97ec23763482445", - "0x01e7b13151f3b8eb9696fbb54cc5469a30aea6ab096fb3014fe685216e580e9e", - "0x0a9dac32f7a490ba23e3779e782d401dab1704d533a1a3b4e54063de707ecded", - "0x0a77525751fa11859fd56565a3d3f2b58bd23e349fa202b466830dceac6e0b33", - "0x206621433f4ecbcf05bc5b40fefe576c16c41f19960088e8967415de8ea5c4ea", - "0x2fe6f35469115bb84c4bb6e5487f375c8d1d59a436488a6b28fe206659b79150", - "0x2c83f88fff98059ad0b2ea7dd29a27e34261764f2f77a17f28134da4971d6b20", - "0x2ce721bc1393b19079881bf8f0c82c4bd3fabff9f24767c9bb174f8c822070fd", - "0x2c19b13aae11301818b6d0e843d17895f71d0a00f6174b81135404d77a700c43", - "0x0bd00e4d859143bea8e2ad364a5bef239aa7ab4215c2f4979590f7c47047cf6d", - "0x04a509b964f768cdaba1930fab18593ed40f45082f25eb972a52a7a8aa4adf8d", - "0x290957bd79253ff7583fbd6de66ce94e370356480dcc52ce6e65cf20703a476b", - "0x097f124f863ef815143fc704583747470c3acc8e9c1e9cc9e6c5ae6082733798", - "0x1923d0d7acd995d68c73cc9f7e3342e271923b735bb6de5d28742e537a2eff2f" + "0x2542f2992d506e12ef0f8fe9dc62b3a9f70df45faf909200550dd0b7819407ba", + "0x15dc4a1a9e4c3f1eb2b831329ede54c0bb84bfc80836da059340114bb20f57d8", + "0x1a98f13dc2699a9bdacc5ae5fcd9dd508d0bd29dc6d5936474b7854864992d12", + "0x19b89ad7d1ee8edf7cfa0664f0f300ed9b871824113007694b91f344321d3de1", + "0x2ab129e761bcf9caeda4346b5390cace660a21d1530d16dc4463bc05c0136bef", + "0x1d16b953bb4223322f6e1e6b290fc9d110e8bde329f9bb77075aaa9f1eafc7a8", + "0x2ff1224a3d41d05e9f2b9ed1e08df230e729208c1c8014e204d6723f8702c1fe", + "0x23af59b0930dd26505964d86b5b9603779f55e21512cf2c5b5bbf73804ad029d", + "0x27808e83dcaa2506507050ea2d38bdf163b180f01ff156ee4785822b90dfbea5", + "0x0e4d52e03c853b2cc548d9e0d49657394f4abc367c2c44ac0f1bf191385f6309", + "0x0d8d44133535778fb79c6cc8f3f5fd39cdbf2a0d725b7b1e722c70985eaeffab", + "0x1e0c3307bdf5f33a9488d241ac6fc58b25ca1d6717a21f17b6fb65688b726c2f", + "0x13a7985894e7b2c68919bea8ff3bde79f9512ab813a5e5794c87d33983d4b677", + "0x056deab53a7763b751eee43da6cbbc4187133002770e605df8998cb8d0c53bcf", + "0x0d691ec99aa93d04440524d2fd16e2097cf011034eb5005df403f2b1fcfcbdd4", + "0x031d01a98b79c169deebb5f3f0cd0c2cbc835920c07c3d9c74d2536142f4419a", + "0x17f64a1cc517ccd5c9271020bb7aa598835d129e3de23f3b07f16e5814cfe3c7", + "0x18b25d76ee3db7f70ee2f728c81b4a1c19bc71e5b3e3c50519c3f2d72680558b", + "0x259c5bb26f3e16bbc8e6226deb1afcacd6afff8b88f294c35edc38acc92fd2d9", + "0x266abd6bb752275dbf7c50db051c3263ddcc7fbb01875093bb74127575f9145e", + "0x2a5de2975bf32b7085ffb7c9bff08643950cad0328b8e7b608113550b5e604fa", + "0x056fbeeeb5a8322b51ab3012407a1dd2badd10f075daed861bbc1d9e7c8ed8e5", + "0x02869f97cab06b77299a592f70938dcf1a3281c818a56d15fb16f32c1fbf1cf4", + "0x0de79e96fbf768497877d90f5b1218f2eb276c1cc6d20b72caf5233869a6a141", + "0x24020b9ca12300e9dd8c30973769c932e2fa68aacfaccd9e07ae6f095a438599", + "0x173413a0605f5e04712e4d35c6d3cf0c9f71ec395808715737f0fbaa8ef3b964", + "0x27003c4fc15015cced89ddc4e6c52cd3a6618ebc7d43bbeb5abdff3877f82fdf", + "0x18d85a0a76a9d60e448cb7109cb783c76baf368fde35b8b3ac832790f04c984c", + "0x0842de1090525272f7075e0acf39aac06250bb5ed869aea55f258a9f628d150e", + "0x1b1dda176330cb9442257c0f440f57588b1b7b8ddaa3b7ce9c5a49a222581a42", + "0x12389f610f1966a8940182295263e4e895a4b26f243c1145f0c03252a4d90fa1", + "0x0e378ca610b337bf4651290c316f068ee6b2f400807a5a181806dcf3ce4f92f3", + "0x26af8b6bebe1a1382ec59ce4ad6692207864083e49826b0cd88870dbeb926877", + "0x0759e35fd99ae00da70ea8093366fe7bb3de61197be5b88c2395db2c7abaf9da", + "0x0ab9670b94d0b06cdb710a7d5ebf45c73b60feccda0ea729c416dfd043c6ddf2", + "0x25b2f253e1d151108f050c53960f5129a9e814786e3677341fc7f8749b405563", + "0x252a2d34d39bf2f00b866be0c327d85f18540004e5e857a1a3c3e9e5cc0df124", + "0x179c4693322ccf9b0664539d73c537d98da2b5438c2ba3fa23c39dd08ac8dfce", + "0x1503cb1d04a5c6b2968fb76a82600cd627f03b2f59477c709e223a51601c3a5b", + "0x2597582c96a91ecbd29cb204de2273ee3d14068c77f68913e724118d880d8585", + "0x203f46bac2a09e027dc56de3bd798052290459ba2cfcee42aade2c7779a642e8", + "0x0a8e05c58ead2cea70e968907877b1f4da1598ea4c5de7a9f66c9721dea72881", + "0x27988fd7315730880208d338dedda9573959a2a93a0a61afd337911335bfee22", + "0x2fce8116a83e248c31be64f8ec2623659968cc736fb78555d49fb69120ca0522", + "0x28d8855e157458dea1e61a9854a2779d2a442efaa0150c3c2732a83f660d3976", + "0x28ff84917b62a84c6d3dc0c16de2dc7e340cb04615baaf9c89a875096dd5491d", + "0x0d5b95a0b924e27759a5eae65775febb039b4f35a20298c9d258817ab2af8bde", + "0x282959756a8224c297da9456b46ba93dbbd857b388fe84508f07edf5a7719eb7", + "0x2d9d1858ba4419cc9c6ad979576ab51d829c13d281bf084b5f2640da3fc8e222", + "0x15026fa1c1b68694e5e929a28281d8407d31d18425c7347fe37984307da88249", + "0x159bc7a3a37363eb66d16be88378160e34a75707a5bf2aba439e7a1fe050169d", + "0x08ed7aba31debc48451fd97434e16f1a9e16df9da61a0ad53e9e1dd02e3c2065", + "0x01fe6919296e72cc2ceaa75467a94689fac5fe26595800d9a2b1a810ad8996dd", + "0x0ad776da8301a0e499e29e8df087872e578f884997361d9beff004f355d60f16", + "0x24d07f74b67935cc1112725ab139ca297e2af7281a86aed2ea41e3b3c7959904", + "0x12cbcfcc6454fbfc18a85a3b227d8577074ae281d2dd12d7974d3f4ab314405f", + "0x1bf02cfd70c2fd7e2ae910f8c5f3498222d76a663b84f54ce1cfe61be1b55b0f", + "0x03c0627976adf2d07579de88392bae8d36b61cfa978dc0ab0c4a58e4669f7ed7", + "0x18b18530ca1f021825873a676b279c3bf2fc3eb10b8150c6aefab58d2473f017", + "0x1013fec149896a43be3ff191f80a06290305ec2188748231088c2d935233ca25", + "0x2b89f5be6eba9c57095970360676a7d68ae08e2bd21793fd6826121c1ff16ee0", + "0x02cb71be5485b5e967ba3c68405ed637fc14e8004911659c518a566f119000e9", + "0x0f775f7e515eb52c8d4ac1eb31270582cd1a9f765d64eaa9001d99a81cff792b", + "0x12535f52e6b0788d540ff22161c394303d288bb894fb4f7c11be6c493c69e509", + "0x1b6033dea24a30cee4608d47b1f94c0951e2134bf94ef6497695cb599bb32158", + "0x2fb1342ae5ae45096efd7d22a17126a845b80a5f8abadd19def7e11af5718278", + "0x1c5abbe347dd6b25b2b0216c759eaa29d95b80053c0e5712b9181f6c19ad8312", + "0x0dde51d3892c03e398fbd85155a1e398671b191a7b6e2beeeaa24d4875991a1a", + "0x16396aa97472cf6d9c5dd2dc24840a57cd1fff93acaf58be91e9691aacbecf90", + "0x023354ccd43c876f19ef2c354b7808ccb46008fea59983246cece1fa4298ec9b", + "0x299408c3ee981fa5f97744e27a0c807535eb5ac0bcdf68f43c4e5b14e639c636", + "0x15d6cf26cd4d0a887c7aa0d0c230538e9f7d19511c61c8b398668c1471f46f85", + "0x1f0f66738101dd040298f8d9d512eef53c050fd54e3901f9fc2a0b9525d21a60", + "0x268dc88c19377b2e795701878ce05b16ce6a764dd601daca323bc5fba2af70e6", + "0x2107110b2661d3253e72c2e324268b3fdd0071cdfb59d5fdbe509b29e590113f", + "0x058055d7cb5b3ffca8d3a116c5f842d945af9a38ba03f194109c70b69779e77f", + "0x0d861fb26392acc1853467cc18cb197c3c78eb785bda5aba583f64fbf1ef0d43", + "0x21dcc20a99f0cf80f9a56eeedea5558bbefb3c2378468775466944fd09e89169", + "0x0787a1510f671802b2b9ac5c4866798d566efbdf38b8348db326426a1ab7808b", + "0x10e78a0cf104b2a13dc8952e6e24ea72817040311429d2145220b7e981ea1818", + "0x0c92147ed46f46b207a53f93101f05f62718763c01dc944f6552ba80fe2a6431", + "0x2e7a5bf84263a27da18da56558d203ec5385534de5ee81516c6dfcf960649dea", + "0x12953ab48651385f95e9d12672f5eb929d030da1fdb0ebc3e62783906acd28e8", + "0x0350a9ee3e3aff51266a71891d2ef06d708ffb98ab95c23493f086379907fe45", + "0x21f1cbf48e827bb6fa56049490cae0ffe89afe9bec1344a668b2a01d43e648a0", + "0x142c3af6e017b8b90fa6c01542ade7f52f9b9d8e657185b14627eb18c3c01539" ] - hash = "0x2ed175f456d26b937ba5e9b3eb34af2f2335e31f039c74f966e08b76b399f536" + hash = "0x12fc95142d9b64d06f47211dc8362a877f9d287f2c7ddfb7bf89b37f2bfc6eee" [inputs.start.note_hash_tree] -root = "0x20e1f2bba7e6317997da924c0bcfdb3a2772286d8f2a54afd065ee0c7c9bcbb2" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000c0" +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.start.nullifier_tree] -root = "0x159d5885c8238582e5b683a7672d35a33cfca40296e1800ce05e3c9399b76c65" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000140" +root = "0x085a35f42d569f7aac0404ce29055696f738a6c798a32632d15a8453e59115ff" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" [inputs.start.public_data_tree] -root = "0x09b0026a33b8c5d607e3716682110e5e2f7dc6eace3c4bf9e8dbc51ebfb57333" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000013d" +root = "0x0ff17010ab909b4a0c9581a9c33cf0af93280c6fcd6664cf27270b8762a9e418" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" + +[inputs.start_sponge_blob] +fields = "0x0000000000000000000000000000000000000000000000000000000000000000" +expected_fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.start_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + state = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000090000000000000000" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000000" + squeeze_mode = false [inputs.state_diff_hints] sorted_nullifiers = [ - "0x000000000000000000000000000000000000000000000000000000000000513e", - "0x000000000000000000000000000000000000000000000000000000000000513d", - "0x000000000000000000000000000000000000000000000000000000000000513c", - "0x000000000000000000000000000000000000000000000000000000000000513b", - "0x000000000000000000000000000000000000000000000000000000000000513a", - "0x0000000000000000000000000000000000000000000000000000000000005139", - "0x0000000000000000000000000000000000000000000000000000000000005138", - "0x0000000000000000000000000000000000000000000000000000000000005137", - "0x0000000000000000000000000000000000000000000000000000000000005136", - "0x0000000000000000000000000000000000000000000000000000000000005135", - "0x0000000000000000000000000000000000000000000000000000000000005134", - "0x0000000000000000000000000000000000000000000000000000000000005133", - "0x0000000000000000000000000000000000000000000000000000000000005132", - "0x0000000000000000000000000000000000000000000000000000000000005131", - "0x0000000000000000000000000000000000000000000000000000000000005130", - "0x000000000000000000000000000000000000000000000000000000000000512f", - "0x000000000000000000000000000000000000000000000000000000000000512e", - "0x000000000000000000000000000000000000000000000000000000000000512d", - "0x000000000000000000000000000000000000000000000000000000000000512c", - "0x000000000000000000000000000000000000000000000000000000000000512b", - "0x000000000000000000000000000000000000000000000000000000000000512a", - "0x0000000000000000000000000000000000000000000000000000000000005129", - "0x0000000000000000000000000000000000000000000000000000000000005128", - "0x0000000000000000000000000000000000000000000000000000000000005127", - "0x0000000000000000000000000000000000000000000000000000000000005126", - "0x0000000000000000000000000000000000000000000000000000000000005125", - "0x0000000000000000000000000000000000000000000000000000000000005124", - "0x0000000000000000000000000000000000000000000000000000000000005123", - "0x0000000000000000000000000000000000000000000000000000000000005122", - "0x0000000000000000000000000000000000000000000000000000000000005121", - "0x0000000000000000000000000000000000000000000000000000000000005120", - "0x000000000000000000000000000000000000000000000000000000000000511f", - "0x000000000000000000000000000000000000000000000000000000000000511e", - "0x000000000000000000000000000000000000000000000000000000000000511d", - "0x000000000000000000000000000000000000000000000000000000000000511c", - "0x000000000000000000000000000000000000000000000000000000000000511b", - "0x000000000000000000000000000000000000000000000000000000000000511a", - "0x0000000000000000000000000000000000000000000000000000000000005119", - "0x0000000000000000000000000000000000000000000000000000000000005118", - "0x0000000000000000000000000000000000000000000000000000000000005117", - "0x0000000000000000000000000000000000000000000000000000000000005116", - "0x0000000000000000000000000000000000000000000000000000000000005115", - "0x0000000000000000000000000000000000000000000000000000000000005114", - "0x0000000000000000000000000000000000000000000000000000000000005113", - "0x0000000000000000000000000000000000000000000000000000000000005112", - "0x0000000000000000000000000000000000000000000000000000000000005111", - "0x0000000000000000000000000000000000000000000000000000000000005110", - "0x000000000000000000000000000000000000000000000000000000000000510f", - "0x000000000000000000000000000000000000000000000000000000000000510e", - "0x000000000000000000000000000000000000000000000000000000000000510d", - "0x000000000000000000000000000000000000000000000000000000000000510c", - "0x000000000000000000000000000000000000000000000000000000000000510b", - "0x000000000000000000000000000000000000000000000000000000000000510a", - "0x0000000000000000000000000000000000000000000000000000000000005109", - "0x0000000000000000000000000000000000000000000000000000000000005108", - "0x0000000000000000000000000000000000000000000000000000000000005107", - "0x0000000000000000000000000000000000000000000000000000000000005106", - "0x0000000000000000000000000000000000000000000000000000000000005105", - "0x0000000000000000000000000000000000000000000000000000000000005104", - "0x0000000000000000000000000000000000000000000000000000000000005103", - "0x0000000000000000000000000000000000000000000000000000000000005102", - "0x0000000000000000000000000000000000000000000000000000000000005101", - "0x0000000000000000000000000000000000000000000000000000000000005100", - "0x0000000000000000000000000000000000000000000000000000000000004001" + "0x1f402bc61864bc9d78571eb2ff08bd21be788986bfc07e9e7865cbe3dd0a905b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] sorted_nullifier_indexes = [ - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000" + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f" ] note_hash_subtree_sibling_path = [ - "0x061e11d02e3550e29238439cacdb82c27beee5eec43929e4987fd83a39c4ce44", - "0x0e71e8a494825c90357dbac85bbebae6b94db0640ab3bc2a9d3b064b8cf26fa4", - "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x0af87d98c040dfadabf7ef27165e88560ef39d0c923b6534466a98f672ed8c88", + "0x246218a1d11c91124c20e3394600ad16e5036e2b84aa6afcc8cf3422fd29b02c", + "0x1196b37a9f45bda9848dd661f2df18622a6b4efed01b1cb9eae812f3bf0bc0de", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -9763,11 +9789,11 @@ note_hash_subtree_sibling_path = [ "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] nullifier_subtree_sibling_path = [ - "0x273a4bba3dc07b0c20e26cfbf2eada6a796abdb15dac1f1ab7bdf4290d5fa2f9", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x284175b649300569f6b21f2b91371f33bdff291347ab9ba39be9b72999fe49a8", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0a06b6b89781f620b504e94f41d028f37551b3ee799e27e4f53d77e2cc8dfe70", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", @@ -9799,100 +9825,58 @@ nullifier_subtree_sibling_path = [ "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" ] public_data_tree_sibling_paths = [ - [ - "0x1d1b5fcb8f4c564b94f35e15e72a6e4c8892d72ea0016334d20cc7e441b1115c", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1123e6bf8a99adb63e2d09ad3d7ffefafc75e147f70dacda6019e6e141f65950", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x2460d14c4f8b9965beb0bc82c5fc655e175a5782f43381b8a063801d25e49190", - "0x1123e6bf8a99adb63e2d09ad3d7ffefafc75e147f70dacda6019e6e141f65950", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0bb3d8007a9c81e4a77ffbff57279f3aa0d79d8678f1814c30cb171dfda2559c", + "0x23cd912ef92df34fc8cc4a7ac3d8aa97957496a61f242fc5980c532e41d2450f", + "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x2aa283f0f28968b543363d4318ba200eb9e61d8848211a240bc8672e5ced2241", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", + "0x1ca9e278adda9d761bf24db4e548d3c13a9a0bad6808b9cc4c7881a6f7cf812d", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", @@ -9927,2523 +9911,1893 @@ public_data_tree_sibling_paths = [ ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x29437178dd19400b1d351296f6287d369ada410444883ec37ed14feafa4380bc", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0be81ce7ee4445af964969cc342f48d605d7454b804e6797a0846c1f91a6c094", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x0ac2c88af8a1d8bc917a4428418ddf6520fef161c7cafead21caa524bc8dbd6d", - "0x0be81ce7ee4445af964969cc342f48d605d7454b804e6797a0846c1f91a6c094", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x0cb171130de5068c338d0cfa76d8403802ec51ccf5548c0a6ff3867770cd11fc", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x211ce893362609e331f1f5e9872e2c234ae170913c41cdcfbd36cadf93002737", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x2c1206042ce336c5daededd328891a8789beaafbdf994870c6329c6c412b6435", - "0x211ce893362609e331f1f5e9872e2c234ae170913c41cdcfbd36cadf93002737", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x13a76f2dd0b34c8b679c7c1187708528d26316cf481d7337cda6daa1578ed2a6", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x303e9797818b7ef5ea47a46a4324d933d0db1f2528609b29b7b076157ae228ef", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x169b0993ef488c5bef2cf6a5286721e147c0d4fbc9d40cdd540ce9f056f162d9", - "0x303e9797818b7ef5ea47a46a4324d933d0db1f2528609b29b7b076157ae228ef", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x237bff79245af178bd7e1fb1b0baf0aa3047772c7fac7c4176e1c5a53f2d19e7", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x18fdfe8ee2b1402601c8c81caef7c2b411ca3ec00f9dc51ef0e0878d3d9a8767", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x2b9f1d8741a2f381495f650ad7b974719472ab159c43cb0b9c991a60c50f1914", - "0x18fdfe8ee2b1402601c8c81caef7c2b411ca3ec00f9dc51ef0e0878d3d9a8767", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x091526776952e56d80759a8b032c58b7a0da4bc83af6bba9c4a39eaa4f2ec5a2", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1be2681f7e5abf6fa2325436602b75a08d8edb58f2e997f0c62dd422892dc634", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x2a48323545d5b9924ecf7785fb080cf04e5960e9c809435d7f22c3f7bd9e7518", - "0x1be2681f7e5abf6fa2325436602b75a08d8edb58f2e997f0c62dd422892dc634", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x219a9b74ae3253191f010992a225337b61421ccf59e18ba50fc47231e1f21849", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1c8ad17188dca3593dab51e7f5b1cbfbb0daec76efedef3d658a029216f5d643", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x0610d0afc4bc45accc77044885a36566986891a3b86f342980b7040eeaf658b9", - "0x1c8ad17188dca3593dab51e7f5b1cbfbb0daec76efedef3d658a029216f5d643", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x1296f06e83e012789246757365c55e391fc0bb1b7dec490c8a1ff66c904b9dde", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1f77bf61b7d97fd29b91eb1a8c518bb5feb8b1db15d9263183b94dd3d8d9e40a", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x00ab5f38c1feb26640bc419ac7b5780b5eb5275dcf9f57c4642ddfe0427b2654", - "0x1f77bf61b7d97fd29b91eb1a8c518bb5feb8b1db15d9263183b94dd3d8d9e40a", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x25f1d2ddde0097034d911e80b007def97e131008e7b3e64ebcb9b294b7f73b93", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1398acc63f76ef63b3fdcf8f400ee386342463c264cad72e42622573520b929e", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x21263a7ea9621616fde100a2b159127e7810a92afc56746c0f29a416378f3f88", - "0x1398acc63f76ef63b3fdcf8f400ee386342463c264cad72e42622573520b929e", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x19fe25f6811efb27fd120905d387cfefe8a0ca83e6d24dbd50f7efc38ed11382", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1768ac2f21e7c07eda569db25f6e72a4cab717b3de3fdfc7faff01b02db1d9d2", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x0cf00ab74898acc48d7aad37fc9b626c88d06e2f76b42898271804b44ccc0e35", - "0x1768ac2f21e7c07eda569db25f6e72a4cab717b3de3fdfc7faff01b02db1d9d2", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x0f29d440c58ab3ca9fa037bbc4e641e963810374fef331c02c2cca580d810cb6", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x148741ff15b5f9e0684660d02a2125b5f2e80dd1a3af2bbe3a51b37c81b457cb", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x0434024ace59c8eb37a455b75e10bf072b8aa8ee56a0475a70e8d6e22b629755", - "0x148741ff15b5f9e0684660d02a2125b5f2e80dd1a3af2bbe3a51b37c81b457cb", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x0a0b35bb4294fb3b8bd4503c076701e1022089cf1c5b0f937b7871f0c4ccf77e", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x081a14f3d25af91b4c2ad01f5d0b78b181e6eb505571df032924f128ec74da2f", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x2622a5f762c8a99da00e87f88bba5c1860d6c42ba218137594395e40e3155a8c", - "0x081a14f3d25af91b4c2ad01f5d0b78b181e6eb505571df032924f128ec74da2f", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x1fab24e44f0e93578114a43f1b9a4dc33f487d440549b091e8a68752cd314884", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x06ed36cccc731c1cc4a02702db43db98193fc0ee9672a1f3b5ab57ddb85dc7ec", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x04af00433bf360180554afc9a309cf08c7a368e9c6b28e450f7e9f0b5d3e37fe", - "0x06ed36cccc731c1cc4a02702db43db98193fc0ee9672a1f3b5ab57ddb85dc7ec", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x0588b986204803d2c46f75df40cdbc647bbe65addaf532ba266d48c972617f63", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x04db81548405b39904a1b35c5dda58cf50d044e63c085dfb86510a6e2b9cf53b", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x01772caea39e562f328828b534d9b5123e1bff27a3362e5409521b3d23dabd23", - "0x04db81548405b39904a1b35c5dda58cf50d044e63c085dfb86510a6e2b9cf53b", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x2d2ea191e23372b737bb68d8c74b63fa405d1a61977f2381e38b21de7e272e02", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x2ec19e130161cdcd647d7b716df9b28b700e18a86d06ea8cfa4cac374380cb1d", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x0310fa54e482cbf460333c56711e711e3bd7c2f0d395068bee31e38cb745c89d", - "0x2ec19e130161cdcd647d7b716df9b28b700e18a86d06ea8cfa4cac374380cb1d", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -], - [ - "0x16b039b6bbbac8962270902b41c0dee2042f5ead237323b95cd80d8ecddad5ed", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x079d58e747a4e4b7be21753ebeee554be237bc0439898c5900c82266d8fc4a51", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ - "0x1620e4debc1d063ad1a96f381f20992b878cbe33a9175ed86c1d9a6b2c0d55f4", - "0x079d58e747a4e4b7be21753ebeee554be237bc0439898c5900c82266d8fc4a51", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ], [ "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -12486,927 +11840,1014 @@ public_data_tree_sibling_paths = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000" -] -] - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000513e" - next_index = "0x000000000000000000000000000000000000000000000000000000000000017f" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000513d" - next_index = "0x000000000000000000000000000000000000000000000000000000000000017e" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000513c" - next_index = "0x000000000000000000000000000000000000000000000000000000000000017d" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000513b" - next_index = "0x000000000000000000000000000000000000000000000000000000000000017c" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000513a" - next_index = "0x000000000000000000000000000000000000000000000000000000000000017b" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005139" - next_index = "0x000000000000000000000000000000000000000000000000000000000000017a" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005138" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000179" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005137" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000178" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005136" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000177" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005135" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000176" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005134" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000175" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005133" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000174" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005132" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000173" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005131" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000172" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005130" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000171" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000512f" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000170" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000512e" - next_index = "0x000000000000000000000000000000000000000000000000000000000000016f" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000512d" - next_index = "0x000000000000000000000000000000000000000000000000000000000000016e" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000512c" - next_index = "0x000000000000000000000000000000000000000000000000000000000000016d" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000512b" - next_index = "0x000000000000000000000000000000000000000000000000000000000000016c" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000512a" - next_index = "0x000000000000000000000000000000000000000000000000000000000000016b" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005129" - next_index = "0x000000000000000000000000000000000000000000000000000000000000016a" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005128" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000169" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005127" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000168" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005126" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000167" - - [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005125" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000166" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +], + [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] +] [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005124" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000165" + nullifier = "0x1da4d5e505ca0e6d9e745c3dc9a68179e5051b2a4c1e3c1c57dda892cb50c07a" + next_nullifier = "0x229d31a8187ed8bc4771d63979f06412468caacbd5a1373a486cd15a9c107b75" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000103" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005123" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000164" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005122" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000163" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005121" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000162" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005120" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000161" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000511f" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000160" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000511e" - next_index = "0x000000000000000000000000000000000000000000000000000000000000015f" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000511d" - next_index = "0x000000000000000000000000000000000000000000000000000000000000015e" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000511c" - next_index = "0x000000000000000000000000000000000000000000000000000000000000015d" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000511b" - next_index = "0x000000000000000000000000000000000000000000000000000000000000015c" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000511a" - next_index = "0x000000000000000000000000000000000000000000000000000000000000015b" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005119" - next_index = "0x000000000000000000000000000000000000000000000000000000000000015a" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005118" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000159" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005117" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000158" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005116" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000157" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005115" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000156" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005114" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000155" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005113" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000154" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005112" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000153" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005111" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000152" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005110" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000151" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000510f" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000150" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000510e" - next_index = "0x000000000000000000000000000000000000000000000000000000000000014f" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000510d" - next_index = "0x000000000000000000000000000000000000000000000000000000000000014e" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000510c" - next_index = "0x000000000000000000000000000000000000000000000000000000000000014d" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000510b" - next_index = "0x000000000000000000000000000000000000000000000000000000000000014c" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x000000000000000000000000000000000000000000000000000000000000510a" - next_index = "0x000000000000000000000000000000000000000000000000000000000000014b" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005109" - next_index = "0x000000000000000000000000000000000000000000000000000000000000014a" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005108" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000149" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005107" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000148" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005106" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000147" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005105" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000146" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005104" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000145" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005103" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000144" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005102" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000143" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000413e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000005101" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000142" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_preimages]] - nullifier = "0x000000000000000000000000000000000000000000000000000000000000313e" - next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000004100" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000101" + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.nullifier_predecessor_preimages]] + nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_nullifier = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "258" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", + "0x158597305275af15ab29181c87b7ace38630b9cbd269e6abfc2220a9da98a742", + "0x20c5bad6ccbe48150d90032dedfd2fd4dd71ee511cd6cd227127678b228651f1", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x156e9473a6806318d563f77f2b7ad410f0786969fb9804e80f09067deac9aa20", + "0x17fceab5e6d15d0f76dd258329b0369a8c603e977a7b900046d484c9e616cca1", + "0x0424880a586d1288a51e34a5fccc9eff170c3280b8cee33ab0c8f091f2ed02bc", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", @@ -13440,2630 +12881,3131 @@ public_data_tree_sibling_paths = [ ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "319" + leaf_index = "0" sibling_path = [ - "0x053f51ba26cf6a30033a9c5c98b46f94bac78d5b24f62cd9bd0c90363fd3e284", - "0x19cb54d74d20c6320763ea09a96e12c8c541298a23477f93ac3f112d868f85a6", - "0x03605098bb35f7ff254c70bdaa686d0e64052ba45ca75d16534b273d0d57e3e9", - "0x2fedfca0bbd6672320b3bec8de9e5f3dd5e526f710832e6598fbe4f7d8b2db37", - "0x258f153676fd7f22bebc8f928e9cb03bcd7edad770c2c9e41e6c9b41eb01e150", - "0x0ecb56045849b97596c4dbaa860fbf89b177e9c38c02cef4f3d6a91483c3b613", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x137c1fe4935887db14117df4867d21aa35744e22f394a2e664fe259faab2810a", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] - leaf_index = "255" + leaf_index = "0" sibling_path = [ - "0x097faee844bbef42d928090af0aa6e481b6d66809f324ea3d5f2a74140cc8e01", - "0x1ae5f8c12306b0274c4ef7822de3509bcc05de5ac2cdb9b84e22bacc41634870", - "0x08bafc7fa8186fabe8e8d9dfd70480b96a5c630cbd93fa7b1940bedae7ecf755", - "0x1cfc6f72a7f8c7f82d75e3275aa428eb0ffdffcc4192aa68198898d17cc4f4db", - "0x12972ed9b7286059cbed3a947f5c0dacd5851a6a375e577908aca35a9dbb867d", - "0x0f63677562409cb28249a217f4be23d52f9e31d5646f3bbdbf1b328601b14a3a", - "0x1ccd4fa9fed45ae42d899a0403b56edc7280fc3176f008153570d09a3c8bdfca", - "0x2a77ad460b585bb241644e96814d2ea68421a2b229322d8cbd5020ba5381d58c", - "0x0669fbafaef7388d1e769d92658aebd58a02787c580d3206127a053d398f2108", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000503e" - value = "0x0000000000000000000000000000000000000000000000000000000000005048" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006000" - value = "0x000000000000000000000000000000000000000000000000000000000000600a" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006001" - value = "0x000000000000000000000000000000000000000000000000000000000000600b" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006002" - value = "0x000000000000000000000000000000000000000000000000000000000000600c" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006003" - value = "0x000000000000000000000000000000000000000000000000000000000000600d" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006004" - value = "0x000000000000000000000000000000000000000000000000000000000000600e" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006005" - value = "0x000000000000000000000000000000000000000000000000000000000000600f" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006006" - value = "0x0000000000000000000000000000000000000000000000000000000000006010" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006007" - value = "0x0000000000000000000000000000000000000000000000000000000000006011" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006008" - value = "0x0000000000000000000000000000000000000000000000000000000000006012" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006009" - value = "0x0000000000000000000000000000000000000000000000000000000000006013" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000600a" - value = "0x0000000000000000000000000000000000000000000000000000000000006014" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000600b" - value = "0x0000000000000000000000000000000000000000000000000000000000006015" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000600c" - value = "0x0000000000000000000000000000000000000000000000000000000000006016" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + [[inputs.state_diff_hints.nullifier_predecessor_membership_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000600d" - value = "0x0000000000000000000000000000000000000000000000000000000000006017" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + slot = "0x0384c877dba0f9d849d02e07dac0d3105f8e09b0959c5ee77843b8c037b195bc" + value = "0x0000000000000000000000000000000000000000000000000000000000002710" + next_slot = "0x0561cdb9d85d8b3ae33aff890d99288e470e182c3ae05e7c9be17a6951dfc6bc" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000093" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000600e" - value = "0x0000000000000000000000000000000000000000000000000000000000006018" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + slot = "0x0a2bb0623b5676e4f6c3a348d5216f7399df6f70bc39b6215fc25c61b6a298cc" + value = "0x000000000000000000000000000000000000000000000000000000000000dead" + next_slot = "0x1235e8f0d07907deb94ddae02ffc6d866dad7bf5e772f11daae670de97e9e7ec" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000092" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000600f" - value = "0x0000000000000000000000000000000000000000000000000000000000006019" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006010" - value = "0x000000000000000000000000000000000000000000000000000000000000601a" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006011" - value = "0x000000000000000000000000000000000000000000000000000000000000601b" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006012" - value = "0x000000000000000000000000000000000000000000000000000000000000601c" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006013" - value = "0x000000000000000000000000000000000000000000000000000000000000601d" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006014" - value = "0x000000000000000000000000000000000000000000000000000000000000601e" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006015" - value = "0x000000000000000000000000000000000000000000000000000000000000601f" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006016" - value = "0x0000000000000000000000000000000000000000000000000000000000006020" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006017" - value = "0x0000000000000000000000000000000000000000000000000000000000006021" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006018" - value = "0x0000000000000000000000000000000000000000000000000000000000006022" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006019" - value = "0x0000000000000000000000000000000000000000000000000000000000006023" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000601a" - value = "0x0000000000000000000000000000000000000000000000000000000000006024" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000601b" - value = "0x0000000000000000000000000000000000000000000000000000000000006025" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000601c" - value = "0x0000000000000000000000000000000000000000000000000000000000006026" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000601d" - value = "0x0000000000000000000000000000000000000000000000000000000000006027" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000601e" - value = "0x0000000000000000000000000000000000000000000000000000000000006028" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000601f" - value = "0x0000000000000000000000000000000000000000000000000000000000006029" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006020" - value = "0x000000000000000000000000000000000000000000000000000000000000602a" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006021" - value = "0x000000000000000000000000000000000000000000000000000000000000602b" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006022" - value = "0x000000000000000000000000000000000000000000000000000000000000602c" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006023" - value = "0x000000000000000000000000000000000000000000000000000000000000602d" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006024" - value = "0x000000000000000000000000000000000000000000000000000000000000602e" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006025" - value = "0x000000000000000000000000000000000000000000000000000000000000602f" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006026" - value = "0x0000000000000000000000000000000000000000000000000000000000006030" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006027" - value = "0x0000000000000000000000000000000000000000000000000000000000006031" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006028" - value = "0x0000000000000000000000000000000000000000000000000000000000006032" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006029" - value = "0x0000000000000000000000000000000000000000000000000000000000006033" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000602a" - value = "0x0000000000000000000000000000000000000000000000000000000000006034" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000602b" - value = "0x0000000000000000000000000000000000000000000000000000000000006035" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000602c" - value = "0x0000000000000000000000000000000000000000000000000000000000006036" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000602d" - value = "0x0000000000000000000000000000000000000000000000000000000000006037" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000602e" - value = "0x0000000000000000000000000000000000000000000000000000000000006038" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000602f" - value = "0x0000000000000000000000000000000000000000000000000000000000006039" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006030" - value = "0x000000000000000000000000000000000000000000000000000000000000603a" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006031" - value = "0x000000000000000000000000000000000000000000000000000000000000603b" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006032" - value = "0x000000000000000000000000000000000000000000000000000000000000603c" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006033" - value = "0x000000000000000000000000000000000000000000000000000000000000603d" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006034" - value = "0x000000000000000000000000000000000000000000000000000000000000603e" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006035" - value = "0x000000000000000000000000000000000000000000000000000000000000603f" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006036" - value = "0x0000000000000000000000000000000000000000000000000000000000006040" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006037" - value = "0x0000000000000000000000000000000000000000000000000000000000006041" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006038" - value = "0x0000000000000000000000000000000000000000000000000000000000006042" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x0000000000000000000000000000000000000000000000000000000000006039" - value = "0x0000000000000000000000000000000000000000000000000000000000006043" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000603a" - value = "0x0000000000000000000000000000000000000000000000000000000000006044" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000603b" - value = "0x0000000000000000000000000000000000000000000000000000000000006045" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000603c" - value = "0x0000000000000000000000000000000000000000000000000000000000006046" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_preimages]] - slot = "0x000000000000000000000000000000000000000000000000000000000000603d" - value = "0x0000000000000000000000000000000000000000000000000000000000006047" + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" @@ -16073,423 +16015,102 @@ public_data_tree_sibling_paths = [ next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "316" - sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] - - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "317" - sibling_path = [ - "0x1d1b5fcb8f4c564b94f35e15e72a6e4c8892d72ea0016334d20cc7e441b1115c", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] - - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "318" - sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1123e6bf8a99adb63e2d09ad3d7ffefafc75e147f70dacda6019e6e141f65950", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] - - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "319" - sibling_path = [ - "0x2460d14c4f8b9965beb0bc82c5fc655e175a5782f43381b8a063801d25e49190", - "0x1123e6bf8a99adb63e2d09ad3d7ffefafc75e147f70dacda6019e6e141f65950", - "0x1b7f70c8f189849095802c4f22affc3bb41b1d7029612fb23185bfaf7b7365ea", - "0x07e2e73a12bd2d045ad04b52b68c3178d649a03c1e358383c7bc0aed562fb7f9", - "0x1db193f4674399a029ff7427b5427523234bccf9e0b14b0890aa03558f89b944", - "0x12eb759c633f4b0e7722968be9b2db34a0f38c9089a5d8da81e6334cfc1a86bf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] - - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "320" - sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "321" - sibling_path = [ - "0x29437178dd19400b1d351296f6287d369ada410444883ec37ed14feafa4380bc", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "322" - sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0be81ce7ee4445af964969cc342f48d605d7454b804e6797a0846c1f91a6c094", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "323" - sibling_path = [ - "0x0ac2c88af8a1d8bc917a4428418ddf6520fef161c7cafead21caa524bc8dbd6d", - "0x0be81ce7ee4445af964969cc342f48d605d7454b804e6797a0846c1f91a6c094", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" - [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "324" - sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" -] + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.state_diff_hints.low_public_data_writes_preimages]] + slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" + next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "325" + leaf_index = "136" sibling_path = [ - "0x0cb171130de5068c338d0cfa76d8403802ec51ccf5548c0a6ff3867770cd11fc", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x1f44507bda987b03d4828bbeea80b3db6c5260b16befa7ea02a8e791d16edcb2", + "0x1cddbb72a31abd2933738763e7698ca38d44d44b6e4cc83e62b060f887d914f3", + "0x287643c15a8e932b1785e4716de672f715332d1b9501b839614a21e93027b2d2", + "0x1a9d534731724e33cd91247aaa1e2cfa7fd1262ecc547b362c9017dd511a9da0", + "0x2316385064e32aff8da30a269857d01aeaa14d6a45b61bd144c5d7a357e81304", "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x1ca9e278adda9d761bf24db4e548d3c13a9a0bad6808b9cc4c7881a6f7cf812d", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", @@ -16524,17 +16145,17 @@ public_data_tree_sibling_paths = [ ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "326" + leaf_index = "132" sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x211ce893362609e331f1f5e9872e2c234ae170913c41cdcfbd36cadf93002737", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x183de73645b7162deaebf8b8448f694111b0f42ca72ae55de7887b12059fecfd", + "0x0be0821d05398e17224d93ea78ef03d123a58ba3900dae4e910ebfd245335938", + "0x08b82ce2fd75b88f3d00322d30db153f55d22b9ab764c80fa43edbec6441a15f", + "0x01bf9864040632b1050345bf85d0adf9ab3168bc1ea8a5dc506c9aa6e8a0e665", + "0x2316385064e32aff8da30a269857d01aeaa14d6a45b61bd144c5d7a357e81304", "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x1ca9e278adda9d761bf24db4e548d3c13a9a0bad6808b9cc4c7881a6f7cf812d", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", @@ -16569,2343 +16190,2613 @@ public_data_tree_sibling_paths = [ ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "327" + leaf_index = "0" sibling_path = [ - "0x2c1206042ce336c5daededd328891a8789beaafbdf994870c6329c6c412b6435", - "0x211ce893362609e331f1f5e9872e2c234ae170913c41cdcfbd36cadf93002737", - "0x055f97211efa670c0658b15e4634bd294c9d51c451a2f5a2038c9f2af6b07f4a", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "328" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "329" + leaf_index = "0" sibling_path = [ - "0x13a76f2dd0b34c8b679c7c1187708528d26316cf481d7337cda6daa1578ed2a6", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "330" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x303e9797818b7ef5ea47a46a4324d933d0db1f2528609b29b7b076157ae228ef", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "331" + leaf_index = "0" sibling_path = [ - "0x169b0993ef488c5bef2cf6a5286721e147c0d4fbc9d40cdd540ce9f056f162d9", - "0x303e9797818b7ef5ea47a46a4324d933d0db1f2528609b29b7b076157ae228ef", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "332" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "333" + leaf_index = "0" sibling_path = [ - "0x237bff79245af178bd7e1fb1b0baf0aa3047772c7fac7c4176e1c5a53f2d19e7", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "334" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x18fdfe8ee2b1402601c8c81caef7c2b411ca3ec00f9dc51ef0e0878d3d9a8767", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "335" + leaf_index = "0" sibling_path = [ - "0x2b9f1d8741a2f381495f650ad7b974719472ab159c43cb0b9c991a60c50f1914", - "0x18fdfe8ee2b1402601c8c81caef7c2b411ca3ec00f9dc51ef0e0878d3d9a8767", - "0x1e709e954bb6b11bb741ea292892d6e9e967dfe13cd810170d4efbf9f5e8b0fc", - "0x1673b111026998ffb21116e397a89f4ffd0f91d994e49de94991e4a87d9882d5", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "336" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "337" + leaf_index = "0" sibling_path = [ - "0x091526776952e56d80759a8b032c58b7a0da4bc83af6bba9c4a39eaa4f2ec5a2", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "338" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1be2681f7e5abf6fa2325436602b75a08d8edb58f2e997f0c62dd422892dc634", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "339" + leaf_index = "0" sibling_path = [ - "0x2a48323545d5b9924ecf7785fb080cf04e5960e9c809435d7f22c3f7bd9e7518", - "0x1be2681f7e5abf6fa2325436602b75a08d8edb58f2e997f0c62dd422892dc634", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "340" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "341" + leaf_index = "0" sibling_path = [ - "0x219a9b74ae3253191f010992a225337b61421ccf59e18ba50fc47231e1f21849", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "342" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1c8ad17188dca3593dab51e7f5b1cbfbb0daec76efedef3d658a029216f5d643", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "343" + leaf_index = "0" sibling_path = [ - "0x0610d0afc4bc45accc77044885a36566986891a3b86f342980b7040eeaf658b9", - "0x1c8ad17188dca3593dab51e7f5b1cbfbb0daec76efedef3d658a029216f5d643", - "0x08c77e67ed451fbff9f9bd2aa39af0e0eb4013f4d64a3a3eed8eab8286c2fcb2", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "344" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "345" + leaf_index = "0" sibling_path = [ - "0x1296f06e83e012789246757365c55e391fc0bb1b7dec490c8a1ff66c904b9dde", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "346" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1f77bf61b7d97fd29b91eb1a8c518bb5feb8b1db15d9263183b94dd3d8d9e40a", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "347" + leaf_index = "0" sibling_path = [ - "0x00ab5f38c1feb26640bc419ac7b5780b5eb5275dcf9f57c4642ddfe0427b2654", - "0x1f77bf61b7d97fd29b91eb1a8c518bb5feb8b1db15d9263183b94dd3d8d9e40a", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "348" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "349" + leaf_index = "0" sibling_path = [ - "0x25f1d2ddde0097034d911e80b007def97e131008e7b3e64ebcb9b294b7f73b93", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "350" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1398acc63f76ef63b3fdcf8f400ee386342463c264cad72e42622573520b929e", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "351" + leaf_index = "0" sibling_path = [ - "0x21263a7ea9621616fde100a2b159127e7810a92afc56746c0f29a416378f3f88", - "0x1398acc63f76ef63b3fdcf8f400ee386342463c264cad72e42622573520b929e", - "0x1f3d88e77d76037377230339555693a486bb02d2e1443e516ed1d046db7fc441", - "0x2b619aaa07ffb112e652e56b726de16cbcf2ecd075be92c15850256480afec78", - "0x07bbccc6d1e358389b0a7bafb37cc172a4f74b6916ca967ffadca11d8765f9db", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "352" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "353" + leaf_index = "0" sibling_path = [ - "0x19fe25f6811efb27fd120905d387cfefe8a0ca83e6d24dbd50f7efc38ed11382", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "354" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x1768ac2f21e7c07eda569db25f6e72a4cab717b3de3fdfc7faff01b02db1d9d2", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "355" + leaf_index = "0" sibling_path = [ - "0x0cf00ab74898acc48d7aad37fc9b626c88d06e2f76b42898271804b44ccc0e35", - "0x1768ac2f21e7c07eda569db25f6e72a4cab717b3de3fdfc7faff01b02db1d9d2", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "356" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "357" + leaf_index = "0" sibling_path = [ - "0x0f29d440c58ab3ca9fa037bbc4e641e963810374fef331c02c2cca580d810cb6", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "358" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x148741ff15b5f9e0684660d02a2125b5f2e80dd1a3af2bbe3a51b37c81b457cb", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "359" + leaf_index = "0" sibling_path = [ - "0x0434024ace59c8eb37a455b75e10bf072b8aa8ee56a0475a70e8d6e22b629755", - "0x148741ff15b5f9e0684660d02a2125b5f2e80dd1a3af2bbe3a51b37c81b457cb", - "0x0fdbe9dbd3209bb3cd1aaa6ce7f71efbebe189898884f33c9673f576a48ba021", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "360" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "361" + leaf_index = "0" sibling_path = [ - "0x0a0b35bb4294fb3b8bd4503c076701e1022089cf1c5b0f937b7871f0c4ccf77e", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "362" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x081a14f3d25af91b4c2ad01f5d0b78b181e6eb505571df032924f128ec74da2f", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "363" + leaf_index = "0" sibling_path = [ - "0x2622a5f762c8a99da00e87f88bba5c1860d6c42ba218137594395e40e3155a8c", - "0x081a14f3d25af91b4c2ad01f5d0b78b181e6eb505571df032924f128ec74da2f", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "364" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "365" + leaf_index = "0" sibling_path = [ - "0x1fab24e44f0e93578114a43f1b9a4dc33f487d440549b091e8a68752cd314884", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "366" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x06ed36cccc731c1cc4a02702db43db98193fc0ee9672a1f3b5ab57ddb85dc7ec", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "367" + leaf_index = "0" sibling_path = [ - "0x04af00433bf360180554afc9a309cf08c7a368e9c6b28e450f7e9f0b5d3e37fe", - "0x06ed36cccc731c1cc4a02702db43db98193fc0ee9672a1f3b5ab57ddb85dc7ec", - "0x12c794e31d5dcce02fe6cdc1e6817b05cbf9da56f9f0d24ac9003f612cc7fe69", - "0x17124eb5da60c338bede565fa34b37906305d5dc4b9f8647576097befd65e7a6", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "368" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "369" + leaf_index = "0" sibling_path = [ - "0x0588b986204803d2c46f75df40cdbc647bbe65addaf532ba266d48c972617f63", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "370" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x04db81548405b39904a1b35c5dda58cf50d044e63c085dfb86510a6e2b9cf53b", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "371" + leaf_index = "0" sibling_path = [ - "0x01772caea39e562f328828b534d9b5123e1bff27a3362e5409521b3d23dabd23", - "0x04db81548405b39904a1b35c5dda58cf50d044e63c085dfb86510a6e2b9cf53b", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "372" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "373" + leaf_index = "0" sibling_path = [ - "0x2d2ea191e23372b737bb68d8c74b63fa405d1a61977f2381e38b21de7e272e02", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "374" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x2ec19e130161cdcd647d7b716df9b28b700e18a86d06ea8cfa4cac374380cb1d", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "375" + leaf_index = "0" sibling_path = [ - "0x0310fa54e482cbf460333c56711e711e3bd7c2f0d395068bee31e38cb745c89d", - "0x2ec19e130161cdcd647d7b716df9b28b700e18a86d06ea8cfa4cac374380cb1d", - "0x21f7f90ba6cb42dc3528e4b9c5d32c1202d4477dfa1085813f9c72080da61e40", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "376" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "377" + leaf_index = "0" sibling_path = [ - "0x16b039b6bbbac8962270902b41c0dee2042f5ead237323b95cd80d8ecddad5ed", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] - leaf_index = "378" + leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x079d58e747a4e4b7be21753ebeee554be237bc0439898c5900c82266d8fc4a51", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x10e055133642279346db3024d962192cb4a9cfea46f21983191763ec1460dd5d", - "0x15a0102b2de35b233f757a9a648602d16f934fb2ac892c3e284ade430762cc74", - "0x01904e3446407d287165d0f844f70cff532575e4431ae5e2874744ef7f829b9e", - "0x20051444e516c6890bda0b199e02b4d78da09ec9dfabe105ffbde7357566c7aa", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x1789a5c36d270ef0267ca5cd57aeb1e9598ae219178f497c9a202be8794c2727", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] [[inputs.state_diff_hints.low_public_data_writes_witnesses]] @@ -18953,70 +18844,97 @@ public_data_tree_sibling_paths = [ "0x0000000000000000000000000000000000000000000000000000000000000000" ] -[inputs.archive_root_membership_witness] -leaf_index = "0" -sibling_path = [ + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" ] -[inputs.constants] -vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" - - [inputs.constants.last_archive] - root = "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000001" - - [inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000001" - - [inputs.constants.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.constants.global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.constants.global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.fee_payer_fee_juice_balance_read_hint] -leaf_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" -value = "0x0000000000000000000000000000000000000000000000000000000000000000" + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] + leaf_index = "0" + sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] - [inputs.fee_payer_fee_juice_balance_read_hint.membership_witness] + [[inputs.state_diff_hints.low_public_data_writes_witnesses]] leaf_index = "0" sibling_path = [ "0x0000000000000000000000000000000000000000000000000000000000000000", @@ -19061,8 +18979,61 @@ value = "0x0000000000000000000000000000000000000000000000000000000000000000" "0x0000000000000000000000000000000000000000000000000000000000000000" ] - [inputs.fee_payer_fee_juice_balance_read_hint.leaf_preimage] - slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_slot = "0x0000000000000000000000000000000000000000000000000000000000000000" - next_index = "0x0000000000000000000000000000000000000000000000000000000000000000" +[inputs.archive_root_membership_witness] +leaf_index = "6" +sibling_path = [ + "0x022087729c552378b2572eb9be555e7dff2161a22e9a1d5e175d3558163a615b", + "0x1392eef60465b19ad485b6de40faf2db67a3ba33bd6ab3db4229493361f1371b", + "0x2ec2b3b3c692503758a443640b3e5f20a818cd7b7d339956c2d923c9d02622cb", + "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" +] + +[inputs.constants] +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" + + [inputs.constants.last_archive] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [inputs.constants.global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" + + [inputs.constants.global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.constants.global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.constants.global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-merge/Prover.toml b/noir-projects/noir-protocol-circuits/crates/rollup-block-merge/Prover.toml new file mode 100644 index 00000000000..ad739d8ea2a --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-block-merge/Prover.toml @@ -0,0 +1,6603 @@ +[[inputs.previous_rollup_data]] +[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] +previous_block_hash = "0x022087729c552378b2572eb9be555e7dff2161a22e9a1d5e175d3558163a615b" +end_block_hash = "0x002618b2ab9d69c78576160e237eab9c7b0e42bea8e433224af2abb5aa0ea51f" +out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" +prover_id = "0x0000000000000000000000000000000000000000000000000000000000000051" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x05620cfa3125101fc126dcb1cd967ae0cda5bfbb0c413bb1ad570ede664953cf" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x1965375f1fcd10c386e8da3da65bf4", + "0xb17c73370563522d2debdb7994b039", + "0x17f0" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x00aae0654b3ba2a2f1e2fa2c7d23b35ab21cfba67951dcf917925cc2325eb866", + "0x0000000000000000000000000000001eea78b1856d5770ee11f410332f1be2af" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[inputs.previous_rollup_data.proof] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + +[inputs.previous_rollup_data.vk] +key = [ + "0x0000000000000000000000000000000000000000000000000000000000800000", + "0x00000000000000000000000000000000000000000000000000000000000003ec", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x00000000000000000000000000000000000000000000000000000000000003dc", + "0x00000000000000000000000000000000000000000000000000000000000003dd", + "0x00000000000000000000000000000000000000000000000000000000000003de", + "0x00000000000000000000000000000000000000000000000000000000000003df", + "0x00000000000000000000000000000000000000000000000000000000000003e0", + "0x00000000000000000000000000000000000000000000000000000000000003e1", + "0x00000000000000000000000000000000000000000000000000000000000003e2", + "0x00000000000000000000000000000000000000000000000000000000000003e3", + "0x00000000000000000000000000000000000000000000000000000000000003e4", + "0x00000000000000000000000000000000000000000000000000000000000003e5", + "0x00000000000000000000000000000000000000000000000000000000000003e6", + "0x00000000000000000000000000000000000000000000000000000000000003e7", + "0x00000000000000000000000000000000000000000000000000000000000003e8", + "0x00000000000000000000000000000000000000000000000000000000000003e9", + "0x00000000000000000000000000000000000000000000000000000000000003ea", + "0x00000000000000000000000000000000000000000000000000000000000003eb", + "0x000000000000000000000000000000e2a70abf2db5a56e3b80b735d8fe93844f", + "0x000000000000000000000000000000000007d5e763ad00e11b46ba2c01874266", + "0x000000000000000000000000000000717f06f4849fabc0eb379038c2787f4f0a", + "0x00000000000000000000000000000000002432b88686a770539feb7073936af2", + "0x000000000000000000000000000000241b31d36d4fa2d3d0b65b60a0b30fbe1f", + "0x00000000000000000000000000000000001647b3c906eea3d9a936ca32d1d2cc", + "0x000000000000000000000000000000bf5b7e0e7905e95b6dd16f1549320f091a", + "0x00000000000000000000000000000000001d761d19f3a363e0dfeb81bb9d7b17", + "0x0000000000000000000000000000002de78f3b7bf60a3dcaef2403e7a480f674", + "0x000000000000000000000000000000000027a6694dc12546d2169a7af214d7d9", + "0x00000000000000000000000000000084e5ac9a2a9c89b7ba303748f68920fd59", + "0x00000000000000000000000000000000001bcb1558f8a5f2a022f5b21bc84c4f", + "0x000000000000000000000000000000cff61694d99e06f2f6cea24184c6faff45", + "0x000000000000000000000000000000000026def465f5e787af29baad942d31c9", + "0x000000000000000000000000000000d22e435b810b60fdb70b693cd4e9b502a4", + "0x00000000000000000000000000000000000021c68681bd4b10fbf975192b50c9", + "0x000000000000000000000000000000de2b147b0aeeb897830ec93888b8df2dfa", + "0x00000000000000000000000000000000000786effde53516b0c48c462f99a595", + "0x0000000000000000000000000000007627848e3f39e8b9eb64ea954d26f14549", + "0x00000000000000000000000000000000002144cf1b643ca17330f7e84cd5a655", + "0x00000000000000000000000000000084c15b6e7545324c008347e91d3c485e2d", + "0x00000000000000000000000000000000002bda8532a1ddbb20ef1d06d16a559c", + "0x000000000000000000000000000000285cd754d96c51c5d82a3e96b49a4703a8", + "0x000000000000000000000000000000000028849510d5ecb9fec5e503a8643a64", + "0x00000000000000000000000000000026d90971e11e22590bd1d23c26c3e60643", + "0x00000000000000000000000000000000000ac0ff4f2e738321956625babc98a2", + "0x000000000000000000000000000000e23e99370dee05182b2a6e288a3f1dbe78", + "0x000000000000000000000000000000000026423ab2c1b6c27161c560409b49b2", + "0x000000000000000000000000000000f12699521992cd11507cc3d857f365bda3", + "0x0000000000000000000000000000000000015a68530ca40650b503a2e93f04e4", + "0x0000000000000000000000000000005e671e550d38f3437820a475d19b334a8d", + "0x00000000000000000000000000000000001c572e9a754b84ff4f93feb3419f94", + "0x00000000000000000000000000000001af74368cb4e6c463f81d68f73147a827", + "0x00000000000000000000000000000000002a166f4d388c12d05337733d06f0d4", + "0x000000000000000000000000000000034a2ffe8bc843f57d8769875413c5f1a1", + "0x00000000000000000000000000000000001ede2a33e28cab3b0b987e1e42b23c", + "0x0000000000000000000000000000003052f5dda64a52abe35257bc568f5a6890", + "0x00000000000000000000000000000000002819569643e54119f9cfe02eed2540", + "0x0000000000000000000000000000009f53577bb68e274ee47b6cbe60d5156e44", + "0x00000000000000000000000000000000000a8a3bb75a45fcb1a20cf8b8ea179e", + "0x0000000000000000000000000000005984c45840392053bafefa6c0381d8f3e7", + "0x00000000000000000000000000000000001c5edf25521f683b0f073678aeba28", + "0x0000000000000000000000000000005a03cab51ad1c2b4d7e0c5692d4761bffa", + "0x000000000000000000000000000000000022381d8ee1f8d2b626b4f24c0c5eab", + "0x000000000000000000000000000000b4d4c6827fb665f5f762bec8b5409feba0", + "0x000000000000000000000000000000000013cbf0363025690914296b298c4a34", + "0x000000000000000000000000000000ce0770aa5228294769532c04a9ed052b7e", + "0x00000000000000000000000000000000001cf2c5ff4797fb3fa2f1f4e44d7fff", + "0x000000000000000000000000000000e1333724197aac54787a168048b74fd8ff", + "0x00000000000000000000000000000000002292de33028268f14f0f45a17d1b1b", + "0x000000000000000000000000000000ac1f66a28d7f48bafac5ba6c9f912a007d", + "0x00000000000000000000000000000000000fc04990a04b4db2e4b6934201b2d4", + "0x00000000000000000000000000000082c892d466f77738a2218d9a84669bcf91", + "0x00000000000000000000000000000000000eb8975fa3133acdefe25319c313a9", + "0x000000000000000000000000000000b85d8e7ef7fd09ef6cf3336fbabc64a0b8", + "0x000000000000000000000000000000000015b5395c80352154ac5b0420929c7b", + "0x0000000000000000000000000000002c89b9bf9c26e42c912d240d995cd305e8", + "0x0000000000000000000000000000000000038a3059e3934a59df7f5e6affdb7c", + "0x000000000000000000000000000000353cc4fe06b285bcf7b0420a2f4808d481", + "0x00000000000000000000000000000000002d9098560c035657987a3f0b03aa9f", + "0x000000000000000000000000000000f55966792a244309f68913edafc1a0e283", + "0x00000000000000000000000000000000002cd001744329f9bb8dcf7f706b64d5", + "0x0000000000000000000000000000002e510b8812fe71e3447efb2a703ecf3bbb", + "0x000000000000000000000000000000000003919d6cd79b6b0d98933eee1deed8", + "0x000000000000000000000000000000deb4123671f3d3a36aaf79bf942110ed26", + "0x0000000000000000000000000000000000092e04fd33c62c5b4cde24ef2bd9af", + "0x00000000000000000000000000000017c72822051e3880df0896d457633bb8a8", + "0x00000000000000000000000000000000001b4155a75c956f0335205bb32bb281", + "0x00000000000000000000000000000001a5624432f3837cffa189dd0901903dd4", + "0x000000000000000000000000000000000010ca437fe4ed9cd31e0d885ee10f49", + "0x000000000000000000000000000000eff4e55e0657194f731217645db19db66f", + "0x00000000000000000000000000000000002207f65676e67cbaae6c720b900062", + "0x000000000000000000000000000000db14f5d3c0c91e328f5e9cdf987b3287a6", + "0x00000000000000000000000000000000000815fd61ec34584686d6a57dfe619c", + "0x000000000000000000000000000000e511dcf88b34b04b43d5ac4b5c26bb226c", + "0x00000000000000000000000000000000000517d7a24181453772a8c1c18776a1", + "0x000000000000000000000000000000a94494c66e149dbd7aa3fddd9cc7b05873", + "0x0000000000000000000000000000000000243021ce1dd076e98f6e6d861a420c", + "0x0000000000000000000000000000000f71ef565bb081d1ebb049515d24264da4", + "0x00000000000000000000000000000000000afeee73f2aa3b02af56407bb6afdb", + "0x0000000000000000000000000000001afcdd7968ded28f10b0cf1107b36f4a44", + "0x00000000000000000000000000000000001e4246ba3dcd63b2b44f091fdd4077", + "0x000000000000000000000000000000453e4d4deaef89712bccd4a9f8486a5b2f", + "0x00000000000000000000000000000000000082ffd3cfc3dfbf1fffe287b1c2f3", + "0x0000000000000000000000000000002288034f3ba3cacc74e8cced5c7cd19155", + "0x00000000000000000000000000000000001910a3dc7e741c76c08252e1f2af7a", + "0x000000000000000000000000000000c4825137303952af837523fdb87c5f1a27", + "0x00000000000000000000000000000000000bf36ee00449ecfdcfcd449edb7be8", + "0x000000000000000000000000000000dc4567b52908f0d9ee79f3430c0773f1d4", + "0x00000000000000000000000000000000000b3d06ca98da125cf7c03671375105", + "0x0000000000000000000000000000004c9d6c653b35a4e41ce0c28b8f3bc05f80", + "0x00000000000000000000000000000000001c6cbebc523077127e76e48715e3f7", + "0x00000000000000000000000000000010e9f0c36c8d13bc65ae5dc83aafea4d93", + "0x00000000000000000000000000000000001e6c3234c3d66e62f619f122abcf08", + "0x0000000000000000000000000000007c90b604558cb0031b2786ccfb4b0f267b", + "0x000000000000000000000000000000000023a5e79143fd2d6f9a5d5de119fe03", + "0x000000000000000000000000000000de49bef47504163f244087cb488de2f99a", + "0x00000000000000000000000000000000002b09a5701c772dea31d0fdb450e27b", + "0x000000000000000000000000000000d42fc4da775de36979dfa33a903f61a055", + "0x000000000000000000000000000000000019af65682cd77e5a6b7c48b6900022", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000006862cdf7072422c5d915238fc5fc77e655", + "0x00000000000000000000000000000000000bcabfcf0533b67a88e1a1a2a14a31", + "0x00000000000000000000000000000091b77708688421f998b7f47d4a4ce9ec51", + "0x0000000000000000000000000000000000146762eab5e705427d962991cfa509" +] +hash = "0x23314c114e2e6d7d1dcc2c42f769b7eaa5a42c83e69cb9539ffbbb897d90363d" + +[inputs.previous_rollup_data.vk_witness] +leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000d" +sibling_path = [ + "0x19c9a76e17167348bb8b76d9d8c5de5df1aeecbb8aba20a1a0432659ca33152b", + "0x03eebb70e90e891dd8280fc233bca53f212597b12b308823c33a3c2c6dc8f28d", + "0x220ebe2ec739267877ea7a9dfdd070c92cc88f558917466660908410bd66dabc", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] + +[[inputs.previous_rollup_data]] +[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] +previous_block_hash = "0x002618b2ab9d69c78576160e237eab9c7b0e42bea8e433224af2abb5aa0ea51f" +end_block_hash = "0x205dc0e6c4055f045d9c226b52b42ccc6062d9ab2702e4e0acbf3209178b1e53" +out_hash = "0x00f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" +prover_id = "0x0000000000000000000000000000000000000000000000000000000000000051" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] + root = "0x0781b1cc32dbe21aba1e27519e765bd44222b52ef464c6b63dfa97b399376c2e" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] + root = "0x176c781186011b45fed098e21264ed31abe491d165380b1490641d5bc1c7ec85" + next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x172d7f736e107938e1bc1e8a4a11b55937b11a6d1bac463f17efe75495db19e5" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x3bb56352d775bd9572666507c876fa", + "0xabf177bc013f733764b4f023e81e66", + "0x19f1" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x00b4b024814b9a355c67327ec0af765ab3871da695c51a4bdfbe3407ab865fe2", + "0x00000000000000000000000000000074b4d39d0d3840c2a1e97f1924f19a4455" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[inputs.previous_rollup_data.proof] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + +[inputs.previous_rollup_data.vk] +key = [ + "0x0000000000000000000000000000000000000000000000000000000000800000", + "0x00000000000000000000000000000000000000000000000000000000000003ec", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x00000000000000000000000000000000000000000000000000000000000003dc", + "0x00000000000000000000000000000000000000000000000000000000000003dd", + "0x00000000000000000000000000000000000000000000000000000000000003de", + "0x00000000000000000000000000000000000000000000000000000000000003df", + "0x00000000000000000000000000000000000000000000000000000000000003e0", + "0x00000000000000000000000000000000000000000000000000000000000003e1", + "0x00000000000000000000000000000000000000000000000000000000000003e2", + "0x00000000000000000000000000000000000000000000000000000000000003e3", + "0x00000000000000000000000000000000000000000000000000000000000003e4", + "0x00000000000000000000000000000000000000000000000000000000000003e5", + "0x00000000000000000000000000000000000000000000000000000000000003e6", + "0x00000000000000000000000000000000000000000000000000000000000003e7", + "0x00000000000000000000000000000000000000000000000000000000000003e8", + "0x00000000000000000000000000000000000000000000000000000000000003e9", + "0x00000000000000000000000000000000000000000000000000000000000003ea", + "0x00000000000000000000000000000000000000000000000000000000000003eb", + "0x000000000000000000000000000000e2a70abf2db5a56e3b80b735d8fe93844f", + "0x000000000000000000000000000000000007d5e763ad00e11b46ba2c01874266", + "0x000000000000000000000000000000717f06f4849fabc0eb379038c2787f4f0a", + "0x00000000000000000000000000000000002432b88686a770539feb7073936af2", + "0x000000000000000000000000000000241b31d36d4fa2d3d0b65b60a0b30fbe1f", + "0x00000000000000000000000000000000001647b3c906eea3d9a936ca32d1d2cc", + "0x000000000000000000000000000000bf5b7e0e7905e95b6dd16f1549320f091a", + "0x00000000000000000000000000000000001d761d19f3a363e0dfeb81bb9d7b17", + "0x0000000000000000000000000000002de78f3b7bf60a3dcaef2403e7a480f674", + "0x000000000000000000000000000000000027a6694dc12546d2169a7af214d7d9", + "0x00000000000000000000000000000084e5ac9a2a9c89b7ba303748f68920fd59", + "0x00000000000000000000000000000000001bcb1558f8a5f2a022f5b21bc84c4f", + "0x000000000000000000000000000000cff61694d99e06f2f6cea24184c6faff45", + "0x000000000000000000000000000000000026def465f5e787af29baad942d31c9", + "0x000000000000000000000000000000d22e435b810b60fdb70b693cd4e9b502a4", + "0x00000000000000000000000000000000000021c68681bd4b10fbf975192b50c9", + "0x000000000000000000000000000000de2b147b0aeeb897830ec93888b8df2dfa", + "0x00000000000000000000000000000000000786effde53516b0c48c462f99a595", + "0x0000000000000000000000000000007627848e3f39e8b9eb64ea954d26f14549", + "0x00000000000000000000000000000000002144cf1b643ca17330f7e84cd5a655", + "0x00000000000000000000000000000084c15b6e7545324c008347e91d3c485e2d", + "0x00000000000000000000000000000000002bda8532a1ddbb20ef1d06d16a559c", + "0x000000000000000000000000000000285cd754d96c51c5d82a3e96b49a4703a8", + "0x000000000000000000000000000000000028849510d5ecb9fec5e503a8643a64", + "0x00000000000000000000000000000026d90971e11e22590bd1d23c26c3e60643", + "0x00000000000000000000000000000000000ac0ff4f2e738321956625babc98a2", + "0x000000000000000000000000000000e23e99370dee05182b2a6e288a3f1dbe78", + "0x000000000000000000000000000000000026423ab2c1b6c27161c560409b49b2", + "0x000000000000000000000000000000f12699521992cd11507cc3d857f365bda3", + "0x0000000000000000000000000000000000015a68530ca40650b503a2e93f04e4", + "0x0000000000000000000000000000005e671e550d38f3437820a475d19b334a8d", + "0x00000000000000000000000000000000001c572e9a754b84ff4f93feb3419f94", + "0x00000000000000000000000000000001af74368cb4e6c463f81d68f73147a827", + "0x00000000000000000000000000000000002a166f4d388c12d05337733d06f0d4", + "0x000000000000000000000000000000034a2ffe8bc843f57d8769875413c5f1a1", + "0x00000000000000000000000000000000001ede2a33e28cab3b0b987e1e42b23c", + "0x0000000000000000000000000000003052f5dda64a52abe35257bc568f5a6890", + "0x00000000000000000000000000000000002819569643e54119f9cfe02eed2540", + "0x0000000000000000000000000000009f53577bb68e274ee47b6cbe60d5156e44", + "0x00000000000000000000000000000000000a8a3bb75a45fcb1a20cf8b8ea179e", + "0x0000000000000000000000000000005984c45840392053bafefa6c0381d8f3e7", + "0x00000000000000000000000000000000001c5edf25521f683b0f073678aeba28", + "0x0000000000000000000000000000005a03cab51ad1c2b4d7e0c5692d4761bffa", + "0x000000000000000000000000000000000022381d8ee1f8d2b626b4f24c0c5eab", + "0x000000000000000000000000000000b4d4c6827fb665f5f762bec8b5409feba0", + "0x000000000000000000000000000000000013cbf0363025690914296b298c4a34", + "0x000000000000000000000000000000ce0770aa5228294769532c04a9ed052b7e", + "0x00000000000000000000000000000000001cf2c5ff4797fb3fa2f1f4e44d7fff", + "0x000000000000000000000000000000e1333724197aac54787a168048b74fd8ff", + "0x00000000000000000000000000000000002292de33028268f14f0f45a17d1b1b", + "0x000000000000000000000000000000ac1f66a28d7f48bafac5ba6c9f912a007d", + "0x00000000000000000000000000000000000fc04990a04b4db2e4b6934201b2d4", + "0x00000000000000000000000000000082c892d466f77738a2218d9a84669bcf91", + "0x00000000000000000000000000000000000eb8975fa3133acdefe25319c313a9", + "0x000000000000000000000000000000b85d8e7ef7fd09ef6cf3336fbabc64a0b8", + "0x000000000000000000000000000000000015b5395c80352154ac5b0420929c7b", + "0x0000000000000000000000000000002c89b9bf9c26e42c912d240d995cd305e8", + "0x0000000000000000000000000000000000038a3059e3934a59df7f5e6affdb7c", + "0x000000000000000000000000000000353cc4fe06b285bcf7b0420a2f4808d481", + "0x00000000000000000000000000000000002d9098560c035657987a3f0b03aa9f", + "0x000000000000000000000000000000f55966792a244309f68913edafc1a0e283", + "0x00000000000000000000000000000000002cd001744329f9bb8dcf7f706b64d5", + "0x0000000000000000000000000000002e510b8812fe71e3447efb2a703ecf3bbb", + "0x000000000000000000000000000000000003919d6cd79b6b0d98933eee1deed8", + "0x000000000000000000000000000000deb4123671f3d3a36aaf79bf942110ed26", + "0x0000000000000000000000000000000000092e04fd33c62c5b4cde24ef2bd9af", + "0x00000000000000000000000000000017c72822051e3880df0896d457633bb8a8", + "0x00000000000000000000000000000000001b4155a75c956f0335205bb32bb281", + "0x00000000000000000000000000000001a5624432f3837cffa189dd0901903dd4", + "0x000000000000000000000000000000000010ca437fe4ed9cd31e0d885ee10f49", + "0x000000000000000000000000000000eff4e55e0657194f731217645db19db66f", + "0x00000000000000000000000000000000002207f65676e67cbaae6c720b900062", + "0x000000000000000000000000000000db14f5d3c0c91e328f5e9cdf987b3287a6", + "0x00000000000000000000000000000000000815fd61ec34584686d6a57dfe619c", + "0x000000000000000000000000000000e511dcf88b34b04b43d5ac4b5c26bb226c", + "0x00000000000000000000000000000000000517d7a24181453772a8c1c18776a1", + "0x000000000000000000000000000000a94494c66e149dbd7aa3fddd9cc7b05873", + "0x0000000000000000000000000000000000243021ce1dd076e98f6e6d861a420c", + "0x0000000000000000000000000000000f71ef565bb081d1ebb049515d24264da4", + "0x00000000000000000000000000000000000afeee73f2aa3b02af56407bb6afdb", + "0x0000000000000000000000000000001afcdd7968ded28f10b0cf1107b36f4a44", + "0x00000000000000000000000000000000001e4246ba3dcd63b2b44f091fdd4077", + "0x000000000000000000000000000000453e4d4deaef89712bccd4a9f8486a5b2f", + "0x00000000000000000000000000000000000082ffd3cfc3dfbf1fffe287b1c2f3", + "0x0000000000000000000000000000002288034f3ba3cacc74e8cced5c7cd19155", + "0x00000000000000000000000000000000001910a3dc7e741c76c08252e1f2af7a", + "0x000000000000000000000000000000c4825137303952af837523fdb87c5f1a27", + "0x00000000000000000000000000000000000bf36ee00449ecfdcfcd449edb7be8", + "0x000000000000000000000000000000dc4567b52908f0d9ee79f3430c0773f1d4", + "0x00000000000000000000000000000000000b3d06ca98da125cf7c03671375105", + "0x0000000000000000000000000000004c9d6c653b35a4e41ce0c28b8f3bc05f80", + "0x00000000000000000000000000000000001c6cbebc523077127e76e48715e3f7", + "0x00000000000000000000000000000010e9f0c36c8d13bc65ae5dc83aafea4d93", + "0x00000000000000000000000000000000001e6c3234c3d66e62f619f122abcf08", + "0x0000000000000000000000000000007c90b604558cb0031b2786ccfb4b0f267b", + "0x000000000000000000000000000000000023a5e79143fd2d6f9a5d5de119fe03", + "0x000000000000000000000000000000de49bef47504163f244087cb488de2f99a", + "0x00000000000000000000000000000000002b09a5701c772dea31d0fdb450e27b", + "0x000000000000000000000000000000d42fc4da775de36979dfa33a903f61a055", + "0x000000000000000000000000000000000019af65682cd77e5a6b7c48b6900022", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000006862cdf7072422c5d915238fc5fc77e655", + "0x00000000000000000000000000000000000bcabfcf0533b67a88e1a1a2a14a31", + "0x00000000000000000000000000000091b77708688421f998b7f47d4a4ce9ec51", + "0x0000000000000000000000000000000000146762eab5e705427d962991cfa509" +] +hash = "0x23314c114e2e6d7d1dcc2c42f769b7eaa5a42c83e69cb9539ffbbb897d90363d" + +[inputs.previous_rollup_data.vk_witness] +leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000d" +sibling_path = [ + "0x19c9a76e17167348bb8b76d9d8c5de5df1aeecbb8aba20a1a0432659ca33152b", + "0x03eebb70e90e891dd8280fc233bca53f212597b12b308823c33a3c2c6dc8f28d", + "0x220ebe2ec739267877ea7a9dfdd070c92cc88f558917466660908410bd66dabc", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-merge/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/rollup-block-merge/SampleInputs.toml deleted file mode 100644 index 285267a8e38..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/rollup-block-merge/SampleInputs.toml +++ /dev/null @@ -1,1707 +0,0 @@ -[[inputs.previous_rollup_data]] -[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] -previous_block_hash = "0x2da55666630fdf8594065c377958c827dc1c130dac91f17c6699b53dce60ef75" -end_block_hash = "0x13db18dc5427c36310f293dca4c57a04be287647aa444ea50166c23d9abb5a33" -out_hash = "0x00b6402f400b99c26de447b159b71e8a941598e64255b3b0fd64036441753efa" -vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" -prover_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] - root = "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000001" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] - root = "0x238ebee54ac89ac6563d0e1790028ef6f29dad8a3d10c203fedd522354e792d3" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000003" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000001" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000002" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000002" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000002" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.previous_rollup_data.proof] -fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - -[inputs.previous_rollup_data.vk] -key = [ - "0x0000000000000000000000000000000000000000000000000000000000200000", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000f9a0f1b4b73c650a49a59930aa5adce272", - "0x000000000000000000000000000000000002d4e1786e29578b3cb0fb4689bb7c", - "0x000000000000000000000000000000266333b910a3282a4c63301136aea8e4fa", - "0x00000000000000000000000000000000000f903bfa8c605b49a0c3c89750746b", - "0x000000000000000000000000000000d76149d349b289d623908bbd1192792709", - "0x000000000000000000000000000000000011168c030cc34fd4102af59f4ae73d", - "0x000000000000000000000000000000dbdf4eba3bbd9dfc3cf4dc6efd28b69051", - "0x0000000000000000000000000000000000033e8efa394f8be16d0473f2c85358", - "0x000000000000000000000000000000ba5e04dd8e2f259451487dd85da5d14702", - "0x000000000000000000000000000000000022abc3ee90a5e2744eec572201b6b2", - "0x00000000000000000000000000000058828d6caa20b472b3b896282dcc4a1643", - "0x0000000000000000000000000000000000237735c2d24244533f09e8ca65fcff", - "0x0000000000000000000000000000002fe564c32e7b326b8cdc8af20090bfc7a2", - "0x00000000000000000000000000000000000346d4c3c2d8f7cd5b85725b3878c5", - "0x000000000000000000000000000000f8f62d94d85c08d70496476164cb803211", - "0x000000000000000000000000000000000019427e2f89a50c1bcdc551b04d772b", - "0x00000000000000000000000000000033f9afc10930b18d19b6af874448d160c6", - "0x0000000000000000000000000000000000137c6abe6f1fcf900e90a5cf237cc6", - "0x00000000000000000000000000000058cccc3f2703d29c91f3d17c78e3299bd2", - "0x0000000000000000000000000000000000076cb76ba8cfcc5bb70e050a59e218", - "0x000000000000000000000000000000c87b323ecbd7b15fc33e6c583107b44b23", - "0x00000000000000000000000000000000002e245e351eb310ddd7743269baf77f", - "0x0000000000000000000000000000009ff4950b0c4b3add44ccc902c09df25db5", - "0x000000000000000000000000000000000018a469eeb4052a82eefe68bd5b1196", - "0x000000000000000000000000000000894040d5d6f64d60c225608b18a587060f", - "0x000000000000000000000000000000000009d893128ac259b6cac4a994b11fc6", - "0x000000000000000000000000000000af64971bd54995512ff9c04ed40955f56d", - "0x000000000000000000000000000000000027d8c8f3775628a68ae667d48c26bc", - "0x00000000000000000000000000000032d71b4c23eb9a8ac6b8a45e4570f813d5", - "0x0000000000000000000000000000000000058b89a9a33565a4160e6a295dbb4f", - "0x0000000000000000000000000000006e56278f83df156d7732c93f40b1051379", - "0x00000000000000000000000000000000000563fbba3ff6f3c6f53f9f68ca199d", - "0x000000000000000000000000000000d25b431594b443e3cc070abe35eca64176", - "0x00000000000000000000000000000000002e7ed301fbed6012643a1689262b0b", - "0x000000000000000000000000000000df7e5e7c7b82d7bc5107b59c80f3c123c7", - "0x00000000000000000000000000000000000d1e931fd8ab4ccf539d0aa7a90d35", - "0x000000000000000000000000000000fd02efbc15750161313de3faf4b681aaf1", - "0x000000000000000000000000000000000017bcf9ee6bc3dd2c79ce6f89229b3e", - "0x00000000000000000000000000000020a38f1d6d780408ecf2e2d2b9f89eac06", - "0x000000000000000000000000000000000017db15fc415d5da6c4780b2bd700b4", - "0x00000000000000000000000000000032cc211a04c3c06cdcfd96b003cc47307c", - "0x00000000000000000000000000000000001c9bc4677476874f24855d8c495e44", - "0x000000000000000000000000000000ad3e50d334c410302365993a598b6181fc", - "0x00000000000000000000000000000000002cddb00aaef77704af7c10fb06cd27", - "0x000000000000000000000000000000b3914d6be743b266956035641be8ead9b2", - "0x000000000000000000000000000000000000c8fb13e0b42d3987ff5ef93f6ed7", - "0x000000000000000000000000000000df85b5175892649d17c0199d1aadac9319", - "0x00000000000000000000000000000000000b931c7f5d1dacc8e7559e9ba84017", - "0x0000000000000000000000000000005e8c4f79863adb4bcc8a6cf38eea5206f0", - "0x000000000000000000000000000000000003a8f03343baca1998030d4b894641", - "0x00000000000000000000000000000062c87a9445f84764866d9ddc1bf67cfbda", - "0x00000000000000000000000000000000000d0eb506f26d8fd25e1fc604a312c8", - "0x000000000000000000000000000000a6cdbdd6f5a8e72bffcd9a2f4b5911f4db", - "0x000000000000000000000000000000000004f8b7c104f426a04178d19bfca639", - "0x000000000000000000000000000000555745a2f5504f3aa8530662d42f6aba6d", - "0x00000000000000000000000000000000000951c26d785d82ab4cbe40e9b9ebf8", - "0x000000000000000000000000000000d25534444e437c7afe806ef54995555246", - "0x000000000000000000000000000000000016051b87703af88579e4b3c789ed4b", - "0x0000000000000000000000000000007d8b77fe3663f3d42388ec1e9a5f20dcb7", - "0x00000000000000000000000000000000001350cbd188ff9798d1a14e3a712316", - "0x000000000000000000000000000000957dad8e248a580c01e39ea5da41b06e12", - "0x00000000000000000000000000000000000d79b41a0ba843370253375159bb76", - "0x0000000000000000000000000000007d3dcfd2a7a9763a9bb35d9b4a0cb644c3", - "0x00000000000000000000000000000000002af943d1ff0fa6024fd74b0e711c40", - "0x00000000000000000000000000000081ac6be98c7aa41b1e331ca6b399ffbcf8", - "0x0000000000000000000000000000000000007f46bf52fe6f59f74d6ae110635d", - "0x0000000000000000000000000000002b5e73b74fea51ebac288febfff011e1fc", - "0x00000000000000000000000000000000001e6267d50d54cd1e9bdeba4d0b18b1", - "0x000000000000000000000000000000238dd5230616fd65b931f0bf9938528b2b", - "0x00000000000000000000000000000000001038d4a6435d75991361206f266358", - "0x0000000000000000000000000000004d9fa56c224d029428e2144a7da5f72642", - "0x0000000000000000000000000000000000020a80119aada1a665ed68e432ebf7", - "0x00000000000000000000000000000075866a52c8cc25d0fb6f6ea61ea60acc4d", - "0x00000000000000000000000000000000002d2c9968baefda1cadfe406a523121", - "0x0000000000000000000000000000000e4f9f128eedd55e95c4af0ce03f36b3cf", - "0x0000000000000000000000000000000000123a6b0a746d55cff6a172cea94c87", - "0x0000000000000000000000000000005d5a52f4828bdcc80eb43ae38c99000807", - "0x000000000000000000000000000000000015bbf7c793a9227c63b6ed44b56be9", - "0x000000000000000000000000000000619ea6256e50ba30c7438d3487de46c8de", - "0x000000000000000000000000000000000013b8dca4e1068bb38ce90d444dde48", - "0x0000000000000000000000000000000ccc3a61da65d9333a2d99d685d4a12437", - "0x000000000000000000000000000000000003f40a3022046cadb4821049ea177b", - "0x000000000000000000000000000000ebe96bd16e9e00ef2e8fe1afac5072b33c", - "0x0000000000000000000000000000000000203efcb0b23ec0803421b7ba6196e3", - "0x00000000000000000000000000000095fce621e5d13adb1600ff34a7cab78ce7", - "0x0000000000000000000000000000000000138f458a343844776fda405a5271cf", - "0x00000000000000000000000000000046a68a67cbd929d663206821ce8fc5e230", - "0x00000000000000000000000000000000000baad17f09e16020481a4d67f735a2", - "0x0000000000000000000000000000005d157a3ade75ffbbc28195549243fd12a3", - "0x000000000000000000000000000000000017cabc064e4238d6844b8703d41d24", - "0x000000000000000000000000000000152ce071b703eb0716af995f8c91e13ce9", - "0x00000000000000000000000000000000002299066301428e31449b88fe5a4a76", - "0x00000000000000000000000000000039d0f4c6ba5eb83fd6fe632dba5ccd9361", - "0x00000000000000000000000000000000001bbb5e0fe4c482f456058dfb96f9ab", - "0x0000000000000000000000000000006ada264c4d8f433774b81314666f8e9d09", - "0x00000000000000000000000000000000002889ea5c1cdd05bca629fc629023cf", - "0x0000000000000000000000000000002b819d712cc9b72347f629fa9ae632b155", - "0x0000000000000000000000000000000000257b6eabdd8823096556a6263402b1", - "0x000000000000000000000000000000460b98103674e0ac00918e8877f22f1b71", - "0x0000000000000000000000000000000000054eae798f898372c126db4bd48259", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000006bb52125d6fc06647fd9cedb6d78b45484", - "0x00000000000000000000000000000000000c9efacb27891ccff4ec585bca178d", - "0x000000000000000000000000000000d00d066099502ff473730b51ba584a2497", - "0x0000000000000000000000000000000000178f40f0d3e4a602b39b54d703693c" -] -hash = "0x0f9dd365fdf92a402609ec76d8c4ef3bbf9cf556dc49dbf1e9529819c493bae7" - -[inputs.previous_rollup_data.vk_witness] -leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000e" -sibling_path = [ - "0x1278a25e09e3c264b2464c399261c3088a37c078d3b5f857bede801e60256525", - "0x21fcc32e6b27ccb6085761bf104a6e67807bd75fe0e69277e7cb7070d51256bf", - "0x28cc5f065307988bda56bf3288ec5311f15bee227f3563ab228922188964f892", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] - -[[inputs.previous_rollup_data]] -[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] -previous_block_hash = "0x13db18dc5427c36310f293dca4c57a04be287647aa444ea50166c23d9abb5a33" -end_block_hash = "0x015bcb5469435680f990078689699536790fb3bba6fe986caffc727997e96303" -out_hash = "0x005945f9571dd12c34c596528d0614f229a64f6bf4f90e19de312dffd99b9cb3" -vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" -prover_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] - root = "0x238ebee54ac89ac6563d0e1790028ef6f29dad8a3d10c203fedd522354e792d3" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000003" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] - root = "0x01780154b577d9c3cabe38cfa50b905cca1b3a7726bfd8104a36f4cd76d76516" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000005" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000003" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000003" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000003" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000004" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000004" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000004" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.previous_rollup_data.proof] -fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - -[inputs.previous_rollup_data.vk] -key = [ - "0x0000000000000000000000000000000000000000000000000000000000200000", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000f9a0f1b4b73c650a49a59930aa5adce272", - "0x000000000000000000000000000000000002d4e1786e29578b3cb0fb4689bb7c", - "0x000000000000000000000000000000266333b910a3282a4c63301136aea8e4fa", - "0x00000000000000000000000000000000000f903bfa8c605b49a0c3c89750746b", - "0x000000000000000000000000000000d76149d349b289d623908bbd1192792709", - "0x000000000000000000000000000000000011168c030cc34fd4102af59f4ae73d", - "0x000000000000000000000000000000dbdf4eba3bbd9dfc3cf4dc6efd28b69051", - "0x0000000000000000000000000000000000033e8efa394f8be16d0473f2c85358", - "0x000000000000000000000000000000ba5e04dd8e2f259451487dd85da5d14702", - "0x000000000000000000000000000000000022abc3ee90a5e2744eec572201b6b2", - "0x00000000000000000000000000000058828d6caa20b472b3b896282dcc4a1643", - "0x0000000000000000000000000000000000237735c2d24244533f09e8ca65fcff", - "0x0000000000000000000000000000002fe564c32e7b326b8cdc8af20090bfc7a2", - "0x00000000000000000000000000000000000346d4c3c2d8f7cd5b85725b3878c5", - "0x000000000000000000000000000000f8f62d94d85c08d70496476164cb803211", - "0x000000000000000000000000000000000019427e2f89a50c1bcdc551b04d772b", - "0x00000000000000000000000000000033f9afc10930b18d19b6af874448d160c6", - "0x0000000000000000000000000000000000137c6abe6f1fcf900e90a5cf237cc6", - "0x00000000000000000000000000000058cccc3f2703d29c91f3d17c78e3299bd2", - "0x0000000000000000000000000000000000076cb76ba8cfcc5bb70e050a59e218", - "0x000000000000000000000000000000c87b323ecbd7b15fc33e6c583107b44b23", - "0x00000000000000000000000000000000002e245e351eb310ddd7743269baf77f", - "0x0000000000000000000000000000009ff4950b0c4b3add44ccc902c09df25db5", - "0x000000000000000000000000000000000018a469eeb4052a82eefe68bd5b1196", - "0x000000000000000000000000000000894040d5d6f64d60c225608b18a587060f", - "0x000000000000000000000000000000000009d893128ac259b6cac4a994b11fc6", - "0x000000000000000000000000000000af64971bd54995512ff9c04ed40955f56d", - "0x000000000000000000000000000000000027d8c8f3775628a68ae667d48c26bc", - "0x00000000000000000000000000000032d71b4c23eb9a8ac6b8a45e4570f813d5", - "0x0000000000000000000000000000000000058b89a9a33565a4160e6a295dbb4f", - "0x0000000000000000000000000000006e56278f83df156d7732c93f40b1051379", - "0x00000000000000000000000000000000000563fbba3ff6f3c6f53f9f68ca199d", - "0x000000000000000000000000000000d25b431594b443e3cc070abe35eca64176", - "0x00000000000000000000000000000000002e7ed301fbed6012643a1689262b0b", - "0x000000000000000000000000000000df7e5e7c7b82d7bc5107b59c80f3c123c7", - "0x00000000000000000000000000000000000d1e931fd8ab4ccf539d0aa7a90d35", - "0x000000000000000000000000000000fd02efbc15750161313de3faf4b681aaf1", - "0x000000000000000000000000000000000017bcf9ee6bc3dd2c79ce6f89229b3e", - "0x00000000000000000000000000000020a38f1d6d780408ecf2e2d2b9f89eac06", - "0x000000000000000000000000000000000017db15fc415d5da6c4780b2bd700b4", - "0x00000000000000000000000000000032cc211a04c3c06cdcfd96b003cc47307c", - "0x00000000000000000000000000000000001c9bc4677476874f24855d8c495e44", - "0x000000000000000000000000000000ad3e50d334c410302365993a598b6181fc", - "0x00000000000000000000000000000000002cddb00aaef77704af7c10fb06cd27", - "0x000000000000000000000000000000b3914d6be743b266956035641be8ead9b2", - "0x000000000000000000000000000000000000c8fb13e0b42d3987ff5ef93f6ed7", - "0x000000000000000000000000000000df85b5175892649d17c0199d1aadac9319", - "0x00000000000000000000000000000000000b931c7f5d1dacc8e7559e9ba84017", - "0x0000000000000000000000000000005e8c4f79863adb4bcc8a6cf38eea5206f0", - "0x000000000000000000000000000000000003a8f03343baca1998030d4b894641", - "0x00000000000000000000000000000062c87a9445f84764866d9ddc1bf67cfbda", - "0x00000000000000000000000000000000000d0eb506f26d8fd25e1fc604a312c8", - "0x000000000000000000000000000000a6cdbdd6f5a8e72bffcd9a2f4b5911f4db", - "0x000000000000000000000000000000000004f8b7c104f426a04178d19bfca639", - "0x000000000000000000000000000000555745a2f5504f3aa8530662d42f6aba6d", - "0x00000000000000000000000000000000000951c26d785d82ab4cbe40e9b9ebf8", - "0x000000000000000000000000000000d25534444e437c7afe806ef54995555246", - "0x000000000000000000000000000000000016051b87703af88579e4b3c789ed4b", - "0x0000000000000000000000000000007d8b77fe3663f3d42388ec1e9a5f20dcb7", - "0x00000000000000000000000000000000001350cbd188ff9798d1a14e3a712316", - "0x000000000000000000000000000000957dad8e248a580c01e39ea5da41b06e12", - "0x00000000000000000000000000000000000d79b41a0ba843370253375159bb76", - "0x0000000000000000000000000000007d3dcfd2a7a9763a9bb35d9b4a0cb644c3", - "0x00000000000000000000000000000000002af943d1ff0fa6024fd74b0e711c40", - "0x00000000000000000000000000000081ac6be98c7aa41b1e331ca6b399ffbcf8", - "0x0000000000000000000000000000000000007f46bf52fe6f59f74d6ae110635d", - "0x0000000000000000000000000000002b5e73b74fea51ebac288febfff011e1fc", - "0x00000000000000000000000000000000001e6267d50d54cd1e9bdeba4d0b18b1", - "0x000000000000000000000000000000238dd5230616fd65b931f0bf9938528b2b", - "0x00000000000000000000000000000000001038d4a6435d75991361206f266358", - "0x0000000000000000000000000000004d9fa56c224d029428e2144a7da5f72642", - "0x0000000000000000000000000000000000020a80119aada1a665ed68e432ebf7", - "0x00000000000000000000000000000075866a52c8cc25d0fb6f6ea61ea60acc4d", - "0x00000000000000000000000000000000002d2c9968baefda1cadfe406a523121", - "0x0000000000000000000000000000000e4f9f128eedd55e95c4af0ce03f36b3cf", - "0x0000000000000000000000000000000000123a6b0a746d55cff6a172cea94c87", - "0x0000000000000000000000000000005d5a52f4828bdcc80eb43ae38c99000807", - "0x000000000000000000000000000000000015bbf7c793a9227c63b6ed44b56be9", - "0x000000000000000000000000000000619ea6256e50ba30c7438d3487de46c8de", - "0x000000000000000000000000000000000013b8dca4e1068bb38ce90d444dde48", - "0x0000000000000000000000000000000ccc3a61da65d9333a2d99d685d4a12437", - "0x000000000000000000000000000000000003f40a3022046cadb4821049ea177b", - "0x000000000000000000000000000000ebe96bd16e9e00ef2e8fe1afac5072b33c", - "0x0000000000000000000000000000000000203efcb0b23ec0803421b7ba6196e3", - "0x00000000000000000000000000000095fce621e5d13adb1600ff34a7cab78ce7", - "0x0000000000000000000000000000000000138f458a343844776fda405a5271cf", - "0x00000000000000000000000000000046a68a67cbd929d663206821ce8fc5e230", - "0x00000000000000000000000000000000000baad17f09e16020481a4d67f735a2", - "0x0000000000000000000000000000005d157a3ade75ffbbc28195549243fd12a3", - "0x000000000000000000000000000000000017cabc064e4238d6844b8703d41d24", - "0x000000000000000000000000000000152ce071b703eb0716af995f8c91e13ce9", - "0x00000000000000000000000000000000002299066301428e31449b88fe5a4a76", - "0x00000000000000000000000000000039d0f4c6ba5eb83fd6fe632dba5ccd9361", - "0x00000000000000000000000000000000001bbb5e0fe4c482f456058dfb96f9ab", - "0x0000000000000000000000000000006ada264c4d8f433774b81314666f8e9d09", - "0x00000000000000000000000000000000002889ea5c1cdd05bca629fc629023cf", - "0x0000000000000000000000000000002b819d712cc9b72347f629fa9ae632b155", - "0x0000000000000000000000000000000000257b6eabdd8823096556a6263402b1", - "0x000000000000000000000000000000460b98103674e0ac00918e8877f22f1b71", - "0x0000000000000000000000000000000000054eae798f898372c126db4bd48259", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000006bb52125d6fc06647fd9cedb6d78b45484", - "0x00000000000000000000000000000000000c9efacb27891ccff4ec585bca178d", - "0x000000000000000000000000000000d00d066099502ff473730b51ba584a2497", - "0x0000000000000000000000000000000000178f40f0d3e4a602b39b54d703693c" -] -hash = "0x0f9dd365fdf92a402609ec76d8c4ef3bbf9cf556dc49dbf1e9529819c493bae7" - -[inputs.previous_rollup_data.vk_witness] -leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000e" -sibling_path = [ - "0x1278a25e09e3c264b2464c399261c3088a37c078d3b5f857bede801e60256525", - "0x21fcc32e6b27ccb6085761bf104a6e67807bd75fe0e69277e7cb7070d51256bf", - "0x28cc5f065307988bda56bf3288ec5311f15bee227f3563ab228922188964f892", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-root-simulated/Nargo.toml b/noir-projects/noir-protocol-circuits/crates/rollup-block-root-simulated/Nargo.toml new file mode 100644 index 00000000000..7a6a625957f --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-block-root-simulated/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "rollup_block_root_simulated" +type = "bin" +authors = [""] +compiler_version = ">=0.18.0" + +[dependencies] +rollup_lib = { path = "../rollup-lib" } +types = { path = "../types" } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-root-simulated/src/main.nr b/noir-projects/noir-protocol-circuits/crates/rollup-block-root-simulated/src/main.nr new file mode 100644 index 00000000000..c4d1e1889a9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-block-root-simulated/src/main.nr @@ -0,0 +1,5 @@ +use dep::rollup_lib::block_root::{BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs}; + +unconstrained fn main(inputs: BlockRootRollupInputs) -> pub BlockRootOrBlockMergePublicInputs { + inputs.block_root_rollup_circuit() +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-root/Prover.toml b/noir-projects/noir-protocol-circuits/crates/rollup-block-root/Prover.toml new file mode 100644 index 00000000000..fa054576428 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-block-root/Prover.toml @@ -0,0 +1,14433 @@ +[inputs] +l1_to_l2_messages = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] +l1_to_l2_message_subtree_sibling_path = [ + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a" +] +new_archive_sibling_path = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x207f82708405f34873fadee80edfe9b399ab76b1182523986a388c1e9e560f69", + "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" +] +previous_block_hash = "0x022087729c552378b2572eb9be555e7dff2161a22e9a1d5e175d3558163a615b" +prover_id = "0x0000000000000000000000000000000000000000000000000000000000000051" +blobs_fields = [ + "0x000000000000000000000000000000000074785f737461727400000900010000", + "0x0002000000000000000000000000000000000000000000000011b417896f129a", + "0x0000000000000000000000000000000000000000000000000000000004000001", + "0x1f402bc61864bc9d78571eb2ff08bd21be788986bfc07e9e7865cbe3dd0a905b", + "0x0000000000000000000000000000000000000000000000000000000006000004", + "0x0384c877dba0f9d849d02e07dac0d3105f8e09b0959c5ee77843b8c037b195bc", + "0x0000000000000000000000000000000000000000000000000000000000002328", + "0x0d38d167da0ccd3ba447ce36953062d88783b02447d5af2bd09519bcd2a928f4", + "0x00000000000000000000000000000000000000000000000000000000000003e8", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] +blobs_hash = "0x00694ef58caf7e83ff6c9a65d3667adff33912aec5d9564ce4d8994fd5e33290" + + [[inputs.previous_rollup_data]] +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs] +rollup_type = "0x0000000000000000000000000000000000000000000000000000000000000000" +num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" +out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +accumulated_fees = "0x0000000000000000000000000000000000000000000000000011b417896f129a" +accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000016771" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants] + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.last_archive] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.note_hash_tree] +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.nullifier_tree] +root = "0x085a35f42d569f7aac0404ce29055696f738a6c798a32632d15a8453e59115ff" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.public_data_tree] +root = "0x0ff17010ab909b4a0c9581a9c33cf0af93280c6fcd6664cf27270b8762a9e418" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.note_hash_tree] +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.nullifier_tree] +root = "0x0b3cd059f3a14d1fc149e845404ee3733e58010456792a3f61c3803f4ddd1248" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000440" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.public_data_tree] +root = "0x28b5d86e557e528de4452115c3b6ca2b8075465411e73f310c843fa8d2b5faad" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000000" + expected_fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + state = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000090000000000000000" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000000" + squeeze_mode = false + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + expected_fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000002328", + "0x0d38d167da0ccd3ba447ce36953062d88783b02447d5af2bd09519bcd2a928f4", + "0x00000000000000000000000000000000000000000000000000000000000003e8" +] + state = [ + "0x05dc8cfb21681a19bd8e67518d2b9e22d31ba0380ecbb3653e00daa9dabe7e56", + "0x0ebafbb8e482cfd14bfe06b18ba8ef29493892e5c55e9b5ed16ede0e4cfe7562", + "0x22fa4ea0b8f5633a4701f717c52914a96bc5be0e69d2e84d86b4a1a717dfac6d", + "0x0991732e4b69f8065c9beb388f953e963baab29beb67084560f6116c9fdec042" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000003" + squeeze_mode = false + +[inputs.previous_rollup_data.proof] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + +[inputs.previous_rollup_data.vk] +key = [ + "0x0000000000000000000000000000000000000000000000000000000002000000", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000007acea76220f3dcf559941a7e87a6b28907", + "0x000000000000000000000000000000000017503e58c81a120517cdb8a4f99a55", + "0x00000000000000000000000000000030e0a46a7056ec5d122358957f34be6420", + "0x000000000000000000000000000000000019af3ba7be026356d5013338e6a9c8", + "0x000000000000000000000000000000941c8c03340dc6ac1ac21dfc245eec52ae", + "0x000000000000000000000000000000000028a50b16a95bfe8d5d5910fa14acf9", + "0x000000000000000000000000000000d750fd9b7a01bfd4e6553bf8ab2e513a06", + "0x000000000000000000000000000000000005cb7ef208180dc12701ec1bf16e6e", + "0x000000000000000000000000000000226a41a3cde055871146a14f69ceed3189", + "0x00000000000000000000000000000000001905f4d4e4516041c993103f21ed23", + "0x000000000000000000000000000000e1343257a50d0cf1554d5fa39b63807f82", + "0x000000000000000000000000000000000029c01e95b47fd55a3af50c144b0334", + "0x000000000000000000000000000000061cb8849db1149ba384d6eb537ec1d821", + "0x00000000000000000000000000000000001bd9e9b6b2864c7e76f8d6f987d224", + "0x000000000000000000000000000000fbd7c650b1b4c0ba0255b744ddd75e735c", + "0x000000000000000000000000000000000014ac90285cdead0ec12cad3d8d3a31", + "0x00000000000000000000000000000004bd04287093441c75d05b6cb594d378de", + "0x00000000000000000000000000000000001cfa05ce692088c27bb7e9a8a262c2", + "0x0000000000000000000000000000000943740754bb6d7f5fb55d5570754381c0", + "0x000000000000000000000000000000000006cfaa5c166143d59ab33b6f57b88c", + "0x000000000000000000000000000000c3f3c5edfca877fb6c14f7e913c178f044", + "0x00000000000000000000000000000000001def2c9873d161b5ffc87d4b9c60dc", + "0x0000000000000000000000000000002837ed4f4febbbe8635ac74a35ef13542d", + "0x00000000000000000000000000000000002e15fa9496d154e169360820b701f7", + "0x0000000000000000000000000000007f4ae2590c599ca3e076d8a504c9761169", + "0x000000000000000000000000000000000008d15a8f153ffea92236a73f8e00ec", + "0x0000000000000000000000000000009a5f9f5cc321cda5967ab3977408842a1b", + "0x00000000000000000000000000000000001aef0ad6d98239a10226c1e7a66701", + "0x00000000000000000000000000000013ed1c45df71665ea0553a8a92ef89b0ea", + "0x00000000000000000000000000000000001e6c3f8b5ee0db10934643cab5960c", + "0x000000000000000000000000000000e6fa0a76bfb524488e71aa8cba569d3273", + "0x00000000000000000000000000000000000e146846a27a9e994aa5eb95368e43", + "0x0000000000000000000000000000004722d45629beb72092ae034d7a116eea80", + "0x000000000000000000000000000000000011b3074e83b178395fdbf16779ecd4", + "0x000000000000000000000000000000a1560ad69fb0f87cbb68e2469c17405a88", + "0x000000000000000000000000000000000016664440497257aab435766cd8daa4", + "0x0000000000000000000000000000008c0e5d61ceae65541e501766f2133c9a05", + "0x00000000000000000000000000000000000348d59b536e2d9124401c032218d4", + "0x000000000000000000000000000000c3bec12bcd8c5519adc22cc13745a6a5ba", + "0x0000000000000000000000000000000000099b37362358ccfb574e08a5d589c5", + "0x0000000000000000000000000000001a7603f798b4001644ac6346536db682c3", + "0x0000000000000000000000000000000000294bc6e456c49353364126e7acfa5d", + "0x000000000000000000000000000000ab11980eb66b6674b9668c4bf810f2dbd8", + "0x00000000000000000000000000000000002a71b3517077a7e806ed8c7bd41fa5", + "0x0000000000000000000000000000005f94f02f427c74fe51265b2501485c6681", + "0x00000000000000000000000000000000001f6b4f952f28290b3907e9fd89a04d", + "0x0000000000000000000000000000000e0cb8cc77e8e0da284dfa81fb659ed69e", + "0x0000000000000000000000000000000000108d2a188563f05f8c03cc1a1478c1", + "0x0000000000000000000000000000001d68539ab56b251c9bdd606b72eae2fbe2", + "0x0000000000000000000000000000000000222d18f43c8767fbdc01e1149c5606", + "0x00000000000000000000000000000099b18017f081d6cde0fe1dba203d35f031", + "0x0000000000000000000000000000000000144df7fc0ec590f0ae163b2206b2a0", + "0x000000000000000000000000000000fe935114b354bc67d2668722921ebac6ba", + "0x0000000000000000000000000000000000075d80d0ccb2ebb8e503e0bc8830c2", + "0x0000000000000000000000000000003b90abab25d1cc86543ee6ff8bfb36a141", + "0x00000000000000000000000000000000002f2b5f13b32122f25179e756a5bfb6", + "0x000000000000000000000000000000897ab9f551efb564c420ec89c75f025c72", + "0x00000000000000000000000000000000001c0ea2c5e6ab8dbcb5c04b013def2b", + "0x000000000000000000000000000000a0075bff7fe7d309a4a62e4697e0910dee", + "0x00000000000000000000000000000000001dab25f9c69e46eea9ef77449361e4", + "0x00000000000000000000000000000099547f9d90555739ddb33d81f778b79663", + "0x000000000000000000000000000000000009900c88d768eb3db72dd478bde74a", + "0x000000000000000000000000000000d92c26c30401619e97a43b2187b1e133a2", + "0x00000000000000000000000000000000000f991e56504f78fa90c31cb1a39102", + "0x000000000000000000000000000000c2d41c0bbfbf46ba1250ac1c9e0fe538a7", + "0x00000000000000000000000000000000001a64c934662e4d7843869e10bcf0cc", + "0x00000000000000000000000000000060971ccd87ad954d4a3a53beb136a115e5", + "0x000000000000000000000000000000000010bd7c99936aad440199663e48b08c", + "0x0000000000000000000000000000002fdcaae4a7ea95151eaa408586b1860983", + "0x0000000000000000000000000000000000288a0ff0315966a7a54a4884071b87", + "0x0000000000000000000000000000002455cf89f168533af00a61b6cc5dff0b25", + "0x00000000000000000000000000000000002bd11c6ee070b426cbeab3ff2b61b9", + "0x000000000000000000000000000000253a264c658d6d8b3e4a96d1e60d4ddbcf", + "0x000000000000000000000000000000000019e1190a385281dc72fa0d1e6e3173", + "0x00000000000000000000000000000001ca9ee62603b8684b4435a11fbe81fe77", + "0x00000000000000000000000000000000000fb6c90cf416bdc5cad8fcc8c5b077", + "0x000000000000000000000000000000cbaabba02d5684703afd2db78a4f2a9440", + "0x000000000000000000000000000000000029ae159051a17e5ce8e48ac542d5fe", + "0x000000000000000000000000000000d3380d3fc8294269fb9db3fcc5a60a29ca", + "0x00000000000000000000000000000000002b6571e09ef0385e86a817eac71f02", + "0x000000000000000000000000000000dfbc5112ae66004756cc08168e703dbcdc", + "0x00000000000000000000000000000000000a1361207b6352bb3e47b8afdcdee4", + "0x000000000000000000000000000000e9d60c7571a644bd754d4bd8f89ce3f771", + "0x000000000000000000000000000000000025bcafa95e5c0470321ffae1ac1d1f", + "0x000000000000000000000000000000e3cb7b601f7eed6dca3e591857166b4d1c", + "0x0000000000000000000000000000000000125aad145d0dbafb8da2dc1b0700bc", + "0x0000000000000000000000000000007a67f2caa5046f4d1dfc3a63469566de81", + "0x000000000000000000000000000000000022a98cee0b4cc5268adc92e2229271", + "0x000000000000000000000000000000f7c7c14a69ad0052dced057951a74436f5", + "0x0000000000000000000000000000000000263b96899c9835ce217f54f6df4acd", + "0x0000000000000000000000000000006c8c4e747cb6085c5735b9c68f2db633ac", + "0x00000000000000000000000000000000001157b26152b34ab05419f38acc15da", + "0x00000000000000000000000000000054cf89815a06c242c5e433264079487fc0", + "0x0000000000000000000000000000000000049a97286033e7c6c80520a963c7a1", + "0x00000000000000000000000000000077cb47275a750777c993d845849365ae73", + "0x00000000000000000000000000000000001bef3fe6a136f8f3419040fb2fb9a8", + "0x000000000000000000000000000000cb5bdeb788a62ab7fefa163b44aa4fe480", + "0x000000000000000000000000000000000019c8da60322e5b15147bb67ee97c3c", + "0x0000000000000000000000000000001f35e0f8d62d480f37b4aa13b09005e059", + "0x00000000000000000000000000000000002eaf8692eeea251928fb9c16523574", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000048e3a765d915435b20c18944c02674e924", + "0x000000000000000000000000000000000008468b14fb49e8f7fdd86769c0e96e", + "0x000000000000000000000000000000b79ddc3696c5d21245a4e6e20e566201f1", + "0x00000000000000000000000000000000002a3a1bf035af4b9fb6bf9c890d61ec" +] +hash = "0x1f07a2890c9deb79fe6cc78935c6dfa810ee56922785f37307cb463f7797f73e" + +[inputs.previous_rollup_data.vk_witness] +leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" +sibling_path = [ + "0x03cde467306e7d05bcd957b9dde81fdb644d6a7e21d7857bc1bf647f78bfde83", + "0x19861a044ec84aaf6e41d02a20051d349f07206356e10a0846d4fa892534e306", + "0x236d849434a03c2e9d181e5365fe087cb14fd703bff61e5676bfa24c4f4509b7", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] + + [[inputs.previous_rollup_data]] +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs] +rollup_type = "0x0000000000000000000000000000000000000000000000000000000000000000" +num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" +out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +accumulated_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" +accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants] + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.last_archive] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.note_hash_tree] +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.nullifier_tree] +root = "0x0b3cd059f3a14d1fc149e845404ee3733e58010456792a3f61c3803f4ddd1248" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000440" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.public_data_tree] +root = "0x28b5d86e557e528de4452115c3b6ca2b8075465411e73f310c843fa8d2b5faad" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.note_hash_tree] +root = "0x266514a4f987058cb2deb71c37e845df4f7f85ab2a23f208dd98cf7eeeb7cbc4" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.nullifier_tree] +root = "0x0b3cd059f3a14d1fc149e845404ee3733e58010456792a3f61c3803f4ddd1248" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" + +[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.public_data_tree] +root = "0x28b5d86e557e528de4452115c3b6ca2b8075465411e73f310c843fa8d2b5faad" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000097" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + expected_fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000002328", + "0x0d38d167da0ccd3ba447ce36953062d88783b02447d5af2bd09519bcd2a928f4", + "0x00000000000000000000000000000000000000000000000000000000000003e8" +] + state = [ + "0x05dc8cfb21681a19bd8e67518d2b9e22d31ba0380ecbb3653e00daa9dabe7e56", + "0x0ebafbb8e482cfd14bfe06b18ba8ef29493892e5c55e9b5ed16ede0e4cfe7562", + "0x22fa4ea0b8f5633a4701f717c52914a96bc5be0e69d2e84d86b4a1a717dfac6d", + "0x0991732e4b69f8065c9beb388f953e963baab29beb67084560f6116c9fdec042" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000003" + squeeze_mode = false + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + expected_fields = "0x0000000000000000000000000000000000000000000000000000000000000009" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000002328", + "0x0d38d167da0ccd3ba447ce36953062d88783b02447d5af2bd09519bcd2a928f4", + "0x00000000000000000000000000000000000000000000000000000000000003e8" +] + state = [ + "0x05dc8cfb21681a19bd8e67518d2b9e22d31ba0380ecbb3653e00daa9dabe7e56", + "0x0ebafbb8e482cfd14bfe06b18ba8ef29493892e5c55e9b5ed16ede0e4cfe7562", + "0x22fa4ea0b8f5633a4701f717c52914a96bc5be0e69d2e84d86b4a1a717dfac6d", + "0x0991732e4b69f8065c9beb388f953e963baab29beb67084560f6116c9fdec042" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000003" + squeeze_mode = false + +[inputs.previous_rollup_data.proof] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + +[inputs.previous_rollup_data.vk] +key = [ + "0x0000000000000000000000000000000000000000000000000000000001000000", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x000000000000000000000000000000222d2b638470648efe806272902759bfe4", + "0x000000000000000000000000000000000026717cb116c9f379f6053d43ed7131", + "0x000000000000000000000000000000d72dc52e13931348a07d4d75dbdef7b696", + "0x000000000000000000000000000000000007a17849605cd5acdf47218d8ff6ab", + "0x0000000000000000000000000000000ead8b79c9d9733b45796b315aed219c46", + "0x000000000000000000000000000000000001520cbd65e9f9c12d2d804e5408a8", + "0x000000000000000000000000000000d4fd951f0c8b3f5c93c914a9ca3e3ad82b", + "0x00000000000000000000000000000000000c06cda5de6eb85a2dc3a3e461edf4", + "0x0000000000000000000000000000008fda111b457d9cbb2c2140e6e29baaa93d", + "0x000000000000000000000000000000000019250c98c82093236c18a9efa7bbcb", + "0x000000000000000000000000000000809dff0c74860533c531966cefa5e6b82f", + "0x0000000000000000000000000000000000096b5c6f4eb1c8d72e0812cabe6b20", + "0x0000000000000000000000000000002b40eba3c1a07bab631194a295de31fa39", + "0x00000000000000000000000000000000000053902748ef91505fca0d1db29c64", + "0x000000000000000000000000000000aa3b1b8cf6fbc5c81dc722111d10e6940b", + "0x0000000000000000000000000000000000206cb99da8d346b786537ed3b15446", + "0x0000000000000000000000000000001271113c751d045274a3317a01895808c9", + "0x00000000000000000000000000000000000ae017203dd40d764ddbaa912b9d03", + "0x000000000000000000000000000000f46fc3542fcfee505d2e9eacb7f397bb36", + "0x00000000000000000000000000000000002e5a0e507a80a266a9e62a94a7bb97", + "0x000000000000000000000000000000b44304dbc2fc1d02d3d903d01d29e76efb", + "0x00000000000000000000000000000000000fb528b629b4fbbf48fddeca9f54de", + "0x000000000000000000000000000000ffa188c0ab2f8df7c201783dc282a782cd", + "0x00000000000000000000000000000000000edbbec3674d50e52b6e83867b3007", + "0x00000000000000000000000000000058ea22bca57bfe9a1c46ce63c2c240901f", + "0x000000000000000000000000000000000028cce7cf665942fee68c3ffd344c71", + "0x000000000000000000000000000000bbda5287b41d69b0a203243ebb2d861d58", + "0x0000000000000000000000000000000000136b53ea88a30b784ec14018041c4e", + "0x0000000000000000000000000000004702b68f21e97f4ec2533229bdb2172de3", + "0x00000000000000000000000000000000002c307c0f773885110a0d7188d22899", + "0x000000000000000000000000000000ccfc8d16713b3ac84c531b3a09b57a5632", + "0x000000000000000000000000000000000018177fc15055bc6ded75133159116e", + "0x000000000000000000000000000000bf31ddaed25f6a3812d47d47eb1003c336", + "0x000000000000000000000000000000000030301fd8ac21f9dd93ae4de2223f3a", + "0x000000000000000000000000000000d8b510b22cee8d476c3ae3a5a643c12fcd", + "0x00000000000000000000000000000000001ed2d09f2ac6322b815bc0e35be630", + "0x0000000000000000000000000000005c2e45d0fa6b1156c250a016a8d6025717", + "0x0000000000000000000000000000000000116ef26a99b319f7ddf9a72b920d7e", + "0x000000000000000000000000000000887bef3a2f390f75c5c1c7d2804839dc40", + "0x0000000000000000000000000000000000241d35489e5ec7ae0ec539a511f4bb", + "0x0000000000000000000000000000001e9eed55f46c30f0a643e7fadc0f1c5b5f", + "0x00000000000000000000000000000000002d224bdb537e45356dad6719a44670", + "0x000000000000000000000000000000905b34d9aeffbef40ad032415b3b0e66bd", + "0x0000000000000000000000000000000000147a5bb3c75194935a583029501d7c", + "0x0000000000000000000000000000001a183288e3ecb3c21f96eb8e6c8fa774db", + "0x00000000000000000000000000000000001ef984af2d88e47be0e9664b8fd752", + "0x00000000000000000000000000000039f3dad17da7386018cab36996698755d5", + "0x00000000000000000000000000000000001561ce1450ac8840dbcf97e91bd5b6", + "0x000000000000000000000000000000f1b27c35585e11cbbf5612de0413672d01", + "0x0000000000000000000000000000000000012046c089f10f8c8c82265e2d6825", + "0x000000000000000000000000000000a2b89785fa94123ec142277619e45360fd", + "0x0000000000000000000000000000000000159d0140b54b1703d4f4ebdd75d849", + "0x000000000000000000000000000000539cb47199bd3c2245bc3044a89cf91958", + "0x0000000000000000000000000000000000096f804be4f55c1c25b387dc128f12", + "0x0000000000000000000000000000000d6ea4f662ce5d29fe8d5c30e717ed3f45", + "0x00000000000000000000000000000000000505aeb30b5f6acb1c0e335e27c510", + "0x0000000000000000000000000000003bafc94403ed6cbde5cd3bcd4b14d6c0fa", + "0x00000000000000000000000000000000001ad585be43d722b6a37d8b3832a770", + "0x000000000000000000000000000000d0ecec90f37a38b0b770d04148856f191a", + "0x0000000000000000000000000000000000195175c4eceb80ac5b567c05686b6a", + "0x00000000000000000000000000000018d09a6452cffee1251ce810df1987c3fe", + "0x000000000000000000000000000000000018a58c0116caf02d8187113b216b50", + "0x000000000000000000000000000000786c72f5cb45e0b2ef50d429284962d8f2", + "0x00000000000000000000000000000000001edecd8d2daf475aea627cddc4bf83", + "0x000000000000000000000000000000f11f76923fbc94bb9da677ef4ea48d8e5d", + "0x000000000000000000000000000000000009e363fd3b9fba1921f8a620453c8b", + "0x000000000000000000000000000000130337f88d1a3501deb7548bf12f3bf8c7", + "0x00000000000000000000000000000000001caf1ae2f1b7c284d4fa064660e2d4", + "0x0000000000000000000000000000001f3243dcfe519ae43f5fda7c4e071489ec", + "0x000000000000000000000000000000000028ddb68ba85ec82fbe2c3d13f3f4f3", + "0x000000000000000000000000000000b8d7efb798a996ad6f6cc79bbb2c23e051", + "0x000000000000000000000000000000000014064ac87a8676a6c0701105a76924", + "0x000000000000000000000000000000c4f5d6ec595af7e188571eb533255210bb", + "0x00000000000000000000000000000000000b751e85d1d0a4d12321b8f3001d93", + "0x00000000000000000000000000000053c44079c3fbeb350e7347576b96a518a2", + "0x00000000000000000000000000000000002cf5eeea78f9cc5b1c698613d5a0ac", + "0x0000000000000000000000000000006ebb8205fddf556a03c81473e3d7f128da", + "0x000000000000000000000000000000000005e04349dee59bf22cab15fbcf6579", + "0x000000000000000000000000000000119e7803dc1f0d42d610c1e636b763e84a", + "0x0000000000000000000000000000000000150cdd897a47b83debe2a86b41df03", + "0x000000000000000000000000000000b2627cae7ef76e48877e5f65dda01de6fa", + "0x00000000000000000000000000000000002df31114d6ea625d30f40fcd6501ae", + "0x000000000000000000000000000000d9ff339dabc896850436795e686c8b7892", + "0x0000000000000000000000000000000000045d737d25201a48aabff3f6bca6b3", + "0x000000000000000000000000000000de93c07b11d2e6fa6550a3cefb321e16d7", + "0x00000000000000000000000000000000001752e736d3439003c65c42a97c0f09", + "0x0000000000000000000000000000009365c7dc3d4484e835a8c4cd523db7cb52", + "0x000000000000000000000000000000000004bd96b70a7ceca6e250998dd29d04", + "0x000000000000000000000000000000383c0eef46c0b99e9af36ae88ed755eab8", + "0x000000000000000000000000000000000017750cb080368dc310dba9dc7b1627", + "0x000000000000000000000000000000ce7ee23afcb014b28d8ad4a8ca1576f27c", + "0x000000000000000000000000000000000029e9346b8314cc77921b3d989c68a0", + "0x0000000000000000000000000000009c8ee8e93120da7baa9e1aa23de4ebf086", + "0x00000000000000000000000000000000002d2475bbb16b1577d3933a25e17410", + "0x0000000000000000000000000000001c775e636250539aa55b35901031d8a234", + "0x000000000000000000000000000000000027a3acd1183085d9619ddfb13ce036", + "0x000000000000000000000000000000258cb84ffd27a5cb5a91a096c098cbcd14", + "0x00000000000000000000000000000000000cc296cc5967bc2eca88c4b55ec976", + "0x0000000000000000000000000000007b6f66567f2710b238fadf1e211206376b", + "0x00000000000000000000000000000000001c58cff4dbc4ad672c2b263cc7b065", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000a653c3ebcdb2ec03f5bededc1780032446", + "0x0000000000000000000000000000000000143112234ac9aa9f7ef289152fccda", + "0x00000000000000000000000000000073d1f6ce5b511d1a45307e35b4e146876d", + "0x00000000000000000000000000000000002ca743c017d5c16d5953d03410d5a5" +] +hash = "0x03cde467306e7d05bcd957b9dde81fdb644d6a7e21d7857bc1bf647f78bfde83" + +[inputs.previous_rollup_data.vk_witness] +leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" +sibling_path = [ + "0x1f07a2890c9deb79fe6cc78935c6dfa810ee56922785f37307cb463f7797f73e", + "0x19861a044ec84aaf6e41d02a20051d349f07206356e10a0846d4fa892534e306", + "0x236d849434a03c2e9d181e5365fe087cb14fd703bff61e5676bfa24c4f4509b7", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] + + [inputs.l1_to_l2_roots] + vk_path = [ + "0x161b493a1213baf6622d929c1fc116cc43fe1814a596e068cead7d06be55329d", + "0x0339cf04d96013da57fbdde5b8fc0ef4715a16f28de5d42966ffd1394729cd51", + "0x236d849434a03c2e9d181e5365fe087cb14fd703bff61e5676bfa24c4f4509b7", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] + + [inputs.l1_to_l2_roots.proof] + fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + + [inputs.l1_to_l2_roots.verification_key] + key = [ + "0x0000000000000000000000000000000000000000000000000000000000400000", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x000000000000000000000000000000ef83b38b2adfeae9003ed25049bf5a8127", + "0x00000000000000000000000000000000002f6804ac00ed4ac9c12ff372dff4f1", + "0x000000000000000000000000000000cc77099ec2b643439807e7876fad2c9ba2", + "0x0000000000000000000000000000000000189fe72941b8761529cdec879e70c3", + "0x0000000000000000000000000000005c21f4d06f37d56db1519a1f0067f8325c", + "0x0000000000000000000000000000000000240f7fb629fc6fac9c01a15a81a29d", + "0x000000000000000000000000000000baad6c7e6298352fa7b24edf7dd5e1ebe6", + "0x00000000000000000000000000000000001d95172fd685cbacf6161e5faea826", + "0x00000000000000000000000000000071b58c3c1aea5098420025a2aaf4ebe3d4", + "0x00000000000000000000000000000000000dfb79669eb9b7661caa8d029d8286", + "0x0000000000000000000000000000005ee94b8c8879ad84db0b3e4c3f9a7543ff", + "0x00000000000000000000000000000000002bbb7fbd08328822904381b7fefead", + "0x000000000000000000000000000000576e5f08a5f41e12f28187f9786454cd5d", + "0x00000000000000000000000000000000001e71d3b1f2afcfb7477ba51110db5b", + "0x000000000000000000000000000000a4bca7718514674b6ab56109c42736ea7c", + "0x0000000000000000000000000000000000071b722c8d87bbfd0cf448c31f81bc", + "0x00000000000000000000000000000025b11596c239dae5057125d05eb8cc6557", + "0x00000000000000000000000000000000002a319a7045785ddbfd2e01866b63a1", + "0x000000000000000000000000000000eb8b982636ed767b93b8c6e944831b4f35", + "0x00000000000000000000000000000000000fa95738e669f13a780f2e532ac0c6", + "0x000000000000000000000000000000dd15bc2e2ba0e2c65e6a29ff0d76959549", + "0x00000000000000000000000000000000000ec94bcf6af94a2915bf1c2a310d4a", + "0x000000000000000000000000000000a5febcf1818fc85fae3fe27cf330f8f611", + "0x00000000000000000000000000000000002ea22d66ad35aebbb913d41f81ed36", + "0x000000000000000000000000000000183ba8d5faae59b85b2bca96ec6f2cd725", + "0x0000000000000000000000000000000000093c1fcf5f6e4778203fda698738d2", + "0x000000000000000000000000000000c3349712daded22564626cf8bf805ee156", + "0x00000000000000000000000000000000001200bfd0c056032a36740fa7c17d8a", + "0x000000000000000000000000000000f0442acb9227365fa391e5b24de1b8b829", + "0x00000000000000000000000000000000001efcbef4be20dafb606d9fe26ccb6d", + "0x0000000000000000000000000000000a3434c757b6cdf4e171e777c3f36f42e4", + "0x000000000000000000000000000000000027e62534f646bba5e31b7f99909e8a", + "0x00000000000000000000000000000079d48b61f1c30319e84d2db5cadf9db534", + "0x000000000000000000000000000000000006c22981c92b67b75a1a7e718205db", + "0x000000000000000000000000000000267ef0534bb1162f69b63c6074a9d959fc", + "0x0000000000000000000000000000000000052dba76a66b4133ecb9f2bca8c380", + "0x00000000000000000000000000000008b52c29909ad1bfa954da8e57ea4a066a", + "0x0000000000000000000000000000000000109ff22b42ffa34a1048d1cf7e85f2", + "0x000000000000000000000000000000cafab2f766bee54b3695ec724f8973f588", + "0x0000000000000000000000000000000000055bdea69cd65d01ffe3b7bf6e0abe", + "0x000000000000000000000000000000d0a224122ee5ebb826535f06f15adaba46", + "0x0000000000000000000000000000000000005c21930f20683a963e879e95e0eb", + "0x00000000000000000000000000000057ab4c4fbae63414a156791ecb00f1bc5a", + "0x000000000000000000000000000000000013a6918d60b19830c00e3972619e94", + "0x000000000000000000000000000000722c10b61e2f8387dec086bb464b884150", + "0x00000000000000000000000000000000000cdaf3a64ca4794ca238d7fcdcecb3", + "0x000000000000000000000000000000ba93532e80bcd28c489a8540829640a02f", + "0x00000000000000000000000000000000000dccd3477b06045551bbe751031249", + "0x00000000000000000000000000000033bd7a9cf0fd754e5df28e9a2e678c496d", + "0x00000000000000000000000000000000002dd95c5b299310b245d58792c40cdb", + "0x000000000000000000000000000000439b907e0a9aaf7069461801093dcab835", + "0x00000000000000000000000000000000001335daf28fe677041b7c2c0b53ea80", + "0x00000000000000000000000000000066505d6c6857e0ff6081bf191c7b501af8", + "0x0000000000000000000000000000000000036ea1a34f9dac9abd0443118e6a74", + "0x00000000000000000000000000000031c04a43642ef06a56d9951d837d2a77b8", + "0x000000000000000000000000000000000000613e5d8a161533954c2885c05d44", + "0x00000000000000000000000000000096112c8b51229d049e119f55ff16c0cc46", + "0x000000000000000000000000000000000025f4924d517cd360f35f94bdc7be6c", + "0x000000000000000000000000000000fdc27898080f429ff8620e35140200a58e", + "0x00000000000000000000000000000000001b6f39a89f4ebc48295e228b30abe8", + "0x000000000000000000000000000000f80b54e38cb801f342ab82d7354e219e33", + "0x00000000000000000000000000000000002bca4749a44bb3c577ee97897e7792", + "0x000000000000000000000000000000be5d5831c52353c0a74a70345214f349dc", + "0x000000000000000000000000000000000008aa5b88aa0e13dae13d9e43c9e695", + "0x000000000000000000000000000000fb8045f8e8895d666eb162235ac4c05631", + "0x0000000000000000000000000000000000088cfba36a0a4046b654b389fe511f", + "0x000000000000000000000000000000d29dd74fa0b498959f4845bf59e29302f1", + "0x00000000000000000000000000000000001f6f0668aa5bafc7ef1e5b045bb524", + "0x000000000000000000000000000000113fd70eae2ff08f9e67846bdbb99fecc6", + "0x00000000000000000000000000000000000d6365aa67ac09db2d9a68e4e3b266", + "0x000000000000000000000000000000f178bd7fd4e507267f274cbb47b7707ca0", + "0x0000000000000000000000000000000000067ba20a9d7417f34586a9efd52440", + "0x000000000000000000000000000000521c51f8b15b4d56afa135439f639f760c", + "0x000000000000000000000000000000000018e56583282afa9f1b8537ecae629a", + "0x000000000000000000000000000000e605e75816e2ea9f583d44a0a1733ed1c7", + "0x000000000000000000000000000000000017f7dc0243458b7e84142310fbc98c", + "0x0000000000000000000000000000004c414c873d55767084c7efd12649cf484d", + "0x00000000000000000000000000000000000b76024cf3afa7d296c0552a8b9162", + "0x000000000000000000000000000000dd7e743cdf36e28ca926a5a72a077a582b", + "0x00000000000000000000000000000000000221356b123f38d03cd61faaf8c1b9", + "0x000000000000000000000000000000a87eae59bb0c50c7ae7e9eb63329456478", + "0x00000000000000000000000000000000002f1aebfba475c3c5e5b7aef25dc0d4", + "0x00000000000000000000000000000096f2dc2660b1528b582196a321fa22156b", + "0x00000000000000000000000000000000001c1d153734760312cadebc84e5deb2", + "0x0000000000000000000000000000009994cda75e4b4d76adecefc5fdfaedd890", + "0x0000000000000000000000000000000000292a4c0c5e217951a2a035377ca7c1", + "0x00000000000000000000000000000071dac06b84fbc70b0ea6fa4b967228ee05", + "0x00000000000000000000000000000000002c608447811602745e0220080f4f2e", + "0x0000000000000000000000000000002e4e72704b61a701fa7137313db1168d05", + "0x00000000000000000000000000000000001fc5345c8f1f0eabd4ce83d09bef6b", + "0x000000000000000000000000000000ffff1b7f5093c84b02d134afc0636c1d8f", + "0x00000000000000000000000000000000002c37e011d34a90133668385615c3ce", + "0x0000000000000000000000000000008cd6f83b1d4cf06810d804be0a1dfcb0eb", + "0x0000000000000000000000000000000000264144a05a6313cce7e4735f77b75e", + "0x0000000000000000000000000000003709f8978d2f3806ac989432cf46ab52b2", + "0x00000000000000000000000000000000000a0dc9cba8aa7d2b1991b6ce6ab8dd", + "0x000000000000000000000000000000bc7da4a5cd763a1a5cf1acba2e654e5985", + "0x00000000000000000000000000000000000a35e16ef55d15ea0182640e03d71f", + "0x000000000000000000000000000000716bd4734483981c1dfef425096a3cc48c", + "0x00000000000000000000000000000000000e0aeb4c2362bda3b93ec82e1dc9c0", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000bffaa2c460088fff6bb2fd98d4eb2db429", + "0x000000000000000000000000000000000015d2c8f918e40e39044cf6837a606b", + "0x0000000000000000000000000000006852404c6e5ad16e7f7145667ca7f936c2", + "0x00000000000000000000000000000000001df468a82cff18d9fa14a32dd6e09a" +] + hash = "0x2e0cce49628efb36cd158bf4a421fbb6bbc1bd1d4d61a9a07a6d72eac792e035" + + [inputs.l1_to_l2_roots.public_inputs] + sha_root = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" + converted_root = "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e" + vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" + + [inputs.start_l1_to_l2_message_tree_snapshot] + root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000070" + + [inputs.start_archive_snapshot] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [[inputs.blob_commitments]] + inner = [ + "0x00aae0654b3ba2a2f1e2fa2c7d23b35ab21cfba67951dcf917925cc2325eb866", + "0x0000000000000000000000000000001eea78b1856d5770ee11f410332f1be2af" +] + + [[inputs.blob_commitments]] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.blob_commitments]] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-block-root/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/rollup-block-root/SampleInputs.toml deleted file mode 100644 index 54055648bad..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/rollup-block-root/SampleInputs.toml +++ /dev/null @@ -1,2050 +0,0 @@ -[inputs] -l1_to_l2_messages = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000000" -] -l1_to_l2_message_subtree_sibling_path = [ - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a" -] -new_archive_sibling_path = [ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x084adf7a1c688b3fbbfbe9d4bb77eec5f26ffd64f94bd0e8ae9c55b084869ddf", - "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f" -] -previous_block_hash = "0x1bbf7797b6d630537a9d08e46616a870cf570e3bf8cea561ebde6ab2d9d04f53" -prover_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data]] -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs] -rollup_type = "0x0000000000000000000000000000000000000000000000000000000000000000" -num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" -txs_effects_hash = "0x0052970d1fd122f1502ddca34309e79344b2d931dcb39afa54d93666717279da" -out_hash = "0x00c6393713af19ccc3abfd2068829a7592150f85499f026bd703fdb29825ffc8" -accumulated_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" -accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants] - vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.last_archive] - root = "0x2a9a2323a4dd6a30e8d6cbef2ec01b51153c791bc2275b8659ede7a7c4dd29c3" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000008" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.note_hash_tree] -root = "0x14a4937bcde90d62d1b3e2c0ce54787a791a49f2ebf82f25b320bd82b8d8623e" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.nullifier_tree] -root = "0x0b7ec69328726edc15fcbf3e08ed521c0927d90d142e58e9c948f9b57647d269" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.public_data_tree] -root = "0x03b86f75364e991e09f80a496d6456cfb01765413554752e00334d415a933c8f" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003f2" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.note_hash_tree] -root = "0x246f7824ffde9c3e84aa3fe1e91588e3cde5388fa0a3810867c349c3ff20eba4" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.nullifier_tree] -root = "0x2e0ede9a948caff55be524cac113a328e7d1371fb30fae995bf3f759b7aa5fe6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000440" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.public_data_tree] -root = "0x10fb4974ef102739e4c277b8d68ce6e4599edfefaafc78720afa564fdce953ec" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000431" - -[inputs.previous_rollup_data.proof] -fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - -[inputs.previous_rollup_data.vk] -key = [ - "0x0000000000000000000000000000000000000000000000000000000002000000", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000cf7aae3b32ca469d2f4d8a50c545108793", - "0x000000000000000000000000000000000026c7f58b227bb11a7a07e90703a075", - "0x0000000000000000000000000000001779e9f1ebdcb0ca1d84c08f421c93d426", - "0x00000000000000000000000000000000002ebecedeb00025ef191427dfc03a70", - "0x000000000000000000000000000000387bf48c649f17aa11ce41732f34da2caa", - "0x0000000000000000000000000000000000154b6df3ae3e59669911aad19ba8cf", - "0x00000000000000000000000000000014d454a803987d756c8f2bbab83882a540", - "0x00000000000000000000000000000000001ab08c5e36abe25ff380dc3adb9bda", - "0x000000000000000000000000000000da77e17e4e68b7b1e455bec03e6e252fff", - "0x00000000000000000000000000000000001602b54c6fb1be67505c53835d04b5", - "0x00000000000000000000000000000005e0432c5876726787ffbb0762feaba6b1", - "0x0000000000000000000000000000000000094d1adda66fdbd7a9253998781016", - "0x000000000000000000000000000000c2601a4ccbc080e67cd00bf7d009cebf2a", - "0x0000000000000000000000000000000000196e55f78bd7061758ba437e24e6d3", - "0x000000000000000000000000000000d09742cde1f4a7ea0a9c0c75d42e19953f", - "0x000000000000000000000000000000000007ebaa6f5a81fa264544a3e3f2d957", - "0x000000000000000000000000000000a44e97ce02886ed0cf4e98daf7cb812893", - "0x00000000000000000000000000000000000e843e5994f9b9c449580f3635effc", - "0x000000000000000000000000000000a499c0a21cc98597d274c0b638e4648251", - "0x0000000000000000000000000000000000042d98fcad3c97caf60136088bb556", - "0x000000000000000000000000000000d264c197db47937b73339bf7df95c0d1dc", - "0x00000000000000000000000000000000000f85688ca6c4a17c12696d605bbb88", - "0x0000000000000000000000000000009b62cb539b9f366b0afb58fabaa44e4d6a", - "0x000000000000000000000000000000000002db8231d2555206a44704d148815f", - "0x00000000000000000000000000000071eb739e60844dbf8fe4a2497e4814ba10", - "0x000000000000000000000000000000000017224a4aeb150b55389a80b001d891", - "0x0000000000000000000000000000001bc31d8fe314083f029fa49d0bd57e9886", - "0x00000000000000000000000000000000001622ee6835627cd77e6af4349868c6", - "0x000000000000000000000000000000871ac800a816f01bab25ae11e91fe265cf", - "0x00000000000000000000000000000000000de628ea9f6f8927b9e288cd02a3b5", - "0x000000000000000000000000000000b3df87db452211210f3792526e99e5945a", - "0x00000000000000000000000000000000001844ebed80892d2ec8e7af36206a76", - "0x00000000000000000000000000000019b837e6d28692e6c6705ade951abb2ed7", - "0x00000000000000000000000000000000002074a622d7ff106f5b5c3bedb1ec0c", - "0x000000000000000000000000000000c6aa8ac39c35c0b6e14fa7664a69490e80", - "0x000000000000000000000000000000000002aa9bf7548ae3e3f864bea85d72df", - "0x000000000000000000000000000000d22ee91bea65f007418b9c7a3217acd957", - "0x000000000000000000000000000000000021fd628fc97d1e9e5296eae57d2f39", - "0x000000000000000000000000000000a264bd14b93ecf8316f9ffba3a47b468df", - "0x000000000000000000000000000000000029f77c8df0b6784115f16c9e891378", - "0x000000000000000000000000000000536c3cd3ff6672ae223ca208819234e72d", - "0x000000000000000000000000000000000014b3f5c4aa15524379cb8456bbaf86", - "0x00000000000000000000000000000085b0ed97a29b17f1c3d85774ecbb2f18c9", - "0x000000000000000000000000000000000019ffadb5418e1f7ac4bb4ec82598c3", - "0x000000000000000000000000000000256ccb468927dbe175db51cb84ed0584f9", - "0x000000000000000000000000000000000008d8032c33d889ac3f8b7d2749c14c", - "0x000000000000000000000000000000a6fb969f0064c94c7453eb1f700c9ddf21", - "0x000000000000000000000000000000000025f1c380479463f3648528c9d962ba", - "0x000000000000000000000000000000468708e77ce671f3fb24e16a0d293c9e5e", - "0x000000000000000000000000000000000029bce6e077cab900d532180a55a464", - "0x000000000000000000000000000000817c98127722255c0ee0bc8b9c7e515f0f", - "0x00000000000000000000000000000000000c454267f4046ada9b1267df1762b7", - "0x00000000000000000000000000000094b9dcde3aa9be048fe79cd676ee3dd282", - "0x000000000000000000000000000000000018694989d7c42d241ce9972b39845c", - "0x00000000000000000000000000000029547d3893b4c3399328cf40da2867dfa9", - "0x00000000000000000000000000000000002f888f7d619bf3dbffaae4748ac301", - "0x000000000000000000000000000000e420ccd42a6e490fc41fce12445e73e912", - "0x0000000000000000000000000000000000217af1e51572a0c5f9b60d64602831", - "0x000000000000000000000000000000f91bec2dde1e04dae492c854536c05136c", - "0x0000000000000000000000000000000000039d11cd46ee19c0d01bbf92fdce9c", - "0x0000000000000000000000000000005f0355a2cc355f86c3f42bfc2dd2d516b6", - "0x000000000000000000000000000000000019d70dd034f8901c4b8e356cd51f09", - "0x000000000000000000000000000000e3c219ea1329ee58b87b1d14ef5fc2da70", - "0x00000000000000000000000000000000002e96b13b163ffe4b07a0e667ed8fcb", - "0x00000000000000000000000000000084d928386288b7d9d70a37c16a4fad9b8d", - "0x00000000000000000000000000000000001ce08e8f9c31010f09fd2fe27b02b2", - "0x000000000000000000000000000000630966f03f6aa8b2dac36726f8e2b3c5b3", - "0x000000000000000000000000000000000013555d9bfcd1f13eed48fffa85bc8c", - "0x0000000000000000000000000000002baca943724a8fe0b97884771958934e5a", - "0x0000000000000000000000000000000000282fb3b18d49b3395fb34d72b8c392", - "0x00000000000000000000000000000085d1ebe6e5df08db7754cadef595ad858e", - "0x00000000000000000000000000000000001f3a892f0d944b019c8b3c8d00da0f", - "0x000000000000000000000000000000a2983ce44d445827f3a99df7cac721f7f5", - "0x000000000000000000000000000000000020d7548093ae3a9e0a967339d9eeff", - "0x0000000000000000000000000000006bcdac56e9fe483c48214af2d025ce32c7", - "0x00000000000000000000000000000000001d2766e3a4c532dfee3310fb730f2f", - "0x0000000000000000000000000000004600c5c674ccd36554df9ff9a53df7c9b0", - "0x0000000000000000000000000000000000213f4bd856c195404eb5474d0c5cbf", - "0x000000000000000000000000000000e27272553dd77bfd245852e45ad1687d04", - "0x00000000000000000000000000000000002452ea2b418dd94ca5e0d4a3a8ac5f", - "0x00000000000000000000000000000098443f2f524263675ce0efe0f57e1ee348", - "0x00000000000000000000000000000000002896c216c0e1d5693add6968e8b571", - "0x000000000000000000000000000000bb4e8fd85c1d16646f5b5b4455c525c7b0", - "0x00000000000000000000000000000000001ead44b4a96647d30caab22bab191e", - "0x000000000000000000000000000000e3cb7b601f7eed6dca3e591857166b4d1c", - "0x0000000000000000000000000000000000125aad145d0dbafb8da2dc1b0700bc", - "0x0000000000000000000000000000007a67f2caa5046f4d1dfc3a63469566de81", - "0x000000000000000000000000000000000022a98cee0b4cc5268adc92e2229271", - "0x000000000000000000000000000000f7c7c14a69ad0052dced057951a74436f5", - "0x0000000000000000000000000000000000263b96899c9835ce217f54f6df4acd", - "0x0000000000000000000000000000006c8c4e747cb6085c5735b9c68f2db633ac", - "0x00000000000000000000000000000000001157b26152b34ab05419f38acc15da", - "0x00000000000000000000000000000054cf89815a06c242c5e433264079487fc0", - "0x0000000000000000000000000000000000049a97286033e7c6c80520a963c7a1", - "0x00000000000000000000000000000077cb47275a750777c993d845849365ae73", - "0x00000000000000000000000000000000001bef3fe6a136f8f3419040fb2fb9a8", - "0x000000000000000000000000000000cb5bdeb788a62ab7fefa163b44aa4fe480", - "0x000000000000000000000000000000000019c8da60322e5b15147bb67ee97c3c", - "0x0000000000000000000000000000001f35e0f8d62d480f37b4aa13b09005e059", - "0x00000000000000000000000000000000002eaf8692eeea251928fb9c16523574", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000b82f4c7b24a7eb949025a3fb29aa15debb", - "0x00000000000000000000000000000000001525a4f8bab61cfd24dfe9c254ef33", - "0x00000000000000000000000000000005bba61a5fa776cc77e6d7969d1d458955", - "0x00000000000000000000000000000000001c346a3672483c830e3cec1c7f652e" -] -hash = "0x01c1214650df7c976a08450b978a8946857f45e3ad1e935b7a264e1c546842c4" - -[inputs.previous_rollup_data.vk_witness] -leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" -sibling_path = [ - "0x2ec70bf222e8f938bacada9560ac9e7b88f9f71c0220e86ae820d05feeb3c33c", - "0x19861a044ec84aaf6e41d02a20051d349f07206356e10a0846d4fa892534e306", - "0x2ab7a5c091cc8581f1e4c039e8e5513089defadfdb5799fb6e24e88ec3691678", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] - - [[inputs.previous_rollup_data]] -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs] -rollup_type = "0x0000000000000000000000000000000000000000000000000000000000000000" -num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" -txs_effects_hash = "0x00706230e919733628ff8960838f3eba8b454be8419757231aed9442017bceca" -out_hash = "0x00af81af3ec0bac6e50771820f11e11ab7ac6feed06a5a07e86470b957226b87" -accumulated_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" -accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants] - vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.last_archive] - root = "0x2a9a2323a4dd6a30e8d6cbef2ec01b51153c791bc2275b8659ede7a7c4dd29c3" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000008" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.note_hash_tree] -root = "0x246f7824ffde9c3e84aa3fe1e91588e3cde5388fa0a3810867c349c3ff20eba4" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.nullifier_tree] -root = "0x2e0ede9a948caff55be524cac113a328e7d1371fb30fae995bf3f759b7aa5fe6" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000440" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.public_data_tree] -root = "0x10fb4974ef102739e4c277b8d68ce6e4599edfefaafc78720afa564fdce953ec" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000431" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.note_hash_tree] -root = "0x1fa2aa7bcbfb6c178ef0506cc474909e5eefb9eda86bd5017a9c75c8f7ffc2d4" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.nullifier_tree] -root = "0x2e9d0d154d05251620ba24c0b52740ba9c1d0cfac95cba180b6f14039159802b" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000480" - -[inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.public_data_tree] -root = "0x0c0677063b9ccb206809eb6aea5165bd9a26490a2ad00703334ba941c9d29748" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000470" - -[inputs.previous_rollup_data.proof] -fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - -[inputs.previous_rollup_data.vk] -key = [ - "0x0000000000000000000000000000000000000000000000000000000002000000", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000cf7aae3b32ca469d2f4d8a50c545108793", - "0x000000000000000000000000000000000026c7f58b227bb11a7a07e90703a075", - "0x0000000000000000000000000000001779e9f1ebdcb0ca1d84c08f421c93d426", - "0x00000000000000000000000000000000002ebecedeb00025ef191427dfc03a70", - "0x000000000000000000000000000000387bf48c649f17aa11ce41732f34da2caa", - "0x0000000000000000000000000000000000154b6df3ae3e59669911aad19ba8cf", - "0x00000000000000000000000000000014d454a803987d756c8f2bbab83882a540", - "0x00000000000000000000000000000000001ab08c5e36abe25ff380dc3adb9bda", - "0x000000000000000000000000000000da77e17e4e68b7b1e455bec03e6e252fff", - "0x00000000000000000000000000000000001602b54c6fb1be67505c53835d04b5", - "0x00000000000000000000000000000005e0432c5876726787ffbb0762feaba6b1", - "0x0000000000000000000000000000000000094d1adda66fdbd7a9253998781016", - "0x000000000000000000000000000000c2601a4ccbc080e67cd00bf7d009cebf2a", - "0x0000000000000000000000000000000000196e55f78bd7061758ba437e24e6d3", - "0x000000000000000000000000000000d09742cde1f4a7ea0a9c0c75d42e19953f", - "0x000000000000000000000000000000000007ebaa6f5a81fa264544a3e3f2d957", - "0x000000000000000000000000000000a44e97ce02886ed0cf4e98daf7cb812893", - "0x00000000000000000000000000000000000e843e5994f9b9c449580f3635effc", - "0x000000000000000000000000000000a499c0a21cc98597d274c0b638e4648251", - "0x0000000000000000000000000000000000042d98fcad3c97caf60136088bb556", - "0x000000000000000000000000000000d264c197db47937b73339bf7df95c0d1dc", - "0x00000000000000000000000000000000000f85688ca6c4a17c12696d605bbb88", - "0x0000000000000000000000000000009b62cb539b9f366b0afb58fabaa44e4d6a", - "0x000000000000000000000000000000000002db8231d2555206a44704d148815f", - "0x00000000000000000000000000000071eb739e60844dbf8fe4a2497e4814ba10", - "0x000000000000000000000000000000000017224a4aeb150b55389a80b001d891", - "0x0000000000000000000000000000001bc31d8fe314083f029fa49d0bd57e9886", - "0x00000000000000000000000000000000001622ee6835627cd77e6af4349868c6", - "0x000000000000000000000000000000871ac800a816f01bab25ae11e91fe265cf", - "0x00000000000000000000000000000000000de628ea9f6f8927b9e288cd02a3b5", - "0x000000000000000000000000000000b3df87db452211210f3792526e99e5945a", - "0x00000000000000000000000000000000001844ebed80892d2ec8e7af36206a76", - "0x00000000000000000000000000000019b837e6d28692e6c6705ade951abb2ed7", - "0x00000000000000000000000000000000002074a622d7ff106f5b5c3bedb1ec0c", - "0x000000000000000000000000000000c6aa8ac39c35c0b6e14fa7664a69490e80", - "0x000000000000000000000000000000000002aa9bf7548ae3e3f864bea85d72df", - "0x000000000000000000000000000000d22ee91bea65f007418b9c7a3217acd957", - "0x000000000000000000000000000000000021fd628fc97d1e9e5296eae57d2f39", - "0x000000000000000000000000000000a264bd14b93ecf8316f9ffba3a47b468df", - "0x000000000000000000000000000000000029f77c8df0b6784115f16c9e891378", - "0x000000000000000000000000000000536c3cd3ff6672ae223ca208819234e72d", - "0x000000000000000000000000000000000014b3f5c4aa15524379cb8456bbaf86", - "0x00000000000000000000000000000085b0ed97a29b17f1c3d85774ecbb2f18c9", - "0x000000000000000000000000000000000019ffadb5418e1f7ac4bb4ec82598c3", - "0x000000000000000000000000000000256ccb468927dbe175db51cb84ed0584f9", - "0x000000000000000000000000000000000008d8032c33d889ac3f8b7d2749c14c", - "0x000000000000000000000000000000a6fb969f0064c94c7453eb1f700c9ddf21", - "0x000000000000000000000000000000000025f1c380479463f3648528c9d962ba", - "0x000000000000000000000000000000468708e77ce671f3fb24e16a0d293c9e5e", - "0x000000000000000000000000000000000029bce6e077cab900d532180a55a464", - "0x000000000000000000000000000000817c98127722255c0ee0bc8b9c7e515f0f", - "0x00000000000000000000000000000000000c454267f4046ada9b1267df1762b7", - "0x00000000000000000000000000000094b9dcde3aa9be048fe79cd676ee3dd282", - "0x000000000000000000000000000000000018694989d7c42d241ce9972b39845c", - "0x00000000000000000000000000000029547d3893b4c3399328cf40da2867dfa9", - "0x00000000000000000000000000000000002f888f7d619bf3dbffaae4748ac301", - "0x000000000000000000000000000000e420ccd42a6e490fc41fce12445e73e912", - "0x0000000000000000000000000000000000217af1e51572a0c5f9b60d64602831", - "0x000000000000000000000000000000f91bec2dde1e04dae492c854536c05136c", - "0x0000000000000000000000000000000000039d11cd46ee19c0d01bbf92fdce9c", - "0x0000000000000000000000000000005f0355a2cc355f86c3f42bfc2dd2d516b6", - "0x000000000000000000000000000000000019d70dd034f8901c4b8e356cd51f09", - "0x000000000000000000000000000000e3c219ea1329ee58b87b1d14ef5fc2da70", - "0x00000000000000000000000000000000002e96b13b163ffe4b07a0e667ed8fcb", - "0x00000000000000000000000000000084d928386288b7d9d70a37c16a4fad9b8d", - "0x00000000000000000000000000000000001ce08e8f9c31010f09fd2fe27b02b2", - "0x000000000000000000000000000000630966f03f6aa8b2dac36726f8e2b3c5b3", - "0x000000000000000000000000000000000013555d9bfcd1f13eed48fffa85bc8c", - "0x0000000000000000000000000000002baca943724a8fe0b97884771958934e5a", - "0x0000000000000000000000000000000000282fb3b18d49b3395fb34d72b8c392", - "0x00000000000000000000000000000085d1ebe6e5df08db7754cadef595ad858e", - "0x00000000000000000000000000000000001f3a892f0d944b019c8b3c8d00da0f", - "0x000000000000000000000000000000a2983ce44d445827f3a99df7cac721f7f5", - "0x000000000000000000000000000000000020d7548093ae3a9e0a967339d9eeff", - "0x0000000000000000000000000000006bcdac56e9fe483c48214af2d025ce32c7", - "0x00000000000000000000000000000000001d2766e3a4c532dfee3310fb730f2f", - "0x0000000000000000000000000000004600c5c674ccd36554df9ff9a53df7c9b0", - "0x0000000000000000000000000000000000213f4bd856c195404eb5474d0c5cbf", - "0x000000000000000000000000000000e27272553dd77bfd245852e45ad1687d04", - "0x00000000000000000000000000000000002452ea2b418dd94ca5e0d4a3a8ac5f", - "0x00000000000000000000000000000098443f2f524263675ce0efe0f57e1ee348", - "0x00000000000000000000000000000000002896c216c0e1d5693add6968e8b571", - "0x000000000000000000000000000000bb4e8fd85c1d16646f5b5b4455c525c7b0", - "0x00000000000000000000000000000000001ead44b4a96647d30caab22bab191e", - "0x000000000000000000000000000000e3cb7b601f7eed6dca3e591857166b4d1c", - "0x0000000000000000000000000000000000125aad145d0dbafb8da2dc1b0700bc", - "0x0000000000000000000000000000007a67f2caa5046f4d1dfc3a63469566de81", - "0x000000000000000000000000000000000022a98cee0b4cc5268adc92e2229271", - "0x000000000000000000000000000000f7c7c14a69ad0052dced057951a74436f5", - "0x0000000000000000000000000000000000263b96899c9835ce217f54f6df4acd", - "0x0000000000000000000000000000006c8c4e747cb6085c5735b9c68f2db633ac", - "0x00000000000000000000000000000000001157b26152b34ab05419f38acc15da", - "0x00000000000000000000000000000054cf89815a06c242c5e433264079487fc0", - "0x0000000000000000000000000000000000049a97286033e7c6c80520a963c7a1", - "0x00000000000000000000000000000077cb47275a750777c993d845849365ae73", - "0x00000000000000000000000000000000001bef3fe6a136f8f3419040fb2fb9a8", - "0x000000000000000000000000000000cb5bdeb788a62ab7fefa163b44aa4fe480", - "0x000000000000000000000000000000000019c8da60322e5b15147bb67ee97c3c", - "0x0000000000000000000000000000001f35e0f8d62d480f37b4aa13b09005e059", - "0x00000000000000000000000000000000002eaf8692eeea251928fb9c16523574", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000b82f4c7b24a7eb949025a3fb29aa15debb", - "0x00000000000000000000000000000000001525a4f8bab61cfd24dfe9c254ef33", - "0x00000000000000000000000000000005bba61a5fa776cc77e6d7969d1d458955", - "0x00000000000000000000000000000000001c346a3672483c830e3cec1c7f652e" -] -hash = "0x01c1214650df7c976a08450b978a8946857f45e3ad1e935b7a264e1c546842c4" - -[inputs.previous_rollup_data.vk_witness] -leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" -sibling_path = [ - "0x2ec70bf222e8f938bacada9560ac9e7b88f9f71c0220e86ae820d05feeb3c33c", - "0x19861a044ec84aaf6e41d02a20051d349f07206356e10a0846d4fa892534e306", - "0x2ab7a5c091cc8581f1e4c039e8e5513089defadfdb5799fb6e24e88ec3691678", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] - - [inputs.l1_to_l2_roots] - vk_path = [ - "0x161b493a1213baf6622d929c1fc116cc43fe1814a596e068cead7d06be55329d", - "0x24c0dd357a3755861112bf86f283e297630479062b83051291156b337205c428", - "0x2ab7a5c091cc8581f1e4c039e8e5513089defadfdb5799fb6e24e88ec3691678", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] - - [inputs.l1_to_l2_roots.proof] - fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - - [inputs.l1_to_l2_roots.verification_key] - key = [ - "0x0000000000000000000000000000000000000000000000000000000000400000", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x000000000000000000000000000000ef83b38b2adfeae9003ed25049bf5a8127", - "0x00000000000000000000000000000000002f6804ac00ed4ac9c12ff372dff4f1", - "0x000000000000000000000000000000cc77099ec2b643439807e7876fad2c9ba2", - "0x0000000000000000000000000000000000189fe72941b8761529cdec879e70c3", - "0x0000000000000000000000000000005c21f4d06f37d56db1519a1f0067f8325c", - "0x0000000000000000000000000000000000240f7fb629fc6fac9c01a15a81a29d", - "0x000000000000000000000000000000baad6c7e6298352fa7b24edf7dd5e1ebe6", - "0x00000000000000000000000000000000001d95172fd685cbacf6161e5faea826", - "0x00000000000000000000000000000071b58c3c1aea5098420025a2aaf4ebe3d4", - "0x00000000000000000000000000000000000dfb79669eb9b7661caa8d029d8286", - "0x0000000000000000000000000000005ee94b8c8879ad84db0b3e4c3f9a7543ff", - "0x00000000000000000000000000000000002bbb7fbd08328822904381b7fefead", - "0x000000000000000000000000000000576e5f08a5f41e12f28187f9786454cd5d", - "0x00000000000000000000000000000000001e71d3b1f2afcfb7477ba51110db5b", - "0x000000000000000000000000000000a4bca7718514674b6ab56109c42736ea7c", - "0x0000000000000000000000000000000000071b722c8d87bbfd0cf448c31f81bc", - "0x00000000000000000000000000000025b11596c239dae5057125d05eb8cc6557", - "0x00000000000000000000000000000000002a319a7045785ddbfd2e01866b63a1", - "0x000000000000000000000000000000eb8b982636ed767b93b8c6e944831b4f35", - "0x00000000000000000000000000000000000fa95738e669f13a780f2e532ac0c6", - "0x000000000000000000000000000000dd15bc2e2ba0e2c65e6a29ff0d76959549", - "0x00000000000000000000000000000000000ec94bcf6af94a2915bf1c2a310d4a", - "0x000000000000000000000000000000a5febcf1818fc85fae3fe27cf330f8f611", - "0x00000000000000000000000000000000002ea22d66ad35aebbb913d41f81ed36", - "0x000000000000000000000000000000183ba8d5faae59b85b2bca96ec6f2cd725", - "0x0000000000000000000000000000000000093c1fcf5f6e4778203fda698738d2", - "0x000000000000000000000000000000c3349712daded22564626cf8bf805ee156", - "0x00000000000000000000000000000000001200bfd0c056032a36740fa7c17d8a", - "0x000000000000000000000000000000f0442acb9227365fa391e5b24de1b8b829", - "0x00000000000000000000000000000000001efcbef4be20dafb606d9fe26ccb6d", - "0x0000000000000000000000000000000a3434c757b6cdf4e171e777c3f36f42e4", - "0x000000000000000000000000000000000027e62534f646bba5e31b7f99909e8a", - "0x00000000000000000000000000000079d48b61f1c30319e84d2db5cadf9db534", - "0x000000000000000000000000000000000006c22981c92b67b75a1a7e718205db", - "0x000000000000000000000000000000267ef0534bb1162f69b63c6074a9d959fc", - "0x0000000000000000000000000000000000052dba76a66b4133ecb9f2bca8c380", - "0x00000000000000000000000000000008b52c29909ad1bfa954da8e57ea4a066a", - "0x0000000000000000000000000000000000109ff22b42ffa34a1048d1cf7e85f2", - "0x000000000000000000000000000000cafab2f766bee54b3695ec724f8973f588", - "0x0000000000000000000000000000000000055bdea69cd65d01ffe3b7bf6e0abe", - "0x000000000000000000000000000000d0a224122ee5ebb826535f06f15adaba46", - "0x0000000000000000000000000000000000005c21930f20683a963e879e95e0eb", - "0x00000000000000000000000000000057ab4c4fbae63414a156791ecb00f1bc5a", - "0x000000000000000000000000000000000013a6918d60b19830c00e3972619e94", - "0x000000000000000000000000000000722c10b61e2f8387dec086bb464b884150", - "0x00000000000000000000000000000000000cdaf3a64ca4794ca238d7fcdcecb3", - "0x000000000000000000000000000000ba93532e80bcd28c489a8540829640a02f", - "0x00000000000000000000000000000000000dccd3477b06045551bbe751031249", - "0x00000000000000000000000000000033bd7a9cf0fd754e5df28e9a2e678c496d", - "0x00000000000000000000000000000000002dd95c5b299310b245d58792c40cdb", - "0x000000000000000000000000000000439b907e0a9aaf7069461801093dcab835", - "0x00000000000000000000000000000000001335daf28fe677041b7c2c0b53ea80", - "0x00000000000000000000000000000066505d6c6857e0ff6081bf191c7b501af8", - "0x0000000000000000000000000000000000036ea1a34f9dac9abd0443118e6a74", - "0x00000000000000000000000000000031c04a43642ef06a56d9951d837d2a77b8", - "0x000000000000000000000000000000000000613e5d8a161533954c2885c05d44", - "0x00000000000000000000000000000096112c8b51229d049e119f55ff16c0cc46", - "0x000000000000000000000000000000000025f4924d517cd360f35f94bdc7be6c", - "0x000000000000000000000000000000fdc27898080f429ff8620e35140200a58e", - "0x00000000000000000000000000000000001b6f39a89f4ebc48295e228b30abe8", - "0x000000000000000000000000000000f80b54e38cb801f342ab82d7354e219e33", - "0x00000000000000000000000000000000002bca4749a44bb3c577ee97897e7792", - "0x000000000000000000000000000000be5d5831c52353c0a74a70345214f349dc", - "0x000000000000000000000000000000000008aa5b88aa0e13dae13d9e43c9e695", - "0x000000000000000000000000000000fb8045f8e8895d666eb162235ac4c05631", - "0x0000000000000000000000000000000000088cfba36a0a4046b654b389fe511f", - "0x000000000000000000000000000000d29dd74fa0b498959f4845bf59e29302f1", - "0x00000000000000000000000000000000001f6f0668aa5bafc7ef1e5b045bb524", - "0x000000000000000000000000000000113fd70eae2ff08f9e67846bdbb99fecc6", - "0x00000000000000000000000000000000000d6365aa67ac09db2d9a68e4e3b266", - "0x000000000000000000000000000000f178bd7fd4e507267f274cbb47b7707ca0", - "0x0000000000000000000000000000000000067ba20a9d7417f34586a9efd52440", - "0x000000000000000000000000000000521c51f8b15b4d56afa135439f639f760c", - "0x000000000000000000000000000000000018e56583282afa9f1b8537ecae629a", - "0x000000000000000000000000000000e605e75816e2ea9f583d44a0a1733ed1c7", - "0x000000000000000000000000000000000017f7dc0243458b7e84142310fbc98c", - "0x0000000000000000000000000000004c414c873d55767084c7efd12649cf484d", - "0x00000000000000000000000000000000000b76024cf3afa7d296c0552a8b9162", - "0x000000000000000000000000000000dd7e743cdf36e28ca926a5a72a077a582b", - "0x00000000000000000000000000000000000221356b123f38d03cd61faaf8c1b9", - "0x000000000000000000000000000000a87eae59bb0c50c7ae7e9eb63329456478", - "0x00000000000000000000000000000000002f1aebfba475c3c5e5b7aef25dc0d4", - "0x00000000000000000000000000000096f2dc2660b1528b582196a321fa22156b", - "0x00000000000000000000000000000000001c1d153734760312cadebc84e5deb2", - "0x0000000000000000000000000000009994cda75e4b4d76adecefc5fdfaedd890", - "0x0000000000000000000000000000000000292a4c0c5e217951a2a035377ca7c1", - "0x00000000000000000000000000000071dac06b84fbc70b0ea6fa4b967228ee05", - "0x00000000000000000000000000000000002c608447811602745e0220080f4f2e", - "0x0000000000000000000000000000002e4e72704b61a701fa7137313db1168d05", - "0x00000000000000000000000000000000001fc5345c8f1f0eabd4ce83d09bef6b", - "0x000000000000000000000000000000ffff1b7f5093c84b02d134afc0636c1d8f", - "0x00000000000000000000000000000000002c37e011d34a90133668385615c3ce", - "0x0000000000000000000000000000008cd6f83b1d4cf06810d804be0a1dfcb0eb", - "0x0000000000000000000000000000000000264144a05a6313cce7e4735f77b75e", - "0x0000000000000000000000000000003709f8978d2f3806ac989432cf46ab52b2", - "0x00000000000000000000000000000000000a0dc9cba8aa7d2b1991b6ce6ab8dd", - "0x000000000000000000000000000000bc7da4a5cd763a1a5cf1acba2e654e5985", - "0x00000000000000000000000000000000000a35e16ef55d15ea0182640e03d71f", - "0x000000000000000000000000000000716bd4734483981c1dfef425096a3cc48c", - "0x00000000000000000000000000000000000e0aeb4c2362bda3b93ec82e1dc9c0", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000bffaa2c460088fff6bb2fd98d4eb2db429", - "0x000000000000000000000000000000000015d2c8f918e40e39044cf6837a606b", - "0x0000000000000000000000000000006852404c6e5ad16e7f7145667ca7f936c2", - "0x00000000000000000000000000000000001df468a82cff18d9fa14a32dd6e09a" -] - hash = "0x2e0cce49628efb36cd158bf4a421fbb6bbc1bd1d4d61a9a07a6d72eac792e035" - - [inputs.l1_to_l2_roots.public_inputs] - sha_root = "0x00089a9d421a82c4a25f7acbebe69e638d5b064fa8a60e018793dcb0be53752c" - converted_root = "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e" - vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" - - [inputs.start_l1_to_l2_message_tree_snapshot] - root = "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000070" - - [inputs.start_archive_snapshot] - root = "0x2a9a2323a4dd6a30e8d6cbef2ec01b51153c791bc2275b8659ede7a7c4dd29c3" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/Nargo.toml b/noir-projects/noir-protocol-circuits/crates/rollup-lib/Nargo.toml index 9f7956eb265..3cab422d3f6 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/Nargo.toml +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/Nargo.toml @@ -7,3 +7,4 @@ compiler_version = ">=0.18.0" [dependencies] types = { path = "../types" } parity_lib = { path = "../parity-lib" } +blob = { path = "../blob" } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr index 33e49dd4384..155471c7962 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/base_or_merge_rollup_public_inputs.nr @@ -1,5 +1,5 @@ -use crate::abis::constant_rollup_data::ConstantRollupData; use dep::types::{ + abis::{constant_rollup_data::ConstantRollupData, sponge_blob::SpongeBlob}, constants::BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH, partial_state_reference::PartialStateReference, traits::{Deserialize, Empty, Serialize}, @@ -19,12 +19,15 @@ pub struct BaseOrMergeRollupPublicInputs { pub(crate) start: PartialStateReference, pub(crate) end: PartialStateReference, + // A poseidon sponge of all tx effects to be unpacked in block root, then added to blob(s) + // In sponge form so we can check left.end == right.start, rather than recreate a tree later + pub(crate) start_sponge_blob: SpongeBlob, + pub(crate) end_sponge_blob: SpongeBlob, + // We hash public inputs to make them constant-sized (to then be unpacked on-chain) // U128 isn't safe if it's an input to the circuit (it won't automatically constrain the witness) // So we want to constrain it when casting these fields to U128 - // We hash public inputs to make them constant-sized (to then be unpacked on-chain) - pub(crate) txs_effects_hash: Field, pub(crate) out_hash: Field, pub(crate) accumulated_fees: Field, @@ -39,7 +42,8 @@ impl Empty for BaseOrMergeRollupPublicInputs { constants: ConstantRollupData::empty(), start: PartialStateReference::empty(), end: PartialStateReference::empty(), - txs_effects_hash: 0, + start_sponge_blob: SpongeBlob::empty(), + end_sponge_blob: SpongeBlob::empty(), out_hash: 0, accumulated_fees: 0, accumulated_mana_used: 0, @@ -54,7 +58,8 @@ impl Eq for BaseOrMergeRollupPublicInputs { & (self.constants.eq(other.constants)) & (self.start.eq(other.start)) & (self.end.eq(other.end)) - & (self.txs_effects_hash == other.txs_effects_hash) + & (self.start_sponge_blob.eq(other.start_sponge_blob)) + & (self.end_sponge_blob.eq(other.end_sponge_blob)) & (self.out_hash == other.out_hash) & (self.accumulated_fees == other.accumulated_fees) & (self.accumulated_mana_used == other.accumulated_mana_used) @@ -70,7 +75,8 @@ impl Serialize for BaseOrMergeRollupPublicIn fields.extend_from_array(self.constants.serialize()); fields.extend_from_array(self.start.serialize()); fields.extend_from_array(self.end.serialize()); - fields.push(self.txs_effects_hash as Field); + fields.extend_from_array(self.start_sponge_blob.serialize()); + fields.extend_from_array(self.end_sponge_blob.serialize()); fields.push(self.out_hash as Field); fields.push(self.accumulated_fees as Field); fields.push(self.accumulated_mana_used as Field); @@ -91,7 +97,8 @@ impl Deserialize for BaseOrMergeRollupPublic constants: reader.read_struct(ConstantRollupData::deserialize), start: reader.read_struct(PartialStateReference::deserialize), end: reader.read_struct(PartialStateReference::deserialize), - txs_effects_hash: reader.read(), + start_sponge_blob: reader.read_struct(SpongeBlob::deserialize), + end_sponge_blob: reader.read_struct(SpongeBlob::deserialize), out_hash: reader.read(), accumulated_fees: reader.read(), accumulated_mana_used: reader.read(), diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr index 5834b57303e..6a1a6c2b8ea 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/block_root_or_block_merge_public_inputs.nr @@ -8,6 +8,7 @@ use dep::types::{ traits::{Deserialize, Empty, Serialize}, utils::reader::Reader, }; +use blob::blob_public_inputs::BlockBlobPublicInputs; pub struct FeeRecipient { pub recipient: EthAddress, @@ -17,7 +18,7 @@ pub struct FeeRecipient { // TODO(#7346): Should the default empty value be MAX_FIELD? The zero addr may be a valid recipient impl Empty for FeeRecipient { fn empty() -> Self { - FeeRecipient { recipient: EthAddress::zero(), value: 0 } + Self { recipient: EthAddress::zero(), value: 0 } } } @@ -53,6 +54,7 @@ pub struct BlockRootOrBlockMergePublicInputs { pub vk_tree_root: Field, // Root of allowed vk tree pub protocol_contract_tree_root: Field, // Root of protocol contract tree pub prover_id: Field, // TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 + pub blob_public_inputs: [BlockBlobPublicInputs; AZTEC_MAX_EPOCH_DURATION], // z, y, and C s.t. p(z) = y and C commits to p, for blob verification } impl BlockRootOrBlockMergePublicInputs { @@ -75,6 +77,7 @@ impl Empty for BlockRootOrBlockMergePublicInputs { vk_tree_root: 0, protocol_contract_tree_root: 0, prover_id: 0, + blob_public_inputs: [BlockBlobPublicInputs::empty(); AZTEC_MAX_EPOCH_DURATION], } } } @@ -92,6 +95,7 @@ impl Eq for BlockRootOrBlockMergePublicInputs { & (self.vk_tree_root == other.vk_tree_root) & (self.protocol_contract_tree_root == other.protocol_contract_tree_root) & (self.prover_id == other.prover_id) + & (self.blob_public_inputs.eq(other.blob_public_inputs)) } } @@ -113,6 +117,9 @@ impl Serialize for BlockRootOrBl fields.push(self.vk_tree_root); fields.push(self.protocol_contract_tree_root); fields.push(self.prover_id as Field); + for i in 0..AZTEC_MAX_EPOCH_DURATION { + fields.extend_from_array(self.blob_public_inputs[i].serialize()); + } assert_eq(fields.len(), BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH); fields.storage() @@ -139,6 +146,10 @@ impl Deserialize for BlockRootOr vk_tree_root: reader.read(), protocol_contract_tree_root: reader.read(), prover_id: reader.read(), + blob_public_inputs: reader.read_struct_array( + BlockBlobPublicInputs::deserialize, + [BlockBlobPublicInputs::empty(); AZTEC_MAX_EPOCH_DURATION], + ), }; reader.finish(); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/mod.nr index 716b67bf953..0bcaaa80b27 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/mod.nr @@ -1,4 +1,3 @@ -pub(crate) mod constant_rollup_data; pub(crate) mod base_or_merge_rollup_public_inputs; pub(crate) mod block_root_or_block_merge_public_inputs; pub(crate) mod previous_rollup_data; diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/constants.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/constants.nr index 0e7f459fecd..dbe2eb34fd6 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/constants.nr @@ -1,5 +1,6 @@ -use crate::abis::constant_rollup_data::ConstantRollupData; -use types::abis::combined_constant_data::CombinedConstantData; +use types::abis::{ + combined_constant_data::CombinedConstantData, constant_rollup_data::ConstantRollupData, +}; pub(crate) fn validate_combined_constant_data( constants: CombinedConstantData, diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/mod.nr index 9e3e70f9433..1831a1cc730 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/mod.nr @@ -3,3 +3,11 @@ pub(crate) mod constants; pub(crate) mod fees; pub(crate) mod nullifier_tree; pub(crate) mod public_data_tree; + +mod private_tube_data_validator; +mod public_tube_data_validator; +pub(crate) mod private_base_rollup_output_composer; +pub(crate) mod validate_tube_data; + +pub(crate) use private_tube_data_validator::PrivateTubeDataValidator; +pub(crate) use public_tube_data_validator::PublicTubeDataValidator; diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/compute_transaction_fee.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/compute_transaction_fee.nr new file mode 100644 index 00000000000..67c1b9a5eb4 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/compute_transaction_fee.nr @@ -0,0 +1,97 @@ +use types::abis::{gas::Gas, gas_fees::GasFees, gas_settings::GasSettings}; + +pub fn compute_transaction_fee( + gas_fees: GasFees, + gas_settings: GasSettings, + gas_used: Gas, +) -> Field { + let max_priority_fees = gas_settings.max_priority_fees_per_gas; + let max_fees = gas_settings.max_fees_per_gas; + // max_fees are guaranteed to be greater than or equal to gas_fees, which is checked in tube_data_validator. + let priority_fees = GasFees::new( + dep::types::utils::field::min( + max_priority_fees.fee_per_da_gas, + max_fees.fee_per_da_gas - gas_fees.fee_per_da_gas, + ), + dep::types::utils::field::min( + max_priority_fees.fee_per_l2_gas, + max_fees.fee_per_l2_gas - gas_fees.fee_per_l2_gas, + ), + ); + + let total_fees = GasFees::new( + gas_fees.fee_per_da_gas + priority_fees.fee_per_da_gas, + gas_fees.fee_per_l2_gas + priority_fees.fee_per_l2_gas, + ); + + gas_used.compute_fee(total_fees) +} + +mod tests { + use super::compute_transaction_fee; + use types::abis::{gas::Gas, gas_fees::GasFees, gas_settings::GasSettings}; + + struct TestBuilder { + gas_fees: GasFees, + gas_settings: GasSettings, + gas_used: Gas, + } + + impl TestBuilder { + pub fn new() -> Self { + let gas_fees = GasFees::new(12, 34); + + let mut gas_settings = GasSettings::empty(); + gas_settings.max_fees_per_gas = GasFees::new(56, 78); + gas_settings.max_priority_fees_per_gas = GasFees::new(5, 7); + + let gas_used = Gas::new(2, 3); + + TestBuilder { gas_fees, gas_settings, gas_used } + } + + pub fn compute(self) -> Field { + compute_transaction_fee(self.gas_fees, self.gas_settings, self.gas_used) + } + } + + #[test] + fn compute_transaction_fee_default() { + let builder = TestBuilder::new(); + let fee = builder.compute(); + + // Make sure the following value matches the one in `transaction_fee.test.ts` in `circuits.js`. + // Paying gas_fees + max_priority_fees. + let expected_fee = 2 * (12 + 5) + 3 * (34 + 7); + assert_eq(fee, expected_fee); + } + + #[test] + fn compute_transaction_fee_zero_priority_fees() { + let mut builder = TestBuilder::new(); + + builder.gas_settings.max_priority_fees_per_gas = GasFees::empty(); + + let fee = builder.compute(); + + // Make sure the following value matches the one in `transaction_fee.test.ts` in `circuits.js`. + // Paying gas_fees only. + let expected_fee_empty_priority = 2 * 12 + 3 * 34; + assert_eq(fee, expected_fee_empty_priority); + } + + #[test] + fn compute_transaction_fee_capped_max_fees() { + let mut builder = TestBuilder::new(); + + // Increase gas_fees so that gas_fees + max_priority_fees > max_fees. + builder.gas_fees = GasFees::new(53, 74); + + let fee = builder.compute(); + + // Make sure the following value matches the one in `transaction_fee.test.ts` in `circuits.js`. + // max_fees were applied. + let expected_max_fee = 2 * 56 + 3 * 78; + assert_eq(fee, expected_max_fee); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/mod.nr new file mode 100644 index 00000000000..83e15e4b4ee --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/mod.nr @@ -0,0 +1,5 @@ +mod compute_transaction_fee; + +pub use compute_transaction_fee::compute_transaction_fee; + +// TODO: Move everything that composes the output of private base rollup to this component. diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_tube_data_validator.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_tube_data_validator.nr new file mode 100644 index 00000000000..8027741142f --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_tube_data_validator.nr @@ -0,0 +1,28 @@ +use super::validate_tube_data::validate_max_fees_per_gas; +use dep::types::abis::{constant_rollup_data::ConstantRollupData, tube::PrivateTubeData}; + +pub struct PrivateTubeDataValidator { + pub data: PrivateTubeData, +} + +// TODO: Move relevant verifications here. +impl PrivateTubeDataValidator { + pub fn new(data: PrivateTubeData) -> Self { + PrivateTubeDataValidator { data } + } + + pub fn verify_proof(self, _allowed_previous_circuits: [u32; N]) { + if !dep::std::runtime::is_unconstrained() { + self.data.verify(); + // TODO(#7410) + // self.data.vk_data.validate_in_vk_tree(self.data.public_inputs.constants.vk_tree_root, allowed_previous_circuits); + } + } + + pub fn validate_with_rollup_data(self, constants: ConstantRollupData) { + validate_max_fees_per_gas( + self.data.public_inputs.constants.tx_context.gas_settings.max_fees_per_gas, + constants.global_variables.gas_fees, + ); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/public_tube_data_validator.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/public_tube_data_validator.nr new file mode 100644 index 00000000000..6edeb1ad88b --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/public_tube_data_validator.nr @@ -0,0 +1,28 @@ +use super::validate_tube_data::validate_max_fees_per_gas; +use dep::types::abis::{constant_rollup_data::ConstantRollupData, tube::PublicTubeData}; + +pub struct PublicTubeDataValidator { + pub data: PublicTubeData, +} + +// TODO: Move relevant verifications here. +impl PublicTubeDataValidator { + pub fn new(data: PublicTubeData) -> Self { + PublicTubeDataValidator { data } + } + + pub fn verify_proof(self) { + if !dep::std::runtime::is_unconstrained() { + self.data.verify(); + // TODO(#7410) + // self.tube_data.vk_data.validate_in_vk_tree(self.tube_data.public_inputs.constants.vk_tree_root, ALLOWED_PREVIOUS_CIRCUITS); + } + } + + pub fn validate_with_rollup_data(self, constants: ConstantRollupData) { + validate_max_fees_per_gas( + self.data.public_inputs.constants.tx_context.gas_settings.max_fees_per_gas, + constants.global_variables.gas_fees, + ); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/validate_tube_data.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/validate_tube_data.nr new file mode 100644 index 00000000000..3c815f2d235 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/validate_tube_data.nr @@ -0,0 +1,12 @@ +use dep::types::abis::gas_fees::GasFees; + +pub fn validate_max_fees_per_gas(max_fees_per_gas: GasFees, gas_fees: GasFees) { + assert( + !max_fees_per_gas.fee_per_da_gas.lt(gas_fees.fee_per_da_gas), + "da gas is higher than the maximum specified by the tx", + ); + assert( + !max_fees_per_gas.fee_per_l2_gas.lt(gas_fees.fee_per_l2_gas), + "l2 gas is higher than the maximum specified by the tx", + ); +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/mod.nr index 03b442b4eaa..9b9bc52e9bd 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/mod.nr @@ -2,6 +2,7 @@ pub(crate) mod components; pub(crate) mod state_diff_hints; mod private_base_rollup; mod public_base_rollup; +mod tests; pub use crate::abis::base_or_merge_rollup_public_inputs::BaseOrMergeRollupPublicInputs; pub use private_base_rollup::PrivateBaseRollupInputs; diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr index ff3347285ef..d27dcd2b467 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/private_base_rollup.nr @@ -1,26 +1,26 @@ use crate::{ - abis::{ - base_or_merge_rollup_public_inputs::{BASE_ROLLUP_TYPE, BaseOrMergeRollupPublicInputs}, - constant_rollup_data::ConstantRollupData, - }, + abis::base_or_merge_rollup_public_inputs::{BASE_ROLLUP_TYPE, BaseOrMergeRollupPublicInputs}, base::{ components::{ archive::perform_archive_membership_check, constants::validate_combined_constant_data, fees::compute_fee_payer_fee_juice_balance_leaf_slot, - nullifier_tree::nullifier_tree_batch_insert, public_data_tree::public_data_tree_insert, + nullifier_tree::nullifier_tree_batch_insert, + private_base_rollup_output_composer::compute_transaction_fee, PrivateTubeDataValidator, + public_data_tree::public_data_tree_insert, }, state_diff_hints::PrivateBaseStateDiffHints, }, - components::{compute_kernel_out_hash, compute_tx_effects_hash}, + components::{append_tx_effects_for_blob, compute_kernel_out_hash}, }; use dep::types::{ abis::{ - append_only_tree_snapshot::AppendOnlyTreeSnapshot, + append_only_tree_snapshot::AppendOnlyTreeSnapshot, constant_rollup_data::ConstantRollupData, nullifier_leaf_preimage::NullifierLeafPreimage, public_data_write::PublicDataWrite, - tube::PrivateTubeData, + sponge_blob::SpongeBlob, tube::PrivateTubeData, }, constants::{ ARCHIVE_HEIGHT, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, + TUBE_VK_INDEX, }, data::{hash::compute_public_data_tree_value, public_data_hint::PublicDataHint}, hash::silo_l2_to_l1_message, @@ -32,12 +32,13 @@ use dep::types::{ traits::is_empty, }; -// global ALLOWED_PREVIOUS_CIRCUITS: [u32; 2] = [PRIVATE_KERNEL_EMPTY_INDEX, TUBE_VK_INDEX]; +global ALLOWED_PREVIOUS_CIRCUITS: [u32; 1] = [TUBE_VK_INDEX]; pub struct PrivateBaseRollupInputs { tube_data: PrivateTubeData, start: PartialStateReference, + start_sponge_blob: SpongeBlob, state_diff_hints: PrivateBaseStateDiffHints, fee_payer_fee_juice_balance_read_hint: PublicDataHint, @@ -47,21 +48,17 @@ pub struct PrivateBaseRollupInputs { } impl PrivateBaseRollupInputs { - fn compute_transaction_fee(self) -> Field { - let gas_fees = self.constants.global_variables.gas_fees; - let gas_used = self.tube_data.public_inputs.gas_used; - gas_used.compute_fee(gas_fees) - } - pub fn execute(self) -> BaseOrMergeRollupPublicInputs { - if !dep::std::runtime::is_unconstrained() { - self.tube_data.verify(); - // TODO(#7410) - // self.tube_data.vk_data.validate_in_vk_tree(self.tube_data.public_inputs.constants.vk_tree_root, ALLOWED_PREVIOUS_CIRCUITS); + // TODO(#10311): There should be an empty base rollup. + // There's at least 1 nullifier for a tx. So gas_used won't be empty if the previous circuit is private_tail. + let is_empty_tube = self.tube_data.public_inputs.gas_used.is_empty(); + + let tube_data_validator = PrivateTubeDataValidator::new(self.tube_data); + tube_data_validator.verify_proof(ALLOWED_PREVIOUS_CIRCUITS); + if !is_empty_tube { + tube_data_validator.validate_with_rollup_data(self.constants); } - let transaction_fee = self.compute_transaction_fee(); - validate_combined_constant_data(self.tube_data.public_inputs.constants, self.constants); self.validate_kernel_start_state(); @@ -94,6 +91,12 @@ impl PrivateBaseRollupInputs { let end_nullifier_tree_snapshot = self.check_nullifier_tree_non_membership_and_insert_to_tree(); + let transaction_fee = compute_transaction_fee( + self.constants.global_variables.gas_fees, + self.tube_data.public_inputs.constants.tx_context.gas_settings, + self.tube_data.public_inputs.gas_used, + ); + // Write fee to public data tree let fee_public_data_write = self.build_fee_public_data_write(transaction_fee); let end_public_data_tree_snapshot = @@ -102,7 +105,7 @@ impl PrivateBaseRollupInputs { [PublicDataWrite::empty(); MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]; all_public_data_update_requests[0] = fee_public_data_write; - // Calculate the tx effects hash of the transaction + // Append the tx effects for blob(s) let siloed_l2_to_l1_msgs = self.tube_data.public_inputs.end.l2_to_l1_msgs.map( |message: ScopedL2ToL1Message| silo_l2_to_l1_message( message, @@ -111,12 +114,13 @@ impl PrivateBaseRollupInputs { ), ); let out_hash = compute_kernel_out_hash(siloed_l2_to_l1_msgs); - let tx_effects_hash = compute_tx_effects_hash( + let end_sponge_blob = append_tx_effects_for_blob( self.tube_data.public_inputs.end, self.tube_data.public_inputs.revert_code, transaction_fee, all_public_data_update_requests, - out_hash, + siloed_l2_to_l1_msgs, + self.start_sponge_blob, ); // Perform membership checks that the notes provided exist within the historical trees data @@ -136,7 +140,8 @@ impl PrivateBaseRollupInputs { nullifier_tree: end_nullifier_tree_snapshot, public_data_tree: end_public_data_tree_snapshot, }, - txs_effects_hash: tx_effects_hash, + start_sponge_blob: self.start_sponge_blob, + end_sponge_blob, out_hash, accumulated_fees: transaction_fee, accumulated_mana_used: self.tube_data.public_inputs.gas_used.l2_gas as Field, @@ -220,29 +225,35 @@ impl PrivateBaseRollupInputs { mod tests { use crate::{ - abis::{ - base_or_merge_rollup_public_inputs::BaseOrMergeRollupPublicInputs, - constant_rollup_data::ConstantRollupData, - }, + abis::base_or_merge_rollup_public_inputs::BaseOrMergeRollupPublicInputs, base::{ components::fees::compute_fee_payer_fee_juice_balance_leaf_slot, private_base_rollup::PrivateBaseRollupInputs, state_diff_hints::PrivateBaseStateDiffHints, }, - components::TX_EFFECTS_HASH_INPUT_FIELDS, + components::{ + append_tx_effects_for_blob, encode_blob_prefix, TX_EFFECTS_BLOB_HASH_INPUT_FIELDS, + }, }; use dep::types::{ abis::{ - append_only_tree_snapshot::AppendOnlyTreeSnapshot, gas::Gas, gas_fees::GasFees, + accumulated_data::CombinedAccumulatedData, + append_only_tree_snapshot::AppendOnlyTreeSnapshot, + constant_rollup_data::ConstantRollupData, gas::Gas, gas_fees::GasFees, kernel_circuit_public_inputs::KernelCircuitPublicInputs, - nullifier_leaf_preimage::NullifierLeafPreimage, + nullifier_leaf_preimage::NullifierLeafPreimage, public_data_write::PublicDataWrite, + sponge_blob::SpongeBlob, }, address::{AztecAddress, EthAddress}, constants::{ - ARCHIVE_HEIGHT, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, - NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NOTE_HASH_TREE_HEIGHT, + ARCHIVE_HEIGHT, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, MAX_L2_TO_L1_MSGS_PER_TX, + MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, + NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NOTE_HASH_TREE_HEIGHT, NOTES_PREFIX, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, - PRIVATE_KERNEL_EMPTY_INDEX, PUBLIC_DATA_TREE_HEIGHT, TUBE_VK_INDEX, + NULLIFIERS_PREFIX, PRIVATE_KERNEL_EMPTY_INDEX, PRIVATE_LOG_SIZE_IN_FIELDS, + PRIVATE_LOGS_PREFIX, PUBLIC_DATA_TREE_HEIGHT, REVERT_CODE_PREFIX, TUBE_VK_INDEX, + TX_FEE_PREFIX, TX_START_PREFIX, UNENCRYPTED_LOGS_PREFIX, }, data::{public_data_hint::PublicDataHint, PublicDataTreeLeaf, PublicDataTreeLeafPreimage}, hash::silo_l2_to_l1_message, @@ -256,8 +267,8 @@ mod tests { }, traits::{Empty, is_empty}, utils::{ - arrays::get_sorted_tuple::get_sorted_tuple, - field::{field_from_bytes_32_trunc, full_field_less_than}, + arrays::{array_concat, get_sorted_tuple::get_sorted_tuple}, + field::{field_from_bytes, full_field_less_than}, }, }; @@ -379,6 +390,36 @@ mod tests { ) } + fn compute_transaction_fee(self) -> Field { + let gas_fees = self.constants.global_variables.gas_fees; + let gas_used = self.tube_data.gas_used; + gas_used.compute_fee(gas_fees) + } + + fn build_pre_existing_tx_effects( + self, + ) -> (CombinedAccumulatedData, [PublicDataWrite; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]) { + let mut res = CombinedAccumulatedData::empty(); + res.note_hashes = self.pre_existing_notes; + res.nullifiers = self.pre_existing_nullifiers.map(|nullifier: NullifierLeafPreimage| { + nullifier.nullifier + }); + let all_public_data_update_requests = self.pre_existing_public_data.map( + |leaf_preimage: PublicDataTreeLeafPreimage| { + PublicDataWrite { leaf_slot: leaf_preimage.slot, value: leaf_preimage.value } + }, + ); + let padded_all_public_data_update_requests = array_concat( + all_public_data_update_requests, + [ + PublicDataWrite::empty(); MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + - PRE_EXISTING_PUBLIC_DATA_LEAVES + ], + ); + + (res, padded_all_public_data_update_requests) + } + fn extract_subtree_sibling_path( path: [Field; FULL_HEIGHT], mut sibling_path: [Field; SIBLING_PATH_LENGTH], @@ -542,6 +583,18 @@ mod tests { public_data_tree: start_public_data_tree_snapshot, }; + let (pre_existing_tx_effects, pre_existing_public_data_update_requests) = + self.build_pre_existing_tx_effects(); + + let start_sponge_blob = append_tx_effects_for_blob( + pre_existing_tx_effects, + 0, + 0, + pre_existing_public_data_update_requests, + [0; MAX_L2_TO_L1_MSGS_PER_TX], + SpongeBlob::new(TX_EFFECTS_BLOB_HASH_INPUT_FIELDS), + ); + let state_diff_hints = PrivateBaseStateDiffHints { nullifier_predecessor_preimages, nullifier_predecessor_membership_witnesses, @@ -557,6 +610,7 @@ mod tests { PrivateBaseRollupInputs { tube_data, start, + start_sponge_blob, state_diff_hints, archive_root_membership_witness: MembershipWitness { leaf_index: 0, @@ -771,13 +825,187 @@ mod tests { } #[test] - unconstrained fn empty_tx_effects_hash() { + unconstrained fn empty_tx_effects_sponge() { let outputs = PrivateBaseRollupInputsBuilder::new().execute(); + let mut expected_sponge = outputs.start_sponge_blob; + assert(outputs.end_sponge_blob.eq(expected_sponge)); + } + + #[test] + unconstrained fn non_empty_tx_effects_sponge() { + let mut builder = PrivateBaseRollupInputsBuilder::new(); + builder.tube_data.append_note_hashes(50); + let outputs = builder.execute(); + let mut tx_effects = [0; 53]; + // TODO(#8954): This test uses 50 notes and 3 extra absorbed fields + // This may change when logs are deconstructed + // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // The first 3 are: i=0 init field, i=1: tx fee, i=2: note prefix + tx_effects[0] = field_from_bytes( + array_concat( + TX_START_PREFIX.to_be_bytes::<8>(), + [0, 0, tx_effects.len() as u8, 0, REVERT_CODE_PREFIX, 0, 0], + ), + true, + ); + tx_effects[1] = field_from_bytes( + array_concat([TX_FEE_PREFIX, 0], (0).to_be_bytes::<29>()), + true, + ); + tx_effects[2] = encode_blob_prefix(NOTES_PREFIX, 50); + for i in 0..50 { + tx_effects[i + 3] = builder.tube_data.note_hashes.storage()[i].value(); + } + let mut expected_sponge = outputs.start_sponge_blob; + + expected_sponge.absorb(tx_effects, tx_effects.len()); + assert(outputs.end_sponge_blob.eq(expected_sponge)); + } + + #[test] + unconstrained fn fuller_tx_effects_sponge() { + let NUM_NOTES = 25; + let NUM_NULLIFIERS = 3; + let NUM_MSGS = 5; + let NUM_PRIV_EVENT_LOGS = 4; + let NUM_UNENC_LOGS = 6; + let NUM_CC_LOGS = 1; + let TOTAL_BLOB_FIELDS = 2 // revert code and tx fee + + NUM_NOTES + + 1 // notes and prefix + + NUM_NULLIFIERS + + 1 // nullifiers and prefix + + NUM_MSGS + + 1 // L2 to L1 msgs and prefix + + NUM_UNENC_LOGS + + 1 // unenc. logs and prefix + + NUM_CC_LOGS + + 1 // contract class logs and prefix + + (NUM_NOTES + NUM_PRIV_EVENT_LOGS) * PRIVATE_LOG_SIZE_IN_FIELDS + + 1; // private logs and prefix + let mut builder = PrivateBaseRollupInputsBuilder::new(); + builder.tube_data.set_gas_used(100, 200); + builder.constants.global_variables.gas_fees.fee_per_da_gas = 1; + builder.constants.global_variables.gas_fees.fee_per_l2_gas = 1; + builder.tube_data.tx_context.gas_settings.max_fees_per_gas.fee_per_da_gas = 1; + builder.tube_data.tx_context.gas_settings.max_fees_per_gas.fee_per_l2_gas = 1; + let tx_fee = builder.compute_transaction_fee(); + // builder.transaction_fee = tx_fee; + builder.tube_data.append_note_hashes_with_logs(NUM_NOTES); + // Copied from nullifier tests above: + builder.pre_existing_nullifiers[0] = + NullifierLeafPreimage { nullifier: 0, next_nullifier: 7, next_index: 1 }; + builder.pre_existing_nullifiers[1] = + NullifierLeafPreimage { nullifier: 7, next_nullifier: 0, next_index: 0 }; + for i in 0..NUM_NULLIFIERS { + builder.nullifiers.push( + NullifierInsertion { existing_index: 1, value: (8 + i) as Field }, + ); + } + builder.tube_data.append_l2_to_l1_msgs(NUM_MSGS); + // Copied from public data test below: + builder.pre_existing_public_data[0] = + PublicDataTreeLeafPreimage { slot: 20, value: 40, next_slot: 0, next_index: 0 }; + builder.tube_data.append_private_logs(NUM_PRIV_EVENT_LOGS); + builder.tube_data.append_unencrypted_log_hashes(NUM_UNENC_LOGS); + // Below will only work with NUM_CC_LOGS=1 + builder.tube_data.add_contract_class_log_hash(1, 2); + let outputs = builder.execute(); + + let mut reconstructed_tx_effects = [0; TX_EFFECTS_BLOB_HASH_INPUT_FIELDS]; + // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // revert code = 0 + let total_blob_fields_bytes = (TOTAL_BLOB_FIELDS as Field).to_be_bytes::<2>(); + reconstructed_tx_effects[0] = field_from_bytes( + array_concat( + TX_START_PREFIX.to_be_bytes::<8>(), + [ + 0, + total_blob_fields_bytes[0], + total_blob_fields_bytes[1], + 0, + REVERT_CODE_PREFIX, + 0, + 0, + ], + ), + true, + ); + // tx fee + reconstructed_tx_effects[1] = field_from_bytes( + array_concat([TX_FEE_PREFIX, 0], tx_fee.to_be_bytes::<29>()), + true, + ); + // notes + let mut offset = 2; + let notes_prefix = encode_blob_prefix(NOTES_PREFIX, NUM_NOTES); + reconstructed_tx_effects[offset] = notes_prefix; + offset += 1; + for i in 0..NUM_NOTES { + reconstructed_tx_effects[offset + i] = + builder.tube_data.note_hashes.storage()[i].value(); + } + offset += NUM_NOTES; + // nullifiers + let nullifiers_prefix = encode_blob_prefix(NULLIFIERS_PREFIX, NUM_NULLIFIERS); + reconstructed_tx_effects[offset] = nullifiers_prefix; + offset += 1; + for i in 0..NUM_NULLIFIERS { + reconstructed_tx_effects[offset + i] = builder.nullifiers.storage()[i].value; + } + offset += NUM_NULLIFIERS; + // l2 to l1 msgs + let l2_to_l1_msgs_prefix = encode_blob_prefix(L2_L1_MSGS_PREFIX, NUM_MSGS); + reconstructed_tx_effects[offset] = l2_to_l1_msgs_prefix; + offset += 1; + for i in 0..NUM_MSGS { + reconstructed_tx_effects[offset + i] = silo_l2_to_l1_message( + builder.tube_data.l2_to_l1_msgs.storage()[i], + builder.tube_data.tx_context.version, + builder.tube_data.tx_context.chain_id, + ); + } + offset += NUM_MSGS; + // private logs + let total_private_logs_len = (NUM_NOTES + NUM_PRIV_EVENT_LOGS) * PRIVATE_LOG_SIZE_IN_FIELDS; + let private_logs_prefix = encode_blob_prefix(PRIVATE_LOGS_PREFIX, total_private_logs_len); + reconstructed_tx_effects[offset] = private_logs_prefix; + offset += 1; + for i in 0..NUM_NOTES + NUM_PRIV_EVENT_LOGS { + for j in 0..PRIVATE_LOG_SIZE_IN_FIELDS { + reconstructed_tx_effects[offset + i * PRIVATE_LOG_SIZE_IN_FIELDS + j] = + builder.tube_data.private_logs.storage()[i].inner.log.fields[j]; + } + } + offset += total_private_logs_len; + // unenc logs + let unencrypted_logs_prefix = encode_blob_prefix(UNENCRYPTED_LOGS_PREFIX, NUM_UNENC_LOGS); + reconstructed_tx_effects[offset] = unencrypted_logs_prefix; + offset += 1; + for i in 0..NUM_UNENC_LOGS { + reconstructed_tx_effects[offset + i] = types::hash::silo_unencrypted_log_hash( + builder.tube_data.unencrypted_logs_hashes.storage()[i], + ); + } + offset += NUM_UNENC_LOGS; + // cc logs + let contract_class_logs_prefix = + encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, NUM_CC_LOGS); + reconstructed_tx_effects[offset] = contract_class_logs_prefix; + offset += 1; + for i in 0..NUM_CC_LOGS { + reconstructed_tx_effects[offset + i] = types::hash::silo_unencrypted_log_hash( + builder.tube_data.contract_class_logs_hashes.storage()[i], + ); + } + offset += NUM_CC_LOGS; + + // Sanity check + assert(offset == TOTAL_BLOB_FIELDS); - let hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32]; - let sha_digest = std::hash::sha256(hash_input_flattened); - let expected_tx_effects_hash = field_from_bytes_32_trunc(sha_digest); - assert_eq(outputs.txs_effects_hash, expected_tx_effects_hash); + let mut expected_sponge = outputs.start_sponge_blob; + expected_sponge.absorb(reconstructed_tx_effects, offset); + assert(outputs.end_sponge_blob.eq(expected_sponge)); } #[test] @@ -892,6 +1120,7 @@ mod tests { // Set gas builder.tube_data.gas_used = gas_used; + builder.tube_data.tx_context.gas_settings.max_fees_per_gas = gas_fees; builder.constants.global_variables.gas_fees = gas_fees; // Set fee payer @@ -941,6 +1170,7 @@ mod tests { // Set gas builder.tube_data.gas_used = gas_used; + builder.tube_data.tx_context.gas_settings.max_fees_per_gas = gas_fees; builder.constants.global_variables.gas_fees = gas_fees; // Set fee payer @@ -971,6 +1201,7 @@ mod tests { // Set gas builder.tube_data.gas_used = gas_used; + builder.tube_data.tx_context.gas_settings.max_fees_per_gas = gas_fees; builder.constants.global_variables.gas_fees = gas_fees; // Set fee payer diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr index a7bede53fa3..4548fe7b63a 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/public_base_rollup.nr @@ -1,16 +1,14 @@ use crate::{ - abis::{ - base_or_merge_rollup_public_inputs::{BASE_ROLLUP_TYPE, BaseOrMergeRollupPublicInputs}, - constant_rollup_data::ConstantRollupData, - }, + abis::base_or_merge_rollup_public_inputs::{BASE_ROLLUP_TYPE, BaseOrMergeRollupPublicInputs}, base::{ components::{ archive::perform_archive_membership_check, constants::validate_combined_constant_data, nullifier_tree::nullifier_tree_batch_insert, public_data_tree::public_data_tree_insert, + PublicTubeDataValidator, }, state_diff_hints::PublicBaseStateDiffHints, }, - components::{compute_kernel_out_hash, compute_tx_effects_hash}, + components::{append_tx_effects_for_blob, compute_kernel_out_hash}, }; use dep::types::{ abis::{ @@ -18,9 +16,11 @@ use dep::types::{ append_only_tree_snapshot::AppendOnlyTreeSnapshot, avm_circuit_public_inputs::AvmProofData, combined_constant_data::CombinedConstantData, + constant_rollup_data::ConstantRollupData, log_hash::ScopedLogHash, nullifier_leaf_preimage::NullifierLeafPreimage, public_data_write::PublicDataWrite, + sponge_blob::SpongeBlob, tube::PublicTubeData, }, constants::{ @@ -41,6 +41,7 @@ pub struct PublicBaseRollupInputs { avm_proof_data: AvmProofData, start: PartialStateReference, + start_sponge_blob: SpongeBlob, state_diff_hints: PublicBaseStateDiffHints, @@ -90,16 +91,14 @@ impl PublicBaseRollupInputs { } pub fn execute(self) -> BaseOrMergeRollupPublicInputs { - if !dep::std::runtime::is_unconstrained() { - self.tube_data.verify(); - // TODO(#7410) - // self.tube_data.vk_data.validate_in_vk_tree([TUBE_VK_INDEX]); - } + let tube_data_validator = PublicTubeDataValidator::new(self.tube_data); + tube_data_validator.verify_proof(); + tube_data_validator.validate_with_rollup_data(self.constants); // Warning: Fake verification! TODO(#8470) - if !dep::std::runtime::is_unconstrained() { - self.avm_proof_data.fake_verify(); - } + // if !dep::std::runtime::is_unconstrained() { + // self.avm_proof_data.fake_verify(); + // } // TODO(#8470) // if !dep::std::runtime::is_unconstrained() { @@ -151,8 +150,7 @@ impl PublicBaseRollupInputs { // Validate public data update requests and update public data tree let end_public_data_tree_snapshot = self.validate_and_process_public_state(combined_accumulated_data.public_data_writes); - - // Calculate the tx effects hash of the transaction + // Append the tx effects for blob(s) let siloed_l2_to_l1_msgs = combined_accumulated_data.l2_to_l1_msgs.map( |message: ScopedL2ToL1Message| silo_l2_to_l1_message( message, @@ -164,12 +162,13 @@ impl PublicBaseRollupInputs { let revert_code = if reverted { 1 } else { 0 }; - let tx_effects_hash = compute_tx_effects_hash( + let end_sponge_blob = append_tx_effects_for_blob( combined_accumulated_data, revert_code, self.avm_proof_data.public_inputs.transaction_fee, combined_accumulated_data.public_data_writes, - out_hash, + siloed_l2_to_l1_msgs, + self.start_sponge_blob, ); // Perform membership checks that the notes provided exist within the historical trees data @@ -179,6 +178,25 @@ impl PublicBaseRollupInputs { combined_constant_data.historical_header, ); + assert( + end_note_hash_tree_snapshot.eq( + self.avm_proof_data.public_inputs.end_tree_snapshots.note_hash_tree, + ), + "Mismatch note hash tree base rollup vs AVM", + ); + assert( + end_nullifier_tree_snapshot.eq( + self.avm_proof_data.public_inputs.end_tree_snapshots.nullifier_tree, + ), + "Mismatch nullifier tree base rollup vs AVM", + ); + assert( + end_public_data_tree_snapshot.eq( + self.avm_proof_data.public_inputs.end_tree_snapshots.public_data_tree, + ), + "Mismatch public data tree base rollup vs AVM", + ); + BaseOrMergeRollupPublicInputs { rollup_type: BASE_ROLLUP_TYPE, num_txs: 1, @@ -189,7 +207,8 @@ impl PublicBaseRollupInputs { nullifier_tree: end_nullifier_tree_snapshot, public_data_tree: end_public_data_tree_snapshot, }, - txs_effects_hash: tx_effects_hash, + start_sponge_blob: self.start_sponge_blob, + end_sponge_blob, out_hash, accumulated_fees: self.avm_proof_data.public_inputs.transaction_fee, accumulated_mana_used: self.avm_proof_data.public_inputs.end_gas_used.l2_gas as Field, @@ -259,38 +278,49 @@ impl PublicBaseRollupInputs { mod tests { use crate::{ - abis::{ - base_or_merge_rollup_public_inputs::BaseOrMergeRollupPublicInputs, - constant_rollup_data::ConstantRollupData, - }, + abis::base_or_merge_rollup_public_inputs::BaseOrMergeRollupPublicInputs, base::{ public_base_rollup::PublicBaseRollupInputs, state_diff_hints::PublicBaseStateDiffHints, }, - components::TX_EFFECTS_HASH_INPUT_FIELDS, + components::{ + append_tx_effects_for_blob, encode_blob_prefix, TX_EFFECTS_BLOB_HASH_INPUT_FIELDS, + }, }; use dep::types::{ abis::{ + accumulated_data::CombinedAccumulatedData, append_only_tree_snapshot::AppendOnlyTreeSnapshot, + constant_rollup_data::ConstantRollupData, nullifier_leaf_preimage::NullifierLeafPreimage, public_data_write::PublicDataWrite, + sponge_blob::SpongeBlob, }, address::EthAddress, constants::{ - ARCHIVE_HEIGHT, AVM_VK_INDEX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, - MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - NOTE_HASH_SUBTREE_HEIGHT, NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NOTE_HASH_TREE_HEIGHT, + ARCHIVE_HEIGHT, AVM_VK_INDEX, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, + MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_SUBTREE_HEIGHT, + NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH, NOTE_HASH_TREE_HEIGHT, NOTES_PREFIX, NULLIFIER_SUBTREE_HEIGHT, NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH, NULLIFIER_TREE_HEIGHT, - PRIVATE_KERNEL_EMPTY_INDEX, PUBLIC_DATA_TREE_HEIGHT, TUBE_VK_INDEX, + NULLIFIERS_PREFIX, PRIVATE_KERNEL_EMPTY_INDEX, PRIVATE_LOG_SIZE_IN_FIELDS, + PRIVATE_LOGS_PREFIX, PUBLIC_DATA_TREE_HEIGHT, PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, + REVERT_CODE_PREFIX, TUBE_VK_INDEX, TX_FEE_PREFIX, TX_START_PREFIX, + UNENCRYPTED_LOGS_PREFIX, }, data::{PublicDataTreeLeaf, PublicDataTreeLeafPreimage}, hash::silo_l2_to_l1_message, merkle_tree::MembershipWitness, messaging::l2_to_l1_message::ScopedL2ToL1Message, partial_state_reference::PartialStateReference, - tests::{fixture_builder::FixtureBuilder, fixtures, merkle_tree_utils::NonEmptyMerkleTree}, + tests::{ + fixture_builder::FixtureBuilder, + fixtures::{self, merkle_tree::generate_full_sha_tree}, + merkle_tree_utils::NonEmptyMerkleTree, + utils::pad_end, + }, traits::{Empty, is_empty}, utils::{ - arrays::get_sorted_tuple::get_sorted_tuple, - field::{field_from_bytes_32_trunc, full_field_less_than}, + arrays::{array_concat, get_sorted_tuple::get_sorted_tuple}, + field::{field_from_bytes, full_field_less_than}, }, }; @@ -309,7 +339,7 @@ mod tests { snapshot: AppendOnlyTreeSnapshot, writes: [(u32, PublicDataTreeLeaf); MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], mut pre_existing_public_data: [PublicDataTreeLeafPreimage; EXISTING_LEAVES], - ) -> ([PublicDataTreeLeafPreimage; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], [MembershipWitness; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], [[Field; PUBLIC_DATA_TREE_HEIGHT]; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]) { + ) -> ([PublicDataTreeLeafPreimage; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], [MembershipWitness; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], [[Field; PUBLIC_DATA_TREE_HEIGHT]; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], AppendOnlyTreeSnapshot) { let mut low_leaves = [PublicDataTreeLeafPreimage::empty(); MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]; let mut low_public_data_writes_witnesses = @@ -318,7 +348,6 @@ mod tests { [[0; PUBLIC_DATA_TREE_HEIGHT]; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]; let mut current_next_leaf_index = snapshot.next_available_leaf_index; - for i in 0..writes.len() { let (low_leaf_index, write) = writes[i]; if (!is_empty(write)) { @@ -357,10 +386,18 @@ mod tests { low_leaves[i] = low_leaf; low_public_data_writes_witnesses[i] = low_public_data_writes_witness; insertion_witnesses[i] = insertion_witness; - current_next_leaf_index += 1; + if low_leaf.slot != write.slot { + current_next_leaf_index += 1; + } } } - (low_leaves, low_public_data_writes_witnesses, insertion_witnesses) + ( + low_leaves, low_public_data_writes_witnesses, insertion_witnesses, + AppendOnlyTreeSnapshot { + root: public_data_tree.get_root(), + next_available_leaf_index: current_next_leaf_index, + }, + ) } struct PublicBaseRollupInputsBuilder { @@ -399,6 +436,30 @@ mod tests { builder } + fn build_pre_existing_tx_effects( + self, + ) -> (CombinedAccumulatedData, [PublicDataWrite; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX]) { + let mut res = CombinedAccumulatedData::empty(); + res.note_hashes = self.pre_existing_notes; + res.nullifiers = self.pre_existing_nullifiers.map(|nullifier: NullifierLeafPreimage| { + nullifier.nullifier + }); + let all_public_data_update_requests = self.pre_existing_public_data.map( + |leaf_preimage: PublicDataTreeLeafPreimage| { + PublicDataWrite { leaf_slot: leaf_preimage.slot, value: leaf_preimage.value } + }, + ); + let padded_all_public_data_update_requests = array_concat( + all_public_data_update_requests, + [ + PublicDataWrite::empty(); MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX + - PRE_EXISTING_PUBLIC_DATA_LEAVES + ], + ); + + (res, padded_all_public_data_update_requests) + } + fn extract_subtree_sibling_path( path: [Field; FULL_HEIGHT], mut sibling_path: [Field; SIBLING_PATH_LENGTH], @@ -410,11 +471,11 @@ mod tests { sibling_path } - fn update_nullifier_tree_with_new_leaves( + fn update_nullifier_tree_with_new_leaves( mut self, - nullifier_tree: &mut NonEmptyMerkleTree, + nullifier_tree: &mut NonEmptyMerkleTree, start_nullifier_tree_snapshot: AppendOnlyTreeSnapshot, - ) -> ([NullifierLeafPreimage; MAX_NULLIFIERS_PER_TX], [MembershipWitness; MAX_NULLIFIERS_PER_TX], [Field; MAX_NULLIFIERS_PER_TX], [u32; MAX_NULLIFIERS_PER_TX]) { + ) -> ([NullifierLeafPreimage; MAX_NULLIFIERS_PER_TX], [MembershipWitness; MAX_NULLIFIERS_PER_TX], [Field; MAX_NULLIFIERS_PER_TX], [u32; MAX_NULLIFIERS_PER_TX], [Field; NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH], AppendOnlyTreeSnapshot) { let mut nullifier_predecessor_preimages = [NullifierLeafPreimage::empty(); MAX_NULLIFIERS_PER_TX]; let mut low_nullifier_membership_witness = @@ -441,6 +502,7 @@ mod tests { } let mut pre_existing_nullifiers = self.pre_existing_nullifiers; + let mut insertion_subtree = [NullifierLeafPreimage::empty(); MAX_NULLIFIERS_PER_TX]; for i in 0..MAX_NULLIFIERS_PER_TEST { if i < self.nullifiers.len() { @@ -451,6 +513,11 @@ mod tests { let low_index = self.nullifiers.get_unchecked(original_index).existing_index; let mut low_preimage = pre_existing_nullifiers[low_index]; + let new_leaf = NullifierLeafPreimage { + nullifier: new_nullifier, + next_nullifier: low_preimage.next_nullifier, + next_index: low_preimage.next_index, + }; nullifier_predecessor_preimages[i] = low_preimage; low_nullifier_membership_witness[i] = MembershipWitness { leaf_index: low_index as Field, @@ -458,18 +525,38 @@ mod tests { }; low_preimage.next_nullifier = new_nullifier; - low_preimage.next_index = start_nullifier_tree_snapshot - .next_available_leaf_index as u32 - + original_index; + low_preimage.next_index = + start_nullifier_tree_snapshot.next_available_leaf_index + original_index; pre_existing_nullifiers[low_index] = low_preimage; nullifier_tree.update_leaf(low_index, low_preimage.hash()); + insertion_subtree[original_index] = new_leaf; } } + let nullifier_subtree_sibling_path = PublicBaseRollupInputsBuilder::extract_subtree_sibling_path( + nullifier_tree.get_sibling_path(self.pre_existing_nullifiers.len()), + [0; NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH], + ); + + for i in 0..insertion_subtree.len() { + let leaf = insertion_subtree[i].as_leaf(); + nullifier_tree.update_leaf( + start_nullifier_tree_snapshot.next_available_leaf_index + i, + leaf, + ); + } + + let end_nullifier_tree_snapshot = AppendOnlyTreeSnapshot { + root: nullifier_tree.get_root(), + next_available_leaf_index: start_nullifier_tree_snapshot.next_available_leaf_index + + MAX_NULLIFIERS_PER_TX, + }; + ( nullifier_predecessor_preimages, low_nullifier_membership_witness, - sorted_nullifiers, sorted_nullifiers_indexes, + sorted_nullifiers, sorted_nullifiers_indexes, nullifier_subtree_sibling_path, + end_nullifier_tree_snapshot, ) } @@ -479,31 +566,47 @@ mod tests { avm_proof_data.public_inputs.transaction_fee = self.transaction_fee; - let start_note_hash_tree = NonEmptyMerkleTree::new( - self.pre_existing_notes, + let mut start_note_hash_tree = NonEmptyMerkleTree::new( + pad_end::( + self.pre_existing_notes, + 0, + ), [0; NOTE_HASH_TREE_HEIGHT], - [0; NOTE_HASH_TREE_HEIGHT - NOTE_HASH_SUBTREE_HEIGHT], - [0; NOTE_HASH_SUBTREE_HEIGHT], + [0; NOTE_HASH_TREE_HEIGHT - NOTE_HASH_SUBTREE_HEIGHT - 1], + [0; NOTE_HASH_SUBTREE_HEIGHT + 1], ); let start_note_hash_tree_snapshot = AppendOnlyTreeSnapshot { root: start_note_hash_tree.get_root(), - next_available_leaf_index: start_note_hash_tree.get_next_available_index() as u32, + next_available_leaf_index: self.pre_existing_notes.len(), }; let note_hash_subtree_sibling_path = PublicBaseRollupInputsBuilder::extract_subtree_sibling_path( start_note_hash_tree.get_sibling_path(self.pre_existing_notes.len()), [0; NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH], ); + for i in 0..MAX_NOTE_HASHES_PER_TX { + let note_hash = avm_proof_data.public_inputs.accumulated_data.note_hashes[i]; + start_note_hash_tree.update_leaf(MAX_NOTE_HASHES_PER_TX + i, note_hash); + } + avm_proof_data.public_inputs.end_tree_snapshots.note_hash_tree = AppendOnlyTreeSnapshot { + root: start_note_hash_tree.get_root(), + next_available_leaf_index: MAX_NOTE_HASHES_PER_TX * 2, + }; let mut start_nullifier_tree = NonEmptyMerkleTree::new( - self.pre_existing_nullifiers.map(|preimage: NullifierLeafPreimage| preimage.hash()), + pad_end::( + self.pre_existing_nullifiers.map(|preimage: NullifierLeafPreimage| { + preimage.hash() + }), + 0, + ), [0; NULLIFIER_TREE_HEIGHT], - [0; NULLIFIER_TREE_HEIGHT - NULLIFIER_SUBTREE_HEIGHT], - [0; NULLIFIER_SUBTREE_HEIGHT], + [0; NULLIFIER_TREE_HEIGHT - NULLIFIER_SUBTREE_HEIGHT - 1], + [0; NULLIFIER_SUBTREE_HEIGHT + 1], ); let start_nullifier_tree_snapshot = AppendOnlyTreeSnapshot { root: start_nullifier_tree.get_root(), - next_available_leaf_index: start_nullifier_tree.get_next_available_index() as u32, + next_available_leaf_index: MAX_NULLIFIERS_PER_TX, }; let mut pre_existing_leaves = [0; AVAILABLE_PUBLIC_DATA_LEAVES_FOR_TEST]; @@ -534,7 +637,7 @@ mod tests { next_available_leaf_index: start_archive.get_next_available_index() as u32, }; - let (nullifier_predecessor_preimages, nullifier_predecessor_membership_witnesses, sorted_nullifiers, sorted_nullifier_indexes) = self + let (nullifier_predecessor_preimages, nullifier_predecessor_membership_witnesses, sorted_nullifiers, sorted_nullifier_indexes, nullifier_subtree_sibling_path, end_nullifier_tree_snapshot) = self .update_nullifier_tree_with_new_leaves( &mut start_nullifier_tree, start_nullifier_tree_snapshot, @@ -545,18 +648,19 @@ mod tests { avm_proof_data.public_inputs.accumulated_data.nullifiers[i] = nullifier.value; } - let nullifier_subtree_sibling_path = PublicBaseRollupInputsBuilder::extract_subtree_sibling_path( - start_nullifier_tree.get_sibling_path(self.pre_existing_nullifiers.len()), - [0; NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH], - ); + avm_proof_data.public_inputs.end_tree_snapshots.nullifier_tree = + end_nullifier_tree_snapshot; - let (low_public_data_writes_preimages, low_public_data_writes_witnesses, public_data_tree_sibling_paths) = update_public_data_tree( + let (low_public_data_writes_preimages, low_public_data_writes_witnesses, public_data_tree_sibling_paths, end_public_data_tree_snapshot) = update_public_data_tree( &mut start_public_data_tree, start_public_data_tree_snapshot, self.public_data_writes.storage(), self.pre_existing_public_data, ); + avm_proof_data.public_inputs.end_tree_snapshots.public_data_tree = + end_public_data_tree_snapshot; + for i in 0..self.public_data_writes.len() { let leaf = self.public_data_writes.get_unchecked(i).1; avm_proof_data.public_inputs.accumulated_data.public_data_writes[i] = @@ -569,6 +673,18 @@ mod tests { public_data_tree: start_public_data_tree_snapshot, }; + let (pre_existing_tx_effects, pre_existing_public_data_update_requests) = + self.build_pre_existing_tx_effects(); + + let start_sponge_blob = append_tx_effects_for_blob( + pre_existing_tx_effects, + 0, + 0, + pre_existing_public_data_update_requests, + [0; MAX_L2_TO_L1_MSGS_PER_TX], + SpongeBlob::new(TX_EFFECTS_BLOB_HASH_INPUT_FIELDS), + ); + let state_diff_hints = PublicBaseStateDiffHints { nullifier_predecessor_preimages, nullifier_predecessor_membership_witnesses, @@ -585,6 +701,7 @@ mod tests { tube_data, avm_proof_data, start, + start_sponge_blob, state_diff_hints, archive_root_membership_witness: MembershipWitness { leaf_index: 0, @@ -800,13 +917,198 @@ mod tests { } #[test] - unconstrained fn empty_tx_effects_hash() { + unconstrained fn empty_tx_effects_sponge() { let outputs = PublicBaseRollupInputsBuilder::new().execute(); + let mut expected_sponge = outputs.start_sponge_blob; + assert(outputs.end_sponge_blob.eq(expected_sponge)); + } - let hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32]; - let sha_digest = std::hash::sha256(hash_input_flattened); - let expected_tx_effects_hash = field_from_bytes_32_trunc(sha_digest); - assert_eq(outputs.txs_effects_hash, expected_tx_effects_hash); + #[test] + unconstrained fn non_empty_tx_effects_sponge() { + let mut builder = PublicBaseRollupInputsBuilder::new(); + builder.avm_data.append_note_hashes(50); + let outputs = builder.execute(); + let mut tx_effects = [0; 53]; + // TODO(#8954): This test uses 50 notes and 3 extra absorbed fields + // This may change when logs are deconstructed + // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // The first 3 are: i=0 init field, i=1: tx fee, i=2: note prefix + tx_effects[0] = field_from_bytes( + array_concat( + TX_START_PREFIX.to_be_bytes::<8>(), + [0, 0, tx_effects.len() as u8, 0, REVERT_CODE_PREFIX, 0, 0], + ), + true, + ); + tx_effects[1] = field_from_bytes( + array_concat([TX_FEE_PREFIX, 0], (0).to_be_bytes::<29>()), + true, + ); + tx_effects[2] = encode_blob_prefix(NOTES_PREFIX, 50); + for i in 0..50 { + tx_effects[i + 3] = builder.avm_data.note_hashes.storage()[i].value(); + } + let mut expected_sponge = outputs.start_sponge_blob; + + expected_sponge.absorb(tx_effects, tx_effects.len()); + assert(outputs.end_sponge_blob.eq(expected_sponge)); + } + + #[test] + unconstrained fn fuller_tx_effects_sponge() { + let NUM_NOTES = 50; + let NUM_NULLIFIERS = 3; + let NUM_MSGS = 5; + let NUM_PRIV_EVENT_LOGS = 4; + let NUM_UNENC_LOGS = 6; + let NUM_CC_LOGS = 1; + let PUB_DATA_SLOT = 25; + let PUB_DATA_VALUE = 60; + let TOTAL_BLOB_FIELDS = 2 // revert code and tx fee + + NUM_NOTES + + 1 // notes and prefix + + NUM_NULLIFIERS + + 1 // nullifiers and prefix + + NUM_MSGS + + 1 // L2 to L1 msgs and prefix + + NUM_UNENC_LOGS + + 1 // unenc. logs and prefix + + NUM_CC_LOGS + + 1 // contract class logs and prefix + + 2 + + 1 // single public data update (2 fields) and prefix + + NUM_PRIV_EVENT_LOGS * PRIVATE_LOG_SIZE_IN_FIELDS + + 1; // private logs and prefix + let tx_fee = 100_000; + let mut builder = PublicBaseRollupInputsBuilder::new(); + builder.transaction_fee = tx_fee; + builder.avm_data.append_note_hashes(NUM_NOTES); + // Copied from nullifier tests above: + builder.pre_existing_nullifiers[0] = + NullifierLeafPreimage { nullifier: 0, next_nullifier: 7, next_index: 1 }; + builder.pre_existing_nullifiers[1] = + NullifierLeafPreimage { nullifier: 7, next_nullifier: 0, next_index: 0 }; + for i in 0..NUM_NULLIFIERS { + builder.nullifiers.push( + NullifierInsertion { existing_index: 1, value: (8 + i) as Field }, + ); + } + builder.avm_data.append_l2_to_l1_msgs(NUM_MSGS); + // Copied from public data test below: + builder.pre_existing_public_data[0] = + PublicDataTreeLeafPreimage { slot: 20, value: 40, next_slot: 0, next_index: 0 }; + builder.public_data_writes.push(( + 0, PublicDataTreeLeaf { slot: PUB_DATA_SLOT, value: PUB_DATA_VALUE }, + )); + builder.tube_data.append_private_logs(NUM_PRIV_EVENT_LOGS); + builder.avm_data.append_unencrypted_log_hashes(NUM_UNENC_LOGS); + // Below will only work with NUM_CC_LOGS=1 + builder.tube_data.add_contract_class_log_hash(1, 2); + let outputs = builder.execute(); + + let mut reconstructed_tx_effects = [0; TX_EFFECTS_BLOB_HASH_INPUT_FIELDS]; + // Initial field = TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // revert code = 0 + let total_blob_fields_bytes = (TOTAL_BLOB_FIELDS as Field).to_be_bytes::<2>(); + reconstructed_tx_effects[0] = field_from_bytes( + array_concat( + TX_START_PREFIX.to_be_bytes::<8>(), + [ + 0, + total_blob_fields_bytes[0], + total_blob_fields_bytes[1], + 0, + REVERT_CODE_PREFIX, + 0, + 0, + ], + ), + true, + ); + // tx fee + reconstructed_tx_effects[1] = field_from_bytes( + array_concat([TX_FEE_PREFIX, 0], tx_fee.to_be_bytes::<29>()), + true, + ); + // notes + let mut offset = 2; + let notes_prefix = encode_blob_prefix(NOTES_PREFIX, NUM_NOTES); + reconstructed_tx_effects[offset] = notes_prefix; + offset += 1; + for i in 0..NUM_NOTES { + reconstructed_tx_effects[offset + i] = + builder.avm_data.note_hashes.storage()[i].value(); + } + offset += NUM_NOTES; + // nullifiers + let nullifiers_prefix = encode_blob_prefix(NULLIFIERS_PREFIX, NUM_NULLIFIERS); + reconstructed_tx_effects[offset] = nullifiers_prefix; + offset += 1; + for i in 0..NUM_NULLIFIERS { + reconstructed_tx_effects[offset + i] = builder.nullifiers.storage()[i].value; + } + offset += NUM_NULLIFIERS; + // l2 to l1 msgs + let l2_to_l1_msgs_prefix = encode_blob_prefix(L2_L1_MSGS_PREFIX, NUM_MSGS); + reconstructed_tx_effects[offset] = l2_to_l1_msgs_prefix; + offset += 1; + for i in 0..NUM_MSGS { + reconstructed_tx_effects[offset + i] = silo_l2_to_l1_message( + builder.avm_data.l2_to_l1_msgs.storage()[i], + builder.avm_data.tx_context.version, + builder.avm_data.tx_context.chain_id, + ); + } + offset += NUM_MSGS; + // public data update + let public_data_update_requests_prefix = + encode_blob_prefix(PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, 2); + reconstructed_tx_effects[offset] = public_data_update_requests_prefix; + offset += 1; + reconstructed_tx_effects[offset] = PUB_DATA_SLOT; + reconstructed_tx_effects[offset + 1] = PUB_DATA_VALUE; + offset += 2; + // private logs + let total_private_logs_len = NUM_PRIV_EVENT_LOGS * PRIVATE_LOG_SIZE_IN_FIELDS; + let private_logs_prefix = encode_blob_prefix(PRIVATE_LOGS_PREFIX, total_private_logs_len); + reconstructed_tx_effects[offset] = private_logs_prefix; + offset += 1; + for i in 0..NUM_PRIV_EVENT_LOGS { + for j in 0..PRIVATE_LOG_SIZE_IN_FIELDS { + reconstructed_tx_effects[offset + i * PRIVATE_LOG_SIZE_IN_FIELDS + j] = + builder.tube_data.private_logs.storage()[i].inner.log.fields[j]; + } + } + offset += total_private_logs_len; + // TODO(#8954): The below will change with log deconstruction + // unenc logs + let unencrypted_logs_prefix = encode_blob_prefix(UNENCRYPTED_LOGS_PREFIX, NUM_UNENC_LOGS); + reconstructed_tx_effects[offset] = unencrypted_logs_prefix; + offset += 1; + for i in 0..NUM_UNENC_LOGS { + reconstructed_tx_effects[offset + i] = types::hash::silo_unencrypted_log_hash( + builder.avm_data.unencrypted_logs_hashes.storage()[i], + ); + } + offset += NUM_UNENC_LOGS; + // cc logs + let contract_class_logs_prefix = + encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, NUM_CC_LOGS); + reconstructed_tx_effects[offset] = contract_class_logs_prefix; + offset += 1; + for i in 0..NUM_CC_LOGS { + reconstructed_tx_effects[offset + i] = types::hash::silo_unencrypted_log_hash( + builder.tube_data.contract_class_logs_hashes.storage()[i], + ); + } + offset += NUM_CC_LOGS; + + // Sanity check + assert(offset == TOTAL_BLOB_FIELDS); + + let mut expected_sponge = outputs.start_sponge_blob; + expected_sponge.absorb(reconstructed_tx_effects, offset); + assert(outputs.end_sponge_blob.eq(expected_sponge)); } #[test] @@ -836,9 +1138,7 @@ mod tests { ); // Since we fill the tree completely, we know to expect a full tree as below - let expected_tree = dep::types::merkle_tree::variable_merkle_tree::tests::generate_full_sha_tree( - siloed_l2_to_l1_msgs.storage(), - ); + let expected_tree = generate_full_sha_tree(siloed_l2_to_l1_msgs.storage()); assert_eq(out_hash, expected_tree.get_root()); } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/mod.nr new file mode 100644 index 00000000000..7e88fe33e7d --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/mod.nr @@ -0,0 +1 @@ +mod private_tube_data_validator_builder; diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/private_tube_data_validator_builder/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/private_tube_data_validator_builder/mod.nr new file mode 100644 index 00000000000..cefbf64d37d --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/private_tube_data_validator_builder/mod.nr @@ -0,0 +1,24 @@ +mod validate_with_rollup_data; + +use crate::base::components::PrivateTubeDataValidator; +use dep::types::tests::fixture_builder::FixtureBuilder; + +pub struct PrivateTubeDataValidatorBuilder { + pub tube_data: FixtureBuilder, + pub rollup_data: FixtureBuilder, +} + +impl PrivateTubeDataValidatorBuilder { + pub fn new() -> Self { + PrivateTubeDataValidatorBuilder { + tube_data: FixtureBuilder::new(), + rollup_data: FixtureBuilder::new(), + } + } + + pub fn validate_with_rollup_data(self) { + let tube_data = self.tube_data.to_private_tube_data(); + let rollup_data = self.rollup_data.to_constant_rollup_data(); + PrivateTubeDataValidator::new(tube_data).validate_with_rollup_data(rollup_data); + } +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/private_tube_data_validator_builder/validate_with_rollup_data.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/private_tube_data_validator_builder/validate_with_rollup_data.nr new file mode 100644 index 00000000000..64756b1efb9 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/tests/private_tube_data_validator_builder/validate_with_rollup_data.nr @@ -0,0 +1,27 @@ +use super::PrivateTubeDataValidatorBuilder; + +#[test] +fn validate_with_rollup_data_success() { + let builder = PrivateTubeDataValidatorBuilder::new(); + builder.validate_with_rollup_data(); +} + +#[test(should_fail_with = "da gas is higher than the maximum specified by the tx")] +fn validate_with_rollup_data_not_enough_fee_per_da_gas_fails() { + let mut builder = PrivateTubeDataValidatorBuilder::new(); + + builder.tube_data.tx_context.gas_settings.max_fees_per_gas.fee_per_da_gas = 3; + builder.rollup_data.global_variables.gas_fees.fee_per_da_gas = 4; + + builder.validate_with_rollup_data(); +} + +#[test(should_fail_with = "l2 gas is higher than the maximum specified by the tx")] +fn validate_with_rollup_data_not_enough_fee_per_l2_gas_fails() { + let mut builder = PrivateTubeDataValidatorBuilder::new(); + + builder.tube_data.tx_context.gas_settings.max_fees_per_gas.fee_per_l2_gas = 3; + builder.rollup_data.global_variables.gas_fees.fee_per_l2_gas = 4; + + builder.validate_with_rollup_data(); +} diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_merge/block_merge_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_merge/block_merge_rollup_inputs.nr index 0206da8b61a..a6ae7338fbe 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_merge/block_merge_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_merge/block_merge_rollup_inputs.nr @@ -44,6 +44,12 @@ impl BlockMergeRollupInputs { let fees = components::accumulate_blocks_fees(left, right); + // TODO: We need to eventually accumulate blob info to a single BlobPublicInputs instance which will verify multiple blobs in one call + // For now, we do them individually + // How we accumulate is being worked on by @Mike + // let blob_public_inputs = left.blob_public_inputs.accumulate(right.blob_public_inputs); + let blob_public_inputs = components::accumulate_blob_public_inputs(left, right); + BlockRootOrBlockMergePublicInputs { previous_archive: left.previous_archive, new_archive: right.new_archive, @@ -56,6 +62,7 @@ impl BlockMergeRollupInputs { vk_tree_root: left.vk_tree_root, protocol_contract_tree_root: left.protocol_contract_tree_root, prover_id: left.prover_id, // TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 + blob_public_inputs, } } } @@ -146,6 +153,25 @@ mod tests { ); } + #[test] + fn blob_inputs_are_accumulated() { + let mut inputs = default_block_merge_rollup_inputs(); + let outputs = inputs.block_merge_rollup_circuit(); + + assert_eq( + outputs.blob_public_inputs[0], + inputs.previous_rollup_data[0] + .block_root_or_block_merge_public_inputs + .blob_public_inputs[0], + ); + assert_eq( + outputs.blob_public_inputs[1], + inputs.previous_rollup_data[1] + .block_root_or_block_merge_public_inputs + .blob_public_inputs[0], + ); + } + #[test] fn valid_previous_circuit_block_root() { let mut inputs = default_block_merge_rollup_inputs(); diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr index e2e7b0bd5c4..b0bab243d8b 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/block_root_rollup_inputs.nr @@ -5,13 +5,14 @@ use crate::{ }, components, }; +use blob::{blob::evaluate_blobs, blob_public_inputs::{BlobCommitment, BlockBlobPublicInputs}}; use parity_lib::root::root_rollup_parity_input::RootRollupParityInput; use types::{ abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot, block_header::BlockHeader, constants::{ - ARCHIVE_HEIGHT, AZTEC_MAX_EPOCH_DURATION, L1_TO_L2_MSG_SUBTREE_HEIGHT, - L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MERGE_ROLLUP_INDEX, + ARCHIVE_HEIGHT, AZTEC_MAX_EPOCH_DURATION, BLOBS_PER_BLOCK, FIELDS_PER_BLOB, + L1_TO_L2_MSG_SUBTREE_HEIGHT, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, MERGE_ROLLUP_INDEX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PRIVATE_BASE_ROLLUP_VK_INDEX, PUBLIC_BASE_ROLLUP_VK_INDEX, }, @@ -46,6 +47,14 @@ pub struct BlockRootRollupInputs { pub previous_block_hash: Field, // TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 pub prover_id: Field, + // Fields for blob verification made of all tx effects in this block + // (will likely change to be accumulated and sent up to the final root) + pub blobs_fields: [Field; FIELDS_PER_BLOB * BLOBS_PER_BLOCK], + // see blob/src/blob.nr -> evaluate_blob() - these are used for creating the challenge z + pub blob_commitments: [BlobCommitment; BLOBS_PER_BLOCK], + // Flat sha256 hash of the EVM blob hashes, can be injected here as the contract checks its validity vs the blob_public_inputs below + // NB: to fit it into a field, we truncate to 31 bytes + pub blobs_hash: Field, } impl BlockRootRollupInputs { @@ -69,6 +78,7 @@ impl BlockRootRollupInputs { components::assert_txs_filled_from_left(left, right); components::assert_equal_constants(left, right); components::assert_prev_rollups_follow_on_from_each_other(left, right); + components::assert_first_sponge_blob_empty(left); // Insert subtree into the l1 to l2 data tree let empty_l1_to_l2_subtree_root = calculate_empty_tree_root(L1_TO_L2_MSG_SUBTREE_HEIGHT); @@ -89,7 +99,7 @@ impl BlockRootRollupInputs { let content_commitment = ContentCommitment { num_txs: (left.num_txs + right.num_txs) as Field, - txs_effects_hash: components::compute_txs_effects_hash(self.previous_rollup_data), + blobs_hash: self.blobs_hash, in_hash: self.l1_to_l2_roots.public_inputs.sha_root, out_hash: components::compute_out_hash(self.previous_rollup_data), }; @@ -98,24 +108,6 @@ impl BlockRootRollupInputs { let total_mana_used = components::accumulate_mana_used(left, right); - // unsafe { - // debug_log_format("Assembling header in block root rollup", []); - // debug_log_format( - // "header.last_archive={}", - // left.constants.last_archive.serialize() - // ); - // debug_log_format( - // "header.content_commitment={}", - // content_commitment.serialize() - // ); - // debug_log_format("header.state={}", state.serialize()); - // debug_log_format( - // "header.global_variables={}", - // left.constants.global_variables.serialize() - // ); - // debug_log_format("header.total_fees={0}", [total_fees]); - // debug_log_format("header.total_mana_used={0}", [total_mana_used]); - // } let header = BlockHeader { last_archive: left.constants.last_archive, content_commitment, @@ -141,18 +133,37 @@ impl BlockRootRollupInputs { fee_arr[0] = FeeRecipient { recipient: left.constants.global_variables.coinbase, value: total_fees }; + let mut blob_public_inputs = [BlockBlobPublicInputs::empty(); AZTEC_MAX_EPOCH_DURATION]; + if !dep::std::runtime::is_unconstrained() { + blob_public_inputs[0] = evaluate_blobs( + self.blobs_fields, + self.blob_commitments, + right.end_sponge_blob, + ); + } else { + // TODO(#10323): this was added to save simulation time, if/when simulation times of unconstrained are improved, remove this. + blob_public_inputs[0] = unsafe { + blob::mock_blob_oracle::evaluate_blobs( + self.blobs_fields, + self.blob_commitments, + right.end_sponge_blob, + ) + }; + } + BlockRootOrBlockMergePublicInputs { previous_archive: left.constants.last_archive, // archive before this block was added new_archive: archive, // archive once this block was added previous_block_hash: self.previous_block_hash, end_block_hash: block_hash, // current newest block hash = this block hash start_global_variables: left.constants.global_variables, // we have asserted that left.constants == right.constants => ... - end_global_variables: left.constants.global_variables, // with a current block range of 1, we only have 1 set of constants + end_global_variables: left.constants.global_variables, // ...with a current block range of 1, we only have 1 set of constants out_hash: content_commitment.out_hash, fees: fee_arr, vk_tree_root: left.constants.vk_tree_root, protocol_contract_tree_root: left.constants.protocol_contract_tree_root, prover_id: self.prover_id, + blob_public_inputs, } } } @@ -169,6 +180,9 @@ impl Empty for BlockRootRollupInputs { new_archive_sibling_path: [0; ARCHIVE_HEIGHT], previous_block_hash: 0, prover_id: 0, + blobs_fields: [0; FIELDS_PER_BLOB * BLOBS_PER_BLOCK], + blob_commitments: [BlobCommitment::empty(); BLOBS_PER_BLOCK], + blobs_hash: 0, } } } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr index bbd263c34e0..6c7223dab66 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/empty_block_root_rollup_inputs.nr @@ -1,5 +1,7 @@ -use crate::abis::block_root_or_block_merge_public_inputs::BlockRootOrBlockMergePublicInputs; -use crate::abis::block_root_or_block_merge_public_inputs::FeeRecipient; +use crate::abis::block_root_or_block_merge_public_inputs::{ + BlockRootOrBlockMergePublicInputs, FeeRecipient, +}; +use blob::blob_public_inputs::BlockBlobPublicInputs; use types::abis::{ append_only_tree_snapshot::AppendOnlyTreeSnapshot, global_variables::GlobalVariables, }; @@ -29,6 +31,7 @@ impl EmptyBlockRootRollupInputs { vk_tree_root: self.vk_tree_root, protocol_contract_tree_root: self.protocol_contract_tree_root, prover_id: self.prover_id, + blob_public_inputs: [BlockBlobPublicInputs::empty(); AZTEC_MAX_EPOCH_DURATION], } } } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr index dd7f71030b0..985834cf361 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/block_root/mod.nr @@ -9,6 +9,7 @@ pub use empty_block_root_rollup_inputs::EmptyBlockRootRollupInputs; mod tests { use crate::tests::block_root_rollup_inputs::default_block_root_rollup_inputs; use dep::types::hash::accumulate_sha256; + use std::hash::poseidon2::Poseidon2; #[test] fn check_block_hashes_empty_blocks() { @@ -39,4 +40,40 @@ mod tests { .global_variables, )); } + + #[test] + fn check_blob() { + // Note: this test will not run in unconstrained, because it reaches the foreign call + // TODO(#10323): remove the oracle and switch this test to unconstrained + let inputs = default_block_root_rollup_inputs(); + let outputs = inputs.block_root_rollup_circuit(); + + let mut expected_sponge = + inputs.previous_rollup_data[0].base_or_merge_rollup_public_inputs.start_sponge_blob; + expected_sponge.absorb([1, 2], expected_sponge.expected_fields); + + assert(expected_sponge.eq( + inputs.previous_rollup_data[1].base_or_merge_rollup_public_inputs.end_sponge_blob, + )); + + let hashed_tx_effects = expected_sponge.squeeze(); + let expected_z = Poseidon2::hash( + [ + hashed_tx_effects, + inputs.blob_commitments[0].inner[0], + inputs.blob_commitments[0].inner[1], + ], + 3, + ); + + assert(outputs.blob_public_inputs[0].inner[0].z == expected_z); + } + + #[test(should_fail_with = "block's first blob sponge was not empty")] + unconstrained fn check_blob_empty() { + let mut inputs = default_block_root_rollup_inputs(); + inputs.previous_rollup_data[0].base_or_merge_rollup_public_inputs.start_sponge_blob.fields = + 1; + let _ = inputs.block_root_rollup_circuit(); + } } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr index 75a56f6519c..cfeb1572561 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/components.nr @@ -1,26 +1,29 @@ use crate::abis::{ base_or_merge_rollup_public_inputs::BaseOrMergeRollupPublicInputs, block_root_or_block_merge_public_inputs::{BlockRootOrBlockMergePublicInputs, FeeRecipient}, -}; -use crate::abis::{ - previous_rollup_block_data::PreviousRollupBlockData, previous_rollup_data::PreviousRollupData, + previous_rollup_block_data::PreviousRollupBlockData, + previous_rollup_data::PreviousRollupData, }; use dep::types::{ abis::{ - accumulated_data::CombinedAccumulatedData, - log_hash::{LogHash, ScopedLogHash}, - public_data_write::PublicDataWrite, + accumulated_data::CombinedAccumulatedData, log_hash::ScopedLogHash, + public_data_write::PublicDataWrite, sponge_blob::SpongeBlob, }, constants::{ - AZTEC_MAX_EPOCH_DURATION, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, + AZTEC_MAX_EPOCH_DURATION, CONTRACT_CLASS_LOGS_PREFIX, L2_L1_MSGS_PREFIX, + MAX_CONTRACT_CLASS_LOGS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, - MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PRIVATE_LOG_SIZE_IN_FIELDS, + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_UNENCRYPTED_LOGS_PER_TX, NOTES_PREFIX, + NULLIFIERS_PREFIX, PRIVATE_LOG_SIZE_IN_FIELDS, PRIVATE_LOGS_PREFIX, + PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, REVERT_CODE_PREFIX, TX_FEE_PREFIX, TX_START_PREFIX, + UNENCRYPTED_LOGS_PREFIX, }, - hash::{accumulate_sha256, compute_tx_logs_hash, silo_unencrypted_log_hash}, + hash::{accumulate_sha256, silo_unencrypted_log_hash}, merkle_tree::VariableMerkleTree, traits::is_empty, - utils::arrays::{array_length, array_merge}, + utils::{arrays::{array_concat, array_length, array_merge}, field::field_from_bytes}, }; +use blob::blob_public_inputs::BlockBlobPublicInputs; /** * Asserts that the tree formed by rollup circuits is filled greedily from L to R @@ -63,7 +66,7 @@ pub fn assert_equal_constants( } // asserts that the end snapshot of previous_rollup 0 equals the start snapshot of previous_rollup 1 (i.e. ensure they -// follow on from one-another). Ensures that right uses the tres that was updated by left. +// follow on from one-another). Ensures that right uses the tree that was updated by left. pub fn assert_prev_rollups_follow_on_from_each_other( left: BaseOrMergeRollupPublicInputs, right: BaseOrMergeRollupPublicInputs, @@ -80,9 +83,12 @@ pub fn assert_prev_rollups_follow_on_from_each_other( left.end.public_data_tree.eq(right.start.public_data_tree), "input proofs have different public data tree snapshots", ); + assert( + left.end_sponge_blob.eq(right.start_sponge_blob), + "input proofs have different blob data sponges", + ); } -// TODO(Miranda): split out? pub fn assert_prev_block_rollups_follow_on_from_each_other( left: BlockRootOrBlockMergePublicInputs, right: BlockRootOrBlockMergePublicInputs, @@ -161,6 +167,33 @@ pub fn accumulate_blocks_fees( array_merge(left.fees, right.fees) } +// TODO: This fn will be obselete once we have integrated accumulation of blob PIs +// The goal is to acc. the commitments and openings s.t. one set verifies the opening of many blobs +// How we accumulate is being worked on by @Mike +pub fn accumulate_blob_public_inputs( + left: BlockRootOrBlockMergePublicInputs, + right: BlockRootOrBlockMergePublicInputs, +) -> [BlockBlobPublicInputs; AZTEC_MAX_EPOCH_DURATION] { + let left_len = array_length(left.blob_public_inputs); + let right_len = array_length(right.blob_public_inputs); + assert( + left_len + right_len <= AZTEC_MAX_EPOCH_DURATION, + "too many blob public input structs accumulated in rollup", + ); + // NB: For some reason, the below is around 150k gates cheaper than array_merge + let mut add_from_left = true; + let mut result = [BlockBlobPublicInputs::empty(); AZTEC_MAX_EPOCH_DURATION]; + for i in 0..result.len() { + add_from_left &= i != left_len; + if (add_from_left) { + result[i] = left.blob_public_inputs[i]; + } else { + result[i] = right.blob_public_inputs[i - left_len]; + } + } + result +} + /** * @brief From two previous rollup data, compute a single out hash * @@ -173,7 +206,7 @@ pub fn compute_out_hash(previous_rollup_data: [PreviousRollupData; 2]) -> Field previous_rollup_data[1].base_or_merge_rollup_public_inputs.out_hash, ]) } -// TODO(Miranda): combine fns? + pub fn compute_blocks_out_hash(previous_rollup_data: [PreviousRollupBlockData; 2]) -> Field { if previous_rollup_data[1].block_root_or_block_merge_public_inputs.is_padding() { previous_rollup_data[0].block_root_or_block_merge_public_inputs.out_hash @@ -192,127 +225,216 @@ pub fn compute_kernel_out_hash(l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX]) } /** - * @brief From two previous rollup data, compute a single txs effects hash - * - * @param previous_rollup_data - * @return The hash of the transaction effects stored in 2 fields + * Asserts that the first sponge blob was empty to begin with. + * This prevents injecting unchecked tx effects in the first base of a rollup. */ -pub fn compute_txs_effects_hash(previous_rollup_data: [PreviousRollupData; 2]) -> Field { - accumulate_sha256([ - previous_rollup_data[0].base_or_merge_rollup_public_inputs.txs_effects_hash, - previous_rollup_data[1].base_or_merge_rollup_public_inputs.txs_effects_hash, - ]) +pub fn assert_first_sponge_blob_empty(left: BaseOrMergeRollupPublicInputs) { + let expected_sponge_blob = SpongeBlob::new(left.start_sponge_blob.expected_fields); + assert( + left.start_sponge_blob.eq(expected_sponge_blob), + "block's first blob sponge was not empty", + ); } -fn silo_and_hash_unencrypted_logs( - unencrypted_logs_hashes: [ScopedLogHash; N], -) -> Field { - let siloed_logs = unencrypted_logs_hashes.map(|log: ScopedLogHash| { - LogHash { - value: silo_unencrypted_log_hash(log), - counter: log.log_hash.counter, - length: log.log_hash.length, - } - }); - compute_tx_logs_hash(siloed_logs) +/** + * Converts given type (e.g. note hashes = 3) and length (e.g. 5) into a prefix: 0x03000005. + * Uses 2 bytes to encode the length even when we only need 1 to keep uniform. + */ +pub fn encode_blob_prefix(input_type: u8, array_len: u32) -> Field { + let len_bytes = (array_len as Field).to_be_bytes::<2>(); + field_from_bytes([input_type, 0, len_bytes[0], len_bytes[1]], true) } -// Tx effects hash consists of +// Tx effects consist of // 1 field for revert code // 1 field for transaction fee // MAX_NOTE_HASHES_PER_TX fields for note hashes // MAX_NULLIFIERS_PER_TX fields for nullifiers -// 1 field for L2 to L1 messages (represented by the out_hash) +// MAX_L2_TO_L1_MSGS_PER_TX for L2 to L1 messages // MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX public data update requests -> MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2 fields +// TODO(#8954): When logs are refactored into fields, we will append the values here, for now appending the log hashes: // MAX_PRIVATE_LOGS_PER_TX * PRIVATE_LOG_SIZE_IN_FIELDS fields for private logs -// __ -// 1 unencrypted logs length --> 1 field |-> 2 types of flexible-length logs - 2 fields for their lengths -// 1 contract class logs length --> 1 field __| -// __ -// 1 unencrypted logs hash --> 1 sha256 hash -> 31 bytes -> 1 fields | Beware when populating bytes that we fill (prepend) to 32! |-> 2 types of flexible-length logs - 2 fields for their hashes -// 1 contract class logs hash --> 1 sha256 hash -> 31 bytes -> 1 fields | Beware when populating bytes that we fill (prepend) to 32! __| -pub(crate) global TX_EFFECTS_HASH_INPUT_FIELDS: u32 = 1 +// MAX_UNENCRYPTED_LOGS_PER_TX fields for unencrypted logs +// MAX_CONTRACT_CLASS_LOGS_PER_TX fields for contract class logs +// 7 fields for prefixes for each of the above categories +pub(crate) global TX_EFFECTS_BLOB_HASH_INPUT_FIELDS: u32 = 1 + 1 + MAX_NOTE_HASHES_PER_TX + MAX_NULLIFIERS_PER_TX - + 1 + + MAX_L2_TO_L1_MSGS_PER_TX + MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX * 2 + MAX_PRIVATE_LOGS_PER_TX * PRIVATE_LOG_SIZE_IN_FIELDS - + 2 - + 2; - -// Computes the tx effects hash for a base rollup (a single transaction) -pub fn compute_tx_effects_hash( + + MAX_UNENCRYPTED_LOGS_PER_TX + + MAX_CONTRACT_CLASS_LOGS_PER_TX + + 7; +pub fn append_tx_effects_for_blob( combined: CombinedAccumulatedData, revert_code: u8, transaction_fee: Field, all_public_data_update_requests: [PublicDataWrite; MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX], - out_hash: Field, -) -> Field { - let mut tx_effects_hash_input: BoundedVec = - BoundedVec::new(); + l2_to_l1_msgs: [Field; MAX_L2_TO_L1_MSGS_PER_TX], + start_sponge_blob: SpongeBlob, +) -> SpongeBlob { + let mut tx_effects_hash_input = [0; TX_EFFECTS_BLOB_HASH_INPUT_FIELDS]; + + let note_hashes = combined.note_hashes; + let nullifiers = combined.nullifiers; // Public writes are the concatenation of all non-empty user update requests and protocol update requests, then padded with zeroes. // The incoming all_public_data_update_requests may have empty update requests in the middle, so we move those to the end of the array. let public_data_update_requests = get_all_update_requests_for_tx_effects(all_public_data_update_requests); + let private_logs = combined.private_logs; + let unencrypted_logs = + combined.unencrypted_logs_hashes.map(|log: ScopedLogHash| silo_unencrypted_log_hash(log)); + let contract_class_logs = combined.contract_class_logs_hashes.map(|log: ScopedLogHash| { + silo_unencrypted_log_hash(log) + }); - let unencrypted_logs_length = combined.unencrypted_log_preimages_length; - let contract_class_logs_length = combined.contract_class_log_preimages_length; - let unencrypted_logs_hash = silo_and_hash_unencrypted_logs(combined.unencrypted_logs_hashes); - let contract_class_logs_hash = - silo_and_hash_unencrypted_logs(combined.contract_class_logs_hashes); + let mut offset = 0; + let mut array_len = 0; - // REVERT CODE - // upcast to Field to have the same size for the purposes of the hash - tx_effects_hash_input.push(revert_code as Field); + // NB: for publishing fields of blob data we use the first element of the blob to encode: + // TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // Two bytes are used to encode the number of fields appended here, given by 'offset' + // We only know the value once the appending is complete, hence we overwrite input[0] below + tx_effects_hash_input[offset] = 0; + offset += 1; // TX FEE - tx_effects_hash_input.push(transaction_fee); + // Using 29 bytes to encompass all reasonable fee lengths + tx_effects_hash_input[offset] = field_from_bytes( + array_concat([TX_FEE_PREFIX, 0], transaction_fee.to_be_bytes::<29>()), + true, + ); + offset += 1; + // NB: The array_length function does NOT constrain we have a sorted left-packed array. + // We can use it because all inputs here come from the kernels which DO constrain left-packing. + // If that ever changes, we will have to constrain it by counting items differently. // NOTE HASHES - tx_effects_hash_input.extend_from_array(combined.note_hashes); + array_len = array_length(note_hashes); + if array_len != 0 { + let notes_prefix = encode_blob_prefix(NOTES_PREFIX, array_len); + tx_effects_hash_input[offset] = notes_prefix; + offset += 1; + + for j in 0..MAX_NOTE_HASHES_PER_TX { + tx_effects_hash_input[offset + j] = note_hashes[j]; + } + offset += array_len; + } // NULLIFIERS - tx_effects_hash_input.extend_from_array(combined.nullifiers); + array_len = array_length(nullifiers); + if array_len != 0 { + let nullifiers_prefix = encode_blob_prefix(NULLIFIERS_PREFIX, array_len); + tx_effects_hash_input[offset] = nullifiers_prefix; + offset += 1; + + for j in 0..MAX_NULLIFIERS_PER_TX { + tx_effects_hash_input[offset + j] = nullifiers[j]; + } + offset += array_len; + } // L2 TO L1 MESSAGES - tx_effects_hash_input.push(out_hash); + array_len = array_length(l2_to_l1_msgs); + if array_len != 0 { + let l2_to_l1_msgs_prefix = encode_blob_prefix(L2_L1_MSGS_PREFIX, array_len); + tx_effects_hash_input[offset] = l2_to_l1_msgs_prefix; + offset += 1; + + for j in 0..MAX_L2_TO_L1_MSGS_PER_TX { + tx_effects_hash_input[offset + j] = l2_to_l1_msgs[j]; + } + offset += array_len; + } // PUBLIC DATA UPDATE REQUESTS - for j in 0..MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX { - tx_effects_hash_input.extend_from_array(public_data_update_requests[j].serialize()); + array_len = array_length(public_data_update_requests); + if array_len != 0 { + let public_data_update_requests_prefix = + encode_blob_prefix(PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, array_len * 2); + tx_effects_hash_input[offset] = public_data_update_requests_prefix; + offset += 1; + for j in 0..MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX { + tx_effects_hash_input[offset + j * 2] = public_data_update_requests[j].leaf_slot; + tx_effects_hash_input[offset + j * 2 + 1] = public_data_update_requests[j].value; + } + offset += array_len * 2; } + // TODO(Miranda): squash 0s in a nested loop and add len prefix? // PRIVATE_LOGS - for j in 0..MAX_PRIVATE_LOGS_PER_TX { - tx_effects_hash_input.extend_from_array(combined.private_logs[j].fields); - } + array_len = array_length(private_logs) * PRIVATE_LOG_SIZE_IN_FIELDS; + if array_len != 0 { + let private_logs_prefix = encode_blob_prefix(PRIVATE_LOGS_PREFIX, array_len); + tx_effects_hash_input[offset] = private_logs_prefix; + offset += 1; - // UNENCRYPTED LOGS LENGTH - tx_effects_hash_input.push(unencrypted_logs_length); + for j in 0..MAX_PRIVATE_LOGS_PER_TX { + for k in 0..PRIVATE_LOG_SIZE_IN_FIELDS { + let index = offset + j * PRIVATE_LOG_SIZE_IN_FIELDS + k; + tx_effects_hash_input[index] = private_logs[j].fields[k]; + } + } + offset += array_len; + } - // CONTRACT CLASS LOGS LENGTH - tx_effects_hash_input.push(contract_class_logs_length); + // TODO(#8954): When logs are refactored into fields, we will append the values here + // Currently appending the single log hash as an interim solution + // UNENCRYPTED LOGS + array_len = array_length(unencrypted_logs); + if array_len != 0 { + let unencrypted_logs_prefix = encode_blob_prefix(UNENCRYPTED_LOGS_PREFIX, array_len); + tx_effects_hash_input[offset] = unencrypted_logs_prefix; + offset += 1; - // UNENCRYPTED LOGS HASH - tx_effects_hash_input.push(unencrypted_logs_hash); + for j in 0..MAX_UNENCRYPTED_LOGS_PER_TX { + tx_effects_hash_input[offset + j] = unencrypted_logs[j]; + } + offset += array_len; + } - // CONTRACT CLASS LOGS HASH - tx_effects_hash_input.push(contract_class_logs_hash); + // CONTRACT CLASS LOGS + array_len = array_length(contract_class_logs); + if array_len != 0 { + let contract_class_logs_prefix = encode_blob_prefix(CONTRACT_CLASS_LOGS_PREFIX, array_len); + tx_effects_hash_input[offset] = contract_class_logs_prefix; + offset += 1; - assert_eq(tx_effects_hash_input.len(), TX_EFFECTS_HASH_INPUT_FIELDS); // Sanity check - let mut hash_input_flattened = [0; TX_EFFECTS_HASH_INPUT_FIELDS * 32]; - for offset in 0..TX_EFFECTS_HASH_INPUT_FIELDS { - // TODO: This is not checking that the decomposition is smaller than P - let input_as_bytes: [u8; 32] = tx_effects_hash_input.get_unchecked(offset).to_be_radix(256); - for byte_index in 0..32 { - hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index]; + for j in 0..MAX_CONTRACT_CLASS_LOGS_PER_TX { + tx_effects_hash_input[offset + j] = contract_class_logs[j]; } + offset += array_len; + } + + // Now we know the number of fields appended, we can assign the first value: + // TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // Start prefix is "tx_start".to_field() => 8 bytes + let prefix_bytes = TX_START_PREFIX.to_be_bytes::<8>(); + let length_bytes = (offset as Field).to_be_bytes::<2>(); + // REVERT CODE + tx_effects_hash_input[0] = field_from_bytes( + array_concat( + prefix_bytes, + [0, length_bytes[0], length_bytes[1], 0, REVERT_CODE_PREFIX, 0, revert_code], + ), + true, + ); + + // NB: using start.absorb & returning start caused issues in ghost values appearing in + // base_rollup_inputs.start when using a fresh sponge. These only appeared when simulating via wasm. + let mut out_sponge = start_sponge_blob; + + // If we have an empty tx (usually a padding tx), we don't want to absorb anything + // An empty tx will only have 2 effects - revert code and fee - hence offset = 2 + if offset != 2 { + out_sponge.absorb(tx_effects_hash_input, offset); } - let sha_digest = dep::types::hash::sha256_to_field(hash_input_flattened); - sha_digest + out_sponge } fn get_all_update_requests_for_tx_effects( diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr index 5253c3cc412..72cb2d7bfbe 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/merge/merge_rollup_inputs.nr @@ -42,8 +42,6 @@ impl MergeRollupInputs { components::assert_equal_constants(left, right); components::assert_prev_rollups_follow_on_from_each_other(left, right); - // compute calldata hash: - let txs_effects_hash = components::compute_txs_effects_hash(self.previous_rollup_data); let out_hash = components::compute_out_hash(self.previous_rollup_data); let accumulated_fees = components::accumulate_fees(left, right); @@ -56,7 +54,8 @@ impl MergeRollupInputs { constants: left.constants, start: left.start, end: right.end, - txs_effects_hash, + start_sponge_blob: left.start_sponge_blob, + end_sponge_blob: right.end_sponge_blob, out_hash, accumulated_fees, accumulated_mana_used, @@ -71,7 +70,6 @@ mod tests { use dep::types::constants::{ MERGE_ROLLUP_INDEX, PRIVATE_BASE_ROLLUP_VK_INDEX, ROOT_PARITY_INDEX, }; - use dep::types::hash::accumulate_sha256; use types::merkle_tree::merkle_tree::MerkleTree; use types::tests::fixtures; @@ -113,6 +111,16 @@ mod tests { let _output = inputs.merge_rollup_circuit(); } + #[test(should_fail_with = "input proofs have different blob data sponges")] + fn previous_rollups_dont_follow_sponge() { + let mut inputs = default_merge_rollup_inputs(); + inputs.previous_rollup_data[0].base_or_merge_rollup_public_inputs.end_sponge_blob.sponge.state[0] = + 0; + inputs.previous_rollup_data[1].base_or_merge_rollup_public_inputs.start_sponge_blob.sponge.state[0] = + 1; + let _output = inputs.merge_rollup_circuit(); + } + #[test] fn rollup_fields_are_set_correctly() { let mut inputs = default_merge_rollup_inputs(); @@ -170,12 +178,13 @@ mod tests { } #[test] - fn txs_effects_hash() { + fn txs_effects_sponge() { let mut inputs = default_merge_rollup_inputs(); - let expected_hash = accumulate_sha256([1, 2]); let outputs = inputs.merge_rollup_circuit(); + let mut expected_sponge = outputs.start_sponge_blob; + expected_sponge.absorb([1, 2], 2); - assert_eq(outputs.txs_effects_hash, expected_hash); + assert_eq(outputs.end_sponge_blob, expected_sponge); } #[test] diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_inputs.nr index 490d6dd2116..c94ece862f3 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_inputs.nr @@ -51,6 +51,12 @@ impl RootRollupInputs { let fees = components::accumulate_blocks_fees(left, right); + // TODO: We need to eventually accumulate blob info to a single BlobPublicInputs instance which will verify multiple blobs in one call + // For now, we do them individually + // How we accumulate is being worked on by @Mike + // let blob_public_inputs = left.blob_public_inputs.accumulate(right.blob_public_inputs); + let blob_public_inputs = components::accumulate_blob_public_inputs(left, right); + RootRollupPublicInputs { previous_archive: left.previous_archive, end_archive: right.new_archive, @@ -63,6 +69,7 @@ impl RootRollupInputs { vk_tree_root: left.vk_tree_root, protocol_contract_tree_root: left.protocol_contract_tree_root, prover_id: self.prover_id, + blob_public_inputs, } } } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr index d24568e1a2b..c534e3bf0f3 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/root/root_rollup_public_inputs.nr @@ -1,7 +1,7 @@ use crate::abis::block_root_or_block_merge_public_inputs::FeeRecipient; use dep::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot; use dep::types::constants::AZTEC_MAX_EPOCH_DURATION; - +use blob::blob_public_inputs::BlockBlobPublicInputs; pub struct RootRollupPublicInputs { // Snapshot of archive tree before/after this rollup has been processed pub previous_archive: AppendOnlyTreeSnapshot, @@ -15,4 +15,5 @@ pub struct RootRollupPublicInputs { pub vk_tree_root: Field, pub protocol_contract_tree_root: Field, pub prover_id: Field, + pub blob_public_inputs: [BlockBlobPublicInputs; AZTEC_MAX_EPOCH_DURATION], } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/block_root_rollup_inputs.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/block_root_rollup_inputs.nr index 3d33d83ad26..0e7f42bfb6e 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/block_root_rollup_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/block_root_rollup_inputs.nr @@ -58,5 +58,8 @@ pub fn default_block_root_rollup_inputs() -> BlockRootRollupInputs { inputs.previous_rollup_data = default_previous_rollup_data(); + inputs.blobs_fields[0] = 1; + inputs.blobs_fields[1] = 2; + inputs } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_block_data.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_block_data.nr index 7b70fb93e17..714c410eef9 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_block_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_block_data.nr @@ -55,5 +55,10 @@ pub fn default_previous_rollup_block_data() -> [PreviousRollupBlockData; 2] { previous_rollup_data[0].block_root_or_block_merge_public_inputs.fees[0].value = 10; previous_rollup_data[1].block_root_or_block_merge_public_inputs.fees[0].value = 15; + previous_rollup_data[0].block_root_or_block_merge_public_inputs.blob_public_inputs[0].inner[0].z = + 1; + previous_rollup_data[1].block_root_or_block_merge_public_inputs.blob_public_inputs[0].inner[0].z = + 2; + previous_rollup_data } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr index 962ff736dfa..98eb969713e 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/tests/previous_rollup_data.nr @@ -4,6 +4,7 @@ use dep::types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot; use dep::types::constants::PUBLIC_BASE_ROLLUP_VK_INDEX; use dep::types::merkle_tree::MembershipWitness; use dep::types::tests::fixtures; +use types::abis::sponge_blob::SpongeBlob; use types::merkle_tree::merkle_tree::MerkleTree; pub fn default_previous_rollup_data() -> [PreviousRollupData; 2] { @@ -46,6 +47,14 @@ pub fn default_previous_rollup_data() -> [PreviousRollupData; 2] { previous_rollup_data[1].base_or_merge_rollup_public_inputs.end.nullifier_tree = AppendOnlyTreeSnapshot { root: 2, next_available_leaf_index: 2 }; + previous_rollup_data[0].base_or_merge_rollup_public_inputs.start.public_data_tree = + AppendOnlyTreeSnapshot { root: 0, next_available_leaf_index: 1 }; + previous_rollup_data[0].base_or_merge_rollup_public_inputs.end.public_data_tree = + AppendOnlyTreeSnapshot { root: 1, next_available_leaf_index: 2 }; + previous_rollup_data[1].base_or_merge_rollup_public_inputs.start.public_data_tree = + AppendOnlyTreeSnapshot { root: 1, next_available_leaf_index: 2 }; + previous_rollup_data[1].base_or_merge_rollup_public_inputs.end.public_data_tree = + AppendOnlyTreeSnapshot { root: 2, next_available_leaf_index: 3 }; previous_rollup_data[0].base_or_merge_rollup_public_inputs.start.public_data_tree = AppendOnlyTreeSnapshot { root: 0, next_available_leaf_index: 1 }; previous_rollup_data[0].base_or_merge_rollup_public_inputs.end.public_data_tree = @@ -61,8 +70,15 @@ pub fn default_previous_rollup_data() -> [PreviousRollupData; 2] { previous_rollup_data[0].base_or_merge_rollup_public_inputs.num_txs = 1; previous_rollup_data[1].base_or_merge_rollup_public_inputs.num_txs = 1; - previous_rollup_data[0].base_or_merge_rollup_public_inputs.txs_effects_hash = 1; - previous_rollup_data[1].base_or_merge_rollup_public_inputs.txs_effects_hash = 2; + let mut sponge_blob = SpongeBlob::new(2); + previous_rollup_data[0].base_or_merge_rollup_public_inputs.start_sponge_blob = sponge_blob; + + sponge_blob.absorb([1], 1); + previous_rollup_data[0].base_or_merge_rollup_public_inputs.end_sponge_blob = sponge_blob; + previous_rollup_data[1].base_or_merge_rollup_public_inputs.start_sponge_blob = sponge_blob; + + sponge_blob.absorb([2], 1); + previous_rollup_data[1].base_or_merge_rollup_public_inputs.end_sponge_blob = sponge_blob; previous_rollup_data[0].base_or_merge_rollup_public_inputs.out_hash = 1; previous_rollup_data[1].base_or_merge_rollup_public_inputs.out_hash = 2; diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-merge/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/rollup-merge/Prover.toml similarity index 77% rename from noir-projects/noir-protocol-circuits/crates/rollup-merge/SampleInputs.toml rename to noir-projects/noir-protocol-circuits/crates/rollup-merge/Prover.toml index e4824b9832c..a405158a2df 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-merge/SampleInputs.toml +++ b/noir-projects/noir-protocol-circuits/crates/rollup-merge/Prover.toml @@ -2,59 +2,96 @@ [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs] rollup_type = "0x0000000000000000000000000000000000000000000000000000000000000000" num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" -txs_effects_hash = "0x00a22af3d0a87a1225b4ae5602514be210fba48609fda9d59c4ec09bd5d78f07" -out_hash = "0x001b5c541b9085ddea40a9d56d080c53a920e1753bf11f46bc1872663a1e7dc6" -accumulated_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" -accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000000000" +out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +accumulated_fees = "0x0000000000000000000000000000000000000000000000000007a1b1bce60cc8" +accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000009af2" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants] - vk_tree_root = "0x0a2c34220aa778be6f9e8c76c1d65c5a35de6c9f5bffc69146d1863b20e1cbcd" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x257719447a2c71ab94f300207f5a8096a1b8c9f15a614e409d7d48f95c6bdff9" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.last_archive] - root = "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000001" + root = "0x22697e2f4dca9f7c06b64c9a987d5e3411f2f28786d9f1d48ce27b61b8d8abe3" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000001" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000014" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2d53" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000b5b0e9c243b20a09c501dee16790e9dfc23506bc" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.note_hash_tree] -root = "0x1c8d2b8a345fb56dd80d3d1943f5c5af2cbe5d14e586fa9614150f41aadb2591" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000080" +root = "0x2b93be1d42d6277477a71a288ca7f05209d7edefdde05a5fc7e424d8ba4882a7" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000300" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.nullifier_tree] -root = "0x1a6ded7e84ef6a9c6a018d8a9c3a7e1598550be46551ac42e49439589bbc0bdc" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000100" +root = "0x26f5b03416869c68bccb4bbf106ec858d6a3e822527bc8c48fdd6ba7cfd884ec" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.public_data_tree] -root = "0x181c1b960cb9a41644cbb22b662b1245bea39f89fb512cba1e75683ace96cba7" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000fe" +root = "0x2da9b69e8a02d9a3b9372d63f6eb07578d3a901d7d9bb5eed7e0723edbe02da1" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.note_hash_tree] -root = "0x20e1f2bba7e6317997da924c0bcfdb3a2772286d8f2a54afd065ee0c7c9bcbb2" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000c0" +root = "0x2b93be1d42d6277477a71a288ca7f05209d7edefdde05a5fc7e424d8ba4882a7" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000340" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.nullifier_tree] -root = "0x159d5885c8238582e5b683a7672d35a33cfca40296e1800ce05e3c9399b76c65" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000140" +root = "0x24ede285714e37dbc99f53093e640034e671b219229c72f354bf78f409f9f383" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.public_data_tree] -root = "0x09b0026a33b8c5d607e3716682110e5e2f7dc6eace3c4bf9e8dbc51ebfb57333" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000013d" +root = "0x2da9b69e8a02d9a3b9372d63f6eb07578d3a901d7d9bb5eed7e0723edbe02da1" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000000" + expected_fields = "0x000000000000000000000000000000000000000000000000000000000000004f" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob.sponge] + cache = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + state = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000004f0000000000000000" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000000" + squeeze_mode = false + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000007" + expected_fields = "0x000000000000000000000000000000000000000000000000000000000000004f" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob.sponge] + cache = [ + "0x12e7b967d4eedec7cbc843b52b7413174df59b4d212a07cd5137bfb5914e9387", + "0x0000000000000000000000000000000000000000000000000000000006000002", + "0x02f71e7f13a0520af9e75ee37b71703ace10b7df98538c8384614743dc310151" +] + state = [ + "0x0212f33afeb25b4d2de9e2d9a2d20e3c8995c949b22f3e6f5d2839c84a236d6f", + "0x23c128d8c6faf52fbd5408e415baad147807a63384a20e0b177d8ebc8d1bb0f4", + "0x165d09f061a90bac1945fde4922ec437a8a7a21138819bcb78c0079297bece5f", + "0x0ba3a0bbbc38b7389727f6bce882b3c584b85ce4830bb22c3068eb02e28ab0ab" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000001" + squeeze_mode = false [inputs.previous_rollup_data.proof] fields = [ @@ -526,109 +563,109 @@ fields = [ [inputs.previous_rollup_data.vk] key = [ "0x0000000000000000000000000000000000000000000000000000000002000000", - "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000044", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000cf7aae3b32ca469d2f4d8a50c545108793", - "0x000000000000000000000000000000000026c7f58b227bb11a7a07e90703a075", - "0x0000000000000000000000000000001779e9f1ebdcb0ca1d84c08f421c93d426", - "0x00000000000000000000000000000000002ebecedeb00025ef191427dfc03a70", - "0x000000000000000000000000000000387bf48c649f17aa11ce41732f34da2caa", - "0x0000000000000000000000000000000000154b6df3ae3e59669911aad19ba8cf", - "0x00000000000000000000000000000014d454a803987d756c8f2bbab83882a540", - "0x00000000000000000000000000000000001ab08c5e36abe25ff380dc3adb9bda", - "0x000000000000000000000000000000da77e17e4e68b7b1e455bec03e6e252fff", - "0x00000000000000000000000000000000001602b54c6fb1be67505c53835d04b5", - "0x00000000000000000000000000000005e0432c5876726787ffbb0762feaba6b1", - "0x0000000000000000000000000000000000094d1adda66fdbd7a9253998781016", - "0x000000000000000000000000000000c2601a4ccbc080e67cd00bf7d009cebf2a", - "0x0000000000000000000000000000000000196e55f78bd7061758ba437e24e6d3", - "0x000000000000000000000000000000d09742cde1f4a7ea0a9c0c75d42e19953f", - "0x000000000000000000000000000000000007ebaa6f5a81fa264544a3e3f2d957", - "0x000000000000000000000000000000a44e97ce02886ed0cf4e98daf7cb812893", - "0x00000000000000000000000000000000000e843e5994f9b9c449580f3635effc", - "0x000000000000000000000000000000a499c0a21cc98597d274c0b638e4648251", - "0x0000000000000000000000000000000000042d98fcad3c97caf60136088bb556", - "0x000000000000000000000000000000d264c197db47937b73339bf7df95c0d1dc", - "0x00000000000000000000000000000000000f85688ca6c4a17c12696d605bbb88", - "0x0000000000000000000000000000009b62cb539b9f366b0afb58fabaa44e4d6a", - "0x000000000000000000000000000000000002db8231d2555206a44704d148815f", - "0x00000000000000000000000000000071eb739e60844dbf8fe4a2497e4814ba10", - "0x000000000000000000000000000000000017224a4aeb150b55389a80b001d891", - "0x0000000000000000000000000000001bc31d8fe314083f029fa49d0bd57e9886", - "0x00000000000000000000000000000000001622ee6835627cd77e6af4349868c6", - "0x000000000000000000000000000000871ac800a816f01bab25ae11e91fe265cf", - "0x00000000000000000000000000000000000de628ea9f6f8927b9e288cd02a3b5", - "0x000000000000000000000000000000b3df87db452211210f3792526e99e5945a", - "0x00000000000000000000000000000000001844ebed80892d2ec8e7af36206a76", - "0x00000000000000000000000000000019b837e6d28692e6c6705ade951abb2ed7", - "0x00000000000000000000000000000000002074a622d7ff106f5b5c3bedb1ec0c", - "0x000000000000000000000000000000c6aa8ac39c35c0b6e14fa7664a69490e80", - "0x000000000000000000000000000000000002aa9bf7548ae3e3f864bea85d72df", - "0x000000000000000000000000000000d22ee91bea65f007418b9c7a3217acd957", - "0x000000000000000000000000000000000021fd628fc97d1e9e5296eae57d2f39", - "0x000000000000000000000000000000a264bd14b93ecf8316f9ffba3a47b468df", - "0x000000000000000000000000000000000029f77c8df0b6784115f16c9e891378", - "0x000000000000000000000000000000536c3cd3ff6672ae223ca208819234e72d", - "0x000000000000000000000000000000000014b3f5c4aa15524379cb8456bbaf86", - "0x00000000000000000000000000000085b0ed97a29b17f1c3d85774ecbb2f18c9", - "0x000000000000000000000000000000000019ffadb5418e1f7ac4bb4ec82598c3", - "0x000000000000000000000000000000256ccb468927dbe175db51cb84ed0584f9", - "0x000000000000000000000000000000000008d8032c33d889ac3f8b7d2749c14c", - "0x000000000000000000000000000000a6fb969f0064c94c7453eb1f700c9ddf21", - "0x000000000000000000000000000000000025f1c380479463f3648528c9d962ba", - "0x000000000000000000000000000000468708e77ce671f3fb24e16a0d293c9e5e", - "0x000000000000000000000000000000000029bce6e077cab900d532180a55a464", - "0x000000000000000000000000000000817c98127722255c0ee0bc8b9c7e515f0f", - "0x00000000000000000000000000000000000c454267f4046ada9b1267df1762b7", - "0x00000000000000000000000000000094b9dcde3aa9be048fe79cd676ee3dd282", - "0x000000000000000000000000000000000018694989d7c42d241ce9972b39845c", - "0x00000000000000000000000000000029547d3893b4c3399328cf40da2867dfa9", - "0x00000000000000000000000000000000002f888f7d619bf3dbffaae4748ac301", - "0x000000000000000000000000000000e420ccd42a6e490fc41fce12445e73e912", - "0x0000000000000000000000000000000000217af1e51572a0c5f9b60d64602831", - "0x000000000000000000000000000000f91bec2dde1e04dae492c854536c05136c", - "0x0000000000000000000000000000000000039d11cd46ee19c0d01bbf92fdce9c", - "0x0000000000000000000000000000005f0355a2cc355f86c3f42bfc2dd2d516b6", - "0x000000000000000000000000000000000019d70dd034f8901c4b8e356cd51f09", - "0x000000000000000000000000000000e3c219ea1329ee58b87b1d14ef5fc2da70", - "0x00000000000000000000000000000000002e96b13b163ffe4b07a0e667ed8fcb", - "0x00000000000000000000000000000084d928386288b7d9d70a37c16a4fad9b8d", - "0x00000000000000000000000000000000001ce08e8f9c31010f09fd2fe27b02b2", - "0x000000000000000000000000000000630966f03f6aa8b2dac36726f8e2b3c5b3", - "0x000000000000000000000000000000000013555d9bfcd1f13eed48fffa85bc8c", - "0x0000000000000000000000000000002baca943724a8fe0b97884771958934e5a", - "0x0000000000000000000000000000000000282fb3b18d49b3395fb34d72b8c392", - "0x00000000000000000000000000000085d1ebe6e5df08db7754cadef595ad858e", - "0x00000000000000000000000000000000001f3a892f0d944b019c8b3c8d00da0f", - "0x000000000000000000000000000000a2983ce44d445827f3a99df7cac721f7f5", - "0x000000000000000000000000000000000020d7548093ae3a9e0a967339d9eeff", - "0x0000000000000000000000000000006bcdac56e9fe483c48214af2d025ce32c7", - "0x00000000000000000000000000000000001d2766e3a4c532dfee3310fb730f2f", - "0x0000000000000000000000000000004600c5c674ccd36554df9ff9a53df7c9b0", - "0x0000000000000000000000000000000000213f4bd856c195404eb5474d0c5cbf", - "0x000000000000000000000000000000e27272553dd77bfd245852e45ad1687d04", - "0x00000000000000000000000000000000002452ea2b418dd94ca5e0d4a3a8ac5f", - "0x00000000000000000000000000000098443f2f524263675ce0efe0f57e1ee348", - "0x00000000000000000000000000000000002896c216c0e1d5693add6968e8b571", - "0x000000000000000000000000000000bb4e8fd85c1d16646f5b5b4455c525c7b0", - "0x00000000000000000000000000000000001ead44b4a96647d30caab22bab191e", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000007acea76220f3dcf559941a7e87a6b28907", + "0x000000000000000000000000000000000017503e58c81a120517cdb8a4f99a55", + "0x00000000000000000000000000000030e0a46a7056ec5d122358957f34be6420", + "0x000000000000000000000000000000000019af3ba7be026356d5013338e6a9c8", + "0x000000000000000000000000000000941c8c03340dc6ac1ac21dfc245eec52ae", + "0x000000000000000000000000000000000028a50b16a95bfe8d5d5910fa14acf9", + "0x000000000000000000000000000000d750fd9b7a01bfd4e6553bf8ab2e513a06", + "0x000000000000000000000000000000000005cb7ef208180dc12701ec1bf16e6e", + "0x000000000000000000000000000000226a41a3cde055871146a14f69ceed3189", + "0x00000000000000000000000000000000001905f4d4e4516041c993103f21ed23", + "0x000000000000000000000000000000e1343257a50d0cf1554d5fa39b63807f82", + "0x000000000000000000000000000000000029c01e95b47fd55a3af50c144b0334", + "0x000000000000000000000000000000061cb8849db1149ba384d6eb537ec1d821", + "0x00000000000000000000000000000000001bd9e9b6b2864c7e76f8d6f987d224", + "0x000000000000000000000000000000fbd7c650b1b4c0ba0255b744ddd75e735c", + "0x000000000000000000000000000000000014ac90285cdead0ec12cad3d8d3a31", + "0x00000000000000000000000000000004bd04287093441c75d05b6cb594d378de", + "0x00000000000000000000000000000000001cfa05ce692088c27bb7e9a8a262c2", + "0x0000000000000000000000000000000943740754bb6d7f5fb55d5570754381c0", + "0x000000000000000000000000000000000006cfaa5c166143d59ab33b6f57b88c", + "0x000000000000000000000000000000c3f3c5edfca877fb6c14f7e913c178f044", + "0x00000000000000000000000000000000001def2c9873d161b5ffc87d4b9c60dc", + "0x0000000000000000000000000000002837ed4f4febbbe8635ac74a35ef13542d", + "0x00000000000000000000000000000000002e15fa9496d154e169360820b701f7", + "0x0000000000000000000000000000007f4ae2590c599ca3e076d8a504c9761169", + "0x000000000000000000000000000000000008d15a8f153ffea92236a73f8e00ec", + "0x0000000000000000000000000000009a5f9f5cc321cda5967ab3977408842a1b", + "0x00000000000000000000000000000000001aef0ad6d98239a10226c1e7a66701", + "0x00000000000000000000000000000013ed1c45df71665ea0553a8a92ef89b0ea", + "0x00000000000000000000000000000000001e6c3f8b5ee0db10934643cab5960c", + "0x000000000000000000000000000000e6fa0a76bfb524488e71aa8cba569d3273", + "0x00000000000000000000000000000000000e146846a27a9e994aa5eb95368e43", + "0x0000000000000000000000000000004722d45629beb72092ae034d7a116eea80", + "0x000000000000000000000000000000000011b3074e83b178395fdbf16779ecd4", + "0x000000000000000000000000000000a1560ad69fb0f87cbb68e2469c17405a88", + "0x000000000000000000000000000000000016664440497257aab435766cd8daa4", + "0x0000000000000000000000000000008c0e5d61ceae65541e501766f2133c9a05", + "0x00000000000000000000000000000000000348d59b536e2d9124401c032218d4", + "0x000000000000000000000000000000c3bec12bcd8c5519adc22cc13745a6a5ba", + "0x0000000000000000000000000000000000099b37362358ccfb574e08a5d589c5", + "0x0000000000000000000000000000001a7603f798b4001644ac6346536db682c3", + "0x0000000000000000000000000000000000294bc6e456c49353364126e7acfa5d", + "0x000000000000000000000000000000ab11980eb66b6674b9668c4bf810f2dbd8", + "0x00000000000000000000000000000000002a71b3517077a7e806ed8c7bd41fa5", + "0x0000000000000000000000000000005f94f02f427c74fe51265b2501485c6681", + "0x00000000000000000000000000000000001f6b4f952f28290b3907e9fd89a04d", + "0x0000000000000000000000000000000e0cb8cc77e8e0da284dfa81fb659ed69e", + "0x0000000000000000000000000000000000108d2a188563f05f8c03cc1a1478c1", + "0x0000000000000000000000000000001d68539ab56b251c9bdd606b72eae2fbe2", + "0x0000000000000000000000000000000000222d18f43c8767fbdc01e1149c5606", + "0x00000000000000000000000000000099b18017f081d6cde0fe1dba203d35f031", + "0x0000000000000000000000000000000000144df7fc0ec590f0ae163b2206b2a0", + "0x000000000000000000000000000000fe935114b354bc67d2668722921ebac6ba", + "0x0000000000000000000000000000000000075d80d0ccb2ebb8e503e0bc8830c2", + "0x0000000000000000000000000000003b90abab25d1cc86543ee6ff8bfb36a141", + "0x00000000000000000000000000000000002f2b5f13b32122f25179e756a5bfb6", + "0x000000000000000000000000000000897ab9f551efb564c420ec89c75f025c72", + "0x00000000000000000000000000000000001c0ea2c5e6ab8dbcb5c04b013def2b", + "0x000000000000000000000000000000a0075bff7fe7d309a4a62e4697e0910dee", + "0x00000000000000000000000000000000001dab25f9c69e46eea9ef77449361e4", + "0x00000000000000000000000000000099547f9d90555739ddb33d81f778b79663", + "0x000000000000000000000000000000000009900c88d768eb3db72dd478bde74a", + "0x000000000000000000000000000000d92c26c30401619e97a43b2187b1e133a2", + "0x00000000000000000000000000000000000f991e56504f78fa90c31cb1a39102", + "0x000000000000000000000000000000c2d41c0bbfbf46ba1250ac1c9e0fe538a7", + "0x00000000000000000000000000000000001a64c934662e4d7843869e10bcf0cc", + "0x00000000000000000000000000000060971ccd87ad954d4a3a53beb136a115e5", + "0x000000000000000000000000000000000010bd7c99936aad440199663e48b08c", + "0x0000000000000000000000000000002fdcaae4a7ea95151eaa408586b1860983", + "0x0000000000000000000000000000000000288a0ff0315966a7a54a4884071b87", + "0x0000000000000000000000000000002455cf89f168533af00a61b6cc5dff0b25", + "0x00000000000000000000000000000000002bd11c6ee070b426cbeab3ff2b61b9", + "0x000000000000000000000000000000253a264c658d6d8b3e4a96d1e60d4ddbcf", + "0x000000000000000000000000000000000019e1190a385281dc72fa0d1e6e3173", + "0x00000000000000000000000000000001ca9ee62603b8684b4435a11fbe81fe77", + "0x00000000000000000000000000000000000fb6c90cf416bdc5cad8fcc8c5b077", + "0x000000000000000000000000000000cbaabba02d5684703afd2db78a4f2a9440", + "0x000000000000000000000000000000000029ae159051a17e5ce8e48ac542d5fe", + "0x000000000000000000000000000000d3380d3fc8294269fb9db3fcc5a60a29ca", + "0x00000000000000000000000000000000002b6571e09ef0385e86a817eac71f02", + "0x000000000000000000000000000000dfbc5112ae66004756cc08168e703dbcdc", + "0x00000000000000000000000000000000000a1361207b6352bb3e47b8afdcdee4", + "0x000000000000000000000000000000e9d60c7571a644bd754d4bd8f89ce3f771", + "0x000000000000000000000000000000000025bcafa95e5c0470321ffae1ac1d1f", "0x000000000000000000000000000000e3cb7b601f7eed6dca3e591857166b4d1c", "0x0000000000000000000000000000000000125aad145d0dbafb8da2dc1b0700bc", "0x0000000000000000000000000000007a67f2caa5046f4d1dfc3a63469566de81", @@ -649,81 +686,118 @@ key = [ "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000b82f4c7b24a7eb949025a3fb29aa15debb", - "0x00000000000000000000000000000000001525a4f8bab61cfd24dfe9c254ef33", - "0x00000000000000000000000000000005bba61a5fa776cc77e6d7969d1d458955", - "0x00000000000000000000000000000000001c346a3672483c830e3cec1c7f652e" + "0x00000000000000000000000000000048e3a765d915435b20c18944c02674e924", + "0x000000000000000000000000000000000008468b14fb49e8f7fdd86769c0e96e", + "0x000000000000000000000000000000b79ddc3696c5d21245a4e6e20e566201f1", + "0x00000000000000000000000000000000002a3a1bf035af4b9fb6bf9c890d61ec" ] -hash = "0x01c1214650df7c976a08450b978a8946857f45e3ad1e935b7a264e1c546842c4" +hash = "0x1f07a2890c9deb79fe6cc78935c6dfa810ee56922785f37307cb463f7797f73e" [inputs.previous_rollup_data.vk_witness] leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" sibling_path = [ - "0x2ec70bf222e8f938bacada9560ac9e7b88f9f71c0220e86ae820d05feeb3c33c", + "0x03cde467306e7d05bcd957b9dde81fdb644d6a7e21d7857bc1bf647f78bfde83", "0x19861a044ec84aaf6e41d02a20051d349f07206356e10a0846d4fa892534e306", - "0x2ab7a5c091cc8581f1e4c039e8e5513089defadfdb5799fb6e24e88ec3691678", - "0x1dd26e2769f62418c0ce2f69dd05257679f29fcdc08e99fe15b14ea9b7561d19", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x236d849434a03c2e9d181e5365fe087cb14fd703bff61e5676bfa24c4f4509b7", + "0x019a340a354ef9114e2e61774efec255560cbbdd81448834fe6d764cae443a44", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] [[inputs.previous_rollup_data]] [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs] rollup_type = "0x0000000000000000000000000000000000000000000000000000000000000000" num_txs = "0x0000000000000000000000000000000000000000000000000000000000000001" -txs_effects_hash = "0x008c05e4d4c539596579f80653fd684c59b9dbe409265ec5d8b47de639a5ae07" -out_hash = "0x0047273adb99e83b63de34ffb55956cdacfb2dee4733ba5804d97cdd6615e0b8" -accumulated_fees = "0x0000000000000000000000000000000000000000000000000000000000000000" -accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000000000" +out_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" +accumulated_fees = "0x0000000000000000000000000000000000000000000000000003a83680db4900" +accumulated_mana_used = "0x0000000000000000000000000000000000000000000000000000000000004a40" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants] - vk_tree_root = "0x0a2c34220aa778be6f9e8c76c1d65c5a35de6c9f5bffc69146d1863b20e1cbcd" - protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" + vk_tree_root = "0x257719447a2c71ab94f300207f5a8096a1b8c9f15a614e409d7d48f95c6bdff9" + protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.last_archive] - root = "0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000001" + root = "0x22697e2f4dca9f7c06b64c9a987d5e3411f2f28786d9f1d48ce27b61b8d8abe3" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000001" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000001" + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000014" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2d53" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + inner = "0x000000000000000000000000b5b0e9c243b20a09c501dee16790e9dfc23506bc" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.fee_recipient] inner = "0x0000000000000000000000000000000000000000000000000000000000000000" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.constants.global_variables.gas_fees] fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.note_hash_tree] -root = "0x20e1f2bba7e6317997da924c0bcfdb3a2772286d8f2a54afd065ee0c7c9bcbb2" -next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000000c0" +root = "0x2b93be1d42d6277477a71a288ca7f05209d7edefdde05a5fc7e424d8ba4882a7" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000340" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.nullifier_tree] -root = "0x159d5885c8238582e5b683a7672d35a33cfca40296e1800ce05e3c9399b76c65" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000140" +root = "0x24ede285714e37dbc99f53093e640034e671b219229c72f354bf78f409f9f383" +next_available_leaf_index = "0x00000000000000000000000000000000000000000000000000000000000003c0" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start.public_data_tree] -root = "0x09b0026a33b8c5d607e3716682110e5e2f7dc6eace3c4bf9e8dbc51ebfb57333" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000013d" +root = "0x2da9b69e8a02d9a3b9372d63f6eb07578d3a901d7d9bb5eed7e0723edbe02da1" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.note_hash_tree] -root = "0x2921699586bffcf98d96ea66d55d82d6244e11f37d2c9c0b960bb2dda2c79e18" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000100" +root = "0x28083f11c306105343805c8c26a5e3d1c2c03714f4fb38d18661a9a1cd97fb44" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000380" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.nullifier_tree] -root = "0x0629a68270be453754bca93c4206818edd56d8a477c082838f4bb72228e92789" -next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000180" +root = "0x2b4981e52a2918a8536adf5416354b20f0667537b35073f608c1f126cdf2556a" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000400" [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end.public_data_tree] -root = "0x278cc1e2eb5983bb745eba4bd54a97f88efd6dc3badb2aadd7787ba7adc25643" -next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000017c" +root = "0x2da9b69e8a02d9a3b9372d63f6eb07578d3a901d7d9bb5eed7e0723edbe02da1" +next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000096" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000007" + expected_fields = "0x000000000000000000000000000000000000000000000000000000000000004f" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.start_sponge_blob.sponge] + cache = [ + "0x12e7b967d4eedec7cbc843b52b7413174df59b4d212a07cd5137bfb5914e9387", + "0x0000000000000000000000000000000000000000000000000000000006000002", + "0x02f71e7f13a0520af9e75ee37b71703ace10b7df98538c8384614743dc310151" +] + state = [ + "0x0212f33afeb25b4d2de9e2d9a2d20e3c8995c949b22f3e6f5d2839c84a236d6f", + "0x23c128d8c6faf52fbd5408e415baad147807a63384a20e0b177d8ebc8d1bb0f4", + "0x165d09f061a90bac1945fde4922ec437a8a7a21138819bcb78c0079297bece5f", + "0x0ba3a0bbbc38b7389727f6bce882b3c584b85ce4830bb22c3068eb02e28ab0ab" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000001" + squeeze_mode = false + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob] + fields = "0x0000000000000000000000000000000000000000000000000000000000000046" + expected_fields = "0x000000000000000000000000000000000000000000000000000000000000004f" + + [inputs.previous_rollup_data.base_or_merge_rollup_public_inputs.end_sponge_blob.sponge] + cache = [ + "0x00833cb4e0eb2519f668205a47679cd3da9cfd6f817b0493e5caf180f5d228ce", + "0x00c00794884e2bdeeb17481a11e8802ac0eb406aa32abaef06b8c16d2e02ba31", + "0x00e02685013c43900fb8432a4093ea7be3f7d9becbb5d9c4e4ed46bace2ba444" +] + state = [ + "0x105393772749b65609043d8ecdb2dd3fe0aace54ea61fae3c276d9b67475a44b", + "0x01afc140f5e9024433e2cbbcae49e8b524d8bc02e466d9ffaa75236f2eb78d47", + "0x0d50121d0d96b893589dc71b0317bd18054d85feeef5d9e0fd7594c224a2b1a7", + "0x1948c14f493f80c6b0fafe96ff051c386154b81021106ba7fb5cd7db85abb6a2" +] + cache_size = "0x0000000000000000000000000000000000000000000000000000000000000001" + squeeze_mode = false [inputs.previous_rollup_data.proof] fields = [ @@ -1194,144 +1268,144 @@ fields = [ [inputs.previous_rollup_data.vk] key = [ - "0x0000000000000000000000000000000000000000000000000000000002000000", - "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000001000000", + "0x0000000000000000000000000000000000000000000000000000000000000044", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000cf7aae3b32ca469d2f4d8a50c545108793", - "0x000000000000000000000000000000000026c7f58b227bb11a7a07e90703a075", - "0x0000000000000000000000000000001779e9f1ebdcb0ca1d84c08f421c93d426", - "0x00000000000000000000000000000000002ebecedeb00025ef191427dfc03a70", - "0x000000000000000000000000000000387bf48c649f17aa11ce41732f34da2caa", - "0x0000000000000000000000000000000000154b6df3ae3e59669911aad19ba8cf", - "0x00000000000000000000000000000014d454a803987d756c8f2bbab83882a540", - "0x00000000000000000000000000000000001ab08c5e36abe25ff380dc3adb9bda", - "0x000000000000000000000000000000da77e17e4e68b7b1e455bec03e6e252fff", - "0x00000000000000000000000000000000001602b54c6fb1be67505c53835d04b5", - "0x00000000000000000000000000000005e0432c5876726787ffbb0762feaba6b1", - "0x0000000000000000000000000000000000094d1adda66fdbd7a9253998781016", - "0x000000000000000000000000000000c2601a4ccbc080e67cd00bf7d009cebf2a", - "0x0000000000000000000000000000000000196e55f78bd7061758ba437e24e6d3", - "0x000000000000000000000000000000d09742cde1f4a7ea0a9c0c75d42e19953f", - "0x000000000000000000000000000000000007ebaa6f5a81fa264544a3e3f2d957", - "0x000000000000000000000000000000a44e97ce02886ed0cf4e98daf7cb812893", - "0x00000000000000000000000000000000000e843e5994f9b9c449580f3635effc", - "0x000000000000000000000000000000a499c0a21cc98597d274c0b638e4648251", - "0x0000000000000000000000000000000000042d98fcad3c97caf60136088bb556", - "0x000000000000000000000000000000d264c197db47937b73339bf7df95c0d1dc", - "0x00000000000000000000000000000000000f85688ca6c4a17c12696d605bbb88", - "0x0000000000000000000000000000009b62cb539b9f366b0afb58fabaa44e4d6a", - "0x000000000000000000000000000000000002db8231d2555206a44704d148815f", - "0x00000000000000000000000000000071eb739e60844dbf8fe4a2497e4814ba10", - "0x000000000000000000000000000000000017224a4aeb150b55389a80b001d891", - "0x0000000000000000000000000000001bc31d8fe314083f029fa49d0bd57e9886", - "0x00000000000000000000000000000000001622ee6835627cd77e6af4349868c6", - "0x000000000000000000000000000000871ac800a816f01bab25ae11e91fe265cf", - "0x00000000000000000000000000000000000de628ea9f6f8927b9e288cd02a3b5", - "0x000000000000000000000000000000b3df87db452211210f3792526e99e5945a", - "0x00000000000000000000000000000000001844ebed80892d2ec8e7af36206a76", - "0x00000000000000000000000000000019b837e6d28692e6c6705ade951abb2ed7", - "0x00000000000000000000000000000000002074a622d7ff106f5b5c3bedb1ec0c", - "0x000000000000000000000000000000c6aa8ac39c35c0b6e14fa7664a69490e80", - "0x000000000000000000000000000000000002aa9bf7548ae3e3f864bea85d72df", - "0x000000000000000000000000000000d22ee91bea65f007418b9c7a3217acd957", - "0x000000000000000000000000000000000021fd628fc97d1e9e5296eae57d2f39", - "0x000000000000000000000000000000a264bd14b93ecf8316f9ffba3a47b468df", - "0x000000000000000000000000000000000029f77c8df0b6784115f16c9e891378", - "0x000000000000000000000000000000536c3cd3ff6672ae223ca208819234e72d", - "0x000000000000000000000000000000000014b3f5c4aa15524379cb8456bbaf86", - "0x00000000000000000000000000000085b0ed97a29b17f1c3d85774ecbb2f18c9", - "0x000000000000000000000000000000000019ffadb5418e1f7ac4bb4ec82598c3", - "0x000000000000000000000000000000256ccb468927dbe175db51cb84ed0584f9", - "0x000000000000000000000000000000000008d8032c33d889ac3f8b7d2749c14c", - "0x000000000000000000000000000000a6fb969f0064c94c7453eb1f700c9ddf21", - "0x000000000000000000000000000000000025f1c380479463f3648528c9d962ba", - "0x000000000000000000000000000000468708e77ce671f3fb24e16a0d293c9e5e", - "0x000000000000000000000000000000000029bce6e077cab900d532180a55a464", - "0x000000000000000000000000000000817c98127722255c0ee0bc8b9c7e515f0f", - "0x00000000000000000000000000000000000c454267f4046ada9b1267df1762b7", - "0x00000000000000000000000000000094b9dcde3aa9be048fe79cd676ee3dd282", - "0x000000000000000000000000000000000018694989d7c42d241ce9972b39845c", - "0x00000000000000000000000000000029547d3893b4c3399328cf40da2867dfa9", - "0x00000000000000000000000000000000002f888f7d619bf3dbffaae4748ac301", - "0x000000000000000000000000000000e420ccd42a6e490fc41fce12445e73e912", - "0x0000000000000000000000000000000000217af1e51572a0c5f9b60d64602831", - "0x000000000000000000000000000000f91bec2dde1e04dae492c854536c05136c", - "0x0000000000000000000000000000000000039d11cd46ee19c0d01bbf92fdce9c", - "0x0000000000000000000000000000005f0355a2cc355f86c3f42bfc2dd2d516b6", - "0x000000000000000000000000000000000019d70dd034f8901c4b8e356cd51f09", - "0x000000000000000000000000000000e3c219ea1329ee58b87b1d14ef5fc2da70", - "0x00000000000000000000000000000000002e96b13b163ffe4b07a0e667ed8fcb", - "0x00000000000000000000000000000084d928386288b7d9d70a37c16a4fad9b8d", - "0x00000000000000000000000000000000001ce08e8f9c31010f09fd2fe27b02b2", - "0x000000000000000000000000000000630966f03f6aa8b2dac36726f8e2b3c5b3", - "0x000000000000000000000000000000000013555d9bfcd1f13eed48fffa85bc8c", - "0x0000000000000000000000000000002baca943724a8fe0b97884771958934e5a", - "0x0000000000000000000000000000000000282fb3b18d49b3395fb34d72b8c392", - "0x00000000000000000000000000000085d1ebe6e5df08db7754cadef595ad858e", - "0x00000000000000000000000000000000001f3a892f0d944b019c8b3c8d00da0f", - "0x000000000000000000000000000000a2983ce44d445827f3a99df7cac721f7f5", - "0x000000000000000000000000000000000020d7548093ae3a9e0a967339d9eeff", - "0x0000000000000000000000000000006bcdac56e9fe483c48214af2d025ce32c7", - "0x00000000000000000000000000000000001d2766e3a4c532dfee3310fb730f2f", - "0x0000000000000000000000000000004600c5c674ccd36554df9ff9a53df7c9b0", - "0x0000000000000000000000000000000000213f4bd856c195404eb5474d0c5cbf", - "0x000000000000000000000000000000e27272553dd77bfd245852e45ad1687d04", - "0x00000000000000000000000000000000002452ea2b418dd94ca5e0d4a3a8ac5f", - "0x00000000000000000000000000000098443f2f524263675ce0efe0f57e1ee348", - "0x00000000000000000000000000000000002896c216c0e1d5693add6968e8b571", - "0x000000000000000000000000000000bb4e8fd85c1d16646f5b5b4455c525c7b0", - "0x00000000000000000000000000000000001ead44b4a96647d30caab22bab191e", - "0x000000000000000000000000000000e3cb7b601f7eed6dca3e591857166b4d1c", - "0x0000000000000000000000000000000000125aad145d0dbafb8da2dc1b0700bc", - "0x0000000000000000000000000000007a67f2caa5046f4d1dfc3a63469566de81", - "0x000000000000000000000000000000000022a98cee0b4cc5268adc92e2229271", - "0x000000000000000000000000000000f7c7c14a69ad0052dced057951a74436f5", - "0x0000000000000000000000000000000000263b96899c9835ce217f54f6df4acd", - "0x0000000000000000000000000000006c8c4e747cb6085c5735b9c68f2db633ac", - "0x00000000000000000000000000000000001157b26152b34ab05419f38acc15da", - "0x00000000000000000000000000000054cf89815a06c242c5e433264079487fc0", - "0x0000000000000000000000000000000000049a97286033e7c6c80520a963c7a1", - "0x00000000000000000000000000000077cb47275a750777c993d845849365ae73", - "0x00000000000000000000000000000000001bef3fe6a136f8f3419040fb2fb9a8", - "0x000000000000000000000000000000cb5bdeb788a62ab7fefa163b44aa4fe480", - "0x000000000000000000000000000000000019c8da60322e5b15147bb67ee97c3c", - "0x0000000000000000000000000000001f35e0f8d62d480f37b4aa13b09005e059", - "0x00000000000000000000000000000000002eaf8692eeea251928fb9c16523574", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x000000000000000000000000000000222d2b638470648efe806272902759bfe4", + "0x000000000000000000000000000000000026717cb116c9f379f6053d43ed7131", + "0x000000000000000000000000000000d72dc52e13931348a07d4d75dbdef7b696", + "0x000000000000000000000000000000000007a17849605cd5acdf47218d8ff6ab", + "0x0000000000000000000000000000000ead8b79c9d9733b45796b315aed219c46", + "0x000000000000000000000000000000000001520cbd65e9f9c12d2d804e5408a8", + "0x000000000000000000000000000000d4fd951f0c8b3f5c93c914a9ca3e3ad82b", + "0x00000000000000000000000000000000000c06cda5de6eb85a2dc3a3e461edf4", + "0x0000000000000000000000000000008fda111b457d9cbb2c2140e6e29baaa93d", + "0x000000000000000000000000000000000019250c98c82093236c18a9efa7bbcb", + "0x000000000000000000000000000000809dff0c74860533c531966cefa5e6b82f", + "0x0000000000000000000000000000000000096b5c6f4eb1c8d72e0812cabe6b20", + "0x0000000000000000000000000000002b40eba3c1a07bab631194a295de31fa39", + "0x00000000000000000000000000000000000053902748ef91505fca0d1db29c64", + "0x000000000000000000000000000000aa3b1b8cf6fbc5c81dc722111d10e6940b", + "0x0000000000000000000000000000000000206cb99da8d346b786537ed3b15446", + "0x0000000000000000000000000000001271113c751d045274a3317a01895808c9", + "0x00000000000000000000000000000000000ae017203dd40d764ddbaa912b9d03", + "0x000000000000000000000000000000f46fc3542fcfee505d2e9eacb7f397bb36", + "0x00000000000000000000000000000000002e5a0e507a80a266a9e62a94a7bb97", + "0x000000000000000000000000000000b44304dbc2fc1d02d3d903d01d29e76efb", + "0x00000000000000000000000000000000000fb528b629b4fbbf48fddeca9f54de", + "0x000000000000000000000000000000ffa188c0ab2f8df7c201783dc282a782cd", + "0x00000000000000000000000000000000000edbbec3674d50e52b6e83867b3007", + "0x00000000000000000000000000000058ea22bca57bfe9a1c46ce63c2c240901f", + "0x000000000000000000000000000000000028cce7cf665942fee68c3ffd344c71", + "0x000000000000000000000000000000bbda5287b41d69b0a203243ebb2d861d58", + "0x0000000000000000000000000000000000136b53ea88a30b784ec14018041c4e", + "0x0000000000000000000000000000004702b68f21e97f4ec2533229bdb2172de3", + "0x00000000000000000000000000000000002c307c0f773885110a0d7188d22899", + "0x000000000000000000000000000000ccfc8d16713b3ac84c531b3a09b57a5632", + "0x000000000000000000000000000000000018177fc15055bc6ded75133159116e", + "0x000000000000000000000000000000bf31ddaed25f6a3812d47d47eb1003c336", + "0x000000000000000000000000000000000030301fd8ac21f9dd93ae4de2223f3a", + "0x000000000000000000000000000000d8b510b22cee8d476c3ae3a5a643c12fcd", + "0x00000000000000000000000000000000001ed2d09f2ac6322b815bc0e35be630", + "0x0000000000000000000000000000005c2e45d0fa6b1156c250a016a8d6025717", + "0x0000000000000000000000000000000000116ef26a99b319f7ddf9a72b920d7e", + "0x000000000000000000000000000000887bef3a2f390f75c5c1c7d2804839dc40", + "0x0000000000000000000000000000000000241d35489e5ec7ae0ec539a511f4bb", + "0x0000000000000000000000000000001e9eed55f46c30f0a643e7fadc0f1c5b5f", + "0x00000000000000000000000000000000002d224bdb537e45356dad6719a44670", + "0x000000000000000000000000000000905b34d9aeffbef40ad032415b3b0e66bd", + "0x0000000000000000000000000000000000147a5bb3c75194935a583029501d7c", + "0x0000000000000000000000000000001a183288e3ecb3c21f96eb8e6c8fa774db", + "0x00000000000000000000000000000000001ef984af2d88e47be0e9664b8fd752", + "0x00000000000000000000000000000039f3dad17da7386018cab36996698755d5", + "0x00000000000000000000000000000000001561ce1450ac8840dbcf97e91bd5b6", + "0x000000000000000000000000000000f1b27c35585e11cbbf5612de0413672d01", + "0x0000000000000000000000000000000000012046c089f10f8c8c82265e2d6825", + "0x000000000000000000000000000000a2b89785fa94123ec142277619e45360fd", + "0x0000000000000000000000000000000000159d0140b54b1703d4f4ebdd75d849", + "0x000000000000000000000000000000539cb47199bd3c2245bc3044a89cf91958", + "0x0000000000000000000000000000000000096f804be4f55c1c25b387dc128f12", + "0x0000000000000000000000000000000d6ea4f662ce5d29fe8d5c30e717ed3f45", + "0x00000000000000000000000000000000000505aeb30b5f6acb1c0e335e27c510", + "0x0000000000000000000000000000003bafc94403ed6cbde5cd3bcd4b14d6c0fa", + "0x00000000000000000000000000000000001ad585be43d722b6a37d8b3832a770", + "0x000000000000000000000000000000d0ecec90f37a38b0b770d04148856f191a", + "0x0000000000000000000000000000000000195175c4eceb80ac5b567c05686b6a", + "0x00000000000000000000000000000018d09a6452cffee1251ce810df1987c3fe", + "0x000000000000000000000000000000000018a58c0116caf02d8187113b216b50", + "0x000000000000000000000000000000786c72f5cb45e0b2ef50d429284962d8f2", + "0x00000000000000000000000000000000001edecd8d2daf475aea627cddc4bf83", + "0x000000000000000000000000000000f11f76923fbc94bb9da677ef4ea48d8e5d", + "0x000000000000000000000000000000000009e363fd3b9fba1921f8a620453c8b", + "0x000000000000000000000000000000130337f88d1a3501deb7548bf12f3bf8c7", + "0x00000000000000000000000000000000001caf1ae2f1b7c284d4fa064660e2d4", + "0x0000000000000000000000000000001f3243dcfe519ae43f5fda7c4e071489ec", + "0x000000000000000000000000000000000028ddb68ba85ec82fbe2c3d13f3f4f3", + "0x000000000000000000000000000000b8d7efb798a996ad6f6cc79bbb2c23e051", + "0x000000000000000000000000000000000014064ac87a8676a6c0701105a76924", + "0x000000000000000000000000000000c4f5d6ec595af7e188571eb533255210bb", + "0x00000000000000000000000000000000000b751e85d1d0a4d12321b8f3001d93", + "0x00000000000000000000000000000053c44079c3fbeb350e7347576b96a518a2", + "0x00000000000000000000000000000000002cf5eeea78f9cc5b1c698613d5a0ac", + "0x0000000000000000000000000000006ebb8205fddf556a03c81473e3d7f128da", + "0x000000000000000000000000000000000005e04349dee59bf22cab15fbcf6579", + "0x000000000000000000000000000000119e7803dc1f0d42d610c1e636b763e84a", + "0x0000000000000000000000000000000000150cdd897a47b83debe2a86b41df03", + "0x000000000000000000000000000000b2627cae7ef76e48877e5f65dda01de6fa", + "0x00000000000000000000000000000000002df31114d6ea625d30f40fcd6501ae", + "0x000000000000000000000000000000d9ff339dabc896850436795e686c8b7892", + "0x0000000000000000000000000000000000045d737d25201a48aabff3f6bca6b3", + "0x000000000000000000000000000000de93c07b11d2e6fa6550a3cefb321e16d7", + "0x00000000000000000000000000000000001752e736d3439003c65c42a97c0f09", + "0x0000000000000000000000000000009365c7dc3d4484e835a8c4cd523db7cb52", + "0x000000000000000000000000000000000004bd96b70a7ceca6e250998dd29d04", + "0x000000000000000000000000000000383c0eef46c0b99e9af36ae88ed755eab8", + "0x000000000000000000000000000000000017750cb080368dc310dba9dc7b1627", + "0x000000000000000000000000000000ce7ee23afcb014b28d8ad4a8ca1576f27c", + "0x000000000000000000000000000000000029e9346b8314cc77921b3d989c68a0", + "0x0000000000000000000000000000009c8ee8e93120da7baa9e1aa23de4ebf086", + "0x00000000000000000000000000000000002d2475bbb16b1577d3933a25e17410", + "0x0000000000000000000000000000001c775e636250539aa55b35901031d8a234", + "0x000000000000000000000000000000000027a3acd1183085d9619ddfb13ce036", + "0x000000000000000000000000000000258cb84ffd27a5cb5a91a096c098cbcd14", + "0x00000000000000000000000000000000000cc296cc5967bc2eca88c4b55ec976", + "0x0000000000000000000000000000007b6f66567f2710b238fadf1e211206376b", + "0x00000000000000000000000000000000001c58cff4dbc4ad672c2b263cc7b065", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000b82f4c7b24a7eb949025a3fb29aa15debb", - "0x00000000000000000000000000000000001525a4f8bab61cfd24dfe9c254ef33", - "0x00000000000000000000000000000005bba61a5fa776cc77e6d7969d1d458955", - "0x00000000000000000000000000000000001c346a3672483c830e3cec1c7f652e" + "0x000000000000000000000000000000a653c3ebcdb2ec03f5bededc1780032446", + "0x0000000000000000000000000000000000143112234ac9aa9f7ef289152fccda", + "0x00000000000000000000000000000073d1f6ce5b511d1a45307e35b4e146876d", + "0x00000000000000000000000000000000002ca743c017d5c16d5953d03410d5a5" ] -hash = "0x01c1214650df7c976a08450b978a8946857f45e3ad1e935b7a264e1c546842c4" +hash = "0x03cde467306e7d05bcd957b9dde81fdb644d6a7e21d7857bc1bf647f78bfde83" [inputs.previous_rollup_data.vk_witness] -leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" +leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" sibling_path = [ - "0x2ec70bf222e8f938bacada9560ac9e7b88f9f71c0220e86ae820d05feeb3c33c", + "0x1f07a2890c9deb79fe6cc78935c6dfa810ee56922785f37307cb463f7797f73e", "0x19861a044ec84aaf6e41d02a20051d349f07206356e10a0846d4fa892534e306", - "0x2ab7a5c091cc8581f1e4c039e8e5513089defadfdb5799fb6e24e88ec3691678", - "0x1dd26e2769f62418c0ce2f69dd05257679f29fcdc08e99fe15b14ea9b7561d19", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" + "0x236d849434a03c2e9d181e5365fe087cb14fd703bff61e5676bfa24c4f4509b7", + "0x019a340a354ef9114e2e61774efec255560cbbdd81448834fe6d764cae443a44", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" ] diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-root/Prover.toml b/noir-projects/noir-protocol-circuits/crates/rollup-root/Prover.toml new file mode 100644 index 00000000000..c8ed964761f --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/rollup-root/Prover.toml @@ -0,0 +1,6606 @@ +[inputs] +prover_id = "0x0000000000000000000000000000000000000000000000000000000000000051" + + [[inputs.previous_rollup_data]] +[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] +previous_block_hash = "0x0cbe9ba8209cff81f755fb74efb4e92a9227a891378316ad62c685d6750b3a47" +end_block_hash = "0x022087729c552378b2572eb9be555e7dff2161a22e9a1d5e175d3558163a615b" +out_hash = "0x0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c3" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" +prover_id = "0x0000000000000000000000000000000000000000000000000000000000000051" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] + root = "0x12a67a275560c583960931231ad3a43c5446c4ecf990edce34f69e4a8924e2a6" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000006" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000006" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000013" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e66" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000014" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e7e" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9be2b484" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000003a83680db4900" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x000000000000000000000000000000000000000000000000000b49e83dc155c8" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x08096b8a07dd58a4075534aa941683d65b968c85454e4127a93a2441c4e481ba" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x0f27c0c90ff3d54ed9057f9d961481", + "0x10f7712b10865230fc579fcf643ffb", + "0x5af9" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x008890c7177b340e82eef47e7b4364d2bd8425cfecd2ce2e1657247d960b3592", + "0x0000000000000000000000000000005c40f1b8daf1afa2af8971237b4faf5888" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x2680a618cce5a117fe2420af8070f94769bf55e2a342fdc5c500d65bf128f97c" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x2c225f699251daa2795d209a680710", + "0xe870212bf38b51bf54abe6a2b87dd9", + "0x459c" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x00a1f4b43df5cca374ba67b1201841744deb0c9ca51b45320341378839870643", + "0x000000000000000000000000000000b7c11d8b7e10d09c979df87e342a9f281e" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[inputs.previous_rollup_data.proof] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + +[inputs.previous_rollup_data.vk] +key = [ + "0x0000000000000000000000000000000000000000000000000000000000200000", + "0x00000000000000000000000000000000000000000000000000000000000003ec", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x00000000000000000000000000000000000000000000000000000000000003dc", + "0x00000000000000000000000000000000000000000000000000000000000003dd", + "0x00000000000000000000000000000000000000000000000000000000000003de", + "0x00000000000000000000000000000000000000000000000000000000000003df", + "0x00000000000000000000000000000000000000000000000000000000000003e0", + "0x00000000000000000000000000000000000000000000000000000000000003e1", + "0x00000000000000000000000000000000000000000000000000000000000003e2", + "0x00000000000000000000000000000000000000000000000000000000000003e3", + "0x00000000000000000000000000000000000000000000000000000000000003e4", + "0x00000000000000000000000000000000000000000000000000000000000003e5", + "0x00000000000000000000000000000000000000000000000000000000000003e6", + "0x00000000000000000000000000000000000000000000000000000000000003e7", + "0x00000000000000000000000000000000000000000000000000000000000003e8", + "0x00000000000000000000000000000000000000000000000000000000000003e9", + "0x00000000000000000000000000000000000000000000000000000000000003ea", + "0x00000000000000000000000000000000000000000000000000000000000003eb", + "0x000000000000000000000000000000998e5be31abe68fe2f1d08ec68178d5e55", + "0x000000000000000000000000000000000025ab0352159abdadfb1c5163f7d202", + "0x000000000000000000000000000000bcd393b12573d6d5e53fc42c17f71d4c8b", + "0x000000000000000000000000000000000027925c9ebd2056d20410e57df614ed", + "0x0000000000000000000000000000004a0d4495d868843067a6d1ad3607e091a7", + "0x00000000000000000000000000000000001958c78407cbcd95b771b31d38a1c1", + "0x0000000000000000000000000000007e68740a53fd37e46590ab1c6f5b58b328", + "0x00000000000000000000000000000000002980bcd4948a9fbb5723af68df31da", + "0x000000000000000000000000000000dcdb1d1d1c5173490b696673e0313c62bd", + "0x000000000000000000000000000000000028d0610e818fedd71ec3a9281a7781", + "0x000000000000000000000000000000d17c67572cce970c5757a9a84445102eed", + "0x00000000000000000000000000000000002f4c160a312790dabbd93d572f07bb", + "0x0000000000000000000000000000004c61674567376a482c90a5bf7c53976cfe", + "0x00000000000000000000000000000000002d7f4779d914d01d064e7b406fb808", + "0x0000000000000000000000000000006c3b45eb8698c1e59dfeea80a9c3db9f5f", + "0x0000000000000000000000000000000000060a2cfa606a2ce7d86eb2162d7e71", + "0x00000000000000000000000000000062f1da156b5112d7cb9f320d5452e60627", + "0x000000000000000000000000000000000023325f29f5d61154778ac60e962c31", + "0x000000000000000000000000000000071a7bd0219e592d3a65f399b2a4964241", + "0x0000000000000000000000000000000000162558d3b4de45fdbde1b0d8f89bf8", + "0x000000000000000000000000000000488d6af9e2b2c6dfed9a16bef551a40255", + "0x0000000000000000000000000000000000099f9e36cd0b4f59b9c98c01b88003", + "0x000000000000000000000000000000a9267458a56c12b55c15b7c51e505b8e6c", + "0x000000000000000000000000000000000015ca0f8807b968cf2dc4222c0ec955", + "0x0000000000000000000000000000004b4b7c7b2144700873a7af327468d6edf5", + "0x00000000000000000000000000000000001f0c1785ec10d742cdd7817c9ff404", + "0x0000000000000000000000000000004ade21f14ed1ff588175882ce70339db26", + "0x0000000000000000000000000000000000279f17c283202f883245d3a4c47747", + "0x00000000000000000000000000000085157b1b29066dfe5edf96c38344140801", + "0x000000000000000000000000000000000023791cefa64559dbdade3a6190f039", + "0x000000000000000000000000000000164cfe1d74198193dd30197a589b236f88", + "0x00000000000000000000000000000000000c70733b2a932741394e86bd8a57e2", + "0x0000000000000000000000000000003f14d7f440e8578acce63f8eec32380f7a", + "0x0000000000000000000000000000000000303d66f56023c8588baffd7e092e67", + "0x000000000000000000000000000000fedfeb52b321b9cb36c9634c3730492ab1", + "0x00000000000000000000000000000000002f0aff78047292f42b7f5bb19c05f7", + "0x000000000000000000000000000000994d21d6354422208e38715f37e48fa16d", + "0x00000000000000000000000000000000001eb0eb53130ca20d5e87c0a254f7c6", + "0x00000000000000000000000000000007f75f0866bac3efe692c450e2c6de3a55", + "0x000000000000000000000000000000000017a3177f2e8def9f22c11e4b6d7618", + "0x000000000000000000000000000000a763b50f06bec58aa0e1e7a36aa5e0ef9d", + "0x0000000000000000000000000000000000072fcc6fdb06628b8adff26ce4f3f6", + "0x0000000000000000000000000000004e587f87e7ecfb15dd38d65b300a0ed04b", + "0x00000000000000000000000000000000001067a37239b8f86c8b34885e5f93f4", + "0x000000000000000000000000000000d532562004237072c915a771ef2abd6a00", + "0x000000000000000000000000000000000012f352a9d1783669dbd48c685920db", + "0x0000000000000000000000000000003b1f4cb9dcde9f5112acea5e520123a491", + "0x0000000000000000000000000000000000143a7afda4f460bbebe4ba1141501a", + "0x000000000000000000000000000000bc5cf78a7230c328e37d3f2fe19f6777ca", + "0x00000000000000000000000000000000000dcbe3389d11e40a5faf40a385ad22", + "0x000000000000000000000000000000f7c9cfa27095a937ada1a7897eb222ce89", + "0x000000000000000000000000000000000014b4924c74371f51dacd2bf2866c13", + "0x000000000000000000000000000000f2d8c4588bb4679bff57e660e17cc33973", + "0x0000000000000000000000000000000000151e2efe25ec498ed563261e36c555", + "0x0000000000000000000000000000001f2e91f77895aa5de8e452c6fca1550a7c", + "0x000000000000000000000000000000000023a05e0263e278950bccbabc25d273", + "0x00000000000000000000000000000005057a4276a0a97ef69b09241d942e1a9c", + "0x000000000000000000000000000000000018c875aec30f26a998a59cd9204d7f", + "0x0000000000000000000000000000008e7332630bd450e6ac0ee872e7e83aca38", + "0x00000000000000000000000000000000000eb1e133f51a031dfee4d967ec7321", + "0x00000000000000000000000000000034530e460a13a571bc35cfa6451fe6187e", + "0x00000000000000000000000000000000001de2c208c273d874060093c41d6815", + "0x000000000000000000000000000000e4f54fcade01d40e3e2858b5dd48341f72", + "0x00000000000000000000000000000000001e9026e6c62cfacecca45033e276cd", + "0x00000000000000000000000000000048fe4b2e662e8f72008deaaeb3cae82889", + "0x00000000000000000000000000000000000f23cd4f99e1879d8446159daeb62c", + "0x0000000000000000000000000000007a40e933ce7da86e405e300f09e9696a80", + "0x00000000000000000000000000000000002be3c84c3b52d758c814a963ba2f94", + "0x000000000000000000000000000000052c1133e365eda815b0be14c147398afd", + "0x00000000000000000000000000000000002e362f1ae1a9653e20e4ea7fff40a8", + "0x000000000000000000000000000000e550b0f1e7405c2a3eff981bb0f01c7d1f", + "0x000000000000000000000000000000000013dba20a64ae2d9f8482e61610a66f", + "0x000000000000000000000000000000642e7b3cbb6059b084f85a6010a256faa0", + "0x00000000000000000000000000000000001956c1f43bf67c2c942afd7e48353d", + "0x0000000000000000000000000000000e48669367ac01cdc80311fc55a0e60bd8", + "0x00000000000000000000000000000000002139d444b492ec82d558636ffc1e97", + "0x0000000000000000000000000000006fa4e2aa15e6518b1a6bb34141b1c46202", + "0x000000000000000000000000000000000011ded7a51635993f8ba273a699c2bb", + "0x0000000000000000000000000000004c1dc1dc7bfa3216f08dcfb9311062f721", + "0x000000000000000000000000000000000003696e65c014736dadc105517f571a", + "0x0000000000000000000000000000008de75372e4ec795c962f02a2e099c02489", + "0x00000000000000000000000000000000001e04420c925ab1c6575c7be2bf84c2", + "0x0000000000000000000000000000004858ea68d4d6587c4d8fb1856940db0220", + "0x00000000000000000000000000000000000b120f02c14e10a3fb1ce4ed95e4c6", + "0x00000000000000000000000000000095fce621e5d13adb1600ff34a7cab78ce7", + "0x0000000000000000000000000000000000138f458a343844776fda405a5271cf", + "0x00000000000000000000000000000046a68a67cbd929d663206821ce8fc5e230", + "0x00000000000000000000000000000000000baad17f09e16020481a4d67f735a2", + "0x0000000000000000000000000000005d157a3ade75ffbbc28195549243fd12a3", + "0x000000000000000000000000000000000017cabc064e4238d6844b8703d41d24", + "0x000000000000000000000000000000152ce071b703eb0716af995f8c91e13ce9", + "0x00000000000000000000000000000000002299066301428e31449b88fe5a4a76", + "0x00000000000000000000000000000039d0f4c6ba5eb83fd6fe632dba5ccd9361", + "0x00000000000000000000000000000000001bbb5e0fe4c482f456058dfb96f9ab", + "0x0000000000000000000000000000006ada264c4d8f433774b81314666f8e9d09", + "0x00000000000000000000000000000000002889ea5c1cdd05bca629fc629023cf", + "0x0000000000000000000000000000002b819d712cc9b72347f629fa9ae632b155", + "0x0000000000000000000000000000000000257b6eabdd8823096556a6263402b1", + "0x000000000000000000000000000000460b98103674e0ac00918e8877f22f1b71", + "0x0000000000000000000000000000000000054eae798f898372c126db4bd48259", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000aea6c2f5d00b46c5ccf035d8c19f11101a", + "0x00000000000000000000000000000000002728e3debd0a243c2174d473988eb3", + "0x0000000000000000000000000000000ee308876e5271eb3bf8b463c94ce996e7", + "0x00000000000000000000000000000000001d9bc82bf7a9b8810f3c4ae1690471" +] +hash = "0x2e7f7b71ec9506e7c37f331a6e16f9e576f5ac374fa60e4aea986776087da83f" + +[inputs.previous_rollup_data.vk_witness] +leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000e" +sibling_path = [ + "0x2efa03aa055caa1718bf1e397afc0f2c2628ec115188f95f9f46027a21fab345", + "0x29e27c1d0934d5550f382c4b65288f9e4e62757ebaf45fc1c197c920c3528cdd", + "0x220ebe2ec739267877ea7a9dfdd070c92cc88f558917466660908410bd66dabc", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] + + [[inputs.previous_rollup_data]] +[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] +previous_block_hash = "0x022087729c552378b2572eb9be555e7dff2161a22e9a1d5e175d3558163a615b" +end_block_hash = "0x205dc0e6c4055f045d9c226b52b42ccc6062d9ab2702e4e0acbf3209178b1e53" +out_hash = "0x0007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c3" +vk_tree_root = "0x0bee8f04d48c18c88f2b9dd3b87daba3b3c8d000f44d290587504ae770942c56" +protocol_contract_tree_root = "0x1c4e64cbb91a46bc2fd73590e1dacd3ddf84d1b5e7a7182795ab02fe80399caf" +prover_id = "0x0000000000000000000000000000000000000000000000000000000000000051" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] + root = "0x04b51aa5df89d177213335ca62dee74d15b920e231f5ea5198ed405967d188fd" + next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000008" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] + root = "0x176c781186011b45fed098e21264ed31abe491d165380b1490641d5bc1c7ec85" + next_available_leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000015" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2e96" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] + chain_id = "0x0000000000000000000000000000000000000000000000000000000000007a69" + version = "0x0000000000000000000000000000000000000000000000000000000000000001" + block_number = "0x0000000000000000000000000000000000000000000000000000000000000009" + slot_number = "0x0000000000000000000000000000000000000000000000000000000000000016" + timestamp = "0x00000000000000000000000000000000000000000000000000000000675c2eae" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] + fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" + fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000c9bd4533a" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000011b417896f129a" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x000000000000000000000000ed846b6f217c7084a6c108eda50abce8c8367eac" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] + value = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] + inner = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x05620cfa3125101fc126dcb1cd967ae0cda5bfbb0c413bb1ad570ede664953cf" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x1965375f1fcd10c386e8da3da65bf4", + "0xb17c73370563522d2debdb7994b039", + "0x17f0" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x00aae0654b3ba2a2f1e2fa2c7d23b35ab21cfba67951dcf917925cc2325eb866", + "0x0000000000000000000000000000001eea78b1856d5770ee11f410332f1be2af" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x172d7f736e107938e1bc1e8a4a11b55937b11a6d1bac463f17efe75495db19e5" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x3bb56352d775bd9572666507c876fa", + "0xabf177bc013f733764b4f023e81e66", + "0x19f1" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x00b4b024814b9a355c67327ec0af765ab3871da695c51a4bdfbe3407ab865fe2", + "0x00000000000000000000000000000074b4d39d0d3840c2a1e97f1924f19a4455" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + + [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs]] +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner]] +z = "0x0000000000000000000000000000000000000000000000000000000000000000" + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.y] + limbs = [ + "0x000000000000000000000000000000", + "0x000000000000000000000000000000", + "0x0000" +] + + [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.blob_public_inputs.inner.kzg_commitment] + inner = [ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" +] + +[inputs.previous_rollup_data.proof] +fields = [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x0000000000000000000000000000000000000000000000000000000000000004", + "0x0000000000000000000000000000000000000000000000000000000000000005", + "0x0000000000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000007", + "0x0000000000000000000000000000000000000000000000000000000000000008", + "0x0000000000000000000000000000000000000000000000000000000000000009", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x000000000000000000000000000000000000000000000000000000000000000b", + "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x000000000000000000000000000000000000000000000000000000000000000d", + "0x000000000000000000000000000000000000000000000000000000000000000e", + "0x000000000000000000000000000000000000000000000000000000000000000f", + "0x0000000000000000000000000000000000000000000000000000000000000010", + "0x0000000000000000000000000000000000000000000000000000000000000011", + "0x0000000000000000000000000000000000000000000000000000000000000012", + "0x0000000000000000000000000000000000000000000000000000000000000013", + "0x0000000000000000000000000000000000000000000000000000000000000014", + "0x0000000000000000000000000000000000000000000000000000000000000015", + "0x0000000000000000000000000000000000000000000000000000000000000016", + "0x0000000000000000000000000000000000000000000000000000000000000017", + "0x0000000000000000000000000000000000000000000000000000000000000018", + "0x0000000000000000000000000000000000000000000000000000000000000019", + "0x000000000000000000000000000000000000000000000000000000000000001a", + "0x000000000000000000000000000000000000000000000000000000000000001b", + "0x000000000000000000000000000000000000000000000000000000000000001c", + "0x000000000000000000000000000000000000000000000000000000000000001d", + "0x000000000000000000000000000000000000000000000000000000000000001e", + "0x000000000000000000000000000000000000000000000000000000000000001f", + "0x0000000000000000000000000000000000000000000000000000000000000020", + "0x0000000000000000000000000000000000000000000000000000000000000021", + "0x0000000000000000000000000000000000000000000000000000000000000022", + "0x0000000000000000000000000000000000000000000000000000000000000023", + "0x0000000000000000000000000000000000000000000000000000000000000024", + "0x0000000000000000000000000000000000000000000000000000000000000025", + "0x0000000000000000000000000000000000000000000000000000000000000026", + "0x0000000000000000000000000000000000000000000000000000000000000027", + "0x0000000000000000000000000000000000000000000000000000000000000028", + "0x0000000000000000000000000000000000000000000000000000000000000029", + "0x000000000000000000000000000000000000000000000000000000000000002a", + "0x000000000000000000000000000000000000000000000000000000000000002b", + "0x000000000000000000000000000000000000000000000000000000000000002c", + "0x000000000000000000000000000000000000000000000000000000000000002d", + "0x000000000000000000000000000000000000000000000000000000000000002e", + "0x000000000000000000000000000000000000000000000000000000000000002f", + "0x0000000000000000000000000000000000000000000000000000000000000030", + "0x0000000000000000000000000000000000000000000000000000000000000031", + "0x0000000000000000000000000000000000000000000000000000000000000032", + "0x0000000000000000000000000000000000000000000000000000000000000033", + "0x0000000000000000000000000000000000000000000000000000000000000034", + "0x0000000000000000000000000000000000000000000000000000000000000035", + "0x0000000000000000000000000000000000000000000000000000000000000036", + "0x0000000000000000000000000000000000000000000000000000000000000037", + "0x0000000000000000000000000000000000000000000000000000000000000038", + "0x0000000000000000000000000000000000000000000000000000000000000039", + "0x000000000000000000000000000000000000000000000000000000000000003a", + "0x000000000000000000000000000000000000000000000000000000000000003b", + "0x000000000000000000000000000000000000000000000000000000000000003c", + "0x000000000000000000000000000000000000000000000000000000000000003d", + "0x000000000000000000000000000000000000000000000000000000000000003e", + "0x000000000000000000000000000000000000000000000000000000000000003f", + "0x0000000000000000000000000000000000000000000000000000000000000040", + "0x0000000000000000000000000000000000000000000000000000000000000041", + "0x0000000000000000000000000000000000000000000000000000000000000042", + "0x0000000000000000000000000000000000000000000000000000000000000043", + "0x0000000000000000000000000000000000000000000000000000000000000044", + "0x0000000000000000000000000000000000000000000000000000000000000045", + "0x0000000000000000000000000000000000000000000000000000000000000046", + "0x0000000000000000000000000000000000000000000000000000000000000047", + "0x0000000000000000000000000000000000000000000000000000000000000048", + "0x0000000000000000000000000000000000000000000000000000000000000049", + "0x000000000000000000000000000000000000000000000000000000000000004a", + "0x000000000000000000000000000000000000000000000000000000000000004b", + "0x000000000000000000000000000000000000000000000000000000000000004c", + "0x000000000000000000000000000000000000000000000000000000000000004d", + "0x000000000000000000000000000000000000000000000000000000000000004e", + "0x000000000000000000000000000000000000000000000000000000000000004f", + "0x0000000000000000000000000000000000000000000000000000000000000050", + "0x0000000000000000000000000000000000000000000000000000000000000051", + "0x0000000000000000000000000000000000000000000000000000000000000052", + "0x0000000000000000000000000000000000000000000000000000000000000053", + "0x0000000000000000000000000000000000000000000000000000000000000054", + "0x0000000000000000000000000000000000000000000000000000000000000055", + "0x0000000000000000000000000000000000000000000000000000000000000056", + "0x0000000000000000000000000000000000000000000000000000000000000057", + "0x0000000000000000000000000000000000000000000000000000000000000058", + "0x0000000000000000000000000000000000000000000000000000000000000059", + "0x000000000000000000000000000000000000000000000000000000000000005a", + "0x000000000000000000000000000000000000000000000000000000000000005b", + "0x000000000000000000000000000000000000000000000000000000000000005c", + "0x000000000000000000000000000000000000000000000000000000000000005d", + "0x000000000000000000000000000000000000000000000000000000000000005e", + "0x000000000000000000000000000000000000000000000000000000000000005f", + "0x0000000000000000000000000000000000000000000000000000000000000060", + "0x0000000000000000000000000000000000000000000000000000000000000061", + "0x0000000000000000000000000000000000000000000000000000000000000062", + "0x0000000000000000000000000000000000000000000000000000000000000063", + "0x0000000000000000000000000000000000000000000000000000000000000064", + "0x0000000000000000000000000000000000000000000000000000000000000065", + "0x0000000000000000000000000000000000000000000000000000000000000066", + "0x0000000000000000000000000000000000000000000000000000000000000067", + "0x0000000000000000000000000000000000000000000000000000000000000068", + "0x0000000000000000000000000000000000000000000000000000000000000069", + "0x000000000000000000000000000000000000000000000000000000000000006a", + "0x000000000000000000000000000000000000000000000000000000000000006b", + "0x000000000000000000000000000000000000000000000000000000000000006c", + "0x000000000000000000000000000000000000000000000000000000000000006d", + "0x000000000000000000000000000000000000000000000000000000000000006e", + "0x000000000000000000000000000000000000000000000000000000000000006f", + "0x0000000000000000000000000000000000000000000000000000000000000070", + "0x0000000000000000000000000000000000000000000000000000000000000071", + "0x0000000000000000000000000000000000000000000000000000000000000072", + "0x0000000000000000000000000000000000000000000000000000000000000073", + "0x0000000000000000000000000000000000000000000000000000000000000074", + "0x0000000000000000000000000000000000000000000000000000000000000075", + "0x0000000000000000000000000000000000000000000000000000000000000076", + "0x0000000000000000000000000000000000000000000000000000000000000077", + "0x0000000000000000000000000000000000000000000000000000000000000078", + "0x0000000000000000000000000000000000000000000000000000000000000079", + "0x000000000000000000000000000000000000000000000000000000000000007a", + "0x000000000000000000000000000000000000000000000000000000000000007b", + "0x000000000000000000000000000000000000000000000000000000000000007c", + "0x000000000000000000000000000000000000000000000000000000000000007d", + "0x000000000000000000000000000000000000000000000000000000000000007e", + "0x000000000000000000000000000000000000000000000000000000000000007f", + "0x0000000000000000000000000000000000000000000000000000000000000080", + "0x0000000000000000000000000000000000000000000000000000000000000081", + "0x0000000000000000000000000000000000000000000000000000000000000082", + "0x0000000000000000000000000000000000000000000000000000000000000083", + "0x0000000000000000000000000000000000000000000000000000000000000084", + "0x0000000000000000000000000000000000000000000000000000000000000085", + "0x0000000000000000000000000000000000000000000000000000000000000086", + "0x0000000000000000000000000000000000000000000000000000000000000087", + "0x0000000000000000000000000000000000000000000000000000000000000088", + "0x0000000000000000000000000000000000000000000000000000000000000089", + "0x000000000000000000000000000000000000000000000000000000000000008a", + "0x000000000000000000000000000000000000000000000000000000000000008b", + "0x000000000000000000000000000000000000000000000000000000000000008c", + "0x000000000000000000000000000000000000000000000000000000000000008d", + "0x000000000000000000000000000000000000000000000000000000000000008e", + "0x000000000000000000000000000000000000000000000000000000000000008f", + "0x0000000000000000000000000000000000000000000000000000000000000090", + "0x0000000000000000000000000000000000000000000000000000000000000091", + "0x0000000000000000000000000000000000000000000000000000000000000092", + "0x0000000000000000000000000000000000000000000000000000000000000093", + "0x0000000000000000000000000000000000000000000000000000000000000094", + "0x0000000000000000000000000000000000000000000000000000000000000095", + "0x0000000000000000000000000000000000000000000000000000000000000096", + "0x0000000000000000000000000000000000000000000000000000000000000097", + "0x0000000000000000000000000000000000000000000000000000000000000098", + "0x0000000000000000000000000000000000000000000000000000000000000099", + "0x000000000000000000000000000000000000000000000000000000000000009a", + "0x000000000000000000000000000000000000000000000000000000000000009b", + "0x000000000000000000000000000000000000000000000000000000000000009c", + "0x000000000000000000000000000000000000000000000000000000000000009d", + "0x000000000000000000000000000000000000000000000000000000000000009e", + "0x000000000000000000000000000000000000000000000000000000000000009f", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x00000000000000000000000000000000000000000000000000000000000000a1", + "0x00000000000000000000000000000000000000000000000000000000000000a2", + "0x00000000000000000000000000000000000000000000000000000000000000a3", + "0x00000000000000000000000000000000000000000000000000000000000000a4", + "0x00000000000000000000000000000000000000000000000000000000000000a5", + "0x00000000000000000000000000000000000000000000000000000000000000a6", + "0x00000000000000000000000000000000000000000000000000000000000000a7", + "0x00000000000000000000000000000000000000000000000000000000000000a8", + "0x00000000000000000000000000000000000000000000000000000000000000a9", + "0x00000000000000000000000000000000000000000000000000000000000000aa", + "0x00000000000000000000000000000000000000000000000000000000000000ab", + "0x00000000000000000000000000000000000000000000000000000000000000ac", + "0x00000000000000000000000000000000000000000000000000000000000000ad", + "0x00000000000000000000000000000000000000000000000000000000000000ae", + "0x00000000000000000000000000000000000000000000000000000000000000af", + "0x00000000000000000000000000000000000000000000000000000000000000b0", + "0x00000000000000000000000000000000000000000000000000000000000000b1", + "0x00000000000000000000000000000000000000000000000000000000000000b2", + "0x00000000000000000000000000000000000000000000000000000000000000b3", + "0x00000000000000000000000000000000000000000000000000000000000000b4", + "0x00000000000000000000000000000000000000000000000000000000000000b5", + "0x00000000000000000000000000000000000000000000000000000000000000b6", + "0x00000000000000000000000000000000000000000000000000000000000000b7", + "0x00000000000000000000000000000000000000000000000000000000000000b8", + "0x00000000000000000000000000000000000000000000000000000000000000b9", + "0x00000000000000000000000000000000000000000000000000000000000000ba", + "0x00000000000000000000000000000000000000000000000000000000000000bb", + "0x00000000000000000000000000000000000000000000000000000000000000bc", + "0x00000000000000000000000000000000000000000000000000000000000000bd", + "0x00000000000000000000000000000000000000000000000000000000000000be", + "0x00000000000000000000000000000000000000000000000000000000000000bf", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000c1", + "0x00000000000000000000000000000000000000000000000000000000000000c2", + "0x00000000000000000000000000000000000000000000000000000000000000c3", + "0x00000000000000000000000000000000000000000000000000000000000000c4", + "0x00000000000000000000000000000000000000000000000000000000000000c5", + "0x00000000000000000000000000000000000000000000000000000000000000c6", + "0x00000000000000000000000000000000000000000000000000000000000000c7", + "0x00000000000000000000000000000000000000000000000000000000000000c8", + "0x00000000000000000000000000000000000000000000000000000000000000c9", + "0x00000000000000000000000000000000000000000000000000000000000000ca", + "0x00000000000000000000000000000000000000000000000000000000000000cb", + "0x00000000000000000000000000000000000000000000000000000000000000cc", + "0x00000000000000000000000000000000000000000000000000000000000000cd", + "0x00000000000000000000000000000000000000000000000000000000000000ce", + "0x00000000000000000000000000000000000000000000000000000000000000cf", + "0x00000000000000000000000000000000000000000000000000000000000000d0", + "0x00000000000000000000000000000000000000000000000000000000000000d1", + "0x00000000000000000000000000000000000000000000000000000000000000d2", + "0x00000000000000000000000000000000000000000000000000000000000000d3", + "0x00000000000000000000000000000000000000000000000000000000000000d4", + "0x00000000000000000000000000000000000000000000000000000000000000d5", + "0x00000000000000000000000000000000000000000000000000000000000000d6", + "0x00000000000000000000000000000000000000000000000000000000000000d7", + "0x00000000000000000000000000000000000000000000000000000000000000d8", + "0x00000000000000000000000000000000000000000000000000000000000000d9", + "0x00000000000000000000000000000000000000000000000000000000000000da", + "0x00000000000000000000000000000000000000000000000000000000000000db", + "0x00000000000000000000000000000000000000000000000000000000000000dc", + "0x00000000000000000000000000000000000000000000000000000000000000dd", + "0x00000000000000000000000000000000000000000000000000000000000000de", + "0x00000000000000000000000000000000000000000000000000000000000000df", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x00000000000000000000000000000000000000000000000000000000000000e1", + "0x00000000000000000000000000000000000000000000000000000000000000e2", + "0x00000000000000000000000000000000000000000000000000000000000000e3", + "0x00000000000000000000000000000000000000000000000000000000000000e4", + "0x00000000000000000000000000000000000000000000000000000000000000e5", + "0x00000000000000000000000000000000000000000000000000000000000000e6", + "0x00000000000000000000000000000000000000000000000000000000000000e7", + "0x00000000000000000000000000000000000000000000000000000000000000e8", + "0x00000000000000000000000000000000000000000000000000000000000000e9", + "0x00000000000000000000000000000000000000000000000000000000000000ea", + "0x00000000000000000000000000000000000000000000000000000000000000eb", + "0x00000000000000000000000000000000000000000000000000000000000000ec", + "0x00000000000000000000000000000000000000000000000000000000000000ed", + "0x00000000000000000000000000000000000000000000000000000000000000ee", + "0x00000000000000000000000000000000000000000000000000000000000000ef", + "0x00000000000000000000000000000000000000000000000000000000000000f0", + "0x00000000000000000000000000000000000000000000000000000000000000f1", + "0x00000000000000000000000000000000000000000000000000000000000000f2", + "0x00000000000000000000000000000000000000000000000000000000000000f3", + "0x00000000000000000000000000000000000000000000000000000000000000f4", + "0x00000000000000000000000000000000000000000000000000000000000000f5", + "0x00000000000000000000000000000000000000000000000000000000000000f6", + "0x00000000000000000000000000000000000000000000000000000000000000f7", + "0x00000000000000000000000000000000000000000000000000000000000000f8", + "0x00000000000000000000000000000000000000000000000000000000000000f9", + "0x00000000000000000000000000000000000000000000000000000000000000fa", + "0x00000000000000000000000000000000000000000000000000000000000000fb", + "0x00000000000000000000000000000000000000000000000000000000000000fc", + "0x00000000000000000000000000000000000000000000000000000000000000fd", + "0x00000000000000000000000000000000000000000000000000000000000000fe", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x0000000000000000000000000000000000000000000000000000000000000100", + "0x0000000000000000000000000000000000000000000000000000000000000101", + "0x0000000000000000000000000000000000000000000000000000000000000102", + "0x0000000000000000000000000000000000000000000000000000000000000103", + "0x0000000000000000000000000000000000000000000000000000000000000104", + "0x0000000000000000000000000000000000000000000000000000000000000105", + "0x0000000000000000000000000000000000000000000000000000000000000106", + "0x0000000000000000000000000000000000000000000000000000000000000107", + "0x0000000000000000000000000000000000000000000000000000000000000108", + "0x0000000000000000000000000000000000000000000000000000000000000109", + "0x000000000000000000000000000000000000000000000000000000000000010a", + "0x000000000000000000000000000000000000000000000000000000000000010b", + "0x000000000000000000000000000000000000000000000000000000000000010c", + "0x000000000000000000000000000000000000000000000000000000000000010d", + "0x000000000000000000000000000000000000000000000000000000000000010e", + "0x000000000000000000000000000000000000000000000000000000000000010f", + "0x0000000000000000000000000000000000000000000000000000000000000110", + "0x0000000000000000000000000000000000000000000000000000000000000111", + "0x0000000000000000000000000000000000000000000000000000000000000112", + "0x0000000000000000000000000000000000000000000000000000000000000113", + "0x0000000000000000000000000000000000000000000000000000000000000114", + "0x0000000000000000000000000000000000000000000000000000000000000115", + "0x0000000000000000000000000000000000000000000000000000000000000116", + "0x0000000000000000000000000000000000000000000000000000000000000117", + "0x0000000000000000000000000000000000000000000000000000000000000118", + "0x0000000000000000000000000000000000000000000000000000000000000119", + "0x000000000000000000000000000000000000000000000000000000000000011a", + "0x000000000000000000000000000000000000000000000000000000000000011b", + "0x000000000000000000000000000000000000000000000000000000000000011c", + "0x000000000000000000000000000000000000000000000000000000000000011d", + "0x000000000000000000000000000000000000000000000000000000000000011e", + "0x000000000000000000000000000000000000000000000000000000000000011f", + "0x0000000000000000000000000000000000000000000000000000000000000120", + "0x0000000000000000000000000000000000000000000000000000000000000121", + "0x0000000000000000000000000000000000000000000000000000000000000122", + "0x0000000000000000000000000000000000000000000000000000000000000123", + "0x0000000000000000000000000000000000000000000000000000000000000124", + "0x0000000000000000000000000000000000000000000000000000000000000125", + "0x0000000000000000000000000000000000000000000000000000000000000126", + "0x0000000000000000000000000000000000000000000000000000000000000127", + "0x0000000000000000000000000000000000000000000000000000000000000128", + "0x0000000000000000000000000000000000000000000000000000000000000129", + "0x000000000000000000000000000000000000000000000000000000000000012a", + "0x000000000000000000000000000000000000000000000000000000000000012b", + "0x000000000000000000000000000000000000000000000000000000000000012c", + "0x000000000000000000000000000000000000000000000000000000000000012d", + "0x000000000000000000000000000000000000000000000000000000000000012e", + "0x000000000000000000000000000000000000000000000000000000000000012f", + "0x0000000000000000000000000000000000000000000000000000000000000130", + "0x0000000000000000000000000000000000000000000000000000000000000131", + "0x0000000000000000000000000000000000000000000000000000000000000132", + "0x0000000000000000000000000000000000000000000000000000000000000133", + "0x0000000000000000000000000000000000000000000000000000000000000134", + "0x0000000000000000000000000000000000000000000000000000000000000135", + "0x0000000000000000000000000000000000000000000000000000000000000136", + "0x0000000000000000000000000000000000000000000000000000000000000137", + "0x0000000000000000000000000000000000000000000000000000000000000138", + "0x0000000000000000000000000000000000000000000000000000000000000139", + "0x000000000000000000000000000000000000000000000000000000000000013a", + "0x000000000000000000000000000000000000000000000000000000000000013b", + "0x000000000000000000000000000000000000000000000000000000000000013c", + "0x000000000000000000000000000000000000000000000000000000000000013d", + "0x000000000000000000000000000000000000000000000000000000000000013e", + "0x000000000000000000000000000000000000000000000000000000000000013f", + "0x0000000000000000000000000000000000000000000000000000000000000140", + "0x0000000000000000000000000000000000000000000000000000000000000141", + "0x0000000000000000000000000000000000000000000000000000000000000142", + "0x0000000000000000000000000000000000000000000000000000000000000143", + "0x0000000000000000000000000000000000000000000000000000000000000144", + "0x0000000000000000000000000000000000000000000000000000000000000145", + "0x0000000000000000000000000000000000000000000000000000000000000146", + "0x0000000000000000000000000000000000000000000000000000000000000147", + "0x0000000000000000000000000000000000000000000000000000000000000148", + "0x0000000000000000000000000000000000000000000000000000000000000149", + "0x000000000000000000000000000000000000000000000000000000000000014a", + "0x000000000000000000000000000000000000000000000000000000000000014b", + "0x000000000000000000000000000000000000000000000000000000000000014c", + "0x000000000000000000000000000000000000000000000000000000000000014d", + "0x000000000000000000000000000000000000000000000000000000000000014e", + "0x000000000000000000000000000000000000000000000000000000000000014f", + "0x0000000000000000000000000000000000000000000000000000000000000150", + "0x0000000000000000000000000000000000000000000000000000000000000151", + "0x0000000000000000000000000000000000000000000000000000000000000152", + "0x0000000000000000000000000000000000000000000000000000000000000153", + "0x0000000000000000000000000000000000000000000000000000000000000154", + "0x0000000000000000000000000000000000000000000000000000000000000155", + "0x0000000000000000000000000000000000000000000000000000000000000156", + "0x0000000000000000000000000000000000000000000000000000000000000157", + "0x0000000000000000000000000000000000000000000000000000000000000158", + "0x0000000000000000000000000000000000000000000000000000000000000159", + "0x000000000000000000000000000000000000000000000000000000000000015a", + "0x000000000000000000000000000000000000000000000000000000000000015b", + "0x000000000000000000000000000000000000000000000000000000000000015c", + "0x000000000000000000000000000000000000000000000000000000000000015d", + "0x000000000000000000000000000000000000000000000000000000000000015e", + "0x000000000000000000000000000000000000000000000000000000000000015f", + "0x0000000000000000000000000000000000000000000000000000000000000160", + "0x0000000000000000000000000000000000000000000000000000000000000161", + "0x0000000000000000000000000000000000000000000000000000000000000162", + "0x0000000000000000000000000000000000000000000000000000000000000163", + "0x0000000000000000000000000000000000000000000000000000000000000164", + "0x0000000000000000000000000000000000000000000000000000000000000165", + "0x0000000000000000000000000000000000000000000000000000000000000166", + "0x0000000000000000000000000000000000000000000000000000000000000167", + "0x0000000000000000000000000000000000000000000000000000000000000168", + "0x0000000000000000000000000000000000000000000000000000000000000169", + "0x000000000000000000000000000000000000000000000000000000000000016a", + "0x000000000000000000000000000000000000000000000000000000000000016b", + "0x000000000000000000000000000000000000000000000000000000000000016c", + "0x000000000000000000000000000000000000000000000000000000000000016d", + "0x000000000000000000000000000000000000000000000000000000000000016e", + "0x000000000000000000000000000000000000000000000000000000000000016f", + "0x0000000000000000000000000000000000000000000000000000000000000170", + "0x0000000000000000000000000000000000000000000000000000000000000171", + "0x0000000000000000000000000000000000000000000000000000000000000172", + "0x0000000000000000000000000000000000000000000000000000000000000173", + "0x0000000000000000000000000000000000000000000000000000000000000174", + "0x0000000000000000000000000000000000000000000000000000000000000175", + "0x0000000000000000000000000000000000000000000000000000000000000176", + "0x0000000000000000000000000000000000000000000000000000000000000177", + "0x0000000000000000000000000000000000000000000000000000000000000178", + "0x0000000000000000000000000000000000000000000000000000000000000179", + "0x000000000000000000000000000000000000000000000000000000000000017a", + "0x000000000000000000000000000000000000000000000000000000000000017b", + "0x000000000000000000000000000000000000000000000000000000000000017c", + "0x000000000000000000000000000000000000000000000000000000000000017d", + "0x000000000000000000000000000000000000000000000000000000000000017e", + "0x000000000000000000000000000000000000000000000000000000000000017f", + "0x0000000000000000000000000000000000000000000000000000000000000180", + "0x0000000000000000000000000000000000000000000000000000000000000181", + "0x0000000000000000000000000000000000000000000000000000000000000182", + "0x0000000000000000000000000000000000000000000000000000000000000183", + "0x0000000000000000000000000000000000000000000000000000000000000184", + "0x0000000000000000000000000000000000000000000000000000000000000185", + "0x0000000000000000000000000000000000000000000000000000000000000186", + "0x0000000000000000000000000000000000000000000000000000000000000187", + "0x0000000000000000000000000000000000000000000000000000000000000188", + "0x0000000000000000000000000000000000000000000000000000000000000189", + "0x000000000000000000000000000000000000000000000000000000000000018a", + "0x000000000000000000000000000000000000000000000000000000000000018b", + "0x000000000000000000000000000000000000000000000000000000000000018c", + "0x000000000000000000000000000000000000000000000000000000000000018d", + "0x000000000000000000000000000000000000000000000000000000000000018e", + "0x000000000000000000000000000000000000000000000000000000000000018f", + "0x0000000000000000000000000000000000000000000000000000000000000190", + "0x0000000000000000000000000000000000000000000000000000000000000191", + "0x0000000000000000000000000000000000000000000000000000000000000192", + "0x0000000000000000000000000000000000000000000000000000000000000193", + "0x0000000000000000000000000000000000000000000000000000000000000194", + "0x0000000000000000000000000000000000000000000000000000000000000195", + "0x0000000000000000000000000000000000000000000000000000000000000196", + "0x0000000000000000000000000000000000000000000000000000000000000197", + "0x0000000000000000000000000000000000000000000000000000000000000198", + "0x0000000000000000000000000000000000000000000000000000000000000199", + "0x000000000000000000000000000000000000000000000000000000000000019a", + "0x000000000000000000000000000000000000000000000000000000000000019b", + "0x000000000000000000000000000000000000000000000000000000000000019c", + "0x000000000000000000000000000000000000000000000000000000000000019d", + "0x000000000000000000000000000000000000000000000000000000000000019e", + "0x000000000000000000000000000000000000000000000000000000000000019f", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000001a1", + "0x00000000000000000000000000000000000000000000000000000000000001a2", + "0x00000000000000000000000000000000000000000000000000000000000001a3", + "0x00000000000000000000000000000000000000000000000000000000000001a4", + "0x00000000000000000000000000000000000000000000000000000000000001a5", + "0x00000000000000000000000000000000000000000000000000000000000001a6", + "0x00000000000000000000000000000000000000000000000000000000000001a7", + "0x00000000000000000000000000000000000000000000000000000000000001a8", + "0x00000000000000000000000000000000000000000000000000000000000001a9", + "0x00000000000000000000000000000000000000000000000000000000000001aa", + "0x00000000000000000000000000000000000000000000000000000000000001ab", + "0x00000000000000000000000000000000000000000000000000000000000001ac", + "0x00000000000000000000000000000000000000000000000000000000000001ad", + "0x00000000000000000000000000000000000000000000000000000000000001ae", + "0x00000000000000000000000000000000000000000000000000000000000001af", + "0x00000000000000000000000000000000000000000000000000000000000001b0", + "0x00000000000000000000000000000000000000000000000000000000000001b1", + "0x00000000000000000000000000000000000000000000000000000000000001b2", + "0x00000000000000000000000000000000000000000000000000000000000001b3", + "0x00000000000000000000000000000000000000000000000000000000000001b4", + "0x00000000000000000000000000000000000000000000000000000000000001b5", + "0x00000000000000000000000000000000000000000000000000000000000001b6", + "0x00000000000000000000000000000000000000000000000000000000000001b7", + "0x00000000000000000000000000000000000000000000000000000000000001b8", + "0x00000000000000000000000000000000000000000000000000000000000001b9", + "0x00000000000000000000000000000000000000000000000000000000000001ba", + "0x00000000000000000000000000000000000000000000000000000000000001bb", + "0x00000000000000000000000000000000000000000000000000000000000001bc", + "0x00000000000000000000000000000000000000000000000000000000000001bd", + "0x00000000000000000000000000000000000000000000000000000000000001be", + "0x00000000000000000000000000000000000000000000000000000000000001bf", + "0x00000000000000000000000000000000000000000000000000000000000001c0", + "0x00000000000000000000000000000000000000000000000000000000000001c1", + "0x00000000000000000000000000000000000000000000000000000000000001c2", + "0x00000000000000000000000000000000000000000000000000000000000001c3", + "0x00000000000000000000000000000000000000000000000000000000000001c4", + "0x00000000000000000000000000000000000000000000000000000000000001c5", + "0x00000000000000000000000000000000000000000000000000000000000001c6", + "0x00000000000000000000000000000000000000000000000000000000000001c7", + "0x00000000000000000000000000000000000000000000000000000000000001c8", + "0x00000000000000000000000000000000000000000000000000000000000001c9", + "0x00000000000000000000000000000000000000000000000000000000000001ca", + "0x00000000000000000000000000000000000000000000000000000000000001cb", + "0x00000000000000000000000000000000000000000000000000000000000001cc", + "0x00000000000000000000000000000000000000000000000000000000000001cd", + "0x00000000000000000000000000000000000000000000000000000000000001ce", + "0x00000000000000000000000000000000000000000000000000000000000001cf" +] + +[inputs.previous_rollup_data.vk] +key = [ + "0x0000000000000000000000000000000000000000000000000000000000200000", + "0x00000000000000000000000000000000000000000000000000000000000003ec", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x00000000000000000000000000000000000000000000000000000000000003dc", + "0x00000000000000000000000000000000000000000000000000000000000003dd", + "0x00000000000000000000000000000000000000000000000000000000000003de", + "0x00000000000000000000000000000000000000000000000000000000000003df", + "0x00000000000000000000000000000000000000000000000000000000000003e0", + "0x00000000000000000000000000000000000000000000000000000000000003e1", + "0x00000000000000000000000000000000000000000000000000000000000003e2", + "0x00000000000000000000000000000000000000000000000000000000000003e3", + "0x00000000000000000000000000000000000000000000000000000000000003e4", + "0x00000000000000000000000000000000000000000000000000000000000003e5", + "0x00000000000000000000000000000000000000000000000000000000000003e6", + "0x00000000000000000000000000000000000000000000000000000000000003e7", + "0x00000000000000000000000000000000000000000000000000000000000003e8", + "0x00000000000000000000000000000000000000000000000000000000000003e9", + "0x00000000000000000000000000000000000000000000000000000000000003ea", + "0x00000000000000000000000000000000000000000000000000000000000003eb", + "0x000000000000000000000000000000998e5be31abe68fe2f1d08ec68178d5e55", + "0x000000000000000000000000000000000025ab0352159abdadfb1c5163f7d202", + "0x000000000000000000000000000000bcd393b12573d6d5e53fc42c17f71d4c8b", + "0x000000000000000000000000000000000027925c9ebd2056d20410e57df614ed", + "0x0000000000000000000000000000004a0d4495d868843067a6d1ad3607e091a7", + "0x00000000000000000000000000000000001958c78407cbcd95b771b31d38a1c1", + "0x0000000000000000000000000000007e68740a53fd37e46590ab1c6f5b58b328", + "0x00000000000000000000000000000000002980bcd4948a9fbb5723af68df31da", + "0x000000000000000000000000000000dcdb1d1d1c5173490b696673e0313c62bd", + "0x000000000000000000000000000000000028d0610e818fedd71ec3a9281a7781", + "0x000000000000000000000000000000d17c67572cce970c5757a9a84445102eed", + "0x00000000000000000000000000000000002f4c160a312790dabbd93d572f07bb", + "0x0000000000000000000000000000004c61674567376a482c90a5bf7c53976cfe", + "0x00000000000000000000000000000000002d7f4779d914d01d064e7b406fb808", + "0x0000000000000000000000000000006c3b45eb8698c1e59dfeea80a9c3db9f5f", + "0x0000000000000000000000000000000000060a2cfa606a2ce7d86eb2162d7e71", + "0x00000000000000000000000000000062f1da156b5112d7cb9f320d5452e60627", + "0x000000000000000000000000000000000023325f29f5d61154778ac60e962c31", + "0x000000000000000000000000000000071a7bd0219e592d3a65f399b2a4964241", + "0x0000000000000000000000000000000000162558d3b4de45fdbde1b0d8f89bf8", + "0x000000000000000000000000000000488d6af9e2b2c6dfed9a16bef551a40255", + "0x0000000000000000000000000000000000099f9e36cd0b4f59b9c98c01b88003", + "0x000000000000000000000000000000a9267458a56c12b55c15b7c51e505b8e6c", + "0x000000000000000000000000000000000015ca0f8807b968cf2dc4222c0ec955", + "0x0000000000000000000000000000004b4b7c7b2144700873a7af327468d6edf5", + "0x00000000000000000000000000000000001f0c1785ec10d742cdd7817c9ff404", + "0x0000000000000000000000000000004ade21f14ed1ff588175882ce70339db26", + "0x0000000000000000000000000000000000279f17c283202f883245d3a4c47747", + "0x00000000000000000000000000000085157b1b29066dfe5edf96c38344140801", + "0x000000000000000000000000000000000023791cefa64559dbdade3a6190f039", + "0x000000000000000000000000000000164cfe1d74198193dd30197a589b236f88", + "0x00000000000000000000000000000000000c70733b2a932741394e86bd8a57e2", + "0x0000000000000000000000000000003f14d7f440e8578acce63f8eec32380f7a", + "0x0000000000000000000000000000000000303d66f56023c8588baffd7e092e67", + "0x000000000000000000000000000000fedfeb52b321b9cb36c9634c3730492ab1", + "0x00000000000000000000000000000000002f0aff78047292f42b7f5bb19c05f7", + "0x000000000000000000000000000000994d21d6354422208e38715f37e48fa16d", + "0x00000000000000000000000000000000001eb0eb53130ca20d5e87c0a254f7c6", + "0x00000000000000000000000000000007f75f0866bac3efe692c450e2c6de3a55", + "0x000000000000000000000000000000000017a3177f2e8def9f22c11e4b6d7618", + "0x000000000000000000000000000000a763b50f06bec58aa0e1e7a36aa5e0ef9d", + "0x0000000000000000000000000000000000072fcc6fdb06628b8adff26ce4f3f6", + "0x0000000000000000000000000000004e587f87e7ecfb15dd38d65b300a0ed04b", + "0x00000000000000000000000000000000001067a37239b8f86c8b34885e5f93f4", + "0x000000000000000000000000000000d532562004237072c915a771ef2abd6a00", + "0x000000000000000000000000000000000012f352a9d1783669dbd48c685920db", + "0x0000000000000000000000000000003b1f4cb9dcde9f5112acea5e520123a491", + "0x0000000000000000000000000000000000143a7afda4f460bbebe4ba1141501a", + "0x000000000000000000000000000000bc5cf78a7230c328e37d3f2fe19f6777ca", + "0x00000000000000000000000000000000000dcbe3389d11e40a5faf40a385ad22", + "0x000000000000000000000000000000f7c9cfa27095a937ada1a7897eb222ce89", + "0x000000000000000000000000000000000014b4924c74371f51dacd2bf2866c13", + "0x000000000000000000000000000000f2d8c4588bb4679bff57e660e17cc33973", + "0x0000000000000000000000000000000000151e2efe25ec498ed563261e36c555", + "0x0000000000000000000000000000001f2e91f77895aa5de8e452c6fca1550a7c", + "0x000000000000000000000000000000000023a05e0263e278950bccbabc25d273", + "0x00000000000000000000000000000005057a4276a0a97ef69b09241d942e1a9c", + "0x000000000000000000000000000000000018c875aec30f26a998a59cd9204d7f", + "0x0000000000000000000000000000008e7332630bd450e6ac0ee872e7e83aca38", + "0x00000000000000000000000000000000000eb1e133f51a031dfee4d967ec7321", + "0x00000000000000000000000000000034530e460a13a571bc35cfa6451fe6187e", + "0x00000000000000000000000000000000001de2c208c273d874060093c41d6815", + "0x000000000000000000000000000000e4f54fcade01d40e3e2858b5dd48341f72", + "0x00000000000000000000000000000000001e9026e6c62cfacecca45033e276cd", + "0x00000000000000000000000000000048fe4b2e662e8f72008deaaeb3cae82889", + "0x00000000000000000000000000000000000f23cd4f99e1879d8446159daeb62c", + "0x0000000000000000000000000000007a40e933ce7da86e405e300f09e9696a80", + "0x00000000000000000000000000000000002be3c84c3b52d758c814a963ba2f94", + "0x000000000000000000000000000000052c1133e365eda815b0be14c147398afd", + "0x00000000000000000000000000000000002e362f1ae1a9653e20e4ea7fff40a8", + "0x000000000000000000000000000000e550b0f1e7405c2a3eff981bb0f01c7d1f", + "0x000000000000000000000000000000000013dba20a64ae2d9f8482e61610a66f", + "0x000000000000000000000000000000642e7b3cbb6059b084f85a6010a256faa0", + "0x00000000000000000000000000000000001956c1f43bf67c2c942afd7e48353d", + "0x0000000000000000000000000000000e48669367ac01cdc80311fc55a0e60bd8", + "0x00000000000000000000000000000000002139d444b492ec82d558636ffc1e97", + "0x0000000000000000000000000000006fa4e2aa15e6518b1a6bb34141b1c46202", + "0x000000000000000000000000000000000011ded7a51635993f8ba273a699c2bb", + "0x0000000000000000000000000000004c1dc1dc7bfa3216f08dcfb9311062f721", + "0x000000000000000000000000000000000003696e65c014736dadc105517f571a", + "0x0000000000000000000000000000008de75372e4ec795c962f02a2e099c02489", + "0x00000000000000000000000000000000001e04420c925ab1c6575c7be2bf84c2", + "0x0000000000000000000000000000004858ea68d4d6587c4d8fb1856940db0220", + "0x00000000000000000000000000000000000b120f02c14e10a3fb1ce4ed95e4c6", + "0x00000000000000000000000000000095fce621e5d13adb1600ff34a7cab78ce7", + "0x0000000000000000000000000000000000138f458a343844776fda405a5271cf", + "0x00000000000000000000000000000046a68a67cbd929d663206821ce8fc5e230", + "0x00000000000000000000000000000000000baad17f09e16020481a4d67f735a2", + "0x0000000000000000000000000000005d157a3ade75ffbbc28195549243fd12a3", + "0x000000000000000000000000000000000017cabc064e4238d6844b8703d41d24", + "0x000000000000000000000000000000152ce071b703eb0716af995f8c91e13ce9", + "0x00000000000000000000000000000000002299066301428e31449b88fe5a4a76", + "0x00000000000000000000000000000039d0f4c6ba5eb83fd6fe632dba5ccd9361", + "0x00000000000000000000000000000000001bbb5e0fe4c482f456058dfb96f9ab", + "0x0000000000000000000000000000006ada264c4d8f433774b81314666f8e9d09", + "0x00000000000000000000000000000000002889ea5c1cdd05bca629fc629023cf", + "0x0000000000000000000000000000002b819d712cc9b72347f629fa9ae632b155", + "0x0000000000000000000000000000000000257b6eabdd8823096556a6263402b1", + "0x000000000000000000000000000000460b98103674e0ac00918e8877f22f1b71", + "0x0000000000000000000000000000000000054eae798f898372c126db4bd48259", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000aea6c2f5d00b46c5ccf035d8c19f11101a", + "0x00000000000000000000000000000000002728e3debd0a243c2174d473988eb3", + "0x0000000000000000000000000000000ee308876e5271eb3bf8b463c94ce996e7", + "0x00000000000000000000000000000000001d9bc82bf7a9b8810f3c4ae1690471" +] +hash = "0x2e7f7b71ec9506e7c37f331a6e16f9e576f5ac374fa60e4aea986776087da83f" + +[inputs.previous_rollup_data.vk_witness] +leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000e" +sibling_path = [ + "0x2efa03aa055caa1718bf1e397afc0f2c2628ec115188f95f9f46027a21fab345", + "0x29e27c1d0934d5550f382c4b65288f9e4e62757ebaf45fc1c197c920c3528cdd", + "0x220ebe2ec739267877ea7a9dfdd070c92cc88f558917466660908410bd66dabc", + "0x268b4fb54bbdda64dd707ee86cb0729dfb9a9e8b6ae83e973b37bc7e4b18f875", + "0x1967335d7b185023afd52d8f7f40be4ced0d80ba63d4dce2de3e26bfe772e394", + "0x122cddd247164987e2287f8ce124bea7a68052e85bffebe2fc6cd71718689069" +] diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-root/SampleInputs.toml b/noir-projects/noir-protocol-circuits/crates/rollup-root/SampleInputs.toml deleted file mode 100644 index 59c7ee437b9..00000000000 --- a/noir-projects/noir-protocol-circuits/crates/rollup-root/SampleInputs.toml +++ /dev/null @@ -1,1710 +0,0 @@ -[inputs] -prover_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data]] -[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] -previous_block_hash = "0x015bcb5469435680f990078689699536790fb3bba6fe986caffc727997e96303" -end_block_hash = "0x0e0a5369a50535a702a094852903243208c7a296619ca098fb492ba5231272a8" -out_hash = "0x008ed2a7ee154ec9103284423b3f98bbbe7b755f04c007c51f6eb3fdd6c1bd8d" -vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" -prover_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] - root = "0x01780154b577d9c3cabe38cfa50b905cca1b3a7726bfd8104a36f4cd76d76516" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000005" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] - root = "0x2d77779ab6f5ffbbb416cad0780815c81b528645f9e766b38cb05ecb0d854a6f" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000005" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000005" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000005" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000006" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000006" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000006" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.previous_rollup_data.proof] -fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - -[inputs.previous_rollup_data.vk] -key = [ - "0x0000000000000000000000000000000000000000000000000000000000200000", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000f9a0f1b4b73c650a49a59930aa5adce272", - "0x000000000000000000000000000000000002d4e1786e29578b3cb0fb4689bb7c", - "0x000000000000000000000000000000266333b910a3282a4c63301136aea8e4fa", - "0x00000000000000000000000000000000000f903bfa8c605b49a0c3c89750746b", - "0x000000000000000000000000000000d76149d349b289d623908bbd1192792709", - "0x000000000000000000000000000000000011168c030cc34fd4102af59f4ae73d", - "0x000000000000000000000000000000dbdf4eba3bbd9dfc3cf4dc6efd28b69051", - "0x0000000000000000000000000000000000033e8efa394f8be16d0473f2c85358", - "0x000000000000000000000000000000ba5e04dd8e2f259451487dd85da5d14702", - "0x000000000000000000000000000000000022abc3ee90a5e2744eec572201b6b2", - "0x00000000000000000000000000000058828d6caa20b472b3b896282dcc4a1643", - "0x0000000000000000000000000000000000237735c2d24244533f09e8ca65fcff", - "0x0000000000000000000000000000002fe564c32e7b326b8cdc8af20090bfc7a2", - "0x00000000000000000000000000000000000346d4c3c2d8f7cd5b85725b3878c5", - "0x000000000000000000000000000000f8f62d94d85c08d70496476164cb803211", - "0x000000000000000000000000000000000019427e2f89a50c1bcdc551b04d772b", - "0x00000000000000000000000000000033f9afc10930b18d19b6af874448d160c6", - "0x0000000000000000000000000000000000137c6abe6f1fcf900e90a5cf237cc6", - "0x00000000000000000000000000000058cccc3f2703d29c91f3d17c78e3299bd2", - "0x0000000000000000000000000000000000076cb76ba8cfcc5bb70e050a59e218", - "0x000000000000000000000000000000c87b323ecbd7b15fc33e6c583107b44b23", - "0x00000000000000000000000000000000002e245e351eb310ddd7743269baf77f", - "0x0000000000000000000000000000009ff4950b0c4b3add44ccc902c09df25db5", - "0x000000000000000000000000000000000018a469eeb4052a82eefe68bd5b1196", - "0x000000000000000000000000000000894040d5d6f64d60c225608b18a587060f", - "0x000000000000000000000000000000000009d893128ac259b6cac4a994b11fc6", - "0x000000000000000000000000000000af64971bd54995512ff9c04ed40955f56d", - "0x000000000000000000000000000000000027d8c8f3775628a68ae667d48c26bc", - "0x00000000000000000000000000000032d71b4c23eb9a8ac6b8a45e4570f813d5", - "0x0000000000000000000000000000000000058b89a9a33565a4160e6a295dbb4f", - "0x0000000000000000000000000000006e56278f83df156d7732c93f40b1051379", - "0x00000000000000000000000000000000000563fbba3ff6f3c6f53f9f68ca199d", - "0x000000000000000000000000000000d25b431594b443e3cc070abe35eca64176", - "0x00000000000000000000000000000000002e7ed301fbed6012643a1689262b0b", - "0x000000000000000000000000000000df7e5e7c7b82d7bc5107b59c80f3c123c7", - "0x00000000000000000000000000000000000d1e931fd8ab4ccf539d0aa7a90d35", - "0x000000000000000000000000000000fd02efbc15750161313de3faf4b681aaf1", - "0x000000000000000000000000000000000017bcf9ee6bc3dd2c79ce6f89229b3e", - "0x00000000000000000000000000000020a38f1d6d780408ecf2e2d2b9f89eac06", - "0x000000000000000000000000000000000017db15fc415d5da6c4780b2bd700b4", - "0x00000000000000000000000000000032cc211a04c3c06cdcfd96b003cc47307c", - "0x00000000000000000000000000000000001c9bc4677476874f24855d8c495e44", - "0x000000000000000000000000000000ad3e50d334c410302365993a598b6181fc", - "0x00000000000000000000000000000000002cddb00aaef77704af7c10fb06cd27", - "0x000000000000000000000000000000b3914d6be743b266956035641be8ead9b2", - "0x000000000000000000000000000000000000c8fb13e0b42d3987ff5ef93f6ed7", - "0x000000000000000000000000000000df85b5175892649d17c0199d1aadac9319", - "0x00000000000000000000000000000000000b931c7f5d1dacc8e7559e9ba84017", - "0x0000000000000000000000000000005e8c4f79863adb4bcc8a6cf38eea5206f0", - "0x000000000000000000000000000000000003a8f03343baca1998030d4b894641", - "0x00000000000000000000000000000062c87a9445f84764866d9ddc1bf67cfbda", - "0x00000000000000000000000000000000000d0eb506f26d8fd25e1fc604a312c8", - "0x000000000000000000000000000000a6cdbdd6f5a8e72bffcd9a2f4b5911f4db", - "0x000000000000000000000000000000000004f8b7c104f426a04178d19bfca639", - "0x000000000000000000000000000000555745a2f5504f3aa8530662d42f6aba6d", - "0x00000000000000000000000000000000000951c26d785d82ab4cbe40e9b9ebf8", - "0x000000000000000000000000000000d25534444e437c7afe806ef54995555246", - "0x000000000000000000000000000000000016051b87703af88579e4b3c789ed4b", - "0x0000000000000000000000000000007d8b77fe3663f3d42388ec1e9a5f20dcb7", - "0x00000000000000000000000000000000001350cbd188ff9798d1a14e3a712316", - "0x000000000000000000000000000000957dad8e248a580c01e39ea5da41b06e12", - "0x00000000000000000000000000000000000d79b41a0ba843370253375159bb76", - "0x0000000000000000000000000000007d3dcfd2a7a9763a9bb35d9b4a0cb644c3", - "0x00000000000000000000000000000000002af943d1ff0fa6024fd74b0e711c40", - "0x00000000000000000000000000000081ac6be98c7aa41b1e331ca6b399ffbcf8", - "0x0000000000000000000000000000000000007f46bf52fe6f59f74d6ae110635d", - "0x0000000000000000000000000000002b5e73b74fea51ebac288febfff011e1fc", - "0x00000000000000000000000000000000001e6267d50d54cd1e9bdeba4d0b18b1", - "0x000000000000000000000000000000238dd5230616fd65b931f0bf9938528b2b", - "0x00000000000000000000000000000000001038d4a6435d75991361206f266358", - "0x0000000000000000000000000000004d9fa56c224d029428e2144a7da5f72642", - "0x0000000000000000000000000000000000020a80119aada1a665ed68e432ebf7", - "0x00000000000000000000000000000075866a52c8cc25d0fb6f6ea61ea60acc4d", - "0x00000000000000000000000000000000002d2c9968baefda1cadfe406a523121", - "0x0000000000000000000000000000000e4f9f128eedd55e95c4af0ce03f36b3cf", - "0x0000000000000000000000000000000000123a6b0a746d55cff6a172cea94c87", - "0x0000000000000000000000000000005d5a52f4828bdcc80eb43ae38c99000807", - "0x000000000000000000000000000000000015bbf7c793a9227c63b6ed44b56be9", - "0x000000000000000000000000000000619ea6256e50ba30c7438d3487de46c8de", - "0x000000000000000000000000000000000013b8dca4e1068bb38ce90d444dde48", - "0x0000000000000000000000000000000ccc3a61da65d9333a2d99d685d4a12437", - "0x000000000000000000000000000000000003f40a3022046cadb4821049ea177b", - "0x000000000000000000000000000000ebe96bd16e9e00ef2e8fe1afac5072b33c", - "0x0000000000000000000000000000000000203efcb0b23ec0803421b7ba6196e3", - "0x00000000000000000000000000000095fce621e5d13adb1600ff34a7cab78ce7", - "0x0000000000000000000000000000000000138f458a343844776fda405a5271cf", - "0x00000000000000000000000000000046a68a67cbd929d663206821ce8fc5e230", - "0x00000000000000000000000000000000000baad17f09e16020481a4d67f735a2", - "0x0000000000000000000000000000005d157a3ade75ffbbc28195549243fd12a3", - "0x000000000000000000000000000000000017cabc064e4238d6844b8703d41d24", - "0x000000000000000000000000000000152ce071b703eb0716af995f8c91e13ce9", - "0x00000000000000000000000000000000002299066301428e31449b88fe5a4a76", - "0x00000000000000000000000000000039d0f4c6ba5eb83fd6fe632dba5ccd9361", - "0x00000000000000000000000000000000001bbb5e0fe4c482f456058dfb96f9ab", - "0x0000000000000000000000000000006ada264c4d8f433774b81314666f8e9d09", - "0x00000000000000000000000000000000002889ea5c1cdd05bca629fc629023cf", - "0x0000000000000000000000000000002b819d712cc9b72347f629fa9ae632b155", - "0x0000000000000000000000000000000000257b6eabdd8823096556a6263402b1", - "0x000000000000000000000000000000460b98103674e0ac00918e8877f22f1b71", - "0x0000000000000000000000000000000000054eae798f898372c126db4bd48259", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000006bb52125d6fc06647fd9cedb6d78b45484", - "0x00000000000000000000000000000000000c9efacb27891ccff4ec585bca178d", - "0x000000000000000000000000000000d00d066099502ff473730b51ba584a2497", - "0x0000000000000000000000000000000000178f40f0d3e4a602b39b54d703693c" -] -hash = "0x0f9dd365fdf92a402609ec76d8c4ef3bbf9cf556dc49dbf1e9529819c493bae7" - -[inputs.previous_rollup_data.vk_witness] -leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000e" -sibling_path = [ - "0x1278a25e09e3c264b2464c399261c3088a37c078d3b5f857bede801e60256525", - "0x21fcc32e6b27ccb6085761bf104a6e67807bd75fe0e69277e7cb7070d51256bf", - "0x28cc5f065307988bda56bf3288ec5311f15bee227f3563ab228922188964f892", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] - - [[inputs.previous_rollup_data]] -[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs] -previous_block_hash = "0x0e0a5369a50535a702a094852903243208c7a296619ca098fb492ba5231272a8" -end_block_hash = "0x142122a76ac2f24bdc195faa0e58f02bc0c16a6d18b0e01d7309548f80db20b3" -out_hash = "0x00579747630088cbbe7b074389acdca4e86d2168e6e4178628dd6331aa971ecf" -vk_tree_root = "0x08caee4b2be5b018c978fff503b872c2ccd60da8bdb54f77d0dd278ca3fb5e46" -protocol_contract_tree_root = "0x25f50bc26b37075e561bfbe1fd61078037ee4a76d6b3d2c21c5d0e82ac940e09" -prover_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.previous_archive] - root = "0x2d77779ab6f5ffbbb416cad0780815c81b528645f9e766b38cb05ecb0d854a6f" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000007" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.new_archive] - root = "0x2eea36fc756c0cfb6ccd14f88afd9238530a2f5d7edaec3194144b0cd8cc9cf4" - next_available_leaf_index = "0x0000000000000000000000000000000000000000000000000000000000000009" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000007" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000007" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000007" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.start_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables] - chain_id = "0x0000000000000000000000000000000000000000000000000000000000000000" - version = "0x0000000000000000000000000000000000000000000000000000000000000000" - block_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - slot_number = "0x0000000000000000000000000000000000000000000000000000000000000008" - timestamp = "0x0000000000000000000000000000000000000000000000000000000000000008" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.coinbase] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.fee_recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.end_global_variables.gas_fees] - fee_per_da_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - fee_per_l2_gas = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [[inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees]] - value = "0x0000000000000000000000000000000000000000000000000000000000000000" - - [inputs.previous_rollup_data.block_root_or_block_merge_public_inputs.fees.recipient] - inner = "0x0000000000000000000000000000000000000000000000000000000000000000" - -[inputs.previous_rollup_data.proof] -fields = [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf" -] - -[inputs.previous_rollup_data.vk] -key = [ - "0x0000000000000000000000000000000000000000000000000000000000200000", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000f9a0f1b4b73c650a49a59930aa5adce272", - "0x000000000000000000000000000000000002d4e1786e29578b3cb0fb4689bb7c", - "0x000000000000000000000000000000266333b910a3282a4c63301136aea8e4fa", - "0x00000000000000000000000000000000000f903bfa8c605b49a0c3c89750746b", - "0x000000000000000000000000000000d76149d349b289d623908bbd1192792709", - "0x000000000000000000000000000000000011168c030cc34fd4102af59f4ae73d", - "0x000000000000000000000000000000dbdf4eba3bbd9dfc3cf4dc6efd28b69051", - "0x0000000000000000000000000000000000033e8efa394f8be16d0473f2c85358", - "0x000000000000000000000000000000ba5e04dd8e2f259451487dd85da5d14702", - "0x000000000000000000000000000000000022abc3ee90a5e2744eec572201b6b2", - "0x00000000000000000000000000000058828d6caa20b472b3b896282dcc4a1643", - "0x0000000000000000000000000000000000237735c2d24244533f09e8ca65fcff", - "0x0000000000000000000000000000002fe564c32e7b326b8cdc8af20090bfc7a2", - "0x00000000000000000000000000000000000346d4c3c2d8f7cd5b85725b3878c5", - "0x000000000000000000000000000000f8f62d94d85c08d70496476164cb803211", - "0x000000000000000000000000000000000019427e2f89a50c1bcdc551b04d772b", - "0x00000000000000000000000000000033f9afc10930b18d19b6af874448d160c6", - "0x0000000000000000000000000000000000137c6abe6f1fcf900e90a5cf237cc6", - "0x00000000000000000000000000000058cccc3f2703d29c91f3d17c78e3299bd2", - "0x0000000000000000000000000000000000076cb76ba8cfcc5bb70e050a59e218", - "0x000000000000000000000000000000c87b323ecbd7b15fc33e6c583107b44b23", - "0x00000000000000000000000000000000002e245e351eb310ddd7743269baf77f", - "0x0000000000000000000000000000009ff4950b0c4b3add44ccc902c09df25db5", - "0x000000000000000000000000000000000018a469eeb4052a82eefe68bd5b1196", - "0x000000000000000000000000000000894040d5d6f64d60c225608b18a587060f", - "0x000000000000000000000000000000000009d893128ac259b6cac4a994b11fc6", - "0x000000000000000000000000000000af64971bd54995512ff9c04ed40955f56d", - "0x000000000000000000000000000000000027d8c8f3775628a68ae667d48c26bc", - "0x00000000000000000000000000000032d71b4c23eb9a8ac6b8a45e4570f813d5", - "0x0000000000000000000000000000000000058b89a9a33565a4160e6a295dbb4f", - "0x0000000000000000000000000000006e56278f83df156d7732c93f40b1051379", - "0x00000000000000000000000000000000000563fbba3ff6f3c6f53f9f68ca199d", - "0x000000000000000000000000000000d25b431594b443e3cc070abe35eca64176", - "0x00000000000000000000000000000000002e7ed301fbed6012643a1689262b0b", - "0x000000000000000000000000000000df7e5e7c7b82d7bc5107b59c80f3c123c7", - "0x00000000000000000000000000000000000d1e931fd8ab4ccf539d0aa7a90d35", - "0x000000000000000000000000000000fd02efbc15750161313de3faf4b681aaf1", - "0x000000000000000000000000000000000017bcf9ee6bc3dd2c79ce6f89229b3e", - "0x00000000000000000000000000000020a38f1d6d780408ecf2e2d2b9f89eac06", - "0x000000000000000000000000000000000017db15fc415d5da6c4780b2bd700b4", - "0x00000000000000000000000000000032cc211a04c3c06cdcfd96b003cc47307c", - "0x00000000000000000000000000000000001c9bc4677476874f24855d8c495e44", - "0x000000000000000000000000000000ad3e50d334c410302365993a598b6181fc", - "0x00000000000000000000000000000000002cddb00aaef77704af7c10fb06cd27", - "0x000000000000000000000000000000b3914d6be743b266956035641be8ead9b2", - "0x000000000000000000000000000000000000c8fb13e0b42d3987ff5ef93f6ed7", - "0x000000000000000000000000000000df85b5175892649d17c0199d1aadac9319", - "0x00000000000000000000000000000000000b931c7f5d1dacc8e7559e9ba84017", - "0x0000000000000000000000000000005e8c4f79863adb4bcc8a6cf38eea5206f0", - "0x000000000000000000000000000000000003a8f03343baca1998030d4b894641", - "0x00000000000000000000000000000062c87a9445f84764866d9ddc1bf67cfbda", - "0x00000000000000000000000000000000000d0eb506f26d8fd25e1fc604a312c8", - "0x000000000000000000000000000000a6cdbdd6f5a8e72bffcd9a2f4b5911f4db", - "0x000000000000000000000000000000000004f8b7c104f426a04178d19bfca639", - "0x000000000000000000000000000000555745a2f5504f3aa8530662d42f6aba6d", - "0x00000000000000000000000000000000000951c26d785d82ab4cbe40e9b9ebf8", - "0x000000000000000000000000000000d25534444e437c7afe806ef54995555246", - "0x000000000000000000000000000000000016051b87703af88579e4b3c789ed4b", - "0x0000000000000000000000000000007d8b77fe3663f3d42388ec1e9a5f20dcb7", - "0x00000000000000000000000000000000001350cbd188ff9798d1a14e3a712316", - "0x000000000000000000000000000000957dad8e248a580c01e39ea5da41b06e12", - "0x00000000000000000000000000000000000d79b41a0ba843370253375159bb76", - "0x0000000000000000000000000000007d3dcfd2a7a9763a9bb35d9b4a0cb644c3", - "0x00000000000000000000000000000000002af943d1ff0fa6024fd74b0e711c40", - "0x00000000000000000000000000000081ac6be98c7aa41b1e331ca6b399ffbcf8", - "0x0000000000000000000000000000000000007f46bf52fe6f59f74d6ae110635d", - "0x0000000000000000000000000000002b5e73b74fea51ebac288febfff011e1fc", - "0x00000000000000000000000000000000001e6267d50d54cd1e9bdeba4d0b18b1", - "0x000000000000000000000000000000238dd5230616fd65b931f0bf9938528b2b", - "0x00000000000000000000000000000000001038d4a6435d75991361206f266358", - "0x0000000000000000000000000000004d9fa56c224d029428e2144a7da5f72642", - "0x0000000000000000000000000000000000020a80119aada1a665ed68e432ebf7", - "0x00000000000000000000000000000075866a52c8cc25d0fb6f6ea61ea60acc4d", - "0x00000000000000000000000000000000002d2c9968baefda1cadfe406a523121", - "0x0000000000000000000000000000000e4f9f128eedd55e95c4af0ce03f36b3cf", - "0x0000000000000000000000000000000000123a6b0a746d55cff6a172cea94c87", - "0x0000000000000000000000000000005d5a52f4828bdcc80eb43ae38c99000807", - "0x000000000000000000000000000000000015bbf7c793a9227c63b6ed44b56be9", - "0x000000000000000000000000000000619ea6256e50ba30c7438d3487de46c8de", - "0x000000000000000000000000000000000013b8dca4e1068bb38ce90d444dde48", - "0x0000000000000000000000000000000ccc3a61da65d9333a2d99d685d4a12437", - "0x000000000000000000000000000000000003f40a3022046cadb4821049ea177b", - "0x000000000000000000000000000000ebe96bd16e9e00ef2e8fe1afac5072b33c", - "0x0000000000000000000000000000000000203efcb0b23ec0803421b7ba6196e3", - "0x00000000000000000000000000000095fce621e5d13adb1600ff34a7cab78ce7", - "0x0000000000000000000000000000000000138f458a343844776fda405a5271cf", - "0x00000000000000000000000000000046a68a67cbd929d663206821ce8fc5e230", - "0x00000000000000000000000000000000000baad17f09e16020481a4d67f735a2", - "0x0000000000000000000000000000005d157a3ade75ffbbc28195549243fd12a3", - "0x000000000000000000000000000000000017cabc064e4238d6844b8703d41d24", - "0x000000000000000000000000000000152ce071b703eb0716af995f8c91e13ce9", - "0x00000000000000000000000000000000002299066301428e31449b88fe5a4a76", - "0x00000000000000000000000000000039d0f4c6ba5eb83fd6fe632dba5ccd9361", - "0x00000000000000000000000000000000001bbb5e0fe4c482f456058dfb96f9ab", - "0x0000000000000000000000000000006ada264c4d8f433774b81314666f8e9d09", - "0x00000000000000000000000000000000002889ea5c1cdd05bca629fc629023cf", - "0x0000000000000000000000000000002b819d712cc9b72347f629fa9ae632b155", - "0x0000000000000000000000000000000000257b6eabdd8823096556a6263402b1", - "0x000000000000000000000000000000460b98103674e0ac00918e8877f22f1b71", - "0x0000000000000000000000000000000000054eae798f898372c126db4bd48259", - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000006bb52125d6fc06647fd9cedb6d78b45484", - "0x00000000000000000000000000000000000c9efacb27891ccff4ec585bca178d", - "0x000000000000000000000000000000d00d066099502ff473730b51ba584a2497", - "0x0000000000000000000000000000000000178f40f0d3e4a602b39b54d703693c" -] -hash = "0x0f9dd365fdf92a402609ec76d8c4ef3bbf9cf556dc49dbf1e9529819c493bae7" - -[inputs.previous_rollup_data.vk_witness] -leaf_index = "0x000000000000000000000000000000000000000000000000000000000000000e" -sibling_path = [ - "0x1278a25e09e3c264b2464c399261c3088a37c078d3b5f857bede801e60256525", - "0x21fcc32e6b27ccb6085761bf104a6e67807bd75fe0e69277e7cb7070d51256bf", - "0x28cc5f065307988bda56bf3288ec5311f15bee227f3563ab228922188964f892", - "0x2e3849cceb2ae62309c721fd260515acd68371959386d486f7a961b72901d679", - "0x2758005dd30d8a4a91602489620463f59fcd549aacff6bb814c7e2cbd08a5723", - "0x17bd553374a169df0bf6cf0b5dca256dadbcbefdc8789bef5a2b0696b0dc24e0" -] diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/avm_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/avm_circuit_public_inputs.nr index 0352937e504..88fe770eb0d 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/avm_circuit_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/avm_circuit_public_inputs.nr @@ -214,7 +214,7 @@ impl AvmProofData { ); let mut result: [Field; 4] = [input_hash, 0, 0, 0]; - for i in 0..DUMMY_AVM_VERIFIER_NUM_ITERATIONS { + for _i in 0..DUMMY_AVM_VERIFIER_NUM_ITERATIONS { result = poseidon2_permutation(result, 4); } diff --git a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/constant_rollup_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/constant_rollup_data.nr similarity index 99% rename from noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/constant_rollup_data.nr rename to noir-projects/noir-protocol-circuits/crates/types/src/abis/constant_rollup_data.nr index 9eab56a2092..0a8d6919164 100644 --- a/noir-projects/noir-protocol-circuits/crates/rollup-lib/src/abis/constant_rollup_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/constant_rollup_data.nr @@ -1,4 +1,4 @@ -use dep::types::{ +use crate::{ abis::{append_only_tree_snapshot::AppendOnlyTreeSnapshot, global_variables::GlobalVariables}, constants::CONSTANT_ROLLUP_DATA_LENGTH, traits::{Deserialize, Empty, Serialize}, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr index 42301eb096d..7957367b52c 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr @@ -9,11 +9,17 @@ pub struct GasSettings { pub gas_limits: Gas, pub teardown_gas_limits: Gas, pub max_fees_per_gas: GasFees, + pub max_priority_fees_per_gas: GasFees, } impl GasSettings { - pub fn new(gas_limits: Gas, teardown_gas_limits: Gas, max_fees_per_gas: GasFees) -> Self { - Self { gas_limits, teardown_gas_limits, max_fees_per_gas } + pub fn new( + gas_limits: Gas, + teardown_gas_limits: Gas, + max_fees_per_gas: GasFees, + max_priority_fees_per_gas: GasFees, + ) -> Self { + Self { gas_limits, teardown_gas_limits, max_fees_per_gas, max_priority_fees_per_gas } } } @@ -22,12 +28,18 @@ impl Eq for GasSettings { (self.gas_limits == other.gas_limits) & (self.teardown_gas_limits == other.teardown_gas_limits) & (self.max_fees_per_gas == other.max_fees_per_gas) + & (self.max_priority_fees_per_gas == other.max_priority_fees_per_gas) } } impl Empty for GasSettings { fn empty() -> Self { - GasSettings::new(Gas::empty(), Gas::empty(), GasFees::empty()) + GasSettings::new( + Gas::empty(), + Gas::empty(), + GasFees::empty(), + GasFees::empty(), + ) } } @@ -38,6 +50,7 @@ impl Serialize for GasSettings { serialized.extend_from_array(self.gas_limits.serialize()); serialized.extend_from_array(self.teardown_gas_limits.serialize()); serialized.extend_from_array(self.max_fees_per_gas.serialize()); + serialized.extend_from_array(self.max_priority_fees_per_gas.serialize()); serialized.storage() } @@ -50,6 +63,7 @@ impl Deserialize for GasSettings { reader.read_struct(Gas::deserialize), reader.read_struct(Gas::deserialize), reader.read_struct(GasFees::deserialize), + reader.read_struct(GasFees::deserialize), ) } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs.nr index 7bcf3403299..1fb0e14fe05 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs.nr @@ -85,6 +85,7 @@ pub struct PrivateKernelCircuitPublicInputs { pub end: PrivateAccumulatedData, pub public_teardown_call_request: PublicCallRequest, pub fee_payer: AztecAddress, + pub is_private_only: bool, } impl Serialize for PrivateKernelCircuitPublicInputs { @@ -98,6 +99,7 @@ impl Serialize for PrivateKernelCir fields.extend_from_array(self.end.serialize()); fields.extend_from_array(self.public_teardown_call_request.serialize()); fields.extend_from_array(self.fee_payer.serialize()); + fields.push(self.is_private_only as Field); assert_eq(fields.len(), PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH); @@ -117,6 +119,7 @@ impl Deserialize for PrivateKernelC end: reader.read_struct(PrivateAccumulatedData::deserialize), public_teardown_call_request: reader.read_struct(PublicCallRequest::deserialize), fee_payer: reader.read_struct(AztecAddress::deserialize), + is_private_only: reader.read_bool(), }; reader.finish(); @@ -143,6 +146,7 @@ impl Empty for PrivateKernelCircuitPublicInputs { end: PrivateAccumulatedData::empty(), public_teardown_call_request: PublicCallRequest::empty(), fee_payer: AztecAddress::empty(), + is_private_only: false, } } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs_builder.nr index 3c0aab077c5..fddb1d1bd1e 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/kernel_circuit_public_inputs/private_kernel_circuit_public_inputs_builder.nr @@ -16,6 +16,7 @@ pub struct PrivateKernelCircuitPublicInputsBuilder { pub end: PrivateAccumulatedDataBuilder, pub public_teardown_call_request: PublicCallRequest, pub fee_payer: AztecAddress, + pub is_private_only: bool, } impl PrivateKernelCircuitPublicInputsBuilder { @@ -27,6 +28,7 @@ impl PrivateKernelCircuitPublicInputsBuilder { end: self.end.finish(), public_teardown_call_request: self.public_teardown_call_request, fee_payer: self.fee_payer, + is_private_only: self.is_private_only, } } } @@ -40,6 +42,7 @@ impl Empty for PrivateKernelCircuitPublicInputsBuilder { end: PrivateAccumulatedDataBuilder::empty(), public_teardown_call_request: PublicCallRequest::empty(), fee_payer: AztecAddress::empty(), + is_private_only: false, } } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr index dd095c4a498..ff429eefad6 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/mod.nr @@ -13,6 +13,7 @@ pub mod nullifier_leaf_preimage; pub mod tx_constant_data; pub mod combined_constant_data; +pub mod constant_rollup_data; pub mod side_effect; pub mod read_request; @@ -38,6 +39,7 @@ pub mod call_context; pub mod private_circuit_public_inputs; +pub mod sponge_blob; pub mod gas_fees; pub mod gas_settings; pub mod gas; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash_leaf_preimage.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash_leaf_preimage.nr index 1a77e9fd974..e86be01935d 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash_leaf_preimage.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash_leaf_preimage.nr @@ -29,11 +29,9 @@ impl LeafPreimage for NoteHashLeafPreimage { impl Readable for NoteHashLeafPreimage { fn assert_match_read_request(self, read_request: ScopedReadRequest) { - let siloed_value = - compute_siloed_note_hash(read_request.contract_address, read_request.value()); assert_eq( self.value, - siloed_value, + read_request.value(), "Value of the note hash leaf does not match read request", ); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr index 0d887f71f42..37c1b1dca94 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_kernel/private_call_data.nr @@ -25,7 +25,7 @@ pub struct PrivateCallData { } impl PrivateCallData { - fn verify(self, is_first_app: bool) { + pub fn verify(self, is_first_app: bool) { let proof_type = if is_first_app { PROOF_TYPE_OINK } else { diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr b/noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr new file mode 100644 index 00000000000..8eacb125310 --- /dev/null +++ b/noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr @@ -0,0 +1,143 @@ +use crate::{ + constants::{BLOBS_PER_BLOCK, FIELDS_PER_BLOB, SPONGE_BLOB_LENGTH}, + hash::poseidon2_absorb_chunks_existing_sponge, + traits::{Deserialize, Empty, Serialize}, +}; +use std::hash::poseidon2::Poseidon2; + +// A Poseidon2 sponge used to accumulate data that will be added to blob(s) +// (More accurately called BlobSponge, but that's not as fun) + +// Each base rollup circuit has a start and end SpongeBlob instance, like a PartialStateReference. +// Tx data is accumulated by calling absorb() on each field, and incrementing the number of fields. +// To save gates, we do not check after every absorb whether we have filled a blob (we do this in block root). + +// Each merge rollup circuit checks that the left rollup input's end SpongeBlob == the right rollup input's start SpongeBlob. + +// Finally, the block_root is given the list of all fields to be included in the blob. +// We hash these ^ and check that the hash matches the one given by the block_root's right input's end SpongeBlob.squeeze(). +// The hash is used as part of the blob challenge, as we've proven it encompasses all elts of the blob(s). + +// Init is given by input len * 2^64 (see noir/noir-repo/noir_stdlib/src/hash/poseidon2.nr -> hash_internal) +global IV: Field = (FIELDS_PER_BLOB * BLOBS_PER_BLOCK) as Field * 18446744073709551616; + +pub struct SpongeBlob { + pub sponge: Poseidon2, + pub fields: u32, + pub expected_fields: u32, // The hinted number of tx effects this will absorb +} + +impl SpongeBlob { + pub fn new_full_blobs() -> Self { + Self { sponge: Poseidon2::new(IV), fields: 0, expected_fields: 0 } + } + + pub fn new(expected_fields_hint: u32) -> Self { + Self { + sponge: Poseidon2::new((expected_fields_hint as Field) * 18446744073709551616), + fields: 0, + expected_fields: expected_fields_hint, + } + } + + // Add fields to the sponge + pub fn absorb(&mut self, input: [Field; N], in_len: u32) { + // We skip the 0 check below, as most use cases (e.g. base rollup) constrain that the input array + // is contructed from i=0->in_len from an empty array, so no need to check. + self.sponge = poseidon2_absorb_chunks_existing_sponge(self.sponge, input, in_len, true); + self.fields += in_len; + } + + // Finalise the sponge and output poseidon2 hash of all fields absorbed + pub fn squeeze(&mut self) -> Field { + // If the blob sponge is not 'full', we append 1 to match Poseidon2::hash_internal() + // NB: There is currently no use case in which we don't 'fill' a blob sponge, but adding for completeness + if self.fields != self.expected_fields { + self.sponge.absorb(1); + } + self.sponge.squeeze() + } +} + +impl Eq for SpongeBlob { + // TODO: should Poseidon2 struct have a .eq() impl? + fn eq(self, other: Self) -> bool { + (self.fields == other.fields) + & (self.sponge.cache == other.sponge.cache) + & (self.sponge.state == other.sponge.state) + & (self.sponge.cache_size == other.sponge.cache_size) + & (self.sponge.squeeze_mode == other.sponge.squeeze_mode) + } +} + +impl Serialize for SpongeBlob { + fn serialize(self) -> [Field; SPONGE_BLOB_LENGTH] { + let mut fields: BoundedVec = BoundedVec::new(); + fields.extend_from_array(self.sponge.cache); + fields.extend_from_array(self.sponge.state); + fields.push(self.sponge.cache_size as Field); + fields.push(self.sponge.squeeze_mode as Field); + fields.push(self.fields as Field); + fields.push(self.expected_fields as Field); + + fields.storage() + } +} + +impl Deserialize for SpongeBlob { + fn deserialize(fields: [Field; SPONGE_BLOB_LENGTH]) -> Self { + Self { + sponge: Poseidon2 { + cache: [fields[0], fields[1], fields[2]], + state: [fields[3], fields[4], fields[5], fields[6]], + cache_size: fields[7] as u32, + squeeze_mode: fields[8] as bool, + }, + fields: fields[9] as u32, + expected_fields: fields[10] as u32, + } + } +} + +impl Empty for SpongeBlob { + fn empty() -> Self { + Self { sponge: Poseidon2::new(0), fields: 0, expected_fields: 0 } + } +} + +#[test] +fn serialization_of_empty() { + let item = SpongeBlob::empty(); + let serialized = item.serialize(); + let deserialized = SpongeBlob::deserialize(serialized); + assert(item.eq(deserialized)); +} + +use crate::utils::arrays::array_concat; + +#[test] +unconstrained fn absorb() { + // This tests that absorbing two arrays separately then squeezing matches an ordinary hash + let mut spongeblob = SpongeBlob::new(7); + let input_3 = [1, 2, 3]; + spongeblob.absorb(input_3, input_3.len()); + // Assert that we have correctly absorbed the first 3 inputs + assert(spongeblob.sponge.cache.eq(input_3)); + assert(spongeblob.fields == input_3.len()); + // Absorb the next 4 in a new call... + let input_4 = [4, 5, 6, 7]; + spongeblob.absorb(input_4, input_4.len()); + // ...and create a normal poseidon2 hash of the same input + let input: [Field; 7] = array_concat(input_3, input_4); + let expected = Poseidon2::hash(input, input.len()); + assert(spongeblob.squeeze() == expected); +} + +#[test(should_fail_with = "Given in_len to absorb is larger than the input array len")] +unconstrained fn absorb_incorrect_in_len() { + let mut spongeblob = SpongeBlob::new(10); + let input_3 = [1, 2, 3]; + // The below should fail, as we try to absorb 10 inputs but only provide 3 + spongeblob.absorb(input_3, 10); +} + diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/block_header.nr b/noir-projects/noir-protocol-circuits/crates/types/src/block_header.nr index 4d77ce8088c..833c3b8ce17 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/block_header.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/block_header.nr @@ -114,7 +114,7 @@ fn empty_hash_is_zero() { let header = BlockHeader::empty(); let hash = header.hash(); - // Value from new_contract_data.test.ts "computes empty hash" test + // Value from header.test.ts "computes empty hash" test let test_data_empty_hash = 0x28e48e620bc00817609b5fc765bc74864561f25a3c941b33e5ee05266b752839; assert_eq(hash, test_data_empty_hash); } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index bb754d4a9ad..12a824936fc 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -127,8 +127,9 @@ pub global FUNCTION_SELECTOR_NUM_BYTES: Field = 4; // to be large enough so that it's ensured that it doesn't collide with storage slots of other variables. pub global INITIALIZATION_SLOT_SEPARATOR: Field = 1000_000_000; pub global INITIAL_L2_BLOCK_NUM: Field = 1; +pub global FIELDS_PER_BLOB: u32 = 4096; +pub global BLOBS_PER_BLOCK: u32 = 3; pub global PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 18; // This is currently affected by the size of the log overhead defined in aztec-nr/aztec/src/encrypted_logs/payload.nr. -pub global BLOB_SIZE_IN_BYTES: Field = 31 * 4096; pub global AZTEC_MAX_EPOCH_DURATION: u32 = 48; // The following is taken from building a block and looking at the `lastArchive` value in it. // You can run the `integration_l1_publisher.test.ts` and look at the first blocks in the fixtures. @@ -208,7 +209,10 @@ pub global DEFAULT_TPK_M_Y: Field = pub global AZTEC_ADDRESS_LENGTH: u32 = 1; pub global GAS_FEES_LENGTH: u32 = 2; pub global GAS_LENGTH: u32 = 2; -pub global GAS_SETTINGS_LENGTH: u32 = GAS_LENGTH * 2 + GAS_FEES_LENGTH; +pub global GAS_SETTINGS_LENGTH: u32 = GAS_LENGTH /* gas_limits */ + + GAS_LENGTH /* teardown_gas_limits */ + + GAS_FEES_LENGTH /* max_fees_per_gas */ + + GAS_FEES_LENGTH /* max_priority_fees_per_gas */; pub global CALL_CONTEXT_LENGTH: u32 = 4; pub global CONTENT_COMMITMENT_LENGTH: u32 = 4; pub global CONTRACT_INSTANCE_LENGTH: u32 = 16; @@ -219,6 +223,10 @@ pub global FUNCTION_DATA_LENGTH: u32 = 2; pub global FUNCTION_LEAF_PREIMAGE_LENGTH: u32 = 5; pub global GLOBAL_VARIABLES_LENGTH: u32 = 7 + GAS_FEES_LENGTH; pub global APPEND_ONLY_TREE_SNAPSHOT_LENGTH: u32 = 2; +pub global APPEND_ONLY_TREE_SNAPSHOT_LENGTH_BYTES: u32 = 36; +pub global SPONGE_BLOB_LENGTH: u32 = 11; +pub global BLOB_PUBLIC_INPUTS: u32 = 6; +pub global BLOB_PUBLIC_INPUTS_BYTES: u32 = 112; // = commitment (48) + z (32) + y (32) pub global L1_TO_L2_MESSAGE_LENGTH: u32 = 6; pub global L2_TO_L1_MESSAGE_LENGTH: u32 = 3; pub global SCOPED_L2_TO_L1_MESSAGE_LENGTH: u32 = L2_TO_L1_MESSAGE_LENGTH + 1; @@ -266,6 +274,14 @@ pub global BLOCK_HEADER_LENGTH: u32 = APPEND_ONLY_TREE_SNAPSHOT_LENGTH + GLOBAL_VARIABLES_LENGTH + TOTAL_FEES_LENGTH + TOTAL_MANA_USED_LENGTH; +// Global variables are all 32 bytes, apart from coinbase which is 20, hence -12. A state reference is just 4 snapshots. +pub global BLOCK_HEADER_LENGTH_BYTES: u32 = APPEND_ONLY_TREE_SNAPSHOT_LENGTH_BYTES + + 32 * CONTENT_COMMITMENT_LENGTH + + 4 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH_BYTES + + 32 * GLOBAL_VARIABLES_LENGTH + - 12 + + 32 * TOTAL_FEES_LENGTH + + 32 * TOTAL_MANA_USED_LENGTH; pub global PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: u32 = CALL_CONTEXT_LENGTH + 4 + MAX_BLOCK_NUMBER_LENGTH @@ -344,7 +360,8 @@ pub global PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH: u32 = TX_CONSTANT_DATA_L + PRIVATE_VALIDATION_REQUESTS_LENGTH + PRIVATE_ACCUMULATED_DATA_LENGTH + PUBLIC_CALL_REQUEST_LENGTH - + AZTEC_ADDRESS_LENGTH; + + AZTEC_ADDRESS_LENGTH + + 1 /* is private only */; pub global PRIVATE_TO_PUBLIC_ACCUMULATED_DATA_LENGTH: u32 = MAX_NOTE_HASHES_PER_TX + MAX_NULLIFIERS_PER_TX @@ -403,11 +420,12 @@ pub global CONSTANT_ROLLUP_DATA_LENGTH: u32 = APPEND_ONLY_TREE_SNAPSHOT_LENGTH + 1 /* protocol_contract_tree_root */ + GLOBAL_VARIABLES_LENGTH; -// + 5 for rollup_type, height_in_block_tree, txs_effects_hash, out_hash, accumulated_fees, accumulated_mana_used +// + 5 for rollup_type, num_txs, out_hash, accumulated_fees, accumulated_mana_used pub global BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH: u32 = CONSTANT_ROLLUP_DATA_LENGTH + PARTIAL_STATE_REFERENCE_LENGTH + PARTIAL_STATE_REFERENCE_LENGTH - + 6; + + 2 * SPONGE_BLOB_LENGTH + + 5; pub global BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH: u32 = 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH + 1 /* previous_block_hash */ @@ -417,10 +435,13 @@ pub global BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH: u32 = 2 + AZTEC_MAX_EPOCH_DURATION * FEE_RECIPIENT_LENGTH + 1 /* vk_tree_root */ + 1 /* protocol_contract_tree_root */ - + 1 /* prover_id */; -pub global ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = - 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH + 8 + AZTEC_MAX_EPOCH_DURATION * FEE_RECIPIENT_LENGTH; - + + 1 /* prover_id */ + + AZTEC_MAX_EPOCH_DURATION * BLOB_PUBLIC_INPUTS * BLOBS_PER_BLOCK; +// + 8 for previous_block_hash, end_block_hash, end_timestamp, end_block_number, out_hash, vk_tree_root, protocol_contract_tree_root, prover_id +pub global ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH: u32 = 2 * APPEND_ONLY_TREE_SNAPSHOT_LENGTH + + 8 + + AZTEC_MAX_EPOCH_DURATION * FEE_RECIPIENT_LENGTH + + AZTEC_MAX_EPOCH_DURATION * BLOB_PUBLIC_INPUTS * BLOBS_PER_BLOCK; pub global GET_NOTES_ORACLE_RETURN_LENGTH: u32 = 674; pub global NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP: u32 = 32 * MAX_NOTE_HASHES_PER_TX; pub global NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: u32 = 32 * MAX_NULLIFIERS_PER_TX; @@ -439,8 +460,8 @@ pub global NUM_MSGS_PER_BASE_PARITY: u32 = 4; pub global NUM_BASE_PARITY_PER_ROOT_PARITY: u32 = 4; // Lengths of the different types of proofs in fields -pub global RECURSIVE_PROOF_LENGTH: u32 = 463; -pub global NESTED_RECURSIVE_PROOF_LENGTH: u32 = 463; +pub global RECURSIVE_PROOF_LENGTH: u32 = 459; +pub global NESTED_RECURSIVE_PROOF_LENGTH: u32 = 459; pub global TUBE_PROOF_LENGTH: u32 = RECURSIVE_PROOF_LENGTH; // in the future these can differ pub global HONK_VERIFICATION_KEY_LENGTH_IN_FIELDS: u32 = 128; // size of an Ultra verification key @@ -715,6 +736,19 @@ pub global AVM_SENDL2TOL1MSG_BASE_DA_GAS: u32 = DA_BYTES_PER_FIELD * DA_GAS_PER_ // a single increment here corresponds to an entire additional field (hence x32 bytes per field) pub global AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS: u32 = DA_BYTES_PER_FIELD * DA_GAS_PER_BYTE; +// BLOB PREFIXES +// Used when decoding blobs of tightly packed effects +pub global TX_START_PREFIX: Field = 0x74785f7374617274; // = "tx_start".to_field() in nr +pub global REVERT_CODE_PREFIX: u8 = 1; +pub global TX_FEE_PREFIX: u8 = 2; +pub global NOTES_PREFIX: u8 = 3; +pub global NULLIFIERS_PREFIX: u8 = 4; +pub global L2_L1_MSGS_PREFIX: u8 = 5; +pub global PUBLIC_DATA_UPDATE_REQUESTS_PREFIX: u8 = 6; +pub global PRIVATE_LOGS_PREFIX: u8 = 7; +pub global UNENCRYPTED_LOGS_PREFIX: u8 = 8; +pub global CONTRACT_CLASS_LOGS_PREFIX: u8 = 9; + // Constants related to proof type of a recursive proof verification. // Keep following constants in sync with the enum acir_format::PROOF_TYPE in recursion_constraint.hpp pub global PROOF_TYPE_PLONK: u32 = 0; diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr b/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr index 3fb70c4fbb4..9d57dd8e10a 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr @@ -2,7 +2,7 @@ use crate::{constants::CONTENT_COMMITMENT_LENGTH, traits::{Deserialize, Empty, S pub struct ContentCommitment { pub num_txs: Field, - pub txs_effects_hash: Field, + pub blobs_hash: Field, pub in_hash: Field, pub out_hash: Field, } @@ -12,7 +12,7 @@ impl Serialize for ContentCommitment { let mut fields: BoundedVec = BoundedVec::new(); fields.push(self.num_txs); - fields.push(self.txs_effects_hash); + fields.push(self.blobs_hash); fields.push(self.in_hash); fields.push(self.out_hash); @@ -24,26 +24,26 @@ impl Deserialize for ContentCommitment { fn deserialize(serialized: [Field; CONTENT_COMMITMENT_LENGTH]) -> Self { let num_txs = serialized[0]; - let txs_effects_hash = serialized[1]; + let blobs_hash = serialized[1]; let in_hash = serialized[2]; let out_hash = serialized[3]; - Self { num_txs, txs_effects_hash, in_hash, out_hash } + Self { num_txs, blobs_hash, in_hash, out_hash } } } impl Empty for ContentCommitment { fn empty() -> Self { - Self { num_txs: 0, txs_effects_hash: 0, in_hash: 0, out_hash: 0 } + Self { num_txs: 0, blobs_hash: 0, in_hash: 0, out_hash: 0 } } } impl Eq for ContentCommitment { fn eq(self, other: Self) -> bool { (self.num_txs == other.num_txs) - & (self.txs_effects_hash == other.txs_effects_hash) + & (self.blobs_hash == other.blobs_hash) & (self.in_hash == other.in_hash) & (self.out_hash == other.out_hash) } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr b/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr index 6f7914d4825..1ffc5782024 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr @@ -50,27 +50,39 @@ fn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field { ) } -pub fn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field { - let inputs = [nonce, note_hash]; +pub fn compute_unique_note_hash(nonce: Field, siloed_note_hash: Field) -> Field { + let inputs = [nonce, siloed_note_hash]; poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH) } -pub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field { +pub fn compute_siloed_note_hash(app: AztecAddress, note_hash: Field) -> Field { poseidon2_hash_with_separator( - [app.to_field(), unique_note_hash], + [app.to_field(), note_hash], GENERATOR_INDEX__SILOED_NOTE_HASH, ) } +/// Computes unique note hashes from siloed note hashes +pub fn compute_unique_siloed_note_hash( + siloed_note_hash: Field, + tx_hash: Field, + note_index_in_tx: u32, +) -> Field { + if siloed_note_hash == 0 { + 0 + } else { + let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx); + compute_unique_note_hash(nonce, siloed_note_hash) + } +} + /// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way /// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts. -pub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field { +pub fn silo_note_hash(note_hash: ScopedNoteHash) -> Field { if note_hash.contract_address.is_zero() { 0 } else { - let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx); - let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value()); - compute_siloed_note_hash(note_hash.contract_address, unique_note_hash) + compute_siloed_note_hash(note_hash.contract_address, note_hash.value()) } } @@ -234,6 +246,177 @@ where poseidon2_hash(inputs_with_separator) } +// Performs a fixed length hash with a subarray of the given input. +// Useful for SpongeBlob in which we aborb M things and want to check it vs a hash of M elts of an N-len array. +// Using stdlib poseidon, this will always absorb an extra 1 as a 'variable' hash, and not match spongeblob.squeeze() +// or any ts implementation. Also checks that any remaining elts not hashed are empty. +#[no_predicates] +pub fn poseidon2_hash_subarray(input: [Field; N], in_len: u32) -> Field { + let mut sponge = poseidon2_absorb_chunks(input, in_len, false); + sponge.squeeze() +} + +// NB the below is the same as std::hash::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check, +// and absorbing in chunks of 3 below. +#[no_predicates] +pub fn poseidon2_cheaper_variable_hash(input: [Field; N], in_len: u32) -> Field { + let mut sponge = poseidon2_absorb_chunks(input, in_len, true); + // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish + // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures + // fixed-length and variable-length hashes do not collide) + if in_len != N { + sponge.absorb(1); + } + sponge.squeeze() +} + +// The below fn reduces gates of a conditional poseidon2 hash by approx 3x (thank you ~* Giant Brain Dev @IlyasRidhuan *~ for the idea) +// Why? Because when we call stdlib poseidon, we call absorb for each item. When absorbing is conditional, it seems the compiler does not know +// what cache_size will be when calling absorb, so it assigns the permutation gates for /each i/ rather than /every 3rd i/, which is actually required. +// The below code forces the compiler to: +// - absorb normally up to 2 times to set cache_size to 1 +// - absorb in chunks of 3 to ensure perm. only happens every 3rd absorb +// - absorb normally up to 2 times to add any remaining values to the hash +// In fixed len hashes, the compiler is able to tell that it will only need to perform the permutation every 3 absorbs. +// NB: it also replaces unnecessary range checks (i < thing) with a bit check (&= i != thing), which alone reduces the gates of a var. hash by half. + +#[no_predicates] +fn poseidon2_absorb_chunks( + input: [Field; N], + in_len: u32, + variable: bool, +) -> std::hash::poseidon2::Poseidon2 { + let two_pow_64 = 18446744073709551616; + let iv: Field = (in_len as Field) * two_pow_64; + let mut sponge = std::hash::poseidon2::Poseidon2::new(iv); + // Even though shift is always 1 here, if we input in_len = 0 we get an underflow + // since we cannot isolate computation branches. The below is just to avoid that. + let shift = if in_len == 0 { 0 } else { 1 }; + if in_len != 0 { + // cache_size = 0, init absorb + sponge.cache[0] = input[0]; + sponge.cache_size = 1; + // shift = num elts already added to make cache_size 1 = 1 for a fresh sponge + // M = max_chunks = (N - 1 - (N - 1) % 3) / 3: (must be written as a fn of N to compile) + // max_remainder = (N - 1) % 3; + // max_chunks = (N - 1 - max_remainder) / 3; + sponge = poseidon2_absorb_chunks_loop::( + sponge, + input, + in_len, + variable, + shift, + ); + } + sponge +} + +// NB: If it's not required to check that the non-absorbed elts of 'input' are 0s, set skip_0_check=true +#[no_predicates] +pub fn poseidon2_absorb_chunks_existing_sponge( + in_sponge: std::hash::poseidon2::Poseidon2, + input: [Field; N], + in_len: u32, + skip_0_check: bool, +) -> std::hash::poseidon2::Poseidon2 { + let mut sponge = in_sponge; + // 'shift' is to account for already added inputs + let mut shift = 0; + // 'stop' is to avoid an underflow when inputting in_len = 0 + let mut stop = false; + for i in 0..3 { + if shift == in_len { + stop = true; + } + if (sponge.cache_size != 1) & (!stop) { + sponge.absorb(input[i]); + shift += 1; + } + } + sponge = if stop { + sponge + } else { + // max_chunks = (N - (N % 3)) / 3; + poseidon2_absorb_chunks_loop::( + sponge, + input, + in_len, + skip_0_check, + shift, + ) + }; + sponge +} + +// The below is the loop to absorb elts into a poseidon sponge in chunks of 3 +// shift - the num of elts already absorbed to ensure the sponge's cache_size = 1 +// M - the max number of chunks required to absorb N things (must be comptime to compile) +// NB: The 0 checks ('Found non-zero field...') are messy, but having a separate loop over N to check +// for 0s costs 3N gates. Current approach is approx 2N gates. +#[no_predicates] +fn poseidon2_absorb_chunks_loop( + in_sponge: std::hash::poseidon2::Poseidon2, + input: [Field; N], + in_len: u32, + variable: bool, + shift: u32, +) -> std::hash::poseidon2::Poseidon2 { + assert(in_len <= N, "Given in_len to absorb is larger than the input array len"); + // When we have an existing sponge, we may have a shift of 0, and the final 'k+2' below = N + // The below avoids an overflow + let skip_last = 3 * M == N; + // Writing in_sponge: &mut does not compile + let mut sponge = in_sponge; + let mut should_add = true; + // The num of things left over after absorbing in 3s + let remainder = (in_len - shift) % 3; + // The num of chunks of 3 to absorb (maximum M) + let chunks = (in_len - shift - remainder) / 3; + for i in 0..M { + // Now we loop through cache size = 1 -> 3 + should_add &= i != chunks; + // This is the index at the start of the chunk (for readability) + let k = 3 * i + shift; + if should_add { + // cache_size = 1, 2 => just assign + sponge.cache[1] = input[k]; + sponge.cache[2] = input[k + 1]; + // cache_size = 3 => duplex + perm + for j in 0..3 { + sponge.state[j] += sponge.cache[j]; + } + sponge.state = std::hash::poseidon2_permutation(sponge.state, 4); + sponge.cache[0] = input[k + 2]; + // cache_size is now 1 again, repeat loop + } else if (!variable) & (i != chunks) { + // if we are hashing a fixed len array which is a subarray, we check the remaining elts are 0 + // NB: we don't check at i == chunks, because that chunk contains elts to be absorbed or checked below + let last_0 = if (i == M - 1) & (skip_last) { + 0 + } else { + input[k + 2] + }; + let all_0 = (input[k] == 0) & (input[k + 1] == 0) & (last_0 == 0); + assert(all_0, "Found non-zero field after breakpoint"); + } + } + // we have 'remainder' num of items left to absorb + should_add = true; + // below is to avoid overflows (i.e. if inlen is close to N) + let mut should_check = !variable; + for i in 0..3 { + should_add &= i != remainder; + should_check &= in_len - remainder + i != N; + if should_add { + // we want to absorb the final 'remainder' items + sponge.absorb(input[in_len - remainder + i]); + } else if should_check { + assert(input[in_len - remainder + i] == 0, "Found non-zero field after breakpoint"); + } + } + sponge +} + pub fn poseidon2_hash_with_separator_slice(inputs: [Field], separator: T) -> Field where T: ToField, @@ -271,6 +454,61 @@ pub fn poseidon2_hash_bytes(inputs: [u8; N]) -> Field { poseidon2_hash(fields) } +#[test] +fn poseidon_chunks_matches_fixed() { + let in_len = 501; + let mut input: [Field; 4096] = [0; 4096]; + let mut fixed_input = [3; 501]; + assert(in_len == fixed_input.len()); // sanity check + for i in 0..in_len { + input[i] = 3; + } + let sub_chunk_hash = poseidon2_hash_subarray(input, in_len); + let fixed_len_hash = std::hash::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len()); + assert(sub_chunk_hash == fixed_len_hash); +} + +#[test] +fn poseidon_chunks_matches_variable() { + let in_len = 501; + let mut input: [Field; 4096] = [0; 4096]; + for i in 0..in_len { + input[i] = 3; + } + let variable_chunk_hash = poseidon2_cheaper_variable_hash(input, in_len); + let variable_len_hash = std::hash::poseidon2::Poseidon2::hash(input, in_len); + assert(variable_chunk_hash == variable_len_hash); +} + +#[test] +fn existing_sponge_poseidon_chunks_matches_fixed() { + let in_len = 501; + let mut input: [Field; 4096] = [0; 4096]; + let mut fixed_input = [3; 501]; + assert(in_len == fixed_input.len()); // sanity check + for i in 0..in_len { + input[i] = 3; + } + // absorb 250 of the 501 things + let two_pow_64 = 18446744073709551616; + let empty_sponge = std::hash::poseidon2::Poseidon2::new((in_len as Field) * two_pow_64); + let first_sponge = poseidon2_absorb_chunks_existing_sponge(empty_sponge, input, 250, true); + // now absorb the final 251 (since they are all 3s, im being lazy and not making a new array) + let mut final_sponge = poseidon2_absorb_chunks_existing_sponge(first_sponge, input, 251, true); + let fixed_len_hash = std::hash::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len()); + assert(final_sponge.squeeze() == fixed_len_hash); +} + +#[test] +fn poseidon_chunks_empty_inputs() { + let in_len = 0; + let mut input: [Field; 4096] = [0; 4096]; + let mut contructed_empty_sponge = poseidon2_absorb_chunks(input, in_len, true); + let mut first_sponge = + poseidon2_absorb_chunks_existing_sponge(contructed_empty_sponge, input, in_len, true); + assert(first_sponge.squeeze() == contructed_empty_sponge.squeeze()); +} + #[test] fn smoke_sha256_to_field() { let full_buffer = [ diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/indexed_tagging_secret.nr b/noir-projects/noir-protocol-circuits/crates/types/src/indexed_tagging_secret.nr index 89837964cff..4781bd87560 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/indexed_tagging_secret.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/indexed_tagging_secret.nr @@ -6,12 +6,14 @@ pub global INDEXED_TAGGING_SECRET_LENGTH: u32 = 2; #[derive(Serialize, Deserialize)] pub struct IndexedTaggingSecret { - secret: Field, + app_tagging_secret: Field, index: u32, } impl IndexedTaggingSecret { pub fn compute_tag(self, recipient: AztecAddress) -> Field { - poseidon2_hash([self.secret, recipient.to_field(), self.index as Field]) + poseidon2_hash( + [self.app_tagging_secret, recipient.to_field(), self.index as Field], + ) } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr index 5921dd50603..404bd4cbc7e 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/tests/fixture_builder.nr @@ -4,9 +4,11 @@ use crate::{ avm_accumulated_data::AvmAccumulatedData, CombinedAccumulatedData, PrivateAccumulatedData, PrivateAccumulatedDataBuilder, PrivateToPublicAccumulatedData, }, + append_only_tree_snapshot::AppendOnlyTreeSnapshot, avm_circuit_public_inputs::AvmProofData, call_context::CallContext, combined_constant_data::CombinedConstantData, + constant_rollup_data::ConstantRollupData, function_data::FunctionData, gas::Gas, gas_settings::GasSettings, @@ -51,7 +53,7 @@ use crate::{ }, hash::{ compute_l2_to_l1_hash, compute_siloed_nullifier, compute_siloed_private_log_field, - silo_note_hash, + compute_unique_siloed_note_hash, silo_note_hash, }, merkle_tree::{membership::MembershipWitness, MerkleTree}, messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message}, @@ -91,6 +93,7 @@ pub struct FixtureBuilder { pub contract_address: AztecAddress, pub msg_sender: AztecAddress, pub is_static_call: bool, + pub is_private_only: bool, // Fees. pub is_fee_payer: bool, @@ -156,6 +159,9 @@ pub struct FixtureBuilder { pub protocol_contract_tree_root: Field, pub protocol_contract_sibling_path: [Field; PROTOCOL_CONTRACT_TREE_HEIGHT], + // Tree snapshots. + pub archive_tree: AppendOnlyTreeSnapshot, + // Counters. pub min_revertible_side_effect_counter: u32, pub counter_start: u32, @@ -215,6 +221,10 @@ impl FixtureBuilder { *self } + pub fn vk_tree_root() -> Field { + fixtures::vk_tree::get_vk_merkle_tree().get_root() + } + pub fn set_protocol_contract_root(&mut self) { let tree = fixtures::protocol_contract_tree::get_protocol_contract_tree(); self.protocol_contract_tree_root = tree.get_root(); @@ -288,6 +298,15 @@ impl FixtureBuilder { } } + pub fn to_constant_rollup_data(self) -> ConstantRollupData { + ConstantRollupData { + last_archive: self.archive_tree, + vk_tree_root: self.vk_tree_root, + protocol_contract_tree_root: self.protocol_contract_tree_root, + global_variables: self.global_variables, + } + } + pub fn build_tx_request(self) -> TxRequest { TxRequest { origin: self.contract_address, @@ -462,6 +481,7 @@ impl FixtureBuilder { validation_requests, public_teardown_call_request, fee_payer: self.fee_payer, + is_private_only: self.is_private_only, } } @@ -523,6 +543,38 @@ impl FixtureBuilder { } } + pub fn to_private_tube_data(self) -> PrivateTubeData { + let mut result: PrivateTubeData = std::mem::zeroed(); + result.public_inputs = self.to_kernel_circuit_public_inputs(); + result + } + + pub fn to_public_tube_data(self) -> PublicTubeData { + let mut result: PublicTubeData = std::mem::zeroed(); + result.public_inputs = self.to_private_to_public_kernel_circuit_public_inputs(true); + result + } + + pub fn to_avm_accumulated_data(self) -> AvmAccumulatedData { + AvmAccumulatedData { + note_hashes: self.note_hashes.storage().map(|n: ScopedNoteHash| n.note_hash.value), + nullifiers: self.nullifiers.storage().map(|n: ScopedNullifier| n.nullifier.value), + l2_to_l1_msgs: self.l2_to_l1_msgs.storage(), + unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage(), + public_data_writes: self.public_data_writes.storage(), + } + } + + pub fn to_avm_proof_data(self, reverted: bool) -> AvmProofData { + let mut result: AvmProofData = std::mem::zeroed(); + + result.public_inputs.reverted = reverted; + result.public_inputs.global_variables = self.global_variables; + result.public_inputs.accumulated_data = self.to_avm_accumulated_data(); + + result + } + pub fn add_new_note_hash(&mut self, value: Field) { self.note_hashes.push(NoteHash { value, counter: self.next_counter() }.scope( self.contract_address, @@ -530,16 +582,25 @@ impl FixtureBuilder { } pub fn add_siloed_note_hash(&mut self, value: Field) { - // First nullifier is tx hash. - let tx_hash = self.nullifiers.get(0).value(); - let index = self.note_hashes.len(); let note_hash_to_silo = NoteHash { value, counter: 0 }.scope(self.contract_address); - let siloed_value = silo_note_hash(note_hash_to_silo, tx_hash, index); + let siloed_value = silo_note_hash(note_hash_to_silo); self.note_hashes.push(NoteHash { value: siloed_value, counter: self.next_counter() }.scope( AztecAddress::zero(), )); } + pub fn add_siloed_unique_note_hash(&mut self, value: Field) { + let note_hash_to_silo = NoteHash { value, counter: 0 }.scope(self.contract_address); + let siloed_value = silo_note_hash(note_hash_to_silo); + let current_index = self.note_hashes.len(); + let first_nullifier = self.nullifiers.get(0).value(); + let unique_siloed_value = + compute_unique_siloed_note_hash(siloed_value, first_nullifier, current_index); + + self.note_hashes.push(NoteHash { value: unique_siloed_value, counter: self.next_counter() } + .scope(AztecAddress::zero())); + } + pub fn append_note_hashes(&mut self, num_note_hashes: u32) { let index_offset = self.note_hashes.len(); for i in 0..self.note_hashes.max_len() { @@ -560,6 +621,16 @@ impl FixtureBuilder { } } + pub fn append_siloed_unique_note_hashes(&mut self, num_note_hashes: u32) { + let index_offset = self.note_hashes.len(); + for i in 0..self.note_hashes.max_len() { + if i < num_note_hashes { + let value = self.mock_note_hash_value(index_offset + i); + self.add_siloed_unique_note_hash(value); + } + } + } + pub fn append_note_hashes_with_logs(&mut self, num_note_hashes: u32) { let index_offset = self.note_hashes.len(); for i in 0..self.note_hashes.max_len() { @@ -881,6 +952,10 @@ impl FixtureBuilder { self.contract_address } + pub fn set_gas_used(&mut self, da_gas: u32, l2_gas: u32) { + self.gas_used = Gas { da_gas, l2_gas }; + } + pub fn set_public_teardown_call_request(&mut self) { self.public_teardown_call_request = self.mock_public_teardown_call_request(); } @@ -1012,42 +1087,6 @@ impl FixtureBuilder { self.counter += 1; counter } - - fn vk_tree_root() -> Field { - fixtures::vk_tree::get_vk_merkle_tree().get_root() - } - - pub fn to_private_tube_data(self) -> PrivateTubeData { - let mut result: PrivateTubeData = std::mem::zeroed(); - result.public_inputs = self.to_kernel_circuit_public_inputs(); - result - } - - pub fn to_public_tube_data(self) -> PublicTubeData { - let mut result: PublicTubeData = std::mem::zeroed(); - result.public_inputs = self.to_private_to_public_kernel_circuit_public_inputs(true); - result - } - - pub fn to_avm_accumulated_data(self) -> AvmAccumulatedData { - AvmAccumulatedData { - note_hashes: self.note_hashes.storage().map(|n: ScopedNoteHash| n.note_hash.value), - nullifiers: self.nullifiers.storage().map(|n: ScopedNullifier| n.nullifier.value), - l2_to_l1_msgs: self.l2_to_l1_msgs.storage(), - unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage(), - public_data_writes: self.public_data_writes.storage(), - } - } - - pub fn to_avm_proof_data(self, reverted: bool) -> AvmProofData { - let mut result: AvmProofData = std::mem::zeroed(); - - result.public_inputs.reverted = reverted; - result.public_inputs.global_variables = self.global_variables; - result.public_inputs.accumulated_data = self.to_avm_accumulated_data(); - - result - } } impl Empty for FixtureBuilder { @@ -1055,6 +1094,7 @@ impl Empty for FixtureBuilder { FixtureBuilder { contract_address: AztecAddress::zero(), msg_sender: AztecAddress::zero(), + is_private_only: false, is_static_call: false, is_fee_payer: false, fee_payer: AztecAddress::zero(), @@ -1097,6 +1137,7 @@ impl Empty for FixtureBuilder { vk_tree_root: FixtureBuilder::vk_tree_root(), protocol_contract_tree_root: 0, protocol_contract_sibling_path: [0; PROTOCOL_CONTRACT_TREE_HEIGHT], + archive_tree: AppendOnlyTreeSnapshot::zero(), revert_code: 0, min_revertible_side_effect_counter: 0, counter_start: 0, diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr index 2d86849101f..92344807691 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_request.nr @@ -93,7 +93,12 @@ mod tests { #[test] fn compute_hash() { - let gas_settings = GasSettings::new(Gas::new(2, 2), Gas::new(1, 1), GasFees::new(3, 3)); + let gas_settings = GasSettings::new( + Gas::new(2, 2), + Gas::new(1, 1), + GasFees::new(4, 4), + GasFees::new(3, 3), + ); let tx_request = TxRequest { origin: AztecAddress::from_field(1), args_hash: 3, @@ -105,7 +110,7 @@ mod tests { }; // Value from tx_request.test.ts "compute hash" test let test_data_tx_request_hash = - 0x1b15ac8432c3c35718075a277d86f11263f057e2325afa208d6b19e37ff59a8d; + 0x2d265ee0e3b9d206873a66527485afa3c6ebbfbaf451811666c9558a9f6e3d46; assert(tx_request.hash() == test_data_tx_request_hash); } } diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr index 5b89103fa2d..3f3c91c3885 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/arrays.nr @@ -146,6 +146,19 @@ where result } +// Helper fn to create a subarray from a given array +pub fn array_splice(array: [T; N], offset: u32) -> [T; M] +where + T: Empty, +{ + assert(M + offset <= N, "Subarray length larger than array length"); + let mut result: [T; M] = [T::empty(); M]; + for i in 0..M { + result[i] = array[offset + i]; + } + result +} + pub fn check_permutation( original_array: [T; N], permuted_array: [T; N], diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr b/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr index 796d0906e77..91ddbe290b7 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr @@ -43,6 +43,14 @@ pub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool { rhs.lt(lhs) } +pub fn min(f1: Field, f2: Field) -> Field { + if f1.lt(f2) { + f1 + } else { + f2 + } +} + #[test] unconstrained fn bytes_field_test() { // Tests correctness of field_from_bytes_32_trunc against existing methods diff --git a/noir/bb-version b/noir/bb-version index 630f2e0ce67..e40e4fc339c 100644 --- a/noir/bb-version +++ b/noir/bb-version @@ -1 +1 @@ -0.63.1 +0.66.0 diff --git a/noir/noir-repo/.github/scripts/merge-bench-reports.sh b/noir/noir-repo/.github/scripts/merge-bench-reports.sh new file mode 100755 index 00000000000..23a62874148 --- /dev/null +++ b/noir/noir-repo/.github/scripts/merge-bench-reports.sh @@ -0,0 +1,27 @@ +#!/bin/bash +set -eu + +echo "Merging reports" + +REPORT_NAME=$1 +NAME_PLURAL=""$REPORT_NAME"s" + +combined_reports="[]" + +# Iterate over each report and merge them +for report in ./reports/*; do + # The report is saved under ./$REPORT_NAME_{ matrix_report }/$REPORT_NAME_{ matrix_report }.json + FILE_PATH=$(echo $(ls $report)) + + # Extract the $NAME_PLURAL array from each report and merge it + combined_reports=$(jq '[."'"$NAME_PLURAL"'"[]] + '"$combined_reports" <<< "$(cat "$report/$FILE_PATH")") +done + +combined_reports=$(jq '[."'$NAME_PLURAL'"[]] + '"$combined_reports" <<< "$(cat ./$REPORT_NAME.json)") + +# Wrap the merged memory reports into a new object as to keep the $NAME_PLURAL key +final_report="{\"$NAME_PLURAL\": $combined_reports}" + +echo "$final_report" > $REPORT_NAME.json + +cat $REPORT_NAME.json \ No newline at end of file diff --git a/noir/noir-repo/.github/workflows/cache-cleanup.yml b/noir/noir-repo/.github/workflows/cache-cleanup.yml index cf2b0ec413e..bb05c5454e5 100644 --- a/noir/noir-repo/.github/workflows/cache-cleanup.yml +++ b/noir/noir-repo/.github/workflows/cache-cleanup.yml @@ -12,7 +12,7 @@ on: jobs: cleanup: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Cleanup run: | diff --git a/noir/noir-repo/.github/workflows/deny.yml b/noir/noir-repo/.github/workflows/deny.yml index 8ae7d03e076..11dbc3eef4b 100644 --- a/noir/noir-repo/.github/workflows/deny.yml +++ b/noir/noir-repo/.github/workflows/deny.yml @@ -18,7 +18,7 @@ concurrency: deny-${{ github.head_ref || github.run_id }} jobs: deny: name: deny - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v1 diff --git a/noir/noir-repo/.github/workflows/docs-dead-links.yml b/noir/noir-repo/.github/workflows/docs-dead-links.yml index 40e948fe2c1..b46c5393f8d 100644 --- a/noir/noir-repo/.github/workflows/docs-dead-links.yml +++ b/noir/noir-repo/.github/workflows/docs-dead-links.yml @@ -13,7 +13,7 @@ concurrency: jobs: markdown-link-check: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@master - uses: gaurav-nelson/github-action-markdown-link-check@v1 diff --git a/noir/noir-repo/.github/workflows/docs-pr.yml b/noir/noir-repo/.github/workflows/docs-pr.yml index 78abb8252b3..fdd4d25f5ae 100644 --- a/noir/noir-repo/.github/workflows/docs-pr.yml +++ b/noir/noir-repo/.github/workflows/docs-pr.yml @@ -5,7 +5,7 @@ on: jobs: add_label: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: has_label: ${{ steps.check-labels.outputs.result }} steps: @@ -49,7 +49,7 @@ jobs: } build_preview: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout code uses: actions/checkout@v4 @@ -93,7 +93,7 @@ jobs: deploy_preview: needs: [build_preview, add_label] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: pull-requests: write if: needs.add_label.outputs.has_label == 'true' @@ -121,7 +121,7 @@ jobs: add_comment: needs: [deploy_preview] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: pull-requests: write steps: diff --git a/noir/noir-repo/.github/workflows/formatting.yml b/noir/noir-repo/.github/workflows/formatting.yml index ab92d452c79..f8ebd53dc70 100644 --- a/noir/noir-repo/.github/workflows/formatting.yml +++ b/noir/noir-repo/.github/workflows/formatting.yml @@ -15,7 +15,7 @@ concurrency: jobs: clippy: name: cargo clippy - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 env: RUSTFLAGS: -Dwarnings @@ -41,7 +41,7 @@ jobs: rustfmt: name: cargo fmt - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 env: RUSTFLAGS: -Dwarnings @@ -67,7 +67,7 @@ jobs: eslint: name: eslint - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -115,7 +115,7 @@ jobs: nargo_fmt: needs: [build-nargo] name: Nargo fmt - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: diff --git a/noir/noir-repo/.github/workflows/publish-acvm.yml b/noir/noir-repo/.github/workflows/publish-acvm.yml index feb4d4216c3..fb2e2001e40 100644 --- a/noir/noir-repo/.github/workflows/publish-acvm.yml +++ b/noir/noir-repo/.github/workflows/publish-acvm.yml @@ -10,7 +10,7 @@ on: jobs: publish: name: Publish in order - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout sources uses: actions/checkout@v4 diff --git a/noir/noir-repo/.github/workflows/publish-docs.yml b/noir/noir-repo/.github/workflows/publish-docs.yml index 8896e613608..16959256d2a 100644 --- a/noir/noir-repo/.github/workflows/publish-docs.yml +++ b/noir/noir-repo/.github/workflows/publish-docs.yml @@ -10,7 +10,7 @@ on: jobs: publish-docs: name: Publish docs - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout release branch diff --git a/noir/noir-repo/.github/workflows/publish-es-packages.yml b/noir/noir-repo/.github/workflows/publish-es-packages.yml index 682fed69c7b..e629ae1f133 100644 --- a/noir/noir-repo/.github/workflows/publish-es-packages.yml +++ b/noir/noir-repo/.github/workflows/publish-es-packages.yml @@ -16,7 +16,7 @@ run-name: Publish ES Packages from ${{ inputs.noir-ref }} under @${{ inputs.npm- jobs: build-noirc_abi_wasm: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout Noir repo uses: actions/checkout@v4 @@ -50,7 +50,7 @@ jobs: retention-days: 10 build-noir_wasm: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout sources uses: actions/checkout@v4 @@ -87,7 +87,7 @@ jobs: retention-days: 3 build-acvm_js: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout sources uses: actions/checkout@v4 @@ -121,7 +121,7 @@ jobs: retention-days: 3 publish-es-packages: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [build-acvm_js, build-noirc_abi_wasm, build-noir_wasm] steps: - name: Checkout sources diff --git a/noir/noir-repo/.github/workflows/publish-nightly.yml b/noir/noir-repo/.github/workflows/publish-nightly.yml index f5c013883bb..2eef9ab60f7 100644 --- a/noir/noir-repo/.github/workflows/publish-nightly.yml +++ b/noir/noir-repo/.github/workflows/publish-nightly.yml @@ -7,7 +7,7 @@ on: jobs: dispatch-publish-es: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Dispatch to publish-nargo uses: benc-uk/workflow-dispatch@v1 diff --git a/noir/noir-repo/.github/workflows/pull-request-title.yml b/noir/noir-repo/.github/workflows/pull-request-title.yml index 7e9b729da28..41922bd32ab 100644 --- a/noir/noir-repo/.github/workflows/pull-request-title.yml +++ b/noir/noir-repo/.github/workflows/pull-request-title.yml @@ -15,7 +15,7 @@ permissions: jobs: conventional-title: name: Validate PR title is Conventional Commit - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Check title if: github.event_name == 'pull_request_target' @@ -30,7 +30,7 @@ jobs: force-push-comment: name: Warn external contributors about force-pushing - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.repo.full_name != 'noir-lang/noir' }} permissions: pull-requests: write diff --git a/noir/noir-repo/.github/workflows/recrawler.yml b/noir/noir-repo/.github/workflows/recrawler.yml index ee832e273a1..808e5819353 100644 --- a/noir/noir-repo/.github/workflows/recrawler.yml +++ b/noir/noir-repo/.github/workflows/recrawler.yml @@ -7,7 +7,7 @@ on: jobs: algolia_recrawl: name: Algolia Recrawl - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Algolia crawler creation and crawl uses: algolia/algoliasearch-crawler-github-actions@v1.1.0 diff --git a/noir/noir-repo/.github/workflows/release.yml b/noir/noir-repo/.github/workflows/release.yml index 59c3d9a1415..bbe9a7fff62 100644 --- a/noir/noir-repo/.github/workflows/release.yml +++ b/noir/noir-repo/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: outputs: release-pr: ${{ steps.release.outputs.pr }} tag-name: ${{ steps.release.outputs.tag_name }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Run release-please id: release @@ -23,7 +23,7 @@ jobs: name: Update acvm workspace package versions needs: [release-please] if: ${{ needs.release-please.outputs.release-pr }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout release branch uses: actions/checkout@v4 @@ -66,7 +66,7 @@ jobs: name: Update docs needs: [release-please, update-acvm-workspace-package-versions] if: ${{ needs.release-please.outputs.release-pr }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout release branch @@ -110,7 +110,7 @@ jobs: release-end: name: Release End - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # We want this job to always run (even if the dependant jobs fail) as we need apply changes to the sticky comment. if: ${{ always() }} @@ -145,7 +145,7 @@ jobs: name: Build binaries needs: [release-please] if: ${{ needs.release-please.outputs.tag-name }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Dispatch to publish workflow uses: benc-uk/workflow-dispatch@v1 @@ -160,7 +160,7 @@ jobs: name: Publish ES packages needs: [release-please] if: ${{ needs.release-please.outputs.tag-name }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Dispatch to publish-es-packages uses: benc-uk/workflow-dispatch@v1 @@ -174,7 +174,7 @@ jobs: name: Publish acvm needs: [release-please] if: ${{ needs.release-please.outputs.tag-name }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Dispatch to publish-acvm diff --git a/noir/noir-repo/.github/workflows/reports.yml b/noir/noir-repo/.github/workflows/reports.yml index 8f8aeabb65e..1e355dc9e6b 100644 --- a/noir/noir-repo/.github/workflows/reports.yml +++ b/noir/noir-repo/.github/workflows/reports.yml @@ -8,7 +8,7 @@ on: jobs: build-nargo: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout Noir repo @@ -38,11 +38,10 @@ jobs: path: ./dist/* retention-days: 3 - compare_gates_reports: name: Circuit sizes needs: [build-nargo] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: pull-requests: write @@ -93,7 +92,7 @@ jobs: compare_brillig_bytecode_size_reports: name: Brillig bytecode sizes needs: [build-nargo] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: pull-requests: write @@ -142,7 +141,7 @@ jobs: compare_brillig_execution_reports: name: Brillig execution trace sizes needs: [build-nargo] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: pull-requests: write @@ -191,7 +190,7 @@ jobs: generate_memory_report: name: Peak memory usage needs: [build-nargo] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 permissions: pull-requests: write @@ -218,9 +217,267 @@ jobs: ./memory_report.sh mv memory_report.json ../memory_report.json + - name: Upload memory report + uses: actions/upload-artifact@v4 + with: + name: in_progress_memory_report + path: memory_report.json + retention-days: 3 + overwrite: true + + generate_compilation_report: + name: Compilation time + needs: [build-nargo] + runs-on: ubuntu-22.04 + permissions: + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Download nargo binary + uses: actions/download-artifact@v4 + with: + name: nargo + path: ./nargo + + - name: Set nargo on PATH + run: | + nargo_binary="${{ github.workspace }}/nargo/nargo" + chmod +x $nargo_binary + echo "$(dirname $nargo_binary)" >> $GITHUB_PATH + export PATH="$PATH:$(dirname $nargo_binary)" + nargo -V + + - name: Generate Compilation report + working-directory: ./test_programs + run: | + ./compilation_report.sh + cat compilation_report.json + mv compilation_report.json ../compilation_report.json + + - name: Upload compilation report + uses: actions/upload-artifact@v4 + with: + name: in_progress_compilation_report + path: compilation_report.json + retention-days: 3 + overwrite: true + + external_repo_compilation_report: + needs: [build-nargo] + runs-on: ubuntu-latest + timeout-minutes: 15 + strategy: + fail-fast: false + matrix: + include: + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-contracts } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/parity-root } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-inner } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-tail } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-reset } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/rollup-base-private } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/rollup-base-public } + + name: External repo compilation report - ${{ matrix.project.repo }}/${{ matrix.project.path }} + steps: + - name: Download nargo binary + uses: actions/download-artifact@v4 + with: + name: nargo + path: ./nargo + + - name: Set nargo on PATH + run: | + nargo_binary="${{ github.workspace }}/nargo/nargo" + chmod +x $nargo_binary + echo "$(dirname $nargo_binary)" >> $GITHUB_PATH + export PATH="$PATH:$(dirname $nargo_binary)" + nargo -V + + - uses: actions/checkout@v4 + with: + path: scripts + sparse-checkout: | + test_programs/compilation_report.sh + sparse-checkout-cone-mode: false + + - name: Checkout + uses: actions/checkout@v4 + with: + repository: ${{ matrix.project.repo }} + path: test-repo + ref: ${{ matrix.project.ref }} + + - name: Generate compilation report + working-directory: ./test-repo/${{ matrix.project.path }} + run: | + mv /home/runner/work/noir/noir/scripts/test_programs/compilation_report.sh ./compilation_report.sh + chmod +x ./compilation_report.sh + ./compilation_report.sh 1 + + - name: Move compilation report + id: report + shell: bash + run: | + PACKAGE_NAME=${{ matrix.project.path }} + PACKAGE_NAME=$(basename $PACKAGE_NAME) + mv ./test-repo/${{ matrix.project.path }}/compilation_report.json ./compilation_report_$PACKAGE_NAME.json + echo "compilation_report_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT + + - name: Upload compilation report + uses: actions/upload-artifact@v4 + with: + name: compilation_report_${{ steps.report.outputs.compilation_report_name }} + path: compilation_report_${{ steps.report.outputs.compilation_report_name }}.json + retention-days: 3 + overwrite: true + + upload_compilation_report: + name: Upload compilation report + needs: [generate_compilation_report, external_repo_compilation_report] + # We want this job to run even if one variation of the matrix in `external_repo_compilation_report` fails + if: always() + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Download initial compilation report + uses: actions/download-artifact@v4 + with: + name: in_progress_compilation_report + + - name: Download matrix compilation reports + uses: actions/download-artifact@v4 + with: + pattern: compilation_report_* + path: ./reports + + - name: Merge compilation reports using jq + run: | + mv ./.github/scripts/merge-bench-reports.sh merge-bench-reports.sh + ./merge-bench-reports.sh compilation_report + + - name: Parse compilation report + id: compilation_report + uses: noir-lang/noir-bench-report@0d7464a8c39170523932d7846b6e6b458a294aea + with: + report: compilation_report.json + header: | + # Compilation Report + memory_report: false + + - name: Add memory report to sticky comment + if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: compilation + message: ${{ steps.compilation_report.outputs.markdown }} + + external_repo_memory_report: + needs: [build-nargo] + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + include: + # TODO: Bring this report back under a flag. The `noir-contracts` report takes just under 30 minutes. + # - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-contracts } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/parity-root } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-inner } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-reset } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-tail } + + name: External repo memory report - ${{ matrix.project.repo }}/${{ matrix.project.path }} + steps: + - name: Download nargo binary + uses: actions/download-artifact@v4 + with: + name: nargo + path: ./nargo + + - name: Set nargo on PATH + run: | + nargo_binary="${{ github.workspace }}/nargo/nargo" + chmod +x $nargo_binary + echo "$(dirname $nargo_binary)" >> $GITHUB_PATH + export PATH="$PATH:$(dirname $nargo_binary)" + nargo -V + + - uses: actions/checkout@v4 + with: + path: scripts + sparse-checkout: | + test_programs/memory_report.sh + sparse-checkout-cone-mode: false + + - name: Checkout + uses: actions/checkout@v4 + with: + repository: ${{ matrix.project.repo }} + path: test-repo + ref: ${{ matrix.project.ref }} + + - name: Generate compilation report + working-directory: ./test-repo/${{ matrix.project.path }} + run: | + mv /home/runner/work/noir/noir/scripts/test_programs/memory_report.sh ./memory_report.sh + chmod +x ./memory_report.sh + ./memory_report.sh 1 + + - name: Move compilation report + id: report + shell: bash + run: | + PACKAGE_NAME=${{ matrix.project.path }} + PACKAGE_NAME=$(basename $PACKAGE_NAME) + mv ./test-repo/${{ matrix.project.path }}/memory_report.json ./memory_report_$PACKAGE_NAME.json + echo "memory_report_name=$PACKAGE_NAME" >> $GITHUB_OUTPUT + + - name: Upload memory report + uses: actions/upload-artifact@v4 + with: + name: memory_report_${{ steps.report.outputs.memory_report_name }} + path: memory_report_${{ steps.report.outputs.memory_report_name }}.json + retention-days: 3 + overwrite: true + + upload_memory_report: + name: Upload memory report + needs: [generate_memory_report, external_repo_memory_report] + # We want this job to run even if one variation of the matrix in `external_repo_memory_report` fails + if: always() + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Download initial memory report + uses: actions/download-artifact@v4 + with: + name: in_progress_memory_report + + - name: Download matrix memory reports + uses: actions/download-artifact@v4 + with: + pattern: memory_report_* + path: ./reports + + - name: Merge memory reports using jq + run: | + mv ./.github/scripts/merge-bench-reports.sh merge-bench-reports.sh + ./merge-bench-reports.sh memory_report + - name: Parse memory report id: memory_report - uses: noir-lang/noir-bench-report@ccb0d806a91d3bd86dba0ba3d580a814eed5673c + uses: noir-lang/noir-bench-report@0d7464a8c39170523932d7846b6e6b458a294aea with: report: memory_report.json header: | @@ -233,3 +490,49 @@ jobs: with: header: memory message: ${{ steps.memory_report.outputs.markdown }} + + generate_compilation_report: + name: Compilation time + needs: [build-nargo] + runs-on: ubuntu-22.04 + permissions: + pull-requests: write + + steps: + - uses: actions/checkout@v4 + + - name: Download nargo binary + uses: actions/download-artifact@v4 + with: + name: nargo + path: ./nargo + + - name: Set nargo on PATH + run: | + nargo_binary="${{ github.workspace }}/nargo/nargo" + chmod +x $nargo_binary + echo "$(dirname $nargo_binary)" >> $GITHUB_PATH + export PATH="$PATH:$(dirname $nargo_binary)" + nargo -V + + - name: Generate Compilation report + working-directory: ./test_programs + run: | + ./compilation_report.sh + mv compilation_report.json ../compilation_report.json + + - name: Parse compilation report + id: compilation_report + uses: noir-lang/noir-bench-report@0d7464a8c39170523932d7846b6e6b458a294aea + with: + report: compilation_report.json + header: | + # Compilation Report + memory_report: false + + - name: Add memory report to sticky comment + if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target' + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: compilation + message: ${{ steps.compilation_report.outputs.markdown }} diff --git a/noir/noir-repo/.github/workflows/spellcheck.yml b/noir/noir-repo/.github/workflows/spellcheck.yml index 83d67325775..2b9a1461231 100644 --- a/noir/noir-repo/.github/workflows/spellcheck.yml +++ b/noir/noir-repo/.github/workflows/spellcheck.yml @@ -10,7 +10,7 @@ concurrency: jobs: code: name: Code - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout sources uses: actions/checkout@v4 @@ -25,7 +25,7 @@ jobs: docs: name: Documentation - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - name: Checkout sources uses: actions/checkout@v4 diff --git a/noir/noir-repo/.github/workflows/test-js-packages.yml b/noir/noir-repo/.github/workflows/test-js-packages.yml index 36ece11b1bf..d227b4eb00b 100644 --- a/noir/noir-repo/.github/workflows/test-js-packages.yml +++ b/noir/noir-repo/.github/workflows/test-js-packages.yml @@ -14,7 +14,7 @@ concurrency: jobs: yarn-lock: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -60,7 +60,7 @@ jobs: retention-days: 3 build-noirc-abi: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -92,7 +92,7 @@ jobs: retention-days: 10 build-noir-wasm: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -127,7 +127,7 @@ jobs: retention-days: 3 build-acvm-js: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -161,7 +161,7 @@ jobs: test-acvm_js-node: needs: [build-acvm-js] name: ACVM JS (Node.js) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -183,7 +183,7 @@ jobs: test-acvm_js-browser: needs: [build-acvm-js] name: ACVM JS (Browser) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -208,7 +208,7 @@ jobs: test-noirc-abi: needs: [build-noirc-abi] name: noirc_abi - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -236,7 +236,7 @@ jobs: test-noir-js: needs: [build-nargo, build-acvm-js, build-noirc-abi] name: Noir JS - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -283,7 +283,7 @@ jobs: test-noir-wasm: needs: [build-noir-wasm, build-nargo] name: noir_wasm - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -327,7 +327,7 @@ jobs: test-noir-codegen: needs: [build-acvm-js, build-noirc-abi, build-nargo] name: noir_codegen - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -374,7 +374,7 @@ jobs: test-integration-node: name: Integration Tests (Node) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [build-acvm-js, build-noir-wasm, build-nargo, build-noirc-abi] timeout-minutes: 30 @@ -435,7 +435,7 @@ jobs: test-integration-browser: name: Integration Tests (Browser) - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [build-acvm-js, build-noir-wasm, build-noirc-abi] timeout-minutes: 30 @@ -480,7 +480,7 @@ jobs: test-examples: name: Example scripts - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [build-nargo] timeout-minutes: 30 @@ -523,7 +523,7 @@ jobs: critical-library-list: name: Load critical library list - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: libraries: ${{ steps.get_critical_libraries.outputs.libraries }} @@ -534,7 +534,7 @@ jobs: - name: Build list of libraries id: get_critical_libraries run: | - LIBRARIES=$(grep -Po "^https://github.com/\K.+" ./CRITICAL_NOIR_LIBRARIES | jq -R -s -c 'split("\n") | map(select(. != "")) | map({ repo: ., path: "./"})') + LIBRARIES=$(grep -Po "^https://github.com/\K.+" ./CRITICAL_NOIR_LIBRARIES | jq -R -s -c 'split("\n") | map(select(. != "")) | map({ repo: ., path: ""})') echo "libraries=$LIBRARIES" echo "libraries=$LIBRARIES" >> $GITHUB_OUTPUT env: @@ -542,7 +542,7 @@ jobs: external-repo-checks: needs: [build-nargo, critical-library-list] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # Only run when 'run-external-checks' label is present if: contains(github.event.pull_request.labels.*.name, 'run-external-checks') timeout-minutes: 30 @@ -551,15 +551,16 @@ jobs: matrix: project: ${{ fromJson( needs.critical-library-list.outputs.libraries )}} include: - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/aztec-nr } - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/noir-contracts } - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/noir-protocol-circuits/crates/parity-lib } - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/noir-protocol-circuits/crates/private-kernel-lib } - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/noir-protocol-circuits/crates/reset-kernel-lib } - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/noir-protocol-circuits/crates/rollup-lib } - - project: { repo: AztecProtocol/aztec-packages, path: ./noir-projects/noir-protocol-circuits/crates/types } - - name: Check external repo - ${{ matrix.project.repo }} + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/aztec-nr } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-contracts } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/blob } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/parity-lib } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/private-kernel-lib } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/reset-kernel-lib } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/rollup-lib } + - project: { repo: AztecProtocol/aztec-packages, path: noir-projects/noir-protocol-circuits/crates/types } + + name: Check external repo - ${{ matrix.project.repo }}/${{ matrix.project.path }} steps: - name: Checkout uses: actions/checkout@v4 @@ -591,7 +592,7 @@ jobs: - name: Run nargo test working-directory: ./test-repo/${{ matrix.project.path }} - run: nargo test --silence-warnings + run: nargo test -q --silence-warnings env: NARGO_IGNORE_TEST_FAILURES_FROM_FOREIGN_CALLS: true @@ -599,7 +600,7 @@ jobs: # This allows us to add/remove test jobs without having to update the required workflows. tests-end: name: End - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # We want this job to always run (even if the dependant jobs fail) as we want this job to fail rather than skipping. if: ${{ always() }} needs: diff --git a/noir/noir-repo/.github/workflows/test-rust-workspace-msrv.yml b/noir/noir-repo/.github/workflows/test-rust-workspace-msrv.yml index ae016169830..6fd71eb56a2 100644 --- a/noir/noir-repo/.github/workflows/test-rust-workspace-msrv.yml +++ b/noir/noir-repo/.github/workflows/test-rust-workspace-msrv.yml @@ -21,7 +21,7 @@ concurrency: jobs: build-test-artifacts: name: Build test artifacts - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -62,7 +62,7 @@ jobs: run-tests: name: "Run tests (partition ${{matrix.partition}})" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [build-test-artifacts] strategy: fail-fast: false @@ -87,6 +87,7 @@ jobs: name: nextest-archive - name: Run tests run: | + RUST_MIN_STACK=8388608 \ cargo nextest run --archive-file nextest-archive.tar.zst \ --partition count:${{ matrix.partition }}/4 \ --no-fail-fast @@ -95,7 +96,7 @@ jobs: # This allows us to add/remove test jobs without having to update the required workflows. tests-end: name: Rust End - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # We want this job to always run (even if the dependant jobs fail) as we want this job to fail rather than skipping. if: ${{ always() }} needs: diff --git a/noir/noir-repo/.github/workflows/test-rust-workspace.yml b/noir/noir-repo/.github/workflows/test-rust-workspace.yml index 1f3ee5e2268..1514270ff56 100644 --- a/noir/noir-repo/.github/workflows/test-rust-workspace.yml +++ b/noir/noir-repo/.github/workflows/test-rust-workspace.yml @@ -15,7 +15,7 @@ concurrency: jobs: build-test-artifacts: name: Build test artifacts - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 timeout-minutes: 30 steps: @@ -49,7 +49,7 @@ jobs: run-tests: name: "Run tests (partition ${{matrix.partition}})" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: [build-test-artifacts] strategy: fail-fast: false @@ -74,6 +74,7 @@ jobs: name: nextest-archive - name: Run tests run: | + RUST_MIN_STACK=8388608 \ cargo nextest run --archive-file nextest-archive.tar.zst \ --partition count:${{ matrix.partition }}/4 \ --no-fail-fast @@ -82,7 +83,7 @@ jobs: # This allows us to add/remove test jobs without having to update the required workflows. tests-end: name: Rust End - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 # We want this job to always run (even if the dependant jobs fail) as we want this job to fail rather than skipping. if: ${{ always() }} needs: diff --git a/noir/noir-repo/.gitignore b/noir/noir-repo/.gitignore index f1f0ea47bcf..8442d688fbf 100644 --- a/noir/noir-repo/.gitignore +++ b/noir/noir-repo/.gitignore @@ -35,6 +35,7 @@ tooling/noir_js/lib gates_report.json gates_report_brillig.json gates_report_brillig_execution.json +compilation_report.json # Github Actions scratch space # This gives a location to download artifacts into the repository in CI without making git dirty. diff --git a/noir/noir-repo/Cargo.lock b/noir/noir-repo/Cargo.lock index e8226d5fc58..4907de7ae62 100644 --- a/noir/noir-repo/Cargo.lock +++ b/noir/noir-repo/Cargo.lock @@ -48,6 +48,7 @@ dependencies = [ "ark-bn254", "bn254_blackbox_solver", "brillig_vm", + "fxhash", "indexmap 1.9.3", "num-bigint", "proptest", @@ -868,7 +869,7 @@ checksum = "fc4159b76af02757139baf42c0c971c6dc155330999fbfd8eddb29b97fb2db68" dependencies = [ "codespan-reporting", "lsp-types 0.88.0", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -2656,7 +2657,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -2669,7 +2670,7 @@ dependencies = [ "serde", "serde_json", "serde_repr", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -2882,10 +2883,11 @@ dependencies = [ "noirc_frontend", "semver", "serde", + "tempfile", "test-case", "thiserror", "toml 0.7.8", - "url 2.5.3", + "url 2.5.4", ] [[package]] @@ -3185,6 +3187,7 @@ dependencies = [ "test-case", "thiserror", "tracing", + "tracing-test", ] [[package]] @@ -5073,6 +5076,27 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tracing-test" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracing-test-macro", +] + +[[package]] +name = "tracing-test-macro" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" +dependencies = [ + "quote", + "syn 2.0.87", +] + [[package]] name = "tracing-web" version = "0.1.3" @@ -5177,9 +5201,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna 1.0.3", @@ -5397,7 +5421,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/noir/noir-repo/Cargo.toml b/noir/noir-repo/Cargo.toml index 4ce0ddd999f..0acee2a040b 100644 --- a/noir/noir-repo/Cargo.toml +++ b/noir/noir-repo/Cargo.toml @@ -135,7 +135,7 @@ serde_json = "1.0" smol_str = { version = "0.1.17", features = ["serde"] } thiserror = "1.0.21" toml = "0.7.2" -url = "2.2.0" +url = "2.5.4" base64 = "0.21.2" fxhash = "0.2.1" build-data = "0.1.3" diff --git a/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp b/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp index e94f36535d2..2ae15f9f5a3 100644 --- a/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp +++ b/noir/noir-repo/acvm-repo/acir/codegen/acir.cpp @@ -424,8 +424,9 @@ namespace Program { struct ToRadix { Program::MemoryAddress input; Program::MemoryAddress radix; - Program::HeapArray output; - bool output_bits; + Program::MemoryAddress output_pointer; + Program::MemoryAddress num_limbs; + Program::MemoryAddress output_bits; friend bool operator==(const ToRadix&, const ToRadix&); std::vector bincodeSerialize() const; @@ -3898,7 +3899,8 @@ namespace Program { inline bool operator==(const BlackBoxOp::ToRadix &lhs, const BlackBoxOp::ToRadix &rhs) { if (!(lhs.input == rhs.input)) { return false; } if (!(lhs.radix == rhs.radix)) { return false; } - if (!(lhs.output == rhs.output)) { return false; } + if (!(lhs.output_pointer == rhs.output_pointer)) { return false; } + if (!(lhs.num_limbs == rhs.num_limbs)) { return false; } if (!(lhs.output_bits == rhs.output_bits)) { return false; } return true; } @@ -3925,7 +3927,8 @@ template void serde::Serializable::serialize(const Program::BlackBoxOp::ToRadix &obj, Serializer &serializer) { serde::Serializable::serialize(obj.input, serializer); serde::Serializable::serialize(obj.radix, serializer); - serde::Serializable::serialize(obj.output, serializer); + serde::Serializable::serialize(obj.output_pointer, serializer); + serde::Serializable::serialize(obj.num_limbs, serializer); serde::Serializable::serialize(obj.output_bits, serializer); } @@ -3935,7 +3938,8 @@ Program::BlackBoxOp::ToRadix serde::Deserializable Program::BlackBoxOp::ToRadix obj; obj.input = serde::Deserializable::deserialize(deserializer); obj.radix = serde::Deserializable::deserialize(deserializer); - obj.output = serde::Deserializable::deserialize(deserializer); + obj.output_pointer = serde::Deserializable::deserialize(deserializer); + obj.num_limbs = serde::Deserializable::deserialize(deserializer); obj.output_bits = serde::Deserializable::deserialize(deserializer); return obj; } diff --git a/noir/noir-repo/acvm-repo/acvm/Cargo.toml b/noir/noir-repo/acvm-repo/acvm/Cargo.toml index e513ae4e727..ba01ac8ec16 100644 --- a/noir/noir-repo/acvm-repo/acvm/Cargo.toml +++ b/noir/noir-repo/acvm-repo/acvm/Cargo.toml @@ -17,7 +17,7 @@ workspace = true thiserror.workspace = true tracing.workspace = true serde.workspace = true - +fxhash.workspace = true acir.workspace = true brillig_vm.workspace = true acvm_blackbox_solver.workspace = true diff --git a/noir/noir-repo/acvm-repo/acvm/src/compiler/mod.rs b/noir/noir-repo/acvm-repo/acvm/src/compiler/mod.rs index 8829f77e50b..daedd77c4a0 100644 --- a/noir/noir-repo/acvm-repo/acvm/src/compiler/mod.rs +++ b/noir/noir-repo/acvm-repo/acvm/src/compiler/mod.rs @@ -16,6 +16,10 @@ pub use simulator::CircuitSimulator; use transformers::transform_internal; pub use transformers::{transform, MIN_EXPRESSION_WIDTH}; +/// We need multiple passes to stabilize the output. +/// The value was determined by running tests. +const MAX_OPTIMIZER_PASSES: usize = 3; + /// This module moves and decomposes acir opcodes. The transformation map allows consumers of this module to map /// metadata they had about the opcodes to the new opcode structure generated after the transformation. #[derive(Debug)] @@ -28,9 +32,9 @@ impl AcirTransformationMap { /// Builds a map from a vector of pointers to the old acir opcodes. /// The index of the vector is the new opcode index. /// The value of the vector is the old opcode index pointed. - fn new(acir_opcode_positions: Vec) -> Self { + fn new(acir_opcode_positions: &[usize]) -> Self { let mut old_indices_to_new_indices = HashMap::with_capacity(acir_opcode_positions.len()); - for (new_index, old_index) in acir_opcode_positions.into_iter().enumerate() { + for (new_index, old_index) in acir_opcode_positions.iter().copied().enumerate() { old_indices_to_new_indices.entry(old_index).or_insert_with(Vec::new).push(new_index); } AcirTransformationMap { old_indices_to_new_indices } @@ -72,17 +76,51 @@ fn transform_assert_messages( } /// Applies [`ProofSystemCompiler`][crate::ProofSystemCompiler] specific optimizations to a [`Circuit`]. +/// +/// Runs multiple passes until the output stabilizes. pub fn compile( acir: Circuit, expression_width: ExpressionWidth, ) -> (Circuit, AcirTransformationMap) { - let (acir, acir_opcode_positions) = optimize_internal(acir); + let acir_opcode_positions = (0..acir.opcodes.len()).collect::>(); + + if MAX_OPTIMIZER_PASSES == 0 { + return (acir, AcirTransformationMap::new(&acir_opcode_positions)); + } + + let mut pass = 0; + let mut prev_opcodes_hash = fxhash::hash64(&acir.opcodes); + let mut prev_acir = acir; + let mut prev_acir_opcode_positions = acir_opcode_positions; + + // For most test programs it would be enough to only loop `transform_internal`, + // but some of them don't stabilize unless we also repeat the backend agnostic optimizations. + let (mut acir, acir_opcode_positions) = loop { + let (acir, acir_opcode_positions) = + optimize_internal(prev_acir, prev_acir_opcode_positions); - let (mut acir, acir_opcode_positions) = - transform_internal(acir, expression_width, acir_opcode_positions); + // Stop if we have already done at least one transform and an extra optimization changed nothing. + if pass > 0 && prev_opcodes_hash == fxhash::hash64(&acir.opcodes) { + break (acir, acir_opcode_positions); + } + + let (acir, acir_opcode_positions) = + transform_internal(acir, expression_width, acir_opcode_positions); + + let opcodes_hash = fxhash::hash64(&acir.opcodes); + + // Stop if the output hasn't change in this loop or we went too long. + if pass == MAX_OPTIMIZER_PASSES - 1 || prev_opcodes_hash == opcodes_hash { + break (acir, acir_opcode_positions); + } - let transformation_map = AcirTransformationMap::new(acir_opcode_positions); + pass += 1; + prev_acir = acir; + prev_opcodes_hash = opcodes_hash; + prev_acir_opcode_positions = acir_opcode_positions; + }; + let transformation_map = AcirTransformationMap::new(&acir_opcode_positions); acir.assert_messages = transform_assert_messages(acir.assert_messages, &transformation_map); (acir, transformation_map) diff --git a/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/merge_expressions.rs b/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/merge_expressions.rs index f49cd61e813..43e32101cc5 100644 --- a/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/merge_expressions.rs +++ b/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/merge_expressions.rs @@ -41,7 +41,9 @@ impl MergeExpressionsOptimizer { self.resolved_blocks.clear(); // Keep track, for each witness, of the gates that use it - let circuit_inputs = circuit.circuit_arguments(); + let circuit_io: BTreeSet = + circuit.circuit_arguments().union(&circuit.public_inputs().0).cloned().collect(); + let mut used_witness: BTreeMap> = BTreeMap::new(); for (i, opcode) in circuit.opcodes.iter().enumerate() { let witnesses = self.witness_inputs(opcode); @@ -49,8 +51,8 @@ impl MergeExpressionsOptimizer { self.resolved_blocks.insert(*block_id, witnesses.clone()); } for w in witnesses { - // We do not simplify circuit inputs - if !circuit_inputs.contains(&w) { + // We do not simplify circuit inputs and outputs + if !circuit_io.contains(&w) { used_witness.entry(w).or_default().insert(i); } } @@ -102,7 +104,7 @@ impl MergeExpressionsOptimizer { let mut witness_list = CircuitSimulator::expr_wit(&expr_use); witness_list.extend(CircuitSimulator::expr_wit(&expr_define)); for w2 in witness_list { - if !circuit_inputs.contains(&w2) { + if !circuit_io.contains(&w2) { used_witness.entry(w2).and_modify(|v| { v.insert(target); v.remove(&source); @@ -326,6 +328,50 @@ mod tests { check_circuit(circuit); } + #[test] + fn does_not_eliminate_witnesses_returned_from_circuit() { + let opcodes = vec![ + Opcode::AssertZero(Expression { + mul_terms: vec![(FieldElement::from(-1i128), Witness(0), Witness(0))], + linear_combinations: vec![(FieldElement::from(1i128), Witness(1))], + q_c: FieldElement::zero(), + }), + Opcode::AssertZero(Expression { + mul_terms: Vec::new(), + linear_combinations: vec![ + (FieldElement::from(-1i128), Witness(1)), + (FieldElement::from(1i128), Witness(2)), + ], + q_c: FieldElement::zero(), + }), + ]; + // Witness(1) could be eliminated because it's only used by 2 opcodes. + + let mut private_parameters = BTreeSet::new(); + private_parameters.insert(Witness(0)); + + let mut return_values = BTreeSet::new(); + return_values.insert(Witness(1)); + return_values.insert(Witness(2)); + + let circuit = Circuit { + current_witness_index: 2, + expression_width: ExpressionWidth::Bounded { width: 4 }, + opcodes, + private_parameters, + public_parameters: PublicInputs::default(), + return_values: PublicInputs(return_values), + assert_messages: Default::default(), + }; + + let mut merge_optimizer = MergeExpressionsOptimizer::new(); + let acir_opcode_positions = vec![0; 20]; + let (opcodes, _) = + merge_optimizer.eliminate_intermediate_variable(&circuit, acir_opcode_positions); + + assert_eq!(opcodes.len(), 2); + } + #[test] fn does_not_attempt_to_merge_into_previous_opcodes() { let opcodes = vec![ diff --git a/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/mod.rs b/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/mod.rs index 1947a80dc35..3531825c709 100644 --- a/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/mod.rs +++ b/noir/noir-repo/acvm-repo/acvm/src/compiler/optimizers/mod.rs @@ -21,9 +21,13 @@ use super::{transform_assert_messages, AcirTransformationMap}; /// Applies [`ProofSystemCompiler`][crate::ProofSystemCompiler] independent optimizations to a [`Circuit`]. pub fn optimize(acir: Circuit) -> (Circuit, AcirTransformationMap) { - let (mut acir, new_opcode_positions) = optimize_internal(acir); + // Track original acir opcode positions throughout the transformation passes of the compilation + // by applying the modifications done to the circuit opcodes and also to the opcode_positions (delete and insert) + let acir_opcode_positions = (0..acir.opcodes.len()).collect(); + + let (mut acir, new_opcode_positions) = optimize_internal(acir, acir_opcode_positions); - let transformation_map = AcirTransformationMap::new(new_opcode_positions); + let transformation_map = AcirTransformationMap::new(&new_opcode_positions); acir.assert_messages = transform_assert_messages(acir.assert_messages, &transformation_map); @@ -31,12 +35,13 @@ pub fn optimize(acir: Circuit) -> (Circuit, AcirTransformati } /// Applies [`ProofSystemCompiler`][crate::ProofSystemCompiler] independent optimizations to a [`Circuit`]. -#[tracing::instrument(level = "trace", name = "optimize_acir" skip(acir))] -pub(super) fn optimize_internal(acir: Circuit) -> (Circuit, Vec) { - // Track original acir opcode positions throughout the transformation passes of the compilation - // by applying the modifications done to the circuit opcodes and also to the opcode_positions (delete and insert) - let acir_opcode_positions = (0..acir.opcodes.len()).collect(); - +/// +/// Accepts an injected `acir_opcode_positions` to allow optimizations to be applied in a loop. +#[tracing::instrument(level = "trace", name = "optimize_acir" skip(acir, acir_opcode_positions))] +pub(super) fn optimize_internal( + acir: Circuit, + acir_opcode_positions: Vec, +) -> (Circuit, Vec) { if acir.opcodes.len() == 1 && matches!(acir.opcodes[0], Opcode::BrilligCall { .. }) { info!("Program is fully unconstrained, skipping optimization pass"); return (acir, acir_opcode_positions); diff --git a/noir/noir-repo/acvm-repo/acvm/src/compiler/transformers/mod.rs b/noir/noir-repo/acvm-repo/acvm/src/compiler/transformers/mod.rs index c9ce4ac7895..a499aec1b30 100644 --- a/noir/noir-repo/acvm-repo/acvm/src/compiler/transformers/mod.rs +++ b/noir/noir-repo/acvm-repo/acvm/src/compiler/transformers/mod.rs @@ -1,5 +1,10 @@ use acir::{ - circuit::{brillig::BrilligOutputs, Circuit, ExpressionWidth, Opcode}, + circuit::{ + self, + brillig::{BrilligInputs, BrilligOutputs}, + opcodes::{BlackBoxFuncCall, FunctionInput, MemOp}, + Circuit, ExpressionWidth, Opcode, + }, native_types::{Expression, Witness}, AcirField, }; @@ -12,6 +17,7 @@ pub use csat::MIN_EXPRESSION_WIDTH; use super::{ optimizers::MergeExpressionsOptimizer, transform_assert_messages, AcirTransformationMap, + MAX_OPTIMIZER_PASSES, }; /// Applies [`ProofSystemCompiler`][crate::ProofSystemCompiler] specific optimizations to a [`Circuit`]. @@ -26,7 +32,7 @@ pub fn transform( let (mut acir, acir_opcode_positions) = transform_internal(acir, expression_width, acir_opcode_positions); - let transformation_map = AcirTransformationMap::new(acir_opcode_positions); + let transformation_map = AcirTransformationMap::new(&acir_opcode_positions); acir.assert_messages = transform_assert_messages(acir.assert_messages, &transformation_map); @@ -36,9 +42,52 @@ pub fn transform( /// Applies [`ProofSystemCompiler`][crate::ProofSystemCompiler] specific optimizations to a [`Circuit`]. /// /// Accepts an injected `acir_opcode_positions` to allow transformations to be applied directly after optimizations. +/// +/// Does multiple passes until the output stabilizes. #[tracing::instrument(level = "trace", name = "transform_acir", skip(acir, acir_opcode_positions))] pub(super) fn transform_internal( - acir: Circuit, + mut acir: Circuit, + expression_width: ExpressionWidth, + mut acir_opcode_positions: Vec, +) -> (Circuit, Vec) { + // Allow multiple passes until we have stable output. + let mut prev_opcodes_hash = fxhash::hash64(&acir.opcodes); + + // For most test programs it would be enough to loop here, but some of them + // don't stabilize unless we also repeat the backend agnostic optimizations. + for _ in 0..MAX_OPTIMIZER_PASSES { + let (new_acir, new_acir_opcode_positions) = + transform_internal_once(acir, expression_width, acir_opcode_positions); + + acir = new_acir; + acir_opcode_positions = new_acir_opcode_positions; + + let new_opcodes_hash = fxhash::hash64(&acir.opcodes); + + if new_opcodes_hash == prev_opcodes_hash { + break; + } + prev_opcodes_hash = new_opcodes_hash; + } + // After the elimination of intermediate variables the `current_witness_index` is potentially higher than it needs to be, + // which would cause gaps if we ran the optimization a second time, making it look like new variables were added. + acir.current_witness_index = max_witness(&acir).witness_index(); + + (acir, acir_opcode_positions) +} + +/// Applies [`ProofSystemCompiler`][crate::ProofSystemCompiler] specific optimizations to a [`Circuit`]. +/// +/// Accepts an injected `acir_opcode_positions` to allow transformations to be applied directly after optimizations. +/// +/// Does a single optimization pass. +#[tracing::instrument( + level = "trace", + name = "transform_acir_once", + skip(acir, acir_opcode_positions) +)] +fn transform_internal_once( + mut acir: Circuit, expression_width: ExpressionWidth, acir_opcode_positions: Vec, ) -> (Circuit, Vec) { @@ -79,8 +128,6 @@ pub(super) fn transform_internal( &mut next_witness_index, ); - // Update next_witness counter - next_witness_index += (intermediate_variables.len() - len) as u32; let mut new_opcodes = Vec::new(); for (g, (norm, w)) in intermediate_variables.iter().skip(len) { // de-normalize @@ -150,23 +197,275 @@ pub(super) fn transform_internal( let current_witness_index = next_witness_index - 1; - let acir = Circuit { + acir = Circuit { current_witness_index, expression_width, opcodes: transformed_opcodes, // The transformer does not add new public inputs ..acir }; + let mut merge_optimizer = MergeExpressionsOptimizer::new(); + let (opcodes, new_acir_opcode_positions) = merge_optimizer.eliminate_intermediate_variable(&acir, new_acir_opcode_positions); - // n.b. we do not update current_witness_index after the eliminate_intermediate_variable pass, the real index could be less. - let acir = Circuit { - current_witness_index, - expression_width, + + // n.b. if we do not update current_witness_index after the eliminate_intermediate_variable pass, the real index could be less. + acir = Circuit { opcodes, // The optimizer does not add new public inputs ..acir }; + (acir, new_acir_opcode_positions) } + +/// Find the witness with the highest ID in the circuit. +fn max_witness(circuit: &Circuit) -> Witness { + let mut witnesses = WitnessFolder::new(Witness::default(), |state, witness| { + *state = witness.max(*state); + }); + witnesses.fold_circuit(circuit); + witnesses.into_state() +} + +/// Fold all witnesses in a circuit. +struct WitnessFolder { + state: S, + accumulate: A, +} + +impl WitnessFolder +where + A: Fn(&mut S, Witness), +{ + /// Create the folder with some initial state and an accumulator function. + fn new(init: S, accumulate: A) -> Self { + Self { state: init, accumulate } + } + + /// Take the accumulated state. + fn into_state(self) -> S { + self.state + } + + /// Add all witnesses from the circuit. + fn fold_circuit(&mut self, circuit: &Circuit) { + self.fold_many(circuit.private_parameters.iter()); + self.fold_many(circuit.public_parameters.0.iter()); + self.fold_many(circuit.return_values.0.iter()); + for opcode in &circuit.opcodes { + self.fold_opcode(opcode); + } + } + + /// Fold a witness into the state. + fn fold(&mut self, witness: Witness) { + (self.accumulate)(&mut self.state, witness); + } + + /// Fold many witnesses into the state. + fn fold_many<'w, I: Iterator>(&mut self, witnesses: I) { + for w in witnesses { + self.fold(*w); + } + } + + /// Add witnesses from the opcode. + fn fold_opcode(&mut self, opcode: &Opcode) { + match opcode { + Opcode::AssertZero(expr) => { + self.fold_expr(expr); + } + Opcode::BlackBoxFuncCall(call) => self.fold_blackbox(call), + Opcode::MemoryOp { block_id: _, op, predicate } => { + let MemOp { operation, index, value } = op; + self.fold_expr(operation); + self.fold_expr(index); + self.fold_expr(value); + if let Some(pred) = predicate { + self.fold_expr(pred); + } + } + Opcode::MemoryInit { block_id: _, init, block_type: _ } => { + for w in init { + self.fold(*w); + } + } + // We keep the display for a BrilligCall and circuit Call separate as they + // are distinct in their functionality and we should maintain this separation for debugging. + Opcode::BrilligCall { id: _, inputs, outputs, predicate } => { + if let Some(pred) = predicate { + self.fold_expr(pred); + } + self.fold_brillig_inputs(inputs); + self.fold_brillig_outputs(outputs); + } + Opcode::Call { id: _, inputs, outputs, predicate } => { + if let Some(pred) = predicate { + self.fold_expr(pred); + } + self.fold_many(inputs.iter()); + self.fold_many(outputs.iter()); + } + } + } + + fn fold_expr(&mut self, expr: &Expression) { + for i in &expr.mul_terms { + self.fold(i.1); + self.fold(i.2); + } + for i in &expr.linear_combinations { + self.fold(i.1); + } + } + + fn fold_brillig_inputs(&mut self, inputs: &[BrilligInputs]) { + for input in inputs { + match input { + BrilligInputs::Single(expr) => { + self.fold_expr(expr); + } + BrilligInputs::Array(exprs) => { + for expr in exprs { + self.fold_expr(expr); + } + } + BrilligInputs::MemoryArray(_) => {} + } + } + } + + fn fold_brillig_outputs(&mut self, outputs: &[BrilligOutputs]) { + for output in outputs { + match output { + BrilligOutputs::Simple(w) => { + self.fold(*w); + } + BrilligOutputs::Array(ws) => self.fold_many(ws.iter()), + } + } + } + + fn fold_blackbox(&mut self, call: &BlackBoxFuncCall) { + match call { + BlackBoxFuncCall::AES128Encrypt { inputs, iv, key, outputs } => { + self.fold_function_inputs(inputs.as_slice()); + self.fold_function_inputs(iv.as_slice()); + self.fold_function_inputs(key.as_slice()); + self.fold_many(outputs.iter()); + } + BlackBoxFuncCall::AND { lhs, rhs, output } => { + self.fold_function_input(lhs); + self.fold_function_input(rhs); + self.fold(*output); + } + BlackBoxFuncCall::XOR { lhs, rhs, output } => { + self.fold_function_input(lhs); + self.fold_function_input(rhs); + self.fold(*output); + } + BlackBoxFuncCall::RANGE { input } => { + self.fold_function_input(input); + } + BlackBoxFuncCall::Blake2s { inputs, outputs } => { + self.fold_function_inputs(inputs.as_slice()); + self.fold_many(outputs.iter()); + } + BlackBoxFuncCall::Blake3 { inputs, outputs } => { + self.fold_function_inputs(inputs.as_slice()); + self.fold_many(outputs.iter()); + } + BlackBoxFuncCall::EcdsaSecp256k1 { + public_key_x, + public_key_y, + signature, + hashed_message, + output, + } => { + self.fold_function_inputs(public_key_x.as_slice()); + self.fold_function_inputs(public_key_y.as_slice()); + self.fold_function_inputs(signature.as_slice()); + self.fold_function_inputs(hashed_message.as_slice()); + self.fold(*output); + } + BlackBoxFuncCall::EcdsaSecp256r1 { + public_key_x, + public_key_y, + signature, + hashed_message, + output, + } => { + self.fold_function_inputs(public_key_x.as_slice()); + self.fold_function_inputs(public_key_y.as_slice()); + self.fold_function_inputs(signature.as_slice()); + self.fold_function_inputs(hashed_message.as_slice()); + self.fold(*output); + } + BlackBoxFuncCall::MultiScalarMul { points, scalars, outputs } => { + self.fold_function_inputs(points.as_slice()); + self.fold_function_inputs(scalars.as_slice()); + let (x, y, i) = outputs; + self.fold(*x); + self.fold(*y); + self.fold(*i); + } + BlackBoxFuncCall::EmbeddedCurveAdd { input1, input2, outputs } => { + self.fold_function_inputs(input1.as_slice()); + self.fold_function_inputs(input2.as_slice()); + let (x, y, i) = outputs; + self.fold(*x); + self.fold(*y); + self.fold(*i); + } + BlackBoxFuncCall::Keccakf1600 { inputs, outputs } => { + self.fold_function_inputs(inputs.as_slice()); + self.fold_many(outputs.iter()); + } + BlackBoxFuncCall::RecursiveAggregation { + verification_key, + proof, + public_inputs, + key_hash, + proof_type: _, + } => { + self.fold_function_inputs(verification_key.as_slice()); + self.fold_function_inputs(proof.as_slice()); + self.fold_function_inputs(public_inputs.as_slice()); + self.fold_function_input(key_hash); + } + BlackBoxFuncCall::BigIntAdd { .. } + | BlackBoxFuncCall::BigIntSub { .. } + | BlackBoxFuncCall::BigIntMul { .. } + | BlackBoxFuncCall::BigIntDiv { .. } => {} + BlackBoxFuncCall::BigIntFromLeBytes { inputs, modulus: _, output: _ } => { + self.fold_function_inputs(inputs.as_slice()); + } + BlackBoxFuncCall::BigIntToLeBytes { input: _, outputs } => { + self.fold_many(outputs.iter()); + } + BlackBoxFuncCall::Poseidon2Permutation { inputs, outputs, len: _ } => { + self.fold_function_inputs(inputs.as_slice()); + self.fold_many(outputs.iter()); + } + BlackBoxFuncCall::Sha256Compression { inputs, hash_values, outputs } => { + self.fold_function_inputs(inputs.as_slice()); + self.fold_function_inputs(hash_values.as_slice()); + self.fold_many(outputs.iter()); + } + } + } + + fn fold_function_input(&mut self, input: &FunctionInput) { + if let circuit::opcodes::ConstantOrWitnessEnum::Witness(witness) = input.input() { + self.fold(witness); + } + } + + fn fold_function_inputs(&mut self, inputs: &[FunctionInput]) { + for input in inputs { + self.fold_function_input(input); + } + } +} diff --git a/noir/noir-repo/acvm-repo/acvm/src/pwg/mod.rs b/noir/noir-repo/acvm-repo/acvm/src/pwg/mod.rs index 20c12a72fc0..f9188cca700 100644 --- a/noir/noir-repo/acvm-repo/acvm/src/pwg/mod.rs +++ b/noir/noir-repo/acvm-repo/acvm/src/pwg/mod.rs @@ -359,7 +359,6 @@ impl<'a, F: AcirField, B: BlackBoxFunctionSolver> ACVM<'a, F, B> { pub fn solve_opcode(&mut self) -> ACVMStatus { let opcode = &self.opcodes[self.instruction_pointer]; - let resolution = match opcode { Opcode::AssertZero(expr) => ExpressionSolver::solve(&mut self.witness_map, expr), Opcode::BlackBoxFuncCall(bb_func) => blackbox::solve( diff --git a/noir/noir-repo/acvm-repo/bn254_blackbox_solver/benches/criterion.rs b/noir/noir-repo/acvm-repo/bn254_blackbox_solver/benches/criterion.rs index 8bf239eec8a..fc566b70a26 100644 --- a/noir/noir-repo/acvm-repo/bn254_blackbox_solver/benches/criterion.rs +++ b/noir/noir-repo/acvm-repo/bn254_blackbox_solver/benches/criterion.rs @@ -2,8 +2,7 @@ use criterion::{criterion_group, criterion_main, Criterion}; use std::{hint::black_box, time::Duration}; use acir::{AcirField, FieldElement}; -use acvm_blackbox_solver::BlackBoxFunctionSolver; -use bn254_blackbox_solver::{poseidon2_permutation, Bn254BlackBoxSolver}; +use bn254_blackbox_solver::poseidon2_permutation; use pprof::criterion::{Output, PProfProfiler}; diff --git a/noir/noir-repo/acvm-repo/brillig/src/black_box.rs b/noir/noir-repo/acvm-repo/brillig/src/black_box.rs index f185b36e6c8..be9ba20ed49 100644 --- a/noir/noir-repo/acvm-repo/brillig/src/black_box.rs +++ b/noir/noir-repo/acvm-repo/brillig/src/black_box.rs @@ -102,7 +102,8 @@ pub enum BlackBoxOp { ToRadix { input: MemoryAddress, radix: MemoryAddress, - output: HeapArray, - output_bits: bool, + output_pointer: MemoryAddress, + num_limbs: MemoryAddress, + output_bits: MemoryAddress, }, } diff --git a/noir/noir-repo/acvm-repo/brillig_vm/src/black_box.rs b/noir/noir-repo/acvm-repo/brillig_vm/src/black_box.rs index 79aea2adf76..9ebbbd3f087 100644 --- a/noir/noir-repo/acvm-repo/brillig_vm/src/black_box.rs +++ b/noir/noir-repo/acvm-repo/brillig_vm/src/black_box.rs @@ -310,21 +310,27 @@ pub(crate) fn evaluate_black_box memory.write_slice(memory.read_ref(output.pointer), &state); Ok(()) } - BlackBoxOp::ToRadix { input, radix, output, output_bits } => { + BlackBoxOp::ToRadix { input, radix, output_pointer, num_limbs, output_bits } => { let input: F = *memory.read(*input).extract_field().expect("ToRadix input not a field"); let radix = memory .read(*radix) .expect_integer_with_bit_size(IntegerBitSize::U32) .expect("ToRadix opcode's radix bit size does not match expected bit size 32"); + let num_limbs = memory.read(*num_limbs).to_usize(); + let output_bits = !memory + .read(*output_bits) + .expect_integer_with_bit_size(IntegerBitSize::U1) + .expect("ToRadix opcode's output_bits size does not match expected bit size 1") + .is_zero(); let mut input = BigUint::from_bytes_be(&input.to_be_bytes()); let radix = BigUint::from_bytes_be(&radix.to_be_bytes()); - let mut limbs: Vec> = vec![MemoryValue::default(); output.size]; + let mut limbs: Vec> = vec![MemoryValue::default(); num_limbs]; - for i in (0..output.size).rev() { + for i in (0..num_limbs).rev() { let limb = &input % &radix; - if *output_bits { + if output_bits { limbs[i] = MemoryValue::new_integer( if limb.is_zero() { 0 } else { 1 }, IntegerBitSize::U1, @@ -336,7 +342,7 @@ pub(crate) fn evaluate_black_box input /= &radix; } - memory.write_slice(memory.read_ref(output.pointer), &limbs); + memory.write_slice(memory.read_ref(*output_pointer), &limbs); Ok(()) } diff --git a/noir/noir-repo/compiler/fm/src/file_map.rs b/noir/noir-repo/compiler/fm/src/file_map.rs index ba552fe5156..857c7460fb9 100644 --- a/noir/noir-repo/compiler/fm/src/file_map.rs +++ b/noir/noir-repo/compiler/fm/src/file_map.rs @@ -80,6 +80,19 @@ impl FileMap { pub fn all_file_ids(&self) -> impl Iterator { self.name_to_id.values() } + + pub fn get_name(&self, file_id: FileId) -> Result { + let name = self.files.get(file_id.as_usize())?.name().clone(); + + // See if we can make the file name a bit shorter/easier to read if it starts with the current directory + if let Some(current_dir) = &self.current_dir { + if let Ok(name_without_prefix) = name.0.strip_prefix(current_dir) { + return Ok(PathString::from_path(name_without_prefix.to_path_buf())); + } + } + + Ok(name) + } } impl Default for FileMap { fn default() -> Self { @@ -97,16 +110,7 @@ impl<'a> Files<'a> for FileMap { type Source = &'a str; fn name(&self, file_id: Self::FileId) -> Result { - let name = self.files.get(file_id.as_usize())?.name().clone(); - - // See if we can make the file name a bit shorter/easier to read if it starts with the current directory - if let Some(current_dir) = &self.current_dir { - if let Ok(name_without_prefix) = name.0.strip_prefix(current_dir) { - return Ok(PathString::from_path(name_without_prefix.to_path_buf())); - } - } - - Ok(name) + self.get_name(file_id) } fn source(&'a self, file_id: Self::FileId) -> Result { diff --git a/noir/noir-repo/compiler/noirc_driver/src/lib.rs b/noir/noir-repo/compiler/noirc_driver/src/lib.rs index 5bedefaf563..9318e4d2b5c 100644 --- a/noir/noir-repo/compiler/noirc_driver/src/lib.rs +++ b/noir/noir-repo/compiler/noirc_driver/src/lib.rs @@ -10,7 +10,7 @@ use clap::Args; use fm::{FileId, FileManager}; use iter_extended::vecmap; use noirc_abi::{AbiParameter, AbiType, AbiValue}; -use noirc_errors::{CustomDiagnostic, FileDiagnostic}; +use noirc_errors::{CustomDiagnostic, DiagnosticKind, FileDiagnostic}; use noirc_evaluator::create_program; use noirc_evaluator::errors::RuntimeError; use noirc_evaluator::ssa::{SsaLogging, SsaProgramArtifact}; @@ -131,6 +131,12 @@ pub struct CompileOptions { #[arg(long)] pub skip_underconstrained_check: bool, + /// Flag to turn off the compiler check for missing Brillig call constrains. + /// Warning: This can improve compilation speed but can also lead to correctness errors. + /// This check should always be run on production code. + #[arg(long)] + pub skip_brillig_constraints_check: bool, + /// Setting to decide on an inlining strategy for Brillig functions. /// A more aggressive inliner should generate larger programs but more optimized /// A less aggressive inliner should generate smaller programs @@ -301,7 +307,6 @@ pub fn check_crate( crate_id: CrateId, options: &CompileOptions, ) -> CompilationResult<()> { - let mut errors = vec![]; let error_on_unused_imports = true; let diagnostics = CrateDefMap::collect_defs( crate_id, @@ -309,15 +314,22 @@ pub fn check_crate( options.debug_comptime_in_file.as_deref(), error_on_unused_imports, ); - errors.extend(diagnostics.into_iter().map(|(error, file_id)| { - let diagnostic = CustomDiagnostic::from(&error); - diagnostic.in_file(file_id) - })); + let warnings_and_errors: Vec = diagnostics + .into_iter() + .map(|(error, file_id)| { + let diagnostic = CustomDiagnostic::from(&error); + diagnostic.in_file(file_id) + }) + .filter(|diagnostic| { + // We filter out any warnings if they're going to be ignored later on to free up memory. + !options.silence_warnings || diagnostic.diagnostic.kind != DiagnosticKind::Warning + }) + .collect(); - if has_errors(&errors, options.deny_warnings) { - Err(errors) + if has_errors(&warnings_and_errors, options.deny_warnings) { + Err(warnings_and_errors) } else { - Ok(((), errors)) + Ok(((), warnings_and_errors)) } } @@ -625,6 +637,7 @@ pub fn compile_no_check( }, emit_ssa: if options.emit_ssa { Some(context.package_build_path.clone()) } else { None }, skip_underconstrained_check: options.skip_underconstrained_check, + skip_brillig_constraints_check: options.skip_brillig_constraints_check, inliner_aggressiveness: options.inliner_aggressiveness, max_bytecode_increase_percent: options.max_bytecode_increase_percent, }; diff --git a/noir/noir-repo/compiler/noirc_errors/src/reporter.rs b/noir/noir-repo/compiler/noirc_errors/src/reporter.rs index f029b4e6de8..e57775d9a7f 100644 --- a/noir/noir-repo/compiler/noirc_errors/src/reporter.rs +++ b/noir/noir-repo/compiler/noirc_errors/src/reporter.rs @@ -272,7 +272,7 @@ fn convert_diagnostic( diagnostic.with_message(&cd.message).with_labels(secondary_labels).with_notes(notes) } -fn stack_trace<'files>( +pub fn stack_trace<'files>( files: &'files impl Files<'files, FileId = fm::FileId>, call_stack: &[Location], ) -> String { diff --git a/noir/noir-repo/compiler/noirc_evaluator/Cargo.toml b/noir/noir-repo/compiler/noirc_evaluator/Cargo.toml index bb8c62cfd95..72fba8aadc2 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/Cargo.toml +++ b/noir/noir-repo/compiler/noirc_evaluator/Cargo.toml @@ -32,6 +32,7 @@ cfg-if.workspace = true [dev-dependencies] proptest.workspace = true similar-asserts.workspace = true +tracing-test = "0.2.5" num-traits.workspace = true test-case.workspace = true diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/acir/acir_variable.rs b/noir/noir-repo/compiler/noirc_evaluator/src/acir/acir_variable.rs index 9f2c649ee3e..78188ea2b65 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/acir/acir_variable.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/acir/acir_variable.rs @@ -23,7 +23,7 @@ use std::{borrow::Cow, hash::Hash}; use crate::brillig::brillig_ir::artifact::GeneratedBrillig; use crate::errors::{InternalBug, InternalError, RuntimeError, SsaReport}; use crate::ssa::ir::{ - dfg::CallStack, instruction::Endian, types::NumericType, types::Type as SsaType, + call_stack::CallStack, instruction::Endian, types::NumericType, types::Type as SsaType, }; use super::big_int::BigIntContext; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/acir/generated_acir.rs b/noir/noir-repo/compiler/noirc_evaluator/src/acir/generated_acir.rs index 3b29c0319ab..b6a5a817ea7 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/acir/generated_acir.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/acir/generated_acir.rs @@ -16,7 +16,7 @@ use super::brillig_directive; use crate::{ brillig::brillig_ir::artifact::GeneratedBrillig, errors::{InternalError, RuntimeError, SsaReport}, - ssa::ir::dfg::CallStack, + ssa::ir::call_stack::CallStack, ErrorType, }; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/acir/mod.rs b/noir/noir-repo/compiler/noirc_evaluator/src/acir/mod.rs index 76f0dea95bb..e7b011b6d7b 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/acir/mod.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/acir/mod.rs @@ -31,10 +31,12 @@ use crate::brillig::{ Brillig, }; use crate::errors::{InternalError, InternalWarning, RuntimeError, SsaReport}; +use crate::ssa::ir::instruction::Hint; use crate::ssa::{ function_builder::data_bus::DataBus, ir::{ - dfg::{CallStack, DataFlowGraph}, + call_stack::CallStack, + dfg::DataFlowGraph, function::{Function, FunctionId, RuntimeType}, instruction::{ Binary, BinaryOp, ConstrainError, Instruction, InstructionId, Intrinsic, @@ -674,7 +676,7 @@ impl<'a> Context<'a> { brillig: &Brillig, ) -> Result, RuntimeError> { let instruction = &dfg[instruction_id]; - self.acir_context.set_call_stack(dfg.get_call_stack(instruction_id)); + self.acir_context.set_call_stack(dfg.get_instruction_call_stack(instruction_id)); let mut warnings = Vec::new(); match instruction { Instruction::Binary(binary) => { @@ -821,14 +823,12 @@ impl<'a> Context<'a> { }) .sum(); - let Some(acir_function_id) = - ssa.entry_point_to_generated_index.get(id) - else { + let Some(acir_function_id) = ssa.get_entry_point_index(id) else { unreachable!("Expected an associated final index for call to acir function {id} with args {arguments:?}"); }; let output_vars = self.acir_context.call_acir_function( - AcirFunctionId(*acir_function_id), + AcirFunctionId(acir_function_id), inputs, output_count, self.current_side_effects_enabled_var, @@ -1823,7 +1823,7 @@ impl<'a> Context<'a> { ) -> Result<(Vec, Vec), RuntimeError> { let (return_values, call_stack) = match terminator { TerminatorInstruction::Return { return_values, call_stack } => { - (return_values, call_stack.clone()) + (return_values, *call_stack) } // TODO(https://github.com/noir-lang/noir/issues/4616): Enable recursion on foldable/non-inlined ACIR functions _ => unreachable!("ICE: Program must have a singular return"), @@ -1842,6 +1842,7 @@ impl<'a> Context<'a> { } } + let call_stack = dfg.call_stack_data.get_call_stack(call_stack); let warnings = if has_constant_return { vec![SsaReport::Warning(InternalWarning::ReturnConstant { call_stack })] } else { @@ -1873,14 +1874,15 @@ impl<'a> Context<'a> { let acir_value = match value { Value::NumericConstant { constant, typ } => { - AcirValue::Var(self.acir_context.add_constant(*constant), typ.into()) + let typ = AcirType::from(Type::Numeric(*typ)); + AcirValue::Var(self.acir_context.add_constant(*constant), typ) } Value::Intrinsic(..) => todo!(), Value::Function(function_id) => { // This conversion is for debugging support only, to allow the // debugging instrumentation code to work. Taking the reference // of a function in ACIR is useless. - let id = self.acir_context.add_constant(function_id.to_usize()); + let id = self.acir_context.add_constant(function_id.to_u32()); AcirValue::Var(id, AcirType::field()) } Value::ForeignFunction(_) => unimplemented!( @@ -2133,6 +2135,15 @@ impl<'a> Context<'a> { result_ids: &[ValueId], ) -> Result, RuntimeError> { match intrinsic { + Intrinsic::Hint(Hint::BlackBox) => { + // Identity function; at the ACIR level this is a no-op, it only affects the SSA. + assert_eq!( + arguments.len(), + result_ids.len(), + "ICE: BlackBox input and output lengths should match." + ); + Ok(arguments.iter().map(|v| self.convert_value(*v, dfg)).collect()) + } Intrinsic::BlackBox(black_box) => { // Slices are represented as a tuple of (length, slice contents). // We must check the inputs to determine if there are slices @@ -2884,7 +2895,6 @@ mod test { }, FieldElement, }; - use im::vector; use noirc_errors::Location; use noirc_frontend::monomorphization::ast::InlineType; use std::collections::BTreeMap; @@ -2894,7 +2904,13 @@ mod test { brillig::Brillig, ssa::{ function_builder::FunctionBuilder, - ir::{function::FunctionId, instruction::BinaryOp, map::Id, types::Type}, + ir::{ + call_stack::CallStack, + function::FunctionId, + instruction::BinaryOp, + map::Id, + types::{NumericType, Type}, + }, }, }; @@ -2916,13 +2932,17 @@ mod test { builder.new_function("foo".into(), foo_id, inline_type); } // Set a call stack for testing whether `brillig_locations` in the `GeneratedAcir` was accurately set. - builder.set_call_stack(vector![Location::dummy(), Location::dummy()]); + let mut stack = CallStack::unit(Location::dummy()); + stack.push_back(Location::dummy()); + let call_stack = + builder.current_function.dfg.call_stack_data.get_or_insert_locations(stack); + builder.set_call_stack(call_stack); let foo_v0 = builder.add_parameter(Type::field()); let foo_v1 = builder.add_parameter(Type::field()); let foo_equality_check = builder.insert_binary(foo_v0, BinaryOp::Eq, foo_v1); - let zero = builder.numeric_constant(0u128, Type::unsigned(1)); + let zero = builder.numeric_constant(0u128, NumericType::unsigned(1)); builder.insert_constrain(foo_equality_check, zero, None); builder.terminate_with_return(vec![foo_v0]); } @@ -2979,7 +2999,7 @@ mod test { build_basic_foo_with_return(&mut builder, foo_id, false, inline_type); - let ssa = builder.finish(); + let ssa = builder.finish().generate_entry_point_index(); let (acir_functions, _, _, _) = ssa .into_acir(&Brillig::default(), ExpressionWidth::default()) @@ -3087,6 +3107,7 @@ mod test { let ssa = builder.finish(); let (acir_functions, _, _, _) = ssa + .generate_entry_point_index() .into_acir(&Brillig::default(), ExpressionWidth::default()) .expect("Should compile manually written SSA into ACIR"); // The expected result should look very similar to the above test expect that the input witnesses of the `Call` @@ -3184,7 +3205,7 @@ mod test { build_basic_foo_with_return(&mut builder, foo_id, false, inline_type); - let ssa = builder.finish(); + let ssa = builder.finish().generate_entry_point_index(); let (acir_functions, _, _, _) = ssa .into_acir(&Brillig::default(), ExpressionWidth::default()) @@ -3311,6 +3332,7 @@ mod test { let brillig = ssa.to_brillig(false); let (acir_functions, brillig_functions, _, _) = ssa + .generate_entry_point_index() .into_acir(&brillig, ExpressionWidth::default()) .expect("Should compile manually written SSA into ACIR"); @@ -3364,7 +3386,7 @@ mod test { // Call the same primitive operation again let v1_div_v2 = builder.insert_binary(main_v1, BinaryOp::Div, main_v2); - let one = builder.numeric_constant(1u128, Type::unsigned(32)); + let one = builder.numeric_constant(1u128, NumericType::unsigned(32)); builder.insert_constrain(v1_div_v2, one, None); builder.terminate_with_return(vec![]); @@ -3375,6 +3397,7 @@ mod test { // The Brillig bytecode we insert for the stdlib is hardcoded so we do not need to provide any // Brillig artifacts to the ACIR gen pass. let (acir_functions, brillig_functions, _, _) = ssa + .generate_entry_point_index() .into_acir(&Brillig::default(), ExpressionWidth::default()) .expect("Should compile manually written SSA into ACIR"); @@ -3436,7 +3459,7 @@ mod test { // Call the same primitive operation again let v1_div_v2 = builder.insert_binary(main_v1, BinaryOp::Div, main_v2); - let one = builder.numeric_constant(1u128, Type::unsigned(32)); + let one = builder.numeric_constant(1u128, NumericType::unsigned(32)); builder.insert_constrain(v1_div_v2, one, None); builder.terminate_with_return(vec![]); @@ -3449,6 +3472,7 @@ mod test { println!("{}", ssa); let (acir_functions, brillig_functions, _, _) = ssa + .generate_entry_point_index() .into_acir(&brillig, ExpressionWidth::default()) .expect("Should compile manually written SSA into ACIR"); @@ -3521,7 +3545,7 @@ mod test { // Call the same primitive operation again let v1_div_v2 = builder.insert_binary(main_v1, BinaryOp::Div, main_v2); - let one = builder.numeric_constant(1u128, Type::unsigned(32)); + let one = builder.numeric_constant(1u128, NumericType::unsigned(32)); builder.insert_constrain(v1_div_v2, one, None); builder.terminate_with_return(vec![]); @@ -3537,6 +3561,7 @@ mod test { println!("{}", ssa); let (acir_functions, brillig_functions, _, _) = ssa + .generate_entry_point_index() .into_acir(&brillig, ExpressionWidth::default()) .expect("Should compile manually written SSA into ACIR"); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen.rs index ca4e783aa93..5a81c79ae0d 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen.rs @@ -18,7 +18,7 @@ use super::{ }; use crate::{ errors::InternalError, - ssa::ir::{dfg::CallStack, function::Function}, + ssa::ir::{call_stack::CallStack, function::Function}, }; /// Converting an SSA function into Brillig bytecode. diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs index 9c88c559b59..0b02cd29f0f 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs @@ -7,8 +7,8 @@ use crate::brillig::brillig_ir::registers::Stack; use crate::brillig::brillig_ir::{ BrilligBinaryOp, BrilligContext, ReservedRegisters, BRILLIG_MEMORY_ADDRESSING_BIT_SIZE, }; -use crate::ssa::ir::dfg::CallStack; -use crate::ssa::ir::instruction::ConstrainError; +use crate::ssa::ir::call_stack::CallStack; +use crate::ssa::ir::instruction::{ConstrainError, Hint}; use crate::ssa::ir::{ basic_block::BasicBlockId, dfg::DataFlowGraph, @@ -201,7 +201,7 @@ impl<'block> BrilligBlock<'block> { /// Converts an SSA instruction into a sequence of Brillig opcodes. fn convert_ssa_instruction(&mut self, instruction_id: InstructionId, dfg: &DataFlowGraph) { let instruction = &dfg[instruction_id]; - self.brillig_context.set_call_stack(dfg.get_call_stack(instruction_id)); + self.brillig_context.set_call_stack(dfg.get_instruction_call_stack(instruction_id)); self.initialize_constants( &self.function_context.constant_allocation.allocated_at_location( @@ -226,16 +226,14 @@ impl<'block> BrilligBlock<'block> { dfg.get_numeric_constant_with_type(*rhs), ) { // If the constraint is of the form `x == u1 1` then we can simply constrain `x` directly - ( - Some((constant, Type::Numeric(NumericType::Unsigned { bit_size: 1 }))), - None, - ) if constant == FieldElement::one() => { + (Some((constant, NumericType::Unsigned { bit_size: 1 })), None) + if constant == FieldElement::one() => + { (self.convert_ssa_single_addr_value(*rhs, dfg), false) } - ( - None, - Some((constant, Type::Numeric(NumericType::Unsigned { bit_size: 1 }))), - ) if constant == FieldElement::one() => { + (None, Some((constant, NumericType::Unsigned { bit_size: 1 }))) + if constant == FieldElement::one() => + { (self.convert_ssa_single_addr_value(*lhs, dfg), false) } @@ -552,6 +550,10 @@ impl<'block> BrilligBlock<'block> { false, ); } + Intrinsic::Hint(Hint::BlackBox) => { + let result_ids = dfg.instruction_results(instruction_id); + self.convert_ssa_identity_call(arguments, dfg, result_ids); + } Intrinsic::BlackBox(bb_func) => { // Slices are represented as a tuple of (length, slice contents). // We must check the inputs to determine if there are slices @@ -874,6 +876,30 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.codegen_call(func_id, &argument_variables, &return_variables); } + /// Copy the input arguments to the results. + fn convert_ssa_identity_call( + &mut self, + arguments: &[ValueId], + dfg: &DataFlowGraph, + result_ids: &[ValueId], + ) { + let argument_variables = + vecmap(arguments, |argument_id| self.convert_ssa_value(*argument_id, dfg)); + + let return_variables = vecmap(result_ids, |result_id| { + self.variables.define_variable( + self.function_context, + self.brillig_context, + *result_id, + dfg, + ) + }); + + for (src, dst) in argument_variables.into_iter().zip(return_variables) { + self.brillig_context.mov_instruction(dst.extract_register(), src.extract_register()); + } + } + fn validate_array_index( &mut self, array_variable: BrilligVariable, @@ -1257,8 +1283,8 @@ impl<'block> BrilligBlock<'block> { result_variable: SingleAddrVariable, ) { let binary_type = type_of_binary_operation( - dfg[binary.lhs].get_type(), - dfg[binary.rhs].get_type(), + dfg[binary.lhs].get_type().as_ref(), + dfg[binary.rhs].get_type().as_ref(), binary.operator, ); @@ -1588,7 +1614,7 @@ impl<'block> BrilligBlock<'block> { self.brillig_context.const_instruction( new_variable.extract_single_addr(), - value_id.to_usize().into(), + value_id.to_u32().into(), ); new_variable } @@ -1767,7 +1793,7 @@ impl<'block> BrilligBlock<'block> { dfg: &DataFlowGraph, ) -> BrilligVariable { let typ = dfg[result].get_type(); - match typ { + match typ.as_ref() { Type::Numeric(_) => self.variables.define_variable( self.function_context, self.brillig_context, @@ -1783,7 +1809,7 @@ impl<'block> BrilligBlock<'block> { dfg, ); let array = variable.extract_array(); - self.allocate_foreign_call_result_array(typ, array); + self.allocate_foreign_call_result_array(typ.as_ref(), array); variable } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/variable_liveness.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/variable_liveness.rs index 87165c36dff..d6851a9ecf9 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/variable_liveness.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_gen/variable_liveness.rs @@ -372,7 +372,7 @@ mod test { let v3 = builder.insert_allocate(Type::field()); - let zero = builder.numeric_constant(0u128, Type::field()); + let zero = builder.field_constant(0u128); builder.insert_store(v3, zero); let v4 = builder.insert_binary(v0, BinaryOp::Eq, zero); @@ -381,7 +381,7 @@ mod test { builder.switch_to_block(b2); - let twenty_seven = builder.numeric_constant(27u128, Type::field()); + let twenty_seven = builder.field_constant(27u128); let v7 = builder.insert_binary(v0, BinaryOp::Add, twenty_seven); builder.insert_store(v3, v7); @@ -487,7 +487,7 @@ mod test { let v3 = builder.insert_allocate(Type::field()); - let zero = builder.numeric_constant(0u128, Type::field()); + let zero = builder.field_constant(0u128); builder.insert_store(v3, zero); builder.terminate_with_jmp(b1, vec![zero]); @@ -515,7 +515,7 @@ mod test { builder.switch_to_block(b5); - let twenty_seven = builder.numeric_constant(27u128, Type::field()); + let twenty_seven = builder.field_constant(27u128); let v10 = builder.insert_binary(v7, BinaryOp::Eq, twenty_seven); let v11 = builder.insert_not(v10); @@ -534,7 +534,7 @@ mod test { builder.switch_to_block(b8); - let one = builder.numeric_constant(1u128, Type::field()); + let one = builder.field_constant(1u128); let v15 = builder.insert_binary(v7, BinaryOp::Add, one); builder.terminate_with_jmp(b4, vec![v15]); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs index 8d5f14cee94..3c100d229a6 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir.rs @@ -30,7 +30,7 @@ pub(crate) use instructions::BrilligBinaryOp; use registers::{RegisterAllocator, ScratchSpace}; use self::{artifact::BrilligArtifact, debug_show::DebugToString, registers::Stack}; -use crate::ssa::ir::dfg::CallStack; +use crate::ssa::ir::call_stack::CallStack; use acvm::{ acir::brillig::{MemoryAddress, Opcode as BrilligOpcode}, AcirField, diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/artifact.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/artifact.rs index 0e5b72c0b85..be4a6b84bc1 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/artifact.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/artifact.rs @@ -2,7 +2,7 @@ use acvm::acir::brillig::Opcode as BrilligOpcode; use acvm::acir::circuit::ErrorSelector; use std::collections::{BTreeMap, HashMap}; -use crate::ssa::ir::{basic_block::BasicBlockId, dfg::CallStack, function::FunctionId}; +use crate::ssa::ir::{basic_block::BasicBlockId, call_stack::CallStack, function::FunctionId}; use crate::ErrorType; use super::procedures::ProcedureId; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/codegen_intrinsic.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/codegen_intrinsic.rs index ba89823ef13..42c13a3c235 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/codegen_intrinsic.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/codegen_intrinsic.rs @@ -75,23 +75,27 @@ impl BrilligContext< assert!(source_field.bit_size == F::max_num_bits()); assert!(radix.bit_size == 32); + let bits_register = self.make_constant_instruction(output_bits.into(), 1); self.codegen_initialize_array(target_array); - - let heap_array = self.codegen_brillig_array_to_heap_array(target_array); + let pointer = self.codegen_make_array_items_pointer(target_array); + let num_limbs = self.make_usize_constant_instruction(target_array.size.into()); // Perform big-endian ToRadix self.black_box_op_instruction(BlackBoxOp::ToRadix { input: source_field.address, radix: radix.address, - output: heap_array, - output_bits, + output_pointer: pointer, + num_limbs: num_limbs.address, + output_bits: bits_register.address, }); if little_endian { let items_len = self.make_usize_constant_instruction(target_array.size.into()); - self.codegen_array_reverse(heap_array.pointer, items_len.address); + self.codegen_array_reverse(pointer, items_len.address); self.deallocate_single_addr(items_len); } - self.deallocate_register(heap_array.pointer); + self.deallocate_register(pointer); + self.deallocate_single_addr(bits_register); + self.deallocate_single_addr(num_limbs); } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs index ef1b5432128..283c0d67eb8 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/brillig/brillig_ir/debug_show.rs @@ -397,13 +397,14 @@ impl DebugShow { output ); } - BlackBoxOp::ToRadix { input, radix, output, output_bits: _ } => { + BlackBoxOp::ToRadix { input, radix, output_pointer, num_limbs, output_bits: _ } => { debug_println!( self.enable_debug_trace, - " TO_RADIX {} {} -> {}", + " TO_RADIX {} {} {} -> {}", input, radix, - output + num_limbs, + output_pointer ); } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/errors.rs b/noir/noir-repo/compiler/noirc_evaluator/src/errors.rs index 75a3ceb3a72..ee662c50b75 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/errors.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/errors.rs @@ -12,7 +12,7 @@ use iter_extended::vecmap; use noirc_errors::{CustomDiagnostic as Diagnostic, FileDiagnostic}; use thiserror::Error; -use crate::ssa::ir::{dfg::CallStack, types::NumericType}; +use crate::ssa::ir::{call_stack::CallStack, types::NumericType}; use serde::{Deserialize, Serialize}; #[derive(Debug, PartialEq, Eq, Clone, Error)] @@ -93,7 +93,10 @@ impl From for FileDiagnostic { let message = bug.to_string(); let (secondary_message, call_stack) = match bug { InternalBug::IndependentSubgraph { call_stack } => { - ("There is no path from the output of this brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(),call_stack) + ("There is no path from the output of this Brillig call to either return values or inputs of the circuit, which creates an independent subgraph. This is quite likely a soundness vulnerability".to_string(), call_stack) + } + InternalBug::UncheckedBrilligCall { call_stack } => { + ("This Brillig call's inputs and its return values haven't been sufficiently constrained. This should be done to prevent potential soundness vulnerabilities".to_string(), call_stack) } InternalBug::AssertFailed { call_stack } => ("As a result, the compiled circuit is ensured to fail. Other assertions may also fail during execution".to_string(), call_stack) }; @@ -117,8 +120,10 @@ pub enum InternalWarning { #[derive(Debug, PartialEq, Eq, Clone, Error, Serialize, Deserialize, Hash)] pub enum InternalBug { - #[error("Input to brillig function is in a separate subgraph to output")] + #[error("Input to Brillig function is in a separate subgraph to output")] IndependentSubgraph { call_stack: CallStack }, + #[error("Brillig function call isn't properly covered by a manual constraint")] + UncheckedBrilligCall { call_stack: CallStack }, #[error("Assertion is always false")] AssertFailed { call_stack: CallStack }, } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa.rs index 8f31023f790..9377cadb260 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa.rs @@ -72,7 +72,10 @@ pub struct SsaEvaluatorOptions { /// Skip the check for under constrained values pub skip_underconstrained_check: bool, - /// The higher the value, the more inlined brillig functions will be. + /// Skip the missing Brillig call constraints check + pub skip_brillig_constraints_check: bool, + + /// The higher the value, the more inlined Brillig functions will be. pub inliner_aggressiveness: i64, /// Maximum accepted percentage increase in the Brillig bytecode size after unrolling loops. @@ -94,60 +97,32 @@ pub(crate) fn optimize_into_acir( ) -> Result { let ssa_gen_span = span!(Level::TRACE, "ssa_generation"); let ssa_gen_span_guard = ssa_gen_span.enter(); - - let mut ssa = SsaBuilder::new( + let builder = SsaBuilder::new( program, options.ssa_logging.clone(), options.force_brillig_output, options.print_codegen_timings, &options.emit_ssa, - )? - .run_pass(Ssa::defunctionalize, "Defunctionalization") - .run_pass(Ssa::remove_paired_rc, "Removing Paired rc_inc & rc_decs") - .run_pass(Ssa::separate_runtime, "Runtime Separation") - .run_pass(Ssa::resolve_is_unconstrained, "Resolving IsUnconstrained") - .run_pass(|ssa| ssa.inline_functions(options.inliner_aggressiveness), "Inlining (1st)") - // Run mem2reg with the CFG separated into blocks - .run_pass(Ssa::mem2reg, "Mem2Reg (1st)") - .run_pass(Ssa::simplify_cfg, "Simplifying (1st)") - .run_pass(Ssa::as_slice_optimization, "`as_slice` optimization") - .try_run_pass( - Ssa::evaluate_static_assert_and_assert_constant, - "`static_assert` and `assert_constant`", - )? - .run_pass(Ssa::loop_invariant_code_motion, "Loop Invariant Code Motion") - .try_run_pass( - |ssa| ssa.unroll_loops_iteratively(options.max_bytecode_increase_percent), - "Unrolling", - )? - .run_pass(Ssa::simplify_cfg, "Simplifying (2nd)") - .run_pass(Ssa::flatten_cfg, "Flattening") - .run_pass(Ssa::remove_bit_shifts, "After Removing Bit Shifts") - // Run mem2reg once more with the flattened CFG to catch any remaining loads/stores - .run_pass(Ssa::mem2reg, "Mem2Reg (2nd)") - // Run the inlining pass again to handle functions with `InlineType::NoPredicates`. - // Before flattening is run, we treat functions marked with the `InlineType::NoPredicates` as an entry point. - // This pass must come immediately following `mem2reg` as the succeeding passes - // may create an SSA which inlining fails to handle. - .run_pass( - |ssa| ssa.inline_functions_with_no_predicates(options.inliner_aggressiveness), - "Inlining (2nd)", - ) - .run_pass(Ssa::remove_if_else, "Remove IfElse") - .run_pass(Ssa::fold_constants, "Constant Folding") - .run_pass(Ssa::remove_enable_side_effects, "EnableSideEffectsIf removal") - .run_pass(Ssa::fold_constants_using_constraints, "Constraint Folding") - .run_pass(Ssa::dead_instruction_elimination, "Dead Instruction Elimination (1st)") - .run_pass(Ssa::simplify_cfg, "Simplifying:") - .run_pass(Ssa::array_set_optimization, "Array Set Optimizations") - .finish(); + )?; - let ssa_level_warnings = if options.skip_underconstrained_check { - vec![] - } else { - time("After Check for Underconstrained Values", options.print_codegen_timings, || { - ssa.check_for_underconstrained_values() - }) + let mut ssa = optimize_all(builder, options)?; + + let mut ssa_level_warnings = vec![]; + + if !options.skip_underconstrained_check { + ssa_level_warnings.extend(time( + "After Check for Underconstrained Values", + options.print_codegen_timings, + || ssa.check_for_underconstrained_values(), + )); + } + + if !options.skip_brillig_constraints_check { + ssa_level_warnings.extend(time( + "After Check for Missing Brillig Call Constraints", + options.print_codegen_timings, + || ssa.check_for_missing_brillig_constraints(), + )); }; drop(ssa_gen_span_guard); @@ -173,9 +148,54 @@ pub(crate) fn optimize_into_acir( let artifacts = time("SSA to ACIR", options.print_codegen_timings, || { ssa.into_acir(&brillig, options.expression_width) })?; + Ok(ArtifactsAndWarnings(artifacts, ssa_level_warnings)) } +/// Run all SSA passes. +fn optimize_all(builder: SsaBuilder, options: &SsaEvaluatorOptions) -> Result { + Ok(builder + .run_pass(Ssa::defunctionalize, "Defunctionalization") + .run_pass(Ssa::remove_paired_rc, "Removing Paired rc_inc & rc_decs") + .run_pass(Ssa::separate_runtime, "Runtime Separation") + .run_pass(Ssa::resolve_is_unconstrained, "Resolving IsUnconstrained") + .run_pass(|ssa| ssa.inline_functions(options.inliner_aggressiveness), "Inlining (1st)") + // Run mem2reg with the CFG separated into blocks + .run_pass(Ssa::mem2reg, "Mem2Reg (1st)") + .run_pass(Ssa::simplify_cfg, "Simplifying (1st)") + .run_pass(Ssa::as_slice_optimization, "`as_slice` optimization") + .try_run_pass( + Ssa::evaluate_static_assert_and_assert_constant, + "`static_assert` and `assert_constant`", + )? + .run_pass(Ssa::loop_invariant_code_motion, "Loop Invariant Code Motion") + .try_run_pass( + |ssa| ssa.unroll_loops_iteratively(options.max_bytecode_increase_percent), + "Unrolling", + )? + .run_pass(Ssa::simplify_cfg, "Simplifying (2nd)") + .run_pass(Ssa::flatten_cfg, "Flattening") + .run_pass(Ssa::remove_bit_shifts, "After Removing Bit Shifts") + // Run mem2reg once more with the flattened CFG to catch any remaining loads/stores + .run_pass(Ssa::mem2reg, "Mem2Reg (2nd)") + // Run the inlining pass again to handle functions with `InlineType::NoPredicates`. + // Before flattening is run, we treat functions marked with the `InlineType::NoPredicates` as an entry point. + // This pass must come immediately following `mem2reg` as the succeeding passes + // may create an SSA which inlining fails to handle. + .run_pass( + |ssa| ssa.inline_functions_with_no_predicates(options.inliner_aggressiveness), + "Inlining (2nd)", + ) + .run_pass(Ssa::remove_if_else, "Remove IfElse") + .run_pass(Ssa::fold_constants, "Constant Folding") + .run_pass(Ssa::remove_enable_side_effects, "EnableSideEffectsIf removal") + .run_pass(Ssa::fold_constants_using_constraints, "Constraint Folding") + .run_pass(Ssa::dead_instruction_elimination, "Dead Instruction Elimination (1st)") + .run_pass(Ssa::simplify_cfg, "Simplifying:") + .run_pass(Ssa::array_set_optimization, "Array Set Optimizations") + .finish()) +} + // Helper to time SSA passes fn time(name: &str, print_timings: bool, f: impl FnOnce() -> T) -> T { let start_time = chrono::Utc::now().time(); @@ -449,7 +469,7 @@ impl SsaBuilder { } fn finish(self) -> Ssa { - self.ssa + self.ssa.generate_entry_point_index() } /// Runs the given SSA pass and prints the SSA afterward if `print_ssa_passes` is true. diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs index 7a4e336c33e..48be8eb7ad8 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/checks/check_for_underconstrained_values.rs @@ -1,27 +1,30 @@ -//! This module defines an SSA pass that detects if the final function has any subgraphs independent from inputs and outputs. -//! If this is the case, then part of the final circuit can be completely replaced by any other passing circuit, since there are no constraints ensuring connections. -//! So the compiler informs the developer of this as a bug +//! This module defines security SSA passes detecting constraint problems leading to possible +//! soundness vulnerabilities. +//! The compiler informs the developer of these as bugs. use crate::errors::{InternalBug, SsaReport}; use crate::ssa::ir::basic_block::BasicBlockId; use crate::ssa::ir::function::RuntimeType; use crate::ssa::ir::function::{Function, FunctionId}; -use crate::ssa::ir::instruction::{Instruction, InstructionId, Intrinsic}; +use crate::ssa::ir::instruction::{Hint, Instruction, InstructionId, Intrinsic}; use crate::ssa::ir::value::{Value, ValueId}; use crate::ssa::ssa_gen::Ssa; use im::HashMap; use rayon::prelude::*; use std::collections::{BTreeMap, HashSet}; +use tracing::trace; impl Ssa { - /// Go through each top-level non-brillig function and detect if it has independent subgraphs + /// This function provides an SSA pass that detects if the final function has any subgraphs independent from inputs and outputs. + /// If this is the case, then part of the final circuit can be completely replaced by any other passing circuit, since there are no constraints ensuring connections. + /// Go through each top-level non-Brillig function and detect if it has independent subgraphs #[tracing::instrument(level = "trace", skip(self))] pub(crate) fn check_for_underconstrained_values(&mut self) -> Vec { - let functions_id = self.functions.values().map(|f| f.id().to_usize()).collect::>(); - functions_id - .iter() + self.functions + .values() + .map(|f| f.id()) .par_bridge() .flat_map(|fid| { - let function_to_process = &self.functions[&FunctionId::new(*fid)]; + let function_to_process = &self.functions[&fid]; match function_to_process.runtime() { RuntimeType::Acir { .. } => check_for_underconstrained_values_within_function( function_to_process, @@ -32,6 +35,32 @@ impl Ssa { }) .collect() } + + /// Detect Brillig calls left unconstrained with manual asserts + /// and return a vector of bug reports if any have been found + pub(crate) fn check_for_missing_brillig_constraints(&mut self) -> Vec { + // Skip the check if there are no Brillig functions involved + if !self.functions.values().any(|func| func.runtime().is_brillig()) { + return vec![]; + }; + + self.functions + .values() + .map(|f| f.id()) + .par_bridge() + .flat_map(|fid| { + let function_to_process = &self.functions[&fid]; + match function_to_process.runtime() { + RuntimeType::Acir { .. } => { + let mut context = DependencyContext::default(); + context.build(function_to_process, &self.functions); + context.collect_warnings(function_to_process) + } + RuntimeType::Brillig(_) => Vec::new(), + } + }) + .collect() + } } /// Detect independent subgraphs (not connected to function inputs or outputs) and return a vector of bug reports if some are found @@ -63,6 +92,346 @@ fn check_for_underconstrained_values_within_function( } warnings } + +#[derive(Default)] +struct DependencyContext { + visited_blocks: HashSet, + block_queue: Vec, + // Map keeping track of values stored at memory locations + memory_slots: HashMap, + // Map of values resulting from array get instructions + // to the actual array values + array_elements: HashMap, + // Map of brillig call ids to sets of the value ids descending + // from their arguments and results + tainted: HashMap, +} + +/// Structure keeping track of value ids descending from Brillig calls' +/// arguments and results, also storing information on results +/// already properly constrained +#[derive(Clone, Debug)] +struct BrilligTaintedIds { + // Argument descendant value ids + arguments: HashSet, + // Results status + results: Vec, + // Initial result value ids + root_results: HashSet, +} + +#[derive(Clone, Debug)] +enum ResultStatus { + // Keep track of descendants until found constrained + Unconstrained { descendants: HashSet }, + Constrained, +} + +impl BrilligTaintedIds { + fn new(arguments: &[ValueId], results: &[ValueId]) -> Self { + BrilligTaintedIds { + arguments: HashSet::from_iter(arguments.iter().copied()), + results: results + .iter() + .map(|result| ResultStatus::Unconstrained { descendants: HashSet::from([*result]) }) + .collect(), + root_results: HashSet::from_iter(results.iter().copied()), + } + } + + /// Add children of a given parent to the tainted value set + /// (for arguments one set is enough, for results we keep them + /// separate as the forthcoming check considers the call covered + /// if all the results were properly covered) + fn update_children(&mut self, parents: &HashSet, children: &[ValueId]) { + if self.arguments.intersection(parents).next().is_some() { + self.arguments.extend(children); + } + for result_status in &mut self.results.iter_mut() { + match result_status { + // Skip updating results already found covered + ResultStatus::Constrained => { + continue; + } + ResultStatus::Unconstrained { descendants } => { + if descendants.intersection(parents).next().is_some() { + descendants.extend(children); + } + } + } + } + } + + /// If Brillig call is properly constrained by the given ids, return true + fn check_constrained(&self) -> bool { + // If every result has now been constrained, + // consider the call properly constrained + self.results.iter().all(|result| matches!(result, ResultStatus::Constrained)) + } + + /// Remember partial constraints (involving some of the results and an argument) + /// along the way to take them into final consideration + /// Generally, a valid partial constraint should link up a result descendant + /// and an argument descendant, although there are also edge cases mentioned below. + fn store_partial_constraints(&mut self, constrained_values: &HashSet) { + let mut results_involved: Vec = vec![]; + + // For a valid partial constraint, a value descending from + // one of the results should be constrained + for (i, result_status) in self.results.iter().enumerate() { + match result_status { + // Skip checking already covered results + ResultStatus::Constrained => { + continue; + } + ResultStatus::Unconstrained { descendants } => { + if descendants.intersection(constrained_values).next().is_some() { + results_involved.push(i); + } + } + } + } + + // Along with it, one of the argument descendants should be constrained + // (skipped if there were no arguments, or if an actual result and not a + // descendant has been constrained _alone_, e.g. against a constant) + if !results_involved.is_empty() + && (self.arguments.is_empty() + || (constrained_values.len() == 1 + && self.root_results.intersection(constrained_values).next().is_some()) + || self.arguments.intersection(constrained_values).next().is_some()) + { + // Remember the partial constraint, clearing the sets + results_involved.iter().for_each(|i| self.results[*i] = ResultStatus::Constrained); + } + } +} + +impl DependencyContext { + /// Build the dependency context of variable ValueIds, storing + /// information on value ids involved in unchecked Brillig calls + fn build(&mut self, function: &Function, all_functions: &BTreeMap) { + self.block_queue.push(function.entry_block()); + while let Some(block) = self.block_queue.pop() { + if self.visited_blocks.contains(&block) { + continue; + } + self.visited_blocks.insert(block); + self.process_instructions(block, function, all_functions); + } + } + + /// Go over the given block tracking Brillig calls and checking them against + /// following constraints + fn process_instructions( + &mut self, + block: BasicBlockId, + function: &Function, + all_functions: &BTreeMap, + ) { + trace!("processing instructions of block {} of function {}", block, function.id()); + + for instruction in function.dfg[block].instructions() { + let mut arguments = Vec::new(); + let mut results = Vec::new(); + + // Collect non-constant instruction arguments + function.dfg[*instruction].for_each_value(|value_id| { + if function.dfg.get_numeric_constant(value_id).is_none() { + arguments.push(function.dfg.resolve(value_id)); + } + }); + + // Collect non-constant instruction results + for value_id in function.dfg.instruction_results(*instruction).iter() { + if function.dfg.get_numeric_constant(*value_id).is_none() { + results.push(function.dfg.resolve(*value_id)); + } + } + + // Process instructions + match &function.dfg[*instruction] { + // For memory operations, we have to link up the stored value as a parent + // of one loaded from the same memory slot + Instruction::Store { address, value } => { + self.memory_slots.insert(*address, function.dfg.resolve(*value)); + } + Instruction::Load { address } => { + // Recall the value stored at address as parent for the results + if let Some(value_id) = self.memory_slots.get(address) { + self.update_children(&[*value_id], &results); + } else { + panic!("load instruction {} has attempted to access previously unused memory location", + instruction); + } + } + // Check the constrain instruction arguments against those + // involved in Brillig calls, remove covered calls + Instruction::Constrain(value_id1, value_id2, _) => { + self.clear_constrained( + &[function.dfg.resolve(*value_id1), function.dfg.resolve(*value_id2)], + function, + ); + } + // Consider range check to also be constraining + Instruction::RangeCheck { value, .. } => { + self.clear_constrained(&[function.dfg.resolve(*value)], function); + } + Instruction::Call { func: func_id, .. } => { + // For functions, we remove the first element of arguments, + // as .for_each_value() used previously also includes func_id + arguments.remove(0); + + match &function.dfg[*func_id] { + Value::Intrinsic(intrinsic) => match intrinsic { + Intrinsic::ApplyRangeConstraint | Intrinsic::AssertConstant => { + // Consider these intrinsic arguments constrained + self.clear_constrained(&arguments, function); + } + Intrinsic::AsWitness | Intrinsic::IsUnconstrained => { + // These intrinsics won't affect the dependency graph + } + Intrinsic::ArrayLen + | Intrinsic::ArrayRefCount + | Intrinsic::ArrayAsStrUnchecked + | Intrinsic::AsField + | Intrinsic::AsSlice + | Intrinsic::BlackBox(..) + | Intrinsic::DerivePedersenGenerators + | Intrinsic::FromField + | Intrinsic::Hint(..) + | Intrinsic::SlicePushBack + | Intrinsic::SlicePushFront + | Intrinsic::SlicePopBack + | Intrinsic::SlicePopFront + | Intrinsic::SliceRefCount + | Intrinsic::SliceInsert + | Intrinsic::SliceRemove + | Intrinsic::StaticAssert + | Intrinsic::StrAsBytes + | Intrinsic::ToBits(..) + | Intrinsic::ToRadix(..) + | Intrinsic::FieldLessThan => { + // Record all the function arguments as parents of the results + self.update_children(&arguments, &results); + } + }, + Value::Function(callee) => match all_functions[&callee].runtime() { + RuntimeType::Brillig(_) => { + // Record arguments/results for each Brillig call for the check + + self.tainted.insert( + *instruction, + BrilligTaintedIds::new(&arguments, &results), + ); + } + RuntimeType::Acir(..) => { + // Record all the function arguments as parents of the results + self.update_children(&arguments, &results); + } + }, + Value::ForeignFunction(..) => { + panic!("should not be able to reach foreign function from non-Brillig functions, {func_id} in function {}", function.name()); + } + Value::Instruction { .. } + | Value::NumericConstant { .. } + | Value::Param { .. } => { + panic!( + "calling non-function value with ID {func_id} in function {}", + function.name() + ); + } + } + } + // For array get operations, we link the resulting values to + // the corresponding array value ids + // (this is required later because for now we consider array elements + // being constrained as valid as the whole arrays being constrained) + Instruction::ArrayGet { array, .. } => { + for result in &results { + self.array_elements.insert(*result, function.dfg.resolve(*array)); + } + // Record all the used arguments as parents of the results + self.update_children(&arguments, &results); + } + Instruction::ArraySet { .. } + | Instruction::Binary(..) + | Instruction::Cast(..) + | Instruction::IfElse { .. } + | Instruction::Not(..) + | Instruction::Truncate { .. } => { + // Record all the used arguments as parents of the results + self.update_children(&arguments, &results); + } + // These instructions won't affect the dependency graph + Instruction::Allocate { .. } + | Instruction::DecrementRc { .. } + | Instruction::EnableSideEffectsIf { .. } + | Instruction::IncrementRc { .. } + | Instruction::MakeArray { .. } => {} + } + } + + trace!("Number tainted Brillig calls: {}", self.tainted.len()); + } + + /// Every Brillig call not properly constrained should remain in the tainted set + /// at this point. For each, emit a corresponding warning. + fn collect_warnings(&mut self, function: &Function) -> Vec { + let warnings: Vec = self + .tainted + .keys() + .map(|brillig_call| { + SsaReport::Bug(InternalBug::UncheckedBrilligCall { + call_stack: function.dfg.get_instruction_call_stack(*brillig_call), + }) + }) + .collect(); + + trace!( + "making {} under constrained reports for function {}", + warnings.len(), + function.name() + ); + warnings + } + + /// Update sets of value ids that can be traced back to the Brillig calls being tracked + fn update_children(&mut self, parents: &[ValueId], children: &[ValueId]) { + let parents: HashSet<_> = HashSet::from_iter(parents.iter().copied()); + for (_, tainted_ids) in self.tainted.iter_mut() { + tainted_ids.update_children(&parents, children); + } + } + + /// Check if any of the recorded Brillig calls have been properly constrained + /// by given values after recording partial constraints, if so stop tracking them + fn clear_constrained(&mut self, constrained_values: &[ValueId], function: &Function) { + // Remove numeric constants + let constrained_values = + constrained_values.iter().filter(|v| function.dfg.get_numeric_constant(**v).is_none()); + + // For now, consider array element constraints to be array constraints + // TODO(https://github.com/noir-lang/noir/issues/6698): + // This probably has to be further looked into, to ensure _every_ element + // of an array result of a Brillig call has been constrained + let constrained_values: HashSet<_> = constrained_values + .map(|v| { + if let Some(parent_array) = self.array_elements.get(v) { + *parent_array + } else { + *v + } + }) + .collect(); + + self.tainted.iter_mut().for_each(|(_, tainted_ids)| { + tainted_ids.store_partial_constraints(&constrained_values); + }); + self.tainted.retain(|_, tainted_ids| !tainted_ids.check_constrained()); + } +} + #[derive(Default)] struct Context { visited_blocks: HashSet, @@ -75,7 +444,7 @@ struct Context { impl Context { /// Compute sets of variable ValueIds that are connected with constraints /// - /// Additionally, store information about brillig calls in the context + /// Additionally, store information about Brillig calls in the context fn compute_sets_of_connected_value_ids( &mut self, function: &Function, @@ -122,7 +491,7 @@ impl Context { connected_sets_indices } - /// Find which brillig calls separate this set from others and return bug warnings about them + /// Find which Brillig calls separate this set from others and return bug warnings about them fn find_disconnecting_brillig_calls_with_results_in_set( &self, current_set: &HashSet, @@ -133,7 +502,7 @@ impl Context { // Find brillig-generated values in the set let intersection = all_brillig_generated_values.intersection(current_set).copied(); - // Go through all brillig outputs in the set + // Go through all Brillig outputs in the set for brillig_output_in_set in intersection { // Get the inputs that correspond to the output let inputs: HashSet = @@ -145,7 +514,7 @@ impl Context { // There is a value not in the set, which means that the inputs/outputs of this call have not been properly constrained if unused_inputs { warnings.push(SsaReport::Bug(InternalBug::IndependentSubgraph { - call_stack: function.dfg.get_call_stack( + call_stack: function.dfg.get_instruction_call_stack( self.brillig_return_to_instruction_id[&brillig_output_in_set], ), })); @@ -155,7 +524,7 @@ impl Context { } /// Go through each instruction in the block and add a set of ValueIds connected through that instruction /// - /// Additionally, this function adds mappings of brillig return values to call arguments and instruction ids from calls to brillig functions in the block + /// Additionally, this function adds mappings of Brillig return values to call arguments and instruction ids from calls to Brillig functions in the block fn connect_value_ids_in_block( &mut self, function: &Function, @@ -209,6 +578,7 @@ impl Context { | Intrinsic::AsField | Intrinsic::AsSlice | Intrinsic::BlackBox(..) + | Intrinsic::Hint(Hint::BlackBox) | Intrinsic::DerivePedersenGenerators | Intrinsic::FromField | Intrinsic::SliceInsert @@ -228,7 +598,7 @@ impl Context { }, Value::Function(callee) => match all_functions[&callee].runtime() { RuntimeType::Brillig(_) => { - // For calls to brillig functions we memorize the mapping of results to argument ValueId's and InstructionId's + // For calls to Brillig functions we memorize the mapping of results to argument ValueId's and InstructionId's // The latter are needed to produce the callstack later for result in function.dfg.instruction_results(*instruction).iter().filter( @@ -248,7 +618,7 @@ impl Context { } }, Value::ForeignFunction(..) => { - panic!("Should not be able to reach foreign function from non-brillig functions, {func_id} in function {}", function.name()); + panic!("Should not be able to reach foreign function from non-Brillig functions, {func_id} in function {}", function.name()); } Value::Instruction { .. } | Value::NumericConstant { .. } @@ -354,83 +724,297 @@ impl Context { } #[cfg(test)] mod test { - use noirc_frontend::monomorphization::ast::InlineType; - - use crate::ssa::{ - function_builder::FunctionBuilder, - ir::{instruction::BinaryOp, map::Id, types::Type}, - }; + use crate::ssa::Ssa; + use tracing_test::traced_test; #[test] + #[traced_test] /// Test that a connected function raises no warnings fn test_simple_connected_function() { - // fn main { - // b0(v0: Field, v1: Field): - // v2 = add v0, 1 - // v3 = mul v1, 2 - // v4 = eq v2, v3 - // return v2 - // } - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - let v0 = builder.add_parameter(Type::field()); - let v1 = builder.add_parameter(Type::field()); - - let one = builder.field_constant(1u128); - let two = builder.field_constant(2u128); - - let v2 = builder.insert_binary(v0, BinaryOp::Add, one); - let v3 = builder.insert_binary(v1, BinaryOp::Mul, two); - let _v4 = builder.insert_binary(v2, BinaryOp::Eq, v3); - builder.terminate_with_return(vec![v2]); - - let mut ssa = builder.finish(); + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field, v1: Field): + v2 = add v0, Field 1 + v3 = mul v1, Field 2 + v4 = eq v2, v3 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_underconstrained_values(); assert_eq!(ssa_level_warnings.len(), 0); } #[test] - /// Test where the results of a call to a brillig function are not connected to main function inputs or outputs + #[traced_test] + /// Test where the results of a call to a Brillig function are not connected to main function inputs or outputs /// This should be detected. fn test_simple_function_with_disconnected_part() { - // unconstrained fn br(v0: Field, v1: Field){ - // v2 = add v0, v1 - // return v2 - // } - // - // fn main { - // b0(v0: Field, v1: Field): - // v2 = add v0, 1 - // v3 = mul v1, 2 - // v4 = call br(v2, v3) - // v5 = add v4, 2 - // return - // } - let main_id = Id::test_new(0); - let mut builder = FunctionBuilder::new("main".into(), main_id); - let v0 = builder.add_parameter(Type::field()); - let v1 = builder.add_parameter(Type::field()); - - let one = builder.field_constant(1u128); - let two = builder.field_constant(2u128); - - let v2 = builder.insert_binary(v0, BinaryOp::Add, one); - let v3 = builder.insert_binary(v1, BinaryOp::Mul, two); - - let br_function_id = Id::test_new(1); - let br_function = builder.import_function(br_function_id); - let v4 = builder.insert_call(br_function, vec![v2, v3], vec![Type::field()])[0]; - let v5 = builder.insert_binary(v4, BinaryOp::Add, two); - builder.insert_constrain(v5, one, None); - builder.terminate_with_return(vec![]); - - builder.new_brillig_function("br".into(), br_function_id, InlineType::default()); - let v0 = builder.add_parameter(Type::field()); - let v1 = builder.add_parameter(Type::field()); - let v2 = builder.insert_binary(v0, BinaryOp::Add, v1); - builder.terminate_with_return(vec![v2]); - let mut ssa = builder.finish(); + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field, v1: Field): + v2 = add v0, Field 1 + v3 = mul v1, Field 2 + v4 = call f1(v2, v3) -> Field + v5 = add v4, Field 2 + return + } + + brillig(inline) fn br f1 { + b0(v0: Field, v1: Field): + v2 = add v0, v1 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); let ssa_level_warnings = ssa.check_for_underconstrained_values(); assert_eq!(ssa_level_warnings.len(), 1); } + + #[test] + #[traced_test] + /// Test where a call to a Brillig function is left unchecked with a later assert, + /// by example of the program illustrating issue #5425 (simplified variant). + fn test_underconstrained_value_detector_5425() { + /* + unconstrained fn maximum_price(options: [u32; 2]) -> u32 { + let mut maximum_option = options[0]; + if (options[1] > options[0]) { + maximum_option = options[1]; + } + maximum_option + } + + fn main(sandwiches: pub [u32; 2], drinks: pub [u32; 2], best_value: u32) { + let most_expensive_sandwich = maximum_price(sandwiches); + let mut sandwich_exists = false; + sandwich_exists |= (sandwiches[0] == most_expensive_sandwich); + sandwich_exists |= (sandwiches[1] == most_expensive_sandwich); + assert(sandwich_exists); + + let most_expensive_drink = maximum_price(drinks); + assert( + best_value + == (most_expensive_sandwich + most_expensive_drink) + ); + } + */ + + // The Brillig function is fake, for simplicity's sake + + let program = r#" + acir(inline) fn main f0 { + b0(v4: [u32; 2], v5: [u32; 2], v6: u32): + inc_rc v4 + inc_rc v5 + v8 = call f1(v4) -> u32 + v9 = allocate -> &mut u32 + store u1 0 at v9 + v10 = load v9 -> u1 + v11 = array_get v4, index u32 0 -> u32 + v12 = eq v11, v8 + v13 = or v10, v12 + store v13 at v9 + v14 = load v9 -> u1 + v15 = array_get v4, index u32 1 -> u32 + v16 = eq v15, v8 + v17 = or v14, v16 + store v17 at v9 + v18 = load v9 -> u1 + constrain v18 == u1 1 + v19 = call f1(v5) -> u32 + v20 = add v8, v19 + constrain v6 == v20 + dec_rc v4 + dec_rc v5 + return + } + + brillig(inline) fn maximum_price f1 { + b0(v0: [u32; 2]): + v2 = array_get v0, index u32 0 -> u32 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 1); + } + + #[test] + #[traced_test] + /// Test where a call to a Brillig function returning multiple result values + /// is left unchecked with a later assert involving all the results + fn test_unchecked_multiple_results_brillig() { + // First call is constrained properly, involving both results + // Second call is insufficiently constrained, involving only one of the results + // The Brillig function is fake, for simplicity's sake + let program = r#" + acir(inline) fn main f0 { + b0(v0: u32): + v2, v3 = call f1(v0) -> (u32, u32) + v4 = mul v2, v3 + constrain v4 == v0 + v5, v6 = call f1(v0) -> (u32, u32) + v7 = mul v5, v5 + constrain v7 == v0 + return + } + + brillig(inline) fn factor f1 { + b0(v0: u32): + return u32 0, u32 0 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 1); + } + + #[test] + #[traced_test] + /// Test where a Brillig function is called with a constant argument + /// (should _not_ lead to a false positive failed check + /// if all the results are constrained) + fn test_checked_brillig_with_constant_arguments() { + // The call is constrained properly, involving both results + // (but the argument to the Brillig is a constant) + // The Brillig function is fake, for simplicity's sake + + let program = r#" + acir(inline) fn main f0 { + b0(v0: u32): + v3, v4 = call f1(Field 7) -> (u32, u32) + v5 = mul v3, v4 + constrain v5 == v0 + return + } + + brillig(inline) fn factor f1 { + b0(v0: Field): + return u32 0, u32 0 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 0); + } + + #[test] + #[traced_test] + /// Test where a Brillig function call is constrained with a range check + /// (should _not_ lead to a false positive failed check) + fn test_range_checked_brillig() { + // The call is constrained properly with a range check, involving + // both Brillig call argument and result + // The Brillig function is fake, for simplicity's sake + + let program = r#" + acir(inline) fn main f0 { + b0(v0: u32): + v2 = call f1(v0) -> u32 + v3 = add v2, v0 + range_check v3 to 32 bits + return + } + + brillig(inline) fn dummy f1 { + b0(v0: u32): + return u32 0 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 0); + } + + #[test] + #[traced_test] + /// Test where a Brillig nested type result is insufficiently constrained + /// (with a field constraint missing) + fn test_nested_type_result_brillig() { + /* + struct Animal { + legs: Field, + eyes: u8, + tag: Tag, + } + + struct Tag { + no: Field, + } + + unconstrained fn foo(bar: Field) -> Animal { + Animal { + legs: 4, + eyes: 2, + tag: Tag { no: bar } + } + } + + fn main(x: Field) -> pub Animal { + let dog = foo(x); + assert(dog.legs == 4); + assert(dog.tag.no == x); + + dog + } + */ + + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field): + v2, v3, v4 = call f1(v0) -> (Field, u8, Field) + v6 = eq v2, Field 4 + constrain v2 == Field 4 + v10 = eq v4, v0 + constrain v4 == v0 + return v2, v3, v4 + } + + brillig(inline) fn foo f1 { + b0(v0: Field): + return Field 4, u8 2, v0 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 1); + } + + #[test] + #[traced_test] + /// Test where Brillig calls' root result values are constrained against + /// each other (covers a false negative edge case) + /// (https://github.com/noir-lang/noir/pull/6658#pullrequestreview-2482170066) + fn test_root_result_intersection_false_negative() { + let program = r#" + acir(inline) fn main f0 { + b0(v0: Field, v1: Field): + v3 = call f1(v0, v1) -> Field + v5 = call f1(v0, v1) -> Field + v6 = eq v3, v5 + constrain v3 == v5 + v8 = add v3, v5 + return v8 + } + + brillig(inline) fn foo f1 { + b0(v0: Field, v1: Field): + v2 = add v0, v1 + return v2 + } + "#; + + let mut ssa = Ssa::from_str(program).unwrap(); + let ssa_level_warnings = ssa.check_for_missing_brillig_constraints(); + assert_eq!(ssa_level_warnings.len(), 2); + } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs index bd2585a3bfa..48af34d466c 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/data_bus.rs @@ -1,6 +1,10 @@ use std::{collections::BTreeMap, sync::Arc}; -use crate::ssa::ir::{function::RuntimeType, types::Type, value::ValueId}; +use crate::ssa::ir::{ + function::RuntimeType, + types::{NumericType, Type}, + value::ValueId, +}; use acvm::FieldElement; use fxhash::FxHashMap as HashMap; use noirc_frontend::ast; @@ -90,6 +94,20 @@ impl DataBus { DataBus { call_data, return_data: self.return_data.map(&mut f) } } + /// Updates the databus values in place with the provided function + pub(crate) fn map_values_mut(&mut self, mut f: impl FnMut(ValueId) -> ValueId) { + for cd in self.call_data.iter_mut() { + cd.array_id = f(cd.array_id); + + // Can't mutate a hashmap's keys so we need to collect into a new one. + cd.index_map = cd.index_map.iter().map(|(k, v)| (f(*k), *v)).collect(); + } + + if let Some(data) = self.return_data.as_mut() { + *data = f(*data); + } + } + pub(crate) fn call_data_array(&self) -> Vec<(u32, ValueId)> { self.call_data.iter().map(|cd| (cd.call_data_id, cd.array_id)).collect() } @@ -115,7 +133,7 @@ impl FunctionBuilder { /// Insert a value into a data bus builder fn add_to_data_bus(&mut self, value: ValueId, databus: &mut DataBusBuilder) { assert!(databus.databus.is_none(), "initializing finalized call data"); - let typ = self.current_function.dfg[value].get_type().clone(); + let typ = self.current_function.dfg[value].get_type().into_owned(); match typ { Type::Numeric(_) => { databus.values.push_back(value); @@ -128,10 +146,10 @@ impl FunctionBuilder { for _i in 0..len { for subitem_typ in typ.iter() { // load each element of the array, and add it to the databus - let index_var = self - .current_function - .dfg - .make_constant(FieldElement::from(index as i128), Type::length_type()); + let length_type = NumericType::length_type(); + let index_var = FieldElement::from(index as i128); + let index_var = + self.current_function.dfg.make_constant(index_var, length_type); let element = self.insert_array_get(value, index_var, subitem_typ.clone()); index += match subitem_typ { Type::Array(_, _) | Type::Slice(_) => subitem_typ.element_size(), diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/mod.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/mod.rs index 0ae61404442..855034cedd2 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/mod.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/function_builder/mod.rs @@ -18,9 +18,11 @@ use crate::ssa::ir::{ use super::{ ir::{ basic_block::BasicBlock, - dfg::{CallStack, InsertInstructionResult}, + call_stack::{CallStack, CallStackId}, + dfg::InsertInstructionResult, function::RuntimeType, instruction::{ConstrainError, InstructionId, Intrinsic}, + types::NumericType, }, ssa_gen::Ssa, }; @@ -33,10 +35,10 @@ use super::{ /// Contrary to the name, this struct has the capacity to build as many /// functions as needed, although it is limited to one function at a time. pub(crate) struct FunctionBuilder { - pub(super) current_function: Function, + pub(crate) current_function: Function, current_block: BasicBlockId, finished_functions: Vec, - call_stack: CallStack, + call_stack: CallStackId, error_types: BTreeMap, } @@ -52,7 +54,7 @@ impl FunctionBuilder { current_block: new_function.entry_block(), current_function: new_function, finished_functions: Vec::new(), - call_stack: CallStack::new(), + call_stack: CallStackId::root(), error_types: BTreeMap::default(), } } @@ -77,11 +79,14 @@ impl FunctionBuilder { function_id: FunctionId, runtime_type: RuntimeType, ) { + let call_stack = self.current_function.dfg.get_call_stack(self.call_stack); let mut new_function = Function::new(name, function_id); new_function.set_runtime(runtime_type); self.current_block = new_function.entry_block(); - let old_function = std::mem::replace(&mut self.current_function, new_function); + // Copy the call stack to the new function + self.call_stack = + self.current_function.dfg.call_stack_data.get_or_insert_locations(call_stack); self.finished_functions.push(old_function); } @@ -122,19 +127,19 @@ impl FunctionBuilder { pub(crate) fn numeric_constant( &mut self, value: impl Into, - typ: Type, + typ: NumericType, ) -> ValueId { self.current_function.dfg.make_constant(value.into(), typ) } /// Insert a numeric constant into the current function of type Field pub(crate) fn field_constant(&mut self, value: impl Into) -> ValueId { - self.numeric_constant(value.into(), Type::field()) + self.numeric_constant(value.into(), NumericType::NativeField) } /// Insert a numeric constant into the current function of type Type::length_type() pub(crate) fn length_constant(&mut self, value: impl Into) -> ValueId { - self.numeric_constant(value.into(), Type::length_type()) + self.numeric_constant(value.into(), NumericType::length_type()) } /// Returns the type of the given value. @@ -170,7 +175,7 @@ impl FunctionBuilder { instruction, block, ctrl_typevars, - self.call_stack.clone(), + self.call_stack, ) } @@ -195,17 +200,17 @@ impl FunctionBuilder { } pub(crate) fn set_location(&mut self, location: Location) -> &mut FunctionBuilder { - self.call_stack = im::Vector::unit(location); + self.call_stack = self.current_function.dfg.call_stack_data.add_location_to_root(location); self } - pub(crate) fn set_call_stack(&mut self, call_stack: CallStack) -> &mut FunctionBuilder { + pub(crate) fn set_call_stack(&mut self, call_stack: CallStackId) -> &mut FunctionBuilder { self.call_stack = call_stack; self } pub(crate) fn get_call_stack(&self) -> CallStack { - self.call_stack.clone() + self.current_function.dfg.get_call_stack(self.call_stack) } /// Insert a Load instruction at the end of the current block, loading from the given address @@ -251,7 +256,7 @@ impl FunctionBuilder { /// Insert a cast instruction at the end of the current block. /// Returns the result of the cast instruction. - pub(crate) fn insert_cast(&mut self, value: ValueId, typ: Type) -> ValueId { + pub(crate) fn insert_cast(&mut self, value: ValueId, typ: NumericType) -> ValueId { self.insert_instruction(Instruction::Cast(value, typ), None).first() } @@ -377,7 +382,7 @@ impl FunctionBuilder { destination: BasicBlockId, arguments: Vec, ) { - let call_stack = self.call_stack.clone(); + let call_stack = self.call_stack; self.terminate_block_with(TerminatorInstruction::Jmp { destination, arguments, @@ -393,7 +398,7 @@ impl FunctionBuilder { then_destination: BasicBlockId, else_destination: BasicBlockId, ) { - let call_stack = self.call_stack.clone(); + let call_stack = self.call_stack; self.terminate_block_with(TerminatorInstruction::JmpIf { condition, then_destination, @@ -404,7 +409,7 @@ impl FunctionBuilder { /// Terminate the current block with a return instruction pub(crate) fn terminate_with_return(&mut self, return_values: Vec) { - let call_stack = self.call_stack.clone(); + let call_stack = self.call_stack; self.terminate_block_with(TerminatorInstruction::Return { return_values, call_stack }); } @@ -526,7 +531,7 @@ mod tests { use crate::ssa::ir::{ instruction::{Endian, Intrinsic}, map::Id, - types::Type, + types::{NumericType, Type}, }; use super::FunctionBuilder; @@ -538,12 +543,12 @@ mod tests { // let bits: [u1; 8] = x.to_le_bits(); let func_id = Id::test_new(0); let mut builder = FunctionBuilder::new("func".into(), func_id); - let one = builder.numeric_constant(FieldElement::one(), Type::bool()); - let zero = builder.numeric_constant(FieldElement::zero(), Type::bool()); + let one = builder.numeric_constant(FieldElement::one(), NumericType::bool()); + let zero = builder.numeric_constant(FieldElement::zero(), NumericType::bool()); let to_bits_id = builder.import_intrinsic_id(Intrinsic::ToBits(Endian::Little)); - let input = builder.numeric_constant(FieldElement::from(7_u128), Type::field()); - let length = builder.numeric_constant(FieldElement::from(8_u128), Type::field()); + let input = builder.field_constant(FieldElement::from(7_u128)); + let length = builder.field_constant(FieldElement::from(8_u128)); let result_types = vec![Type::Array(Arc::new(vec![Type::bool()]), 8)]; let call_results = builder.insert_call(to_bits_id, vec![input, length], result_types).into_owned(); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/basic_block.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/basic_block.rs index a7c637dedd0..b2a923c6a51 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/basic_block.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/basic_block.rs @@ -1,5 +1,5 @@ use super::{ - dfg::CallStack, + call_stack::CallStackId, instruction::{InstructionId, TerminatorInstruction}, map::Id, value::ValueId, @@ -123,7 +123,7 @@ impl BasicBlock { terminator, TerminatorInstruction::Return { return_values: Vec::new(), - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }, ) } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/call_stack.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/call_stack.rs new file mode 100644 index 00000000000..113609f4a11 --- /dev/null +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/call_stack.rs @@ -0,0 +1,128 @@ +use fxhash::FxHashMap; +use serde::{Deserialize, Serialize}; + +use noirc_errors::Location; + +pub(crate) type CallStack = im::Vector; + +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub(crate) struct CallStackId(u32); + +impl CallStackId { + pub(crate) fn root() -> Self { + Self::new(0) + } + + fn new(id: usize) -> Self { + Self(id as u32) + } + + pub(crate) fn index(&self) -> usize { + self.0 as usize + } + + pub(crate) fn is_root(&self) -> bool { + self.0 == 0 + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub(crate) struct LocationNode { + pub(crate) parent: Option, + pub(crate) children: Vec, + pub(crate) children_hash: FxHashMap, + pub(crate) value: Location, +} + +impl LocationNode { + pub(crate) fn new(parent: Option, value: Location) -> Self { + LocationNode { parent, children: Vec::new(), children_hash: FxHashMap::default(), value } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub(crate) struct CallStackHelper { + locations: Vec, +} + +impl Default for CallStackHelper { + /// Generates a new helper, with an empty location tree + fn default() -> Self { + let mut result = CallStackHelper { locations: Vec::new() }; + result.add_location_to_root(Location::dummy()); + result + } +} + +impl CallStackHelper { + /// Construct a CallStack from a CallStackId + pub(crate) fn get_call_stack(&self, mut call_stack: CallStackId) -> CallStack { + let mut result = im::Vector::new(); + while let Some(parent) = self.locations[call_stack.index()].parent { + result.push_back(self.locations[call_stack.index()].value); + call_stack = parent; + } + result + } + + /// Returns a new CallStackId which extends the call_stack with the provided call_stack. + pub(crate) fn extend_call_stack( + &mut self, + mut call_stack: CallStackId, + locations: &CallStack, + ) -> CallStackId { + for location in locations { + call_stack = self.add_child(call_stack, *location); + } + call_stack + } + + /// Adds a location to the call stack + pub(crate) fn add_child(&mut self, call_stack: CallStackId, location: Location) -> CallStackId { + let key = fxhash::hash64(&location); + if let Some(result) = self.locations[call_stack.index()].children_hash.get(&key) { + if self.locations[result.index()].value == location { + return *result; + } + } + let new_location = LocationNode::new(Some(call_stack), location); + let key = fxhash::hash64(&new_location.value); + self.locations.push(new_location); + let new_location_id = CallStackId::new(self.locations.len() - 1); + + self.locations[call_stack.index()].children.push(new_location_id); + self.locations[call_stack.index()].children_hash.insert(key, new_location_id); + new_location_id + } + + /// Retrieve the CallStackId corresponding to call_stack with the last 'len' locations removed. + pub(crate) fn unwind_call_stack( + &self, + mut call_stack: CallStackId, + mut len: usize, + ) -> CallStackId { + while len > 0 { + if let Some(parent) = self.locations[call_stack.index()].parent { + len -= 1; + call_stack = parent; + } else { + break; + } + } + call_stack + } + + pub(crate) fn add_location_to_root(&mut self, location: Location) -> CallStackId { + if self.locations.is_empty() { + self.locations.push(LocationNode::new(None, location)); + CallStackId::root() + } else { + self.add_child(CallStackId::root(), location) + } + } + + /// Get (or create) a CallStackId corresponding to the given locations + pub(crate) fn get_or_insert_locations(&mut self, locations: CallStack) -> CallStackId { + self.extend_call_stack(CallStackId::root(), &locations) + } +} diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs index 38e6efa5b9a..788b1a7d302 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/cfg.rs @@ -128,7 +128,7 @@ impl ControlFlowGraph { #[cfg(test)] mod tests { use crate::ssa::ir::{ - dfg::CallStack, instruction::TerminatorInstruction, map::Id, types::Type, + call_stack::CallStackId, instruction::TerminatorInstruction, map::Id, types::Type, }; use super::{super::function::Function, ControlFlowGraph}; @@ -140,7 +140,7 @@ mod tests { let block_id = func.entry_block(); func.dfg[block_id].set_terminator(TerminatorInstruction::Return { return_values: vec![], - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }); ControlFlowGraph::with_function(&func); @@ -168,17 +168,17 @@ mod tests { condition: cond, then_destination: block2_id, else_destination: block1_id, - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }); func.dfg[block1_id].set_terminator(TerminatorInstruction::JmpIf { condition: cond, then_destination: block1_id, else_destination: block2_id, - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }); func.dfg[block2_id].set_terminator(TerminatorInstruction::Return { return_values: vec![], - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }); let mut cfg = ControlFlowGraph::with_function(&func); @@ -226,18 +226,18 @@ mod tests { let ret_block_id = func.dfg.make_block(); func.dfg[ret_block_id].set_terminator(TerminatorInstruction::Return { return_values: vec![], - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }); func.dfg[block2_id].set_terminator(TerminatorInstruction::Jmp { destination: ret_block_id, arguments: vec![], - call_stack: im::Vector::new(), + call_stack: CallStackId::root(), }); func.dfg[block0_id].set_terminator(TerminatorInstruction::JmpIf { condition: cond, then_destination: block1_id, else_destination: ret_block_id, - call_stack: CallStack::new(), + call_stack: CallStackId::root(), }); // Recompute new and changed blocks diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dfg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dfg.rs index 827944e22d1..72ba369f98c 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dfg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dfg.rs @@ -4,12 +4,13 @@ use crate::ssa::{function_builder::data_bus::DataBus, ir::instruction::SimplifyR use super::{ basic_block::{BasicBlock, BasicBlockId}, + call_stack::{CallStack, CallStackHelper, CallStackId}, function::FunctionId, instruction::{ Instruction, InstructionId, InstructionResultType, Intrinsic, TerminatorInstruction, }, map::DenseMap, - types::Type, + types::{NumericType, Type}, value::{Value, ValueId}, }; @@ -50,7 +51,7 @@ pub(crate) struct DataFlowGraph { /// Each constant is unique, attempting to insert the same constant /// twice will return the same ValueId. #[serde(skip)] - constants: HashMap<(FieldElement, Type), ValueId>, + constants: HashMap<(FieldElement, NumericType), ValueId>, /// Contains each function that has been imported into the current function. /// A unique `ValueId` for each function's [`Value::Function`] is stored so any given FunctionId @@ -91,14 +92,14 @@ pub(crate) struct DataFlowGraph { /// Instructions inserted by internal SSA passes that don't correspond to user code /// may not have a corresponding location. #[serde(skip)] - locations: HashMap, + locations: HashMap, + + pub(crate) call_stack_data: CallStackHelper, #[serde(skip)] pub(crate) data_bus: DataBus, } -pub(crate) type CallStack = im::Vector; - impl DataFlowGraph { /// Creates a new basic block with no parameters. /// After being created, the block is unreachable in the current function @@ -119,7 +120,7 @@ impl DataFlowGraph { let parameters = self.blocks[block].parameters(); let parameters = vecmap(parameters.iter().enumerate(), |(position, param)| { - let typ = self.values[*param].get_type().clone(); + let typ = self.values[*param].get_type().into_owned(); self.values.insert(Value::Param { block: new_block, position, typ }) }); @@ -170,9 +171,9 @@ impl DataFlowGraph { instruction: Instruction, block: BasicBlockId, ctrl_typevars: Option>, - call_stack: CallStack, + call_stack: CallStackId, ) -> InsertInstructionResult { - match instruction.simplify(self, block, ctrl_typevars.clone(), &call_stack) { + match instruction.simplify(self, block, ctrl_typevars.clone(), call_stack) { SimplifyResult::SimplifiedTo(simplification) => { InsertInstructionResult::SimplifiedTo(simplification) } @@ -200,7 +201,7 @@ impl DataFlowGraph { for instruction in instructions { let id = self.make_instruction(instruction, ctrl_typevars.clone()); self.blocks[block].insert_instruction(id); - self.locations.insert(id, call_stack.clone()); + self.locations.insert(id, call_stack); last_id = Some(id); } @@ -233,11 +234,12 @@ impl DataFlowGraph { pub(crate) fn set_type_of_value(&mut self, value_id: ValueId, target_type: Type) { let value = &mut self.values[value_id]; match value { - Value::Instruction { typ, .. } - | Value::Param { typ, .. } - | Value::NumericConstant { typ, .. } => { + Value::Instruction { typ, .. } | Value::Param { typ, .. } => { *typ = target_type; } + Value::NumericConstant { typ, .. } => { + *typ = target_type.unwrap_numeric(); + } _ => { unreachable!("ICE: Cannot set type of {:?}", value); } @@ -257,11 +259,11 @@ impl DataFlowGraph { /// Creates a new constant value, or returns the Id to an existing one if /// one already exists. - pub(crate) fn make_constant(&mut self, constant: FieldElement, typ: Type) -> ValueId { - if let Some(id) = self.constants.get(&(constant, typ.clone())) { + pub(crate) fn make_constant(&mut self, constant: FieldElement, typ: NumericType) -> ValueId { + if let Some(id) = self.constants.get(&(constant, typ)) { return *id; } - let id = self.values.insert(Value::NumericConstant { constant, typ: typ.clone() }); + let id = self.values.insert(Value::NumericConstant { constant, typ }); self.constants.insert((constant, typ), id); id } @@ -342,7 +344,7 @@ impl DataFlowGraph { /// Returns the type of a given value pub(crate) fn type_of_value(&self, value: ValueId) -> Type { - self.values[value].get_type().clone() + self.values[value].get_type().into_owned() } /// Returns the maximum possible number of bits that `value` can potentially be. @@ -367,7 +369,7 @@ impl DataFlowGraph { /// True if the type of this value is Type::Reference. /// Using this method over type_of_value avoids cloning the value's type. pub(crate) fn value_is_reference(&self, value: ValueId) -> bool { - matches!(self.values[value].get_type(), Type::Reference(_)) + matches!(self.values[value].get_type().as_ref(), Type::Reference(_)) } /// Replaces an instruction result with a fresh id. @@ -425,9 +427,9 @@ impl DataFlowGraph { pub(crate) fn get_numeric_constant_with_type( &self, value: ValueId, - ) -> Option<(FieldElement, Type)> { + ) -> Option<(FieldElement, NumericType)> { match &self.values[self.resolve(value)] { - Value::NumericConstant { constant, typ } => Some((*constant, typ.clone())), + Value::NumericConstant { constant, typ } => Some((*constant, *typ)), _ => None, } } @@ -485,18 +487,41 @@ impl DataFlowGraph { destination.set_terminator(terminator); } - pub(crate) fn get_call_stack(&self, instruction: InstructionId) -> CallStack { + pub(crate) fn get_instruction_call_stack(&self, instruction: InstructionId) -> CallStack { + let call_stack = self.get_instruction_call_stack_id(instruction); + self.call_stack_data.get_call_stack(call_stack) + } + + pub(crate) fn get_instruction_call_stack_id(&self, instruction: InstructionId) -> CallStackId { self.locations.get(&instruction).cloned().unwrap_or_default() } - pub(crate) fn add_location(&mut self, instruction: InstructionId, location: Location) { - self.locations.entry(instruction).or_default().push_back(location); + pub(crate) fn add_location_to_instruction( + &mut self, + instruction: InstructionId, + location: Location, + ) { + let call_stack = self.locations.entry(instruction).or_default(); + *call_stack = self.call_stack_data.add_child(*call_stack, location); + } + + pub(crate) fn get_call_stack(&self, call_stack: CallStackId) -> CallStack { + self.call_stack_data.get_call_stack(call_stack) } pub(crate) fn get_value_call_stack(&self, value: ValueId) -> CallStack { match &self.values[self.resolve(value)] { - Value::Instruction { instruction, .. } => self.get_call_stack(*instruction), - _ => im::Vector::new(), + Value::Instruction { instruction, .. } => self.get_instruction_call_stack(*instruction), + _ => CallStack::new(), + } + } + + pub(crate) fn get_value_call_stack_id(&self, value: ValueId) -> CallStackId { + match &self.values[self.resolve(value)] { + Value::Instruction { instruction, .. } => { + self.get_instruction_call_stack_id(*instruction) + } + _ => CallStackId::root(), } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dom.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dom.rs index 504eecf4801..ff54bf3b6ed 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dom.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/dom.rs @@ -272,8 +272,8 @@ mod tests { use crate::ssa::{ function_builder::FunctionBuilder, ir::{ - basic_block::BasicBlockId, dfg::CallStack, dom::DominatorTree, function::Function, - instruction::TerminatorInstruction, map::Id, types::Type, + basic_block::BasicBlockId, call_stack::CallStackId, dom::DominatorTree, + function::Function, instruction::TerminatorInstruction, map::Id, types::Type, }, }; @@ -284,7 +284,10 @@ mod tests { let block0_id = func.entry_block(); func.dfg.set_block_terminator( block0_id, - TerminatorInstruction::Return { return_values: vec![], call_stack: CallStack::new() }, + TerminatorInstruction::Return { + return_values: vec![], + call_stack: CallStackId::root(), + }, ); let mut dom_tree = DominatorTree::with_function(&func); assert!(dom_tree.dominates(block0_id, block0_id)); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs index 6ebd2aa1105..9e4557e06a6 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/function_inserter.rs @@ -4,7 +4,8 @@ use crate::ssa::ir::types::Type; use super::{ basic_block::BasicBlockId, - dfg::{CallStack, InsertInstructionResult}, + call_stack::CallStackId, + dfg::InsertInstructionResult, function::Function, instruction::{Instruction, InstructionId}, value::ValueId, @@ -72,26 +73,25 @@ impl<'f> FunctionInserter<'f> { } /// Get an instruction and make sure all the values in it are freshly resolved. - pub(crate) fn map_instruction(&mut self, id: InstructionId) -> (Instruction, CallStack) { - ( - self.function.dfg[id].clone().map_values(|id| self.resolve(id)), - self.function.dfg.get_call_stack(id), - ) + pub(crate) fn map_instruction(&mut self, id: InstructionId) -> (Instruction, CallStackId) { + let mut instruction = self.function.dfg[id].clone(); + instruction.map_values_mut(|id| self.resolve(id)); + (instruction, self.function.dfg.get_instruction_call_stack_id(id)) } /// Maps a terminator in place, replacing any ValueId in the terminator with the /// resolved version of that value id from this FunctionInserter's internal value mapping. pub(crate) fn map_terminator_in_place(&mut self, block: BasicBlockId) { let mut terminator = self.function.dfg[block].take_terminator(); - terminator.mutate_values(|value| self.resolve(value)); + terminator.map_values_mut(|value| self.resolve(value)); self.function.dfg[block].set_terminator(terminator); } /// Maps the data bus in place, replacing any ValueId in the data bus with the /// resolved version of that value id from this FunctionInserter's internal value mapping. pub(crate) fn map_data_bus_in_place(&mut self) { - let data_bus = self.function.dfg.data_bus.clone(); - let data_bus = data_bus.map_values(|value| self.resolve(value)); + let mut data_bus = self.function.dfg.data_bus.clone(); + data_bus.map_values_mut(|value| self.resolve(value)); self.function.dfg.data_bus = data_bus; } @@ -115,7 +115,7 @@ impl<'f> FunctionInserter<'f> { instruction: Instruction, id: InstructionId, mut block: BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, ) -> InsertInstructionResult { let results = self.function.dfg.instruction_results(id); let results = vecmap(results, |id| self.function.dfg.resolve(*id)); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs index 76409f6a20a..3072bb1d72d 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction.rs @@ -1,4 +1,3 @@ -use noirc_errors::Location; use serde::{Deserialize, Serialize}; use std::hash::{Hash, Hasher}; @@ -15,7 +14,8 @@ use crate::ssa::{ir::function::RuntimeType, opt::flatten_cfg::value_merger::Valu use super::{ basic_block::BasicBlockId, - dfg::{CallStack, DataFlowGraph}, + call_stack::CallStackId, + dfg::DataFlowGraph, function::Function, map::Id, types::{NumericType, Type}, @@ -64,6 +64,7 @@ pub(crate) enum Intrinsic { ToBits(Endian), ToRadix(Endian), BlackBox(BlackBoxFunc), + Hint(Hint), FromField, AsField, AsWitness, @@ -95,6 +96,7 @@ impl std::fmt::Display for Intrinsic { Intrinsic::ToRadix(Endian::Big) => write!(f, "to_be_radix"), Intrinsic::ToRadix(Endian::Little) => write!(f, "to_le_radix"), Intrinsic::BlackBox(function) => write!(f, "{function}"), + Intrinsic::Hint(Hint::BlackBox) => write!(f, "black_box"), Intrinsic::FromField => write!(f, "from_field"), Intrinsic::AsField => write!(f, "as_field"), Intrinsic::AsWitness => write!(f, "as_witness"), @@ -144,6 +146,9 @@ impl Intrinsic { | Intrinsic::DerivePedersenGenerators | Intrinsic::FieldLessThan => false, + // Treat the black_box hint as-if it could potentially have side effects. + Intrinsic::Hint(Hint::BlackBox) => true, + // Some black box functions have side-effects Intrinsic::BlackBox(func) => matches!( func, @@ -214,6 +219,7 @@ impl Intrinsic { "is_unconstrained" => Some(Intrinsic::IsUnconstrained), "derive_pedersen_generators" => Some(Intrinsic::DerivePedersenGenerators), "field_less_than" => Some(Intrinsic::FieldLessThan), + "black_box" => Some(Intrinsic::Hint(Hint::BlackBox)), "array_refcount" => Some(Intrinsic::ArrayRefCount), "slice_refcount" => Some(Intrinsic::SliceRefCount), @@ -229,6 +235,16 @@ pub(crate) enum Endian { Little, } +/// Compiler hints. +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)] +pub(crate) enum Hint { + /// Hint to the compiler to treat the call as having potential side effects, + /// so that the value passed to it can survive SSA passes without being + /// simplified out completely. This facilitates testing and reproducing + /// runtime behavior with constants. + BlackBox, +} + #[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize)] /// Instructions are used to perform tasks. /// The instructions that the IR is able to specify are listed below. @@ -236,8 +252,8 @@ pub(crate) enum Instruction { /// Binary Operations like +, -, *, /, ==, != Binary(Binary), - /// Converts `Value` into Typ - Cast(ValueId, Type), + /// Converts `Value` into the given NumericType + Cast(ValueId, NumericType), /// Computes a bit wise not Not(ValueId), @@ -339,9 +355,8 @@ impl Instruction { pub(crate) fn result_type(&self) -> InstructionResultType { match self { Instruction::Binary(binary) => binary.result_type(), - Instruction::Cast(_, typ) | Instruction::MakeArray { typ, .. } => { - InstructionResultType::Known(typ.clone()) - } + Instruction::Cast(_, typ) => InstructionResultType::Known(Type::Numeric(*typ)), + Instruction::MakeArray { typ, .. } => InstructionResultType::Known(typ.clone()), Instruction::Not(value) | Instruction::Truncate { value, .. } | Instruction::ArraySet { array: value, .. } @@ -587,7 +602,7 @@ impl Instruction { rhs: f(binary.rhs), operator: binary.operator, }), - Instruction::Cast(value, typ) => Instruction::Cast(f(*value), typ.clone()), + Instruction::Cast(value, typ) => Instruction::Cast(f(*value), *typ), Instruction::Not(value) => Instruction::Not(f(*value)), Instruction::Truncate { value, bit_size, max_bit_size } => Instruction::Truncate { value: f(*value), @@ -655,6 +670,70 @@ impl Instruction { } } + /// Maps each ValueId inside this instruction to a new ValueId in place. + pub(crate) fn map_values_mut(&mut self, mut f: impl FnMut(ValueId) -> ValueId) { + match self { + Instruction::Binary(binary) => { + binary.lhs = f(binary.lhs); + binary.rhs = f(binary.rhs); + } + Instruction::Cast(value, _) => *value = f(*value), + Instruction::Not(value) => *value = f(*value), + Instruction::Truncate { value, bit_size: _, max_bit_size: _ } => { + *value = f(*value); + } + Instruction::Constrain(lhs, rhs, assert_message) => { + *lhs = f(*lhs); + *rhs = f(*rhs); + if let Some(ConstrainError::Dynamic(_, _, payload_values)) = assert_message { + for value in payload_values { + *value = f(*value); + } + } + } + Instruction::Call { func, arguments } => { + *func = f(*func); + for argument in arguments { + *argument = f(*argument); + } + } + Instruction::Allocate => (), + Instruction::Load { address } => *address = f(*address), + Instruction::Store { address, value } => { + *address = f(*address); + *value = f(*value); + } + Instruction::EnableSideEffectsIf { condition } => { + *condition = f(*condition); + } + Instruction::ArrayGet { array, index } => { + *array = f(*array); + *index = f(*index); + } + Instruction::ArraySet { array, index, value, mutable: _ } => { + *array = f(*array); + *index = f(*index); + *value = f(*value); + } + Instruction::IncrementRc { value } => *value = f(*value), + Instruction::DecrementRc { value } => *value = f(*value), + Instruction::RangeCheck { value, max_bit_size: _, assert_message: _ } => { + *value = f(*value); + } + Instruction::IfElse { then_condition, then_value, else_condition, else_value } => { + *then_condition = f(*then_condition); + *then_value = f(*then_value); + *else_condition = f(*else_condition); + *else_value = f(*else_value); + } + Instruction::MakeArray { elements, typ: _ } => { + for element in elements.iter_mut() { + *element = f(*element); + } + } + } + } + /// Applies a function to each input value this instruction holds. pub(crate) fn for_each_value(&self, mut f: impl FnMut(ValueId) -> T) { match self { @@ -730,12 +809,12 @@ impl Instruction { dfg: &mut DataFlowGraph, block: BasicBlockId, ctrl_typevars: Option>, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { use SimplifyResult::*; match self { Instruction::Binary(binary) => binary.simplify(dfg), - Instruction::Cast(value, typ) => simplify_cast(*value, typ, dfg), + Instruction::Cast(value, typ) => simplify_cast(*value, *typ, dfg), Instruction::Not(value) => { match &dfg[dfg.resolve(*value)] { // Limit optimizing ! on constants to only booleans. If we tried it on fields, @@ -744,7 +823,7 @@ impl Instruction { Value::NumericConstant { constant, typ } if typ.is_unsigned() => { // As we're casting to a `u128`, we need to clear out any upper bits that the NOT fills. let value = !constant.to_u128() % (1 << typ.bit_size()); - SimplifiedTo(dfg.make_constant(value.into(), typ.clone())) + SimplifiedTo(dfg.make_constant(value.into(), *typ)) } Value::Instruction { instruction, .. } => { // !!v => v @@ -787,7 +866,7 @@ impl Instruction { instruction, block, Option::None, - call_stack.clone(), + call_stack, ); return SimplifiedTo(new_array.first()); } @@ -1132,7 +1211,7 @@ pub(crate) enum TerminatorInstruction { condition: ValueId, then_destination: BasicBlockId, else_destination: BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, }, /// Unconditional Jump @@ -1140,7 +1219,7 @@ pub(crate) enum TerminatorInstruction { /// Jumps to specified `destination` with `arguments`. /// The CallStack here is expected to be used to issue an error when the start range of /// a for loop cannot be deduced at compile-time. - Jmp { destination: BasicBlockId, arguments: Vec, call_stack: CallStack }, + Jmp { destination: BasicBlockId, arguments: Vec, call_stack: CallStackId }, /// Return from the current function with the given return values. /// @@ -1149,7 +1228,7 @@ pub(crate) enum TerminatorInstruction { /// unconditionally jump to a single exit block with the return values /// as the block arguments. Then the exit block can terminate in a return /// instruction returning these values. - Return { return_values: Vec, call_stack: CallStack }, + Return { return_values: Vec, call_stack: CallStackId }, } impl TerminatorInstruction { @@ -1164,22 +1243,22 @@ impl TerminatorInstruction { condition: f(*condition), then_destination: *then_destination, else_destination: *else_destination, - call_stack: call_stack.clone(), + call_stack: *call_stack, }, Jmp { destination, arguments, call_stack } => Jmp { destination: *destination, arguments: vecmap(arguments, |value| f(*value)), - call_stack: call_stack.clone(), + call_stack: *call_stack, }, Return { return_values, call_stack } => Return { return_values: vecmap(return_values, |value| f(*value)), - call_stack: call_stack.clone(), + call_stack: *call_stack, }, } } /// Mutate each ValueId to a new ValueId using the given mapping function - pub(crate) fn mutate_values(&mut self, mut f: impl FnMut(ValueId) -> ValueId) { + pub(crate) fn map_values_mut(&mut self, mut f: impl FnMut(ValueId) -> ValueId) { use TerminatorInstruction::*; match self { JmpIf { condition, .. } => { @@ -1233,11 +1312,19 @@ impl TerminatorInstruction { } } - pub(crate) fn call_stack(&self) -> im::Vector { + pub(crate) fn call_stack(&self) -> CallStackId { + match self { + TerminatorInstruction::JmpIf { call_stack, .. } + | TerminatorInstruction::Jmp { call_stack, .. } + | TerminatorInstruction::Return { call_stack, .. } => *call_stack, + } + } + + pub(crate) fn set_call_stack(&mut self, new_call_stack: CallStackId) { match self { TerminatorInstruction::JmpIf { call_stack, .. } | TerminatorInstruction::Jmp { call_stack, .. } - | TerminatorInstruction::Return { call_stack, .. } => call_stack.clone(), + | TerminatorInstruction::Return { call_stack, .. } => *call_stack = new_call_stack, } } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/binary.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/binary.rs index 487370488b9..81f2f3b1e01 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/binary.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/binary.rs @@ -88,7 +88,7 @@ impl Binary { pub(super) fn simplify(&self, dfg: &mut DataFlowGraph) -> SimplifyResult { let lhs = dfg.get_numeric_constant(self.lhs); let rhs = dfg.get_numeric_constant(self.rhs); - let operand_type = dfg.type_of_value(self.lhs); + let operand_type = dfg.type_of_value(self.lhs).unwrap_numeric(); if let (Some(lhs), Some(rhs)) = (lhs, rhs) { return match eval_constant_binary_op(lhs, rhs, self.operator, operand_type) { @@ -168,11 +168,11 @@ impl Binary { } BinaryOp::Eq => { if dfg.resolve(self.lhs) == dfg.resolve(self.rhs) { - let one = dfg.make_constant(FieldElement::one(), Type::bool()); + let one = dfg.make_constant(FieldElement::one(), NumericType::bool()); return SimplifyResult::SimplifiedTo(one); } - if operand_type == Type::bool() { + if operand_type == NumericType::bool() { // Simplify forms of `(boolean == true)` into `boolean` if lhs_is_one { return SimplifyResult::SimplifiedTo(self.rhs); @@ -191,13 +191,13 @@ impl Binary { } BinaryOp::Lt => { if dfg.resolve(self.lhs) == dfg.resolve(self.rhs) { - let zero = dfg.make_constant(FieldElement::zero(), Type::bool()); + let zero = dfg.make_constant(FieldElement::zero(), NumericType::bool()); return SimplifyResult::SimplifiedTo(zero); } if operand_type.is_unsigned() { if rhs_is_zero { // Unsigned values cannot be less than zero. - let zero = dfg.make_constant(FieldElement::zero(), Type::bool()); + let zero = dfg.make_constant(FieldElement::zero(), NumericType::bool()); return SimplifyResult::SimplifiedTo(zero); } else if rhs_is_one { let zero = dfg.make_constant(FieldElement::zero(), operand_type); @@ -217,7 +217,7 @@ impl Binary { if dfg.resolve(self.lhs) == dfg.resolve(self.rhs) { return SimplifyResult::SimplifiedTo(self.lhs); } - if operand_type == Type::bool() { + if operand_type == NumericType::bool() { // Boolean AND is equivalent to multiplication, which is a cheaper operation. let instruction = Instruction::binary(BinaryOp::Mul, self.lhs, self.rhs); return SimplifyResult::SimplifiedToInstruction(instruction); @@ -256,6 +256,10 @@ impl Binary { if rhs_is_zero { return SimplifyResult::SimplifiedTo(self.lhs); } + if operand_type == NumericType::bool() && (lhs_is_one || rhs_is_one) { + let one = dfg.make_constant(FieldElement::one(), operand_type); + return SimplifyResult::SimplifiedTo(one); + } if dfg.resolve(self.lhs) == dfg.resolve(self.rhs) { return SimplifyResult::SimplifiedTo(self.lhs); } @@ -294,10 +298,10 @@ fn eval_constant_binary_op( lhs: FieldElement, rhs: FieldElement, operator: BinaryOp, - mut operand_type: Type, -) -> Option<(FieldElement, Type)> { - let value = match &operand_type { - Type::Numeric(NumericType::NativeField) => { + mut operand_type: NumericType, +) -> Option<(FieldElement, NumericType)> { + let value = match operand_type { + NumericType::NativeField => { // If the rhs of a division is zero, attempting to evaluate the division will cause a compiler panic. // Thus, we do not evaluate the division in this method, as we want to avoid triggering a panic, // and the operation should be handled by ACIR generation. @@ -306,11 +310,11 @@ fn eval_constant_binary_op( } operator.get_field_function()?(lhs, rhs) } - Type::Numeric(NumericType::Unsigned { bit_size }) => { + NumericType::Unsigned { bit_size } => { let function = operator.get_u128_function(); - let lhs = truncate(lhs.try_into_u128()?, *bit_size); - let rhs = truncate(rhs.try_into_u128()?, *bit_size); + let lhs = truncate(lhs.try_into_u128()?, bit_size); + let rhs = truncate(rhs.try_into_u128()?, bit_size); // The divisor is being truncated into the type of the operand, which can potentially // lead to the rhs being zero. @@ -322,16 +326,16 @@ fn eval_constant_binary_op( } let result = function(lhs, rhs)?; // Check for overflow - if result >= 1 << *bit_size { + if result >= 1 << bit_size { return None; } result.into() } - Type::Numeric(NumericType::Signed { bit_size }) => { + NumericType::Signed { bit_size } => { let function = operator.get_i128_function(); - let lhs = try_convert_field_element_to_signed_integer(lhs, *bit_size)?; - let rhs = try_convert_field_element_to_signed_integer(rhs, *bit_size)?; + let lhs = try_convert_field_element_to_signed_integer(lhs, bit_size)?; + let rhs = try_convert_field_element_to_signed_integer(rhs, bit_size)?; // The divisor is being truncated into the type of the operand, which can potentially // lead to the rhs being zero. // If the rhs of a division is zero, attempting to evaluate the division will cause a compiler panic. @@ -343,17 +347,16 @@ fn eval_constant_binary_op( let result = function(lhs, rhs)?; // Check for overflow - let two_pow_bit_size_minus_one = 1i128 << (*bit_size - 1); + let two_pow_bit_size_minus_one = 1i128 << (bit_size - 1); if result >= two_pow_bit_size_minus_one || result < -two_pow_bit_size_minus_one { return None; } - convert_signed_integer_to_field_element(result, *bit_size) + convert_signed_integer_to_field_element(result, bit_size) } - _ => return None, }; if matches!(operator, BinaryOp::Eq | BinaryOp::Lt) { - operand_type = Type::bool(); + operand_type = NumericType::bool(); } Some((value, operand_type)) diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs index a8db5e2ff94..fa7d314ff33 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call.rs @@ -12,16 +12,17 @@ use num_bigint::BigUint; use crate::ssa::{ ir::{ basic_block::BasicBlockId, - dfg::{CallStack, DataFlowGraph}, + call_stack::CallStackId, + dfg::DataFlowGraph, instruction::Intrinsic, map::Id, - types::Type, + types::{NumericType, Type}, value::{Value, ValueId}, }, opt::flatten_cfg::value_merger::ValueMerger, }; -use super::{Binary, BinaryOp, Endian, Instruction, SimplifyResult}; +use super::{Binary, BinaryOp, Endian, Hint, Instruction, SimplifyResult}; mod blackbox; @@ -38,7 +39,7 @@ pub(super) fn simplify_call( dfg: &mut DataFlowGraph, block: BasicBlockId, ctrl_typevars: Option>, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { let intrinsic = match &dfg[func] { Value::Intrinsic(intrinsic) => *intrinsic, @@ -61,7 +62,13 @@ pub(super) fn simplify_call( unreachable!("ICE: Intrinsic::ToRadix return type must be array") }; constant_to_radix(endian, field, 2, limb_count, |values| { - make_constant_array(dfg, values.into_iter(), Type::bool(), block, call_stack) + make_constant_array( + dfg, + values.into_iter(), + NumericType::bool(), + block, + call_stack, + ) }) } else { SimplifyResult::None @@ -81,7 +88,7 @@ pub(super) fn simplify_call( make_constant_array( dfg, values.into_iter(), - Type::unsigned(8), + NumericType::Unsigned { bit_size: 8 }, block, call_stack, ) @@ -93,7 +100,7 @@ pub(super) fn simplify_call( Intrinsic::ArrayLen => { if let Some(length) = dfg.try_get_array_length(arguments[0]) { let length = FieldElement::from(length as u128); - SimplifyResult::SimplifiedTo(dfg.make_constant(length, Type::length_type())) + SimplifyResult::SimplifiedTo(dfg.make_constant(length, NumericType::length_type())) } else if matches!(dfg.type_of_value(arguments[1]), Type::Slice(_)) { SimplifyResult::SimplifiedTo(arguments[0]) } else { @@ -116,7 +123,7 @@ pub(super) fn simplify_call( ); let slice_length_value = array.len() / elements_size; let slice_length = - dfg.make_constant(slice_length_value.into(), Type::length_type()); + dfg.make_constant(slice_length_value.into(), NumericType::length_type()); let new_slice = make_array(dfg, array, Type::Slice(inner_element_types), block, call_stack); SimplifyResult::SimplifiedToMultiple(vec![slice_length, new_slice]) @@ -142,14 +149,7 @@ pub(super) fn simplify_call( return SimplifyResult::SimplifiedToMultiple(vec![new_slice_length, new_slice]); } - simplify_slice_push_back( - slice, - element_type, - arguments, - dfg, - block, - call_stack.clone(), - ) + simplify_slice_push_back(slice, element_type, arguments, dfg, block, call_stack) } else { SimplifyResult::None } @@ -179,7 +179,7 @@ pub(super) fn simplify_call( let slice = dfg.get_array_constant(arguments[1]); if let Some((_, typ)) = slice { - simplify_slice_pop_back(typ, arguments, dfg, block, call_stack.clone()) + simplify_slice_pop_back(typ, arguments, dfg, block, call_stack) } else { SimplifyResult::None } @@ -326,14 +326,12 @@ pub(super) fn simplify_call( SimplifyResult::None } } + Intrinsic::Hint(Hint::BlackBox) => SimplifyResult::None, Intrinsic::BlackBox(bb_func) => { simplify_black_box_func(bb_func, arguments, dfg, block, call_stack) } Intrinsic::AsField => { - let instruction = Instruction::Cast( - arguments[0], - Type::Numeric(crate::ssa::ir::types::NumericType::NativeField), - ); + let instruction = Instruction::Cast(arguments[0], NumericType::NativeField); SimplifyResult::SimplifiedToInstruction(instruction) } Intrinsic::FromField => { @@ -350,11 +348,11 @@ pub(super) fn simplify_call( truncate, block, Some(vec![incoming_type]), - call_stack.clone(), + call_stack, ) .first(); - let instruction = Instruction::Cast(truncated_value, target_type); + let instruction = Instruction::Cast(truncated_value, target_type.unwrap_numeric()); SimplifyResult::SimplifiedToInstruction(instruction) } Intrinsic::AsWitness => SimplifyResult::None, @@ -370,7 +368,7 @@ pub(super) fn simplify_call( if let Some(constants) = constant_args { let lhs = constants[0]; let rhs = constants[1]; - let result = dfg.make_constant((lhs < rhs).into(), Type::bool()); + let result = dfg.make_constant((lhs < rhs).into(), NumericType::bool()); SimplifyResult::SimplifiedTo(result) } else { SimplifyResult::None @@ -406,9 +404,9 @@ fn update_slice_length( operator: BinaryOp, block: BasicBlockId, ) -> ValueId { - let one = dfg.make_constant(FieldElement::one(), Type::length_type()); + let one = dfg.make_constant(FieldElement::one(), NumericType::length_type()); let instruction = Instruction::Binary(Binary { lhs: slice_len, operator, rhs: one }); - let call_stack = dfg.get_value_call_stack(slice_len); + let call_stack = dfg.get_value_call_stack_id(slice_len); dfg.insert_instruction_and_results(instruction, block, None, call_stack).first() } @@ -418,23 +416,18 @@ fn simplify_slice_push_back( arguments: &[ValueId], dfg: &mut DataFlowGraph, block: BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, ) -> SimplifyResult { // The capacity must be an integer so that we can compare it against the slice length - let capacity = dfg.make_constant((slice.len() as u128).into(), Type::length_type()); + let capacity = dfg.make_constant((slice.len() as u128).into(), NumericType::length_type()); let len_equals_capacity_instr = Instruction::Binary(Binary { lhs: arguments[0], operator: BinaryOp::Eq, rhs: capacity }); let len_equals_capacity = dfg - .insert_instruction_and_results(len_equals_capacity_instr, block, None, call_stack.clone()) + .insert_instruction_and_results(len_equals_capacity_instr, block, None, call_stack) .first(); let len_not_equals_capacity_instr = Instruction::Not(len_equals_capacity); let len_not_equals_capacity = dfg - .insert_instruction_and_results( - len_not_equals_capacity_instr, - block, - None, - call_stack.clone(), - ) + .insert_instruction_and_results(len_not_equals_capacity_instr, block, None, call_stack) .first(); let new_slice_length = update_slice_length(arguments[0], dfg, BinaryOp::Add, block); @@ -444,7 +437,7 @@ fn simplify_slice_push_back( } let slice_size = slice.len() as u32; let element_size = element_type.element_size() as u32; - let new_slice = make_array(dfg, slice, element_type, block, &call_stack); + let new_slice = make_array(dfg, slice, element_type, block, call_stack); let set_last_slice_value_instr = Instruction::ArraySet { array: new_slice, @@ -454,7 +447,7 @@ fn simplify_slice_push_back( }; let set_last_slice_value = dfg - .insert_instruction_and_results(set_last_slice_value_instr, block, None, call_stack.clone()) + .insert_instruction_and_results(set_last_slice_value_instr, block, None, call_stack) .first(); let mut slice_sizes = HashMap::default(); @@ -476,42 +469,34 @@ fn simplify_slice_push_back( } fn simplify_slice_pop_back( - element_type: Type, + slice_type: Type, arguments: &[ValueId], dfg: &mut DataFlowGraph, block: BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, ) -> SimplifyResult { - let element_types = match element_type.clone() { - Type::Slice(element_types) | Type::Array(element_types, _) => element_types, - _ => { - unreachable!("ICE: Expected slice or array, but got {element_type}"); - } - }; - - let element_count = element_type.element_size(); + let element_types = slice_type.element_types(); + let element_count = element_types.len(); let mut results = VecDeque::with_capacity(element_count + 1); let new_slice_length = update_slice_length(arguments[0], dfg, BinaryOp::Sub, block); - let element_size = dfg.make_constant((element_count as u128).into(), Type::length_type()); + let element_size = + dfg.make_constant((element_count as u128).into(), NumericType::length_type()); let flattened_len_instr = Instruction::binary(BinaryOp::Mul, arguments[0], element_size); - let mut flattened_len = dfg - .insert_instruction_and_results(flattened_len_instr, block, None, call_stack.clone()) - .first(); + let mut flattened_len = + dfg.insert_instruction_and_results(flattened_len_instr, block, None, call_stack).first(); flattened_len = update_slice_length(flattened_len, dfg, BinaryOp::Sub, block); // We must pop multiple elements in the case of a slice of tuples - for _ in 0..element_count { + // Iterating through element types in reverse here since we're popping from the end + for element_type in element_types.iter().rev() { let get_last_elem_instr = Instruction::ArrayGet { array: arguments[1], index: flattened_len }; + + let element_type = Some(vec![element_type.clone()]); let get_last_elem = dfg - .insert_instruction_and_results( - get_last_elem_instr, - block, - Some(element_types.to_vec()), - call_stack.clone(), - ) + .insert_instruction_and_results(get_last_elem_instr, block, element_type, call_stack) .first(); results.push_front(get_last_elem); @@ -531,7 +516,7 @@ fn simplify_black_box_func( arguments: &[ValueId], dfg: &mut DataFlowGraph, block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { cfg_if::cfg_if! { if #[cfg(feature = "bn254")] { @@ -568,7 +553,7 @@ fn simplify_black_box_func( let result_array = make_constant_array( dfg, state_values, - Type::unsigned(64), + NumericType::Unsigned { bit_size: 64 }, block, call_stack, ); @@ -628,14 +613,14 @@ fn simplify_black_box_func( fn make_constant_array( dfg: &mut DataFlowGraph, results: impl Iterator, - typ: Type, + typ: NumericType, block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> ValueId { let result_constants: im::Vector<_> = - results.map(|element| dfg.make_constant(element, typ.clone())).collect(); + results.map(|element| dfg.make_constant(element, typ)).collect(); - let typ = Type::Array(Arc::new(vec![typ]), result_constants.len() as u32); + let typ = Type::Array(Arc::new(vec![Type::Numeric(typ)]), result_constants.len() as u32); make_array(dfg, result_constants, typ, block, call_stack) } @@ -644,30 +629,12 @@ fn make_array( elements: im::Vector, typ: Type, block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> ValueId { let instruction = Instruction::MakeArray { elements, typ }; - let call_stack = call_stack.clone(); dfg.insert_instruction_and_results(instruction, block, None, call_stack).first() } -fn make_constant_slice( - dfg: &mut DataFlowGraph, - results: Vec, - typ: Type, - block: BasicBlockId, - call_stack: &CallStack, -) -> (ValueId, ValueId) { - let result_constants = vecmap(results, |element| dfg.make_constant(element, typ.clone())); - - let typ = Type::Slice(Arc::new(vec![typ])); - let length = FieldElement::from(result_constants.len() as u128); - let length = dfg.make_constant(length, Type::length_type()); - - let slice = make_array(dfg, result_constants.into(), typ, block, call_stack); - (length, slice) -} - /// Returns a slice (represented by a tuple (len, slice)) of constants corresponding to the limbs of the radix decomposition. fn constant_to_radix( endian: Endian, @@ -721,7 +688,7 @@ fn simplify_hash( arguments: &[ValueId], hash_function: fn(&[u8]) -> Result<[u8; 32], BlackBoxResolutionError>, block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { match dfg.get_array_constant(arguments[0]) { Some((input, _)) if array_is_constant(dfg, &input) => { @@ -732,8 +699,8 @@ fn simplify_hash( let hash_values = hash.iter().map(|byte| FieldElement::from_be_bytes_reduce(&[*byte])); - let result_array = - make_constant_array(dfg, hash_values, Type::unsigned(8), block, call_stack); + let u8_type = NumericType::Unsigned { bit_size: 8 }; + let result_array = make_constant_array(dfg, hash_values, u8_type, block, call_stack); SimplifyResult::SimplifiedTo(result_array) } _ => SimplifyResult::None, @@ -781,7 +748,7 @@ fn simplify_signature( signature_verifier(&hashed_message, &public_key_x, &public_key_y, &signature) .expect("Rust solvable black box function should not fail"); - let valid_signature = dfg.make_constant(valid_signature.into(), Type::bool()); + let valid_signature = dfg.make_constant(valid_signature.into(), NumericType::bool()); SimplifyResult::SimplifiedTo(valid_signature) } _ => SimplifyResult::None, @@ -793,7 +760,7 @@ fn simplify_derive_generators( arguments: &[ValueId], num_generators: u32, block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { if arguments.len() == 2 { let domain_separator_string = dfg.get_array_constant(arguments[0]); @@ -811,15 +778,15 @@ fn simplify_derive_generators( num_generators, starting_index.try_to_u32().expect("argument is declared as u32"), ); - let is_infinite = dfg.make_constant(FieldElement::zero(), Type::bool()); + let is_infinite = dfg.make_constant(FieldElement::zero(), NumericType::bool()); let mut results = Vec::new(); for gen in generators { let x_big: BigUint = gen.x.into(); let x = FieldElement::from_be_bytes_reduce(&x_big.to_bytes_be()); let y_big: BigUint = gen.y.into(); let y = FieldElement::from_be_bytes_reduce(&y_big.to_bytes_be()); - results.push(dfg.make_constant(x, Type::field())); - results.push(dfg.make_constant(y, Type::field())); + results.push(dfg.make_constant(x, NumericType::NativeField)); + results.push(dfg.make_constant(y, NumericType::NativeField)); results.push(is_infinite); } let len = results.len() as u32; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call/blackbox.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call/blackbox.rs index 016d7ffa25b..ffacf6fe8b5 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call/blackbox.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/call/blackbox.rs @@ -2,10 +2,12 @@ use std::sync::Arc; use acvm::{acir::AcirField, BlackBoxFunctionSolver, BlackBoxResolutionError, FieldElement}; +use crate::ssa::ir::call_stack::CallStackId; use crate::ssa::ir::instruction::BlackBoxFunc; +use crate::ssa::ir::types::NumericType; use crate::ssa::ir::{ basic_block::BasicBlockId, - dfg::{CallStack, DataFlowGraph}, + dfg::DataFlowGraph, instruction::{Instruction, Intrinsic, SimplifyResult}, types::Type, value::ValueId, @@ -18,7 +20,7 @@ pub(super) fn simplify_ec_add( solver: impl BlackBoxFunctionSolver, arguments: &[ValueId], block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { match ( dfg.get_numeric_constant(arguments[0]), @@ -47,16 +49,17 @@ pub(super) fn simplify_ec_add( return SimplifyResult::None; }; - let result_x = dfg.make_constant(result_x, Type::field()); - let result_y = dfg.make_constant(result_y, Type::field()); - let result_is_infinity = dfg.make_constant(result_is_infinity, Type::field()); + let result_x = dfg.make_constant(result_x, NumericType::NativeField); + let result_y = dfg.make_constant(result_y, NumericType::NativeField); + let result_is_infinity = + dfg.make_constant(result_is_infinity, NumericType::NativeField); let typ = Type::Array(Arc::new(vec![Type::field()]), 3); let elements = im::vector![result_x, result_y, result_is_infinity]; let instruction = Instruction::MakeArray { elements, typ }; let result_array = - dfg.insert_instruction_and_results(instruction, block, None, call_stack.clone()); + dfg.insert_instruction_and_results(instruction, block, None, call_stack); SimplifyResult::SimplifiedTo(result_array.first()) } @@ -69,7 +72,7 @@ pub(super) fn simplify_msm( solver: impl BlackBoxFunctionSolver, arguments: &[ValueId], block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { let mut is_constant; @@ -142,19 +145,16 @@ pub(super) fn simplify_msm( // If there are no variable term, we can directly return the constant result if var_scalars.is_empty() { - let result_x = dfg.make_constant(result_x, Type::field()); - let result_y = dfg.make_constant(result_y, Type::field()); - let result_is_infinity = dfg.make_constant(result_is_infinity, Type::field()); + let result_x = dfg.make_constant(result_x, NumericType::NativeField); + let result_y = dfg.make_constant(result_y, NumericType::NativeField); + let result_is_infinity = + dfg.make_constant(result_is_infinity, NumericType::NativeField); let elements = im::vector![result_x, result_y, result_is_infinity]; let typ = Type::Array(Arc::new(vec![Type::field()]), 3); let instruction = Instruction::MakeArray { elements, typ }; - let result_array = dfg.insert_instruction_and_results( - instruction, - block, - None, - call_stack.clone(), - ); + let result_array = + dfg.insert_instruction_and_results(instruction, block, None, call_stack); return SimplifyResult::SimplifiedTo(result_array.first()); } @@ -163,14 +163,18 @@ pub(super) fn simplify_msm( return SimplifyResult::None; } // Add the constant part back to the non-constant part, if it is not null - let one = dfg.make_constant(FieldElement::one(), Type::field()); - let zero = dfg.make_constant(FieldElement::zero(), Type::field()); + let one = dfg.make_constant(FieldElement::one(), NumericType::NativeField); + let zero = dfg.make_constant(FieldElement::zero(), NumericType::NativeField); if result_is_infinity.is_zero() { var_scalars.push(one); var_scalars.push(zero); - let result_x = dfg.make_constant(result_x, Type::field()); - let result_y = dfg.make_constant(result_y, Type::field()); - let result_is_infinity = dfg.make_constant(result_is_infinity, Type::bool()); + let result_x = dfg.make_constant(result_x, NumericType::NativeField); + let result_y = dfg.make_constant(result_y, NumericType::NativeField); + + // Pushing a bool here is intentional, multi_scalar_mul takes two arguments: + // `points: [(Field, Field, bool); N]` and `scalars: [(Field, Field); N]`. + let result_is_infinity = dfg.make_constant(result_is_infinity, NumericType::bool()); + var_points.push(result_x); var_points.push(result_y); var_points.push(result_is_infinity); @@ -178,13 +182,12 @@ pub(super) fn simplify_msm( // Construct the simplified MSM expression let typ = Type::Array(Arc::new(vec![Type::field()]), var_scalars.len() as u32); let scalars = Instruction::MakeArray { elements: var_scalars.into(), typ }; - let scalars = dfg - .insert_instruction_and_results(scalars, block, None, call_stack.clone()) - .first(); + let scalars = + dfg.insert_instruction_and_results(scalars, block, None, call_stack).first(); let typ = Type::Array(Arc::new(vec![Type::field()]), var_points.len() as u32); let points = Instruction::MakeArray { elements: var_points.into(), typ }; let points = - dfg.insert_instruction_and_results(points, block, None, call_stack.clone()).first(); + dfg.insert_instruction_and_results(points, block, None, call_stack).first(); let msm = dfg.import_intrinsic(Intrinsic::BlackBox(BlackBoxFunc::MultiScalarMul)); SimplifyResult::SimplifiedToInstruction(Instruction::Call { func: msm, @@ -200,7 +203,7 @@ pub(super) fn simplify_poseidon2_permutation( solver: impl BlackBoxFunctionSolver, arguments: &[ValueId], block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { match (dfg.get_array_constant(arguments[0]), dfg.get_numeric_constant(arguments[1])) { (Some((state, _)), Some(state_length)) if array_is_constant(dfg, &state) => { @@ -221,7 +224,7 @@ pub(super) fn simplify_poseidon2_permutation( }; let new_state = new_state.into_iter(); - let typ = Type::field(); + let typ = NumericType::NativeField; let result_array = make_constant_array(dfg, new_state, typ, block, call_stack); SimplifyResult::SimplifiedTo(result_array) @@ -235,7 +238,7 @@ pub(super) fn simplify_hash( arguments: &[ValueId], hash_function: fn(&[u8]) -> Result<[u8; 32], BlackBoxResolutionError>, block: BasicBlockId, - call_stack: &CallStack, + call_stack: CallStackId, ) -> SimplifyResult { match dfg.get_array_constant(arguments[0]) { Some((input, _)) if array_is_constant(dfg, &input) => { @@ -246,7 +249,7 @@ pub(super) fn simplify_hash( let hash_values = hash.iter().map(|byte| FieldElement::from_be_bytes_reduce(&[*byte])); - let u8_type = Type::unsigned(8); + let u8_type = NumericType::Unsigned { bit_size: 8 }; let result_array = make_constant_array(dfg, hash_values, u8_type, block, call_stack); SimplifyResult::SimplifiedTo(result_array) } @@ -296,7 +299,7 @@ pub(super) fn simplify_signature( signature_verifier(&hashed_message, &public_key_x, &public_key_y, &signature) .expect("Rust solvable black box function should not fail"); - let valid_signature = dfg.make_constant(valid_signature.into(), Type::bool()); + let valid_signature = dfg.make_constant(valid_signature.into(), NumericType::bool()); SimplifyResult::SimplifiedTo(valid_signature) } _ => SimplifyResult::None, diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/cast.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/cast.rs index ed588def1d7..ee2ab43aa5d 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/cast.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/cast.rs @@ -7,7 +7,7 @@ use super::{DataFlowGraph, Instruction, NumericType, SimplifyResult, Type, Value /// that value is returned. Otherwise None is returned. pub(super) fn simplify_cast( value: ValueId, - dst_typ: &Type, + dst_typ: NumericType, dfg: &mut DataFlowGraph, ) -> SimplifyResult { use SimplifyResult::*; @@ -15,60 +15,55 @@ pub(super) fn simplify_cast( if let Value::Instruction { instruction, .. } = &dfg[value] { if let Instruction::Cast(original_value, _) = &dfg[*instruction] { - return SimplifiedToInstruction(Instruction::Cast(*original_value, dst_typ.clone())); + return SimplifiedToInstruction(Instruction::Cast(*original_value, dst_typ)); } } if let Some(constant) = dfg.get_numeric_constant(value) { - let src_typ = dfg.type_of_value(value); + let src_typ = dfg.type_of_value(value).unwrap_numeric(); match (src_typ, dst_typ) { - (Type::Numeric(NumericType::NativeField), Type::Numeric(NumericType::NativeField)) => { + (NumericType::NativeField, NumericType::NativeField) => { // Field -> Field: use src value SimplifiedTo(value) } ( - Type::Numeric(NumericType::Unsigned { .. } | NumericType::Signed { .. }), - Type::Numeric(NumericType::NativeField), + NumericType::Unsigned { .. } | NumericType::Signed { .. }, + NumericType::NativeField, ) => { // Unsigned/Signed -> Field: redefine same constant as Field - SimplifiedTo(dfg.make_constant(constant, dst_typ.clone())) + SimplifiedTo(dfg.make_constant(constant, dst_typ)) } ( - Type::Numeric( - NumericType::NativeField - | NumericType::Unsigned { .. } - | NumericType::Signed { .. }, - ), - Type::Numeric(NumericType::Unsigned { bit_size }), + NumericType::NativeField + | NumericType::Unsigned { .. } + | NumericType::Signed { .. }, + NumericType::Unsigned { bit_size }, ) => { // Field/Unsigned -> unsigned: truncate - let integer_modulus = BigUint::from(2u128).pow(*bit_size); + let integer_modulus = BigUint::from(2u128).pow(bit_size); let constant: BigUint = BigUint::from_bytes_be(&constant.to_be_bytes()); let truncated = constant % integer_modulus; let truncated = FieldElement::from_be_bytes_reduce(&truncated.to_bytes_be()); - SimplifiedTo(dfg.make_constant(truncated, dst_typ.clone())) + SimplifiedTo(dfg.make_constant(truncated, dst_typ)) } ( - Type::Numeric( - NumericType::NativeField - | NumericType::Unsigned { .. } - | NumericType::Signed { .. }, - ), - Type::Numeric(NumericType::Signed { bit_size }), + NumericType::NativeField + | NumericType::Unsigned { .. } + | NumericType::Signed { .. }, + NumericType::Signed { bit_size }, ) => { // Field/Unsigned -> signed // We only simplify to signed when we are below the maximum signed integer of the destination type. - let integer_modulus = BigUint::from(2u128).pow(*bit_size - 1); + let integer_modulus = BigUint::from(2u128).pow(bit_size - 1); let constant_uint: BigUint = BigUint::from_bytes_be(&constant.to_be_bytes()); if constant_uint < integer_modulus { - SimplifiedTo(dfg.make_constant(constant, dst_typ.clone())) + SimplifiedTo(dfg.make_constant(constant, dst_typ)) } else { None } } - _ => None, } - } else if *dst_typ == dfg.type_of_value(value) { + } else if Type::Numeric(dst_typ) == dfg.type_of_value(value) { SimplifiedTo(value) } else { None diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/constrain.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/constrain.rs index 66f50440d64..5ae6a642a57 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/constrain.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/instruction/constrain.rs @@ -1,5 +1,7 @@ use acvm::{acir::AcirField, FieldElement}; +use crate::ssa::ir::types::NumericType; + use super::{Binary, BinaryOp, ConstrainError, DataFlowGraph, Instruction, Type, Value, ValueId}; /// Try to decompose this constrain instruction. This constraint will be broken down such that it instead constrains @@ -20,7 +22,7 @@ pub(super) fn decompose_constrain( match (&dfg[lhs], &dfg[rhs]) { (Value::NumericConstant { constant, typ }, Value::Instruction { instruction, .. }) | (Value::Instruction { instruction, .. }, Value::NumericConstant { constant, typ }) - if *typ == Type::bool() => + if *typ == NumericType::bool() => { match dfg[*instruction] { Instruction::Binary(Binary { lhs, rhs, operator: BinaryOp::Eq }) @@ -61,7 +63,7 @@ pub(super) fn decompose_constrain( // Note that this doesn't remove the value `v2` as it may be used in other instructions, but it // will likely be removed through dead instruction elimination. let one = FieldElement::one(); - let one = dfg.make_constant(one, Type::bool()); + let one = dfg.make_constant(one, NumericType::bool()); [ decompose_constrain(lhs, one, msg, dfg), @@ -89,7 +91,7 @@ pub(super) fn decompose_constrain( // Note that this doesn't remove the value `v2` as it may be used in other instructions, but it // will likely be removed through dead instruction elimination. let zero = FieldElement::zero(); - let zero = dfg.make_constant(zero, dfg.type_of_value(lhs)); + let zero = dfg.make_constant(zero, dfg.type_of_value(lhs).unwrap_numeric()); [ decompose_constrain(lhs, zero, msg, dfg), @@ -112,7 +114,8 @@ pub(super) fn decompose_constrain( // Note that this doesn't remove the value `v1` as it may be used in other instructions, but it // will likely be removed through dead instruction elimination. let reversed_constant = FieldElement::from(!constant.is_one()); - let reversed_constant = dfg.make_constant(reversed_constant, Type::bool()); + let reversed_constant = + dfg.make_constant(reversed_constant, NumericType::bool()); decompose_constrain(value, reversed_constant, msg, dfg) } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/list.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/list.rs new file mode 100644 index 00000000000..9a84d304444 --- /dev/null +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/list.rs @@ -0,0 +1,187 @@ +use serde::{Deserialize, Serialize}; +use std::sync::Arc; + +/// A shared linked list type intended to be cloned +#[derive(Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +pub struct List { + head: Arc>, + len: usize, +} + +#[derive(Default, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] +enum Node { + #[default] + Nil, + Cons(T, Arc>), +} + +impl Default for List { + fn default() -> Self { + List { head: Arc::new(Node::Nil), len: 0 } + } +} + +impl List { + pub fn new() -> Self { + Self::default() + } + + /// This is actually a push_front since we just create a new head for the + /// list. This is done so that the tail of the list can still be shared. + /// In the case of call stacks, the last node will be main, while the top + /// of the call stack will be the head of this list. + pub fn push_back(&mut self, value: T) { + self.len += 1; + self.head = Arc::new(Node::Cons(value, self.head.clone())); + } + + /// It is more efficient to iterate from the head of the list towards the tail. + /// For callstacks this means from the top of the call stack towards main. + fn iter_rev(&self) -> IterRev { + IterRev { head: &self.head, len: self.len } + } + + pub fn clear(&mut self) { + *self = Self::default(); + } + + pub fn append(&mut self, other: Self) + where + T: Copy + std::fmt::Debug, + { + let other = other.into_iter().collect::>(); + + for item in other { + self.push_back(item); + } + } + + pub fn len(&self) -> usize { + self.len + } + + pub fn is_empty(&self) -> bool { + self.len == 0 + } + + fn pop_front(&mut self) -> Option + where + T: Copy, + { + match self.head.as_ref() { + Node::Nil => None, + Node::Cons(value, rest) => { + let value = *value; + self.head = rest.clone(); + self.len -= 1; + Some(value) + } + } + } + + pub fn truncate(&mut self, len: usize) + where + T: Copy, + { + if self.len > len { + for _ in 0..self.len - len { + self.pop_front(); + } + } + } + + pub fn unit(item: T) -> Self { + let mut this = Self::default(); + this.push_back(item); + this + } + + pub fn back(&self) -> Option<&T> { + match self.head.as_ref() { + Node::Nil => None, + Node::Cons(item, _) => Some(item), + } + } +} + +pub struct IterRev<'a, T> { + head: &'a Node, + len: usize, +} + +impl IntoIterator for List +where + T: Copy + std::fmt::Debug, +{ + type Item = T; + + type IntoIter = std::iter::Rev>; + + fn into_iter(self) -> Self::IntoIter { + let items: Vec<_> = self.iter_rev().copied().collect(); + items.into_iter().rev() + } +} + +impl<'a, T> IntoIterator for &'a List { + type Item = &'a T; + + type IntoIter = std::iter::Rev< as IntoIterator>::IntoIter>; + + fn into_iter(self) -> Self::IntoIter { + let items: Vec<_> = self.iter_rev().collect(); + items.into_iter().rev() + } +} + +impl<'a, T> Iterator for IterRev<'a, T> { + type Item = &'a T; + + fn next(&mut self) -> Option { + match self.head { + Node::Nil => None, + Node::Cons(value, rest) => { + self.head = rest; + Some(value) + } + } + } + + fn size_hint(&self) -> (usize, Option) { + (0, Some(self.len)) + } +} + +impl<'a, T> ExactSizeIterator for IterRev<'a, T> {} + +impl std::fmt::Debug for List +where + T: std::fmt::Debug, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "[")?; + for (i, item) in self.iter_rev().enumerate() { + if i != 0 { + write!(f, ", ")?; + } + write!(f, "{item:?}")?; + } + write!(f, "]") + } +} + +impl std::fmt::Display for List +where + T: std::fmt::Display, +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "[")?; + for (i, item) in self.iter_rev().enumerate() { + if i != 0 { + write!(f, ", ")?; + } + write!(f, "{item}")?; + } + write!(f, "]") + } +} diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/map.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/map.rs index 23f5380f030..0fb02f19b14 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/map.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/map.rs @@ -4,7 +4,7 @@ use std::{ collections::BTreeMap, hash::Hash, str::FromStr, - sync::atomic::{AtomicUsize, Ordering}, + sync::atomic::{AtomicU32, Ordering}, }; use thiserror::Error; @@ -18,7 +18,7 @@ use thiserror::Error; /// another map where it will likely be invalid. #[derive(Serialize, Deserialize)] pub(crate) struct Id { - index: usize, + index: u32, // If we do not skip this field it will simply serialize as `"_marker":null` which is useless extra data #[serde(skip)] _marker: std::marker::PhantomData, @@ -26,14 +26,15 @@ pub(crate) struct Id { impl Id { /// Constructs a new Id for the given index. - /// This constructor is deliberately private to prevent - /// constructing invalid IDs. - pub(crate) fn new(index: usize) -> Self { + /// + /// This is private so that we can guarantee ids created from this function + /// point to valid T values in their external maps. + fn new(index: u32) -> Self { Self { index, _marker: std::marker::PhantomData } } /// Returns the underlying index of this Id. - pub(crate) fn to_usize(self) -> usize { + pub(crate) fn to_u32(self) -> u32 { self.index } @@ -43,7 +44,7 @@ impl Id { /// as unlike DenseMap::push and SparseMap::push, the Ids created /// here are likely invalid for any particularly map. #[cfg(test)] - pub(crate) fn test_new(index: usize) -> Self { + pub(crate) fn test_new(index: u32) -> Self { Self::new(index) } } @@ -187,7 +188,7 @@ impl DenseMap { /// Adds an element to the map. /// Returns the identifier/reference to that element. pub(crate) fn insert(&mut self, element: T) -> Id { - let id = Id::new(self.storage.len()); + let id = Id::new(self.storage.len().try_into().unwrap()); self.storage.push(element); id } @@ -195,7 +196,7 @@ impl DenseMap { /// Given the Id of the element being created, adds the element /// returned by the given function to the map pub(crate) fn insert_with_id(&mut self, f: impl FnOnce(Id) -> T) -> Id { - let id = Id::new(self.storage.len()); + let id = Id::new(self.storage.len().try_into().unwrap()); self.storage.push(f(id)); id } @@ -204,7 +205,7 @@ impl DenseMap { /// /// The id-element pairs are ordered by the numeric values of the ids. pub(crate) fn iter(&self) -> impl ExactSizeIterator, &T)> { - let ids_iter = (0..self.storage.len()).map(|idx| Id::new(idx)); + let ids_iter = (0..self.storage.len() as u32).map(|idx| Id::new(idx)); ids_iter.zip(self.storage.iter()) } } @@ -219,13 +220,13 @@ impl std::ops::Index> for DenseMap { type Output = T; fn index(&self, id: Id) -> &Self::Output { - &self.storage[id.index] + &self.storage[id.index as usize] } } impl std::ops::IndexMut> for DenseMap { fn index_mut(&mut self, id: Id) -> &mut Self::Output { - &mut self.storage[id.index] + &mut self.storage[id.index as usize] } } @@ -253,7 +254,7 @@ impl SparseMap { /// Adds an element to the map. /// Returns the identifier/reference to that element. pub(crate) fn insert(&mut self, element: T) -> Id { - let id = Id::new(self.storage.len()); + let id = Id::new(self.storage.len().try_into().unwrap()); self.storage.insert(id, element); id } @@ -261,7 +262,7 @@ impl SparseMap { /// Given the Id of the element being created, adds the element /// returned by the given function to the map pub(crate) fn insert_with_id(&mut self, f: impl FnOnce(Id) -> T) -> Id { - let id = Id::new(self.storage.len()); + let id = Id::new(self.storage.len().try_into().unwrap()); self.storage.insert(id, f(id)); id } @@ -365,7 +366,7 @@ impl std::ops::Index<&K> for TwoWayMap { /// This type wraps an AtomicUsize so it can safely be used across threads. #[derive(Debug, Serialize, Deserialize)] pub(crate) struct AtomicCounter { - next: AtomicUsize, + next: AtomicU32, _marker: std::marker::PhantomData, } @@ -373,7 +374,7 @@ impl AtomicCounter { /// Create a new counter starting after the given Id. /// Use AtomicCounter::default() to start at zero. pub(crate) fn starting_after(id: Id) -> Self { - Self { next: AtomicUsize::new(id.index + 1), _marker: Default::default() } + Self { next: AtomicU32::new(id.index + 1), _marker: Default::default() } } /// Return the next fresh id diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/mod.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/mod.rs index 3ef680dda0f..88e0d8900db 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/mod.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/mod.rs @@ -1,10 +1,12 @@ pub(crate) mod basic_block; +pub(crate) mod call_stack; pub(crate) mod cfg; pub(crate) mod dfg; pub(crate) mod dom; pub(crate) mod function; pub(crate) mod function_inserter; pub(crate) mod instruction; +pub mod list; pub(crate) mod map; pub(crate) mod post_order; pub(crate) mod printer; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/types.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/types.rs index 4e4f7e8aa62..0dd7fd92ee5 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/types.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/types.rs @@ -30,6 +30,31 @@ impl NumericType { } } + /// Creates a NumericType::Signed type + pub(crate) fn signed(bit_size: u32) -> NumericType { + NumericType::Signed { bit_size } + } + + /// Creates a NumericType::Unsigned type + pub(crate) fn unsigned(bit_size: u32) -> NumericType { + NumericType::Unsigned { bit_size } + } + + /// Creates the u1 type + pub(crate) fn bool() -> NumericType { + NumericType::Unsigned { bit_size: 1 } + } + + /// Creates the char type, represented as u8. + pub(crate) fn char() -> NumericType { + NumericType::Unsigned { bit_size: 8 } + } + + /// Creates the type of an array's length. + pub(crate) fn length_type() -> NumericType { + NumericType::Unsigned { bit_size: SSA_WORD_SIZE } + } + /// Returns None if the given Field value is within the numeric limits /// for the current NumericType. Otherwise returns a string describing /// the limits, as a range. @@ -63,6 +88,10 @@ impl NumericType { NumericType::NativeField => None, } } + + pub(crate) fn is_unsigned(&self) -> bool { + matches!(self, NumericType::Unsigned { .. }) + } } /// All types representable in the IR. @@ -125,6 +154,14 @@ impl Type { Type::unsigned(SSA_WORD_SIZE) } + /// Returns the inner NumericType if this is one, or panics otherwise + pub(crate) fn unwrap_numeric(&self) -> NumericType { + match self { + Type::Numeric(numeric) => *numeric, + other => panic!("Expected NumericType, found {other}"), + } + } + /// Returns the bit size of the provided numeric type. /// /// # Panics diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/value.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/value.rs index ef494200308..ec7a8e25246 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/value.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ir/value.rs @@ -1,3 +1,5 @@ +use std::borrow::Cow; + use acvm::FieldElement; use serde::{Deserialize, Serialize}; @@ -7,7 +9,7 @@ use super::{ function::FunctionId, instruction::{InstructionId, Intrinsic}, map::Id, - types::Type, + types::{NumericType, Type}, }; pub(crate) type ValueId = Id; @@ -34,7 +36,7 @@ pub(crate) enum Value { Param { block: BasicBlockId, position: usize, typ: Type }, /// This Value originates from a numeric constant - NumericConstant { constant: FieldElement, typ: Type }, + NumericConstant { constant: FieldElement, typ: NumericType }, /// This Value refers to a function in the IR. /// Functions always have the type Type::Function. @@ -55,14 +57,13 @@ pub(crate) enum Value { impl Value { /// Retrieves the type of this Value - pub(crate) fn get_type(&self) -> &Type { + pub(crate) fn get_type(&self) -> Cow { match self { - Value::Instruction { typ, .. } => typ, - Value::Param { typ, .. } => typ, - Value::NumericConstant { typ, .. } => typ, - Value::Function { .. } => &Type::Function, - Value::Intrinsic { .. } => &Type::Function, - Value::ForeignFunction { .. } => &Type::Function, + Value::Instruction { typ, .. } | Value::Param { typ, .. } => Cow::Borrowed(typ), + Value::NumericConstant { typ, .. } => Cow::Owned(Type::Numeric(*typ)), + Value::Function { .. } | Value::Intrinsic { .. } | Value::ForeignFunction { .. } => { + Cow::Owned(Type::Function) + } } } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/as_slice_length.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/as_slice_length.rs index 75cdea349b7..c6cdffd3bc3 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/as_slice_length.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/as_slice_length.rs @@ -2,7 +2,7 @@ use crate::ssa::{ ir::{ function::Function, instruction::{Instruction, InstructionId, Intrinsic}, - types::Type, + types::{NumericType, Type}, value::Value, }, ssa_gen::Ssa, @@ -71,7 +71,7 @@ fn replace_known_slice_lengths( // This isn't strictly necessary as a new result will be defined the next time for which the instruction // is reinserted but this avoids leaving the program in an invalid state. func.dfg.replace_result(instruction_id, original_slice_length); - let known_length = func.dfg.make_constant(known_length.into(), Type::length_type()); + let known_length = func.dfg.make_constant(known_length.into(), NumericType::length_type()); func.dfg.set_value_from_id(original_slice_length, known_length); }); } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/assert_constant.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/assert_constant.rs index 348c78683a0..6936c7ad542 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/assert_constant.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/assert_constant.rs @@ -92,7 +92,7 @@ fn evaluate_assert_constant( if arguments.iter().all(|arg| function.dfg.is_constant(*arg)) { Ok(false) } else { - let call_stack = function.dfg.get_call_stack(instruction); + let call_stack = function.dfg.get_instruction_call_stack(instruction); Err(RuntimeError::AssertConstantFailed { call_stack }) } } @@ -113,14 +113,14 @@ fn evaluate_static_assert( } if !function.dfg.is_constant(arguments[1]) { - let call_stack = function.dfg.get_call_stack(instruction); + let call_stack = function.dfg.get_instruction_call_stack(instruction); return Err(RuntimeError::StaticAssertDynamicMessage { call_stack }); } if function.dfg.is_constant_true(arguments[0]) { Ok(false) } else { - let call_stack = function.dfg.get_call_stack(instruction); + let call_stack = function.dfg.get_instruction_call_stack(instruction); if function.dfg.is_constant(arguments[0]) { Err(RuntimeError::StaticAssertFailed { call_stack }) } else { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs index e039b8f0f9e..c81a557178b 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/constant_folding.rs @@ -43,7 +43,7 @@ use crate::{ dom::DominatorTree, function::{Function, FunctionId, RuntimeType}, instruction::{Instruction, InstructionId}, - types::Type, + types::{NumericType, Type}, value::{Value, ValueId}, }, ssa_gen::Ssa, @@ -125,11 +125,13 @@ impl Ssa { } // The ones that remain are never called: let's remove them. - for func_id in brillig_functions.keys() { + for (func_id, func) in &brillig_functions { // We never want to remove the main function (it could be `unconstrained` or it // could have been turned into brillig if `--force-brillig` was given). // We also don't want to remove entry points. - if self.main_id == *func_id || self.entry_point_to_generated_index.contains_key(func_id) + let runtime = func.runtime(); + if self.main_id == *func_id + || (runtime.is_entry_point() && matches!(runtime, RuntimeType::Acir(_))) { continue; } @@ -274,7 +276,7 @@ impl<'brillig> Context<'brillig> { // Default side effect condition variable with an enabled state. let mut side_effects_enabled_var = - function.dfg.make_constant(FieldElement::one(), Type::bool()); + function.dfg.make_constant(FieldElement::one(), NumericType::bool()); for instruction_id in instructions { self.fold_constants_into_instruction( @@ -315,7 +317,7 @@ impl<'brillig> Context<'brillig> { if matches!(instruction, Instruction::MakeArray { .. }) { let value = *cached.last().unwrap(); let inc_rc = Instruction::IncrementRc { value }; - let call_stack = dfg.get_call_stack(id); + let call_stack = dfg.get_instruction_call_stack_id(id); dfg.insert_instruction_and_results(inc_rc, block, None, call_stack); } @@ -370,7 +372,7 @@ impl<'brillig> Context<'brillig> { dom: &mut DominatorTree, constraint_simplification_mapping: &HashMap, ) -> Instruction { - let instruction = dfg[instruction_id].clone(); + let mut instruction = dfg[instruction_id].clone(); // Alternate between resolving `value_id` in the `dfg` and checking to see if the resolved value // has been constrained to be equal to some simpler value in the current block. @@ -398,9 +400,10 @@ impl<'brillig> Context<'brillig> { } // Resolve any inputs to ensure that we're comparing like-for-like instructions. - instruction.map_values(|value_id| { + instruction.map_values_mut(|value_id| { resolve_cache(block, dfg, dom, constraint_simplification_mapping, value_id) - }) + }); + instruction } /// Pushes a new [`Instruction`] into the [`DataFlowGraph`] which applies any optimizations @@ -418,7 +421,7 @@ impl<'brillig> Context<'brillig> { .requires_ctrl_typevars() .then(|| vecmap(old_results, |result| dfg.type_of_value(*result))); - let call_stack = dfg.get_call_stack(id); + let call_stack = dfg.get_instruction_call_stack_id(id); let new_results = match dfg.insert_instruction_and_results(instruction, block, ctrl_typevars, call_stack) { @@ -655,7 +658,7 @@ impl<'brillig> Context<'brillig> { dfg: &mut DataFlowGraph, ) -> ValueId { match typ { - Type::Numeric(_) => { + Type::Numeric(typ) => { let memory = memory_values[*memory_index]; *memory_index += 1; @@ -829,7 +832,10 @@ mod test { use crate::ssa::{ function_builder::FunctionBuilder, - ir::{map::Id, types::Type}, + ir::{ + map::Id, + types::{NumericType, Type}, + }, opt::assert_normalized_ssa_equals, Ssa, }; @@ -853,7 +859,7 @@ mod test { assert_eq!(instructions.len(), 2); // The final return is not counted let v0 = main.parameters()[0]; - let two = main.dfg.make_constant(2_u128.into(), Type::field()); + let two = main.dfg.make_constant(2_u128.into(), NumericType::NativeField); main.dfg.set_value_from_id(v0, two); @@ -889,7 +895,7 @@ mod test { // Note that this constant guarantees that `v0/constant < 2^8`. We then do not need to truncate the result. let constant = 2_u128.pow(8); - let constant = main.dfg.make_constant(constant.into(), Type::unsigned(16)); + let constant = main.dfg.make_constant(constant.into(), NumericType::unsigned(16)); main.dfg.set_value_from_id(v1, constant); @@ -927,7 +933,7 @@ mod test { // Note that this constant does not guarantee that `v0/constant < 2^8`. We must then truncate the result. let constant = 2_u128.pow(8) - 1; - let constant = main.dfg.make_constant(constant.into(), Type::unsigned(16)); + let constant = main.dfg.make_constant(constant.into(), NumericType::unsigned(16)); main.dfg.set_value_from_id(v1, constant); @@ -1148,7 +1154,7 @@ mod test { // Compiling main let mut builder = FunctionBuilder::new("main".into(), main_id); let v0 = builder.add_parameter(Type::unsigned(64)); - let zero = builder.numeric_constant(0u128, Type::unsigned(64)); + let zero = builder.numeric_constant(0u128, NumericType::unsigned(64)); let typ = Type::Array(Arc::new(vec![Type::unsigned(64)]), 25); let array_contents = im::vector![ diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/defunctionalize.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/defunctionalize.rs index cfeb8751f25..7d7798fd30a 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/defunctionalize.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/defunctionalize.rs @@ -130,13 +130,14 @@ impl DefunctionalizationContext { // Change the type of all the values that are not call targets to NativeField let value_ids = vecmap(func.dfg.values_iter(), |(id, _)| id); for value_id in value_ids { - if let Type::Function = &func.dfg[value_id].get_type() { + if let Type::Function = func.dfg[value_id].get_type().as_ref() { match &func.dfg[value_id] { // If the value is a static function, transform it to the function id Value::Function(id) => { if !call_target_values.contains(&value_id) { + let field = NumericType::NativeField; let new_value = - func.dfg.make_constant(function_id_to_field(*id), Type::field()); + func.dfg.make_constant(function_id_to_field(*id), field); func.dfg.set_value_from_id(value_id, new_value); } } @@ -267,7 +268,7 @@ fn create_apply_functions( } fn function_id_to_field(function_id: FunctionId) -> FieldElement { - (function_id.to_usize() as u128).into() + (function_id.to_u32() as u128).into() } /// Creates an apply function for the given signature and variants @@ -287,10 +288,8 @@ fn create_apply_function( let is_last = index == function_ids.len() - 1; let mut next_function_block = None; - let function_id_constant = function_builder.numeric_constant( - function_id_to_field(*function_id), - Type::Numeric(NumericType::NativeField), - ); + let function_id_constant = function_builder + .numeric_constant(function_id_to_field(*function_id), NumericType::NativeField); // If it's not the last function to dispatch, create an if statement if !is_last { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/die.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/die.rs index f7ac6f7b313..7b38b764eab 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/die.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/die.rs @@ -1,23 +1,24 @@ //! Dead Instruction Elimination (DIE) pass: Removes any instruction without side-effects for //! which the results are unused. use fxhash::{FxHashMap as HashMap, FxHashSet as HashSet}; -use im::Vector; -use noirc_errors::Location; use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator}; use crate::ssa::{ ir::{ basic_block::{BasicBlock, BasicBlockId}, + call_stack::CallStackId, dfg::DataFlowGraph, function::Function, instruction::{BinaryOp, Instruction, InstructionId, Intrinsic}, post_order::PostOrder, - types::Type, + types::{NumericType, Type}, value::{Value, ValueId}, }, - ssa_gen::{Ssa, SSA_WORD_SIZE}, + ssa_gen::Ssa, }; +use super::rc::{pop_rc_for, RcInstruction}; + impl Ssa { /// Performs Dead Instruction Elimination (DIE) to remove any instructions with /// unused results. @@ -106,6 +107,8 @@ impl Context { let instructions_len = block.instructions().len(); + let mut rc_tracker = RcTracker::default(); + // Indexes of instructions that might be out of bounds. // We'll remove those, but before that we'll insert bounds checks for them. let mut possible_index_out_of_bounds_indexes = Vec::new(); @@ -133,8 +136,13 @@ impl Context { }); } } + + rc_tracker.track_inc_rcs_to_remove(*instruction_id, function); } + self.instructions_to_remove.extend(rc_tracker.get_non_mutated_arrays(&function.dfg)); + self.instructions_to_remove.extend(rc_tracker.rc_pairs_to_remove); + // If there are some instructions that might trigger an out of bounds error, // first add constrain checks. Then run the DIE pass again, which will remove those // but leave the constrains (any any value needed by those constrains) @@ -281,37 +289,37 @@ impl Context { _ => panic!("Expected an ArrayGet or ArraySet instruction here"), }; - let call_stack = function.dfg.get_call_stack(instruction_id); + let call_stack = function.dfg.get_instruction_call_stack_id(instruction_id); let (lhs, rhs) = if function.dfg.get_numeric_constant(*index).is_some() { // If we are here it means the index is known but out of bounds. That's always an error! - let false_const = function.dfg.make_constant(false.into(), Type::bool()); - let true_const = function.dfg.make_constant(true.into(), Type::bool()); + let false_const = function.dfg.make_constant(false.into(), NumericType::bool()); + let true_const = function.dfg.make_constant(true.into(), NumericType::bool()); (false_const, true_const) } else { // `index` will be relative to the flattened array length, so we need to take that into account let array_length = function.dfg.type_of_value(*array).flattened_size(); // If we are here it means the index is dynamic, so let's add a check that it's less than length + let length_type = NumericType::length_type(); let index = function.dfg.insert_instruction_and_results( - Instruction::Cast(*index, Type::unsigned(SSA_WORD_SIZE)), + Instruction::Cast(*index, length_type), block_id, None, - call_stack.clone(), + call_stack, ); let index = index.first(); - let array_typ = Type::unsigned(SSA_WORD_SIZE); let array_length = - function.dfg.make_constant((array_length as u128).into(), array_typ); + function.dfg.make_constant((array_length as u128).into(), length_type); let is_index_out_of_bounds = function.dfg.insert_instruction_and_results( Instruction::binary(BinaryOp::Lt, index, array_length), block_id, None, - call_stack.clone(), + call_stack, ); let is_index_out_of_bounds = is_index_out_of_bounds.first(); - let true_const = function.dfg.make_constant(true.into(), Type::bool()); + let true_const = function.dfg.make_constant(true.into(), NumericType::bool()); (is_index_out_of_bounds, true_const) }; @@ -321,7 +329,7 @@ impl Context { rhs, function, block_id, - call_stack.clone(), + call_stack, ); let message = Some("Index out of bounds".to_owned().into()); @@ -484,7 +492,7 @@ fn apply_side_effects( rhs: ValueId, function: &mut Function, block_id: BasicBlockId, - call_stack: Vector, + call_stack: CallStackId, ) -> (ValueId, ValueId) { // See if there's an active "enable side effects" condition let Some(condition) = side_effects_condition else { @@ -495,19 +503,15 @@ fn apply_side_effects( // Condition needs to be cast to argument type in order to multiply them together. // In our case, lhs is always a boolean. - let casted_condition = dfg.insert_instruction_and_results( - Instruction::Cast(condition, Type::bool()), - block_id, - None, - call_stack.clone(), - ); + let cast = Instruction::Cast(condition, NumericType::bool()); + let casted_condition = dfg.insert_instruction_and_results(cast, block_id, None, call_stack); let casted_condition = casted_condition.first(); let lhs = dfg.insert_instruction_and_results( Instruction::binary(BinaryOp::Mul, lhs, casted_condition), block_id, None, - call_stack.clone(), + call_stack, ); let lhs = lhs.first(); @@ -522,6 +526,112 @@ fn apply_side_effects( (lhs, rhs) } +#[derive(Default)] +struct RcTracker { + // We can track IncrementRc instructions per block to determine whether they are useless. + // IncrementRc and DecrementRc instructions are normally side effectual instructions, but we remove + // them if their value is not used anywhere in the function. However, even when their value is used, their existence + // is pointless logic if there is no array set between the increment and the decrement of the reference counter. + // We track per block whether an IncrementRc instruction has a paired DecrementRc instruction + // with the same value but no array set in between. + // If we see an inc/dec RC pair within a block we can safely remove both instructions. + rcs_with_possible_pairs: HashMap>, + rc_pairs_to_remove: HashSet, + // We also separately track all IncrementRc instructions and all array types which have been mutably borrowed. + // If an array is the same type as one of those non-mutated array types, we can safely remove all IncrementRc instructions on that array. + inc_rcs: HashMap>, + mutated_array_types: HashSet, + // The SSA often creates patterns where after simplifications we end up with repeat + // IncrementRc instructions on the same value. We track whether the previous instruction was an IncrementRc, + // and if the current instruction is also an IncrementRc on the same value we remove the current instruction. + // `None` if the previous instruction was anything other than an IncrementRc + previous_inc_rc: Option, +} + +impl RcTracker { + fn track_inc_rcs_to_remove(&mut self, instruction_id: InstructionId, function: &Function) { + let instruction = &function.dfg[instruction_id]; + + if let Instruction::IncrementRc { value } = instruction { + if let Some(previous_value) = self.previous_inc_rc { + if previous_value == *value { + self.rc_pairs_to_remove.insert(instruction_id); + } + } + self.previous_inc_rc = Some(*value); + } else { + self.previous_inc_rc = None; + } + + // DIE loops over a block in reverse order, so we insert an RC instruction for possible removal + // when we see a DecrementRc and check whether it was possibly mutated when we see an IncrementRc. + match instruction { + Instruction::IncrementRc { value } => { + if let Some(inc_rc) = + pop_rc_for(*value, function, &mut self.rcs_with_possible_pairs) + { + if !inc_rc.possibly_mutated { + self.rc_pairs_to_remove.insert(inc_rc.id); + self.rc_pairs_to_remove.insert(instruction_id); + } + } + + self.inc_rcs.entry(*value).or_default().insert(instruction_id); + } + Instruction::DecrementRc { value } => { + let typ = function.dfg.type_of_value(*value); + + // We assume arrays aren't mutated until we find an array_set + let dec_rc = + RcInstruction { id: instruction_id, array: *value, possibly_mutated: false }; + self.rcs_with_possible_pairs.entry(typ).or_default().push(dec_rc); + } + Instruction::ArraySet { array, .. } => { + let typ = function.dfg.type_of_value(*array); + if let Some(dec_rcs) = self.rcs_with_possible_pairs.get_mut(&typ) { + for dec_rc in dec_rcs { + dec_rc.possibly_mutated = true; + } + } + + self.mutated_array_types.insert(typ); + } + Instruction::Store { value, .. } => { + // We are very conservative and say that any store of an array type means it has the potential to be mutated. + let typ = function.dfg.type_of_value(*value); + if matches!(&typ, Type::Array(..) | Type::Slice(..)) { + self.mutated_array_types.insert(typ); + } + } + Instruction::Call { arguments, .. } => { + for arg in arguments { + let typ = function.dfg.type_of_value(*arg); + if matches!(&typ, Type::Array(..) | Type::Slice(..)) { + self.mutated_array_types.insert(typ); + } + } + } + _ => {} + } + } + + fn get_non_mutated_arrays(&self, dfg: &DataFlowGraph) -> HashSet { + self.inc_rcs + .keys() + .filter_map(|value| { + let typ = dfg.type_of_value(*value); + if !self.mutated_array_types.contains(&typ) { + Some(&self.inc_rcs[value]) + } else { + None + } + }) + .flatten() + .copied() + .collect() + } +} + #[cfg(test)] mod test { use std::sync::Arc; @@ -530,7 +640,10 @@ mod test { use crate::ssa::{ function_builder::FunctionBuilder, - ir::{map::Id, types::Type}, + ir::{ + map::Id, + types::{NumericType, Type}, + }, opt::assert_normalized_ssa_equals, Ssa, }; @@ -602,6 +715,30 @@ mod test { assert_normalized_ssa_equals(ssa, expected); } + #[test] + fn remove_useless_paired_rcs_even_when_used() { + let src = " + acir(inline) fn main f0 { + b0(v0: [Field; 2]): + inc_rc v0 + v2 = array_get v0, index u32 0 -> Field + dec_rc v0 + return v2 + } + "; + let ssa = Ssa::from_str(src).unwrap(); + + let expected = " + acir(inline) fn main f0 { + b0(v0: [Field; 2]): + v2 = array_get v0, index u32 0 -> Field + return v2 + } + "; + let ssa = ssa.dead_instruction_elimination(); + assert_normalized_ssa_equals(ssa, expected); + } + #[test] fn keep_paired_rcs_with_array_set() { let src = " @@ -639,7 +776,7 @@ mod test { // Compiling main let mut builder = FunctionBuilder::new("main".into(), main_id); - let zero = builder.numeric_constant(0u128, Type::unsigned(32)); + let zero = builder.numeric_constant(0u128, NumericType::unsigned(32)); let array_type = Type::Array(Arc::new(vec![Type::unsigned(32)]), 2); let v1 = builder.insert_make_array(vector![zero, zero], array_type.clone()); let v2 = builder.insert_allocate(array_type.clone()); @@ -652,7 +789,7 @@ mod test { builder.switch_to_block(b1); let v3 = builder.insert_load(v2, array_type); - let one = builder.numeric_constant(1u128, Type::unsigned(32)); + let one = builder.numeric_constant(1u128, NumericType::unsigned(32)); let v5 = builder.insert_array_set(v3, zero, one); builder.terminate_with_return(vec![v5]); @@ -671,6 +808,49 @@ mod test { assert_eq!(main.dfg[b1].instructions().len(), 2); } + #[test] + fn keep_inc_rc_on_borrowed_array_set() { + // acir(inline) fn main f0 { + // b0(v0: [u32; 2]): + // inc_rc v0 + // v3 = array_set v0, index u32 0, value u32 1 + // inc_rc v0 + // inc_rc v0 + // inc_rc v0 + // v4 = array_get v3, index u32 1 + // return v4 + // } + let src = " + acir(inline) fn main f0 { + b0(v0: [u32; 2]): + inc_rc v0 + v3 = array_set v0, index u32 0, value u32 1 + inc_rc v0 + inc_rc v0 + inc_rc v0 + v4 = array_get v3, index u32 1 -> u32 + return v4 + } + "; + let ssa = Ssa::from_str(src).unwrap(); + + // We expect the output to be unchanged + // Except for the repeated inc_rc instructions + let expected = " + acir(inline) fn main f0 { + b0(v0: [u32; 2]): + inc_rc v0 + v3 = array_set v0, index u32 0, value u32 1 + inc_rc v0 + v4 = array_get v3, index u32 1 -> u32 + return v4 + } + "; + + let ssa = ssa.dead_instruction_elimination(); + assert_normalized_ssa_equals(ssa, expected); + } + #[test] fn does_not_remove_inc_or_dec_rc_of_if_they_are_loaded_from_a_reference() { let src = " @@ -691,4 +871,69 @@ mod test { let ssa = ssa.dead_instruction_elimination(); assert_normalized_ssa_equals(ssa, src); } + + #[test] + fn remove_inc_rcs_that_are_never_mutably_borrowed() { + let src = " + acir(inline) fn main f0 { + b0(v0: [Field; 2]): + inc_rc v0 + inc_rc v0 + inc_rc v0 + v2 = array_get v0, index u32 0 -> Field + inc_rc v0 + return v2 + } + "; + + let ssa = Ssa::from_str(src).unwrap(); + let main = ssa.main(); + + // The instruction count never includes the terminator instruction + assert_eq!(main.dfg[main.entry_block()].instructions().len(), 5); + + let expected = " + acir(inline) fn main f0 { + b0(v0: [Field; 2]): + v2 = array_get v0, index u32 0 -> Field + return v2 + } + "; + + let ssa = ssa.dead_instruction_elimination(); + assert_normalized_ssa_equals(ssa, expected); + } + + #[test] + fn do_not_remove_inc_rc_if_used_as_call_arg() { + // We do not want to remove inc_rc instructions on values + // that are passed as call arguments. + // + // We could have previously inlined a function which does the following: + // - Accepts a mutable array as an argument + // - Writes to that array + // - Passes the new array to another call + // + // It is possible then that the mutation gets simplified out after inlining. + // If we then remove the inc_rc as we see no mutations to that array in the block, + // we may end up with an the incorrect reference count. + let src = " + brillig(inline) fn main f0 { + b0(v0: Field): + v4 = make_array [Field 0, Field 1, Field 2] : [Field; 3] + inc_rc v4 + v6 = call f1(v4) -> Field + constrain v0 == v6 + return + } + brillig(inline) fn foo f1 { + b0(v0: [Field; 3]): + return u32 1 + } + "; + + let ssa = Ssa::from_str(src).unwrap(); + let ssa = ssa.dead_instruction_elimination(); + assert_normalized_ssa_equals(ssa, src); + } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs index 3fbccf93ec9..43420229257 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs @@ -139,12 +139,13 @@ use iter_extended::vecmap; use crate::ssa::{ ir::{ basic_block::BasicBlockId, + call_stack::CallStackId, cfg::ControlFlowGraph, - dfg::{CallStack, InsertInstructionResult}, + dfg::InsertInstructionResult, function::{Function, FunctionId, RuntimeType}, function_inserter::FunctionInserter, instruction::{BinaryOp, Instruction, InstructionId, Intrinsic, TerminatorInstruction}, - types::Type, + types::{NumericType, Type}, value::{Value, ValueId}, }, ssa_gen::Ssa, @@ -234,7 +235,7 @@ struct ConditionalContext { // First block of the else branch else_branch: Option, // Call stack where the final location is that of the entire `if` expression - call_stack: CallStack, + call_stack: CallStackId, } fn flatten_function_cfg(function: &mut Function, no_predicates: &HashMap) { @@ -285,7 +286,7 @@ impl<'f> Context<'f> { if let Some(context) = self.condition_stack.last() { let previous_branch = context.else_branch.as_ref().unwrap_or(&context.then_branch); let and = Instruction::binary(BinaryOp::And, previous_branch.condition, condition); - let call_stack = self.inserter.function.dfg.get_value_call_stack(condition); + let call_stack = self.inserter.function.dfg.get_value_call_stack_id(condition); self.insert_instruction(and, call_stack) } else { condition @@ -332,15 +333,12 @@ impl<'f> Context<'f> { for instruction in instructions.iter() { if self.is_no_predicate(no_predicates, instruction) { // disable side effect for no_predicate functions - let one = self - .inserter - .function - .dfg - .make_constant(FieldElement::one(), Type::unsigned(1)); + let bool_type = NumericType::bool(); + let one = self.inserter.function.dfg.make_constant(FieldElement::one(), bool_type); self.insert_instruction_with_typevars( Instruction::EnableSideEffectsIf { condition: one }, None, - im::Vector::new(), + CallStackId::root(), ); self.push_instruction(*instruction); self.insert_current_side_effects_enabled(); @@ -368,13 +366,7 @@ impl<'f> Context<'f> { call_stack, } => { self.arguments_stack.push(vec![]); - self.if_start( - condition, - then_destination, - else_destination, - &block, - call_stack.clone(), - ) + self.if_start(condition, then_destination, else_destination, &block, *call_stack) } TerminatorInstruction::Jmp { destination, arguments, call_stack: _ } => { let arguments = vecmap(arguments.clone(), |value| self.inserter.resolve(value)); @@ -390,7 +382,7 @@ impl<'f> Context<'f> { } } TerminatorInstruction::Return { return_values, call_stack } => { - let call_stack = call_stack.clone(); + let call_stack = *call_stack; let return_values = vecmap(return_values.clone(), |value| self.inserter.resolve(value)); let new_return = TerminatorInstruction::Return { return_values, call_stack }; @@ -409,7 +401,7 @@ impl<'f> Context<'f> { then_destination: &BasicBlockId, else_destination: &BasicBlockId, if_entry: &BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, ) -> Vec { // manage conditions let old_condition = *condition; @@ -450,11 +442,9 @@ impl<'f> Context<'f> { cond_context.then_branch.last_block = *block; let condition_call_stack = - self.inserter.function.dfg.get_value_call_stack(cond_context.condition); - let else_condition = self.insert_instruction( - Instruction::Not(cond_context.condition), - condition_call_stack.clone(), - ); + self.inserter.function.dfg.get_value_call_stack_id(cond_context.condition); + let else_condition = + self.insert_instruction(Instruction::Not(cond_context.condition), condition_call_stack); let else_condition = self.link_condition(else_condition); let old_allocations = std::mem::take(&mut self.local_allocations); @@ -540,7 +530,7 @@ impl<'f> Context<'f> { let else_condition = if let Some(branch) = cond_context.else_branch { branch.condition } else { - self.inserter.function.dfg.make_constant(FieldElement::zero(), Type::bool()) + self.inserter.function.dfg.make_constant(FieldElement::zero(), NumericType::bool()) }; let block = self.inserter.function.entry_block(); @@ -552,7 +542,7 @@ impl<'f> Context<'f> { else_condition, else_value: else_arg, }; - let call_stack = cond_context.call_stack.clone(); + let call_stack = cond_context.call_stack; self.inserter .function .dfg @@ -569,7 +559,7 @@ impl<'f> Context<'f> { /// Insert a new instruction into the function's entry block. /// Unlike push_instruction, this function will not map any ValueIds. /// within the given instruction, nor will it modify self.values in any way. - fn insert_instruction(&mut self, instruction: Instruction, call_stack: CallStack) -> ValueId { + fn insert_instruction(&mut self, instruction: Instruction, call_stack: CallStackId) -> ValueId { let block = self.inserter.function.entry_block(); self.inserter .function @@ -586,7 +576,7 @@ impl<'f> Context<'f> { &mut self, instruction: Instruction, ctrl_typevars: Option>, - call_stack: CallStack, + call_stack: CallStackId, ) -> InsertInstructionResult { let block = self.inserter.function.entry_block(); self.inserter.function.dfg.insert_instruction_and_results( @@ -606,11 +596,11 @@ impl<'f> Context<'f> { let condition = match self.get_last_condition() { Some(cond) => cond, None => { - self.inserter.function.dfg.make_constant(FieldElement::one(), Type::unsigned(1)) + self.inserter.function.dfg.make_constant(FieldElement::one(), NumericType::bool()) } }; let enable_side_effects = Instruction::EnableSideEffectsIf { condition }; - let call_stack = self.inserter.function.dfg.get_value_call_stack(condition); + let call_stack = self.inserter.function.dfg.get_value_call_stack_id(condition); self.insert_instruction_with_typevars(enable_side_effects, None, call_stack); } @@ -626,7 +616,7 @@ impl<'f> Context<'f> { /// any instructions in between it should be None. fn push_instruction(&mut self, id: InstructionId) { let (instruction, call_stack) = self.inserter.map_instruction(id); - let instruction = self.handle_instruction_side_effects(instruction, call_stack.clone()); + let instruction = self.handle_instruction_side_effects(instruction, call_stack); let instruction_is_allocate = matches!(&instruction, Instruction::Allocate); let entry = self.inserter.function.entry_block(); @@ -644,7 +634,7 @@ impl<'f> Context<'f> { fn handle_instruction_side_effects( &mut self, instruction: Instruction, - call_stack: CallStack, + call_stack: CallStackId, ) -> Instruction { if let Some(condition) = self.get_last_condition() { match instruction { @@ -653,17 +643,13 @@ impl<'f> Context<'f> { // Condition needs to be cast to argument type in order to multiply them together. let argument_type = self.inserter.function.dfg.type_of_value(lhs); - // Sanity check that we're not constraining non-primitive types - assert!(matches!(argument_type, Type::Numeric(_))); - let casted_condition = self.insert_instruction( - Instruction::Cast(condition, argument_type), - call_stack.clone(), - ); + let cast = Instruction::Cast(condition, argument_type.unwrap_numeric()); + let casted_condition = self.insert_instruction(cast, call_stack); let lhs = self.insert_instruction( Instruction::binary(BinaryOp::Mul, lhs, casted_condition), - call_stack.clone(), + call_stack, ); let rhs = self.insert_instruction( Instruction::binary(BinaryOp::Mul, rhs, casted_condition), @@ -682,15 +668,11 @@ impl<'f> Context<'f> { let typ = self.inserter.function.dfg.type_of_value(value); let load = Instruction::Load { address }; let previous_value = self - .insert_instruction_with_typevars( - load, - Some(vec![typ]), - call_stack.clone(), - ) + .insert_instruction_with_typevars(load, Some(vec![typ]), call_stack) .first(); - let else_condition = self - .insert_instruction(Instruction::Not(condition), call_stack.clone()); + let else_condition = + self.insert_instruction(Instruction::Not(condition), call_stack); let instruction = Instruction::IfElse { then_condition: condition, @@ -708,14 +690,12 @@ impl<'f> Context<'f> { // Condition needs to be cast to argument type in order to multiply them together. let argument_type = self.inserter.function.dfg.type_of_value(value); - let casted_condition = self.insert_instruction( - Instruction::Cast(condition, argument_type), - call_stack.clone(), - ); + let cast = Instruction::Cast(condition, argument_type.unwrap_numeric()); + let casted_condition = self.insert_instruction(cast, call_stack); let value = self.insert_instruction( Instruction::binary(BinaryOp::Mul, value, casted_condition), - call_stack.clone(), + call_stack, ); Instruction::RangeCheck { value, max_bit_size, assert_message } } @@ -725,13 +705,12 @@ impl<'f> Context<'f> { let field = arguments[0]; let argument_type = self.inserter.function.dfg.type_of_value(field); - let casted_condition = self.insert_instruction( - Instruction::Cast(condition, argument_type), - call_stack.clone(), - ); + let cast = Instruction::Cast(condition, argument_type.unwrap_numeric()); + + let casted_condition = self.insert_instruction(cast, call_stack); let field = self.insert_instruction( Instruction::binary(BinaryOp::Mul, field, casted_condition), - call_stack.clone(), + call_stack, ); arguments[0] = field; @@ -740,8 +719,8 @@ impl<'f> Context<'f> { } //Issue #5045: We set curve points to infinity if condition is false Value::Intrinsic(Intrinsic::BlackBox(BlackBoxFunc::EmbeddedCurveAdd)) => { - arguments[2] = self.var_or_one(arguments[2], condition, call_stack.clone()); - arguments[5] = self.var_or_one(arguments[5], condition, call_stack.clone()); + arguments[2] = self.var_or_one(arguments[2], condition, call_stack); + arguments[5] = self.var_or_one(arguments[5], condition, call_stack); Instruction::Call { func, arguments } } @@ -759,7 +738,7 @@ impl<'f> Context<'f> { let (elements, typ) = self.apply_predicate_to_msm_argument( arguments[points_array_idx], condition, - call_stack.clone(), + call_stack, ); let instruction = Instruction::MakeArray { elements, typ }; @@ -783,7 +762,7 @@ impl<'f> Context<'f> { &mut self, argument: ValueId, predicate: ValueId, - call_stack: CallStack, + call_stack: CallStackId, ) -> (im::Vector, Type) { let array_typ; let mut array_with_predicate = im::Vector::new(); @@ -791,11 +770,7 @@ impl<'f> Context<'f> { array_typ = typ.clone(); for (i, value) in array.clone().iter().enumerate() { if i % 3 == 2 { - array_with_predicate.push_back(self.var_or_one( - *value, - predicate, - call_stack.clone(), - )); + array_with_predicate.push_back(self.var_or_one(*value, predicate, call_stack)); } else { array_with_predicate.push_back(*value); } @@ -811,13 +786,10 @@ impl<'f> Context<'f> { } // Computes: if condition { var } else { 1 } - fn var_or_one(&mut self, var: ValueId, condition: ValueId, call_stack: CallStack) -> ValueId { - let field = self.insert_instruction( - Instruction::binary(BinaryOp::Mul, var, condition), - call_stack.clone(), - ); - let not_condition = - self.insert_instruction(Instruction::Not(condition), call_stack.clone()); + fn var_or_one(&mut self, var: ValueId, condition: ValueId, call_stack: CallStackId) -> ValueId { + let field = + self.insert_instruction(Instruction::binary(BinaryOp::Mul, var, condition), call_stack); + let not_condition = self.insert_instruction(Instruction::Not(condition), call_stack); self.insert_instruction( Instruction::binary(BinaryOp::Add, field, not_condition), call_stack, @@ -1218,20 +1190,15 @@ mod test { ) -> Vec { match dfg[value] { Value::Instruction { instruction, .. } => { - let mut values = vec![]; - dfg[instruction].map_values(|value| { - values.push(value); - value - }); + let mut constants = vec![]; - let mut values: Vec<_> = values - .into_iter() - .flat_map(|value| get_all_constants_reachable_from_instruction(dfg, value)) - .collect(); + dfg[instruction].for_each_value(|value| { + constants.extend(get_all_constants_reachable_from_instruction(dfg, value)); + }); - values.sort(); - values.dedup(); - values + constants.sort(); + constants.dedup(); + constants } Value::NumericConstant { constant, .. } => vec![constant.to_u128()], _ => Vec::new(), @@ -1487,7 +1454,7 @@ mod test { b2(): return b1(): - jmp b2() + jmp b2() } "; let merged_ssa = Ssa::from_str(src).unwrap(); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg/value_merger.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg/value_merger.rs index 6ea235b9414..df351d6c0cd 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg/value_merger.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg/value_merger.rs @@ -3,9 +3,10 @@ use fxhash::{FxHashMap as HashMap, FxHashSet}; use crate::ssa::ir::{ basic_block::BasicBlockId, - dfg::{CallStack, DataFlowGraph, InsertInstructionResult}, + call_stack::CallStackId, + dfg::{DataFlowGraph, InsertInstructionResult}, instruction::{BinaryOp, Instruction}, - types::Type, + types::{NumericType, Type}, value::{Value, ValueId}, }; @@ -21,7 +22,7 @@ pub(crate) struct ValueMerger<'a> { array_set_conditionals: &'a mut HashMap, - call_stack: CallStack, + call_stack: CallStackId, } impl<'a> ValueMerger<'a> { @@ -31,7 +32,7 @@ impl<'a> ValueMerger<'a> { slice_sizes: &'a mut HashMap, array_set_conditionals: &'a mut HashMap, current_condition: Option, - call_stack: CallStack, + call_stack: CallStackId, ) -> Self { ValueMerger { dfg, @@ -95,8 +96,8 @@ impl<'a> ValueMerger<'a> { then_value: ValueId, else_value: ValueId, ) -> ValueId { - let then_type = dfg.type_of_value(then_value); - let else_type = dfg.type_of_value(else_value); + let then_type = dfg.type_of_value(then_value).unwrap_numeric(); + let else_type = dfg.type_of_value(else_value).unwrap_numeric(); assert_eq!( then_type, else_type, "Expected values merged to be of the same type but found {then_type} and {else_type}" @@ -106,36 +107,25 @@ impl<'a> ValueMerger<'a> { return then_value; } - let then_call_stack = dfg.get_value_call_stack(then_value); - let else_call_stack = dfg.get_value_call_stack(else_value); + let then_call_stack = dfg.get_value_call_stack_id(then_value); + let else_call_stack = dfg.get_value_call_stack_id(else_value); - let call_stack = if then_call_stack.is_empty() { else_call_stack } else { then_call_stack }; + let call_stack = if then_call_stack.is_root() { else_call_stack } else { then_call_stack }; // We must cast the bool conditions to the actual numeric type used by each value. - let then_condition = dfg - .insert_instruction_and_results( - Instruction::Cast(then_condition, then_type), - block, - None, - call_stack.clone(), - ) - .first(); - let else_condition = dfg - .insert_instruction_and_results( - Instruction::Cast(else_condition, else_type), - block, - None, - call_stack.clone(), - ) - .first(); + let cast = Instruction::Cast(then_condition, then_type); + let then_condition = + dfg.insert_instruction_and_results(cast, block, None, call_stack).first(); + + let cast = Instruction::Cast(else_condition, else_type); + let else_condition = + dfg.insert_instruction_and_results(cast, block, None, call_stack).first(); let mul = Instruction::binary(BinaryOp::Mul, then_condition, then_value); - let then_value = - dfg.insert_instruction_and_results(mul, block, None, call_stack.clone()).first(); + let then_value = dfg.insert_instruction_and_results(mul, block, None, call_stack).first(); let mul = Instruction::binary(BinaryOp::Mul, else_condition, else_value); - let else_value = - dfg.insert_instruction_and_results(mul, block, None, call_stack.clone()).first(); + let else_value = dfg.insert_instruction_and_results(mul, block, None, call_stack).first(); let add = Instruction::binary(BinaryOp::Add, then_value, else_value); dfg.insert_instruction_and_results(add, block, None, call_stack).first() @@ -175,19 +165,14 @@ impl<'a> ValueMerger<'a> { for (element_index, element_type) in element_types.iter().enumerate() { let index = ((i * element_types.len() as u32 + element_index as u32) as u128).into(); - let index = self.dfg.make_constant(index, Type::field()); + let index = self.dfg.make_constant(index, NumericType::NativeField); let typevars = Some(vec![element_type.clone()]); let mut get_element = |array, typevars| { let get = Instruction::ArrayGet { array, index }; self.dfg - .insert_instruction_and_results( - get, - self.block, - typevars, - self.call_stack.clone(), - ) + .insert_instruction_and_results(get, self.block, typevars, self.call_stack) .first() }; @@ -204,8 +189,9 @@ impl<'a> ValueMerger<'a> { } let instruction = Instruction::MakeArray { elements: merged, typ }; - let call_stack = self.call_stack.clone(); - self.dfg.insert_instruction_and_results(instruction, self.block, None, call_stack).first() + self.dfg + .insert_instruction_and_results(instruction, self.block, None, self.call_stack) + .first() } fn merge_slice_values( @@ -243,7 +229,7 @@ impl<'a> ValueMerger<'a> { for (element_index, element_type) in element_types.iter().enumerate() { let index_u32 = i * element_types.len() as u32 + element_index as u32; let index_value = (index_u32 as u128).into(); - let index = self.dfg.make_constant(index_value, Type::field()); + let index = self.dfg.make_constant(index_value, NumericType::NativeField); let typevars = Some(vec![element_type.clone()]); @@ -259,7 +245,7 @@ impl<'a> ValueMerger<'a> { get, self.block, typevars, - self.call_stack.clone(), + self.call_stack, ) .first() } @@ -283,7 +269,7 @@ impl<'a> ValueMerger<'a> { } let instruction = Instruction::MakeArray { elements: merged, typ }; - let call_stack = self.call_stack.clone(); + let call_stack = self.call_stack; self.dfg.insert_instruction_and_results(instruction, self.block, None, call_stack).first() } @@ -295,7 +281,7 @@ impl<'a> ValueMerger<'a> { match typ { Type::Numeric(numeric_type) => { let zero = FieldElement::zero(); - self.dfg.make_constant(zero, Type::Numeric(*numeric_type)) + self.dfg.make_constant(zero, *numeric_type) } Type::Array(element_types, len) => { let mut array = im::Vector::new(); @@ -305,7 +291,7 @@ impl<'a> ValueMerger<'a> { } } let instruction = Instruction::MakeArray { elements: array, typ: typ.clone() }; - let call_stack = self.call_stack.clone(); + let call_stack = self.call_stack; self.dfg .insert_instruction_and_results(instruction, self.block, None, call_stack) .first() @@ -399,12 +385,7 @@ impl<'a> ValueMerger<'a> { let mut get_element = |array, typevars| { let get = Instruction::ArrayGet { array, index }; self.dfg - .insert_instruction_and_results( - get, - self.block, - typevars, - self.call_stack.clone(), - ) + .insert_instruction_and_results(get, self.block, typevars, self.call_stack) .first() }; @@ -423,12 +404,7 @@ impl<'a> ValueMerger<'a> { } fn insert_instruction(&mut self, instruction: Instruction) -> InsertInstructionResult { - self.dfg.insert_instruction_and_results( - instruction, - self.block, - None, - self.call_stack.clone(), - ) + self.dfg.insert_instruction_and_results(instruction, self.block, None, self.call_stack) } fn insert_array_set( @@ -439,12 +415,8 @@ impl<'a> ValueMerger<'a> { condition: Option, ) -> InsertInstructionResult { let instruction = Instruction::ArraySet { array, index, value, mutable: false }; - let result = self.dfg.insert_instruction_and_results( - instruction, - self.block, - None, - self.call_stack.clone(), - ); + let result = + self.dfg.insert_instruction_and_results(instruction, self.block, None, self.call_stack); if let Some(condition) = condition { let result_index = if result.len() == 1 { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/hint.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/hint.rs new file mode 100644 index 00000000000..567a0795edc --- /dev/null +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/hint.rs @@ -0,0 +1,105 @@ +#[cfg(test)] +mod tests { + use acvm::acir::circuit::ExpressionWidth; + + use crate::{ + errors::RuntimeError, + ssa::{ + opt::assert_normalized_ssa_equals, optimize_all, Ssa, SsaBuilder, SsaEvaluatorOptions, + SsaLogging, + }, + }; + + fn run_all_passes(ssa: Ssa) -> Result { + let options = &SsaEvaluatorOptions { + ssa_logging: SsaLogging::None, + enable_brillig_logging: false, + force_brillig_output: false, + print_codegen_timings: false, + expression_width: ExpressionWidth::default(), + emit_ssa: None, + skip_underconstrained_check: true, + skip_brillig_constraints_check: true, + inliner_aggressiveness: 0, + max_bytecode_increase_percent: None, + }; + + let builder = SsaBuilder { + ssa, + ssa_logging: options.ssa_logging.clone(), + print_codegen_timings: false, + }; + + optimize_all(builder, options) + } + + /// Test that the `std::hint::black_box` function prevents some of the optimizations. + #[test] + fn test_black_box_hint() { + // fn main(sum: u32) { + // // This version simplifies into a single `constraint 50 == sum` + // assert_eq(loop(5, 10), sum); + // // This should preserve additions because `k` is opaque, as if it came from an input. + // assert_eq(loop(5, std::hint::black_box(10)), sum); + // } + // fn loop(n: u32, k: u32) -> u32 { + // let mut sum = 0; + // for _ in 0..n { + // sum = sum + k; + // } + // sum + // } + + // Initial SSA: + let src = " + acir(inline) fn main f0 { + b0(v0: u32): + v4 = call f1(u32 5, u32 10) -> u32 + v5 = eq v4, v0 + constrain v4 == v0 + v7 = call black_box(u32 10) -> u32 + v9 = call f1(u32 5, v7) -> u32 + v10 = eq v9, v0 + constrain v9 == v0 + return + } + acir(inline) fn loop f1 { + b0(v0: u32, v1: u32): + v3 = allocate -> &mut u32 + store u32 0 at v3 + jmp b1(u32 0) + b1(v2: u32): + v5 = lt v2, v0 + jmpif v5 then: b3, else: b2 + b3(): + v7 = load v3 -> u32 + v8 = add v7, v1 + store v8 at v3 + v10 = add v2, u32 1 + jmp b1(v10) + b2(): + v6 = load v3 -> u32 + return v6 + } + "; + + // After Array Set Optimizations: + let expected = " + acir(inline) fn main f0 { + b0(v0: u32): + constrain u32 50 == v0 + v4 = call black_box(u32 10) -> u32 + v5 = add v4, v4 + v6 = add v5, v4 + v7 = add v6, v4 + v8 = add v7, v4 + constrain v8 == u32 50 + return + } + "; + + let ssa = Ssa::from_str(src).unwrap(); + let ssa = run_all_passes(ssa).unwrap(); + assert_normalized_ssa_equals(ssa, expected); + } +} diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/inlining.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/inlining.rs index f91487fd73e..11201fc8f85 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/inlining.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/inlining.rs @@ -11,7 +11,8 @@ use crate::ssa::{ function_builder::FunctionBuilder, ir::{ basic_block::BasicBlockId, - dfg::{CallStack, InsertInstructionResult}, + call_stack::CallStackId, + dfg::InsertInstructionResult, function::{Function, FunctionId, RuntimeType}, instruction::{Instruction, InstructionId, TerminatorInstruction}, value::{Value, ValueId}, @@ -83,7 +84,7 @@ struct InlineContext { recursion_level: u32, builder: FunctionBuilder, - call_stack: CallStack, + call_stack: CallStackId, // The FunctionId of the entry point function we're inlining into in the old, unmodified Ssa. entry_point: FunctionId, @@ -365,7 +366,7 @@ impl InlineContext { builder, recursion_level: 0, entry_point, - call_stack: CallStack::new(), + call_stack: CallStackId::root(), inline_no_predicates_functions, functions_not_to_inline, } @@ -469,7 +470,7 @@ impl<'function> PerFunctionContext<'function> { unreachable!("All Value::Params should already be known from previous calls to translate_block. Unknown value {id} = {value:?}") } Value::NumericConstant { constant, typ } => { - self.context.builder.numeric_constant(*constant, typ.clone()) + self.context.builder.numeric_constant(*constant, *typ) } Value::Function(function) => self.context.builder.import_function(*function), Value::Intrinsic(intrinsic) => self.context.builder.import_intrinsic_id(*intrinsic), @@ -660,13 +661,25 @@ impl<'function> PerFunctionContext<'function> { let old_results = self.source_function.dfg.instruction_results(call_id); let arguments = vecmap(arguments, |arg| self.translate_value(*arg)); - let call_stack = self.source_function.dfg.get_call_stack(call_id); + let call_stack = self.source_function.dfg.get_instruction_call_stack(call_id); let call_stack_len = call_stack.len(); - self.context.call_stack.append(call_stack); - + let new_call_stack = self + .context + .builder + .current_function + .dfg + .call_stack_data + .extend_call_stack(self.context.call_stack, &call_stack); + + self.context.call_stack = new_call_stack; let new_results = self.context.inline_function(ssa, function, &arguments); - - self.context.call_stack.truncate(self.context.call_stack.len() - call_stack_len); + self.context.call_stack = self + .context + .builder + .current_function + .dfg + .call_stack_data + .unwind_call_stack(self.context.call_stack, call_stack_len); let new_results = InsertInstructionResult::Results(call_id, &new_results); Self::insert_new_instruction_results(&mut self.values, old_results, new_results); @@ -677,9 +690,15 @@ impl<'function> PerFunctionContext<'function> { fn push_instruction(&mut self, id: InstructionId) { let instruction = self.source_function.dfg[id].map_values(|id| self.translate_value(id)); - let mut call_stack = self.context.call_stack.clone(); - call_stack.append(self.source_function.dfg.get_call_stack(id)); - + let mut call_stack = self.context.call_stack; + let source_call_stack = self.source_function.dfg.get_instruction_call_stack(id); + call_stack = self + .context + .builder + .current_function + .dfg + .call_stack_data + .extend_call_stack(call_stack, &source_call_stack); let results = self.source_function.dfg.instruction_results(id); let results = vecmap(results, |id| self.source_function.dfg.resolve(*id)); @@ -736,8 +755,14 @@ impl<'function> PerFunctionContext<'function> { let destination = self.translate_block(*destination, block_queue); let arguments = vecmap(arguments, |arg| self.translate_value(*arg)); - let mut new_call_stack = self.context.call_stack.clone(); - new_call_stack.append(call_stack.clone()); + let call_stack = self.source_function.dfg.get_call_stack(*call_stack); + let new_call_stack = self + .context + .builder + .current_function + .dfg + .call_stack_data + .extend_call_stack(self.context.call_stack, &call_stack); self.context .builder @@ -752,9 +777,14 @@ impl<'function> PerFunctionContext<'function> { call_stack, } => { let condition = self.translate_value(*condition); - - let mut new_call_stack = self.context.call_stack.clone(); - new_call_stack.append(call_stack.clone()); + let call_stack = self.source_function.dfg.get_call_stack(*call_stack); + let new_call_stack = self + .context + .builder + .current_function + .dfg + .call_stack_data + .extend_call_stack(self.context.call_stack, &call_stack); // See if the value of the condition is known, and if so only inline the reachable // branch. This lets us inline some recursive functions without recurring forever. @@ -791,8 +821,16 @@ impl<'function> PerFunctionContext<'function> { let block_id = self.context.builder.current_block(); if self.inlining_entry { - let mut new_call_stack = self.context.call_stack.clone(); - new_call_stack.append(call_stack.clone()); + let call_stack = + self.source_function.dfg.call_stack_data.get_call_stack(*call_stack); + let new_call_stack = self + .context + .builder + .current_function + .dfg + .call_stack_data + .extend_call_stack(self.context.call_stack, &call_stack); + self.context .builder .set_call_stack(new_call_stack) @@ -1062,10 +1100,10 @@ mod test { let join_block = builder.insert_block(); builder.terminate_with_jmpif(inner2_cond, then_block, else_block); builder.switch_to_block(then_block); - let one = builder.numeric_constant(FieldElement::one(), Type::field()); + let one = builder.field_constant(FieldElement::one()); builder.terminate_with_jmp(join_block, vec![one]); builder.switch_to_block(else_block); - let two = builder.numeric_constant(FieldElement::from(2_u128), Type::field()); + let two = builder.field_constant(FieldElement::from(2_u128)); builder.terminate_with_jmp(join_block, vec![two]); let join_param = builder.add_block_parameter(join_block, Type::field()); builder.switch_to_block(join_block); @@ -1177,17 +1215,16 @@ mod test { builder.terminate_with_return(v0); builder.new_brillig_function("bar".into(), bar_id, InlineType::default()); - let bar_v0 = - builder.numeric_constant(1_usize, Type::Numeric(NumericType::Unsigned { bit_size: 1 })); + let bar_v0 = builder.numeric_constant(1_usize, NumericType::bool()); let then_block = builder.insert_block(); let else_block = builder.insert_block(); let join_block = builder.insert_block(); builder.terminate_with_jmpif(bar_v0, then_block, else_block); builder.switch_to_block(then_block); - let one = builder.numeric_constant(FieldElement::one(), Type::field()); + let one = builder.field_constant(FieldElement::one()); builder.terminate_with_jmp(join_block, vec![one]); builder.switch_to_block(else_block); - let two = builder.numeric_constant(FieldElement::from(2_u128), Type::field()); + let two = builder.field_constant(FieldElement::from(2_u128)); builder.terminate_with_jmp(join_block, vec![two]); let join_param = builder.add_block_parameter(join_block, Type::field()); builder.switch_to_block(join_block); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/loop_invariant.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/loop_invariant.rs index 87e7f8bcff3..44c0eb380c2 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/loop_invariant.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/loop_invariant.rs @@ -13,7 +13,7 @@ use fxhash::{FxHashMap as HashMap, FxHashSet as HashSet}; use crate::ssa::{ ir::{ basic_block::BasicBlockId, - function::{Function, RuntimeType}, + function::Function, function_inserter::FunctionInserter, instruction::{Instruction, InstructionId}, types::Type, @@ -27,12 +27,7 @@ use super::unrolling::{Loop, Loops}; impl Ssa { #[tracing::instrument(level = "trace", skip(self))] pub(crate) fn loop_invariant_code_motion(mut self) -> Ssa { - let brillig_functions = self - .functions - .iter_mut() - .filter(|(_, func)| matches!(func.runtime(), RuntimeType::Brillig(_))); - - for (_, function) in brillig_functions { + for function in self.functions.values_mut() { function.loop_invariant_code_motion(); } @@ -63,6 +58,7 @@ impl Loops { } context.map_dependent_instructions(); + context.inserter.map_data_bus_in_place(); } } @@ -113,6 +109,26 @@ impl<'f> LoopInvariantContext<'f> { if hoist_invariant { self.inserter.push_instruction(instruction_id, pre_header); + + // If we are hoisting a MakeArray instruction, + // we need to issue an extra inc_rc in case they are mutated afterward. + if matches!( + self.inserter.function.dfg[instruction_id], + Instruction::MakeArray { .. } + ) { + let result = + self.inserter.function.dfg.instruction_results(instruction_id)[0]; + let inc_rc = Instruction::IncrementRc { value: result }; + let call_stack = self + .inserter + .function + .dfg + .get_instruction_call_stack_id(instruction_id); + self.inserter + .function + .dfg + .insert_instruction_and_results(inc_rc, *block, None, call_stack); + } } else { self.inserter.push_instruction(instruction_id, *block); } @@ -190,6 +206,7 @@ impl<'f> LoopInvariantContext<'f> { }); let can_be_deduplicated = instruction.can_be_deduplicated(self.inserter.function, false) + || matches!(instruction, Instruction::MakeArray { .. }) || self.can_be_deduplicated_from_upper_bound(&instruction); is_loop_invariant && can_be_deduplicated @@ -559,4 +576,94 @@ mod test { let ssa = ssa.loop_invariant_code_motion(); assert_normalized_ssa_equals(ssa, expected); } + + #[test] + fn insert_inc_rc_when_moving_make_array() { + // SSA for the following program: + // + // unconstrained fn main(x: u32, y: u32) { + // let mut a1 = [1, 2, 3, 4, 5]; + // a1[x] = 64; + // for i in 0 .. 5 { + // let mut a2 = [1, 2, 3, 4, 5]; + // a2[y + i] = 128; + // foo(a2); + // } + // foo(a1); + // } + // + // We want to make sure move a loop invariant make_array instruction, + // to account for whether that array has been marked as mutable. + // To do so, we increment the reference counter on the array we are moving. + // In the SSA below, we want to move `v42` out of the loop. + let src = " + brillig(inline) fn main f0 { + b0(v0: u32, v1: u32): + v8 = make_array [Field 1, Field 2, Field 3, Field 4, Field 5] : [Field; 5] + v9 = allocate -> &mut [Field; 5] + v11 = array_set v8, index v0, value Field 64 + v13 = add v0, u32 1 + store v11 at v9 + jmp b1(u32 0) + b1(v2: u32): + v16 = lt v2, u32 5 + jmpif v16 then: b3, else: b2 + b2(): + v17 = load v9 -> [Field; 5] + call f1(v17) + return + b3(): + v19 = make_array [Field 1, Field 2, Field 3, Field 4, Field 5] : [Field; 5] + v20 = allocate -> &mut [Field; 5] + v21 = add v1, v2 + v23 = array_set v19, index v21, value Field 128 + call f1(v23) + v25 = add v2, u32 1 + jmp b1(v25) + } + brillig(inline) fn foo f1 { + b0(v0: [Field; 5]): + return + } + "; + + let ssa = Ssa::from_str(src).unwrap(); + + // We expect the `make_array` at the top of `b3` to be replaced with an `inc_rc` + // of the newly hoisted `make_array` at the end of `b0`. + let expected = " + brillig(inline) fn main f0 { + b0(v0: u32, v1: u32): + v8 = make_array [Field 1, Field 2, Field 3, Field 4, Field 5] : [Field; 5] + v9 = allocate -> &mut [Field; 5] + v11 = array_set v8, index v0, value Field 64 + v13 = add v0, u32 1 + store v11 at v9 + v14 = make_array [Field 1, Field 2, Field 3, Field 4, Field 5] : [Field; 5] + jmp b1(u32 0) + b1(v2: u32): + v17 = lt v2, u32 5 + jmpif v17 then: b3, else: b2 + b2(): + v18 = load v9 -> [Field; 5] + call f1(v18) + return + b3(): + inc_rc v14 + v20 = allocate -> &mut [Field; 5] + v21 = add v1, v2 + v23 = array_set v14, index v21, value Field 128 + call f1(v23) + v25 = add v2, u32 1 + jmp b1(v25) + } + brillig(inline) fn foo f1 { + b0(v0: [Field; 5]): + return + } + "; + + let ssa = ssa.loop_invariant_code_motion(); + assert_normalized_ssa_equals(ssa, expected); + } } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mem2reg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mem2reg.rs index 77ad53df9cf..1e5cd8bdfbd 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mem2reg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mem2reg.rs @@ -599,8 +599,9 @@ impl<'f> PerFunctionContext<'f> { } fn update_data_bus(&mut self) { - let databus = self.inserter.function.dfg.data_bus.clone(); - self.inserter.function.dfg.data_bus = databus.map_values(|t| self.inserter.resolve(t)); + let mut databus = self.inserter.function.dfg.data_bus.clone(); + databus.map_values_mut(|t| self.inserter.resolve(t)); + self.inserter.function.dfg.data_bus = databus; } fn handle_terminator(&mut self, block: BasicBlockId, references: &mut Block) { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mod.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mod.rs index 06481a12f60..bd0c86570e2 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mod.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/mod.rs @@ -11,6 +11,7 @@ mod constant_folding; mod defunctionalize; mod die; pub(crate) mod flatten_cfg; +mod hint; mod inlining; mod loop_invariant; mod mem2reg; diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/normalize_value_ids.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/normalize_value_ids.rs index a5b60fb5fcd..63ca523bd57 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/normalize_value_ids.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/normalize_value_ids.rs @@ -86,7 +86,10 @@ impl Context { let instruction = old_function.dfg[old_instruction_id] .map_values(|value| self.new_ids.map_value(new_function, old_function, value)); - let call_stack = old_function.dfg.get_call_stack(old_instruction_id); + let call_stack = old_function.dfg.get_instruction_call_stack_id(old_instruction_id); + let locations = old_function.dfg.get_call_stack(call_stack); + let new_call_stack = + new_function.dfg.call_stack_data.get_or_insert_locations(locations); let old_results = old_function.dfg.instruction_results(old_instruction_id); let ctrl_typevars = instruction @@ -97,7 +100,7 @@ impl Context { instruction, new_block_id, ctrl_typevars, - call_stack, + new_call_stack, ); assert_eq!(old_results.len(), new_results.len()); @@ -109,10 +112,15 @@ impl Context { } let old_block = &mut old_function.dfg[old_block_id]; - let mut terminator = old_block - .take_terminator() - .map_values(|value| self.new_ids.map_value(new_function, old_function, value)); + let mut terminator = old_block.take_terminator(); + terminator + .map_values_mut(|value| self.new_ids.map_value(new_function, old_function, value)); + terminator.mutate_blocks(|old_block| self.new_ids.blocks[&old_block]); + let locations = old_function.dfg.get_call_stack(terminator.call_stack()); + let new_call_stack = + new_function.dfg.call_stack_data.get_or_insert_locations(locations); + terminator.set_call_stack(new_call_stack); new_function.dfg.set_block_terminator(new_block_id, terminator); } @@ -177,7 +185,7 @@ impl IdMaps { } Value::NumericConstant { constant, typ } => { - new_function.dfg.make_constant(*constant, typ.clone()) + new_function.dfg.make_constant(*constant, *typ) } Value::Intrinsic(intrinsic) => new_function.dfg.import_intrinsic(*intrinsic), Value::ForeignFunction(name) => new_function.dfg.import_foreign_function(name), diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/rc.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/rc.rs index ffe4ada39b7..64f6e2ddfea 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/rc.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/rc.rs @@ -160,8 +160,12 @@ mod test { use crate::ssa::{ function_builder::FunctionBuilder, ir::{ - basic_block::BasicBlockId, dfg::DataFlowGraph, function::RuntimeType, - instruction::Instruction, map::Id, types::Type, + basic_block::BasicBlockId, + dfg::DataFlowGraph, + function::RuntimeType, + instruction::Instruction, + map::Id, + types::{NumericType, Type}, }, }; @@ -251,7 +255,7 @@ mod test { builder.insert_inc_rc(v0); let v2 = builder.insert_load(v1, array_type); - let zero = builder.numeric_constant(0u128, Type::unsigned(64)); + let zero = builder.numeric_constant(0u128, NumericType::unsigned(64)); let five = builder.field_constant(5u128); let v7 = builder.insert_array_set(v2, zero, five); @@ -302,7 +306,7 @@ mod test { builder.insert_store(v0, v1); let v2 = builder.insert_load(v1, array_type.clone()); - let zero = builder.numeric_constant(0u128, Type::unsigned(64)); + let zero = builder.numeric_constant(0u128, NumericType::unsigned(64)); let five = builder.field_constant(5u128); let v7 = builder.insert_array_set(v2, zero, five); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_bit_shifts.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_bit_shifts.rs index ccf5bd9d9f8..4c5189d8c91 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_bit_shifts.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_bit_shifts.rs @@ -5,7 +5,8 @@ use acvm::{acir::AcirField, FieldElement}; use crate::ssa::{ ir::{ basic_block::BasicBlockId, - dfg::{CallStack, InsertInstructionResult}, + call_stack::CallStackId, + dfg::InsertInstructionResult, function::{Function, RuntimeType}, instruction::{Binary, BinaryOp, Endian, Instruction, InstructionId, Intrinsic}, types::{NumericType, Type}, @@ -40,7 +41,7 @@ impl Function { function: self, new_instructions: Vec::new(), block, - call_stack: CallStack::default(), + call_stack: CallStackId::root(), }; context.remove_bit_shifts(); @@ -52,7 +53,7 @@ struct Context<'f> { new_instructions: Vec, block: BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, } impl Context<'_> { @@ -64,7 +65,8 @@ impl Context<'_> { Instruction::Binary(Binary { lhs, rhs, operator }) if matches!(operator, BinaryOp::Shl | BinaryOp::Shr) => { - self.call_stack = self.function.dfg.get_call_stack(instruction_id).clone(); + self.call_stack = + self.function.dfg.get_instruction_call_stack_id(instruction_id); let old_result = *self.function.dfg.instruction_results(instruction_id).first().unwrap(); @@ -100,7 +102,7 @@ impl Context<'_> { bit_size: u32, ) -> ValueId { let base = self.field_constant(FieldElement::from(2_u128)); - let typ = self.function.dfg.type_of_value(lhs); + let typ = self.function.dfg.type_of_value(lhs).unwrap_numeric(); let (max_bit, pow) = if let Some(rhs_constant) = self.function.dfg.get_numeric_constant(rhs) { // Happy case is that we know precisely by how many bits the integer will @@ -115,29 +117,29 @@ impl Context<'_> { return InsertInstructionResult::SimplifiedTo(zero).first(); } } - let pow = self.numeric_constant(FieldElement::from(rhs_bit_size_pow_2), typ.clone()); + let pow = self.numeric_constant(FieldElement::from(rhs_bit_size_pow_2), typ); let max_lhs_bits = self.function.dfg.get_value_max_num_bits(lhs); (max_lhs_bits + bit_shift_size, pow) } else { // we use a predicate to nullify the result in case of overflow - let bit_size_var = - self.numeric_constant(FieldElement::from(bit_size as u128), Type::unsigned(8)); + let u8_type = NumericType::unsigned(8); + let bit_size_var = self.numeric_constant(FieldElement::from(bit_size as u128), u8_type); let overflow = self.insert_binary(rhs, BinaryOp::Lt, bit_size_var); - let predicate = self.insert_cast(overflow, typ.clone()); + let predicate = self.insert_cast(overflow, typ); // we can safely cast to unsigned because overflow_checks prevent bit-shift with a negative value - let rhs_unsigned = self.insert_cast(rhs, Type::unsigned(bit_size)); + let rhs_unsigned = self.insert_cast(rhs, NumericType::unsigned(bit_size)); let pow = self.pow(base, rhs_unsigned); - let pow = self.insert_cast(pow, typ.clone()); + let pow = self.insert_cast(pow, typ); (FieldElement::max_num_bits(), self.insert_binary(predicate, BinaryOp::Mul, pow)) }; if max_bit <= bit_size { self.insert_binary(lhs, BinaryOp::Mul, pow) } else { - let lhs_field = self.insert_cast(lhs, Type::field()); - let pow_field = self.insert_cast(pow, Type::field()); + let lhs_field = self.insert_cast(lhs, NumericType::NativeField); + let pow_field = self.insert_cast(pow, NumericType::NativeField); let result = self.insert_binary(lhs_field, BinaryOp::Mul, pow_field); let result = self.insert_truncate(result, bit_size, max_bit); self.insert_cast(result, typ) @@ -153,7 +155,7 @@ impl Context<'_> { rhs: ValueId, bit_size: u32, ) -> ValueId { - let lhs_typ = self.function.dfg.type_of_value(lhs); + let lhs_typ = self.function.dfg.type_of_value(lhs).unwrap_numeric(); let base = self.field_constant(FieldElement::from(2_u128)); let pow = self.pow(base, rhs); if lhs_typ.is_unsigned() { @@ -161,14 +163,14 @@ impl Context<'_> { self.insert_binary(lhs, BinaryOp::Div, pow) } else { // Get the sign of the operand; positive signed operand will just do a division as well - let zero = self.numeric_constant(FieldElement::zero(), Type::signed(bit_size)); + let zero = self.numeric_constant(FieldElement::zero(), NumericType::signed(bit_size)); let lhs_sign = self.insert_binary(lhs, BinaryOp::Lt, zero); - let lhs_sign_as_field = self.insert_cast(lhs_sign, Type::field()); - let lhs_as_field = self.insert_cast(lhs, Type::field()); + let lhs_sign_as_field = self.insert_cast(lhs_sign, NumericType::NativeField); + let lhs_as_field = self.insert_cast(lhs, NumericType::NativeField); // For negative numbers, convert to 1-complement using wrapping addition of a + 1 let one_complement = self.insert_binary(lhs_sign_as_field, BinaryOp::Add, lhs_as_field); let one_complement = self.insert_truncate(one_complement, bit_size, bit_size + 1); - let one_complement = self.insert_cast(one_complement, Type::signed(bit_size)); + let one_complement = self.insert_cast(one_complement, NumericType::signed(bit_size)); // Performs the division on the 1-complement (or the operand if positive) let shifted_complement = self.insert_binary(one_complement, BinaryOp::Div, pow); // Convert back to 2-complement representation if operand is negative @@ -203,8 +205,8 @@ impl Context<'_> { let idx = self.field_constant(FieldElement::from((bit_size - i) as i128)); let b = self.insert_array_get(rhs_bits, idx, Type::bool()); let not_b = self.insert_not(b); - let b = self.insert_cast(b, Type::field()); - let not_b = self.insert_cast(not_b, Type::field()); + let b = self.insert_cast(b, NumericType::NativeField); + let not_b = self.insert_cast(not_b, NumericType::NativeField); let r1 = self.insert_binary(a, BinaryOp::Mul, b); let r2 = self.insert_binary(r_squared, BinaryOp::Mul, not_b); r = self.insert_binary(r1, BinaryOp::Add, r2); @@ -216,14 +218,14 @@ impl Context<'_> { } pub(crate) fn field_constant(&mut self, constant: FieldElement) -> ValueId { - self.function.dfg.make_constant(constant, Type::field()) + self.function.dfg.make_constant(constant, NumericType::NativeField) } /// Insert a numeric constant into the current function pub(crate) fn numeric_constant( &mut self, value: impl Into, - typ: Type, + typ: NumericType, ) -> ValueId { self.function.dfg.make_constant(value.into(), typ) } @@ -260,7 +262,7 @@ impl Context<'_> { /// Insert a cast instruction at the end of the current block. /// Returns the result of the cast instruction. - pub(crate) fn insert_cast(&mut self, value: ValueId, typ: Type) -> ValueId { + pub(crate) fn insert_cast(&mut self, value: ValueId, typ: NumericType) -> ValueId { self.insert_instruction(Instruction::Cast(value, typ), None).first() } @@ -295,7 +297,7 @@ impl Context<'_> { instruction, self.block, ctrl_typevars, - self.call_stack.clone(), + self.call_stack, ); if let InsertInstructionResult::Results(instruction_id, _) = result { diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs index f735d9300ce..e85e2c4a441 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_enable_side_effects.rs @@ -17,8 +17,8 @@ use crate::ssa::{ basic_block::BasicBlockId, dfg::DataFlowGraph, function::{Function, RuntimeType}, - instruction::{BinaryOp, Instruction, Intrinsic}, - types::Type, + instruction::{BinaryOp, Hint, Instruction, Intrinsic}, + types::NumericType, value::Value, }, ssa_gen::Ssa, @@ -70,7 +70,8 @@ impl Context { ) { let instructions = function.dfg[block].take_instructions(); - let mut active_condition = function.dfg.make_constant(FieldElement::one(), Type::bool()); + let one = FieldElement::one(); + let mut active_condition = function.dfg.make_constant(one, NumericType::bool()); let mut last_side_effects_enabled_instruction = None; let mut new_instructions = Vec::with_capacity(instructions.len()); @@ -174,6 +175,7 @@ impl Context { | Intrinsic::ToBits(_) | Intrinsic::ToRadix(_) | Intrinsic::BlackBox(_) + | Intrinsic::Hint(Hint::BlackBox) | Intrinsic::FromField | Intrinsic::AsField | Intrinsic::AsSlice @@ -202,7 +204,7 @@ mod test { ir::{ instruction::{BinaryOp, Instruction}, map::Id, - types::Type, + types::{NumericType, Type}, }, }; @@ -233,9 +235,9 @@ mod test { let mut builder = FunctionBuilder::new("main".into(), main_id); let v0 = builder.add_parameter(Type::field()); - let two = builder.numeric_constant(2u128, Type::field()); + let two = builder.field_constant(2u128); - let one = builder.numeric_constant(1u128, Type::bool()); + let one = builder.numeric_constant(1u128, NumericType::bool()); builder.insert_enable_side_effects_if(one); builder.insert_binary(v0, BinaryOp::Mul, two); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_if_else.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_if_else.rs index 02191801fcd..79f2354aff6 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_if_else.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/remove_if_else.rs @@ -4,6 +4,8 @@ use acvm::{acir::AcirField, FieldElement}; use fxhash::FxHashMap as HashMap; use crate::ssa::ir::function::RuntimeType; +use crate::ssa::ir::instruction::Hint; +use crate::ssa::ir::types::NumericType; use crate::ssa::ir::value::ValueId; use crate::ssa::{ ir::{ @@ -62,7 +64,8 @@ impl Context { fn remove_if_else(&mut self, function: &mut Function) { let block = function.entry_block(); let instructions = function.dfg[block].take_instructions(); - let mut current_conditional = function.dfg.make_constant(FieldElement::one(), Type::bool()); + let one = FieldElement::one(); + let mut current_conditional = function.dfg.make_constant(one, NumericType::bool()); for instruction in instructions { match &function.dfg[instruction] { @@ -75,7 +78,7 @@ impl Context { let typ = function.dfg.type_of_value(then_value); assert!(!matches!(typ, Type::Numeric(_))); - let call_stack = function.dfg.get_call_stack(instruction); + let call_stack = function.dfg.get_instruction_call_stack_id(instruction); let mut value_merger = ValueMerger::new( &mut function.dfg, block, @@ -231,6 +234,7 @@ fn slice_capacity_change( | Intrinsic::ArrayAsStrUnchecked | Intrinsic::StrAsBytes | Intrinsic::BlackBox(_) + | Intrinsic::Hint(Hint::BlackBox) | Intrinsic::FromField | Intrinsic::AsField | Intrinsic::AsWitness diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/resolve_is_unconstrained.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/resolve_is_unconstrained.rs index 3d40c88d704..87e680932c6 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/resolve_is_unconstrained.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/resolve_is_unconstrained.rs @@ -2,12 +2,11 @@ use crate::ssa::{ ir::{ function::{Function, RuntimeType}, instruction::{Instruction, Intrinsic}, - types::Type, + types::NumericType, value::Value, }, ssa_gen::Ssa, }; -use acvm::FieldElement; use fxhash::FxHashSet as HashSet; impl Ssa { @@ -47,10 +46,9 @@ impl Function { // We replace the result with a fresh id. This will be unused, so the DIE pass will remove the leftover intrinsic call. self.dfg.replace_result(instruction_id, original_return_id); - let is_within_unconstrained = self.dfg.make_constant( - FieldElement::from(matches!(self.runtime(), RuntimeType::Brillig(_))), - Type::bool(), - ); + let is_unconstrained = matches!(self.runtime(), RuntimeType::Brillig(_)).into(); + let is_within_unconstrained = + self.dfg.make_constant(is_unconstrained, NumericType::bool()); // Replace all uses of the original return value with the constant self.dfg.set_value_from_id(original_return_id, is_within_unconstrained); } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs index e7f8d227d28..22fdf0a7987 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/simplify_cfg.rs @@ -109,7 +109,7 @@ fn check_for_constant_jmpif( }; let arguments = Vec::new(); - let call_stack = call_stack.clone(); + let call_stack = *call_stack; let jmp = TerminatorInstruction::Jmp { destination, arguments, call_stack }; function.dfg[block].set_terminator(jmp); cfg.recompute_block(function, block); @@ -223,7 +223,7 @@ fn check_for_negated_jmpif_condition( { if let Value::Instruction { instruction, .. } = function.dfg[*condition] { if let Instruction::Not(negated_condition) = function.dfg[instruction] { - let call_stack = call_stack.clone(); + let call_stack = *call_stack; let jmpif = TerminatorInstruction::JmpIf { condition: negated_condition, then_destination: *else_destination, diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/unrolling.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/unrolling.rs index 22daba1de45..2a272236195 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/unrolling.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/opt/unrolling.rs @@ -27,8 +27,9 @@ use crate::{ ssa::{ ir::{ basic_block::BasicBlockId, + call_stack::{CallStack, CallStackId}, cfg::ControlFlowGraph, - dfg::{CallStack, DataFlowGraph}, + dfg::DataFlowGraph, dom::DominatorTree, function::Function, function_inserter::{ArrayCache, FunctionInserter}, @@ -279,10 +280,10 @@ impl Loop { &self, function: &Function, cfg: &ControlFlowGraph, - ) -> Result, CallStack> { - let pre_header = self.get_pre_header(function, cfg)?; - let jump_value = get_induction_variable(function, pre_header)?; - Ok(function.dfg.get_numeric_constant(jump_value)) + ) -> Option { + let pre_header = self.get_pre_header(function, cfg).ok()?; + let jump_value = get_induction_variable(function, pre_header).ok()?; + function.dfg.get_numeric_constant(jump_value) } /// Find the upper bound of the loop in the loop header and return it @@ -302,6 +303,11 @@ impl Loop { pub(super) fn get_const_upper_bound(&self, function: &Function) -> Option { let block = &function.dfg[self.header]; let instructions = block.instructions(); + if instructions.is_empty() { + // If the loop condition is constant time, the loop header will be + // simplified to a simple jump. + return None; + } assert_eq!( instructions.len(), 1, @@ -327,14 +333,10 @@ impl Loop { &self, function: &Function, cfg: &ControlFlowGraph, - ) -> Result, CallStack> { - let Some(lower) = self.get_const_lower_bound(function, cfg)? else { - return Ok(None); - }; - let Some(upper) = self.get_const_upper_bound(function) else { - return Ok(None); - }; - Ok(Some((lower, upper))) + ) -> Option<(FieldElement, FieldElement)> { + let lower = self.get_const_lower_bound(function, cfg)?; + let upper = self.get_const_upper_bound(function)?; + Some((lower, upper)) } /// Unroll a single loop in the function. @@ -469,7 +471,7 @@ impl Loop { match context.dfg()[fresh_block].unwrap_terminator() { TerminatorInstruction::JmpIf { condition, then_destination, else_destination, call_stack } => { let condition = *condition; - let next_blocks = context.handle_jmpif(condition, *then_destination, *else_destination, call_stack.clone()); + let next_blocks = context.handle_jmpif(condition, *then_destination, *else_destination, *call_stack); // If there is only 1 next block the jmpif evaluated to a single known block. // This is the expected case and lets us know if we should loop again or not. @@ -547,9 +549,9 @@ impl Loop { &self, function: &Function, cfg: &ControlFlowGraph, - ) -> Result, CallStack> { + ) -> Option> { // We need to traverse blocks from the pre-header up to the block entry point. - let pre_header = self.get_pre_header(function, cfg)?; + let pre_header = self.get_pre_header(function, cfg).ok()?; let function_entry = function.entry_block(); // The algorithm in `find_blocks_in_loop` expects to collect the blocks between the header and the back-edge of the loop, @@ -557,22 +559,19 @@ impl Loop { let blocks = Self::find_blocks_in_loop(function_entry, pre_header, cfg).blocks; // Collect allocations in all blocks above the header. - let allocations = blocks.iter().flat_map(|b| { - function.dfg[*b] - .instructions() - .iter() + let allocations = blocks.iter().flat_map(|block| { + let instructions = function.dfg[*block].instructions().iter(); + instructions .filter(|i| matches!(&function.dfg[**i], Instruction::Allocate)) - .map(|i| { - // Get the value into which the allocation was stored. - function.dfg.instruction_results(*i)[0] - }) + // Get the value into which the allocation was stored. + .map(|i| function.dfg.instruction_results(*i)[0]) }); // Collect reference parameters of the function itself. let params = function.parameters().iter().filter(|p| function.dfg.value_is_reference(**p)).copied(); - Ok(params.chain(allocations).collect()) + Some(params.chain(allocations).collect()) } /// Count the number of load and store instructions of specific variables in the loop. @@ -603,13 +602,11 @@ impl Loop { /// Count the number of instructions in the loop, including the terminating jumps. fn count_all_instructions(&self, function: &Function) -> usize { - self.blocks - .iter() - .map(|block| { - let block = &function.dfg[*block]; - block.instructions().len() + block.terminator().map(|_| 1).unwrap_or_default() - }) - .sum() + let iter = self.blocks.iter().map(|block| { + let block = &function.dfg[*block]; + block.instructions().len() + block.terminator().is_some() as usize + }); + iter.sum() } /// Count the number of increments to the induction variable. @@ -640,18 +637,11 @@ impl Loop { function: &Function, cfg: &ControlFlowGraph, ) -> Option { - let Ok(Some((lower, upper))) = self.get_const_bounds(function, cfg) else { - return None; - }; - let Some(lower) = lower.try_to_u64() else { - return None; - }; - let Some(upper) = upper.try_to_u64() else { - return None; - }; - let Ok(refs) = self.find_pre_header_reference_values(function, cfg) else { - return None; - }; + let (lower, upper) = self.get_const_bounds(function, cfg)?; + let lower = lower.try_to_u64()?; + let upper = upper.try_to_u64()?; + let refs = self.find_pre_header_reference_values(function, cfg)?; + let (loads, stores) = self.count_loads_and_stores(function, &refs); let increments = self.count_induction_increments(function); let all_instructions = self.count_all_instructions(function); @@ -757,10 +747,11 @@ fn get_induction_variable(function: &Function, block: BasicBlockId) -> Result Err(terminator.call_stack()), + Some(terminator) => Err(function.dfg.get_call_stack(terminator.call_stack())), None => Err(CallStack::new()), } } @@ -859,12 +850,7 @@ impl<'f> LoopIteration<'f> { then_destination, else_destination, call_stack, - } => self.handle_jmpif( - *condition, - *then_destination, - *else_destination, - call_stack.clone(), - ), + } => self.handle_jmpif(*condition, *then_destination, *else_destination, *call_stack), TerminatorInstruction::Jmp { destination, arguments, call_stack: _ } => { if self.get_original_block(*destination) == self.loop_.header { // We found the back-edge of the loop. @@ -888,7 +874,7 @@ impl<'f> LoopIteration<'f> { condition: ValueId, then_destination: BasicBlockId, else_destination: BasicBlockId, - call_stack: CallStack, + call_stack: CallStackId, ) -> Vec { let condition = self.inserter.resolve(condition); @@ -949,10 +935,9 @@ impl<'f> LoopIteration<'f> { } self.inserter.push_instruction(instruction, self.insert_block); } - let mut terminator = self.dfg()[self.source_block] - .unwrap_terminator() - .clone() - .map_values(|value| self.inserter.resolve(value)); + let mut terminator = self.dfg()[self.source_block].unwrap_terminator().clone(); + + terminator.map_values_mut(|value| self.inserter.resolve(value)); // Replace the blocks in the terminator with fresh one with the same parameters, // while remembering which were the original block IDs. @@ -1142,7 +1127,6 @@ mod tests { let (lower, upper) = loops.yet_to_unroll[0] .get_const_bounds(function, &loops.cfg) - .expect("should find bounds") .expect("bounds are numeric const"); assert_eq!(lower, FieldElement::from(0u32)); @@ -1158,7 +1142,7 @@ mod tests { let refs = loop0.find_pre_header_reference_values(function, &loops.cfg).unwrap(); assert_eq!(refs.len(), 1); - assert!(refs.contains(&ValueId::new(2))); + assert!(refs.contains(&ValueId::test_new(2))); let (loads, stores) = loop0.count_loads_and_stores(function, &refs); assert_eq!(loads, 1); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/parser/into_ssa.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/parser/into_ssa.rs index e78cbbd75a1..7c7e977c6ce 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/parser/into_ssa.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/parser/into_ssa.rs @@ -57,7 +57,7 @@ impl Translator { // A FunctionBuilder must be created with a main Function, so here wer remove it // from the parsed SSA to avoid adding it twice later on. let main_function = parsed_ssa.functions.remove(0); - let main_id = FunctionId::new(0); + let main_id = FunctionId::test_new(0); let mut builder = FunctionBuilder::new(main_function.external_name.clone(), main_id); builder.set_runtime(main_function.runtime_type); @@ -65,7 +65,7 @@ impl Translator { let mut function_id_counter = 1; let mut functions = HashMap::new(); for function in &parsed_ssa.functions { - let function_id = FunctionId::new(function_id_counter); + let function_id = FunctionId::test_new(function_id_counter); function_id_counter += 1; functions.insert(function.internal_name.clone(), function_id); @@ -207,7 +207,7 @@ impl Translator { } ParsedInstruction::Cast { target, lhs, typ } => { let lhs = self.translate_value(lhs)?; - let value_id = self.builder.insert_cast(lhs, typ); + let value_id = self.builder.insert_cast(lhs, typ.unwrap_numeric()); self.define_variable(target, value_id)?; } ParsedInstruction::Constrain { lhs, rhs, assert_message } => { @@ -290,7 +290,7 @@ impl Translator { fn translate_value(&mut self, value: ParsedValue) -> Result { match value { ParsedValue::NumericConstant { constant, typ } => { - Ok(self.builder.numeric_constant(constant, typ)) + Ok(self.builder.numeric_constant(constant, typ.unwrap_numeric())) } ParsedValue::Variable(identifier) => self.lookup_variable(identifier), } diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/context.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/context.rs index 116e0de4ecd..7807658dabb 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/context.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/context.rs @@ -19,7 +19,6 @@ use crate::ssa::ir::types::{NumericType, Type}; use crate::ssa::ir::value::ValueId; use super::value::{Tree, Value, Values}; -use super::SSA_WORD_SIZE; use fxhash::{FxHashMap as HashMap, FxHashSet as HashSet}; /// The FunctionContext is the main context object for translating a @@ -281,37 +280,33 @@ impl<'a> FunctionContext<'a> { &mut self, value: impl Into, negative: bool, - typ: Type, + numeric_type: NumericType, ) -> Result { let value = value.into(); - if let Type::Numeric(numeric_type) = typ { - if let Some(range) = numeric_type.value_is_outside_limits(value, negative) { - let call_stack = self.builder.get_call_stack(); - return Err(RuntimeError::IntegerOutOfBounds { - value: if negative { -value } else { value }, - typ: numeric_type, - range, - call_stack, - }); - } + if let Some(range) = numeric_type.value_is_outside_limits(value, negative) { + let call_stack = self.builder.get_call_stack(); + return Err(RuntimeError::IntegerOutOfBounds { + value: if negative { -value } else { value }, + typ: numeric_type, + range, + call_stack, + }); + } - let value = if negative { - match numeric_type { - NumericType::NativeField => -value, - NumericType::Signed { bit_size } | NumericType::Unsigned { bit_size } => { - let base = 1_u128 << bit_size; - FieldElement::from(base) - value - } + let value = if negative { + match numeric_type { + NumericType::NativeField => -value, + NumericType::Signed { bit_size } | NumericType::Unsigned { bit_size } => { + let base = 1_u128 << bit_size; + FieldElement::from(base) - value } - } else { - value - }; - - Ok(self.builder.numeric_constant(value, typ)) + } } else { - panic!("Expected type for numeric constant to be a numeric type, found {typ}"); - } + value + }; + + Ok(self.builder.numeric_constant(value, numeric_type)) } /// helper function which add instructions to the block computing the absolute value of the @@ -320,16 +315,16 @@ impl<'a> FunctionContext<'a> { assert_eq!(self.builder.type_of_value(sign), Type::bool()); // We compute the absolute value of lhs - let bit_width = - self.builder.numeric_constant(FieldElement::from(2_i128.pow(bit_size)), Type::field()); + let bit_width = FieldElement::from(2_i128.pow(bit_size)); + let bit_width = self.builder.numeric_constant(bit_width, NumericType::NativeField); let sign_not = self.builder.insert_not(sign); // We use unsafe casts here, this is fine as we're casting to a `field` type. - let as_field = self.builder.insert_cast(input, Type::field()); - let sign_field = self.builder.insert_cast(sign, Type::field()); + let as_field = self.builder.insert_cast(input, NumericType::NativeField); + let sign_field = self.builder.insert_cast(sign, NumericType::NativeField); let positive_predicate = self.builder.insert_binary(sign_field, BinaryOp::Mul, as_field); let two_complement = self.builder.insert_binary(bit_width, BinaryOp::Sub, as_field); - let sign_not_field = self.builder.insert_cast(sign_not, Type::field()); + let sign_not_field = self.builder.insert_cast(sign_not, NumericType::NativeField); let negative_predicate = self.builder.insert_binary(sign_not_field, BinaryOp::Mul, two_complement); self.builder.insert_binary(positive_predicate, BinaryOp::Add, negative_predicate) @@ -354,15 +349,18 @@ impl<'a> FunctionContext<'a> { operator: BinaryOpKind, location: Location, ) -> ValueId { - let result_type = self.builder.current_function.dfg.type_of_value(result); + let result_type = self.builder.current_function.dfg.type_of_value(result).unwrap_numeric(); match result_type { - Type::Numeric(NumericType::Signed { bit_size }) => { + NumericType::Signed { bit_size } => { match operator { BinaryOpKind::Add | BinaryOpKind::Subtract => { // Result is computed modulo the bit size let result = self.builder.insert_truncate(result, bit_size, bit_size + 1); - let result = - self.insert_safe_cast(result, Type::unsigned(bit_size), location); + let result = self.insert_safe_cast( + result, + NumericType::unsigned(bit_size), + location, + ); self.check_signed_overflow(result, lhs, rhs, operator, bit_size, location); self.insert_safe_cast(result, result_type, location) @@ -370,7 +368,7 @@ impl<'a> FunctionContext<'a> { BinaryOpKind::Multiply => { // Result is computed modulo the bit size let mut result = - self.builder.insert_cast(result, Type::unsigned(2 * bit_size)); + self.builder.insert_cast(result, NumericType::unsigned(2 * bit_size)); result = self.builder.insert_truncate(result, bit_size, 2 * bit_size); self.check_signed_overflow(result, lhs, rhs, operator, bit_size, location); @@ -382,7 +380,7 @@ impl<'a> FunctionContext<'a> { _ => unreachable!("operator {} should not overflow", operator), } } - Type::Numeric(NumericType::Unsigned { bit_size }) => { + NumericType::Unsigned { bit_size } => { let dfg = &self.builder.current_function.dfg; let max_lhs_bits = dfg.get_value_max_num_bits(lhs); @@ -410,7 +408,7 @@ impl<'a> FunctionContext<'a> { result } - _ => result, + NumericType::NativeField => result, } } @@ -425,11 +423,11 @@ impl<'a> FunctionContext<'a> { bit_size: u32, location: Location, ) -> ValueId { - let one = self.builder.numeric_constant(FieldElement::one(), Type::bool()); + let one = self.builder.numeric_constant(FieldElement::one(), NumericType::bool()); assert!(self.builder.current_function.dfg.type_of_value(rhs) == Type::unsigned(8)); - let max = - self.builder.numeric_constant(FieldElement::from(bit_size as i128), Type::unsigned(8)); + let bit_size_field = FieldElement::from(bit_size as i128); + let max = self.builder.numeric_constant(bit_size_field, NumericType::unsigned(8)); let overflow = self.builder.insert_binary(rhs, BinaryOp::Lt, max); self.builder.set_location(location).insert_constrain( overflow, @@ -463,11 +461,11 @@ impl<'a> FunctionContext<'a> { let is_sub = operator == BinaryOpKind::Subtract; let half_width = self.builder.numeric_constant( FieldElement::from(2_i128.pow(bit_size - 1)), - Type::unsigned(bit_size), + NumericType::unsigned(bit_size), ); // We compute the sign of the operands. The overflow checks for signed integers depends on these signs - let lhs_as_unsigned = self.insert_safe_cast(lhs, Type::unsigned(bit_size), location); - let rhs_as_unsigned = self.insert_safe_cast(rhs, Type::unsigned(bit_size), location); + let lhs_as_unsigned = self.insert_safe_cast(lhs, NumericType::unsigned(bit_size), location); + let rhs_as_unsigned = self.insert_safe_cast(rhs, NumericType::unsigned(bit_size), location); let lhs_sign = self.builder.insert_binary(lhs_as_unsigned, BinaryOp::Lt, half_width); let mut rhs_sign = self.builder.insert_binary(rhs_as_unsigned, BinaryOp::Lt, half_width); let message = if is_sub { @@ -505,18 +503,19 @@ impl<'a> FunctionContext<'a> { bit_size, Some("attempt to multiply with overflow".to_string()), ); - let product = self.builder.insert_cast(product_field, Type::unsigned(bit_size)); + let product = + self.builder.insert_cast(product_field, NumericType::unsigned(bit_size)); // Then we check the signed product fits in a signed integer of bit_size-bits let not_same = self.builder.insert_not(same_sign); let not_same_sign_field = - self.insert_safe_cast(not_same, Type::unsigned(bit_size), location); + self.insert_safe_cast(not_same, NumericType::unsigned(bit_size), location); let positive_maximum_with_offset = self.builder.insert_binary(half_width, BinaryOp::Add, not_same_sign_field); let product_overflow_check = self.builder.insert_binary(product, BinaryOp::Lt, positive_maximum_with_offset); - let one = self.builder.numeric_constant(FieldElement::one(), Type::bool()); + let one = self.builder.numeric_constant(FieldElement::one(), NumericType::bool()); self.builder.set_location(location).insert_constrain( product_overflow_check, one, @@ -595,7 +594,7 @@ impl<'a> FunctionContext<'a> { pub(super) fn insert_safe_cast( &mut self, mut value: ValueId, - typ: Type, + typ: NumericType, location: Location, ) -> ValueId { self.builder.set_location(location); @@ -614,7 +613,8 @@ impl<'a> FunctionContext<'a> { /// Create a const offset of an address for an array load or store pub(super) fn make_offset(&mut self, mut address: ValueId, offset: u128) -> ValueId { if offset != 0 { - let offset = self.builder.numeric_constant(offset, self.builder.type_of_value(address)); + let typ = self.builder.type_of_value(address).unwrap_numeric(); + let offset = self.builder.numeric_constant(offset, typ); address = self.builder.insert_binary(address, BinaryOp::Add, offset); } address @@ -622,7 +622,7 @@ impl<'a> FunctionContext<'a> { /// Array indexes are u32. This function casts values used as indexes to u32. pub(super) fn make_array_index(&mut self, index: ValueId) -> ValueId { - self.builder.insert_cast(index, Type::unsigned(SSA_WORD_SIZE)) + self.builder.insert_cast(index, NumericType::length_type()) } /// Define a local variable to be some Values that can later be retrieved @@ -870,12 +870,12 @@ impl<'a> FunctionContext<'a> { ) -> ValueId { let index = self.make_array_index(index); let element_size = - self.builder.numeric_constant(self.element_size(array), Type::unsigned(SSA_WORD_SIZE)); + self.builder.numeric_constant(self.element_size(array), NumericType::length_type()); // The actual base index is the user's index * the array element type's size let mut index = self.builder.set_location(location).insert_binary(index, BinaryOp::Mul, element_size); - let one = self.builder.numeric_constant(FieldElement::one(), Type::unsigned(SSA_WORD_SIZE)); + let one = self.builder.numeric_constant(FieldElement::one(), NumericType::length_type()); new_value.for_each(|value| { let value = value.eval(self); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs index 91a49018f76..d3821158b80 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/mod.rs @@ -23,6 +23,7 @@ use self::{ }; use super::ir::instruction::ErrorType; +use super::ir::types::NumericType; use super::{ function_builder::data_bus::DataBus, ir::{ @@ -90,12 +91,18 @@ pub(crate) fn generate_ssa( None, ); } + let return_call_stack = function_context + .builder + .current_function + .dfg + .call_stack_data + .add_location_to_root(return_location); let return_instruction = function_context.builder.current_function.dfg[block].unwrap_terminator_mut(); + match return_instruction { TerminatorInstruction::Return { return_values, call_stack } => { - call_stack.clear(); - call_stack.push_back(return_location); + *call_stack = return_call_stack; // replace the returned values with the return data array if let Some(return_data_bus) = return_data.databus { return_values.clear(); @@ -223,12 +230,12 @@ impl<'a> FunctionContext<'a> { } ast::Literal::Integer(value, negative, typ, location) => { self.builder.set_location(*location); - let typ = Self::convert_non_tuple_type(typ); + let typ = Self::convert_non_tuple_type(typ).unwrap_numeric(); self.checked_numeric_constant(*value, *negative, typ).map(Into::into) } ast::Literal::Bool(value) => { // Don't need to call checked_numeric_constant here since `value` can only be true or false - Ok(self.builder.numeric_constant(*value as u128, Type::bool()).into()) + Ok(self.builder.numeric_constant(*value as u128, NumericType::bool()).into()) } ast::Literal::Str(string) => Ok(self.codegen_string(string)), ast::Literal::FmtStr(fragments, number_of_fields, fields) => { @@ -272,7 +279,7 @@ impl<'a> FunctionContext<'a> { fn codegen_string(&mut self, string: &str) -> Values { let elements = vecmap(string.as_bytes(), |byte| { - let char = self.builder.numeric_constant(*byte as u128, Type::unsigned(8)); + let char = self.builder.numeric_constant(*byte as u128, NumericType::char()); (char.into(), false) }); let typ = Self::convert_non_tuple_type(&ast::Type::String(elements.len() as u32)); @@ -349,7 +356,7 @@ impl<'a> FunctionContext<'a> { UnaryOp::Minus => { let rhs = self.codegen_expression(&unary.rhs)?; let rhs = rhs.into_leaf().eval(self); - let typ = self.builder.type_of_value(rhs); + let typ = self.builder.type_of_value(rhs).unwrap_numeric(); let zero = self.builder.numeric_constant(0u128, typ); Ok(self.insert_binary( zero, @@ -443,7 +450,7 @@ impl<'a> FunctionContext<'a> { let index = self.make_array_index(index); let type_size = Self::convert_type(element_type).size_of_type(); let type_size = - self.builder.numeric_constant(type_size as u128, Type::unsigned(SSA_WORD_SIZE)); + self.builder.numeric_constant(type_size as u128, NumericType::length_type()); let base_index = self.builder.set_location(location).insert_binary(index, BinaryOp::Mul, type_size); @@ -482,7 +489,7 @@ impl<'a> FunctionContext<'a> { .make_array_index(length.expect("ICE: a length must be supplied for indexing slices")); let is_offset_out_of_bounds = self.builder.insert_binary(index, BinaryOp::Lt, array_len); - let true_const = self.builder.numeric_constant(true, Type::bool()); + let true_const = self.builder.numeric_constant(true, NumericType::bool()); self.builder.insert_constrain( is_offset_out_of_bounds, @@ -493,7 +500,7 @@ impl<'a> FunctionContext<'a> { fn codegen_cast(&mut self, cast: &ast::Cast) -> Result { let lhs = self.codegen_non_tuple_expression(&cast.lhs)?; - let typ = Self::convert_non_tuple_type(&cast.r#type); + let typ = Self::convert_non_tuple_type(&cast.r#type).unwrap_numeric(); Ok(self.insert_safe_cast(lhs, typ, cast.location).into()) } @@ -702,7 +709,9 @@ impl<'a> FunctionContext<'a> { // Don't mutate the reference count if we're assigning an array literal to a Let: // `let mut foo = [1, 2, 3];` // we consider the array to be moved, so we should have an initial rc of just 1. - let should_inc_rc = !let_expr.expression.is_array_or_slice_literal(); + // + // TODO: this exception breaks #6763 + let should_inc_rc = true; // !let_expr.expression.is_array_or_slice_literal(); values = values.map(|value| { let value = value.eval(self); @@ -730,7 +739,7 @@ impl<'a> FunctionContext<'a> { assert_payload: &Option>, ) -> Result { let expr = self.codegen_non_tuple_expression(expr)?; - let true_literal = self.builder.numeric_constant(true, Type::bool()); + let true_literal = self.builder.numeric_constant(true, NumericType::bool()); // Set the location here for any errors that may occur when we codegen the assert message self.builder.set_location(location); diff --git a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/program.rs b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/program.rs index 3dba6dc0a98..de01a4596ad 100644 --- a/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/program.rs +++ b/noir/noir-repo/compiler/noirc_evaluator/src/ssa/ssa_gen/program.rs @@ -25,7 +25,7 @@ pub(crate) struct Ssa { /// This mapping is necessary to use the correct function pointer for an ACIR call, /// as the final program artifact will be a list of only entry point functions. #[serde(skip)] - pub(crate) entry_point_to_generated_index: BTreeMap, + entry_point_to_generated_index: BTreeMap, // We can skip serializing this field as the error selector types end up as part of the // ABI not the actual SSA IR. #[serde(skip)] @@ -47,25 +47,11 @@ impl Ssa { (f.id(), f) }); - let entry_point_to_generated_index = btree_map( - functions - .iter() - .filter(|(_, func)| { - let runtime = func.runtime(); - match func.runtime() { - RuntimeType::Acir(_) => runtime.is_entry_point() || func.id() == main_id, - RuntimeType::Brillig(_) => false, - } - }) - .enumerate(), - |(i, (id, _))| (*id, i as u32), - ); - Self { functions, main_id, next_id: AtomicCounter::starting_after(max_id), - entry_point_to_generated_index, + entry_point_to_generated_index: BTreeMap::new(), error_selector_to_type: error_types, } } @@ -98,6 +84,33 @@ impl Ssa { self.functions.insert(new_id, function); new_id } + pub(crate) fn generate_entry_point_index(mut self) -> Self { + self.entry_point_to_generated_index = btree_map( + self.functions + .iter() + .filter(|(_, func)| { + let runtime = func.runtime(); + match func.runtime() { + RuntimeType::Acir(_) => { + runtime.is_entry_point() || func.id() == self.main_id + } + RuntimeType::Brillig(_) => false, + } + }) + .enumerate(), + |(i, (id, _))| (*id, i as u32), + ); + self + } + + pub(crate) fn get_entry_point_index(&self, func_id: &FunctionId) -> Option { + // Ensure the map has been initialized + assert!( + !self.entry_point_to_generated_index.is_empty(), + "Trying to read uninitialized entry point index" + ); + self.entry_point_to_generated_index.get(func_id).copied() + } } impl Display for Ssa { diff --git a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/comptime.rs b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/comptime.rs index 962356d6dd9..fe8c8338b32 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/comptime.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/comptime.rs @@ -39,6 +39,8 @@ struct AttributeContext { attribute_module: LocalModuleId, } +type CollectedAttributes = Vec<(FuncId, Value, Vec, AttributeContext, Span)>; + impl AttributeContext { fn new(file: FileId, module: LocalModuleId) -> Self { Self { file, module, attribute_file: file, attribute_module: module } @@ -131,41 +133,37 @@ impl<'context> Elaborator<'context> { } } - fn run_comptime_attributes_on_item( + fn collect_comptime_attributes_on_item( &mut self, attributes: &[SecondaryAttribute], item: Value, - span: Span, attribute_context: AttributeContext, - generated_items: &mut CollectedItems, + attributes_to_run: &mut CollectedAttributes, ) { for attribute in attributes { - self.run_comptime_attribute_on_item( + self.collect_comptime_attribute_on_item( attribute, &item, - span, attribute_context, - generated_items, + attributes_to_run, ); } } - fn run_comptime_attribute_on_item( + fn collect_comptime_attribute_on_item( &mut self, attribute: &SecondaryAttribute, item: &Value, - span: Span, attribute_context: AttributeContext, - generated_items: &mut CollectedItems, + attributes_to_run: &mut CollectedAttributes, ) { if let SecondaryAttribute::Meta(attribute) = attribute { self.elaborate_in_comptime_context(|this| { - if let Err(error) = this.run_comptime_attribute_name_on_item( + if let Err(error) = this.collect_comptime_attribute_name_on_item( attribute, item.clone(), - span, attribute_context, - generated_items, + attributes_to_run, ) { this.errors.push(error); } @@ -173,22 +171,19 @@ impl<'context> Elaborator<'context> { } } - fn run_comptime_attribute_name_on_item( + /// Resolve an attribute to the function it refers to and add it to `attributes_to_run` + fn collect_comptime_attribute_name_on_item( &mut self, attribute: &MetaAttribute, item: Value, - span: Span, attribute_context: AttributeContext, - generated_items: &mut CollectedItems, + attributes_to_run: &mut CollectedAttributes, ) -> Result<(), (CompilationError, FileId)> { self.file = attribute_context.attribute_file; self.local_module = attribute_context.attribute_module; + let span = attribute.span; - let location = Location::new(attribute.span, self.file); - let function = Expression { - kind: ExpressionKind::Variable(attribute.name.clone()), - span: attribute.span, - }; + let function = Expression { kind: ExpressionKind::Variable(attribute.name.clone()), span }; let arguments = attribute.arguments.clone(); // Elaborate the function, rolling back any errors generated in case it is unknown @@ -200,32 +195,34 @@ impl<'context> Elaborator<'context> { let definition_id = match self.interner.expression(&function) { HirExpression::Ident(ident, _) => ident.id, _ => { - return Err(( - ResolverError::AttributeFunctionIsNotAPath { - function: function_string, - span: attribute.span, - } - .into(), - self.file, - )) + let error = + ResolverError::AttributeFunctionIsNotAPath { function: function_string, span }; + return Err((error.into(), self.file)); } }; let Some(definition) = self.interner.try_definition(definition_id) else { - return Err(( - ResolverError::AttributeFunctionNotInScope { - name: function_string, - span: attribute.span, - } - .into(), - self.file, - )); + let error = ResolverError::AttributeFunctionNotInScope { name: function_string, span }; + return Err((error.into(), self.file)); }; let DefinitionKind::Function(function) = definition.kind else { return Err((ResolverError::NonFunctionInAnnotation { span }.into(), self.file)); }; + attributes_to_run.push((function, item, arguments, attribute_context, span)); + Ok(()) + } + + fn run_attribute( + &mut self, + attribute_context: AttributeContext, + function: FuncId, + arguments: Vec, + item: Value, + location: Location, + generated_items: &mut CollectedItems, + ) -> Result<(), (CompilationError, FileId)> { self.file = attribute_context.file; self.local_module = attribute_context.module; @@ -237,10 +234,7 @@ impl<'context> Elaborator<'context> { arguments, location, ) - .map_err(|error| { - let file = error.get_location().file; - (error.into(), file) - })?; + .map_err(|error| error.into_compilation_error_pair())?; arguments.insert(0, (item, location)); @@ -496,65 +490,91 @@ impl<'context> Elaborator<'context> { } } - /// Run all the attributes on each item. The ordering is unspecified to users but currently - /// we run trait attributes first to (e.g.) register derive handlers before derive is - /// called on structs. - /// Returns any new items generated by attributes. + /// Run all the attributes on each item in the crate in source-order. + /// Source-order is defined as running all child modules before their parent modules are run. + /// Child modules of a parent are run in order of their `mod foo;` declarations in the parent. pub(super) fn run_attributes( &mut self, traits: &BTreeMap, types: &BTreeMap, functions: &[UnresolvedFunctions], module_attributes: &[ModuleAttribute], - ) -> CollectedItems { - let mut generated_items = CollectedItems::default(); + ) { + let mut attributes_to_run = Vec::new(); for (trait_id, trait_) in traits { let attributes = &trait_.trait_def.attributes; let item = Value::TraitDefinition(*trait_id); - let span = trait_.trait_def.span; let context = AttributeContext::new(trait_.file_id, trait_.module_id); - self.run_comptime_attributes_on_item( + self.collect_comptime_attributes_on_item( attributes, item, - span, context, - &mut generated_items, + &mut attributes_to_run, ); } for (struct_id, struct_def) in types { let attributes = &struct_def.struct_def.attributes; let item = Value::StructDefinition(*struct_id); - let span = struct_def.struct_def.span; let context = AttributeContext::new(struct_def.file_id, struct_def.module_id); - self.run_comptime_attributes_on_item( + self.collect_comptime_attributes_on_item( attributes, item, - span, context, - &mut generated_items, + &mut attributes_to_run, ); } - self.run_attributes_on_functions(functions, &mut generated_items); + self.collect_attributes_on_functions(functions, &mut attributes_to_run); + self.collect_attributes_on_modules(module_attributes, &mut attributes_to_run); + + self.sort_attributes_by_run_order(&mut attributes_to_run); - self.run_attributes_on_modules(module_attributes, &mut generated_items); + // run + for (attribute, item, args, context, span) in attributes_to_run { + let location = Location::new(span, context.attribute_file); - generated_items + let mut generated_items = CollectedItems::default(); + self.elaborate_in_comptime_context(|this| { + if let Err(error) = this.run_attribute( + context, + attribute, + args, + item, + location, + &mut generated_items, + ) { + this.errors.push(error); + } + }); + + if !generated_items.is_empty() { + self.elaborate_items(generated_items); + } + } } - fn run_attributes_on_modules( + fn sort_attributes_by_run_order(&self, attributes: &mut CollectedAttributes) { + let module_order = self.def_maps[&self.crate_id].get_module_topological_order(); + + // Sort each attribute by (module, location in file) so that we can execute in + // the order they were defined in, running attributes in child modules first. + attributes.sort_by_key(|(_, _, _, ctx, span)| { + (module_order[&ctx.attribute_module], span.start()) + }); + } + + fn collect_attributes_on_modules( &mut self, module_attributes: &[ModuleAttribute], - generated_items: &mut CollectedItems, + attributes_to_run: &mut CollectedAttributes, ) { for module_attribute in module_attributes { let local_id = module_attribute.module_id; let module_id = ModuleId { krate: self.crate_id, local_id }; let item = Value::ModuleDefinition(module_id); let attribute = &module_attribute.attribute; - let span = Span::default(); let context = AttributeContext { file: module_attribute.file_id, @@ -563,14 +583,14 @@ impl<'context> Elaborator<'context> { attribute_module: module_attribute.attribute_module_id, }; - self.run_comptime_attribute_on_item(attribute, &item, span, context, generated_items); + self.collect_comptime_attribute_on_item(attribute, &item, context, attributes_to_run); } } - fn run_attributes_on_functions( + fn collect_attributes_on_functions( &mut self, function_sets: &[UnresolvedFunctions], - generated_items: &mut CollectedItems, + attributes_to_run: &mut CollectedAttributes, ) { for function_set in function_sets { self.self_type = function_set.self_type.clone(); @@ -579,13 +599,11 @@ impl<'context> Elaborator<'context> { let context = AttributeContext::new(function_set.file_id, *local_module); let attributes = function.secondary_attributes(); let item = Value::FunctionDefinition(*function_id); - let span = function.span(); - self.run_comptime_attributes_on_item( + self.collect_comptime_attributes_on_item( attributes, item, - span, context, - generated_items, + attributes_to_run, ); } } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/expressions.rs b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/expressions.rs index b5fab6faf9b..b4ea06f1030 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/expressions.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/expressions.rs @@ -346,6 +346,10 @@ impl<'context> Elaborator<'context> { Type::Array(_, base_type) => *base_type, Type::Slice(base_type) => *base_type, Type::Error => Type::Error, + Type::TypeVariable(_) => { + self.push_err(TypeCheckError::TypeAnnotationsNeededForIndex { span: lhs_span }); + Type::Error + } typ => { self.push_err(TypeCheckError::TypeMismatch { expected_typ: "Array".to_owned(), diff --git a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/mod.rs b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/mod.rs index 478504a79be..fe1d1e38e1a 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/mod.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/mod.rs @@ -307,23 +307,13 @@ impl<'context> Elaborator<'context> { // We have to run any comptime attributes on functions before the function is elaborated // since the generated items are checked beforehand as well. - let generated_items = self.run_attributes( + self.run_attributes( &items.traits, &items.types, &items.functions, &items.module_attributes, ); - // After everything is collected, we can elaborate our generated items. - // It may be better to inline these within `items` entirely since elaborating them - // all here means any globals will not see these. Inlining them completely within `items` - // means we must be more careful about missing any additional items that need to be already - // elaborated. E.g. if a new struct is created, we've already passed the code path to - // elaborate them. - if !generated_items.is_empty() { - self.elaborate_items(generated_items); - } - for functions in items.functions { self.elaborate_functions(functions); } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/statements.rs b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/statements.rs index 6ed8fee753c..93009f49071 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/statements.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/statements.rs @@ -183,20 +183,20 @@ impl<'context> Elaborator<'context> { } pub(super) fn elaborate_assign(&mut self, assign: AssignStatement) -> (HirStatement, Type) { - let span = assign.expression.span; + let expr_span = assign.expression.span; let (expression, expr_type) = self.elaborate_expression(assign.expression); - let (lvalue, lvalue_type, mutable) = self.elaborate_lvalue(assign.lvalue, span); + let (lvalue, lvalue_type, mutable) = self.elaborate_lvalue(assign.lvalue); if !mutable { let (name, span) = self.get_lvalue_name_and_span(&lvalue); self.push_err(TypeCheckError::VariableMustBeMutable { name, span }); } - self.unify_with_coercions(&expr_type, &lvalue_type, expression, span, || { + self.unify_with_coercions(&expr_type, &lvalue_type, expression, expr_span, || { TypeCheckError::TypeMismatchWithSource { actual: expr_type.clone(), expected: lvalue_type.clone(), - span, + span: expr_span, source: Source::Assignment, } }); @@ -296,7 +296,7 @@ impl<'context> Elaborator<'context> { } } - fn elaborate_lvalue(&mut self, lvalue: LValue, assign_span: Span) -> (HirLValue, Type, bool) { + fn elaborate_lvalue(&mut self, lvalue: LValue) -> (HirLValue, Type, bool) { match lvalue { LValue::Ident(ident) => { let mut mutable = true; @@ -330,7 +330,7 @@ impl<'context> Elaborator<'context> { (HirLValue::Ident(ident.clone(), typ.clone()), typ, mutable) } LValue::MemberAccess { object, field_name, span } => { - let (object, lhs_type, mut mutable) = self.elaborate_lvalue(*object, assign_span); + let (object, lhs_type, mut mutable) = self.elaborate_lvalue(*object); let mut object = Box::new(object); let field_name = field_name.clone(); @@ -374,8 +374,7 @@ impl<'context> Elaborator<'context> { expr_span, }); - let (mut lvalue, mut lvalue_type, mut mutable) = - self.elaborate_lvalue(*array, assign_span); + let (mut lvalue, mut lvalue_type, mut mutable) = self.elaborate_lvalue(*array); // Before we check that the lvalue is an array, try to dereference it as many times // as needed to unwrap any &mut wrappers. @@ -397,12 +396,15 @@ impl<'context> Elaborator<'context> { self.push_err(TypeCheckError::StringIndexAssign { span: lvalue_span }); Type::Error } + Type::TypeVariable(_) => { + self.push_err(TypeCheckError::TypeAnnotationsNeededForIndex { span }); + Type::Error + } other => { - // TODO: Need a better span here self.push_err(TypeCheckError::TypeMismatch { expected_typ: "array".to_string(), expr_typ: other.to_string(), - expr_span: assign_span, + expr_span: span, }); Type::Error } @@ -413,7 +415,7 @@ impl<'context> Elaborator<'context> { (HirLValue::Index { array, index, typ, location }, array_type, mutable) } LValue::Dereference(lvalue, span) => { - let (lvalue, reference_type, _) = self.elaborate_lvalue(*lvalue, assign_span); + let (lvalue, reference_type, _) = self.elaborate_lvalue(*lvalue); let lvalue = Box::new(lvalue); let location = Location::new(span, self.file); @@ -423,7 +425,7 @@ impl<'context> Elaborator<'context> { self.unify(&reference_type, &expected_type, || TypeCheckError::TypeMismatch { expected_typ: expected_type.to_string(), expr_typ: reference_type.to_string(), - expr_span: assign_span, + expr_span: span, }); // Dereferences are always mutable since we already type checked against a &mut T @@ -433,7 +435,7 @@ impl<'context> Elaborator<'context> { } LValue::Interned(id, span) => { let lvalue = self.interner.get_lvalue(id, span).clone(); - self.elaborate_lvalue(lvalue, assign_span) + self.elaborate_lvalue(lvalue) } } } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/types.rs b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/types.rs index 0404ae3c2c0..2e4809f3511 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/elaborator/types.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/elaborator/types.rs @@ -576,7 +576,7 @@ impl<'context> Elaborator<'context> { fn resolve_trait_static_method(&mut self, path: &Path) -> Option { let path_resolution = self.resolve_path(path.clone()).ok()?; let func_id = path_resolution.item.function_id()?; - let meta = self.interner.function_meta(&func_id); + let meta = self.interner.try_function_meta(&func_id)?; let the_trait = self.interner.get_trait(meta.trait_id?); let method = the_trait.find_method(path.last_name())?; let constraint = the_trait.as_constraint(path.span); diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir/comptime/interpreter/foreign.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir/comptime/interpreter/foreign.rs index d2611f72535..99cc11ecd2a 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir/comptime/interpreter/foreign.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir/comptime/interpreter/foreign.rs @@ -87,7 +87,6 @@ fn call_foreign( "sha256_compression" => sha256_compression(interner, args, location), _ => { let explanation = match name { - "schnorr_verify" => "Schnorr verification will be removed.".into(), "and" | "xor" => "It should be turned into a binary operation.".into(), "recursive_aggregation" => "A proof cannot be verified at comptime.".into(), _ => { diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs index 51e62599b05..33dab802b21 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_collector/dc_crate.rs @@ -119,9 +119,11 @@ pub struct ModuleAttribute { pub file_id: FileId, // The module this attribute is attached to pub module_id: LocalModuleId, + // The file where the attribute exists (it could be the same as `file_id` - // or a different one if it's an inner attribute in a different file) + // or a different one if it is an outer attribute in the parent of the module it applies to) pub attribute_file_id: FileId, + // The module where the attribute is defined (similar to `attribute_file_id`, // it could be different than `module_id` for inner attributes) pub attribute_module_id: LocalModuleId, diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/mod.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/mod.rs index 3bb16a92fdb..d9d6e150a7a 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/mod.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/mod.rs @@ -289,6 +289,29 @@ impl CrateDefMap { String::new() } } + + /// Return a topological ordering of each module such that any child modules + /// are before their parent modules. Sibling modules will respect the ordering + /// declared from their parent module (the `mod foo; mod bar;` declarations). + pub fn get_module_topological_order(&self) -> HashMap { + let mut ordering = HashMap::default(); + self.topologically_sort_modules(self.root, &mut 0, &mut ordering); + ordering + } + + fn topologically_sort_modules( + &self, + current: LocalModuleId, + index: &mut usize, + ordering: &mut HashMap, + ) { + for child in &self.modules[current.0].child_declaration_order { + self.topologically_sort_modules(*child, index, ordering); + } + + ordering.insert(current, *index); + *index += 1; + } } /// Specifies a contract function and extra metadata that diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/module_data.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/module_data.rs index fe6fe8285d3..06188f3920b 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/module_data.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir/def_map/module_data.rs @@ -14,6 +14,11 @@ pub struct ModuleData { pub parent: Option, pub children: HashMap, + /// Each child in the order they were declared in the parent module. + /// E.g. for a module containing `mod foo; mod bar; mod baz` this would + /// be `vec![foo, bar, baz]`. + pub child_declaration_order: Vec, + /// Contains all definitions visible to the current module. This includes /// all definitions in self.definitions as well as all imported definitions. scope: ItemScope, @@ -47,6 +52,7 @@ impl ModuleData { ModuleData { parent, children: HashMap::new(), + child_declaration_order: Vec::new(), scope: ItemScope::default(), definitions: ItemScope::default(), location, @@ -73,6 +79,10 @@ impl ModuleData { ) -> Result<(), (Ident, Ident)> { self.scope.add_definition(name.clone(), visibility, item_id, trait_id)?; + if let ModuleDefId::ModuleId(child) = item_id { + self.child_declaration_order.push(child.local_id); + } + // definitions is a subset of self.scope so it is expected if self.scope.define_func_def // returns without error, so will self.definitions.define_func_def. self.definitions.add_definition(name, visibility, item_id, trait_id) diff --git a/noir/noir-repo/compiler/noirc_frontend/src/hir/type_check/errors.rs b/noir/noir-repo/compiler/noirc_frontend/src/hir/type_check/errors.rs index dfa431157e3..15b8d50c78b 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/hir/type_check/errors.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/hir/type_check/errors.rs @@ -206,6 +206,8 @@ pub enum TypeCheckError { UnspecifiedType { span: Span }, #[error("Binding `{typ}` here to the `_` inside would create a cyclic type")] CyclicType { typ: Type, span: Span }, + #[error("Type annotations required before indexing this array or slice")] + TypeAnnotationsNeededForIndex { span: Span }, } #[derive(Debug, Clone, PartialEq, Eq)] @@ -520,6 +522,13 @@ impl<'a> From<&'a TypeCheckError> for Diagnostic { *span, ) }, + TypeCheckError::TypeAnnotationsNeededForIndex { span } => { + Diagnostic::simple_error( + "Type annotations required before indexing this array or slice".into(), + "Type annotations needed before this point, can't decide if this is an array or slice".into(), + *span, + ) + }, } } } diff --git a/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/types.rs b/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/types.rs index 0de94a89be5..884db763698 100644 --- a/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/types.rs +++ b/noir/noir-repo/compiler/noirc_frontend/src/parser/parser/types.rs @@ -15,7 +15,7 @@ impl<'a> Parser<'a> { typ } else { self.expected_label(ParsingRuleLabel::Type); - self.unspecified_type_at_previous_token_end() + UnresolvedTypeData::Error.with_span(self.span_at_previous_token_end()) } } @@ -660,6 +660,14 @@ mod tests { assert!(unconstrained); } + #[test] + fn parses_function_type_with_colon_in_parameter() { + let src = "fn(value: T) -> Field"; + let mut parser = Parser::for_str(src); + let _ = parser.parse_type_or_error(); + assert!(!parser.errors.is_empty()); + } + #[test] fn parses_trait_as_type_no_generics() { let src = "impl foo::Bar"; diff --git a/noir/noir-repo/compiler/noirc_printable_type/src/lib.rs b/noir/noir-repo/compiler/noirc_printable_type/src/lib.rs index d46b37c4ea2..6ae187da27f 100644 --- a/noir/noir-repo/compiler/noirc_printable_type/src/lib.rs +++ b/noir/noir-repo/compiler/noirc_printable_type/src/lib.rs @@ -278,6 +278,20 @@ fn write_template_replacing_interpolations( let mut last_index = 0; // How far we've written from the template let mut char_indices = template.char_indices().peekable(); while let Some((char_index, char)) = char_indices.next() { + // If we see a '}' it must be "}}" because the ones for interpolation are handled + // when we see '{' + if char == '}' { + // Write what we've seen so far in the template, including this '}' + write!(fmt, "{}", &template[last_index..=char_index])?; + + // Skip the second '}' + let (_, closing_curly) = char_indices.next().unwrap(); + assert_eq!(closing_curly, '}'); + + last_index = char_indices.peek().map(|(index, _)| *index).unwrap_or(template.len()); + continue; + } + // Keep going forward until we find a '{' if char != '{' { continue; @@ -290,7 +304,11 @@ fn write_template_replacing_interpolations( // If it's '{{', write '{' and keep going if char_indices.peek().map(|(_, char)| char) == Some(&'{') { write!(fmt, "{{")?; - (last_index, _) = char_indices.next().unwrap(); + + // Skip the second '{' + char_indices.next().unwrap(); + + last_index = char_indices.peek().map(|(index, _)| *index).unwrap_or(template.len()); continue; } @@ -428,9 +446,10 @@ mod tests { #[test] fn printable_value_display_to_string_with_curly_escapes() { let template = "hello {{world}} {{{{double_escape}}}}"; + let expected = "hello {world} {{double_escape}}"; let display = PrintableValueDisplay::::FmtString(template.to_string(), vec![]); - assert_eq!(display.to_string(), template); + assert_eq!(display.to_string(), expected); } #[test] @@ -441,7 +460,7 @@ mod tests { (PrintableValue::String("TWO".to_string()), PrintableType::String { length: 3 }), (PrintableValue::String("THREE".to_string()), PrintableType::String { length: 5 }), ]; - let expected = "hello ONE {{no}} TWO {{not_again}} THREE world"; + let expected = "hello ONE {no} TWO {not_again} THREE world"; let display = PrintableValueDisplay::::FmtString(template.to_string(), values); assert_eq!(display.to_string(), expected); diff --git a/noir/noir-repo/docs/docs/getting_started/noir_installation.md b/noir/noir-repo/docs/docs/getting_started/noir_installation.md index a5c7e649278..05f036d4f6d 100644 --- a/noir/noir-repo/docs/docs/getting_started/noir_installation.md +++ b/noir/noir-repo/docs/docs/getting_started/noir_installation.md @@ -93,7 +93,7 @@ step 2: Follow the [Noirup instructions](#installing-noirup). ## Setting up shell completions -Once `nargo` is installed, you can [set up shell completions for it](setting_up_shell_completions). +Once `nargo` is installed, you can [set up shell completions for it](setting_up_shell_completions.md). ## Uninstalling Nargo diff --git a/noir/noir-repo/docs/docs/getting_started/quick_start.md b/noir/noir-repo/docs/docs/getting_started/quick_start.md index c693624eb82..7deeae12fd9 100644 --- a/noir/noir-repo/docs/docs/getting_started/quick_start.md +++ b/noir/noir-repo/docs/docs/getting_started/quick_start.md @@ -13,7 +13,7 @@ The easiest way to develop with Noir is using Nargo the CLI tool. It provides yo You can use `noirup` the installation script to quickly install and update Nargo: ```bash -curl -L noirup.dev | bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup ``` @@ -32,7 +32,7 @@ You can use the `bbup` installation script to quickly install and update BB, Bar You can find the full list of proving backends compatible with Noir in Awesome Noir. ```bash -curl -L bbup.dev | bash +curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup ``` @@ -89,7 +89,7 @@ The command also automatically compiles your Noir program if it was not already With circuit compiled and witness generated, we're ready to prove. ## Proving backend - + Different proving backends may provide different tools and commands to work with Noir programs. Here Barretenberg's `bb` CLI tool is used as an example: ```sh diff --git a/noir/noir-repo/docs/docs/index.mdx b/noir/noir-repo/docs/docs/index.mdx index a6bd306f91d..5c116a73b3f 100644 --- a/noir/noir-repo/docs/docs/index.mdx +++ b/noir/noir-repo/docs/docs/index.mdx @@ -21,8 +21,17 @@ sidebar_position: 0 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -Noir Logo +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + + Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. diff --git a/noir/noir-repo/docs/docs/noir/concepts/comptime.md b/noir/noir-repo/docs/docs/noir/concepts/comptime.md index 37457d47b46..9661dc1a6ca 100644 --- a/noir/noir-repo/docs/docs/noir/concepts/comptime.md +++ b/noir/noir-repo/docs/docs/noir/concepts/comptime.md @@ -41,7 +41,7 @@ Note that while in a `comptime` context, any runtime variables _local to the cur Evaluation rules of `comptime` follows the normal unconstrained evaluation rules for other Noir code. There are a few things to note though: - Certain built-in functions may not be available, although more may be added over time. -- Evaluation order of global items is currently unspecified. For example, given the following two functions we can't guarantee +- Evaluation order of `comptime {}` blocks within global items is currently unspecified. For example, given the following two functions we can't guarantee which `println` will execute first. The ordering of the two printouts will be arbitrary, but should be stable across multiple compilations with the same `nargo` version as long as the program is also unchanged. ```rust @@ -56,11 +56,14 @@ fn two() { - Since evaluation order is unspecified, care should be taken when using mutable globals so that they do not rely on a particular ordering. For example, using globals to generate unique ids should be fine but relying on certain ids always being produced (especially after edits to the program) should be avoided. -- Although most ordering of globals is unspecified, two are: +- Although the ordering of comptime code is usually unspecified, there are cases where it is: - Dependencies of a crate will always be evaluated before the dependent crate. - - Any annotations on a function will be run before the function itself is resolved. This is to allow the annotation to modify the function if necessary. Note that if the + - Any attributes on a function will be run before the function body is resolved. This is to allow the attribute to modify the function if necessary. Note that if the function itself was called at compile-time previously, it will already be resolved and cannot be modified. To prevent accidentally calling functions you wish to modify - at compile-time, it may be helpful to sort your `comptime` annotation functions into a different crate along with any dependencies they require. + at compile-time, it may be helpful to sort your `comptime` annotation functions into a different submodule crate along with any dependencies they require. + - Unlike raw `comptime {}` blocks, attributes on top-level items in the program do have a set evaluation order. Attributes within a module are evaluated top-down, and attributes + in different modules are evaluated submodule-first. Sibling modules to the same parent module are evaluated in order of the module declarations (`mod foo; mod bar;`) in their + parent module. ### Lowering @@ -89,7 +92,7 @@ fn main() { } ``` -Not all types of values can be lowered. For example, `Type`s and `TypeDefinition`s (among other types) cannot be lowered at all. +Not all types of values can be lowered. For example, references, `Type`s, and `TypeDefinition`s (among other types) cannot be lowered at all. ```rust fn main() { @@ -100,6 +103,19 @@ fn main() { comptime fn get_type() -> Type { ... } ``` +Values of certain types may also change type when they are lowered. For example, a comptime format string will already be +formatted, and thus lowers into a runtime string instead: + +```rust +fn main() { + let foo = comptime { + let i = 2; + f"i = {i}" + }; + assert_eq(foo, "i = 2"); +} +``` + --- ## (Quasi) Quote @@ -121,6 +137,21 @@ Calling such a function at compile-time without `!` will just return the `Quoted For those familiar with quoting from other languages (primarily lisps), Noir's `quote` is actually a _quasiquote_. This means we can escape the quoting by using the unquote operator to splice values in the middle of quoted code. +In addition to curly braces, you can also use square braces for the quote operator: + +```rust +comptime { + let q1 = quote { 1 }; + let q2 = quote [ 2 ]; + assert_eq(q1, q2); + + // Square braces can be used to quote mismatched curly braces if needed + let _ = quote[}]; +} +``` + +--- + ## Unquote The unquote operator `$` is usable within a `quote` expression. @@ -149,7 +180,7 @@ If it is an expression (even a parenthesized one), it will do nothing. Most like Unquoting can also be avoided by escaping the `$` with a backslash: -``` +```rust comptime { let x = quote { 1 + 2 }; @@ -158,26 +189,48 @@ comptime { } ``` +### Combining Tokens + +Note that `Quoted` is internally a series of separate tokens, and that all unquoting does is combine these token vectors. +This means that code which appears to append like a string actually appends like a vector internally: + +```rust +comptime { + let x = 3; + let q = quote { foo$x }; // This is [foo, 3], not [foo3] + + // Spaces are ignored in general, they're never part of a token + assert_eq(q, quote { foo 3 }); +} +``` + +If you do want string semantics, you can use format strings then convert back to a `Quoted` value with `.quoted_contents()`. +Note that formatting a quoted value with multiple tokens will always insert a space between each token. If this is +undesired, you'll need to only operate on quoted values containing a single token. To do this, you can iterate +over each token of a larger quoted value with `.tokens()`: + +#include_code concatenate-example noir_stdlib/src/meta/mod.nr rust + --- -## Annotations +## Attributes -Annotations provide a way to run a `comptime` function on an item in the program. -When you use an annotation, the function with the same name will be called with that item as an argument: +Attributes provide a way to run a `comptime` function on an item in the program. +When you use an attribute, the function with the same name will be called with that item as an argument: ```rust -#[my_struct_annotation] +#[my_struct_attribute] struct Foo {} -comptime fn my_struct_annotation(s: StructDefinition) { - println("Called my_struct_annotation!"); +comptime fn my_struct_attribute(s: StructDefinition) { + println("Called my_struct_attribute!"); } -#[my_function_annotation] +#[my_function_attribute] fn foo() {} -comptime fn my_function_annotation(f: FunctionDefinition) { - println("Called my_function_annotation!"); +comptime fn my_function_attribute(f: FunctionDefinition) { + println("Called my_function_attribute!"); } ``` @@ -190,15 +243,47 @@ For example, this is the mechanism used to insert additional trait implementatio ### Calling annotations with additional arguments -Arguments may optionally be given to annotations. -When this is done, these additional arguments are passed to the annotation function after the item argument. +Arguments may optionally be given to attributes. +When this is done, these additional arguments are passed to the attribute function after the item argument. #include_code annotation-arguments-example noir_stdlib/src/meta/mod.nr rust -We can also take any number of arguments by adding the `varargs` annotation: +We can also take any number of arguments by adding the `varargs` attribute: #include_code annotation-varargs-example noir_stdlib/src/meta/mod.nr rust +### Attribute Evaluation Order + +Unlike the evaluation order of stray `comptime {}` blocks within functions, attributes have a well-defined evaluation +order. Within a module, attributes are evaluated top to bottom. Between modules, attributes in child modules are evaluated +first. Attributes in sibling modules are resolved following the `mod foo; mod bar;` declaration order within their parent +modules. + +```rust +mod foo; // attributes in foo are run first +mod bar; // followed by attributes in bar + +// followed by any attributes in the parent module +#[derive(Eq)] +struct Baz {} +``` + +Note that because of this evaluation order, you may get an error trying to derive a trait for a struct whose fields +have not yet had the trait derived already: + +```rust +// Error! `Bar` field of `Foo` does not (yet) implement Eq! +#[derive(Eq)] +struct Foo { + bar: Bar +} + +#[derive(Eq)] +struct Bar {} +``` + +In this case, the issue can be resolved by rearranging the structs. + --- ## Comptime API diff --git a/noir/noir-repo/docs/docs/noir/modules_packages_crates/workspaces.md b/noir/noir-repo/docs/docs/noir/modules_packages_crates/workspaces.md index 513497f12bf..2fbf10aec52 100644 --- a/noir/noir-repo/docs/docs/noir/modules_packages_crates/workspaces.md +++ b/noir/noir-repo/docs/docs/noir/modules_packages_crates/workspaces.md @@ -33,10 +33,14 @@ members = ["crates/a", "crates/b"] default-member = "crates/a" ``` -`members` indicates which packages are included in the workspace. As such, all member packages of a workspace will be processed when the `--workspace` flag is used with various commands or if a `default-member` is not specified. +`members` indicates which packages are included in the workspace. As such, all member packages of a workspace will be processed when the `--workspace` flag is used with various commands or if a `default-member` is not specified. The `--package` option can be used to limit +the scope of some commands to a specific member of the workspace; otherwise these commands run on the package nearest on the path to the +current directory where `nargo` was invoked. `default-member` indicates which package various commands process by default. Libraries can be defined in a workspace. Inside a workspace, these are consumed as `{ path = "../to_lib" }` dependencies in Nargo.toml. Inside a workspace, these are consumed as `{ path = "../to_lib" }` dependencies in Nargo.toml. + +Please note that nesting regular packages is not supported: certain commands work on the workspace level and will use the topmost Nargo.toml file they can find on the path; unless this is a workspace configuration with `members`, the command might run on some unintended package. diff --git a/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md b/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md index d6079ab182c..e9392b20a92 100644 --- a/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md +++ b/noir/noir-repo/docs/docs/noir/standard_library/black_box_fns.md @@ -14,7 +14,6 @@ Here is a list of the current black box functions: - [AES128](./cryptographic_primitives/ciphers.mdx#aes128) - [SHA256](./cryptographic_primitives/hashes.mdx#sha256) -- [Schnorr signature verification](./cryptographic_primitives/schnorr.mdx) - [Blake2s](./cryptographic_primitives/hashes.mdx#blake2s) - [Blake3](./cryptographic_primitives/hashes.mdx#blake3) - [Pedersen Hash](./cryptographic_primitives/hashes.mdx#pedersen_hash) diff --git a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx b/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx deleted file mode 100644 index 4c859043787..00000000000 --- a/noir/noir-repo/docs/docs/noir/standard_library/cryptographic_primitives/schnorr.mdx +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Schnorr Signatures -description: Learn how you can verify Schnorr signatures using Noir -keywords: [cryptographic primitives, Noir project, schnorr, signatures] -sidebar_position: 2 ---- - -import BlackBoxInfo from '@site/src/components/Notes/_blackbox'; - -## schnorr::verify_signature - -Verifier for Schnorr signatures over the embedded curve (for BN254 it is Grumpkin). - -#include_code schnorr_verify noir_stdlib/src/schnorr.nr rust - -where `_signature` can be generated like so using the npm package -[@noir-lang/barretenberg](https://www.npmjs.com/package/@noir-lang/barretenberg) - -```js -const { BarretenbergWasm } = require('@noir-lang/barretenberg/dest/wasm'); -const { Schnorr } = require('@noir-lang/barretenberg/dest/crypto/schnorr'); - -... - -const barretenberg = await BarretenbergWasm.new(); -const schnorr = new Schnorr(barretenberg); -const pubKey = schnorr.computePublicKey(privateKey); -const message = ... -const signature = Array.from( - schnorr.constructSignature(hash, privateKey).toBuffer() -); - -... -``` - - diff --git a/noir/noir-repo/docs/docusaurus.config.ts b/noir/noir-repo/docs/docusaurus.config.ts index c53d11e3373..eee4e7f8236 100644 --- a/noir/noir-repo/docs/docusaurus.config.ts +++ b/noir/noir-repo/docs/docusaurus.config.ts @@ -57,8 +57,8 @@ export default { navbar: { logo: { alt: 'Noir Logo', - src: 'img/logo.svg', - srcDark: 'img/logoDark.svg', + src: 'img/logoDark.svg', + srcDark: 'img/logo.svg', href: '/', }, items: [ diff --git a/noir/noir-repo/docs/static/img/favicon.ico b/noir/noir-repo/docs/static/img/favicon.ico index 1c85cef482e..0abffba22ef 100644 Binary files a/noir/noir-repo/docs/static/img/favicon.ico and b/noir/noir-repo/docs/static/img/favicon.ico differ diff --git a/noir/noir-repo/docs/static/img/homepage_header_pic.png b/noir/noir-repo/docs/static/img/homepage_header_pic.png index d629e202232..f6bdd5378f6 100644 Binary files a/noir/noir-repo/docs/static/img/homepage_header_pic.png and b/noir/noir-repo/docs/static/img/homepage_header_pic.png differ diff --git a/noir/noir-repo/docs/static/img/logo.png b/noir/noir-repo/docs/static/img/logo.png index 83d3a66f2b1..0df14cf4f00 100644 Binary files a/noir/noir-repo/docs/static/img/logo.png and b/noir/noir-repo/docs/static/img/logo.png differ diff --git a/noir/noir-repo/docs/static/img/logo.svg b/noir/noir-repo/docs/static/img/logo.svg index 8095d6a169d..f6fadf87bcb 100644 --- a/noir/noir-repo/docs/static/img/logo.svg +++ b/noir/noir-repo/docs/static/img/logo.svg @@ -1,29 +1,14 @@ - - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/noir/noir-repo/docs/static/img/logoDark.png b/noir/noir-repo/docs/static/img/logoDark.png new file mode 100644 index 00000000000..25d554c486c Binary files /dev/null and b/noir/noir-repo/docs/static/img/logoDark.png differ diff --git a/noir/noir-repo/docs/static/img/logoDark.svg b/noir/noir-repo/docs/static/img/logoDark.svg index dee9f27a6a9..ac0f9897b30 100644 --- a/noir/noir-repo/docs/static/img/logoDark.svg +++ b/noir/noir-repo/docs/static/img/logoDark.svg @@ -1,29 +1,13 @@ - - - - - - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.36.0/getting_started/quick_start.md b/noir/noir-repo/docs/versioned_docs/version-v0.36.0/getting_started/quick_start.md index 3c10086123f..b9c2ccad286 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.36.0/getting_started/quick_start.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.36.0/getting_started/quick_start.md @@ -13,7 +13,7 @@ The easiest way to develop with Noir is using Nargo the CLI tool. It provides yo You can use `noirup` the installation script to quickly install and update Nargo: ```bash -curl -L noirup.dev | bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup ``` @@ -30,7 +30,7 @@ You can use the `bbup` installation script to quickly install and update BB, Bar You can find the full list of proving backends compatible with Noir in Awesome Noir. ```bash -curl -L bbup.dev | bash +curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup ``` diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.36.0/index.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.36.0/index.mdx index a6bd306f91d..5c116a73b3f 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.36.0/index.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.36.0/index.mdx @@ -21,8 +21,17 @@ sidebar_position: 0 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -Noir Logo +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + + Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.37.0/getting_started/quick_start.md b/noir/noir-repo/docs/versioned_docs/version-v0.37.0/getting_started/quick_start.md index 4ce48409818..73ef62f6523 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.37.0/getting_started/quick_start.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.37.0/getting_started/quick_start.md @@ -13,7 +13,7 @@ The easiest way to develop with Noir is using Nargo the CLI tool. It provides yo You can use `noirup` the installation script to quickly install and update Nargo: ```bash -curl -L noirup.dev | bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup ``` @@ -30,7 +30,7 @@ You can use the `bbup` installation script to quickly install and update BB, Bar You can find the full list of proving backends compatible with Noir in Awesome Noir. ```bash -curl -L bbup.dev | bash +curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup ``` @@ -87,7 +87,7 @@ The command also automatically compiles your Noir program if it was not already With circuit compiled and witness generated, we're ready to prove. ## Proving backend - + Different proving backends may provide different tools and commands to work with Noir programs. Here Barretenberg's `bb` CLI tool is used as an example: ```sh diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.37.0/index.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.37.0/index.mdx index a6bd306f91d..5c116a73b3f 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.37.0/index.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.37.0/index.mdx @@ -21,8 +21,17 @@ sidebar_position: 0 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -Noir Logo +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + + Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.38.0/getting_started/quick_start.md b/noir/noir-repo/docs/versioned_docs/version-v0.38.0/getting_started/quick_start.md index c693624eb82..7deeae12fd9 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.38.0/getting_started/quick_start.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.38.0/getting_started/quick_start.md @@ -13,7 +13,7 @@ The easiest way to develop with Noir is using Nargo the CLI tool. It provides yo You can use `noirup` the installation script to quickly install and update Nargo: ```bash -curl -L noirup.dev | bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup ``` @@ -32,7 +32,7 @@ You can use the `bbup` installation script to quickly install and update BB, Bar You can find the full list of proving backends compatible with Noir in Awesome Noir. ```bash -curl -L bbup.dev | bash +curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup ``` @@ -89,7 +89,7 @@ The command also automatically compiles your Noir program if it was not already With circuit compiled and witness generated, we're ready to prove. ## Proving backend - + Different proving backends may provide different tools and commands to work with Noir programs. Here Barretenberg's `bb` CLI tool is used as an example: ```sh diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.38.0/index.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.38.0/index.mdx index a6bd306f91d..5c116a73b3f 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.38.0/index.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.38.0/index.mdx @@ -21,8 +21,17 @@ sidebar_position: 0 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -Noir Logo +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + + Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.39.0/getting_started/quick_start.md b/noir/noir-repo/docs/versioned_docs/version-v0.39.0/getting_started/quick_start.md index c693624eb82..7deeae12fd9 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.39.0/getting_started/quick_start.md +++ b/noir/noir-repo/docs/versioned_docs/version-v0.39.0/getting_started/quick_start.md @@ -13,7 +13,7 @@ The easiest way to develop with Noir is using Nargo the CLI tool. It provides yo You can use `noirup` the installation script to quickly install and update Nargo: ```bash -curl -L noirup.dev | bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup ``` @@ -32,7 +32,7 @@ You can use the `bbup` installation script to quickly install and update BB, Bar You can find the full list of proving backends compatible with Noir in Awesome Noir. ```bash -curl -L bbup.dev | bash +curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup ``` @@ -89,7 +89,7 @@ The command also automatically compiles your Noir program if it was not already With circuit compiled and witness generated, we're ready to prove. ## Proving backend - + Different proving backends may provide different tools and commands to work with Noir programs. Here Barretenberg's `bb` CLI tool is used as an example: ```sh diff --git a/noir/noir-repo/docs/versioned_docs/version-v0.39.0/index.mdx b/noir/noir-repo/docs/versioned_docs/version-v0.39.0/index.mdx index a6bd306f91d..5c116a73b3f 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v0.39.0/index.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v0.39.0/index.mdx @@ -21,8 +21,17 @@ sidebar_position: 0 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -Noir Logo +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + + Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. diff --git a/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/getting_started/quick_start.md b/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/getting_started/quick_start.md index c693624eb82..7deeae12fd9 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/getting_started/quick_start.md +++ b/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/getting_started/quick_start.md @@ -13,7 +13,7 @@ The easiest way to develop with Noir is using Nargo the CLI tool. It provides yo You can use `noirup` the installation script to quickly install and update Nargo: ```bash -curl -L noirup.dev | bash +curl -L https://raw.githubusercontent.com/noir-lang/noirup/refs/heads/main/install | bash noirup ``` @@ -32,7 +32,7 @@ You can use the `bbup` installation script to quickly install and update BB, Bar You can find the full list of proving backends compatible with Noir in Awesome Noir. ```bash -curl -L bbup.dev | bash +curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash bbup ``` @@ -89,7 +89,7 @@ The command also automatically compiles your Noir program if it was not already With circuit compiled and witness generated, we're ready to prove. ## Proving backend - + Different proving backends may provide different tools and commands to work with Noir programs. Here Barretenberg's `bb` CLI tool is used as an example: ```sh diff --git a/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/index.mdx b/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/index.mdx index a6bd306f91d..5c116a73b3f 100644 --- a/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/index.mdx +++ b/noir/noir-repo/docs/versioned_docs/version-v1.0.0-beta.0/index.mdx @@ -21,8 +21,17 @@ sidebar_position: 0 import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -Noir Logo +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + + Noir is an open-source Domain-Specific Language for safe and seamless construction of privacy-preserving Zero-Knowledge programs, requiring no previous knowledge on the underlying mathematics or cryptography. diff --git a/noir/noir-repo/noir-logo.png b/noir/noir-repo/noir-logo.png index eabb163ad73..0abffba22ef 100644 Binary files a/noir/noir-repo/noir-logo.png and b/noir/noir-repo/noir-logo.png differ diff --git a/noir/noir-repo/noir_stdlib/src/hint.nr b/noir/noir-repo/noir_stdlib/src/hint.nr new file mode 100644 index 00000000000..25dcc7ec56e --- /dev/null +++ b/noir/noir-repo/noir_stdlib/src/hint.nr @@ -0,0 +1,6 @@ +/// An identity function that *hints* to the compiler to be maximally pessimistic about what `black_box` could do. +/// +/// This can be used to block the SSA optimization passes being applied to a value, which should help to prevent +/// test programs from being optimized down to nothing and have them resemble runtime code more closely. +#[builtin(black_box)] +pub fn black_box(value: T) -> T {} diff --git a/noir/noir-repo/noir_stdlib/src/lib.nr b/noir/noir-repo/noir_stdlib/src/lib.nr index 8e9dc13c13d..c3a289a8fa2 100644 --- a/noir/noir-repo/noir_stdlib/src/lib.nr +++ b/noir/noir-repo/noir_stdlib/src/lib.nr @@ -3,7 +3,6 @@ pub mod aes128; pub mod array; pub mod slice; pub mod merkle; -pub mod schnorr; pub mod ecdsa_secp256k1; pub mod ecdsa_secp256r1; pub mod embedded_curve_ops; @@ -27,6 +26,7 @@ pub mod meta; pub mod append; pub mod mem; pub mod panic; +pub mod hint; // Oracle calls are required to be wrapped in an unconstrained function // Thus, the only argument to the `println` oracle is expected to always be an ident @@ -115,4 +115,3 @@ pub fn wrapping_mul(x: T, y: T) -> T { #[builtin(as_witness)] pub fn as_witness(x: Field) {} - diff --git a/noir/noir-repo/noir_stdlib/src/meta/mod.nr b/noir/noir-repo/noir_stdlib/src/meta/mod.nr index 5102f0cf1fd..5d2164a510d 100644 --- a/noir/noir-repo/noir_stdlib/src/meta/mod.nr +++ b/noir/noir-repo/noir_stdlib/src/meta/mod.nr @@ -252,6 +252,41 @@ mod tests { fn do_nothing(_: Self) {} } + // docs:start:concatenate-example + comptime fn concatenate(q1: Quoted, q2: Quoted) -> Quoted { + assert(q1.tokens().len() <= 1); + assert(q2.tokens().len() <= 1); + + f"{q1}{q2}".quoted_contents() + } + + // The CtString type is also useful for a compile-time string of unbounded size + // so that you can append to it in a loop. + comptime fn double_spaced(q: Quoted) -> CtString { + let mut result = "".as_ctstring(); + + for token in q.tokens() { + if result != "".as_ctstring() { + result = result.append_str(" "); + } + result = result.append_fmtstr(f"{token}"); + } + + result + } + + #[test] + fn concatenate_test() { + comptime { + let result = concatenate(quote {foo}, quote {bar}); + assert_eq(result, quote {foobar}); + + let result = double_spaced(quote {foo bar 3}).as_quoted_str!(); + assert_eq(result, "foo bar 3"); + } + } + // docs:end:concatenate-example + // This function is just to remove unused warnings fn remove_unused_warnings() { let _: Bar = Bar { x: 1, y: [2, 3] }; diff --git a/noir/noir-repo/noir_stdlib/src/schnorr.nr b/noir/noir-repo/noir_stdlib/src/schnorr.nr deleted file mode 100644 index d9d494e3093..00000000000 --- a/noir/noir-repo/noir_stdlib/src/schnorr.nr +++ /dev/null @@ -1,95 +0,0 @@ -use crate::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar}; - -// docs:start:schnorr_verify -pub fn verify_signature( - public_key: EmbeddedCurvePoint, - signature: [u8; 64], - message: [u8; N], -) -> bool -// docs:end:schnorr_verify -{ - //scalar lo/hi from bytes - let sig_s = EmbeddedCurveScalar::from_bytes(signature, 0); - let sig_e = EmbeddedCurveScalar::from_bytes(signature, 32); - // pub_key is on Grumpkin curve - let mut is_ok = (public_key.y * public_key.y == public_key.x * public_key.x * public_key.x - 17) - & (!public_key.is_infinite); - - if ((sig_s.lo != 0) | (sig_s.hi != 0)) & ((sig_e.lo != 0) | (sig_e.hi != 0)) { - let (r_is_infinite, result) = - calculate_signature_challenge(public_key, sig_s, sig_e, message); - - is_ok &= !r_is_infinite; - for i in 0..32 { - is_ok &= result[i] == signature[32 + i]; - } - } else { - is_ok = false; - } - is_ok -} - -pub fn assert_valid_signature( - public_key: EmbeddedCurvePoint, - signature: [u8; 64], - message: [u8; N], -) { - //scalar lo/hi from bytes - let sig_s = EmbeddedCurveScalar::from_bytes(signature, 0); - let sig_e = EmbeddedCurveScalar::from_bytes(signature, 32); - - // assert pub_key is on Grumpkin curve - assert(public_key.y * public_key.y == public_key.x * public_key.x * public_key.x - 17); - assert(public_key.is_infinite == false); - // assert signature is not null - assert((sig_s.lo != 0) | (sig_s.hi != 0)); - assert((sig_e.lo != 0) | (sig_e.hi != 0)); - - let (r_is_infinite, result) = calculate_signature_challenge(public_key, sig_s, sig_e, message); - - assert(!r_is_infinite); - for i in 0..32 { - assert(result[i] == signature[32 + i]); - } -} - -fn calculate_signature_challenge( - public_key: EmbeddedCurvePoint, - sig_s: EmbeddedCurveScalar, - sig_e: EmbeddedCurveScalar, - message: [u8; N], -) -> (bool, [u8; 32]) { - let g1 = EmbeddedCurvePoint { - x: 1, - y: 17631683881184975370165255887551781615748388533673675138860, - is_infinite: false, - }; - let r = crate::embedded_curve_ops::multi_scalar_mul([g1, public_key], [sig_s, sig_e]); - // compare the _hashes_ rather than field elements modulo r - let pedersen_hash = crate::hash::pedersen_hash([r.x, public_key.x, public_key.y]); - let pde: [u8; 32] = pedersen_hash.to_be_bytes(); - - let mut hash_input = [0; N + 32]; - for i in 0..32 { - hash_input[i] = pde[i]; - } - for i in 0..N { - hash_input[32 + i] = message[i]; - } - - let result = crate::hash::blake2s(hash_input); - (r.is_infinite, result) -} - -#[test] -fn test_zero_signature() { - let public_key: EmbeddedCurvePoint = EmbeddedCurvePoint { - x: 1, - y: 17631683881184975370165255887551781615748388533673675138860, - is_infinite: false, - }; - let signature: [u8; 64] = [0; 64]; - let message: [u8; _] = [2; 64]; // every message - let verified = verify_signature(public_key, signature, message); - assert(!verified); -} diff --git a/noir/noir-repo/scripts/check-critical-libraries.sh b/noir/noir-repo/scripts/check-critical-libraries.sh index b492cf1d4bc..f8e474d23de 100755 --- a/noir/noir-repo/scripts/check-critical-libraries.sh +++ b/noir/noir-repo/scripts/check-critical-libraries.sh @@ -31,7 +31,7 @@ for REPO in ${REPOS_TO_CHECK[@]}; do TAG=$(getLatestReleaseTagForRepo $REPO) git clone $REPO -c advice.detachedHead=false --depth 1 --branch $TAG $TMP_DIR - nargo test --program-dir $TMP_DIR + nargo test -q --program-dir $TMP_DIR rm -rf $TMP_DIR done diff --git a/noir/noir-repo/scripts/install_bb.sh b/noir/noir-repo/scripts/install_bb.sh index db98f17c503..3d1dc038ab8 100755 --- a/noir/noir-repo/scripts/install_bb.sh +++ b/noir/noir-repo/scripts/install_bb.sh @@ -1,6 +1,6 @@ #!/bin/bash -VERSION="0.63.0" +VERSION="0.66.0" BBUP_PATH=~/.bb/bbup diff --git a/noir/noir-repo/test_programs/compilation_report.sh b/noir/noir-repo/test_programs/compilation_report.sh new file mode 100755 index 00000000000..d050e7c9c34 --- /dev/null +++ b/noir/noir-repo/test_programs/compilation_report.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +set -e + +current_dir=$(pwd) +base_path="$current_dir/execution_success" + +# Tests to be profiled for compilation report +tests_to_profile=("sha256_regression" "regression_4709" "ram_blowup_regression") + +echo "{\"compilation_reports\": [ " > $current_dir/compilation_report.json + +# If there is an argument that means we want to generate a report for only the current directory +if [ "$#" -ne 0 ]; then + base_path="$current_dir" + tests_to_profile=(".") +fi + +ITER="1" +NUM_ARTIFACTS=${#tests_to_profile[@]} + +for dir in ${tests_to_profile[@]}; do + if [[ " ${excluded_dirs[@]} " =~ " ${dir} " ]]; then + continue + fi + + if [[ ${CI-false} = "true" ]] && [[ " ${ci_excluded_dirs[@]} " =~ " ${dir} " ]]; then + continue + fi + + cd $base_path/$dir + + # The default package to run is the supplied list hardcoded at the top of the script + PACKAGE_NAME=$dir + # Otherwise default to the current directory as the package we want to run + if [ "$#" -ne 0 ]; then + PACKAGE_NAME=$(basename $current_dir) + fi + + COMPILE_TIME=$((time nargo compile --force --silence-warnings) 2>&1 | grep real | grep -oE '[0-9]+m[0-9]+.[0-9]+s') + echo -e " {\n \"artifact_name\":\"$PACKAGE_NAME\",\n \"time\":\"$COMPILE_TIME\"" >> $current_dir/compilation_report.json + + if (($ITER == $NUM_ARTIFACTS)); then + echo "}" >> $current_dir/compilation_report.json + else + echo "}, " >> $current_dir/compilation_report.json + fi + + ITER=$(( $ITER + 1 )) +done + +echo "]}" >> $current_dir/compilation_report.json diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/Nargo.toml b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/Nargo.toml new file mode 100644 index 00000000000..4471bed86dc --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "attribute_order" +type = "bin" +authors = [""] +compiler_version = ">=0.36.0" + +[dependencies] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a.nr new file mode 100644 index 00000000000..663643f1288 --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a.nr @@ -0,0 +1,13 @@ +// This is run fifth, after each child module finishes even though +// the function comes before the module declarations in the source. +#[crate::assert_run_order_function(4)] +pub fn foo() {} + +mod a_child1; +mod a_child2; + +#[crate::assert_run_order_struct(5)] +pub struct Bar {} + +#[crate::assert_run_order_trait(6)] +pub trait Foo {} diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a/a_child1.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a/a_child1.nr new file mode 100644 index 00000000000..834bbd43fb5 --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a/a_child1.nr @@ -0,0 +1,5 @@ +#[crate::assert_run_order_function(0)] +pub fn foo() {} + +#[crate::assert_run_order_struct(1)] +pub struct Foo {} diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a/a_child2.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a/a_child2.nr new file mode 100644 index 00000000000..3548f4450a5 --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/a/a_child2.nr @@ -0,0 +1,5 @@ +#[crate::assert_run_order_trait(2)] +pub trait Foo {} + +#[crate::assert_run_order_function(3)] +pub fn foo() {} diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/b_child1.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/b_child1.nr new file mode 100644 index 00000000000..a8e7e898ec1 --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/b_child1.nr @@ -0,0 +1,4 @@ +#[crate::assert_run_order_function(8)] +pub fn foo() {} + +#![crate::assert_run_order_module(9)] diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/b_child2.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/b_child2.nr new file mode 100644 index 00000000000..8e6d967707a --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/b_child2.nr @@ -0,0 +1,2 @@ +#[crate::assert_run_order_function(7)] +pub fn foo() {} diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/mod.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/mod.nr new file mode 100644 index 00000000000..77df04e15a9 --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/b/mod.nr @@ -0,0 +1,25 @@ +// Declare these in reverse order to ensure the declaration +// order here is respected +mod b_child2; + +#[crate::assert_run_order_module(12)] +mod b_child1; + +#[crate::assert_run_order_function(13)] +pub fn foo() {} + +#![crate::assert_run_order_module(14)] + +// Test inline submodules as well +#[crate::assert_run_order_module(15)] +mod b_child3 { + #![crate::assert_run_order_module(10)] + + #[crate::assert_run_order_function(11)] + pub fn foo() {} +} + +#[crate::assert_run_order_function(16)] +pub fn bar() {} + +#![crate::assert_run_order_module(17)] diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/main.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/main.nr new file mode 100644 index 00000000000..9d5ba32b58e --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_order/src/main.nr @@ -0,0 +1,29 @@ +mod a; +mod b; + +#[assert_run_order_function(18)] +fn main() { + assert_eq(attributes_run, 19); +} + +comptime mut global attributes_run: Field = 0; + +pub comptime fn assert_run_order_function(_f: FunctionDefinition, order: Field) { + assert_eq(order, attributes_run); + attributes_run += 1; +} + +pub comptime fn assert_run_order_struct(_s: StructDefinition, order: Field) { + assert_eq(order, attributes_run); + attributes_run += 1; +} + +pub comptime fn assert_run_order_trait(_t: TraitDefinition, order: Field) { + assert_eq(order, attributes_run); + attributes_run += 1; +} + +pub comptime fn assert_run_order_module(_m: Module, order: Field) { + assert_eq(order, attributes_run); + attributes_run += 1; +} diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_sees_result_of_previous_attribute/Nargo.toml b/noir/noir-repo/test_programs/compile_success_empty/attribute_sees_result_of_previous_attribute/Nargo.toml new file mode 100644 index 00000000000..ad71067a58f --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_sees_result_of_previous_attribute/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "attribute_sees_results_of_previous_attribute" +type = "bin" +authors = [""] +compiler_version = ">=0.34.0" + +[dependencies] diff --git a/noir/noir-repo/test_programs/compile_success_empty/attribute_sees_result_of_previous_attribute/src/main.nr b/noir/noir-repo/test_programs/compile_success_empty/attribute_sees_result_of_previous_attribute/src/main.nr new file mode 100644 index 00000000000..561c3e12e0c --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_empty/attribute_sees_result_of_previous_attribute/src/main.nr @@ -0,0 +1,11 @@ +#[derive(Eq)] +pub struct Foo {} + +#[check_eq_derived_for_foo] +fn main() {} + +comptime fn check_eq_derived_for_foo(_f: FunctionDefinition) { + let foo = quote {Foo}.as_type(); + let eq = quote {Eq}.as_trait_constraint(); + assert(foo.implements(eq)); +} diff --git a/noir/noir-repo/test_programs/compile_success_empty/derive_impl/src/main.nr b/noir/noir-repo/test_programs/compile_success_empty/derive_impl/src/main.nr index db3f78a35c6..4396169235d 100644 --- a/noir/noir-repo/test_programs/compile_success_empty/derive_impl/src/main.nr +++ b/noir/noir-repo/test_programs/compile_success_empty/derive_impl/src/main.nr @@ -20,15 +20,17 @@ comptime fn derive_default(typ: StructDefinition) -> Quoted { } } +// Bar needs to be defined before Foo so that its impls are defined before +// Foo's are. +#[derive_default] +struct Bar {} + #[derive_default] struct Foo { x: Field, y: Bar, } -#[derive_default] -struct Bar {} - comptime fn make_field_exprs(fields: [(Quoted, Type)]) -> [Quoted] { let mut result = &[]; for my_field in fields { diff --git a/noir/noir-repo/test_programs/compile_success_empty/schnorr_simplification/src/main.nr b/noir/noir-repo/test_programs/compile_success_empty/schnorr_simplification/src/main.nr deleted file mode 100644 index 53b71fc3842..00000000000 --- a/noir/noir-repo/test_programs/compile_success_empty/schnorr_simplification/src/main.nr +++ /dev/null @@ -1,21 +0,0 @@ -use std::embedded_curve_ops::EmbeddedCurvePoint; - -// Note: If main has any unsized types, then the verifier will never be able -// to figure out the circuit instance -fn main() { - let message = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - let pub_key = EmbeddedCurvePoint { - x: 0x04b260954662e97f00cab9adb773a259097f7a274b83b113532bce27fa3fb96a, - y: 0x2fd51571db6c08666b0edfbfbc57d432068bccd0110a39b166ab243da0037197, - is_infinite: false, - }; - let signature = [ - 1, 13, 119, 112, 212, 39, 233, 41, 84, 235, 255, 93, 245, 172, 186, 83, 157, 253, 76, 77, - 33, 128, 178, 15, 214, 67, 105, 107, 177, 234, 77, 48, 27, 237, 155, 84, 39, 84, 247, 27, - 22, 8, 176, 230, 24, 115, 145, 220, 254, 122, 135, 179, 171, 4, 214, 202, 64, 199, 19, 84, - 239, 138, 124, 12, - ]; - - let valid_signature = std::schnorr::verify_signature(pub_key, signature, message); - assert(valid_signature); -} diff --git a/noir/noir-repo/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml b/noir/noir-repo/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml new file mode 100644 index 00000000000..48ab5a0390b --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "underconstrained_value_detector_5425" +type = "bin" +authors = [""] +compiler_version = ">=0.36.0" + +[dependencies] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr b/noir/noir-repo/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr new file mode 100644 index 00000000000..1d9269eebd5 --- /dev/null +++ b/noir/noir-repo/test_programs/compile_success_with_bug/underconstrained_value_detector_5425/src/main.nr @@ -0,0 +1,48 @@ +unconstrained fn maximum_price(options: [u32; 3]) -> u32 { + let mut maximum_option = 0; + for option in options { + if (option > maximum_option) { + maximum_option = option; + } + } + maximum_option +} + +fn main(sandwiches: pub [u32; 3], drinks: pub [u32; 3], snacks: pub [u32; 3], best_value: u32) { + unsafe { + let meal_deal_cost: u32 = 390; + let most_expensive_sandwich = maximum_price(sandwiches); + let mut sandwich_exists = false; + for sandwich_price in sandwiches { + assert(sandwich_price <= most_expensive_sandwich); + sandwich_exists |= sandwich_price == most_expensive_sandwich; + } + + // maximum_price(sandwiches) is properly constrained with this assert, + // linking the result to the arguments + assert(sandwich_exists); + + let most_expensive_drink = maximum_price(drinks); + let mut drink_exists = false; + for drink_price in drinks { + assert(drink_price <= most_expensive_drink); + drink_exists |= drink_price == most_expensive_drink; + } + + // maximum_price(drinks) is properly constrained with this assert, + // linking the result to the arguments + assert(drink_exists); + + let most_expensive_snack = maximum_price(snacks); + // maximum_price(snacks)'s result isn't constrained against `snacks` + // in any way, triggering the missing Brillig constraint check + + assert( + best_value + == ( + most_expensive_sandwich + most_expensive_drink + most_expensive_snack + - meal_deal_cost + ), + ); + } +} diff --git a/noir/noir-repo/test_programs/execution_success/derive/src/main.nr b/noir/noir-repo/test_programs/execution_success/derive/src/main.nr index 6900aa6aead..f7d4f6b607a 100644 --- a/noir/noir-repo/test_programs/execution_success/derive/src/main.nr +++ b/noir/noir-repo/test_programs/execution_success/derive/src/main.nr @@ -25,6 +25,14 @@ comptime fn derive_do_nothing(s: StructDefinition) -> Quoted { // Test stdlib derive fns & multiple traits // - We can derive Ord and Hash even though std::cmp::Ordering and std::hash::Hasher aren't imported +// - We need to define MyOtherOtherStruct first since MyOtherStruct references it as a field and +// attributes are run in reading order. If it were defined afterward, the derived Eq impl for MyOtherStruct +// would error that MyOtherOtherStruct doesn't (yet) implement Eq. +#[derive(Eq, Default, Hash, Ord)] +struct MyOtherOtherStruct { + x: T, +} + #[derive(Eq, Default, Hash, Ord)] struct MyOtherStruct { field1: A, @@ -32,11 +40,6 @@ struct MyOtherStruct { field3: MyOtherOtherStruct, } -#[derive(Eq, Default, Hash, Ord)] -struct MyOtherOtherStruct { - x: T, -} - #[derive(Eq, Default, Hash, Ord)] struct EmptyStruct {} diff --git a/noir/noir-repo/test_programs/execution_success/diamond_deps_0/Prover.toml b/noir/noir-repo/test_programs/execution_success/diamond_deps_0/Prover.toml index a713241e7dd..2bad103177c 100644 --- a/noir/noir-repo/test_programs/execution_success/diamond_deps_0/Prover.toml +++ b/noir/noir-repo/test_programs/execution_success/diamond_deps_0/Prover.toml @@ -1,3 +1,3 @@ x = 1 y = 1 -return = 5 \ No newline at end of file +return = 7 diff --git a/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/Prover.toml b/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/Prover.toml index f8e7ba41a18..8804a5e1ebf 100644 --- a/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/Prover.toml +++ b/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/Prover.toml @@ -1,5 +1,5 @@ key_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" -proof = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000005a9bae947e1e91af9e4033d8d6aa6ed632", "0x000000000000000000000000000000000025e485e013446d4ac7981c88ba6ecc", "0x000000000000000000000000000000ff1e0496e30ab24a63b32b2d1120b76e62", "0x00000000000000000000000000000000001afe0a8a685d7cd85d1010e55d9d7c", "0x000000000000000000000000000000b0804efd6573805f991458295f510a2004", "0x00000000000000000000000000000000000c81a178016e2fe18605022d5a8b0e", "0x000000000000000000000000000000eba51e76eb1cfff60a53a0092a3c3dea47", "0x000000000000000000000000000000000022e7466247b533282f5936ac4e6c15", "0x00000000000000000000000000000071b1d76edf770edff98f00ff4deec264cd", "0x00000000000000000000000000000000001e48128e68794d8861fcbb2986a383", "0x000000000000000000000000000000d3a2af4915ae6d86b097adc377fafda2d4", "0x000000000000000000000000000000000006359de9ca452dab3a4f1f8d9c9d98", "0x0000000000000000000000000000006cf7dd96d7636fda5953191b1ad776d491", "0x00000000000000000000000000000000001633d881a08d136e834cb13a28fcc6", "0x00000000000000000000000000000001254956cff6908b069fca0e6cf1c47eb1", "0x000000000000000000000000000000000006f4d4dd3890e997e75e75886bf8f7", "0x0000000000000000000000000000006cf7dd96d7636fda5953191b1ad776d491", "0x00000000000000000000000000000000001633d881a08d136e834cb13a28fcc6", "0x00000000000000000000000000000001254956cff6908b069fca0e6cf1c47eb1", "0x000000000000000000000000000000000006f4d4dd3890e997e75e75886bf8f7", "0x000000000000000000000000000000f968b227a358a305607f3efc933823d288", "0x00000000000000000000000000000000000eaf8adb390375a76d95e918b65e08", "0x000000000000000000000000000000bb34b4b447aae56f5e24f81c3acd6d547f", "0x00000000000000000000000000000000002175d012746260ebcfe339a91a81e1", "0x00000000000000000000000000000052eebbd1f6f7554e837f60c44000ed14b6", "0x00000000000000000000000000000000001c1c045a3ec94b8801f2272cc0b3f4", "0x0000000000000000000000000000004d2ef74134578f6b431a9df071ffca4292", "0x0000000000000000000000000000000000291326ade7aa6f0dfc8900eab5580b", "0x0000000000000000000000000000002433eec6418a6dba820c9527e2581fc8bc", "0x00000000000000000000000000000000000e88b7daad19af2ac2f9bdf9e50ee2", "0x000000000000000000000000000000dcfce2c427155cc3e4d035735d3dd5ece8", "0x00000000000000000000000000000000002d7d473cac1a15d0fee8b22c1a7b3e", "0x1a4249b90be4602c8ff40c7c276160ee41b2a0f8a238ce7706e9face2db03d48", "0x162204b9d54d3ffd285c393a5a1ff76ee681474fd780a21a3cf7fac5c24fc2b9", "0x30279eb953d8ee79b2155c69c04e6443c5de6bf7e02886256dd7b3cd3c9502a4", "0x0d32c1bd21baf43e72d5d82d461ef54833807ff81a877adc822f27a6db88d754", "0x0fe15e055c0803d5ebe6dd77689b70cfd82138f008810ce24535c992daaff27d", "0x1fba82c012671212ce2fc13fd09bf8fba4f7d5875ab8d37495d1ccfcff287331", "0x090738a5842fa4d2699b3726aa0dd97cb59569b4be2c6825335ec4969f859dc2", "0x0c6cb72dabbc28abcf4a50c203534e066c29f48c24ca64d672092f263df3f9d7", "0x0f27fbea0d9145f815c288b50fe7e8c10b8185d325b5264624fd57102855d05d", "0x2a815cd3fd1c43c72ee0130465250ff771d1e7be2347e4ada331b83265a03450", "0x148b4ecf2ad7ed17409417086867ee27bc1b0906dbc9cbb3714c285071e2db70", "0x08e700a42b1d6d36ee65f8ebedf47d3a44463ff9fa579dce13b7492e20142c3a", "0x2e23c69521d572ff2152c50f8c9a9191535f4cf37f95f1e0428692e78842b642", "0x14519e0354365923fb41400c19866135b45e975d56a0980260bc99f0390b1d5f", "0x04caded1f05738f736cb5bcf08d785e395e58eb7738523a20638aa16bc51593e", "0x28787eaccd38383215ea21ec02895c32d979f68ca155f534a2e2d377bff6698b", "0x20a1b81fa96c58cf11c5762c5ceb731efdcb081fca2d34d5c463d2cf40e6da18", "0x11789a06fe3bf53833741d180f068d29534d5bb58a5c64b8119542e62b189fb4", "0x23d00fcd032ace719ffcbc513bfa177a55b04377d76455c2788d999d05d011e2", "0x01f0e81b57b4a73cc118e51ede18f8724debf25c2d109db6ef45280f99f1a3fa", "0x156d1c9b61749810de728f259c2c1c1fd4dbff97101426e26087ca461c93307c", "0x1c5d619ac3a478cfd06d5eebfd879960bb321236be173813f5e78d1366d32c69", "0x250cfae4e1dfc551406f1f3d10b649a637dcb7bcb0f6f697994cf96afd35d0c1", "0x242b999f58cf5f53c874d1092bd38725aa9ea076f5bc8f176efa9ea23393874b", "0x2e15748255c4a5e0e9fe38047341b692a967257de27a85a3a38681bc9f1602ea", "0x01ef83886ea7017253699cb6371988eb8e21b4f7023d7479ece4907fe6d4a6fd", "0x08db2dbc271e375b9312f695c59c48f313235b3432cad50921c8d9ad6dd7ad7a", "0x199309f2c2cd45c15a4abb0e6554a1615ff5a6e9488a8d900bbf835fc8f664ef", "0x074be7a3d88e31ab1b59c9208c012bcfb1f85f351c709e68134996891db52b57", "0x301b1011354d2ebf46134fc4d6d734bb6ed8542d719f38f5e09a376a580cad7f", "0x12968f3eccaa27e44f14d5aaac6ecb70c00d040e07536292e685d7cab03fc563", "0x2110a023c8c22fd2ed70270a2d0a265b92a32ce2217ffe1be9a5d7d5c25f512f", "0x1e8cf4c60c53900f0430d5b44de5804fe8b38299bc803beeb4216e1a289cf624", "0x12301cb908ccb28a2616e29b831ec7105b5d3ebf45ff5fe91d50a9dd53a50b52", "0x0f1029ed107d84ff2d6d4a416cbd01da3f3d7bf5b2209ce93ba424f4b85616fc", "0x1b431d016611b8abd684afd9e92331c3325967b1116bfa91d4f44e2f8e2c9fc2", "0x281e335a0fd117064c8ace3f01e02b134a19e9b9220571ebfaaaa0e3a12d34db", "0x22559c106f77e2ae95677d5e38e288343e3b7168371aec7d3aaab9ef8150af70", "0x13f113b1d9b590149cf08c3f6e90589cda5c7b98528866b891256cb9d5d814e7", "0x10252ef388e4c80246962e98b9e976fab2cd25e1e6f1e3fd2a7d4786c5218a97", "0x16b890723dfdebd9912a9207255f95cb800222165b6fae97ec46e461f23e83f3", "0x25caf77c7d2e8e069341ec90f3c8f6d64319cfd2d77cab0625cf0377285ba11c", "0x016c84288b0bc3c50eebbe250cdd5a4ee50b2c65a24ac64d0c930cbdecb95141", "0x20a537c045b069d47dc6315f45b391f60681222381e5059ec7c8b17bf677d911", "0x2594c0edfcd4064d215a3d797bc8e3b2f401c61f3961ae96ccbec8f8fd29e81f", "0x1c831d7047483ca00ed59bdb84c47ffb8bbebbae92aa164c7b35fcffbb8a35d3", "0x2ea7f60de52b8cd6b0bd06f861fc1f2c5ed1d1fbfa53caccdb836400a03df434", "0x275c6c8bd115f7d2ce196439e2330fad305c6745bab0bf1ce3f2fa32dadc3c43", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x2b3f4e210619347288731e7f0eea1ae60dd8696fe87319044864d099a03a9536", "0x0fecd3d2aebedeb8be2b0b7e3a74de9ec8bd2cb72851541463729e0715aef48b", "0x10bee385ad0c2cd3ff88ef4d630840749e4367f9add4a300fc4f545a7778e92c", "0x1fe792730eeafbd22c4eb80e86e2b40108b1e55b2a08db786289eea5745b9e3b", "0x04d411679da432816b213cd5580dda1fd6c2f258684c036be19b5b26baca583c", "0x159f17b655d2b8a803e0cfb564918628be52d3baa950ca1b127854491624f8f4", "0x225340463867d9252a1269013536e2e1dd219aa18eadef13c324b63d44679334", "0x1885e231554e02abb40ed54b72ebf09b883d0298a6bc06fc645a30365f370ef2", "0x233344517f25170972b8ba35d01f2df2e073d322993abce7df26796126e93498", "0x08990e8faa13b18b4433ec417c5cc596885e11ffd372d5f612c08cc79a5d5c80", "0x1e960a0c892b755c28e21dcbed816c1b182d7da43bae07f8ee622bd4485f79e7", "0x27b58e2ee290a179d349ace82752528b2ff946d60c092b99ef42f53c25d0c99f", "0x2a5cf8a3193107d982edd253002c7a52ab876b445dde8307ab78fbdca022d93c", "0x2b1ab4d5277f8c82750c1c7bd043889b71465ec64a9afc1bfa37d06b1ebd0725", "0x2a0dbf5c4373a58a83d5f2a031ea0615bf12800e33b70c3191a7cbb15966ced8", "0x1f272bb4a19d14a0abdfebc9fc83125e10623b9aef730f8d25f2bf5bead38ea9", "0x2c2339cf0ae7aff56091a568c1e2c3f01f52d8ed13400737fd31eaabcaffb9bd", "0x21f5fefe6b5fa0b5da71089befb74a1a39e52b4f830cb330c3c284e154614dfd", "0x1e6f6ba4b2444586b380dc4e2b3fad111ff1f4754420a846f53ea0789ebfb0ad", "0x1193d170b0b2dd0c4a04331a4b4aa3f12920f182ec3ab547837e30f1116ca584", "0x00000000000000000000000000000025704a15c9e2ce8a69558e7bbcdcbc7784", "0x2e5d36112770fb6c985681cafe40a8c99ad13f702309e7969801dd0ed080e727", "0x0eefc2585f591bb457183134e19ad643966272234d645514bf7868d6dd8ae2cb", "0x300803e4e2339ad39b9c31f228949bbeaf9c74b7101e7be1930b088126247eaa", "0x2bb562a50ed944b438b83b01f200101a34faef7f296a75c84c731755ebddbc1a", "0x1288e0b9c742af39cbcac21357c1b29511b0bbdd3d0e3cf5e14b2eef68a28ab3", "0x20f089131cc96d86ff1cfb67fa3f51670f4bad30158751b2587354bbec76cdf9", "0x1a26c6d3e633f9bf8434cf755b5f1217dad0d455071a97a7bcf85b824f5cf07a", "0x0d7e9b8a51fccf910ec25bdbd13e70b34bd6ea6f4d629fa744f9cdf5f2beb1cf", "0x0b40f28ce428e64df9cf5a024133fc420f39decf5f6af020cc3211ab298d4631", "0x0ca4f189dde7a55fe829f46681232904f6670249a22e0deb47222bd309523a8a", "0x2c544f2e31143783977645edb2a6bdb39b875053963bfa1a5b3ae9de204a7ebe", "0x00aae4454eb48fb18ff60db6b9d015abea2e770a2f7d86d121522b834c791ba5", "0x07d74e351fd4cccf4e18475d25211efa8a359066fc693a5c8505ddb507e4b74b", "0x07d74e351fd4cccf4e18475d25211efa8a359066fc693a5c8505ddb507e4b74b", "0x2d9e5bff47207d82533e2445959941181cc890c5779bc7f24d6e8a7b9e425b5c", "0x0aea3c0c317c441a5775a9849108d7a6889b39128235f717b09b184aa08e4eb7", "0x1ca5bc6fb37c55a562f4991901c39902f42d14db71284116df74cb4e7d55e493", "0x220fed26d64cd69f40e6d145a423e4a3c8cd0dce747e7d51647441270ad4d774", "0x15be574c9358889257aa2a30ff7b5fcc31a57da7032296e2c1201c49a44bbdb6", "0x2de539925525bedd3b7f43a9c6bf0f713151a17f79ac7ff4a9cd27b15ffe892a", "0x083086693dbf465211741e2cbff70ff38eb08383faf22d397eb2742c8ad7396a", "0x1fdfa258a890598816e807c50058d7a1462edd5ff196a2eae0f862e454b49aa1", "0x10c434c6daaa8226fa8e3e302123dfdc4455cf68063df518949df5a65a945213", "0x0000000000000000000000000000006472a7874de2c454a4591ed7784df1c104", "0x000000000000000000000000000000000008c46ac53d2c4ad0c26a5d6c790082", "0x0000000000000000000000000000005e422f9cfb8725800de60dfe0a8d4104c0", "0x000000000000000000000000000000000000f10fd4e4de81a0c00073ec91c274", "0x000000000000000000000000000000b20813090eca76bc6aa4a699b1ec8d5d6d", "0x0000000000000000000000000000000000292cc9f8a744eb00e0903c29ce87a7", "0x000000000000000000000000000000350a368b415fbb99fa90a26a42b1a3affd", "0x0000000000000000000000000000000000280eb9275cb05a3435f464d1dc369d", "0x000000000000000000000000000000280df6505e20c7725fe6d29439f96ee05d", "0x000000000000000000000000000000000017ef5033a08535451e2747827aa94b", "0x0000000000000000000000000000002f9ba89ae91b4e4a4ff8ccbd0526faad2f", "0x00000000000000000000000000000000001c2013561dafcc02cb03220bdf23c4", "0x000000000000000000000000000000aac102c400f9e5da0321ded4510994434b", "0x00000000000000000000000000000000001ec8ab9cc834b492fde124962f04a1", "0x0000000000000000000000000000000673dbd698da8b8cce450d2a083aba9987", "0x00000000000000000000000000000000000a49e55bb040249cb41c63cea901cd", "0x000000000000000000000000000000133d92af8d76ee0c74a12081ee7b2ef8c4", "0x0000000000000000000000000000000000240f552d1c6cbb007650e4b142e0a5", "0x000000000000000000000000000000e29c6e7d982ec08d51c79d6261c28d742d", "0x000000000000000000000000000000000021baeec04d9be419c923626034e7b3", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x1e940a528b42d8230e7d4dff76262a80986c0d00b2c02a9bc0559e36212d1547", "0x1ceccf21ac39f70d76ad6f7fe0dcb33b6af04555a0b1959e4714d65925e4e253", "0x096139d757046cdbdb7ee89a95f112f70882a43a46c2f739d9be115dda013420", "0x2f9c8ac67c7825b08eff0e7f7656a671f4c64e5601f2efab35b1b795801eec04", "0x2077e648e1704851cdffd7e6e56311634a7b741bab77ca34d9dff12a6a2bfe99", "0x115d48c4a97aeb3c447a060f9e0d675b0dc7f4a05a3f5776e2f279f3a165d7dc", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000fd38c45c3ec5b841482a80e3a56ce82555", "0x00000000000000000000000000000000000ad70b03f092f60af3e0ce1bb29d2c", "0x0000000000000000000000000000007a184d5342c90c634c0b1a050f0b97c9fb", "0x0000000000000000000000000000000000271f42abcb3bc1f0332e4b3ca85e1d", "0x0000000000000000000000000000008256322bbe2c1b8cd9d84e5ff6123477f2", "0x000000000000000000000000000000000025cab962761681dd9547f4c78814df", "0x0000000000000000000000000000008c4234510e5825c02b9ac427bcbf8e279a", "0x000000000000000000000000000000000013a14e0d7fc073c44643af38cc5396"] +proof = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000005a9bae947e1e91af9e4033d8d6aa6ed632", "0x000000000000000000000000000000000025e485e013446d4ac7981c88ba6ecc", "0x000000000000000000000000000000ff1e0496e30ab24a63b32b2d1120b76e62", "0x00000000000000000000000000000000001afe0a8a685d7cd85d1010e55d9d7c", "0x000000000000000000000000000000b0804efd6573805f991458295f510a2004", "0x00000000000000000000000000000000000c81a178016e2fe18605022d5a8b0e", "0x000000000000000000000000000000eba51e76eb1cfff60a53a0092a3c3dea47", "0x000000000000000000000000000000000022e7466247b533282f5936ac4e6c15", "0x00000000000000000000000000000071b1d76edf770edff98f00ff4deec264cd", "0x00000000000000000000000000000000001e48128e68794d8861fcbb2986a383", "0x000000000000000000000000000000d3a2af4915ae6d86b097adc377fafda2d4", "0x000000000000000000000000000000000006359de9ca452dab3a4f1f8d9c9d98", "0x0000000000000000000000000000004ae614a40d61d28f36aaf03d00a064355d", "0x000000000000000000000000000000000010edd34b6c69cb31a6a833a1d040d2", "0x000000000000000000000000000000f4976ee83b95241474007fdc30b06ebdd7", "0x000000000000000000000000000000000019cd0d7e4577008a8335c6260be826", "0x0000000000000000000000000000004ae614a40d61d28f36aaf03d00a064355d", "0x000000000000000000000000000000000010edd34b6c69cb31a6a833a1d040d2", "0x000000000000000000000000000000f4976ee83b95241474007fdc30b06ebdd7", "0x000000000000000000000000000000000019cd0d7e4577008a8335c6260be826", "0x000000000000000000000000000000f968b227a358a305607f3efc933823d288", "0x00000000000000000000000000000000000eaf8adb390375a76d95e918b65e08", "0x000000000000000000000000000000bb34b4b447aae56f5e24f81c3acd6d547f", "0x00000000000000000000000000000000002175d012746260ebcfe339a91a81e1", "0x0000000000000000000000000000007376c0278bcc77156c008b389f6bd12e8f", "0x0000000000000000000000000000000000176ebed74bf3b57ca42a2fac842809", "0x000000000000000000000000000000fc4a601439d45b9ce23c9d9cc37cb21dd2", "0x000000000000000000000000000000000017dc6f8c53261c44cd0348a9970d88", "0x000000000000000000000000000000292042e9c3c101d8dd41b3acfc0db429a2", "0x0000000000000000000000000000000000114f6b3755c65915e12f13533cdd41", "0x0000000000000000000000000000007bb311a6bd5f4f3d543ca30a1a0201614f", "0x00000000000000000000000000000000000871a5a04dda33543cf59b3babf733", "0x03ecb02e48ba68818287222348fc537135b6426d4580ea31cdd540250a7a95fb", "0x2c779e44987737a835c92393388504ebf27da5db3438865f760cb56ee5856a06", "0x0ac17380181974c0082ef0fada047fc7906a94dc18e5be249dd29e52961522e0", "0x206c623397f11ed76a292c7c605fe56c1ae4f6babb6889786aaff461535cf79e", "0x11dfbe6d0977046fd72b55bdb9b41f983fc06ea6404cb36efdf1786d6f0dcbf7", "0x1081a4f21029bfcf4f8388257bf88d932963b2368c4fde96836fb6f023f16622", "0x2e981de982d368f04b0a49e537a05ed5583080c3eafed9617bd06e1214641be9", "0x2571d21e04b1d59935490270a4789e53042f18e15fc7b94dfd267c8deadfc74e", "0x0f70f3f5319d3564bcc6fad428552eefce8f341ced5187fa186d0f099315f225", "0x18f7ee010c96f63d18d2a277e5f5a8ef19b525907817d69616d24495ad804021", "0x1cf7e347bae24a2c1a93b5fd11ff79e68bd2c1bd32056df6d2e1582d17db1d8d", "0x01c451a702451ea9871b7e19d3e2052d8fa49a571ae46616453f27d324cfc907", "0x0614dbf2404cb5fef2e5408f1115502954097981a5ea67d1f80812fa247b1f93", "0x09884374bb354fdb4b118f4da44cd37e75ba7a655201f94cc4064acbdc35887d", "0x158211f68576bcafd791ff02039bb8246b1ba94d99f30a0f282565dd8d82ce0b", "0x0a5231e4039c7b7e0ad77d319958403997a33a0be31e71032733cd70067b14db", "0x2803fc0a9f60d9e202eb6caddcacfbb94a5a7df2695c2a0c909815093ca1864c", "0x0faa80f3cef0e86746df7518f865936959d65eb64ccb05bfb574ac5561683eae", "0x298544d77ee6f4cae7aaa4e9203a233fa18dab360d6f54daf9f8801802586d58", "0x0ba76e9cadf0380b82a3b5ec1c71b80295ce3caeec73aefecffed90f28c1b012", "0x0d965885fc07c4a140f50a83cb750c876191651ee47462d0931e0e67bc9ab5cb", "0x0aad443f96fbde49595f31a47d233ca83ed2bcda86801a8fd7a596ea666c7716", "0x298ef11d346c061b8899cb10c0cd7150aa2d6c554340cf2ee6aa76125e7d1e7f", "0x27518b0512f1efb3a79650941d3adb015b357c92a8c06e086be7b3e7666cea47", "0x0cd6b10a38d5af7f0a5fa97c0ffcba406e8a65a92fe050b3b79f3f1f45d723e2", "0x2f5e1210a841f9c6a7ee7d7f290479696387a58192cb775a64adf0dc225e3d4f", "0x2ffd390be1aecefc25137d01e5b7a85410254ae9e21e7067a9869217cb828ee1", "0x244a77246b5beb3e0e38c8dda39a516050303e83c051300d08bbe5450320b47f", "0x16ed38ff1019df1d168974833ccc96d8648d05c2823021d45e1d5599998a8aec", "0x24cbbf8ca1a5bb082c1081d9252a5e964ff7aae4d83e04468db55960b80a585f", "0x01b3a78bcc6e7529c6ded587b8958d903ef990421d5706afbef64a7976a51084", "0x2c3a013cdecd027b32c8c99c163dd822df374ef018aac8f3d1fb8d57335f9503", "0x0ad83466928e5d70e1e0bb26633a1e0c61399733c15fffafb22df18029e583d6", "0x095023de752480ca3edd408d3c34d732bd9836919e84931d3f42a978867bc53e", "0x283d221f0a2e6b6616bc3eda23e15bb8c8b459010014db7608e646c70ea1da2e", "0x1390c81536ca3d71228eeccf9844702aa3df012bbc3902fe30323f55ee8c7872", "0x0ef66f0302753884f05043080104589e1bf036566a9a00d4688d3c7910631508", "0x15eceeed97d9267597c028fafac72dba40f3ea441880bdd2202b30846a243044", "0x2b38e3f3b5193811df1bafd58432d5abd1c5f575a5d9c2a449682a0f2f035034", "0x2bbcc40d11d6a96c85a63162143ec53314573bb0af7c32d89b791394c80d14a5", "0x22d909e8fb5152b5b98f7cb3fc38f4ef7d7e8f2a857347da59ba2e979bd2ec96", "0x29e3f7a95437fe6ea1e72cd4c7c2fcf1892ab22ba69387f1a6a795e91bcc26f2", "0x02d8c8d031ada707d85693ed106135cecb7fe52de73eedbc54a91a2c856d0de1", "0x28020fb768c50bf52497832c04fb0e14cdb651b98b80864d0b68228ddfd922a0", "0x24d61051f82ff93eb42b5afdcad9e236c669f9f849bf811a853f1e9cc302f8ce", "0x250e89de38769cf70e6cb3685f99e39f44d8ebc1a468930f49e1d80342092b6a", "0x0ad45df677495b9199c57f620db716c543fb6437d574453b7721c2faee6316ba", "0x043d8715e16e3f2dc5a537355c0576254a36db25002f13958696ed13c24add46", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0bb8cb6a256f110f134a15b66b644eb49dc8e0239f92489408e6265a323bb513", "0x18f02f61683cf6a7492291a7041ee1b3cfa8dfb5aa40e2f6571d13750f0f459a", "0x0a982c10c93ae173751f4165e6456c9b85e2551bd503919acae78c801ccc0e1e", "0x0b6e6266bdc6d44d05ae76d2db249877a46ad978fc758654a3a6a7208d2725a6", "0x20de00721f30db8280aa6804c90f3fbe23477e1f746a8eff61c4c5b2af7e821c", "0x1321548f766ded3432627a50704d233455c61d8e59afec2883dbe2f381c033f9", "0x00c56c902b14aa59f6f59badf20f59c51b08aeb6afbdd97a5ac7b98b998b0a56", "0x1745c01290e99476fa655e5fcf2e5b3d24f42624cbd25a40f60af3f3e8489512", "0x08e915bebf8f6c86b332a681d35c57dcd0e0804f22e4e78884ab5edc0a41d6d0", "0x0c77b29e3a0c4368ce5231f94d13fa9b84a6e350cc8f2a57b3f6920a2bf0e879", "0x07ab821c4f07e1dd1cce43b9d9dbf4c9da2e22fea675a57ecf5a47a6992059a2", "0x0bcf85d1f4e34e7598a68bc09cfacf119b0afa1193ad4163096e44ca8eef7a22", "0x0c8a367da01b9097d24eb7b5471c6bd049f7938080bb8cc6fb92945fa934faf9", "0x2cda5caa3a93dcc134cf176f4ad6c79577d273bd2706da3fcaad92a9bc336ac8", "0x2c19cbfce048ef9bb9efb5b9875645b0bc7825aa1a05ad71dbbd3a34d1d76501", "0x28d7f11c2b6b7ff8717b79b098e5bd37eb39a8ea5d03b15339c86fb93e497d97", "0x21ba86c3baacb0fe4270c64c1a5f2861af2f5aa1d6391afe8214e1ce9eac8dfa", "0x0c5289ff2fe581ccf0caa97b4041d381e384c4aef0417edd4dafa7f64a3bfa6f", "0x0c744b0b301542ec4f334696945d7b89b137c5b9434bec277dc938c3dc9ca7aa", "0x006d246e7b0ad18157fa925981f097121fe34cc769128fd8993c4d15cfdf0aee", "0x00000000000000000000000000000022a7ebdc5723cfdb5d73c4c0392e43c407", "0x160d495d0b4462662665faccb1d65d81f0c3f006254a6082a0ceffc49483d76a", "0x24a5a2b9bef1abc3a818d2f27ca5cca7e1b3da34ea6056f338ac54638e26c3b0", "0x0a3dcf45eb6c14391ed8aeab11cb9460f85cb11a1ecb868ad75095796c0f5dac", "0x160c8087a99bf109389ca20d0ce624f71dd2e40fe64d62712e45669ed550fd61", "0x1a65519621040c52fdec5594d095add265c99210929eeb29a3a8180b480bb313", "0x09bf095c40c00dce181347b0d8eaa83ecd0f1f8fcb5dab34ffe19e219672e681", "0x10f3444d7a623e54ad2e882c436191975143217e9f8121c8770a3bbd3ec183ce", "0x0cd68d59322f30bdaf0a6a628f095f880ff716b157ef9a2d589f2cfc40b53e3d", "0x20732eab49adfd109626e0e84496a929a690377e98ee03f13f66ad4541949300", "0x28c850b8bc7f6ae88835bed342eda477e8d1f013a4db34b7ff33198e0a9f8e09", "0x14d234765f29b713df4d1291d452c73a5dc00458242df1be96e04ffb0a3c396e", "0x162572b68ab59291f430cf3113d4fcd3ddca59c4808c134345f6765693f8e1ce", "0x0bc37cb2ffd0f1691bf4d8c621d49f8c23ff58989d09d96c019cc6fc9a46e155", "0x0bc37cb2ffd0f1691bf4d8c621d49f8c23ff58989d09d96c019cc6fc9a46e155", "0x2aa58bd9f811c2970dcefde8c31c2c6db2349eed5161f80c0280a3acbd9f4f0d", "0x141198df3b9c1917d2e7a136ca3438fd9630719591c24388a0559873756d288b", "0x1975864b97d6ff0ace3d600020772ea32181c2f3e413ae67bac22e4a3bbcba9c", "0x2023d432e6630619c99c25a2f293f5ed78f373ee5212bff02b92f00a43bab0e0", "0x23cbaa3113b7265b926bc8811fccce701b3d4e4006ae6b66cefffd0e2f059fd4", "0x00000000000000000000000000000061e09b904168dcad01e82d26f8a21bb884", "0x000000000000000000000000000000000027a29682b86d1b09daa382868b245a", "0x000000000000000000000000000000efc6d7071b6c8cf492bc3ba72f4eda84c5", "0x000000000000000000000000000000000010860d04901949ad63a94863c77149", "0x00000000000000000000000000000036cacf503222db1b5d0edd58aafc1e74f9", "0x00000000000000000000000000000000000fef16ca13117c1f45f6df0782c273", "0x000000000000000000000000000000013704a507a82f6224d7c369d3d6c3929e", "0x00000000000000000000000000000000002887168ff50b7339d4d181d2a84cc0", "0x000000000000000000000000000000e57f500eab5f7d08ac3c93ce080dc1f15e", "0x00000000000000000000000000000000000c720872540cd88fec315c3e6a7625", "0x0000000000000000000000000000004b6897120d1858d29ac10cba52cf73dc44", "0x000000000000000000000000000000000019a9523d9a2481b5dbb1c23cb9686e", "0x00000000000000000000000000000052442fa24d3d5c3b9a608d8259757905a4", "0x00000000000000000000000000000000001c58b3787ffa3edd9f049c1c775a85", "0x000000000000000000000000000000f5737a5b8d278973356217e75bdc986ea2", "0x00000000000000000000000000000000001e0959f30c996ac7e3b265bac2de9d", "0x00000000000000000000000000000030122ef6c7a097b6b2ea6efa763797b8b4", "0x0000000000000000000000000000000000191344dd8af6c1c1c3beef933de271", "0x0000000000000000000000000000002f38961e4eb47676a42a5b59457e19a7b1", "0x000000000000000000000000000000000002936d1fa64f399018fbf60a1f2001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0f349727b02c8c3916e6904450b4db7d748c746d693f12acfd44757e349ae543", "0x109b539e615d399af085519623a8f0ea43fd3e672e8b3397deb033110b896ba7", "0x1d2d7546c079198782bc8c1ecf377c86567d90d05988acd013af254a84ccfca2", "0x11922ebe299248b1a194ff41750bbad0297b8e4db3944036983764ba171195a1", "0x14cb035cb0d920e42127d67ed6763fd0cdadeac07c0aa57ab5c038a501aca88c", "0x2e82b6bc3d9337d1f2c080ed47e935308317c159408ff3a054718e737f827a49", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000c883c136e90256f3059fb812416fe61171", "0x00000000000000000000000000000000002cbe86e3f824a75195f942b5de0abe", "0x000000000000000000000000000000ff2335151394b16f671dcfdc5ee78485f3", "0x00000000000000000000000000000000000fceb210dd93cd99b7bb225af47ae8", "0x0000000000000000000000000000001a95675079e3f1508e636cf69b7978db7f", "0x0000000000000000000000000000000000079f7a59ed7b4a3dda951fa8fbad98", "0x000000000000000000000000000000b15ed33e983574376efe5ae0c29c6bdd1f", "0x000000000000000000000000000000000004031f5fd23cf82aad9e5d0bfd0363"] public_inputs = ["0x0000000000000000000000000000000000000000000000000000000000000003"] -verification_key = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000004", "0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x0000000000000000000000000000000000000000000000000000000000000007", "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000009", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000000c", "0x000000000000000000000000000000000000000000000000000000000000000d", "0x000000000000000000000000000000000000000000000000000000000000000e", "0x000000000000000000000000000000000000000000000000000000000000000f", "0x0000000000000000000000000000000000000000000000000000000000000010", "0x00000000000000000000000000000060e430ad1c23bfcf3514323aae3f206e84", "0x00000000000000000000000000000000001b5c3ff4c2458d8f481b1c068f27ae", "0x000000000000000000000000000000bb510ab2112def34980e4fc6998ad9dd16", "0x00000000000000000000000000000000000576e7c105b43e061e13cb877fefe1", "0x000000000000000000000000000000ced074785d11857b065d8199e6669a601c", "0x00000000000000000000000000000000000053b48a4098c1c0ae268f273952f7", "0x000000000000000000000000000000d1d4b26e941db8168cee8f6de548ae0fd8", "0x00000000000000000000000000000000001a9adf5a6dadc3d948bb61dfd63f4c", "0x0000000000000000000000000000009ce1faac6f8de6ebb18f1db17372c82ad5", "0x00000000000000000000000000000000002002681bb417184b2df070a16a3858", "0x000000000000000000000000000000161baa651a8092e0e84725594de5aba511", "0x00000000000000000000000000000000000be0064399c2a1efff9eb0cdcb2223", "0x0000000000000000000000000000008673be6fd1bdbe980a29d8c1ded54381e7", "0x000000000000000000000000000000000008a5158a7d9648cf1d234524c9fa0c", "0x0000000000000000000000000000002b4fce6e4b1c72062b296d49bca2aa4130", "0x00000000000000000000000000000000002e45a9eff4b6769e55fb710cded44f", "0x00000000000000000000000000000072b85bf733758b76bcf97333efb85a23e3", "0x000000000000000000000000000000000017da0ea508994fc82862715e4b5592", "0x00000000000000000000000000000094fa74695cf058dba8ff35aec95456c6c3", "0x0000000000000000000000000000000000211acddb851061c24b8f159e832bd1", "0x000000000000000000000000000000303b5e5c531384b9a792e11702ad3bcab0", "0x00000000000000000000000000000000000d336dff51a60b8833d5d7f6d4314c", "0x0000000000000000000000000000009f825dde88092070747180d581c342444a", "0x0000000000000000000000000000000000237fbd6511a03cca8cac01b555fe01", "0x0000000000000000000000000000007c313205159495df6d8de292079a4844ff", "0x000000000000000000000000000000000018facdfc468530dd45e8f7a1d38ce9", "0x0000000000000000000000000000000d1ce33446fc3dc4ab40ca38d92dac74e1", "0x00000000000000000000000000000000000852d8e3e0e8f4435af3e94222688b", "0x0000000000000000000000000000006c04ee19ec1dfec87ed47d6d04aa158de2", "0x000000000000000000000000000000000013240f97a584b45184c8ec31319b5f", "0x000000000000000000000000000000cefb5d240b07ceb4be26ea429b6dc9d9e0", "0x00000000000000000000000000000000002dad22022121d689f57fb38ca21349", "0x000000000000000000000000000000c9f189f2a91aeb664ce376d8b157ba98f8", "0x00000000000000000000000000000000002531a51ad54f124d58094b219818d2", "0x000000000000000000000000000000ef1e6db71809307f677677e62b4163f556", "0x0000000000000000000000000000000000272da4396fb2a7ee0638b9140e523d", "0x0000000000000000000000000000002e54c0244a7732c87bc4712a76dd8c83fb", "0x000000000000000000000000000000000007db77b3e04b7eba9643da57cbbe4d", "0x000000000000000000000000000000e0dfe1ddd7f74ae0d636c910c3e85830d8", "0x00000000000000000000000000000000000466fa9b57ec4664abd1505b490862", "0x0000000000000000000000000000009ee55ae8a32fe5384c79907067cc27192e", "0x00000000000000000000000000000000000799d0e465cec07ecb5238c854e830", "0x0000000000000000000000000000001d5910ad361e76e1c241247a823733c39f", "0x00000000000000000000000000000000002b03f2ccf7507564da2e6678bef8fe", "0x000000000000000000000000000000ee40d90bea71fba7a412dd61fcf34e8ceb", "0x0000000000000000000000000000000000140b0936c323fd2471155617b6af56", "0x0000000000000000000000000000002b90071823185c5ff8e440fd3d73b6fefc", "0x00000000000000000000000000000000002b6c10790a5f6631c87d652e059df4", "0x00000000000000000000000000000029a17181c7934fc3fdbd352eac5cb521b9", "0x00000000000000000000000000000000001f497cbf5284ff29a2d336e5991999", "0x000000000000000000000000000000072bd9c0c6beda1fdee6d4ff0432ba9e1b", "0x000000000000000000000000000000000013ea38a0bd2aa751a490a724fac818", "0x000000000000000000000000000000c599f63dcd3edd49f08ae5c3141c1e3493", "0x00000000000000000000000000000000002bdb36be0bea09950dd32a8ccf6fbc", "0x00000000000000000000000000000047f27f29724e7f19eba0340256a0bd4b7d", "0x00000000000000000000000000000000001c1c5ccf87a962129ca785f8f35120", "0x000000000000000000000000000000c5c71efdae00679bbe4a95096e012b1817", "0x000000000000000000000000000000000017a365de041e317817d0135f2b48e0", "0x0000000000000000000000000000008ae711ac402f7848d719c93a89ba8d39f1", "0x00000000000000000000000000000000002b6fb40ed8a1935226f4f9786a0499", "0x0000000000000000000000000000002f03a71501d83de1da5715a4e9462d6198", "0x00000000000000000000000000000000001644064443b8546f48eae693af47b8", "0x00000000000000000000000000000083763ab1b6e8fe269b2fe4c7b9c448c08d", "0x000000000000000000000000000000000021d7cc18c59676a8eeb47c0111c251", "0x000000000000000000000000000000b5f937153073e03ea7d51a996e0ebc2e6b", "0x000000000000000000000000000000000011ddd0e26457373eb06e0493177672", "0x000000000000000000000000000000c5f6eb9f6fc8fa99811a4a88c74a6d018b", "0x000000000000000000000000000000000025bcd07a0732c123567834f5109558", "0x000000000000000000000000000000aeb08a0b1a4442189448b4e97490568146", "0x000000000000000000000000000000000002a1744e4771705536a88f07e0f90f", "0x000000000000000000000000000000b938568293bd0724b0ea76c2ec34c4a829", "0x0000000000000000000000000000000000053296e8f3b9ad3af877dfa9c7c2a7", "0x000000000000000000000000000000f0ca1db6323996eba26bdc86dafef9d10b", "0x00000000000000000000000000000000001441a46c58af03d5645d52721d956a", "0x0000000000000000000000000000008bbf8f884013c66c28ba09c2fbd573b656", "0x0000000000000000000000000000000000206c391ca06fac27d1908e94570243", "0x0000000000000000000000000000002d4f5aaed88ba4f79612d53b804ca8f194", "0x00000000000000000000000000000000001674011c96392df08970fa6b7b4cb8", "0x0000000000000000000000000000009f88297c1729d76c4d9306853598c91325", "0x0000000000000000000000000000000000256f51adfcacc3c1e340be4d32d3e9", "0x0000000000000000000000000000000ab9955eec0d74eb799afed2a802b24d75", "0x00000000000000000000000000000000001fcbe43ea105b30d36ed0b21b03411", "0x000000000000000000000000000000d66b1d5433f1aa5305cd1edce7c22de466", "0x00000000000000000000000000000000002331546a256b8a3b751956806680d4", "0x000000000000000000000000000000e97954ad6cd6f45fb15c91434121db4304", "0x00000000000000000000000000000000002e20a97e09d50f227ced47e7a98250", "0x0000000000000000000000000000001ebbc27eb9ebededefba79522eb58ae89b", "0x0000000000000000000000000000000000090efa4974e566e81d1177b85a30be", "0x0000000000000000000000000000005eafa070b9c9632404052642e3bc14f9fd", "0x00000000000000000000000000000000001489068864102daca6a6b8bc4d448b", "0x0000000000000000000000000000009ebc91aaaac036a6477cadbe54e8556dfd", "0x00000000000000000000000000000000000ef6d835e2ed3343b95c82c8c54037", "0x00000000000000000000000000000033b28b529dff46e93af4e7422530478e4a", "0x000000000000000000000000000000000020a86c2f8591bf190bcddcc03c42fb", "0x000000000000000000000000000000a9679d0acc088f7dc27bf6d866bcd2dda2", "0x00000000000000000000000000000000002fb9d0d2d4099402bed74f738f64cc", "0x00000000000000000000000000000023b09f876a29a061582848a8b9a5870c12", "0x00000000000000000000000000000000001d5bb906f03f0d49e9c4791bc43af9", "0x00000000000000000000000000000017aac9854ea240d8ec97bf760c4d4ba870", "0x00000000000000000000000000000000000b227a556c414ada0dc75bb303e30e", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000009b624fa65d1a24b7f14a8f25f3789622af", "0x000000000000000000000000000000000013d47bff8c630e847b70e2732fd3f0", "0x00000000000000000000000000000061d21663e93132f32921075f4c936a84df", "0x00000000000000000000000000000000001a74ca4e118fb480b9b999902989a3"] -proof_b = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000005a9bae947e1e91af9e4033d8d6aa6ed632", "0x000000000000000000000000000000000025e485e013446d4ac7981c88ba6ecc", "0x000000000000000000000000000000ff1e0496e30ab24a63b32b2d1120b76e62", "0x00000000000000000000000000000000001afe0a8a685d7cd85d1010e55d9d7c", "0x000000000000000000000000000000b0804efd6573805f991458295f510a2004", "0x00000000000000000000000000000000000c81a178016e2fe18605022d5a8b0e", "0x000000000000000000000000000000eba51e76eb1cfff60a53a0092a3c3dea47", "0x000000000000000000000000000000000022e7466247b533282f5936ac4e6c15", "0x00000000000000000000000000000071b1d76edf770edff98f00ff4deec264cd", "0x00000000000000000000000000000000001e48128e68794d8861fcbb2986a383", "0x000000000000000000000000000000d3a2af4915ae6d86b097adc377fafda2d4", "0x000000000000000000000000000000000006359de9ca452dab3a4f1f8d9c9d98", "0x0000000000000000000000000000006cf7dd96d7636fda5953191b1ad776d491", "0x00000000000000000000000000000000001633d881a08d136e834cb13a28fcc6", "0x00000000000000000000000000000001254956cff6908b069fca0e6cf1c47eb1", "0x000000000000000000000000000000000006f4d4dd3890e997e75e75886bf8f7", "0x0000000000000000000000000000006cf7dd96d7636fda5953191b1ad776d491", "0x00000000000000000000000000000000001633d881a08d136e834cb13a28fcc6", "0x00000000000000000000000000000001254956cff6908b069fca0e6cf1c47eb1", "0x000000000000000000000000000000000006f4d4dd3890e997e75e75886bf8f7", "0x000000000000000000000000000000f968b227a358a305607f3efc933823d288", "0x00000000000000000000000000000000000eaf8adb390375a76d95e918b65e08", "0x000000000000000000000000000000bb34b4b447aae56f5e24f81c3acd6d547f", "0x00000000000000000000000000000000002175d012746260ebcfe339a91a81e1", "0x00000000000000000000000000000052eebbd1f6f7554e837f60c44000ed14b6", "0x00000000000000000000000000000000001c1c045a3ec94b8801f2272cc0b3f4", "0x0000000000000000000000000000004d2ef74134578f6b431a9df071ffca4292", "0x0000000000000000000000000000000000291326ade7aa6f0dfc8900eab5580b", "0x0000000000000000000000000000002433eec6418a6dba820c9527e2581fc8bc", "0x00000000000000000000000000000000000e88b7daad19af2ac2f9bdf9e50ee2", "0x000000000000000000000000000000dcfce2c427155cc3e4d035735d3dd5ece8", "0x00000000000000000000000000000000002d7d473cac1a15d0fee8b22c1a7b3e", "0x1a4249b90be4602c8ff40c7c276160ee41b2a0f8a238ce7706e9face2db03d48", "0x162204b9d54d3ffd285c393a5a1ff76ee681474fd780a21a3cf7fac5c24fc2b9", "0x30279eb953d8ee79b2155c69c04e6443c5de6bf7e02886256dd7b3cd3c9502a4", "0x0d32c1bd21baf43e72d5d82d461ef54833807ff81a877adc822f27a6db88d754", "0x0fe15e055c0803d5ebe6dd77689b70cfd82138f008810ce24535c992daaff27d", "0x1fba82c012671212ce2fc13fd09bf8fba4f7d5875ab8d37495d1ccfcff287331", "0x090738a5842fa4d2699b3726aa0dd97cb59569b4be2c6825335ec4969f859dc2", "0x0c6cb72dabbc28abcf4a50c203534e066c29f48c24ca64d672092f263df3f9d7", "0x0f27fbea0d9145f815c288b50fe7e8c10b8185d325b5264624fd57102855d05d", "0x2a815cd3fd1c43c72ee0130465250ff771d1e7be2347e4ada331b83265a03450", "0x148b4ecf2ad7ed17409417086867ee27bc1b0906dbc9cbb3714c285071e2db70", "0x08e700a42b1d6d36ee65f8ebedf47d3a44463ff9fa579dce13b7492e20142c3a", "0x2e23c69521d572ff2152c50f8c9a9191535f4cf37f95f1e0428692e78842b642", "0x14519e0354365923fb41400c19866135b45e975d56a0980260bc99f0390b1d5f", "0x04caded1f05738f736cb5bcf08d785e395e58eb7738523a20638aa16bc51593e", "0x28787eaccd38383215ea21ec02895c32d979f68ca155f534a2e2d377bff6698b", "0x20a1b81fa96c58cf11c5762c5ceb731efdcb081fca2d34d5c463d2cf40e6da18", "0x11789a06fe3bf53833741d180f068d29534d5bb58a5c64b8119542e62b189fb4", "0x23d00fcd032ace719ffcbc513bfa177a55b04377d76455c2788d999d05d011e2", "0x01f0e81b57b4a73cc118e51ede18f8724debf25c2d109db6ef45280f99f1a3fa", "0x156d1c9b61749810de728f259c2c1c1fd4dbff97101426e26087ca461c93307c", "0x1c5d619ac3a478cfd06d5eebfd879960bb321236be173813f5e78d1366d32c69", "0x250cfae4e1dfc551406f1f3d10b649a637dcb7bcb0f6f697994cf96afd35d0c1", "0x242b999f58cf5f53c874d1092bd38725aa9ea076f5bc8f176efa9ea23393874b", "0x2e15748255c4a5e0e9fe38047341b692a967257de27a85a3a38681bc9f1602ea", "0x01ef83886ea7017253699cb6371988eb8e21b4f7023d7479ece4907fe6d4a6fd", "0x08db2dbc271e375b9312f695c59c48f313235b3432cad50921c8d9ad6dd7ad7a", "0x199309f2c2cd45c15a4abb0e6554a1615ff5a6e9488a8d900bbf835fc8f664ef", "0x074be7a3d88e31ab1b59c9208c012bcfb1f85f351c709e68134996891db52b57", "0x301b1011354d2ebf46134fc4d6d734bb6ed8542d719f38f5e09a376a580cad7f", "0x12968f3eccaa27e44f14d5aaac6ecb70c00d040e07536292e685d7cab03fc563", "0x2110a023c8c22fd2ed70270a2d0a265b92a32ce2217ffe1be9a5d7d5c25f512f", "0x1e8cf4c60c53900f0430d5b44de5804fe8b38299bc803beeb4216e1a289cf624", "0x12301cb908ccb28a2616e29b831ec7105b5d3ebf45ff5fe91d50a9dd53a50b52", "0x0f1029ed107d84ff2d6d4a416cbd01da3f3d7bf5b2209ce93ba424f4b85616fc", "0x1b431d016611b8abd684afd9e92331c3325967b1116bfa91d4f44e2f8e2c9fc2", "0x281e335a0fd117064c8ace3f01e02b134a19e9b9220571ebfaaaa0e3a12d34db", "0x22559c106f77e2ae95677d5e38e288343e3b7168371aec7d3aaab9ef8150af70", "0x13f113b1d9b590149cf08c3f6e90589cda5c7b98528866b891256cb9d5d814e7", "0x10252ef388e4c80246962e98b9e976fab2cd25e1e6f1e3fd2a7d4786c5218a97", "0x16b890723dfdebd9912a9207255f95cb800222165b6fae97ec46e461f23e83f3", "0x25caf77c7d2e8e069341ec90f3c8f6d64319cfd2d77cab0625cf0377285ba11c", "0x016c84288b0bc3c50eebbe250cdd5a4ee50b2c65a24ac64d0c930cbdecb95141", "0x20a537c045b069d47dc6315f45b391f60681222381e5059ec7c8b17bf677d911", "0x2594c0edfcd4064d215a3d797bc8e3b2f401c61f3961ae96ccbec8f8fd29e81f", "0x1c831d7047483ca00ed59bdb84c47ffb8bbebbae92aa164c7b35fcffbb8a35d3", "0x2ea7f60de52b8cd6b0bd06f861fc1f2c5ed1d1fbfa53caccdb836400a03df434", "0x275c6c8bd115f7d2ce196439e2330fad305c6745bab0bf1ce3f2fa32dadc3c43", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x2b3f4e210619347288731e7f0eea1ae60dd8696fe87319044864d099a03a9536", "0x0fecd3d2aebedeb8be2b0b7e3a74de9ec8bd2cb72851541463729e0715aef48b", "0x10bee385ad0c2cd3ff88ef4d630840749e4367f9add4a300fc4f545a7778e92c", "0x1fe792730eeafbd22c4eb80e86e2b40108b1e55b2a08db786289eea5745b9e3b", "0x04d411679da432816b213cd5580dda1fd6c2f258684c036be19b5b26baca583c", "0x159f17b655d2b8a803e0cfb564918628be52d3baa950ca1b127854491624f8f4", "0x225340463867d9252a1269013536e2e1dd219aa18eadef13c324b63d44679334", "0x1885e231554e02abb40ed54b72ebf09b883d0298a6bc06fc645a30365f370ef2", "0x233344517f25170972b8ba35d01f2df2e073d322993abce7df26796126e93498", "0x08990e8faa13b18b4433ec417c5cc596885e11ffd372d5f612c08cc79a5d5c80", "0x1e960a0c892b755c28e21dcbed816c1b182d7da43bae07f8ee622bd4485f79e7", "0x27b58e2ee290a179d349ace82752528b2ff946d60c092b99ef42f53c25d0c99f", "0x2a5cf8a3193107d982edd253002c7a52ab876b445dde8307ab78fbdca022d93c", "0x2b1ab4d5277f8c82750c1c7bd043889b71465ec64a9afc1bfa37d06b1ebd0725", "0x2a0dbf5c4373a58a83d5f2a031ea0615bf12800e33b70c3191a7cbb15966ced8", "0x1f272bb4a19d14a0abdfebc9fc83125e10623b9aef730f8d25f2bf5bead38ea9", "0x2c2339cf0ae7aff56091a568c1e2c3f01f52d8ed13400737fd31eaabcaffb9bd", "0x21f5fefe6b5fa0b5da71089befb74a1a39e52b4f830cb330c3c284e154614dfd", "0x1e6f6ba4b2444586b380dc4e2b3fad111ff1f4754420a846f53ea0789ebfb0ad", "0x1193d170b0b2dd0c4a04331a4b4aa3f12920f182ec3ab547837e30f1116ca584", "0x00000000000000000000000000000025704a15c9e2ce8a69558e7bbcdcbc7784", "0x2e5d36112770fb6c985681cafe40a8c99ad13f702309e7969801dd0ed080e727", "0x0eefc2585f591bb457183134e19ad643966272234d645514bf7868d6dd8ae2cb", "0x300803e4e2339ad39b9c31f228949bbeaf9c74b7101e7be1930b088126247eaa", "0x2bb562a50ed944b438b83b01f200101a34faef7f296a75c84c731755ebddbc1a", "0x1288e0b9c742af39cbcac21357c1b29511b0bbdd3d0e3cf5e14b2eef68a28ab3", "0x20f089131cc96d86ff1cfb67fa3f51670f4bad30158751b2587354bbec76cdf9", "0x1a26c6d3e633f9bf8434cf755b5f1217dad0d455071a97a7bcf85b824f5cf07a", "0x0d7e9b8a51fccf910ec25bdbd13e70b34bd6ea6f4d629fa744f9cdf5f2beb1cf", "0x0b40f28ce428e64df9cf5a024133fc420f39decf5f6af020cc3211ab298d4631", "0x0ca4f189dde7a55fe829f46681232904f6670249a22e0deb47222bd309523a8a", "0x2c544f2e31143783977645edb2a6bdb39b875053963bfa1a5b3ae9de204a7ebe", "0x00aae4454eb48fb18ff60db6b9d015abea2e770a2f7d86d121522b834c791ba5", "0x07d74e351fd4cccf4e18475d25211efa8a359066fc693a5c8505ddb507e4b74b", "0x07d74e351fd4cccf4e18475d25211efa8a359066fc693a5c8505ddb507e4b74b", "0x2d9e5bff47207d82533e2445959941181cc890c5779bc7f24d6e8a7b9e425b5c", "0x0aea3c0c317c441a5775a9849108d7a6889b39128235f717b09b184aa08e4eb7", "0x1ca5bc6fb37c55a562f4991901c39902f42d14db71284116df74cb4e7d55e493", "0x220fed26d64cd69f40e6d145a423e4a3c8cd0dce747e7d51647441270ad4d774", "0x15be574c9358889257aa2a30ff7b5fcc31a57da7032296e2c1201c49a44bbdb6", "0x2de539925525bedd3b7f43a9c6bf0f713151a17f79ac7ff4a9cd27b15ffe892a", "0x083086693dbf465211741e2cbff70ff38eb08383faf22d397eb2742c8ad7396a", "0x1fdfa258a890598816e807c50058d7a1462edd5ff196a2eae0f862e454b49aa1", "0x10c434c6daaa8226fa8e3e302123dfdc4455cf68063df518949df5a65a945213", "0x0000000000000000000000000000006472a7874de2c454a4591ed7784df1c104", "0x000000000000000000000000000000000008c46ac53d2c4ad0c26a5d6c790082", "0x0000000000000000000000000000005e422f9cfb8725800de60dfe0a8d4104c0", "0x000000000000000000000000000000000000f10fd4e4de81a0c00073ec91c274", "0x000000000000000000000000000000b20813090eca76bc6aa4a699b1ec8d5d6d", "0x0000000000000000000000000000000000292cc9f8a744eb00e0903c29ce87a7", "0x000000000000000000000000000000350a368b415fbb99fa90a26a42b1a3affd", "0x0000000000000000000000000000000000280eb9275cb05a3435f464d1dc369d", "0x000000000000000000000000000000280df6505e20c7725fe6d29439f96ee05d", "0x000000000000000000000000000000000017ef5033a08535451e2747827aa94b", "0x0000000000000000000000000000002f9ba89ae91b4e4a4ff8ccbd0526faad2f", "0x00000000000000000000000000000000001c2013561dafcc02cb03220bdf23c4", "0x000000000000000000000000000000aac102c400f9e5da0321ded4510994434b", "0x00000000000000000000000000000000001ec8ab9cc834b492fde124962f04a1", "0x0000000000000000000000000000000673dbd698da8b8cce450d2a083aba9987", "0x00000000000000000000000000000000000a49e55bb040249cb41c63cea901cd", "0x000000000000000000000000000000133d92af8d76ee0c74a12081ee7b2ef8c4", "0x0000000000000000000000000000000000240f552d1c6cbb007650e4b142e0a5", "0x000000000000000000000000000000e29c6e7d982ec08d51c79d6261c28d742d", "0x000000000000000000000000000000000021baeec04d9be419c923626034e7b3", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x1e940a528b42d8230e7d4dff76262a80986c0d00b2c02a9bc0559e36212d1547", "0x1ceccf21ac39f70d76ad6f7fe0dcb33b6af04555a0b1959e4714d65925e4e253", "0x096139d757046cdbdb7ee89a95f112f70882a43a46c2f739d9be115dda013420", "0x2f9c8ac67c7825b08eff0e7f7656a671f4c64e5601f2efab35b1b795801eec04", "0x2077e648e1704851cdffd7e6e56311634a7b741bab77ca34d9dff12a6a2bfe99", "0x115d48c4a97aeb3c447a060f9e0d675b0dc7f4a05a3f5776e2f279f3a165d7dc", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000fd38c45c3ec5b841482a80e3a56ce82555", "0x00000000000000000000000000000000000ad70b03f092f60af3e0ce1bb29d2c", "0x0000000000000000000000000000007a184d5342c90c634c0b1a050f0b97c9fb", "0x0000000000000000000000000000000000271f42abcb3bc1f0332e4b3ca85e1d", "0x0000000000000000000000000000008256322bbe2c1b8cd9d84e5ff6123477f2", "0x000000000000000000000000000000000025cab962761681dd9547f4c78814df", "0x0000000000000000000000000000008c4234510e5825c02b9ac427bcbf8e279a", "0x000000000000000000000000000000000013a14e0d7fc073c44643af38cc5396"] \ No newline at end of file +verification_key = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000004", "0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x0000000000000000000000000000000000000000000000000000000000000007", "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000009", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000000c", "0x000000000000000000000000000000000000000000000000000000000000000d", "0x000000000000000000000000000000000000000000000000000000000000000e", "0x000000000000000000000000000000000000000000000000000000000000000f", "0x0000000000000000000000000000000000000000000000000000000000000010", "0x00000000000000000000000000000060e430ad1c23bfcf3514323aae3f206e84", "0x00000000000000000000000000000000001b5c3ff4c2458d8f481b1c068f27ae", "0x000000000000000000000000000000bb510ab2112def34980e4fc6998ad9dd16", "0x00000000000000000000000000000000000576e7c105b43e061e13cb877fefe1", "0x000000000000000000000000000000ced074785d11857b065d8199e6669a601c", "0x00000000000000000000000000000000000053b48a4098c1c0ae268f273952f7", "0x000000000000000000000000000000d1d4b26e941db8168cee8f6de548ae0fd8", "0x00000000000000000000000000000000001a9adf5a6dadc3d948bb61dfd63f4c", "0x0000000000000000000000000000009ce1faac6f8de6ebb18f1db17372c82ad5", "0x00000000000000000000000000000000002002681bb417184b2df070a16a3858", "0x000000000000000000000000000000161baa651a8092e0e84725594de5aba511", "0x00000000000000000000000000000000000be0064399c2a1efff9eb0cdcb2223", "0x0000000000000000000000000000008673be6fd1bdbe980a29d8c1ded54381e7", "0x000000000000000000000000000000000008a5158a7d9648cf1d234524c9fa0c", "0x0000000000000000000000000000002b4fce6e4b1c72062b296d49bca2aa4130", "0x00000000000000000000000000000000002e45a9eff4b6769e55fb710cded44f", "0x00000000000000000000000000000072b85bf733758b76bcf97333efb85a23e3", "0x000000000000000000000000000000000017da0ea508994fc82862715e4b5592", "0x00000000000000000000000000000094fa74695cf058dba8ff35aec95456c6c3", "0x0000000000000000000000000000000000211acddb851061c24b8f159e832bd1", "0x000000000000000000000000000000303b5e5c531384b9a792e11702ad3bcab0", "0x00000000000000000000000000000000000d336dff51a60b8833d5d7f6d4314c", "0x0000000000000000000000000000009f825dde88092070747180d581c342444a", "0x0000000000000000000000000000000000237fbd6511a03cca8cac01b555fe01", "0x0000000000000000000000000000007c313205159495df6d8de292079a4844ff", "0x000000000000000000000000000000000018facdfc468530dd45e8f7a1d38ce9", "0x0000000000000000000000000000000d1ce33446fc3dc4ab40ca38d92dac74e1", "0x00000000000000000000000000000000000852d8e3e0e8f4435af3e94222688b", "0x0000000000000000000000000000006c04ee19ec1dfec87ed47d6d04aa158de2", "0x000000000000000000000000000000000013240f97a584b45184c8ec31319b5f", "0x000000000000000000000000000000cefb5d240b07ceb4be26ea429b6dc9d9e0", "0x00000000000000000000000000000000002dad22022121d689f57fb38ca21349", "0x000000000000000000000000000000c9f189f2a91aeb664ce376d8b157ba98f8", "0x00000000000000000000000000000000002531a51ad54f124d58094b219818d2", "0x000000000000000000000000000000ef1e6db71809307f677677e62b4163f556", "0x0000000000000000000000000000000000272da4396fb2a7ee0638b9140e523d", "0x0000000000000000000000000000002e54c0244a7732c87bc4712a76dd8c83fb", "0x000000000000000000000000000000000007db77b3e04b7eba9643da57cbbe4d", "0x000000000000000000000000000000e0dfe1ddd7f74ae0d636c910c3e85830d8", "0x00000000000000000000000000000000000466fa9b57ec4664abd1505b490862", "0x0000000000000000000000000000009ee55ae8a32fe5384c79907067cc27192e", "0x00000000000000000000000000000000000799d0e465cec07ecb5238c854e830", "0x0000000000000000000000000000001d5910ad361e76e1c241247a823733c39f", "0x00000000000000000000000000000000002b03f2ccf7507564da2e6678bef8fe", "0x000000000000000000000000000000ee40d90bea71fba7a412dd61fcf34e8ceb", "0x0000000000000000000000000000000000140b0936c323fd2471155617b6af56", "0x0000000000000000000000000000002b90071823185c5ff8e440fd3d73b6fefc", "0x00000000000000000000000000000000002b6c10790a5f6631c87d652e059df4", "0x00000000000000000000000000000029a17181c7934fc3fdbd352eac5cb521b9", "0x00000000000000000000000000000000001f497cbf5284ff29a2d336e5991999", "0x000000000000000000000000000000072bd9c0c6beda1fdee6d4ff0432ba9e1b", "0x000000000000000000000000000000000013ea38a0bd2aa751a490a724fac818", "0x000000000000000000000000000000c599f63dcd3edd49f08ae5c3141c1e3493", "0x00000000000000000000000000000000002bdb36be0bea09950dd32a8ccf6fbc", "0x00000000000000000000000000000047f27f29724e7f19eba0340256a0bd4b7d", "0x00000000000000000000000000000000001c1c5ccf87a962129ca785f8f35120", "0x000000000000000000000000000000c5c71efdae00679bbe4a95096e012b1817", "0x000000000000000000000000000000000017a365de041e317817d0135f2b48e0", "0x0000000000000000000000000000008ae711ac402f7848d719c93a89ba8d39f1", "0x00000000000000000000000000000000002b6fb40ed8a1935226f4f9786a0499", "0x0000000000000000000000000000002f03a71501d83de1da5715a4e9462d6198", "0x00000000000000000000000000000000001644064443b8546f48eae693af47b8", "0x00000000000000000000000000000083763ab1b6e8fe269b2fe4c7b9c448c08d", "0x000000000000000000000000000000000021d7cc18c59676a8eeb47c0111c251", "0x000000000000000000000000000000b5f937153073e03ea7d51a996e0ebc2e6b", "0x000000000000000000000000000000000011ddd0e26457373eb06e0493177672", "0x000000000000000000000000000000c5f6eb9f6fc8fa99811a4a88c74a6d018b", "0x000000000000000000000000000000000025bcd07a0732c123567834f5109558", "0x000000000000000000000000000000aeb08a0b1a4442189448b4e97490568146", "0x000000000000000000000000000000000002a1744e4771705536a88f07e0f90f", "0x000000000000000000000000000000b938568293bd0724b0ea76c2ec34c4a829", "0x0000000000000000000000000000000000053296e8f3b9ad3af877dfa9c7c2a7", "0x000000000000000000000000000000f0ca1db6323996eba26bdc86dafef9d10b", "0x00000000000000000000000000000000001441a46c58af03d5645d52721d956a", "0x0000000000000000000000000000008bbf8f884013c66c28ba09c2fbd573b656", "0x0000000000000000000000000000000000206c391ca06fac27d1908e94570243", "0x0000000000000000000000000000002d4f5aaed88ba4f79612d53b804ca8f194", "0x00000000000000000000000000000000001674011c96392df08970fa6b7b4cb8", "0x0000000000000000000000000000009f88297c1729d76c4d9306853598c91325", "0x0000000000000000000000000000000000256f51adfcacc3c1e340be4d32d3e9", "0x0000000000000000000000000000000ab9955eec0d74eb799afed2a802b24d75", "0x00000000000000000000000000000000001fcbe43ea105b30d36ed0b21b03411", "0x000000000000000000000000000000d66b1d5433f1aa5305cd1edce7c22de466", "0x00000000000000000000000000000000002331546a256b8a3b751956806680d4", "0x000000000000000000000000000000292b512a940306c9b122a0feb4e9780af9", "0x00000000000000000000000000000000000904e02f0334f3a3f72e65ce82f34b", "0x000000000000000000000000000000778103226eff8f576eba0a0a2ffa134d57", "0x000000000000000000000000000000000001fe54f93991aa61a056f75e5137b0", "0x00000000000000000000000000000089058e539eb10c10fa13dd50e39517555d", "0x000000000000000000000000000000000009e91383ce6118cef78093d2c550fc", "0x000000000000000000000000000000d95e2e1bf12461b508cc8d63fee4a8613d", "0x00000000000000000000000000000000000ab28965260d651673541f10f2e02f", "0x0000000000000000000000000000008f6f361c7fe163277c1022dacf2a0f307b", "0x00000000000000000000000000000000001e47e6531c4ec673e9c18a9062c1df", "0x000000000000000000000000000000e55ba7b44de2c0927d4df995625325c68c", "0x000000000000000000000000000000000005d3e2113696d710431294256dab1a", "0x000000000000000000000000000000150b1462a7b440ef041dc9e7af7e1d1f15", "0x000000000000000000000000000000000017b03e1a64b4988e05ca4291f3ce6a", "0x0000000000000000000000000000008d494ccfb05451bea33fe43623c45a9d7b", "0x000000000000000000000000000000000001ed433638a57a66f8205daea09e50", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000f68b70e0e4b0cb9e2c7bd64fa4b75b32dd", "0x00000000000000000000000000000000001bcedd9106bdd4e13e0b751c672a83", "0x00000000000000000000000000000042fd857eb4bf620db08b0e181807df9f59", "0x00000000000000000000000000000000001ccfa89524772b4bd5b6bf6741d71f"] +proof_b = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000005a9bae947e1e91af9e4033d8d6aa6ed632", "0x000000000000000000000000000000000025e485e013446d4ac7981c88ba6ecc", "0x000000000000000000000000000000ff1e0496e30ab24a63b32b2d1120b76e62", "0x00000000000000000000000000000000001afe0a8a685d7cd85d1010e55d9d7c", "0x000000000000000000000000000000b0804efd6573805f991458295f510a2004", "0x00000000000000000000000000000000000c81a178016e2fe18605022d5a8b0e", "0x000000000000000000000000000000eba51e76eb1cfff60a53a0092a3c3dea47", "0x000000000000000000000000000000000022e7466247b533282f5936ac4e6c15", "0x00000000000000000000000000000071b1d76edf770edff98f00ff4deec264cd", "0x00000000000000000000000000000000001e48128e68794d8861fcbb2986a383", "0x000000000000000000000000000000d3a2af4915ae6d86b097adc377fafda2d4", "0x000000000000000000000000000000000006359de9ca452dab3a4f1f8d9c9d98", "0x0000000000000000000000000000004ae614a40d61d28f36aaf03d00a064355d", "0x000000000000000000000000000000000010edd34b6c69cb31a6a833a1d040d2", "0x000000000000000000000000000000f4976ee83b95241474007fdc30b06ebdd7", "0x000000000000000000000000000000000019cd0d7e4577008a8335c6260be826", "0x0000000000000000000000000000004ae614a40d61d28f36aaf03d00a064355d", "0x000000000000000000000000000000000010edd34b6c69cb31a6a833a1d040d2", "0x000000000000000000000000000000f4976ee83b95241474007fdc30b06ebdd7", "0x000000000000000000000000000000000019cd0d7e4577008a8335c6260be826", "0x000000000000000000000000000000f968b227a358a305607f3efc933823d288", "0x00000000000000000000000000000000000eaf8adb390375a76d95e918b65e08", "0x000000000000000000000000000000bb34b4b447aae56f5e24f81c3acd6d547f", "0x00000000000000000000000000000000002175d012746260ebcfe339a91a81e1", "0x0000000000000000000000000000007376c0278bcc77156c008b389f6bd12e8f", "0x0000000000000000000000000000000000176ebed74bf3b57ca42a2fac842809", "0x000000000000000000000000000000fc4a601439d45b9ce23c9d9cc37cb21dd2", "0x000000000000000000000000000000000017dc6f8c53261c44cd0348a9970d88", "0x000000000000000000000000000000292042e9c3c101d8dd41b3acfc0db429a2", "0x0000000000000000000000000000000000114f6b3755c65915e12f13533cdd41", "0x0000000000000000000000000000007bb311a6bd5f4f3d543ca30a1a0201614f", "0x00000000000000000000000000000000000871a5a04dda33543cf59b3babf733", "0x03ecb02e48ba68818287222348fc537135b6426d4580ea31cdd540250a7a95fb", "0x2c779e44987737a835c92393388504ebf27da5db3438865f760cb56ee5856a06", "0x0ac17380181974c0082ef0fada047fc7906a94dc18e5be249dd29e52961522e0", "0x206c623397f11ed76a292c7c605fe56c1ae4f6babb6889786aaff461535cf79e", "0x11dfbe6d0977046fd72b55bdb9b41f983fc06ea6404cb36efdf1786d6f0dcbf7", "0x1081a4f21029bfcf4f8388257bf88d932963b2368c4fde96836fb6f023f16622", "0x2e981de982d368f04b0a49e537a05ed5583080c3eafed9617bd06e1214641be9", "0x2571d21e04b1d59935490270a4789e53042f18e15fc7b94dfd267c8deadfc74e", "0x0f70f3f5319d3564bcc6fad428552eefce8f341ced5187fa186d0f099315f225", "0x18f7ee010c96f63d18d2a277e5f5a8ef19b525907817d69616d24495ad804021", "0x1cf7e347bae24a2c1a93b5fd11ff79e68bd2c1bd32056df6d2e1582d17db1d8d", "0x01c451a702451ea9871b7e19d3e2052d8fa49a571ae46616453f27d324cfc907", "0x0614dbf2404cb5fef2e5408f1115502954097981a5ea67d1f80812fa247b1f93", "0x09884374bb354fdb4b118f4da44cd37e75ba7a655201f94cc4064acbdc35887d", "0x158211f68576bcafd791ff02039bb8246b1ba94d99f30a0f282565dd8d82ce0b", "0x0a5231e4039c7b7e0ad77d319958403997a33a0be31e71032733cd70067b14db", "0x2803fc0a9f60d9e202eb6caddcacfbb94a5a7df2695c2a0c909815093ca1864c", "0x0faa80f3cef0e86746df7518f865936959d65eb64ccb05bfb574ac5561683eae", "0x298544d77ee6f4cae7aaa4e9203a233fa18dab360d6f54daf9f8801802586d58", "0x0ba76e9cadf0380b82a3b5ec1c71b80295ce3caeec73aefecffed90f28c1b012", "0x0d965885fc07c4a140f50a83cb750c876191651ee47462d0931e0e67bc9ab5cb", "0x0aad443f96fbde49595f31a47d233ca83ed2bcda86801a8fd7a596ea666c7716", "0x298ef11d346c061b8899cb10c0cd7150aa2d6c554340cf2ee6aa76125e7d1e7f", "0x27518b0512f1efb3a79650941d3adb015b357c92a8c06e086be7b3e7666cea47", "0x0cd6b10a38d5af7f0a5fa97c0ffcba406e8a65a92fe050b3b79f3f1f45d723e2", "0x2f5e1210a841f9c6a7ee7d7f290479696387a58192cb775a64adf0dc225e3d4f", "0x2ffd390be1aecefc25137d01e5b7a85410254ae9e21e7067a9869217cb828ee1", "0x244a77246b5beb3e0e38c8dda39a516050303e83c051300d08bbe5450320b47f", "0x16ed38ff1019df1d168974833ccc96d8648d05c2823021d45e1d5599998a8aec", "0x24cbbf8ca1a5bb082c1081d9252a5e964ff7aae4d83e04468db55960b80a585f", "0x01b3a78bcc6e7529c6ded587b8958d903ef990421d5706afbef64a7976a51084", "0x2c3a013cdecd027b32c8c99c163dd822df374ef018aac8f3d1fb8d57335f9503", "0x0ad83466928e5d70e1e0bb26633a1e0c61399733c15fffafb22df18029e583d6", "0x095023de752480ca3edd408d3c34d732bd9836919e84931d3f42a978867bc53e", "0x283d221f0a2e6b6616bc3eda23e15bb8c8b459010014db7608e646c70ea1da2e", "0x1390c81536ca3d71228eeccf9844702aa3df012bbc3902fe30323f55ee8c7872", "0x0ef66f0302753884f05043080104589e1bf036566a9a00d4688d3c7910631508", "0x15eceeed97d9267597c028fafac72dba40f3ea441880bdd2202b30846a243044", "0x2b38e3f3b5193811df1bafd58432d5abd1c5f575a5d9c2a449682a0f2f035034", "0x2bbcc40d11d6a96c85a63162143ec53314573bb0af7c32d89b791394c80d14a5", "0x22d909e8fb5152b5b98f7cb3fc38f4ef7d7e8f2a857347da59ba2e979bd2ec96", "0x29e3f7a95437fe6ea1e72cd4c7c2fcf1892ab22ba69387f1a6a795e91bcc26f2", "0x02d8c8d031ada707d85693ed106135cecb7fe52de73eedbc54a91a2c856d0de1", "0x28020fb768c50bf52497832c04fb0e14cdb651b98b80864d0b68228ddfd922a0", "0x24d61051f82ff93eb42b5afdcad9e236c669f9f849bf811a853f1e9cc302f8ce", "0x250e89de38769cf70e6cb3685f99e39f44d8ebc1a468930f49e1d80342092b6a", "0x0ad45df677495b9199c57f620db716c543fb6437d574453b7721c2faee6316ba", "0x043d8715e16e3f2dc5a537355c0576254a36db25002f13958696ed13c24add46", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0bb8cb6a256f110f134a15b66b644eb49dc8e0239f92489408e6265a323bb513", "0x18f02f61683cf6a7492291a7041ee1b3cfa8dfb5aa40e2f6571d13750f0f459a", "0x0a982c10c93ae173751f4165e6456c9b85e2551bd503919acae78c801ccc0e1e", "0x0b6e6266bdc6d44d05ae76d2db249877a46ad978fc758654a3a6a7208d2725a6", "0x20de00721f30db8280aa6804c90f3fbe23477e1f746a8eff61c4c5b2af7e821c", "0x1321548f766ded3432627a50704d233455c61d8e59afec2883dbe2f381c033f9", "0x00c56c902b14aa59f6f59badf20f59c51b08aeb6afbdd97a5ac7b98b998b0a56", "0x1745c01290e99476fa655e5fcf2e5b3d24f42624cbd25a40f60af3f3e8489512", "0x08e915bebf8f6c86b332a681d35c57dcd0e0804f22e4e78884ab5edc0a41d6d0", "0x0c77b29e3a0c4368ce5231f94d13fa9b84a6e350cc8f2a57b3f6920a2bf0e879", "0x07ab821c4f07e1dd1cce43b9d9dbf4c9da2e22fea675a57ecf5a47a6992059a2", "0x0bcf85d1f4e34e7598a68bc09cfacf119b0afa1193ad4163096e44ca8eef7a22", "0x0c8a367da01b9097d24eb7b5471c6bd049f7938080bb8cc6fb92945fa934faf9", "0x2cda5caa3a93dcc134cf176f4ad6c79577d273bd2706da3fcaad92a9bc336ac8", "0x2c19cbfce048ef9bb9efb5b9875645b0bc7825aa1a05ad71dbbd3a34d1d76501", "0x28d7f11c2b6b7ff8717b79b098e5bd37eb39a8ea5d03b15339c86fb93e497d97", "0x21ba86c3baacb0fe4270c64c1a5f2861af2f5aa1d6391afe8214e1ce9eac8dfa", "0x0c5289ff2fe581ccf0caa97b4041d381e384c4aef0417edd4dafa7f64a3bfa6f", "0x0c744b0b301542ec4f334696945d7b89b137c5b9434bec277dc938c3dc9ca7aa", "0x006d246e7b0ad18157fa925981f097121fe34cc769128fd8993c4d15cfdf0aee", "0x00000000000000000000000000000022a7ebdc5723cfdb5d73c4c0392e43c407", "0x160d495d0b4462662665faccb1d65d81f0c3f006254a6082a0ceffc49483d76a", "0x24a5a2b9bef1abc3a818d2f27ca5cca7e1b3da34ea6056f338ac54638e26c3b0", "0x0a3dcf45eb6c14391ed8aeab11cb9460f85cb11a1ecb868ad75095796c0f5dac", "0x160c8087a99bf109389ca20d0ce624f71dd2e40fe64d62712e45669ed550fd61", "0x1a65519621040c52fdec5594d095add265c99210929eeb29a3a8180b480bb313", "0x09bf095c40c00dce181347b0d8eaa83ecd0f1f8fcb5dab34ffe19e219672e681", "0x10f3444d7a623e54ad2e882c436191975143217e9f8121c8770a3bbd3ec183ce", "0x0cd68d59322f30bdaf0a6a628f095f880ff716b157ef9a2d589f2cfc40b53e3d", "0x20732eab49adfd109626e0e84496a929a690377e98ee03f13f66ad4541949300", "0x28c850b8bc7f6ae88835bed342eda477e8d1f013a4db34b7ff33198e0a9f8e09", "0x14d234765f29b713df4d1291d452c73a5dc00458242df1be96e04ffb0a3c396e", "0x162572b68ab59291f430cf3113d4fcd3ddca59c4808c134345f6765693f8e1ce", "0x0bc37cb2ffd0f1691bf4d8c621d49f8c23ff58989d09d96c019cc6fc9a46e155", "0x0bc37cb2ffd0f1691bf4d8c621d49f8c23ff58989d09d96c019cc6fc9a46e155", "0x2aa58bd9f811c2970dcefde8c31c2c6db2349eed5161f80c0280a3acbd9f4f0d", "0x141198df3b9c1917d2e7a136ca3438fd9630719591c24388a0559873756d288b", "0x1975864b97d6ff0ace3d600020772ea32181c2f3e413ae67bac22e4a3bbcba9c", "0x2023d432e6630619c99c25a2f293f5ed78f373ee5212bff02b92f00a43bab0e0", "0x23cbaa3113b7265b926bc8811fccce701b3d4e4006ae6b66cefffd0e2f059fd4", "0x00000000000000000000000000000061e09b904168dcad01e82d26f8a21bb884", "0x000000000000000000000000000000000027a29682b86d1b09daa382868b245a", "0x000000000000000000000000000000efc6d7071b6c8cf492bc3ba72f4eda84c5", "0x000000000000000000000000000000000010860d04901949ad63a94863c77149", "0x00000000000000000000000000000036cacf503222db1b5d0edd58aafc1e74f9", "0x00000000000000000000000000000000000fef16ca13117c1f45f6df0782c273", "0x000000000000000000000000000000013704a507a82f6224d7c369d3d6c3929e", "0x00000000000000000000000000000000002887168ff50b7339d4d181d2a84cc0", "0x000000000000000000000000000000e57f500eab5f7d08ac3c93ce080dc1f15e", "0x00000000000000000000000000000000000c720872540cd88fec315c3e6a7625", "0x0000000000000000000000000000004b6897120d1858d29ac10cba52cf73dc44", "0x000000000000000000000000000000000019a9523d9a2481b5dbb1c23cb9686e", "0x00000000000000000000000000000052442fa24d3d5c3b9a608d8259757905a4", "0x00000000000000000000000000000000001c58b3787ffa3edd9f049c1c775a85", "0x000000000000000000000000000000f5737a5b8d278973356217e75bdc986ea2", "0x00000000000000000000000000000000001e0959f30c996ac7e3b265bac2de9d", "0x00000000000000000000000000000030122ef6c7a097b6b2ea6efa763797b8b4", "0x0000000000000000000000000000000000191344dd8af6c1c1c3beef933de271", "0x0000000000000000000000000000002f38961e4eb47676a42a5b59457e19a7b1", "0x000000000000000000000000000000000002936d1fa64f399018fbf60a1f2001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0f349727b02c8c3916e6904450b4db7d748c746d693f12acfd44757e349ae543", "0x109b539e615d399af085519623a8f0ea43fd3e672e8b3397deb033110b896ba7", "0x1d2d7546c079198782bc8c1ecf377c86567d90d05988acd013af254a84ccfca2", "0x11922ebe299248b1a194ff41750bbad0297b8e4db3944036983764ba171195a1", "0x14cb035cb0d920e42127d67ed6763fd0cdadeac07c0aa57ab5c038a501aca88c", "0x2e82b6bc3d9337d1f2c080ed47e935308317c159408ff3a054718e737f827a49", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000c883c136e90256f3059fb812416fe61171", "0x00000000000000000000000000000000002cbe86e3f824a75195f942b5de0abe", "0x000000000000000000000000000000ff2335151394b16f671dcfdc5ee78485f3", "0x00000000000000000000000000000000000fceb210dd93cd99b7bb225af47ae8", "0x0000000000000000000000000000001a95675079e3f1508e636cf69b7978db7f", "0x0000000000000000000000000000000000079f7a59ed7b4a3dda951fa8fbad98", "0x000000000000000000000000000000b15ed33e983574376efe5ae0c29c6bdd1f", "0x000000000000000000000000000000000004031f5fd23cf82aad9e5d0bfd0363"] \ No newline at end of file diff --git a/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/src/main.nr b/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/src/main.nr index 82090bb8602..91f7bb214b1 100644 --- a/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/src/main.nr +++ b/noir/noir-repo/test_programs/execution_success/double_verify_honk_proof/src/main.nr @@ -1,5 +1,5 @@ // This circuit aggregates two Honk proof from `assert_statement`. -global SIZE_OF_PROOF_IF_LOGN_IS_28: u32 = 463; +global SIZE_OF_PROOF_IF_LOGN_IS_28: u32 = 459; global HONK_IDENTIFIER: u32 = 1; fn main( verification_key: [Field; 128], diff --git a/noir/noir-repo/test_programs/execution_success/schnorr/Nargo.toml b/noir/noir-repo/test_programs/execution_success/hint_black_box/Nargo.toml similarity index 69% rename from noir/noir-repo/test_programs/execution_success/schnorr/Nargo.toml rename to noir/noir-repo/test_programs/execution_success/hint_black_box/Nargo.toml index aa24a2f3caf..8a49ec25494 100644 --- a/noir/noir-repo/test_programs/execution_success/schnorr/Nargo.toml +++ b/noir/noir-repo/test_programs/execution_success/hint_black_box/Nargo.toml @@ -1,5 +1,5 @@ [package] -name = "schnorr" +name = "hint_black_box" type = "bin" authors = [""] diff --git a/noir/noir-repo/test_programs/execution_success/hint_black_box/Prover.toml b/noir/noir-repo/test_programs/execution_success/hint_black_box/Prover.toml new file mode 100644 index 00000000000..67dda9c2b68 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/hint_black_box/Prover.toml @@ -0,0 +1,3 @@ +# 5 * a = b +a = 10 +b = 50 diff --git a/noir/noir-repo/test_programs/execution_success/hint_black_box/src/main.nr b/noir/noir-repo/test_programs/execution_success/hint_black_box/src/main.nr new file mode 100644 index 00000000000..1109c54301f --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/hint_black_box/src/main.nr @@ -0,0 +1,90 @@ +use std::hint::black_box; + +fn main(a: u32, b: u32) { + // This version unrolls into a number of additions + assert_eq(loop(5, a), b); + // This version simplifies into a single `constraint 50 == b` + assert_eq(loop(5, 10), b); + // This version should not simplify down to a single constraint, + // it should treat 10 as opaque: + assert_eq(loop(5, black_box(10)), b); + + // Check array handling. + let arr = [a, a, a, a, a]; + + assert_eq(array_sum(arr), b); + assert_eq(array_sum(black_box(arr)), b); + + assert_eq(slice_sum(arr.as_slice()), b); + assert_eq(slice_sum(black_box(arr).as_slice()), b); + + // This doesn't work because by calling `black_box` on a slice the compiler + // loses track of the length, and then cannot unroll the loop for ACIR. + //assert_eq(slice_sum(black_box(arr.as_slice())), b); + + // But we can pass a blackboxed slice to Brillig. + let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) }; + assert_eq(s, b); + + let mut d = b; + // This gets completely eliminated: + let mut c = 0; + set_ref(&mut c, &mut d); + assert_eq(c, b); + + // This way the constraint is preserved: + let mut c = 0; + set_ref(&mut c, &mut black_box(d)); + assert_eq(c, b); + + // A reference over the output of black box is not the original variable: + let mut c = 0; + set_ref(&mut black_box(c), &mut d); + assert_eq(c, 0); + + // This would cause a causes a crash during SSA passes unless it's a Brillig runtime: + // > Could not resolve some references to the array. All references must be resolved at compile time + // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them + // from being optimised away during SSA passes. + // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg` + // eliminates the storing to the reference. + //let mut c = 0; + //set_ref(black_box(&mut c), black_box(&mut d)); + //assert_eq(c, b); +} + +fn loop(n: u32, k: u32) -> u32 { + let mut sum = 0; + for _ in 0..n { + sum = sum + k; + } + sum +} + +fn array_sum(xs: [u32; N]) -> u32 { + let mut sum = 0; + for i in 0..N { + sum = sum + xs[i]; + } + sum +} + +fn slice_sum(xs: [u32]) -> u32 { + let mut sum = 0; + for x in xs { + sum = sum + x; + } + sum +} + +unconstrained fn brillig_slice_sum(xs: [u32]) -> u32 { + let mut sum = 0; + for x in xs { + sum = sum + x; + } + sum +} + +fn set_ref(c: &mut u32, b: &mut u32) { + *c = *b; +} diff --git a/noir/noir-repo/test_programs/execution_success/reference_counts/src/main.nr b/noir/noir-repo/test_programs/execution_success/reference_counts/src/main.nr index 8de4d0f2508..68b9f2407b9 100644 --- a/noir/noir-repo/test_programs/execution_success/reference_counts/src/main.nr +++ b/noir/noir-repo/test_programs/execution_success/reference_counts/src/main.nr @@ -2,7 +2,7 @@ use std::mem::array_refcount; fn main() { let mut array = [0, 1, 2]; - assert_refcount(array, 1); + assert_refcount(array, 2); borrow(array, array_refcount(array)); borrow_mut(&mut array, array_refcount(array)); diff --git a/noir/noir-repo/test_programs/compile_success_empty/schnorr_simplification/Nargo.toml b/noir/noir-repo/test_programs/execution_success/regression_6734/Nargo.toml similarity index 62% rename from noir/noir-repo/test_programs/compile_success_empty/schnorr_simplification/Nargo.toml rename to noir/noir-repo/test_programs/execution_success/regression_6734/Nargo.toml index 599f06ac3d2..4c757bab454 100644 --- a/noir/noir-repo/test_programs/compile_success_empty/schnorr_simplification/Nargo.toml +++ b/noir/noir-repo/test_programs/execution_success/regression_6734/Nargo.toml @@ -1,5 +1,5 @@ [package] -name = "schnorr_simplification" +name = "regression_6734" type = "bin" authors = [""] diff --git a/noir/noir-repo/test_programs/execution_success/regression_6734/src/main.nr b/noir/noir-repo/test_programs/execution_success/regression_6734/src/main.nr new file mode 100644 index 00000000000..87cac64aaa1 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/regression_6734/src/main.nr @@ -0,0 +1,24 @@ +// https://github.com/noir-lang/noir/issues/6734 + +pub fn sub_array_extended( + src: [Field; SRC_LEN], + offset: u32, +) -> [Field; DST_LEN] { + let available_elements_to_copy = SRC_LEN - offset; + let elements_to_copy = if DST_LEN > available_elements_to_copy { + available_elements_to_copy + } else { + DST_LEN + }; + + let mut dst: [Field; DST_LEN] = std::mem::zeroed(); + for i in 0..elements_to_copy { + dst[i] = src[i + offset]; + } + + dst +} + +unconstrained fn main() { + assert_eq(sub_array_extended([], 0), []); +} diff --git a/noir/noir-repo/test_programs/execution_success/return_twice/Nargo.toml b/noir/noir-repo/test_programs/execution_success/return_twice/Nargo.toml new file mode 100644 index 00000000000..defd68f37b8 --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/return_twice/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "return_twice" +version = "0.1.0" +type = "bin" +authors = [""] + +[dependencies] diff --git a/noir/noir-repo/test_programs/execution_success/return_twice/Prover.toml b/noir/noir-repo/test_programs/execution_success/return_twice/Prover.toml new file mode 100644 index 00000000000..b343065a7fc --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/return_twice/Prover.toml @@ -0,0 +1,2 @@ +return = [100, 100] +in0 = 10 diff --git a/noir/noir-repo/test_programs/execution_success/return_twice/src/main.nr b/noir/noir-repo/test_programs/execution_success/return_twice/src/main.nr new file mode 100644 index 00000000000..68bd5f916ce --- /dev/null +++ b/noir/noir-repo/test_programs/execution_success/return_twice/src/main.nr @@ -0,0 +1,5 @@ +pub fn main(in0: Field) -> pub (Field, Field) { + let out0 = (in0 * in0); + let out1 = (in0 * in0); + (out0, out1) +} diff --git a/noir/noir-repo/test_programs/execution_success/schnorr/Prover.toml b/noir/noir-repo/test_programs/execution_success/schnorr/Prover.toml deleted file mode 100644 index 2faf2018e07..00000000000 --- a/noir/noir-repo/test_programs/execution_success/schnorr/Prover.toml +++ /dev/null @@ -1,70 +0,0 @@ -message = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] -message_field = "0x010203040506070809" -pub_key_x = "0x04b260954662e97f00cab9adb773a259097f7a274b83b113532bce27fa3fb96a" -pub_key_y = "0x2fd51571db6c08666b0edfbfbc57d432068bccd0110a39b166ab243da0037197" -signature = [ - 1, - 13, - 119, - 112, - 212, - 39, - 233, - 41, - 84, - 235, - 255, - 93, - 245, - 172, - 186, - 83, - 157, - 253, - 76, - 77, - 33, - 128, - 178, - 15, - 214, - 67, - 105, - 107, - 177, - 234, - 77, - 48, - 27, - 237, - 155, - 84, - 39, - 84, - 247, - 27, - 22, - 8, - 176, - 230, - 24, - 115, - 145, - 220, - 254, - 122, - 135, - 179, - 171, - 4, - 214, - 202, - 64, - 199, - 19, - 84, - 239, - 138, - 124, - 12, -] diff --git a/noir/noir-repo/test_programs/execution_success/schnorr/src/main.nr b/noir/noir-repo/test_programs/execution_success/schnorr/src/main.nr deleted file mode 100644 index ab3c65372c5..00000000000 --- a/noir/noir-repo/test_programs/execution_success/schnorr/src/main.nr +++ /dev/null @@ -1,24 +0,0 @@ -use std::embedded_curve_ops; - -// Note: If main has any unsized types, then the verifier will never be able -// to figure out the circuit instance -fn main( - message: [u8; 10], - message_field: Field, - pub_key_x: Field, - pub_key_y: Field, - signature: [u8; 64], -) { - // Regression for issue #2421 - // We want to make sure that we can accurately verify a signature whose message is a slice vs. an array - let message_field_bytes: [u8; 10] = message_field.to_be_bytes(); - - // Check that passing an array as the message is valid - let pub_key = - embedded_curve_ops::EmbeddedCurvePoint { x: pub_key_x, y: pub_key_y, is_infinite: false }; - let valid_signature = std::schnorr::verify_signature(pub_key, signature, message_field_bytes); - assert(valid_signature); - let valid_signature = std::schnorr::verify_signature(pub_key, signature, message); - assert(valid_signature); - std::schnorr::assert_valid_signature(pub_key, signature, message); -} diff --git a/noir/noir-repo/test_programs/execution_success/verify_honk_proof/Prover.toml b/noir/noir-repo/test_programs/execution_success/verify_honk_proof/Prover.toml index 45a84c26eb8..33b300afae7 100644 --- a/noir/noir-repo/test_programs/execution_success/verify_honk_proof/Prover.toml +++ b/noir/noir-repo/test_programs/execution_success/verify_honk_proof/Prover.toml @@ -1,4 +1,4 @@ key_hash = "0x0000000000000000000000000000000000000000000000000000000000000000" -proof = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000005a9bae947e1e91af9e4033d8d6aa6ed632", "0x000000000000000000000000000000000025e485e013446d4ac7981c88ba6ecc", "0x000000000000000000000000000000ff1e0496e30ab24a63b32b2d1120b76e62", "0x00000000000000000000000000000000001afe0a8a685d7cd85d1010e55d9d7c", "0x000000000000000000000000000000b0804efd6573805f991458295f510a2004", "0x00000000000000000000000000000000000c81a178016e2fe18605022d5a8b0e", "0x000000000000000000000000000000eba51e76eb1cfff60a53a0092a3c3dea47", "0x000000000000000000000000000000000022e7466247b533282f5936ac4e6c15", "0x00000000000000000000000000000071b1d76edf770edff98f00ff4deec264cd", "0x00000000000000000000000000000000001e48128e68794d8861fcbb2986a383", "0x000000000000000000000000000000d3a2af4915ae6d86b097adc377fafda2d4", "0x000000000000000000000000000000000006359de9ca452dab3a4f1f8d9c9d98", "0x0000000000000000000000000000006cf7dd96d7636fda5953191b1ad776d491", "0x00000000000000000000000000000000001633d881a08d136e834cb13a28fcc6", "0x00000000000000000000000000000001254956cff6908b069fca0e6cf1c47eb1", "0x000000000000000000000000000000000006f4d4dd3890e997e75e75886bf8f7", "0x0000000000000000000000000000006cf7dd96d7636fda5953191b1ad776d491", "0x00000000000000000000000000000000001633d881a08d136e834cb13a28fcc6", "0x00000000000000000000000000000001254956cff6908b069fca0e6cf1c47eb1", "0x000000000000000000000000000000000006f4d4dd3890e997e75e75886bf8f7", "0x000000000000000000000000000000f968b227a358a305607f3efc933823d288", "0x00000000000000000000000000000000000eaf8adb390375a76d95e918b65e08", "0x000000000000000000000000000000bb34b4b447aae56f5e24f81c3acd6d547f", "0x00000000000000000000000000000000002175d012746260ebcfe339a91a81e1", "0x00000000000000000000000000000052eebbd1f6f7554e837f60c44000ed14b6", "0x00000000000000000000000000000000001c1c045a3ec94b8801f2272cc0b3f4", "0x0000000000000000000000000000004d2ef74134578f6b431a9df071ffca4292", "0x0000000000000000000000000000000000291326ade7aa6f0dfc8900eab5580b", "0x0000000000000000000000000000002433eec6418a6dba820c9527e2581fc8bc", "0x00000000000000000000000000000000000e88b7daad19af2ac2f9bdf9e50ee2", "0x000000000000000000000000000000dcfce2c427155cc3e4d035735d3dd5ece8", "0x00000000000000000000000000000000002d7d473cac1a15d0fee8b22c1a7b3e", "0x1a4249b90be4602c8ff40c7c276160ee41b2a0f8a238ce7706e9face2db03d48", "0x162204b9d54d3ffd285c393a5a1ff76ee681474fd780a21a3cf7fac5c24fc2b9", "0x30279eb953d8ee79b2155c69c04e6443c5de6bf7e02886256dd7b3cd3c9502a4", "0x0d32c1bd21baf43e72d5d82d461ef54833807ff81a877adc822f27a6db88d754", "0x0fe15e055c0803d5ebe6dd77689b70cfd82138f008810ce24535c992daaff27d", "0x1fba82c012671212ce2fc13fd09bf8fba4f7d5875ab8d37495d1ccfcff287331", "0x090738a5842fa4d2699b3726aa0dd97cb59569b4be2c6825335ec4969f859dc2", "0x0c6cb72dabbc28abcf4a50c203534e066c29f48c24ca64d672092f263df3f9d7", "0x0f27fbea0d9145f815c288b50fe7e8c10b8185d325b5264624fd57102855d05d", "0x2a815cd3fd1c43c72ee0130465250ff771d1e7be2347e4ada331b83265a03450", "0x148b4ecf2ad7ed17409417086867ee27bc1b0906dbc9cbb3714c285071e2db70", "0x08e700a42b1d6d36ee65f8ebedf47d3a44463ff9fa579dce13b7492e20142c3a", "0x2e23c69521d572ff2152c50f8c9a9191535f4cf37f95f1e0428692e78842b642", "0x14519e0354365923fb41400c19866135b45e975d56a0980260bc99f0390b1d5f", "0x04caded1f05738f736cb5bcf08d785e395e58eb7738523a20638aa16bc51593e", "0x28787eaccd38383215ea21ec02895c32d979f68ca155f534a2e2d377bff6698b", "0x20a1b81fa96c58cf11c5762c5ceb731efdcb081fca2d34d5c463d2cf40e6da18", "0x11789a06fe3bf53833741d180f068d29534d5bb58a5c64b8119542e62b189fb4", "0x23d00fcd032ace719ffcbc513bfa177a55b04377d76455c2788d999d05d011e2", "0x01f0e81b57b4a73cc118e51ede18f8724debf25c2d109db6ef45280f99f1a3fa", "0x156d1c9b61749810de728f259c2c1c1fd4dbff97101426e26087ca461c93307c", "0x1c5d619ac3a478cfd06d5eebfd879960bb321236be173813f5e78d1366d32c69", "0x250cfae4e1dfc551406f1f3d10b649a637dcb7bcb0f6f697994cf96afd35d0c1", "0x242b999f58cf5f53c874d1092bd38725aa9ea076f5bc8f176efa9ea23393874b", "0x2e15748255c4a5e0e9fe38047341b692a967257de27a85a3a38681bc9f1602ea", "0x01ef83886ea7017253699cb6371988eb8e21b4f7023d7479ece4907fe6d4a6fd", "0x08db2dbc271e375b9312f695c59c48f313235b3432cad50921c8d9ad6dd7ad7a", "0x199309f2c2cd45c15a4abb0e6554a1615ff5a6e9488a8d900bbf835fc8f664ef", "0x074be7a3d88e31ab1b59c9208c012bcfb1f85f351c709e68134996891db52b57", "0x301b1011354d2ebf46134fc4d6d734bb6ed8542d719f38f5e09a376a580cad7f", "0x12968f3eccaa27e44f14d5aaac6ecb70c00d040e07536292e685d7cab03fc563", "0x2110a023c8c22fd2ed70270a2d0a265b92a32ce2217ffe1be9a5d7d5c25f512f", "0x1e8cf4c60c53900f0430d5b44de5804fe8b38299bc803beeb4216e1a289cf624", "0x12301cb908ccb28a2616e29b831ec7105b5d3ebf45ff5fe91d50a9dd53a50b52", "0x0f1029ed107d84ff2d6d4a416cbd01da3f3d7bf5b2209ce93ba424f4b85616fc", "0x1b431d016611b8abd684afd9e92331c3325967b1116bfa91d4f44e2f8e2c9fc2", "0x281e335a0fd117064c8ace3f01e02b134a19e9b9220571ebfaaaa0e3a12d34db", "0x22559c106f77e2ae95677d5e38e288343e3b7168371aec7d3aaab9ef8150af70", "0x13f113b1d9b590149cf08c3f6e90589cda5c7b98528866b891256cb9d5d814e7", "0x10252ef388e4c80246962e98b9e976fab2cd25e1e6f1e3fd2a7d4786c5218a97", "0x16b890723dfdebd9912a9207255f95cb800222165b6fae97ec46e461f23e83f3", "0x25caf77c7d2e8e069341ec90f3c8f6d64319cfd2d77cab0625cf0377285ba11c", "0x016c84288b0bc3c50eebbe250cdd5a4ee50b2c65a24ac64d0c930cbdecb95141", "0x20a537c045b069d47dc6315f45b391f60681222381e5059ec7c8b17bf677d911", "0x2594c0edfcd4064d215a3d797bc8e3b2f401c61f3961ae96ccbec8f8fd29e81f", "0x1c831d7047483ca00ed59bdb84c47ffb8bbebbae92aa164c7b35fcffbb8a35d3", "0x2ea7f60de52b8cd6b0bd06f861fc1f2c5ed1d1fbfa53caccdb836400a03df434", "0x275c6c8bd115f7d2ce196439e2330fad305c6745bab0bf1ce3f2fa32dadc3c43", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x2b3f4e210619347288731e7f0eea1ae60dd8696fe87319044864d099a03a9536", "0x0fecd3d2aebedeb8be2b0b7e3a74de9ec8bd2cb72851541463729e0715aef48b", "0x10bee385ad0c2cd3ff88ef4d630840749e4367f9add4a300fc4f545a7778e92c", "0x1fe792730eeafbd22c4eb80e86e2b40108b1e55b2a08db786289eea5745b9e3b", "0x04d411679da432816b213cd5580dda1fd6c2f258684c036be19b5b26baca583c", "0x159f17b655d2b8a803e0cfb564918628be52d3baa950ca1b127854491624f8f4", "0x225340463867d9252a1269013536e2e1dd219aa18eadef13c324b63d44679334", "0x1885e231554e02abb40ed54b72ebf09b883d0298a6bc06fc645a30365f370ef2", "0x233344517f25170972b8ba35d01f2df2e073d322993abce7df26796126e93498", "0x08990e8faa13b18b4433ec417c5cc596885e11ffd372d5f612c08cc79a5d5c80", "0x1e960a0c892b755c28e21dcbed816c1b182d7da43bae07f8ee622bd4485f79e7", "0x27b58e2ee290a179d349ace82752528b2ff946d60c092b99ef42f53c25d0c99f", "0x2a5cf8a3193107d982edd253002c7a52ab876b445dde8307ab78fbdca022d93c", "0x2b1ab4d5277f8c82750c1c7bd043889b71465ec64a9afc1bfa37d06b1ebd0725", "0x2a0dbf5c4373a58a83d5f2a031ea0615bf12800e33b70c3191a7cbb15966ced8", "0x1f272bb4a19d14a0abdfebc9fc83125e10623b9aef730f8d25f2bf5bead38ea9", "0x2c2339cf0ae7aff56091a568c1e2c3f01f52d8ed13400737fd31eaabcaffb9bd", "0x21f5fefe6b5fa0b5da71089befb74a1a39e52b4f830cb330c3c284e154614dfd", "0x1e6f6ba4b2444586b380dc4e2b3fad111ff1f4754420a846f53ea0789ebfb0ad", "0x1193d170b0b2dd0c4a04331a4b4aa3f12920f182ec3ab547837e30f1116ca584", "0x00000000000000000000000000000025704a15c9e2ce8a69558e7bbcdcbc7784", "0x2e5d36112770fb6c985681cafe40a8c99ad13f702309e7969801dd0ed080e727", "0x0eefc2585f591bb457183134e19ad643966272234d645514bf7868d6dd8ae2cb", "0x300803e4e2339ad39b9c31f228949bbeaf9c74b7101e7be1930b088126247eaa", "0x2bb562a50ed944b438b83b01f200101a34faef7f296a75c84c731755ebddbc1a", "0x1288e0b9c742af39cbcac21357c1b29511b0bbdd3d0e3cf5e14b2eef68a28ab3", "0x20f089131cc96d86ff1cfb67fa3f51670f4bad30158751b2587354bbec76cdf9", "0x1a26c6d3e633f9bf8434cf755b5f1217dad0d455071a97a7bcf85b824f5cf07a", "0x0d7e9b8a51fccf910ec25bdbd13e70b34bd6ea6f4d629fa744f9cdf5f2beb1cf", "0x0b40f28ce428e64df9cf5a024133fc420f39decf5f6af020cc3211ab298d4631", "0x0ca4f189dde7a55fe829f46681232904f6670249a22e0deb47222bd309523a8a", "0x2c544f2e31143783977645edb2a6bdb39b875053963bfa1a5b3ae9de204a7ebe", "0x00aae4454eb48fb18ff60db6b9d015abea2e770a2f7d86d121522b834c791ba5", "0x07d74e351fd4cccf4e18475d25211efa8a359066fc693a5c8505ddb507e4b74b", "0x07d74e351fd4cccf4e18475d25211efa8a359066fc693a5c8505ddb507e4b74b", "0x2d9e5bff47207d82533e2445959941181cc890c5779bc7f24d6e8a7b9e425b5c", "0x0aea3c0c317c441a5775a9849108d7a6889b39128235f717b09b184aa08e4eb7", "0x1ca5bc6fb37c55a562f4991901c39902f42d14db71284116df74cb4e7d55e493", "0x220fed26d64cd69f40e6d145a423e4a3c8cd0dce747e7d51647441270ad4d774", "0x15be574c9358889257aa2a30ff7b5fcc31a57da7032296e2c1201c49a44bbdb6", "0x2de539925525bedd3b7f43a9c6bf0f713151a17f79ac7ff4a9cd27b15ffe892a", "0x083086693dbf465211741e2cbff70ff38eb08383faf22d397eb2742c8ad7396a", "0x1fdfa258a890598816e807c50058d7a1462edd5ff196a2eae0f862e454b49aa1", "0x10c434c6daaa8226fa8e3e302123dfdc4455cf68063df518949df5a65a945213", "0x0000000000000000000000000000006472a7874de2c454a4591ed7784df1c104", "0x000000000000000000000000000000000008c46ac53d2c4ad0c26a5d6c790082", "0x0000000000000000000000000000005e422f9cfb8725800de60dfe0a8d4104c0", "0x000000000000000000000000000000000000f10fd4e4de81a0c00073ec91c274", "0x000000000000000000000000000000b20813090eca76bc6aa4a699b1ec8d5d6d", "0x0000000000000000000000000000000000292cc9f8a744eb00e0903c29ce87a7", "0x000000000000000000000000000000350a368b415fbb99fa90a26a42b1a3affd", "0x0000000000000000000000000000000000280eb9275cb05a3435f464d1dc369d", "0x000000000000000000000000000000280df6505e20c7725fe6d29439f96ee05d", "0x000000000000000000000000000000000017ef5033a08535451e2747827aa94b", "0x0000000000000000000000000000002f9ba89ae91b4e4a4ff8ccbd0526faad2f", "0x00000000000000000000000000000000001c2013561dafcc02cb03220bdf23c4", "0x000000000000000000000000000000aac102c400f9e5da0321ded4510994434b", "0x00000000000000000000000000000000001ec8ab9cc834b492fde124962f04a1", "0x0000000000000000000000000000000673dbd698da8b8cce450d2a083aba9987", "0x00000000000000000000000000000000000a49e55bb040249cb41c63cea901cd", "0x000000000000000000000000000000133d92af8d76ee0c74a12081ee7b2ef8c4", "0x0000000000000000000000000000000000240f552d1c6cbb007650e4b142e0a5", "0x000000000000000000000000000000e29c6e7d982ec08d51c79d6261c28d742d", "0x000000000000000000000000000000000021baeec04d9be419c923626034e7b3", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x1e940a528b42d8230e7d4dff76262a80986c0d00b2c02a9bc0559e36212d1547", "0x1ceccf21ac39f70d76ad6f7fe0dcb33b6af04555a0b1959e4714d65925e4e253", "0x096139d757046cdbdb7ee89a95f112f70882a43a46c2f739d9be115dda013420", "0x2f9c8ac67c7825b08eff0e7f7656a671f4c64e5601f2efab35b1b795801eec04", "0x2077e648e1704851cdffd7e6e56311634a7b741bab77ca34d9dff12a6a2bfe99", "0x115d48c4a97aeb3c447a060f9e0d675b0dc7f4a05a3f5776e2f279f3a165d7dc", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000fd38c45c3ec5b841482a80e3a56ce82555", "0x00000000000000000000000000000000000ad70b03f092f60af3e0ce1bb29d2c", "0x0000000000000000000000000000007a184d5342c90c634c0b1a050f0b97c9fb", "0x0000000000000000000000000000000000271f42abcb3bc1f0332e4b3ca85e1d", "0x0000000000000000000000000000008256322bbe2c1b8cd9d84e5ff6123477f2", "0x000000000000000000000000000000000025cab962761681dd9547f4c78814df", "0x0000000000000000000000000000008c4234510e5825c02b9ac427bcbf8e279a", "0x000000000000000000000000000000000013a14e0d7fc073c44643af38cc5396"] +proof = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000005a9bae947e1e91af9e4033d8d6aa6ed632", "0x000000000000000000000000000000000025e485e013446d4ac7981c88ba6ecc", "0x000000000000000000000000000000ff1e0496e30ab24a63b32b2d1120b76e62", "0x00000000000000000000000000000000001afe0a8a685d7cd85d1010e55d9d7c", "0x000000000000000000000000000000b0804efd6573805f991458295f510a2004", "0x00000000000000000000000000000000000c81a178016e2fe18605022d5a8b0e", "0x000000000000000000000000000000eba51e76eb1cfff60a53a0092a3c3dea47", "0x000000000000000000000000000000000022e7466247b533282f5936ac4e6c15", "0x00000000000000000000000000000071b1d76edf770edff98f00ff4deec264cd", "0x00000000000000000000000000000000001e48128e68794d8861fcbb2986a383", "0x000000000000000000000000000000d3a2af4915ae6d86b097adc377fafda2d4", "0x000000000000000000000000000000000006359de9ca452dab3a4f1f8d9c9d98", "0x0000000000000000000000000000004ae614a40d61d28f36aaf03d00a064355d", "0x000000000000000000000000000000000010edd34b6c69cb31a6a833a1d040d2", "0x000000000000000000000000000000f4976ee83b95241474007fdc30b06ebdd7", "0x000000000000000000000000000000000019cd0d7e4577008a8335c6260be826", "0x0000000000000000000000000000004ae614a40d61d28f36aaf03d00a064355d", "0x000000000000000000000000000000000010edd34b6c69cb31a6a833a1d040d2", "0x000000000000000000000000000000f4976ee83b95241474007fdc30b06ebdd7", "0x000000000000000000000000000000000019cd0d7e4577008a8335c6260be826", "0x000000000000000000000000000000f968b227a358a305607f3efc933823d288", "0x00000000000000000000000000000000000eaf8adb390375a76d95e918b65e08", "0x000000000000000000000000000000bb34b4b447aae56f5e24f81c3acd6d547f", "0x00000000000000000000000000000000002175d012746260ebcfe339a91a81e1", "0x0000000000000000000000000000007376c0278bcc77156c008b389f6bd12e8f", "0x0000000000000000000000000000000000176ebed74bf3b57ca42a2fac842809", "0x000000000000000000000000000000fc4a601439d45b9ce23c9d9cc37cb21dd2", "0x000000000000000000000000000000000017dc6f8c53261c44cd0348a9970d88", "0x000000000000000000000000000000292042e9c3c101d8dd41b3acfc0db429a2", "0x0000000000000000000000000000000000114f6b3755c65915e12f13533cdd41", "0x0000000000000000000000000000007bb311a6bd5f4f3d543ca30a1a0201614f", "0x00000000000000000000000000000000000871a5a04dda33543cf59b3babf733", "0x03ecb02e48ba68818287222348fc537135b6426d4580ea31cdd540250a7a95fb", "0x2c779e44987737a835c92393388504ebf27da5db3438865f760cb56ee5856a06", "0x0ac17380181974c0082ef0fada047fc7906a94dc18e5be249dd29e52961522e0", "0x206c623397f11ed76a292c7c605fe56c1ae4f6babb6889786aaff461535cf79e", "0x11dfbe6d0977046fd72b55bdb9b41f983fc06ea6404cb36efdf1786d6f0dcbf7", "0x1081a4f21029bfcf4f8388257bf88d932963b2368c4fde96836fb6f023f16622", "0x2e981de982d368f04b0a49e537a05ed5583080c3eafed9617bd06e1214641be9", "0x2571d21e04b1d59935490270a4789e53042f18e15fc7b94dfd267c8deadfc74e", "0x0f70f3f5319d3564bcc6fad428552eefce8f341ced5187fa186d0f099315f225", "0x18f7ee010c96f63d18d2a277e5f5a8ef19b525907817d69616d24495ad804021", "0x1cf7e347bae24a2c1a93b5fd11ff79e68bd2c1bd32056df6d2e1582d17db1d8d", "0x01c451a702451ea9871b7e19d3e2052d8fa49a571ae46616453f27d324cfc907", "0x0614dbf2404cb5fef2e5408f1115502954097981a5ea67d1f80812fa247b1f93", "0x09884374bb354fdb4b118f4da44cd37e75ba7a655201f94cc4064acbdc35887d", "0x158211f68576bcafd791ff02039bb8246b1ba94d99f30a0f282565dd8d82ce0b", "0x0a5231e4039c7b7e0ad77d319958403997a33a0be31e71032733cd70067b14db", "0x2803fc0a9f60d9e202eb6caddcacfbb94a5a7df2695c2a0c909815093ca1864c", "0x0faa80f3cef0e86746df7518f865936959d65eb64ccb05bfb574ac5561683eae", "0x298544d77ee6f4cae7aaa4e9203a233fa18dab360d6f54daf9f8801802586d58", "0x0ba76e9cadf0380b82a3b5ec1c71b80295ce3caeec73aefecffed90f28c1b012", "0x0d965885fc07c4a140f50a83cb750c876191651ee47462d0931e0e67bc9ab5cb", "0x0aad443f96fbde49595f31a47d233ca83ed2bcda86801a8fd7a596ea666c7716", "0x298ef11d346c061b8899cb10c0cd7150aa2d6c554340cf2ee6aa76125e7d1e7f", "0x27518b0512f1efb3a79650941d3adb015b357c92a8c06e086be7b3e7666cea47", "0x0cd6b10a38d5af7f0a5fa97c0ffcba406e8a65a92fe050b3b79f3f1f45d723e2", "0x2f5e1210a841f9c6a7ee7d7f290479696387a58192cb775a64adf0dc225e3d4f", "0x2ffd390be1aecefc25137d01e5b7a85410254ae9e21e7067a9869217cb828ee1", "0x244a77246b5beb3e0e38c8dda39a516050303e83c051300d08bbe5450320b47f", "0x16ed38ff1019df1d168974833ccc96d8648d05c2823021d45e1d5599998a8aec", "0x24cbbf8ca1a5bb082c1081d9252a5e964ff7aae4d83e04468db55960b80a585f", "0x01b3a78bcc6e7529c6ded587b8958d903ef990421d5706afbef64a7976a51084", "0x2c3a013cdecd027b32c8c99c163dd822df374ef018aac8f3d1fb8d57335f9503", "0x0ad83466928e5d70e1e0bb26633a1e0c61399733c15fffafb22df18029e583d6", "0x095023de752480ca3edd408d3c34d732bd9836919e84931d3f42a978867bc53e", "0x283d221f0a2e6b6616bc3eda23e15bb8c8b459010014db7608e646c70ea1da2e", "0x1390c81536ca3d71228eeccf9844702aa3df012bbc3902fe30323f55ee8c7872", "0x0ef66f0302753884f05043080104589e1bf036566a9a00d4688d3c7910631508", "0x15eceeed97d9267597c028fafac72dba40f3ea441880bdd2202b30846a243044", "0x2b38e3f3b5193811df1bafd58432d5abd1c5f575a5d9c2a449682a0f2f035034", "0x2bbcc40d11d6a96c85a63162143ec53314573bb0af7c32d89b791394c80d14a5", "0x22d909e8fb5152b5b98f7cb3fc38f4ef7d7e8f2a857347da59ba2e979bd2ec96", "0x29e3f7a95437fe6ea1e72cd4c7c2fcf1892ab22ba69387f1a6a795e91bcc26f2", "0x02d8c8d031ada707d85693ed106135cecb7fe52de73eedbc54a91a2c856d0de1", "0x28020fb768c50bf52497832c04fb0e14cdb651b98b80864d0b68228ddfd922a0", "0x24d61051f82ff93eb42b5afdcad9e236c669f9f849bf811a853f1e9cc302f8ce", "0x250e89de38769cf70e6cb3685f99e39f44d8ebc1a468930f49e1d80342092b6a", "0x0ad45df677495b9199c57f620db716c543fb6437d574453b7721c2faee6316ba", "0x043d8715e16e3f2dc5a537355c0576254a36db25002f13958696ed13c24add46", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0bb8cb6a256f110f134a15b66b644eb49dc8e0239f92489408e6265a323bb513", "0x18f02f61683cf6a7492291a7041ee1b3cfa8dfb5aa40e2f6571d13750f0f459a", "0x0a982c10c93ae173751f4165e6456c9b85e2551bd503919acae78c801ccc0e1e", "0x0b6e6266bdc6d44d05ae76d2db249877a46ad978fc758654a3a6a7208d2725a6", "0x20de00721f30db8280aa6804c90f3fbe23477e1f746a8eff61c4c5b2af7e821c", "0x1321548f766ded3432627a50704d233455c61d8e59afec2883dbe2f381c033f9", "0x00c56c902b14aa59f6f59badf20f59c51b08aeb6afbdd97a5ac7b98b998b0a56", "0x1745c01290e99476fa655e5fcf2e5b3d24f42624cbd25a40f60af3f3e8489512", "0x08e915bebf8f6c86b332a681d35c57dcd0e0804f22e4e78884ab5edc0a41d6d0", "0x0c77b29e3a0c4368ce5231f94d13fa9b84a6e350cc8f2a57b3f6920a2bf0e879", "0x07ab821c4f07e1dd1cce43b9d9dbf4c9da2e22fea675a57ecf5a47a6992059a2", "0x0bcf85d1f4e34e7598a68bc09cfacf119b0afa1193ad4163096e44ca8eef7a22", "0x0c8a367da01b9097d24eb7b5471c6bd049f7938080bb8cc6fb92945fa934faf9", "0x2cda5caa3a93dcc134cf176f4ad6c79577d273bd2706da3fcaad92a9bc336ac8", "0x2c19cbfce048ef9bb9efb5b9875645b0bc7825aa1a05ad71dbbd3a34d1d76501", "0x28d7f11c2b6b7ff8717b79b098e5bd37eb39a8ea5d03b15339c86fb93e497d97", "0x21ba86c3baacb0fe4270c64c1a5f2861af2f5aa1d6391afe8214e1ce9eac8dfa", "0x0c5289ff2fe581ccf0caa97b4041d381e384c4aef0417edd4dafa7f64a3bfa6f", "0x0c744b0b301542ec4f334696945d7b89b137c5b9434bec277dc938c3dc9ca7aa", "0x006d246e7b0ad18157fa925981f097121fe34cc769128fd8993c4d15cfdf0aee", "0x00000000000000000000000000000022a7ebdc5723cfdb5d73c4c0392e43c407", "0x160d495d0b4462662665faccb1d65d81f0c3f006254a6082a0ceffc49483d76a", "0x24a5a2b9bef1abc3a818d2f27ca5cca7e1b3da34ea6056f338ac54638e26c3b0", "0x0a3dcf45eb6c14391ed8aeab11cb9460f85cb11a1ecb868ad75095796c0f5dac", "0x160c8087a99bf109389ca20d0ce624f71dd2e40fe64d62712e45669ed550fd61", "0x1a65519621040c52fdec5594d095add265c99210929eeb29a3a8180b480bb313", "0x09bf095c40c00dce181347b0d8eaa83ecd0f1f8fcb5dab34ffe19e219672e681", "0x10f3444d7a623e54ad2e882c436191975143217e9f8121c8770a3bbd3ec183ce", "0x0cd68d59322f30bdaf0a6a628f095f880ff716b157ef9a2d589f2cfc40b53e3d", "0x20732eab49adfd109626e0e84496a929a690377e98ee03f13f66ad4541949300", "0x28c850b8bc7f6ae88835bed342eda477e8d1f013a4db34b7ff33198e0a9f8e09", "0x14d234765f29b713df4d1291d452c73a5dc00458242df1be96e04ffb0a3c396e", "0x162572b68ab59291f430cf3113d4fcd3ddca59c4808c134345f6765693f8e1ce", "0x0bc37cb2ffd0f1691bf4d8c621d49f8c23ff58989d09d96c019cc6fc9a46e155", "0x0bc37cb2ffd0f1691bf4d8c621d49f8c23ff58989d09d96c019cc6fc9a46e155", "0x2aa58bd9f811c2970dcefde8c31c2c6db2349eed5161f80c0280a3acbd9f4f0d", "0x141198df3b9c1917d2e7a136ca3438fd9630719591c24388a0559873756d288b", "0x1975864b97d6ff0ace3d600020772ea32181c2f3e413ae67bac22e4a3bbcba9c", "0x2023d432e6630619c99c25a2f293f5ed78f373ee5212bff02b92f00a43bab0e0", "0x23cbaa3113b7265b926bc8811fccce701b3d4e4006ae6b66cefffd0e2f059fd4", "0x00000000000000000000000000000061e09b904168dcad01e82d26f8a21bb884", "0x000000000000000000000000000000000027a29682b86d1b09daa382868b245a", "0x000000000000000000000000000000efc6d7071b6c8cf492bc3ba72f4eda84c5", "0x000000000000000000000000000000000010860d04901949ad63a94863c77149", "0x00000000000000000000000000000036cacf503222db1b5d0edd58aafc1e74f9", "0x00000000000000000000000000000000000fef16ca13117c1f45f6df0782c273", "0x000000000000000000000000000000013704a507a82f6224d7c369d3d6c3929e", "0x00000000000000000000000000000000002887168ff50b7339d4d181d2a84cc0", "0x000000000000000000000000000000e57f500eab5f7d08ac3c93ce080dc1f15e", "0x00000000000000000000000000000000000c720872540cd88fec315c3e6a7625", "0x0000000000000000000000000000004b6897120d1858d29ac10cba52cf73dc44", "0x000000000000000000000000000000000019a9523d9a2481b5dbb1c23cb9686e", "0x00000000000000000000000000000052442fa24d3d5c3b9a608d8259757905a4", "0x00000000000000000000000000000000001c58b3787ffa3edd9f049c1c775a85", "0x000000000000000000000000000000f5737a5b8d278973356217e75bdc986ea2", "0x00000000000000000000000000000000001e0959f30c996ac7e3b265bac2de9d", "0x00000000000000000000000000000030122ef6c7a097b6b2ea6efa763797b8b4", "0x0000000000000000000000000000000000191344dd8af6c1c1c3beef933de271", "0x0000000000000000000000000000002f38961e4eb47676a42a5b59457e19a7b1", "0x000000000000000000000000000000000002936d1fa64f399018fbf60a1f2001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0f349727b02c8c3916e6904450b4db7d748c746d693f12acfd44757e349ae543", "0x109b539e615d399af085519623a8f0ea43fd3e672e8b3397deb033110b896ba7", "0x1d2d7546c079198782bc8c1ecf377c86567d90d05988acd013af254a84ccfca2", "0x11922ebe299248b1a194ff41750bbad0297b8e4db3944036983764ba171195a1", "0x14cb035cb0d920e42127d67ed6763fd0cdadeac07c0aa57ab5c038a501aca88c", "0x2e82b6bc3d9337d1f2c080ed47e935308317c159408ff3a054718e737f827a49", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000c883c136e90256f3059fb812416fe61171", "0x00000000000000000000000000000000002cbe86e3f824a75195f942b5de0abe", "0x000000000000000000000000000000ff2335151394b16f671dcfdc5ee78485f3", "0x00000000000000000000000000000000000fceb210dd93cd99b7bb225af47ae8", "0x0000000000000000000000000000001a95675079e3f1508e636cf69b7978db7f", "0x0000000000000000000000000000000000079f7a59ed7b4a3dda951fa8fbad98", "0x000000000000000000000000000000b15ed33e983574376efe5ae0c29c6bdd1f", "0x000000000000000000000000000000000004031f5fd23cf82aad9e5d0bfd0363"] public_inputs = ["0x0000000000000000000000000000000000000000000000000000000000000003"] -verification_key = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000004", "0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x0000000000000000000000000000000000000000000000000000000000000007", "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000009", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000000c", "0x000000000000000000000000000000000000000000000000000000000000000d", "0x000000000000000000000000000000000000000000000000000000000000000e", "0x000000000000000000000000000000000000000000000000000000000000000f", "0x0000000000000000000000000000000000000000000000000000000000000010", "0x00000000000000000000000000000060e430ad1c23bfcf3514323aae3f206e84", "0x00000000000000000000000000000000001b5c3ff4c2458d8f481b1c068f27ae", "0x000000000000000000000000000000bb510ab2112def34980e4fc6998ad9dd16", "0x00000000000000000000000000000000000576e7c105b43e061e13cb877fefe1", "0x000000000000000000000000000000ced074785d11857b065d8199e6669a601c", "0x00000000000000000000000000000000000053b48a4098c1c0ae268f273952f7", "0x000000000000000000000000000000d1d4b26e941db8168cee8f6de548ae0fd8", "0x00000000000000000000000000000000001a9adf5a6dadc3d948bb61dfd63f4c", "0x0000000000000000000000000000009ce1faac6f8de6ebb18f1db17372c82ad5", "0x00000000000000000000000000000000002002681bb417184b2df070a16a3858", "0x000000000000000000000000000000161baa651a8092e0e84725594de5aba511", "0x00000000000000000000000000000000000be0064399c2a1efff9eb0cdcb2223", "0x0000000000000000000000000000008673be6fd1bdbe980a29d8c1ded54381e7", "0x000000000000000000000000000000000008a5158a7d9648cf1d234524c9fa0c", "0x0000000000000000000000000000002b4fce6e4b1c72062b296d49bca2aa4130", "0x00000000000000000000000000000000002e45a9eff4b6769e55fb710cded44f", "0x00000000000000000000000000000072b85bf733758b76bcf97333efb85a23e3", "0x000000000000000000000000000000000017da0ea508994fc82862715e4b5592", "0x00000000000000000000000000000094fa74695cf058dba8ff35aec95456c6c3", "0x0000000000000000000000000000000000211acddb851061c24b8f159e832bd1", "0x000000000000000000000000000000303b5e5c531384b9a792e11702ad3bcab0", "0x00000000000000000000000000000000000d336dff51a60b8833d5d7f6d4314c", "0x0000000000000000000000000000009f825dde88092070747180d581c342444a", "0x0000000000000000000000000000000000237fbd6511a03cca8cac01b555fe01", "0x0000000000000000000000000000007c313205159495df6d8de292079a4844ff", "0x000000000000000000000000000000000018facdfc468530dd45e8f7a1d38ce9", "0x0000000000000000000000000000000d1ce33446fc3dc4ab40ca38d92dac74e1", "0x00000000000000000000000000000000000852d8e3e0e8f4435af3e94222688b", "0x0000000000000000000000000000006c04ee19ec1dfec87ed47d6d04aa158de2", "0x000000000000000000000000000000000013240f97a584b45184c8ec31319b5f", "0x000000000000000000000000000000cefb5d240b07ceb4be26ea429b6dc9d9e0", "0x00000000000000000000000000000000002dad22022121d689f57fb38ca21349", "0x000000000000000000000000000000c9f189f2a91aeb664ce376d8b157ba98f8", "0x00000000000000000000000000000000002531a51ad54f124d58094b219818d2", "0x000000000000000000000000000000ef1e6db71809307f677677e62b4163f556", "0x0000000000000000000000000000000000272da4396fb2a7ee0638b9140e523d", "0x0000000000000000000000000000002e54c0244a7732c87bc4712a76dd8c83fb", "0x000000000000000000000000000000000007db77b3e04b7eba9643da57cbbe4d", "0x000000000000000000000000000000e0dfe1ddd7f74ae0d636c910c3e85830d8", "0x00000000000000000000000000000000000466fa9b57ec4664abd1505b490862", "0x0000000000000000000000000000009ee55ae8a32fe5384c79907067cc27192e", "0x00000000000000000000000000000000000799d0e465cec07ecb5238c854e830", "0x0000000000000000000000000000001d5910ad361e76e1c241247a823733c39f", "0x00000000000000000000000000000000002b03f2ccf7507564da2e6678bef8fe", "0x000000000000000000000000000000ee40d90bea71fba7a412dd61fcf34e8ceb", "0x0000000000000000000000000000000000140b0936c323fd2471155617b6af56", "0x0000000000000000000000000000002b90071823185c5ff8e440fd3d73b6fefc", "0x00000000000000000000000000000000002b6c10790a5f6631c87d652e059df4", "0x00000000000000000000000000000029a17181c7934fc3fdbd352eac5cb521b9", "0x00000000000000000000000000000000001f497cbf5284ff29a2d336e5991999", "0x000000000000000000000000000000072bd9c0c6beda1fdee6d4ff0432ba9e1b", "0x000000000000000000000000000000000013ea38a0bd2aa751a490a724fac818", "0x000000000000000000000000000000c599f63dcd3edd49f08ae5c3141c1e3493", "0x00000000000000000000000000000000002bdb36be0bea09950dd32a8ccf6fbc", "0x00000000000000000000000000000047f27f29724e7f19eba0340256a0bd4b7d", "0x00000000000000000000000000000000001c1c5ccf87a962129ca785f8f35120", "0x000000000000000000000000000000c5c71efdae00679bbe4a95096e012b1817", "0x000000000000000000000000000000000017a365de041e317817d0135f2b48e0", "0x0000000000000000000000000000008ae711ac402f7848d719c93a89ba8d39f1", "0x00000000000000000000000000000000002b6fb40ed8a1935226f4f9786a0499", "0x0000000000000000000000000000002f03a71501d83de1da5715a4e9462d6198", "0x00000000000000000000000000000000001644064443b8546f48eae693af47b8", "0x00000000000000000000000000000083763ab1b6e8fe269b2fe4c7b9c448c08d", "0x000000000000000000000000000000000021d7cc18c59676a8eeb47c0111c251", "0x000000000000000000000000000000b5f937153073e03ea7d51a996e0ebc2e6b", "0x000000000000000000000000000000000011ddd0e26457373eb06e0493177672", "0x000000000000000000000000000000c5f6eb9f6fc8fa99811a4a88c74a6d018b", "0x000000000000000000000000000000000025bcd07a0732c123567834f5109558", "0x000000000000000000000000000000aeb08a0b1a4442189448b4e97490568146", "0x000000000000000000000000000000000002a1744e4771705536a88f07e0f90f", "0x000000000000000000000000000000b938568293bd0724b0ea76c2ec34c4a829", "0x0000000000000000000000000000000000053296e8f3b9ad3af877dfa9c7c2a7", "0x000000000000000000000000000000f0ca1db6323996eba26bdc86dafef9d10b", "0x00000000000000000000000000000000001441a46c58af03d5645d52721d956a", "0x0000000000000000000000000000008bbf8f884013c66c28ba09c2fbd573b656", "0x0000000000000000000000000000000000206c391ca06fac27d1908e94570243", "0x0000000000000000000000000000002d4f5aaed88ba4f79612d53b804ca8f194", "0x00000000000000000000000000000000001674011c96392df08970fa6b7b4cb8", "0x0000000000000000000000000000009f88297c1729d76c4d9306853598c91325", "0x0000000000000000000000000000000000256f51adfcacc3c1e340be4d32d3e9", "0x0000000000000000000000000000000ab9955eec0d74eb799afed2a802b24d75", "0x00000000000000000000000000000000001fcbe43ea105b30d36ed0b21b03411", "0x000000000000000000000000000000d66b1d5433f1aa5305cd1edce7c22de466", "0x00000000000000000000000000000000002331546a256b8a3b751956806680d4", "0x000000000000000000000000000000e97954ad6cd6f45fb15c91434121db4304", "0x00000000000000000000000000000000002e20a97e09d50f227ced47e7a98250", "0x0000000000000000000000000000001ebbc27eb9ebededefba79522eb58ae89b", "0x0000000000000000000000000000000000090efa4974e566e81d1177b85a30be", "0x0000000000000000000000000000005eafa070b9c9632404052642e3bc14f9fd", "0x00000000000000000000000000000000001489068864102daca6a6b8bc4d448b", "0x0000000000000000000000000000009ebc91aaaac036a6477cadbe54e8556dfd", "0x00000000000000000000000000000000000ef6d835e2ed3343b95c82c8c54037", "0x00000000000000000000000000000033b28b529dff46e93af4e7422530478e4a", "0x000000000000000000000000000000000020a86c2f8591bf190bcddcc03c42fb", "0x000000000000000000000000000000a9679d0acc088f7dc27bf6d866bcd2dda2", "0x00000000000000000000000000000000002fb9d0d2d4099402bed74f738f64cc", "0x00000000000000000000000000000023b09f876a29a061582848a8b9a5870c12", "0x00000000000000000000000000000000001d5bb906f03f0d49e9c4791bc43af9", "0x00000000000000000000000000000017aac9854ea240d8ec97bf760c4d4ba870", "0x00000000000000000000000000000000000b227a556c414ada0dc75bb303e30e", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000009b624fa65d1a24b7f14a8f25f3789622af", "0x000000000000000000000000000000000013d47bff8c630e847b70e2732fd3f0", "0x00000000000000000000000000000061d21663e93132f32921075f4c936a84df", "0x00000000000000000000000000000000001a74ca4e118fb480b9b999902989a3"] +verification_key = ["0x0000000000000000000000000000000000000000000000000000000000000040", "0x0000000000000000000000000000000000000000000000000000000000000011", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000003", "0x0000000000000000000000000000000000000000000000000000000000000004", "0x0000000000000000000000000000000000000000000000000000000000000005", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x0000000000000000000000000000000000000000000000000000000000000007", "0x0000000000000000000000000000000000000000000000000000000000000008", "0x0000000000000000000000000000000000000000000000000000000000000009", "0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000000000000000000000000000b", "0x000000000000000000000000000000000000000000000000000000000000000c", "0x000000000000000000000000000000000000000000000000000000000000000d", "0x000000000000000000000000000000000000000000000000000000000000000e", "0x000000000000000000000000000000000000000000000000000000000000000f", "0x0000000000000000000000000000000000000000000000000000000000000010", "0x00000000000000000000000000000060e430ad1c23bfcf3514323aae3f206e84", "0x00000000000000000000000000000000001b5c3ff4c2458d8f481b1c068f27ae", "0x000000000000000000000000000000bb510ab2112def34980e4fc6998ad9dd16", "0x00000000000000000000000000000000000576e7c105b43e061e13cb877fefe1", "0x000000000000000000000000000000ced074785d11857b065d8199e6669a601c", "0x00000000000000000000000000000000000053b48a4098c1c0ae268f273952f7", "0x000000000000000000000000000000d1d4b26e941db8168cee8f6de548ae0fd8", "0x00000000000000000000000000000000001a9adf5a6dadc3d948bb61dfd63f4c", "0x0000000000000000000000000000009ce1faac6f8de6ebb18f1db17372c82ad5", "0x00000000000000000000000000000000002002681bb417184b2df070a16a3858", "0x000000000000000000000000000000161baa651a8092e0e84725594de5aba511", "0x00000000000000000000000000000000000be0064399c2a1efff9eb0cdcb2223", "0x0000000000000000000000000000008673be6fd1bdbe980a29d8c1ded54381e7", "0x000000000000000000000000000000000008a5158a7d9648cf1d234524c9fa0c", "0x0000000000000000000000000000002b4fce6e4b1c72062b296d49bca2aa4130", "0x00000000000000000000000000000000002e45a9eff4b6769e55fb710cded44f", "0x00000000000000000000000000000072b85bf733758b76bcf97333efb85a23e3", "0x000000000000000000000000000000000017da0ea508994fc82862715e4b5592", "0x00000000000000000000000000000094fa74695cf058dba8ff35aec95456c6c3", "0x0000000000000000000000000000000000211acddb851061c24b8f159e832bd1", "0x000000000000000000000000000000303b5e5c531384b9a792e11702ad3bcab0", "0x00000000000000000000000000000000000d336dff51a60b8833d5d7f6d4314c", "0x0000000000000000000000000000009f825dde88092070747180d581c342444a", "0x0000000000000000000000000000000000237fbd6511a03cca8cac01b555fe01", "0x0000000000000000000000000000007c313205159495df6d8de292079a4844ff", "0x000000000000000000000000000000000018facdfc468530dd45e8f7a1d38ce9", "0x0000000000000000000000000000000d1ce33446fc3dc4ab40ca38d92dac74e1", "0x00000000000000000000000000000000000852d8e3e0e8f4435af3e94222688b", "0x0000000000000000000000000000006c04ee19ec1dfec87ed47d6d04aa158de2", "0x000000000000000000000000000000000013240f97a584b45184c8ec31319b5f", "0x000000000000000000000000000000cefb5d240b07ceb4be26ea429b6dc9d9e0", "0x00000000000000000000000000000000002dad22022121d689f57fb38ca21349", "0x000000000000000000000000000000c9f189f2a91aeb664ce376d8b157ba98f8", "0x00000000000000000000000000000000002531a51ad54f124d58094b219818d2", "0x000000000000000000000000000000ef1e6db71809307f677677e62b4163f556", "0x0000000000000000000000000000000000272da4396fb2a7ee0638b9140e523d", "0x0000000000000000000000000000002e54c0244a7732c87bc4712a76dd8c83fb", "0x000000000000000000000000000000000007db77b3e04b7eba9643da57cbbe4d", "0x000000000000000000000000000000e0dfe1ddd7f74ae0d636c910c3e85830d8", "0x00000000000000000000000000000000000466fa9b57ec4664abd1505b490862", "0x0000000000000000000000000000009ee55ae8a32fe5384c79907067cc27192e", "0x00000000000000000000000000000000000799d0e465cec07ecb5238c854e830", "0x0000000000000000000000000000001d5910ad361e76e1c241247a823733c39f", "0x00000000000000000000000000000000002b03f2ccf7507564da2e6678bef8fe", "0x000000000000000000000000000000ee40d90bea71fba7a412dd61fcf34e8ceb", "0x0000000000000000000000000000000000140b0936c323fd2471155617b6af56", "0x0000000000000000000000000000002b90071823185c5ff8e440fd3d73b6fefc", "0x00000000000000000000000000000000002b6c10790a5f6631c87d652e059df4", "0x00000000000000000000000000000029a17181c7934fc3fdbd352eac5cb521b9", "0x00000000000000000000000000000000001f497cbf5284ff29a2d336e5991999", "0x000000000000000000000000000000072bd9c0c6beda1fdee6d4ff0432ba9e1b", "0x000000000000000000000000000000000013ea38a0bd2aa751a490a724fac818", "0x000000000000000000000000000000c599f63dcd3edd49f08ae5c3141c1e3493", "0x00000000000000000000000000000000002bdb36be0bea09950dd32a8ccf6fbc", "0x00000000000000000000000000000047f27f29724e7f19eba0340256a0bd4b7d", "0x00000000000000000000000000000000001c1c5ccf87a962129ca785f8f35120", "0x000000000000000000000000000000c5c71efdae00679bbe4a95096e012b1817", "0x000000000000000000000000000000000017a365de041e317817d0135f2b48e0", "0x0000000000000000000000000000008ae711ac402f7848d719c93a89ba8d39f1", "0x00000000000000000000000000000000002b6fb40ed8a1935226f4f9786a0499", "0x0000000000000000000000000000002f03a71501d83de1da5715a4e9462d6198", "0x00000000000000000000000000000000001644064443b8546f48eae693af47b8", "0x00000000000000000000000000000083763ab1b6e8fe269b2fe4c7b9c448c08d", "0x000000000000000000000000000000000021d7cc18c59676a8eeb47c0111c251", "0x000000000000000000000000000000b5f937153073e03ea7d51a996e0ebc2e6b", "0x000000000000000000000000000000000011ddd0e26457373eb06e0493177672", "0x000000000000000000000000000000c5f6eb9f6fc8fa99811a4a88c74a6d018b", "0x000000000000000000000000000000000025bcd07a0732c123567834f5109558", "0x000000000000000000000000000000aeb08a0b1a4442189448b4e97490568146", "0x000000000000000000000000000000000002a1744e4771705536a88f07e0f90f", "0x000000000000000000000000000000b938568293bd0724b0ea76c2ec34c4a829", "0x0000000000000000000000000000000000053296e8f3b9ad3af877dfa9c7c2a7", "0x000000000000000000000000000000f0ca1db6323996eba26bdc86dafef9d10b", "0x00000000000000000000000000000000001441a46c58af03d5645d52721d956a", "0x0000000000000000000000000000008bbf8f884013c66c28ba09c2fbd573b656", "0x0000000000000000000000000000000000206c391ca06fac27d1908e94570243", "0x0000000000000000000000000000002d4f5aaed88ba4f79612d53b804ca8f194", "0x00000000000000000000000000000000001674011c96392df08970fa6b7b4cb8", "0x0000000000000000000000000000009f88297c1729d76c4d9306853598c91325", "0x0000000000000000000000000000000000256f51adfcacc3c1e340be4d32d3e9", "0x0000000000000000000000000000000ab9955eec0d74eb799afed2a802b24d75", "0x00000000000000000000000000000000001fcbe43ea105b30d36ed0b21b03411", "0x000000000000000000000000000000d66b1d5433f1aa5305cd1edce7c22de466", "0x00000000000000000000000000000000002331546a256b8a3b751956806680d4", "0x000000000000000000000000000000292b512a940306c9b122a0feb4e9780af9", "0x00000000000000000000000000000000000904e02f0334f3a3f72e65ce82f34b", "0x000000000000000000000000000000778103226eff8f576eba0a0a2ffa134d57", "0x000000000000000000000000000000000001fe54f93991aa61a056f75e5137b0", "0x00000000000000000000000000000089058e539eb10c10fa13dd50e39517555d", "0x000000000000000000000000000000000009e91383ce6118cef78093d2c550fc", "0x000000000000000000000000000000d95e2e1bf12461b508cc8d63fee4a8613d", "0x00000000000000000000000000000000000ab28965260d651673541f10f2e02f", "0x0000000000000000000000000000008f6f361c7fe163277c1022dacf2a0f307b", "0x00000000000000000000000000000000001e47e6531c4ec673e9c18a9062c1df", "0x000000000000000000000000000000e55ba7b44de2c0927d4df995625325c68c", "0x000000000000000000000000000000000005d3e2113696d710431294256dab1a", "0x000000000000000000000000000000150b1462a7b440ef041dc9e7af7e1d1f15", "0x000000000000000000000000000000000017b03e1a64b4988e05ca4291f3ce6a", "0x0000000000000000000000000000008d494ccfb05451bea33fe43623c45a9d7b", "0x000000000000000000000000000000000001ed433638a57a66f8205daea09e50", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000f68b70e0e4b0cb9e2c7bd64fa4b75b32dd", "0x00000000000000000000000000000000001bcedd9106bdd4e13e0b751c672a83", "0x00000000000000000000000000000042fd857eb4bf620db08b0e181807df9f59", "0x00000000000000000000000000000000001ccfa89524772b4bd5b6bf6741d71f"] diff --git a/noir/noir-repo/test_programs/execution_success/verify_honk_proof/src/main.nr b/noir/noir-repo/test_programs/execution_success/verify_honk_proof/src/main.nr index 25f140a9688..bac71a580c6 100644 --- a/noir/noir-repo/test_programs/execution_success/verify_honk_proof/src/main.nr +++ b/noir/noir-repo/test_programs/execution_success/verify_honk_proof/src/main.nr @@ -1,5 +1,5 @@ // This circuit aggregates a single Honk proof from `assert_statement`. -global SIZE_OF_PROOF_IF_LOGN_IS_28: u32 = 463; +global SIZE_OF_PROOF_IF_LOGN_IS_28: u32 = 459; global HONK_IDENTIFIER: u32 = 1; fn main( verification_key: [Field; 128], diff --git a/noir/noir-repo/test_programs/gates_report_brillig_execution.sh b/noir/noir-repo/test_programs/gates_report_brillig_execution.sh index 024c7612541..b3f4a8bda98 100755 --- a/noir/noir-repo/test_programs/gates_report_brillig_execution.sh +++ b/noir/noir-repo/test_programs/gates_report_brillig_execution.sh @@ -8,8 +8,6 @@ excluded_dirs=( "double_verify_nested_proof" "overlapping_dep_and_mod" "comptime_println" - # Takes a very long time to execute as large loops do not get simplified. - "regression_4709" # bit sizes for bigint operation doesn't match up. "bigint" # Expected to fail as test asserts on which runtime it is in. diff --git a/noir/noir-repo/test_programs/memory_report.sh b/noir/noir-repo/test_programs/memory_report.sh index 1b8274b76cc..4d03726d374 100755 --- a/noir/noir-repo/test_programs/memory_report.sh +++ b/noir/noir-repo/test_programs/memory_report.sh @@ -5,22 +5,24 @@ sudo apt-get install heaptrack NARGO="nargo" - # Tests to be profiled for memory report tests_to_profile=("keccak256" "workspace" "regression_4709" "ram_blowup_regression") current_dir=$(pwd) -execution_success_path="$current_dir/execution_success" -test_dirs=$(ls $execution_success_path) +base_path="$current_dir/execution_success" + +# If there is an argument that means we want to generate a report for only the current directory +if [ "$#" -ne 0 ]; then + base_path="$current_dir" + tests_to_profile=(".") +fi FIRST="1" echo "{\"memory_reports\": [ " > memory_report.json - for test_name in ${tests_to_profile[@]}; do - full_path=$execution_success_path"/"$test_name - cd $full_path + cd $base_path/$test_name if [ $FIRST = "1" ] then @@ -28,6 +30,11 @@ for test_name in ${tests_to_profile[@]}; do else echo " ," >> $current_dir"/memory_report.json" fi + + if [ "$#" -ne 0 ]; then + test_name=$(basename $current_dir) + fi + heaptrack --output $current_dir/$test_name"_heap" $NARGO compile --force if test -f $current_dir/$test_name"_heap.gz"; then diff --git a/noir/noir-repo/test_programs/noir_test_success/assert_message/Nargo.toml b/noir/noir-repo/test_programs/noir_test_success/assert_message/Nargo.toml new file mode 100644 index 00000000000..667035339bd --- /dev/null +++ b/noir/noir-repo/test_programs/noir_test_success/assert_message/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "assert_message" +type = "bin" +authors = [""] +compiler_version = ">=0.23.0" + +[dependencies] diff --git a/noir/noir-repo/test_programs/noir_test_success/assert_message/src/main.nr b/noir/noir-repo/test_programs/noir_test_success/assert_message/src/main.nr new file mode 100644 index 00000000000..073e42daf4a --- /dev/null +++ b/noir/noir-repo/test_programs/noir_test_success/assert_message/src/main.nr @@ -0,0 +1,15 @@ +// Have to use inputs otherwise the ACIR gets optimized away due to constants. +// With the original ACIR the optimizations can rearrange or merge opcodes, +// which might end up getting out of sync with assertion messages. +#[test(should_fail_with = "first")] +fn test_assert_message_preserved_during_optimization(a: Field, b: Field, c: Field) { + if (a + b) * (a - b) != c { + assert((a + b) * (a - b) == c, "first"); + assert((a - b) * (a + b) == c, "second"); + assert((a + b) * (a - b) == c, "third"); + assert((2 * a + b) * (a - b / 2) == c * c, "fourth"); + } else { + // The fuzzer might have generated a passing test. + assert((a + b) * (a - b) != c, "first"); + } +} diff --git a/noir/noir-repo/test_programs/noir_test_success/fuzzer_checks/src/main.nr b/noir/noir-repo/test_programs/noir_test_success/fuzzer_checks/src/main.nr index 2b928db092e..70e5e29b855 100644 --- a/noir/noir-repo/test_programs/noir_test_success/fuzzer_checks/src/main.nr +++ b/noir/noir-repo/test_programs/noir_test_success/fuzzer_checks/src/main.nr @@ -1,6 +1,9 @@ - #[test(should_fail_with = "42 is not allowed")] fn finds_magic_value(x: u32) { let x = x as u64; - assert(2 * x != 42, "42 is not allowed"); + if x == 21 { + assert(2 * x != 42, "42 is not allowed"); + } else { + assert(2 * x == 42, "42 is not allowed"); + } } diff --git a/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs b/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs index bf5969718e5..d4473eb3eef 100644 --- a/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs +++ b/noir/noir-repo/tooling/acvm_cli/src/cli/execute_cmd.rs @@ -5,6 +5,7 @@ use acir::native_types::{WitnessMap, WitnessStack}; use acir::FieldElement; use bn254_blackbox_solver::Bn254BlackBoxSolver; use clap::Args; +use nargo::PrintOutput; use crate::cli::fs::inputs::{read_bytecode_from_file, read_inputs_from_file}; use crate::errors::CliError; @@ -73,7 +74,7 @@ pub(crate) fn execute_program_from_witness( &program, inputs_map, &Bn254BlackBoxSolver, - &mut DefaultForeignCallExecutor::new(true, None, None, None), + &mut DefaultForeignCallExecutor::new(PrintOutput::Stdout, None, None, None), ) .map_err(CliError::CircuitExecutionError) } diff --git a/noir/noir-repo/tooling/debugger/src/context.rs b/noir/noir-repo/tooling/debugger/src/context.rs index bec30976552..77c186fe707 100644 --- a/noir/noir-repo/tooling/debugger/src/context.rs +++ b/noir/noir-repo/tooling/debugger/src/context.rs @@ -967,6 +967,7 @@ mod tests { BinaryFieldOp, HeapValueType, MemoryAddress, Opcode as BrilligOpcode, ValueOrArray, }, }; + use nargo::PrintOutput; #[test] fn test_resolve_foreign_calls_stepping_into_brillig() { @@ -1025,8 +1026,10 @@ mod tests { let initial_witness = BTreeMap::from([(Witness(1), fe_1)]).into(); - let foreign_call_executor = - Box::new(DefaultDebugForeignCallExecutor::from_artifact(true, debug_artifact)); + let foreign_call_executor = Box::new(DefaultDebugForeignCallExecutor::from_artifact( + PrintOutput::Stdout, + debug_artifact, + )); let mut context = DebugContext::new( &StubbedBlackBoxSolver, circuits, @@ -1190,8 +1193,10 @@ mod tests { let initial_witness = BTreeMap::from([(Witness(1), fe_1), (Witness(2), fe_1)]).into(); - let foreign_call_executor = - Box::new(DefaultDebugForeignCallExecutor::from_artifact(true, debug_artifact)); + let foreign_call_executor = Box::new(DefaultDebugForeignCallExecutor::from_artifact( + PrintOutput::Stdout, + debug_artifact, + )); let brillig_funcs = &vec![brillig_bytecode]; let mut context = DebugContext::new( &StubbedBlackBoxSolver, @@ -1285,7 +1290,7 @@ mod tests { &circuits, &debug_artifact, WitnessMap::new(), - Box::new(DefaultDebugForeignCallExecutor::new(true)), + Box::new(DefaultDebugForeignCallExecutor::new(PrintOutput::Stdout)), brillig_funcs, ); diff --git a/noir/noir-repo/tooling/debugger/src/dap.rs b/noir/noir-repo/tooling/debugger/src/dap.rs index cfe33a61cb5..0d2095954e0 100644 --- a/noir/noir-repo/tooling/debugger/src/dap.rs +++ b/noir/noir-repo/tooling/debugger/src/dap.rs @@ -5,6 +5,7 @@ use acvm::acir::circuit::brillig::BrilligBytecode; use acvm::acir::circuit::Circuit; use acvm::acir::native_types::WitnessMap; use acvm::{BlackBoxFunctionSolver, FieldElement}; +use nargo::PrintOutput; use crate::context::DebugContext; use crate::context::{DebugCommandResult, DebugLocation}; @@ -71,7 +72,10 @@ impl<'a, R: Read, W: Write, B: BlackBoxFunctionSolver> DapSession< circuits, debug_artifact, initial_witness, - Box::new(DefaultDebugForeignCallExecutor::from_artifact(true, debug_artifact)), + Box::new(DefaultDebugForeignCallExecutor::from_artifact( + PrintOutput::Stdout, + debug_artifact, + )), unconstrained_functions, ); Self { diff --git a/noir/noir-repo/tooling/debugger/src/foreign_calls.rs b/noir/noir-repo/tooling/debugger/src/foreign_calls.rs index ecf27a22f29..899ba892d8f 100644 --- a/noir/noir-repo/tooling/debugger/src/foreign_calls.rs +++ b/noir/noir-repo/tooling/debugger/src/foreign_calls.rs @@ -3,7 +3,10 @@ use acvm::{ pwg::ForeignCallWaitInfo, AcirField, FieldElement, }; -use nargo::foreign_calls::{DefaultForeignCallExecutor, ForeignCallExecutor}; +use nargo::{ + foreign_calls::{DefaultForeignCallExecutor, ForeignCallExecutor}, + PrintOutput, +}; use noirc_artifacts::debug::{DebugArtifact, DebugVars, StackFrame}; use noirc_errors::debug_info::{DebugFnId, DebugVarId}; use noirc_printable_type::ForeignCallError; @@ -41,21 +44,21 @@ pub trait DebugForeignCallExecutor: ForeignCallExecutor { fn current_stack_frame(&self) -> Option>; } -pub struct DefaultDebugForeignCallExecutor { - executor: DefaultForeignCallExecutor, +pub struct DefaultDebugForeignCallExecutor<'a> { + executor: DefaultForeignCallExecutor<'a, FieldElement>, pub debug_vars: DebugVars, } -impl DefaultDebugForeignCallExecutor { - pub fn new(show_output: bool) -> Self { +impl<'a> DefaultDebugForeignCallExecutor<'a> { + pub fn new(output: PrintOutput<'a>) -> Self { Self { - executor: DefaultForeignCallExecutor::new(show_output, None, None, None), + executor: DefaultForeignCallExecutor::new(output, None, None, None), debug_vars: DebugVars::default(), } } - pub fn from_artifact(show_output: bool, artifact: &DebugArtifact) -> Self { - let mut ex = Self::new(show_output); + pub fn from_artifact(output: PrintOutput<'a>, artifact: &DebugArtifact) -> Self { + let mut ex = Self::new(output); ex.load_artifact(artifact); ex } @@ -70,7 +73,7 @@ impl DefaultDebugForeignCallExecutor { } } -impl DebugForeignCallExecutor for DefaultDebugForeignCallExecutor { +impl DebugForeignCallExecutor for DefaultDebugForeignCallExecutor<'_> { fn get_variables(&self) -> Vec> { self.debug_vars.get_variables() } @@ -88,7 +91,7 @@ fn debug_fn_id(value: &FieldElement) -> DebugFnId { DebugFnId(value.to_u128() as u32) } -impl ForeignCallExecutor for DefaultDebugForeignCallExecutor { +impl ForeignCallExecutor for DefaultDebugForeignCallExecutor<'_> { fn execute( &mut self, foreign_call: &ForeignCallWaitInfo, diff --git a/noir/noir-repo/tooling/debugger/src/repl.rs b/noir/noir-repo/tooling/debugger/src/repl.rs index 486e84060f0..eda3cbfd895 100644 --- a/noir/noir-repo/tooling/debugger/src/repl.rs +++ b/noir/noir-repo/tooling/debugger/src/repl.rs @@ -8,7 +8,7 @@ use acvm::brillig_vm::brillig::Opcode as BrilligOpcode; use acvm::brillig_vm::MemoryValue; use acvm::AcirField; use acvm::{BlackBoxFunctionSolver, FieldElement}; -use nargo::NargoError; +use nargo::{NargoError, PrintOutput}; use noirc_driver::CompiledProgram; use crate::foreign_calls::DefaultDebugForeignCallExecutor; @@ -42,8 +42,10 @@ impl<'a, B: BlackBoxFunctionSolver> ReplDebugger<'a, B> { initial_witness: WitnessMap, unconstrained_functions: &'a [BrilligBytecode], ) -> Self { - let foreign_call_executor = - Box::new(DefaultDebugForeignCallExecutor::from_artifact(true, debug_artifact)); + let foreign_call_executor = Box::new(DefaultDebugForeignCallExecutor::from_artifact( + PrintOutput::Stdout, + debug_artifact, + )); let context = DebugContext::new( blackbox_solver, circuits, @@ -313,8 +315,10 @@ impl<'a, B: BlackBoxFunctionSolver> ReplDebugger<'a, B> { fn restart_session(&mut self) { let breakpoints: Vec = self.context.iterate_breakpoints().copied().collect(); - let foreign_call_executor = - Box::new(DefaultDebugForeignCallExecutor::from_artifact(true, self.debug_artifact)); + let foreign_call_executor = Box::new(DefaultDebugForeignCallExecutor::from_artifact( + PrintOutput::Stdout, + self.debug_artifact, + )); self.context = DebugContext::new( self.blackbox_solver, self.circuits, diff --git a/noir/noir-repo/tooling/lsp/src/requests/test_run.rs b/noir/noir-repo/tooling/lsp/src/requests/test_run.rs index 937fdcc0a5e..72ae6695b82 100644 --- a/noir/noir-repo/tooling/lsp/src/requests/test_run.rs +++ b/noir/noir-repo/tooling/lsp/src/requests/test_run.rs @@ -2,7 +2,10 @@ use std::future::{self, Future}; use crate::insert_all_files_for_workspace_into_file_manager; use async_lsp::{ErrorCode, ResponseError}; -use nargo::ops::{run_test, TestStatus}; +use nargo::{ + ops::{run_test, TestStatus}, + PrintOutput, +}; use nargo_toml::{find_package_manifest, resolve_workspace_from_toml, PackageSelection}; use noirc_driver::{check_crate, CompileOptions, NOIR_ARTIFACT_VERSION_STRING}; use noirc_frontend::hir::FunctionNameMatch; @@ -84,7 +87,7 @@ fn on_test_run_request_inner( &state.solver, &mut context, &test_function, - true, + PrintOutput::Stdout, None, Some(workspace.root_dir.clone()), Some(package.name.to_string()), diff --git a/noir/noir-repo/tooling/nargo/src/foreign_calls/mod.rs b/noir/noir-repo/tooling/nargo/src/foreign_calls/mod.rs index 16ed71e11e3..65ff051bcbf 100644 --- a/noir/noir-repo/tooling/nargo/src/foreign_calls/mod.rs +++ b/noir/noir-repo/tooling/nargo/src/foreign_calls/mod.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use acvm::{acir::brillig::ForeignCallResult, pwg::ForeignCallWaitInfo, AcirField}; use mocker::MockForeignCallExecutor; use noirc_printable_type::ForeignCallError; -use print::PrintForeignCallExecutor; +use print::{PrintForeignCallExecutor, PrintOutput}; use rand::Rng; use rpc::RPCForeignCallExecutor; use serde::{Deserialize, Serialize}; @@ -65,22 +65,22 @@ impl ForeignCall { } #[derive(Debug, Default)] -pub struct DefaultForeignCallExecutor { +pub struct DefaultForeignCallExecutor<'a, F> { /// The executor for any [`ForeignCall::Print`] calls. - printer: Option, + printer: PrintForeignCallExecutor<'a>, mocker: MockForeignCallExecutor, external: Option, } -impl DefaultForeignCallExecutor { +impl<'a, F: Default> DefaultForeignCallExecutor<'a, F> { pub fn new( - show_output: bool, + output: PrintOutput<'a>, resolver_url: Option<&str>, root_path: Option, package_name: Option, ) -> Self { let id = rand::thread_rng().gen(); - let printer = if show_output { Some(PrintForeignCallExecutor) } else { None }; + let printer = PrintForeignCallExecutor { output }; let external_resolver = resolver_url.map(|resolver_url| { RPCForeignCallExecutor::new(resolver_url, id, root_path, package_name) }); @@ -92,8 +92,8 @@ impl DefaultForeignCallExecutor { } } -impl Deserialize<'a>> ForeignCallExecutor - for DefaultForeignCallExecutor +impl<'a, F: AcirField + Serialize + for<'b> Deserialize<'b>> ForeignCallExecutor + for DefaultForeignCallExecutor<'a, F> { fn execute( &mut self, @@ -101,13 +101,7 @@ impl Deserialize<'a>> ForeignCallExecutor ) -> Result, ForeignCallError> { let foreign_call_name = foreign_call.function.as_str(); match ForeignCall::lookup(foreign_call_name) { - Some(ForeignCall::Print) => { - if let Some(printer) = &mut self.printer { - printer.execute(foreign_call) - } else { - Ok(ForeignCallResult::default()) - } - } + Some(ForeignCall::Print) => self.printer.execute(foreign_call), Some( ForeignCall::CreateMock | ForeignCall::SetMockParams diff --git a/noir/noir-repo/tooling/nargo/src/foreign_calls/print.rs b/noir/noir-repo/tooling/nargo/src/foreign_calls/print.rs index 92fcd65ae28..8b2b5efd8b6 100644 --- a/noir/noir-repo/tooling/nargo/src/foreign_calls/print.rs +++ b/noir/noir-repo/tooling/nargo/src/foreign_calls/print.rs @@ -4,9 +4,19 @@ use noirc_printable_type::{ForeignCallError, PrintableValueDisplay}; use super::{ForeignCall, ForeignCallExecutor}; #[derive(Debug, Default)] -pub(crate) struct PrintForeignCallExecutor; +pub enum PrintOutput<'a> { + #[default] + None, + Stdout, + String(&'a mut String), +} + +#[derive(Debug, Default)] +pub(crate) struct PrintForeignCallExecutor<'a> { + pub(crate) output: PrintOutput<'a>, +} -impl ForeignCallExecutor for PrintForeignCallExecutor { +impl ForeignCallExecutor for PrintForeignCallExecutor<'_> { fn execute( &mut self, foreign_call: &ForeignCallWaitInfo, @@ -26,7 +36,13 @@ impl ForeignCallExecutor for PrintForeignCallExecutor { let display_string = format!("{display_values}{}", if skip_newline { "" } else { "\n" }); - print!("{display_string}"); + match &mut self.output { + PrintOutput::None => (), + PrintOutput::Stdout => print!("{display_string}"), + PrintOutput::String(string) => { + string.push_str(&display_string); + } + } Ok(ForeignCallResult::default()) } diff --git a/noir/noir-repo/tooling/nargo/src/lib.rs b/noir/noir-repo/tooling/nargo/src/lib.rs index 74b7f54d860..ee7b2e4809a 100644 --- a/noir/noir-repo/tooling/nargo/src/lib.rs +++ b/noir/noir-repo/tooling/nargo/src/lib.rs @@ -30,6 +30,7 @@ use rayon::prelude::*; use walkdir::WalkDir; pub use self::errors::NargoError; +pub use self::foreign_calls::print::PrintOutput; pub fn prepare_dependencies( context: &mut Context, diff --git a/noir/noir-repo/tooling/nargo/src/ops/test.rs b/noir/noir-repo/tooling/nargo/src/ops/test.rs index e258627b522..1306150518d 100644 --- a/noir/noir-repo/tooling/nargo/src/ops/test.rs +++ b/noir/noir-repo/tooling/nargo/src/ops/test.rs @@ -9,7 +9,7 @@ use acvm::{ AcirField, BlackBoxFunctionSolver, FieldElement, }; use noirc_abi::Abi; -use noirc_driver::{compile_no_check, CompileError, CompileOptions}; +use noirc_driver::{compile_no_check, CompileError, CompileOptions, DEFAULT_EXPRESSION_WIDTH}; use noirc_errors::{debug_info::DebugInfo, FileDiagnostic}; use noirc_frontend::hir::{def_map::TestFunction, Context}; use noirc_printable_type::ForeignCallError; @@ -19,14 +19,17 @@ use serde::{Deserialize, Serialize}; use crate::{ errors::try_to_diagnose_runtime_error, foreign_calls::{ - mocker::MockForeignCallExecutor, print::PrintForeignCallExecutor, - rpc::RPCForeignCallExecutor, ForeignCall, ForeignCallExecutor, + mocker::MockForeignCallExecutor, + print::{PrintForeignCallExecutor, PrintOutput}, + rpc::RPCForeignCallExecutor, + ForeignCall, ForeignCallExecutor, }, NargoError, }; use super::execute_program; +#[derive(Debug)] pub enum TestStatus { Pass, Fail { message: String, error_diagnostic: Option }, @@ -45,7 +48,7 @@ pub fn run_test>( blackbox_solver: &B, context: &mut Context, test_function: &TestFunction, - show_output: bool, + output: PrintOutput<'_>, foreign_call_resolver_url: Option<&str>, root_path: Option, package_name: Option, @@ -60,11 +63,15 @@ pub fn run_test>( match compile_no_check(context, config, test_function.get_id(), None, false) { Ok(compiled_program) => { + // Do the same optimizations as `compile_cmd`. + let target_width = config.expression_width.unwrap_or(DEFAULT_EXPRESSION_WIDTH); + let compiled_program = crate::ops::transform_program(compiled_program, target_width); + if test_function_has_no_arguments { // Run the backend to ensure the PWG evaluates functions like std::hash::pedersen, // otherwise constraints involving these expressions will not error. let mut foreign_call_executor = TestForeignCallExecutor::new( - show_output, + output, foreign_call_resolver_url, root_path, package_name, @@ -79,9 +86,9 @@ pub fn run_test>( let status = test_status_program_compile_pass( test_function, - compiled_program.abi, - compiled_program.debug, - circuit_execution, + &compiled_program.abi, + &compiled_program.debug, + &circuit_execution, ); let ignore_foreign_call_failures = @@ -113,26 +120,46 @@ pub fn run_test>( { use acvm::acir::circuit::Program; use noir_fuzzer::FuzzedExecutor; + use proptest::test_runner::Config; use proptest::test_runner::TestRunner; - let runner = TestRunner::default(); + + let runner = + TestRunner::new(Config { failure_persistence: None, ..Config::default() }); + + let abi = compiled_program.abi.clone(); + let debug = compiled_program.debug.clone(); let executor = |program: &Program, initial_witness: WitnessMap| -> Result, String> { - execute_program( + let circuit_execution = execute_program( program, initial_witness, blackbox_solver, &mut TestForeignCallExecutor::::new( - false, + PrintOutput::None, foreign_call_resolver_url, root_path.clone(), package_name.clone(), ), - ) - .map_err(|err| err.to_string()) + ); + + let status = test_status_program_compile_pass( + test_function, + &abi, + &debug, + &circuit_execution, + ); + + if let TestStatus::Fail { message, error_diagnostic: _ } = status { + Err(message) + } else { + // The fuzzer doesn't care about the actual result. + Ok(WitnessStack::default()) + } }; + let fuzzer = FuzzedExecutor::new(compiled_program.into(), executor, runner); let result = fuzzer.fuzz(); @@ -172,9 +199,9 @@ fn test_status_program_compile_fail(err: CompileError, test_function: &TestFunct /// passed/failed to determine the test status. fn test_status_program_compile_pass( test_function: &TestFunction, - abi: Abi, - debug: Vec, - circuit_execution: Result, NargoError>, + abi: &Abi, + debug: &[DebugInfo], + circuit_execution: &Result, NargoError>, ) -> TestStatus { let circuit_execution_err = match circuit_execution { // Circuit execution was successful; ie no errors or unsatisfied constraints @@ -194,7 +221,7 @@ fn test_status_program_compile_pass( // If we reach here, then the circuit execution failed. // // Check if the function should have passed - let diagnostic = try_to_diagnose_runtime_error(&circuit_execution_err, &abi, &debug); + let diagnostic = try_to_diagnose_runtime_error(circuit_execution_err, abi, debug); let test_should_have_passed = !test_function.should_fail(); if test_should_have_passed { return TestStatus::Fail { @@ -251,24 +278,24 @@ fn check_expected_failure_message( } /// A specialized foreign call executor which tracks whether it has encountered any unknown foreign calls -struct TestForeignCallExecutor { +struct TestForeignCallExecutor<'a, F> { /// The executor for any [`ForeignCall::Print`] calls. - printer: Option, + printer: PrintForeignCallExecutor<'a>, mocker: MockForeignCallExecutor, external: Option, encountered_unknown_foreign_call: bool, } -impl TestForeignCallExecutor { +impl<'a, F: Default> TestForeignCallExecutor<'a, F> { fn new( - show_output: bool, + output: PrintOutput<'a>, resolver_url: Option<&str>, root_path: Option, package_name: Option, ) -> Self { let id = rand::thread_rng().gen(); - let printer = if show_output { Some(PrintForeignCallExecutor) } else { None }; + let printer = PrintForeignCallExecutor { output }; let external_resolver = resolver_url.map(|resolver_url| { RPCForeignCallExecutor::new(resolver_url, id, root_path, package_name) }); @@ -281,8 +308,8 @@ impl TestForeignCallExecutor { } } -impl Deserialize<'a>> ForeignCallExecutor - for TestForeignCallExecutor +impl<'a, F: AcirField + Serialize + for<'b> Deserialize<'b>> ForeignCallExecutor + for TestForeignCallExecutor<'a, F> { fn execute( &mut self, @@ -293,13 +320,7 @@ impl Deserialize<'a>> ForeignCallExecutor let foreign_call_name = foreign_call.function.as_str(); match ForeignCall::lookup(foreign_call_name) { - Some(ForeignCall::Print) => { - if let Some(printer) = &mut self.printer { - printer.execute(foreign_call) - } else { - Ok(ForeignCallResult::default()) - } - } + Some(ForeignCall::Print) => self.printer.execute(foreign_call), Some( ForeignCall::CreateMock diff --git a/noir/noir-repo/tooling/nargo_cli/benches/criterion.rs b/noir/noir-repo/tooling/nargo_cli/benches/criterion.rs index 51de97df139..9bc50f87d8e 100644 --- a/noir/noir-repo/tooling/nargo_cli/benches/criterion.rs +++ b/noir/noir-repo/tooling/nargo_cli/benches/criterion.rs @@ -3,6 +3,7 @@ use acvm::{acir::native_types::WitnessMap, FieldElement}; use assert_cmd::prelude::{CommandCargoExt, OutputAssertExt}; use criterion::{criterion_group, criterion_main, Criterion}; +use nargo::PrintOutput; use noirc_abi::{ input_parser::{Format, InputValue}, Abi, InputMap, @@ -115,7 +116,7 @@ fn criterion_test_execution(c: &mut Criterion, test_program_dir: &Path, force_br let artifacts = RefCell::new(None); let mut foreign_call_executor = - nargo::foreign_calls::DefaultForeignCallExecutor::new(false, None, None, None); + nargo::foreign_calls::DefaultForeignCallExecutor::new(PrintOutput::None, None, None, None); c.bench_function(&benchmark_name, |b| { b.iter_batched( diff --git a/noir/noir-repo/tooling/nargo_cli/build.rs b/noir/noir-repo/tooling/nargo_cli/build.rs index 41b3c0c9cf7..8db2c1786d8 100644 --- a/noir/noir-repo/tooling/nargo_cli/build.rs +++ b/noir/noir-repo/tooling/nargo_cli/build.rs @@ -36,14 +36,13 @@ fn main() { generate_compile_success_empty_tests(&mut test_file, &test_dir); generate_compile_success_contract_tests(&mut test_file, &test_dir); generate_compile_success_no_bug_tests(&mut test_file, &test_dir); + generate_compile_success_with_bug_tests(&mut test_file, &test_dir); generate_compile_failure_tests(&mut test_file, &test_dir); } /// Some tests are explicitly ignored in brillig due to them failing. /// These should be fixed and removed from this list. -const IGNORED_BRILLIG_TESTS: [&str; 11] = [ - // Takes a very long time to execute as large loops do not get simplified. - "regression_4709", +const IGNORED_BRILLIG_TESTS: [&str; 10] = [ // bit sizes for bigint operation doesn't match up. "bigint", // ICE due to looking for function which doesn't exist. @@ -458,6 +457,35 @@ fn generate_compile_success_no_bug_tests(test_file: &mut File, test_data_dir: &P writeln!(test_file, "}}").unwrap(); } +/// Generate tests for checking that the contract compiles and there are "bugs" in stderr +fn generate_compile_success_with_bug_tests(test_file: &mut File, test_data_dir: &Path) { + let test_type = "compile_success_with_bug"; + let test_cases = read_test_cases(test_data_dir, test_type); + + writeln!( + test_file, + "mod {test_type} {{ + use super::*; + " + ) + .unwrap(); + for (test_name, test_dir) in test_cases { + let test_dir = test_dir.display(); + + generate_test_cases( + test_file, + &test_name, + &test_dir, + "compile", + r#" + nargo.assert().success().stderr(predicate::str::contains("bug:")); + "#, + &MatrixConfig::default(), + ); + } + writeln!(test_file, "}}").unwrap(); +} + fn generate_compile_failure_tests(test_file: &mut File, test_data_dir: &Path) { let test_type = "compile_failure"; let test_cases = read_test_cases(test_data_dir, test_type); diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/check_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/check_cmd.rs index 9059f1dd8e8..c8695a8f626 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/check_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/check_cmd.rs @@ -4,33 +4,25 @@ use clap::Args; use fm::FileManager; use iter_extended::btree_map; use nargo::{ - errors::CompileError, - insert_all_files_for_workspace_into_file_manager, - ops::report_errors, - package::{CrateName, Package}, - parse_all, prepare_package, + errors::CompileError, insert_all_files_for_workspace_into_file_manager, ops::report_errors, + package::Package, parse_all, prepare_package, }; -use nargo_toml::{get_package_manifest, resolve_workspace_from_toml, PackageSelection}; +use nargo_toml::{get_package_manifest, resolve_workspace_from_toml}; use noirc_abi::{AbiParameter, AbiType, MAIN_RETURN_NAME}; use noirc_driver::{ check_crate, compute_function_abi, CompileOptions, CrateId, NOIR_ARTIFACT_VERSION_STRING, }; use noirc_frontend::hir::{Context, ParsedFiles}; -use super::fs::write_to_file; use super::NargoConfig; +use super::{fs::write_to_file, PackageOptions}; /// Checks the constraint system for errors #[derive(Debug, Clone, Args)] #[clap(visible_alias = "c")] pub(crate) struct CheckCommand { - /// The name of the package to check - #[clap(long, conflicts_with = "workspace")] - package: Option, - - /// Check all packages in the workspace - #[clap(long, conflicts_with = "package")] - workspace: bool, + #[clap(flatten)] + pub(super) package_options: PackageOptions, /// Force overwrite of existing files #[clap(long = "overwrite")] @@ -42,9 +34,7 @@ pub(crate) struct CheckCommand { pub(crate) fn run(args: CheckCommand, config: NargoConfig) -> Result<(), CliError> { let toml_path = get_package_manifest(&config.program_dir)?; - let default_selection = - if args.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; - let selection = args.package.map_or(default_selection, PackageSelection::Selected); + let selection = args.package_options.package_selection(); let workspace = resolve_workspace_from_toml( &toml_path, selection, diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs index ff6009981c7..2ecf6959a94 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/compile_cmd.rs @@ -5,10 +5,12 @@ use std::time::Duration; use acvm::acir::circuit::ExpressionWidth; use fm::FileManager; use nargo::ops::{collect_errors, compile_contract, compile_program, report_errors}; -use nargo::package::{CrateName, Package}; +use nargo::package::Package; use nargo::workspace::Workspace; use nargo::{insert_all_files_for_workspace_into_file_manager, parse_all}; -use nargo_toml::{get_package_manifest, resolve_workspace_from_toml, PackageSelection}; +use nargo_toml::{ + get_package_manifest, resolve_workspace_from_toml, ManifestError, PackageSelection, +}; use noirc_driver::DEFAULT_EXPRESSION_WIDTH; use noirc_driver::NOIR_ARTIFACT_VERSION_STRING; use noirc_driver::{CompilationResult, CompileOptions, CompiledContract}; @@ -21,19 +23,14 @@ use notify_debouncer_full::new_debouncer; use crate::errors::CliError; use super::fs::program::{read_program_from_file, save_contract_to_file, save_program_to_file}; -use super::NargoConfig; +use super::{NargoConfig, PackageOptions}; use rayon::prelude::*; /// Compile the program and its secret execution trace into ACIR format #[derive(Debug, Clone, Args)] pub(crate) struct CompileCommand { - /// The name of the package to compile - #[clap(long, conflicts_with = "workspace")] - package: Option, - - /// Compile all packages in the workspace. - #[clap(long, conflicts_with = "package")] - workspace: bool, + #[clap(flatten)] + pub(super) package_options: PackageOptions, #[clap(flatten)] compile_options: CompileOptions, @@ -44,16 +41,8 @@ pub(crate) struct CompileCommand { } pub(crate) fn run(args: CompileCommand, config: NargoConfig) -> Result<(), CliError> { - let toml_path = get_package_manifest(&config.program_dir)?; - let default_selection = - if args.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; - let selection = args.package.map_or(default_selection, PackageSelection::Selected); - - let workspace = resolve_workspace_from_toml( - &toml_path, - selection, - Some(NOIR_ARTIFACT_VERSION_STRING.to_owned()), - )?; + let selection = args.package_options.package_selection(); + let workspace = read_workspace(&config.program_dir, selection)?; if args.watch { watch_workspace(&workspace, &args.compile_options) @@ -65,6 +54,22 @@ pub(crate) fn run(args: CompileCommand, config: NargoConfig) -> Result<(), CliEr Ok(()) } +/// Read a given program directory into a workspace. +fn read_workspace( + program_dir: &Path, + selection: PackageSelection, +) -> Result { + let toml_path = get_package_manifest(program_dir)?; + + let workspace = resolve_workspace_from_toml( + &toml_path, + selection, + Some(NOIR_ARTIFACT_VERSION_STRING.to_owned()), + )?; + + Ok(workspace) +} + /// Continuously recompile the workspace on any Noir file change event. fn watch_workspace(workspace: &Workspace, compile_options: &CompileOptions) -> notify::Result<()> { let (tx, rx) = std::sync::mpsc::channel(); @@ -109,15 +114,21 @@ fn watch_workspace(workspace: &Workspace, compile_options: &CompileOptions) -> n Ok(()) } +/// Parse all files in the workspace. +fn parse_workspace(workspace: &Workspace) -> (FileManager, ParsedFiles) { + let mut file_manager = workspace.new_file_manager(); + insert_all_files_for_workspace_into_file_manager(workspace, &mut file_manager); + let parsed_files = parse_all(&file_manager); + (file_manager, parsed_files) +} + /// Parse and compile the entire workspace, then report errors. /// This is the main entry point used by all other commands that need compilation. pub(super) fn compile_workspace_full( workspace: &Workspace, compile_options: &CompileOptions, ) -> Result<(), CliError> { - let mut workspace_file_manager = workspace.new_file_manager(); - insert_all_files_for_workspace_into_file_manager(workspace, &mut workspace_file_manager); - let parsed_files = parse_all(&workspace_file_manager); + let (workspace_file_manager, parsed_files) = parse_workspace(workspace); let compiled_workspace = compile_workspace(&workspace_file_manager, &parsed_files, workspace, compile_options); @@ -150,7 +161,7 @@ fn compile_workspace( let program_warnings_or_errors: CompilationResult<()> = compile_programs(file_manager, parsed_files, workspace, &binary_packages, compile_options); - let contract_warnings_or_errors: CompilationResult<()> = compiled_contracts( + let contract_warnings_or_errors: CompilationResult<()> = compile_contracts( file_manager, parsed_files, &contract_packages, @@ -244,7 +255,7 @@ fn compile_programs( } /// Compile the given contracts in the workspace. -fn compiled_contracts( +fn compile_contracts( file_manager: &FileManager, parsed_files: &ParsedFiles, contract_packages: &[Package], @@ -296,3 +307,138 @@ pub(crate) fn get_target_width( compile_options_width.unwrap_or(DEFAULT_EXPRESSION_WIDTH) } } + +#[cfg(test)] +mod tests { + use std::{ + path::{Path, PathBuf}, + str::FromStr, + }; + + use clap::Parser; + use nargo::ops::compile_program; + use nargo_toml::PackageSelection; + use noirc_driver::{CompileOptions, CrateName}; + use rayon::prelude::*; + + use crate::cli::compile_cmd::{get_target_width, parse_workspace, read_workspace}; + + /// Try to find the directory that Cargo sets when it is running; + /// otherwise fallback to assuming the CWD is the root of the repository + /// and append the crate path. + fn test_programs_dir() -> PathBuf { + let root_dir = match std::env::var("CARGO_MANIFEST_DIR") { + Ok(dir) => PathBuf::from(dir).parent().unwrap().parent().unwrap().to_path_buf(), + Err(_) => std::env::current_dir().unwrap(), + }; + root_dir.join("test_programs") + } + + /// Collect the test programs under a sub-directory. + fn read_test_program_dirs( + test_programs_dir: &Path, + test_sub_dir: &str, + ) -> impl Iterator { + let test_case_dir = test_programs_dir.join(test_sub_dir); + std::fs::read_dir(test_case_dir) + .unwrap() + .flatten() + .filter(|c| c.path().is_dir()) + .map(|c| c.path()) + } + + #[derive(Parser, Debug)] + #[command(ignore_errors = true)] + struct Options { + /// Test name to filter for. + /// + /// For example: + /// ```text + /// cargo test -p nargo_cli -- test_transform_program_is_idempotent slice_loop + /// ``` + args: Vec, + } + + impl Options { + fn package_selection(&self) -> PackageSelection { + match self.args.as_slice() { + [_test_name, test_program] => { + PackageSelection::Selected(CrateName::from_str(test_program).unwrap()) + } + _ => PackageSelection::DefaultOrAll, + } + } + } + + /// Check that `nargo::ops::transform_program` is idempotent by compiling the + /// test programs and running them through the optimizer twice. + /// + /// This test is here purely because of the convenience of having access to + /// the utility functions to process workspaces. + #[test] + fn test_transform_program_is_idempotent() { + let opts = Options::parse(); + + let sel = opts.package_selection(); + let verbose = matches!(sel, PackageSelection::Selected(_)); + + let test_workspaces = read_test_program_dirs(&test_programs_dir(), "execution_success") + .filter_map(|dir| read_workspace(&dir, sel.clone()).ok()) + .collect::>(); + + assert!(!test_workspaces.is_empty(), "should find some test workspaces"); + + test_workspaces.par_iter().for_each(|workspace| { + let (file_manager, parsed_files) = parse_workspace(workspace); + let binary_packages = workspace.into_iter().filter(|package| package.is_binary()); + + for package in binary_packages { + let (program_0, _warnings) = compile_program( + &file_manager, + &parsed_files, + workspace, + package, + &CompileOptions::default(), + None, + ) + .expect("failed to compile"); + + let width = get_target_width(package.expression_width, None); + + let program_1 = nargo::ops::transform_program(program_0, width); + let program_2 = nargo::ops::transform_program(program_1.clone(), width); + + if verbose { + // Compare where the most likely difference is. + similar_asserts::assert_eq!( + format!("{}", program_1.program), + format!("{}", program_2.program), + "optimization not idempotent for test program '{}'", + package.name + ); + assert_eq!( + program_1.program, program_2.program, + "optimization not idempotent for test program '{}'", + package.name + ); + + // Compare the whole content. + similar_asserts::assert_eq!( + serde_json::to_string_pretty(&program_1).unwrap(), + serde_json::to_string_pretty(&program_2).unwrap(), + "optimization not idempotent for test program '{}'", + package.name + ); + } else { + // Just compare hashes, which would just state that the program failed. + // Then we can use the filter option to zoom in one one to see why. + assert!( + fxhash::hash64(&program_1) == fxhash::hash64(&program_2), + "optimization not idempotent for test program '{}'", + package.name + ); + } + } + }); + } +} diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs index e837f297475..f4dd607a53e 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/debug_cmd.rs @@ -38,7 +38,7 @@ pub(crate) struct DebugCommand { /// The name of the package to execute #[clap(long)] - package: Option, + pub(super) package: Option, #[clap(flatten)] compile_options: CompileOptions, diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs index fa95d3123c6..49a23a7ea62 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/execute_cmd.rs @@ -8,8 +8,9 @@ use clap::Args; use nargo::constants::PROVER_INPUT_FILE; use nargo::errors::try_to_diagnose_runtime_error; use nargo::foreign_calls::DefaultForeignCallExecutor; -use nargo::package::{CrateName, Package}; -use nargo_toml::{get_package_manifest, resolve_workspace_from_toml, PackageSelection}; +use nargo::package::Package; +use nargo::PrintOutput; +use nargo_toml::{get_package_manifest, resolve_workspace_from_toml}; use noirc_abi::input_parser::{Format, InputValue}; use noirc_abi::InputMap; use noirc_artifacts::debug::DebugArtifact; @@ -17,7 +18,7 @@ use noirc_driver::{CompileOptions, CompiledProgram, NOIR_ARTIFACT_VERSION_STRING use super::compile_cmd::compile_workspace_full; use super::fs::{inputs::read_inputs_from_file, witness::save_witness_to_dir}; -use super::NargoConfig; +use super::{NargoConfig, PackageOptions}; use crate::cli::fs::program::read_program_from_file; use crate::errors::CliError; @@ -34,13 +35,8 @@ pub(crate) struct ExecuteCommand { #[clap(long, short, default_value = PROVER_INPUT_FILE)] prover_name: String, - /// The name of the package to execute - #[clap(long, conflicts_with = "workspace")] - package: Option, - - /// Execute all packages in the workspace - #[clap(long, conflicts_with = "package")] - workspace: bool, + #[clap(flatten)] + pub(super) package_options: PackageOptions, #[clap(flatten)] compile_options: CompileOptions, @@ -52,9 +48,7 @@ pub(crate) struct ExecuteCommand { pub(crate) fn run(args: ExecuteCommand, config: NargoConfig) -> Result<(), CliError> { let toml_path = get_package_manifest(&config.program_dir)?; - let default_selection = - if args.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; - let selection = args.package.map_or(default_selection, PackageSelection::Selected); + let selection = args.package_options.package_selection(); let workspace = resolve_workspace_from_toml( &toml_path, selection, @@ -70,8 +64,9 @@ pub(crate) fn run(args: ExecuteCommand, config: NargoConfig) -> Result<(), CliEr let program_artifact_path = workspace.package_build_path(package); let program: CompiledProgram = read_program_from_file(program_artifact_path.clone())?.into(); + let abi = program.abi.clone(); - let (return_value, witness_stack) = execute_program_and_decode( + let results = execute_program_and_decode( program, package, &args.prover_name, @@ -81,14 +76,27 @@ pub(crate) fn run(args: ExecuteCommand, config: NargoConfig) -> Result<(), CliEr )?; println!("[{}] Circuit witness successfully solved", package.name); - if let Some(return_value) = return_value { + if let Some(ref return_value) = results.actual_return { println!("[{}] Circuit output: {return_value:?}", package.name); } let package_name = package.name.clone().into(); let witness_name = args.witness_name.as_ref().unwrap_or(&package_name); - let witness_path = save_witness_to_dir(witness_stack, witness_name, target_dir)?; + let witness_path = save_witness_to_dir(results.witness_stack, witness_name, target_dir)?; println!("[{}] Witness saved to {}", package.name, witness_path.display()); + + // Sanity checks on the return value after the witness has been saved, so it can be inspected if necessary. + if let Some(expected) = results.expected_return { + if results.actual_return.as_ref() != Some(&expected) { + return Err(CliError::UnexpectedReturn { expected, actual: results.actual_return }); + } + } + // We can expect that if the circuit returns something, it should be non-empty after execution. + if let Some(ref expected) = abi.return_type { + if results.actual_return.is_none() { + return Err(CliError::MissingReturn { expected: expected.clone() }); + } + } } Ok(()) } @@ -100,18 +108,24 @@ fn execute_program_and_decode( foreign_call_resolver_url: Option<&str>, root_path: Option, package_name: Option, -) -> Result<(Option, WitnessStack), CliError> { +) -> Result { // Parse the initial witness values from Prover.toml - let (inputs_map, _) = + let (inputs_map, expected_return) = read_inputs_from_file(&package.root_dir, prover_name, Format::Toml, &program.abi)?; let witness_stack = execute_program(&program, &inputs_map, foreign_call_resolver_url, root_path, package_name)?; // Get the entry point witness for the ABI let main_witness = &witness_stack.peek().expect("Should have at least one witness on the stack").witness; - let (_, return_value) = program.abi.decode(main_witness)?; + let (_, actual_return) = program.abi.decode(main_witness)?; + + Ok(ExecutionResults { expected_return, actual_return, witness_stack }) +} - Ok((return_value, witness_stack)) +struct ExecutionResults { + expected_return: Option, + actual_return: Option, + witness_stack: WitnessStack, } pub(crate) fn execute_program( @@ -128,7 +142,7 @@ pub(crate) fn execute_program( initial_witness, &Bn254BlackBoxSolver, &mut DefaultForeignCallExecutor::new( - true, + PrintOutput::Stdout, foreign_call_resolver_url, root_path, package_name, diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/export_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/export_cmd.rs index c3752db7fbd..cb92b987c4e 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/export_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/export_cmd.rs @@ -10,13 +10,11 @@ use nargo::package::Package; use nargo::prepare_package; use nargo::workspace::Workspace; use nargo::{insert_all_files_for_workspace_into_file_manager, parse_all}; -use nargo_toml::{get_package_manifest, resolve_workspace_from_toml, PackageSelection}; +use nargo_toml::{get_package_manifest, resolve_workspace_from_toml}; use noirc_driver::{ compile_no_check, CompileOptions, CompiledProgram, NOIR_ARTIFACT_VERSION_STRING, }; -use noirc_frontend::graph::CrateName; - use clap::Args; use crate::errors::CliError; @@ -24,18 +22,13 @@ use crate::errors::CliError; use super::check_cmd::check_crate_and_report_errors; use super::fs::program::save_program_to_file; -use super::NargoConfig; +use super::{NargoConfig, PackageOptions}; /// Exports functions marked with #[export] attribute #[derive(Debug, Clone, Args)] pub(crate) struct ExportCommand { - /// The name of the package to compile - #[clap(long, conflicts_with = "workspace")] - package: Option, - - /// Compile all packages in the workspace - #[clap(long, conflicts_with = "package")] - workspace: bool, + #[clap(flatten)] + pub(super) package_options: PackageOptions, #[clap(flatten)] compile_options: CompileOptions, @@ -43,10 +36,7 @@ pub(crate) struct ExportCommand { pub(crate) fn run(args: ExportCommand, config: NargoConfig) -> Result<(), CliError> { let toml_path = get_package_manifest(&config.program_dir)?; - let default_selection = - if args.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; - let selection = args.package.map_or(default_selection, PackageSelection::Selected); - + let selection = args.package_options.package_selection(); let workspace = resolve_workspace_from_toml( &toml_path, selection, diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/fmt_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/fmt_cmd.rs index 66496db517c..7b29a90c5c0 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/fmt_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/fmt_cmd.rs @@ -9,7 +9,7 @@ use noirc_frontend::{hir::def_map::parse_file, parser::ParserError}; use crate::errors::CliError; -use super::NargoConfig; +use super::{NargoConfig, PackageOptions}; /// Format the Noir files in a workspace #[derive(Debug, Clone, Args)] @@ -17,15 +17,22 @@ pub(crate) struct FormatCommand { /// Run noirfmt in check mode #[arg(long)] check: bool, + + #[clap(flatten)] + pub(super) package_options: PackageOptions, } pub(crate) fn run(args: FormatCommand, config: NargoConfig) -> Result<(), CliError> { let check_mode = args.check; let toml_path = get_package_manifest(&config.program_dir)?; + let selection = match args.package_options.package_selection() { + PackageSelection::DefaultOrAll => PackageSelection::All, + other => other, + }; let workspace = resolve_workspace_from_toml( &toml_path, - PackageSelection::All, + selection, Some(NOIR_ARTIFACT_VERSION_STRING.to_string()), )?; diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs index 769a1f79d81..ee8ff32922e 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/info_cmd.rs @@ -3,11 +3,10 @@ use bn254_blackbox_solver::Bn254BlackBoxSolver; use clap::Args; use iter_extended::vecmap; use nargo::{ - constants::PROVER_INPUT_FILE, - foreign_calls::DefaultForeignCallExecutor, - package::{CrateName, Package}, + constants::PROVER_INPUT_FILE, foreign_calls::DefaultForeignCallExecutor, package::Package, + PrintOutput, }; -use nargo_toml::{get_package_manifest, resolve_workspace_from_toml, PackageSelection}; +use nargo_toml::{get_package_manifest, resolve_workspace_from_toml}; use noirc_abi::input_parser::Format; use noirc_artifacts::program::ProgramArtifact; use noirc_driver::{CompileOptions, NOIR_ARTIFACT_VERSION_STRING}; @@ -20,7 +19,7 @@ use crate::{cli::fs::inputs::read_inputs_from_file, errors::CliError}; use super::{ compile_cmd::{compile_workspace_full, get_target_width}, fs::program::read_program_from_file, - NargoConfig, + NargoConfig, PackageOptions, }; /// Provides detailed information on each of a program's function (represented by a single circuit) @@ -31,13 +30,8 @@ use super::{ #[derive(Debug, Clone, Args)] #[clap(visible_alias = "i")] pub(crate) struct InfoCommand { - /// The name of the package to detail - #[clap(long, conflicts_with = "workspace")] - package: Option, - - /// Detail all packages in the workspace - #[clap(long, conflicts_with = "package")] - workspace: bool, + #[clap(flatten)] + pub(super) package_options: PackageOptions, /// Output a JSON formatted report. Changes to this format are not currently considered breaking. #[clap(long, hide = true)] @@ -56,9 +50,7 @@ pub(crate) struct InfoCommand { pub(crate) fn run(mut args: InfoCommand, config: NargoConfig) -> Result<(), CliError> { let toml_path = get_package_manifest(&config.program_dir)?; - let default_selection = - if args.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; - let selection = args.package.map_or(default_selection, PackageSelection::Selected); + let selection = args.package_options.package_selection(); let workspace = resolve_workspace_from_toml( &toml_path, selection, @@ -263,7 +255,7 @@ fn profile_brillig_execution( &program_artifact.bytecode, initial_witness, &Bn254BlackBoxSolver, - &mut DefaultForeignCallExecutor::new(false, None, None, None), + &mut DefaultForeignCallExecutor::new(PrintOutput::None, None, None, None), )?; let expression_width = get_target_width(package.expression_width, expression_width); diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/mod.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/mod.rs index 284dd10cb88..cc72092daa1 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/mod.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/mod.rs @@ -1,8 +1,8 @@ use clap::{Args, Parser, Subcommand}; use const_format::formatcp; -use nargo_toml::find_package_root; -use noirc_driver::NOIR_ARTIFACT_VERSION_STRING; -use std::path::PathBuf; +use nargo_toml::{ManifestError, PackageSelection}; +use noirc_driver::{CrateName, NOIR_ARTIFACT_VERSION_STRING}; +use std::path::{Path, PathBuf}; use color_eyre::eyre; @@ -52,6 +52,48 @@ pub(crate) struct NargoConfig { program_dir: PathBuf, } +/// Options for commands that work on either workspace or package scope. +#[derive(Args, Clone, Debug, Default)] +pub(crate) struct PackageOptions { + /// The name of the package to run the command on. + /// By default run on the first one found moving up along the ancestors of the current directory. + #[clap(long, conflicts_with = "workspace")] + package: Option, + + /// Run on all packages in the workspace + #[clap(long, conflicts_with = "package")] + workspace: bool, +} + +impl PackageOptions { + /// Decide which package to run the command on: + /// * `package` if non-empty + /// * all packages if `workspace` is `true` + /// * otherwise the default package + pub(crate) fn package_selection(&self) -> PackageSelection { + let default_selection = + if self.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; + + self.package.clone().map_or(default_selection, PackageSelection::Selected) + } + + /// Whether we need to look for the package manifest at the workspace level. + /// If a package is specified, it might not be the current package. + fn scope(&self) -> CommandScope { + if self.workspace || self.package.is_some() { + CommandScope::Workspace + } else { + CommandScope::CurrentPackage + } + } +} + +enum CommandScope { + Workspace, + CurrentPackage, + Any, +} + #[non_exhaustive] #[derive(Subcommand, Clone, Debug)] enum NargoCommand { @@ -83,22 +125,8 @@ pub(crate) fn start_cli() -> eyre::Result<()> { } // Search through parent directories to find package root if necessary. - match &command { - NargoCommand::Check(..) - | NargoCommand::Fmt(..) - | NargoCommand::Compile(..) - | NargoCommand::Execute(..) - | NargoCommand::Export(..) - | NargoCommand::Debug(..) - | NargoCommand::Test(..) - | NargoCommand::Info(..) => { - config.program_dir = find_package_root(&config.program_dir)?; - } - NargoCommand::New(..) - | NargoCommand::Init(..) - | NargoCommand::Lsp(..) - | NargoCommand::Dap(..) - | NargoCommand::GenerateCompletionScript(..) => (), + if let Some(program_dir) = command_dir(&command, &config.program_dir)? { + config.program_dir = program_dir; } match command { @@ -127,6 +155,43 @@ pub(crate) fn start_cli() -> eyre::Result<()> { Ok(()) } +/// Some commands have package options, which we use here to decide whether to +/// alter `--program-dir` to point at a manifest, depending on whether we want +/// to work on a specific package or the entire workspace. +fn command_scope(cmd: &NargoCommand) -> CommandScope { + match &cmd { + NargoCommand::Check(cmd) => cmd.package_options.scope(), + NargoCommand::Compile(cmd) => cmd.package_options.scope(), + NargoCommand::Execute(cmd) => cmd.package_options.scope(), + NargoCommand::Export(cmd) => cmd.package_options.scope(), + NargoCommand::Test(cmd) => cmd.package_options.scope(), + NargoCommand::Info(cmd) => cmd.package_options.scope(), + NargoCommand::Fmt(cmd) => cmd.package_options.scope(), + NargoCommand::Debug(cmd) => { + if cmd.package.is_some() { + CommandScope::Workspace + } else { + CommandScope::CurrentPackage + } + } + NargoCommand::New(..) + | NargoCommand::Init(..) + | NargoCommand::Lsp(..) + | NargoCommand::Dap(..) + | NargoCommand::GenerateCompletionScript(..) => CommandScope::Any, + } +} + +/// A manifest directory we need to change into, if the command needs it. +fn command_dir(cmd: &NargoCommand, program_dir: &Path) -> Result, ManifestError> { + let workspace = match command_scope(cmd) { + CommandScope::Workspace => true, + CommandScope::CurrentPackage => false, + CommandScope::Any => return Ok(None), + }; + Ok(Some(nargo_toml::find_root(program_dir, workspace)?)) +} + #[cfg(test)] mod tests { use clap::Parser; diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd.rs index aa0ee1bb94b..1fd4ed2d873 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd.rs @@ -1,24 +1,31 @@ -use std::{io::Write, path::PathBuf}; +use std::{ + collections::{BTreeMap, HashMap}, + fmt::Display, + panic::{catch_unwind, UnwindSafe}, + path::PathBuf, + sync::{mpsc, Mutex}, + thread, + time::Duration, +}; use acvm::{BlackBoxFunctionSolver, FieldElement}; use bn254_blackbox_solver::Bn254BlackBoxSolver; use clap::Args; use fm::FileManager; +use formatters::{Formatter, JsonFormatter, PrettyFormatter, TerseFormatter}; use nargo::{ - insert_all_files_for_workspace_into_file_manager, - ops::TestStatus, - package::{CrateName, Package}, - parse_all, prepare_package, + insert_all_files_for_workspace_into_file_manager, ops::TestStatus, package::Package, parse_all, + prepare_package, workspace::Workspace, PrintOutput, }; -use nargo_toml::{get_package_manifest, resolve_workspace_from_toml, PackageSelection}; +use nargo_toml::{get_package_manifest, resolve_workspace_from_toml}; use noirc_driver::{check_crate, CompileOptions, NOIR_ARTIFACT_VERSION_STRING}; use noirc_frontend::hir::{FunctionNameMatch, ParsedFiles}; -use rayon::prelude::{IntoParallelIterator, ParallelBridge, ParallelIterator}; -use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; use crate::{cli::check_cmd::check_crate_and_report_errors, errors::CliError}; -use super::NargoConfig; +use super::{NargoConfig, PackageOptions}; + +mod formatters; /// Run the tests for this program #[derive(Debug, Clone, Args)] @@ -35,13 +42,8 @@ pub(crate) struct TestCommand { #[clap(long)] exact: bool, - /// The name of the package to test - #[clap(long, conflicts_with = "workspace")] - package: Option, - - /// Test all packages in the workspace - #[clap(long, conflicts_with = "package")] - workspace: bool, + #[clap(flatten)] + pub(super) package_options: PackageOptions, #[clap(flatten)] compile_options: CompileOptions, @@ -49,22 +51,78 @@ pub(crate) struct TestCommand { /// JSON RPC url to solve oracle calls #[clap(long)] oracle_resolver: Option, + + /// Number of threads used for running tests in parallel + #[clap(long, default_value_t = rayon::current_num_threads())] + test_threads: usize, + + /// Configure formatting of output + #[clap(long)] + format: Option, + + /// Display one character per test instead of one line + #[clap(short = 'q', long = "quiet")] + quiet: bool, +} + +#[derive(Debug, Copy, Clone, clap::ValueEnum)] +enum Format { + /// Print verbose output + Pretty, + /// Display one character per test + Terse, + /// Output a JSON Lines document + Json, +} + +impl Format { + fn formatter(&self) -> Box { + match self { + Format::Pretty => Box::new(PrettyFormatter), + Format::Terse => Box::new(TerseFormatter), + Format::Json => Box::new(JsonFormatter), + } + } +} + +impl Display for Format { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Format::Pretty => write!(f, "pretty"), + Format::Terse => write!(f, "terse"), + Format::Json => write!(f, "json"), + } + } } +struct Test<'a> { + name: String, + package_name: String, + runner: Box (TestStatus, String) + Send + UnwindSafe + 'a>, +} + +struct TestResult { + name: String, + package_name: String, + status: TestStatus, + output: String, + time_to_run: Duration, +} + +const STACK_SIZE: usize = 4 * 1024 * 1024; + pub(crate) fn run(args: TestCommand, config: NargoConfig) -> Result<(), CliError> { let toml_path = get_package_manifest(&config.program_dir)?; - let default_selection = - if args.workspace { PackageSelection::All } else { PackageSelection::DefaultOrAll }; - let selection = args.package.map_or(default_selection, PackageSelection::Selected); + let selection = args.package_options.package_selection(); let workspace = resolve_workspace_from_toml( &toml_path, selection, Some(NOIR_ARTIFACT_VERSION_STRING.to_string()), )?; - let mut workspace_file_manager = workspace.new_file_manager(); - insert_all_files_for_workspace_into_file_manager(&workspace, &mut workspace_file_manager); - let parsed_files = parse_all(&workspace_file_manager); + let mut file_manager = workspace.new_file_manager(); + insert_all_files_for_workspace_into_file_manager(&workspace, &mut file_manager); + let parsed_files = parse_all(&file_manager); let pattern = match &args.test_name { Some(name) => { @@ -77,230 +135,388 @@ pub(crate) fn run(args: TestCommand, config: NargoConfig) -> Result<(), CliError None => FunctionNameMatch::Anything, }; - // Configure a thread pool with a larger stack size to prevent overflowing stack in large programs. - // Default is 2MB. - let pool = rayon::ThreadPoolBuilder::new().stack_size(4 * 1024 * 1024).build().unwrap(); - let test_reports: Vec> = pool.install(|| { - workspace - .into_iter() - .par_bridge() - .map(|package| { - run_tests::( - &workspace_file_manager, - &parsed_files, - package, - pattern, - args.show_output, - args.oracle_resolver.as_deref(), - Some(workspace.root_dir.clone()), - Some(package.name.to_string()), - &args.compile_options, - ) - }) - .collect::>() - })?; - let test_report: Vec<(String, TestStatus)> = test_reports.into_iter().flatten().collect(); - - if test_report.is_empty() { - match &pattern { - FunctionNameMatch::Exact(pattern) => { - return Err(CliError::Generic( - format!("Found 0 tests matching input '{pattern}'.",), - )) - } - FunctionNameMatch::Contains(pattern) => { - return Err(CliError::Generic(format!("Found 0 tests containing '{pattern}'.",))) - } - // If we are running all tests in a crate, having none is not an error - FunctionNameMatch::Anything => {} - }; - } - - if test_report.iter().any(|(_, status)| status.failed()) { - Err(CliError::Generic(String::new())) + let formatter: Box = if let Some(format) = args.format { + format.formatter() + } else if args.quiet { + Box::new(TerseFormatter) } else { - Ok(()) - } -} + Box::new(PrettyFormatter) + }; -#[allow(clippy::too_many_arguments)] -fn run_tests + Default>( - file_manager: &FileManager, - parsed_files: &ParsedFiles, - package: &Package, - fn_name: FunctionNameMatch, - show_output: bool, - foreign_call_resolver_url: Option<&str>, - root_path: Option, - package_name: Option, - compile_options: &CompileOptions, -) -> Result, CliError> { - let test_functions = - get_tests_in_package(file_manager, parsed_files, package, fn_name, compile_options)?; - - let count_all = test_functions.len(); - - let plural = if count_all == 1 { "" } else { "s" }; - println!("[{}] Running {count_all} test function{plural}", package.name); - - let test_report: Vec<(String, TestStatus)> = test_functions - .into_par_iter() - .map(|test_name| { - let status = run_test::( - file_manager, - parsed_files, - package, - &test_name, - show_output, - foreign_call_resolver_url, - root_path.clone(), - package_name.clone(), - compile_options, - ); - - (test_name, status) - }) - .collect(); - - display_test_report(file_manager, package, compile_options, &test_report)?; - Ok(test_report) + let runner = TestRunner { + file_manager: &file_manager, + parsed_files: &parsed_files, + workspace, + args: &args, + pattern, + num_threads: args.test_threads, + formatter, + }; + runner.run() } -#[allow(clippy::too_many_arguments)] -fn run_test + Default>( - file_manager: &FileManager, - parsed_files: &ParsedFiles, - package: &Package, - fn_name: &str, - show_output: bool, - foreign_call_resolver_url: Option<&str>, - root_path: Option, - package_name: Option, - compile_options: &CompileOptions, -) -> TestStatus { - // This is really hacky but we can't share `Context` or `S` across threads. - // We then need to construct a separate copy for each test. - - let (mut context, crate_id) = prepare_package(file_manager, parsed_files, package); - check_crate(&mut context, crate_id, compile_options) - .expect("Any errors should have occurred when collecting test functions"); - - let test_functions = context - .get_all_test_functions_in_crate_matching(&crate_id, FunctionNameMatch::Exact(fn_name)); - let (_, test_function) = test_functions.first().expect("Test function should exist"); - - let blackbox_solver = S::default(); - - nargo::ops::run_test( - &blackbox_solver, - &mut context, - test_function, - show_output, - foreign_call_resolver_url, - root_path, - package_name, - compile_options, - ) +struct TestRunner<'a> { + file_manager: &'a FileManager, + parsed_files: &'a ParsedFiles, + workspace: Workspace, + args: &'a TestCommand, + pattern: FunctionNameMatch<'a>, + num_threads: usize, + formatter: Box, } -fn get_tests_in_package( - file_manager: &FileManager, - parsed_files: &ParsedFiles, - package: &Package, - fn_name: FunctionNameMatch, - options: &CompileOptions, -) -> Result, CliError> { - let (mut context, crate_id) = prepare_package(file_manager, parsed_files, package); - check_crate_and_report_errors(&mut context, crate_id, options)?; - - Ok(context - .get_all_test_functions_in_crate_matching(&crate_id, fn_name) - .into_iter() - .map(|(test_name, _)| test_name) - .collect()) -} +impl<'a> TestRunner<'a> { + fn run(&self) -> Result<(), CliError> { + // First compile all packages and collect their tests + let packages_tests = self.collect_packages_tests()?; + + // Now gather all tests and how many are per packages + let mut tests = Vec::new(); + let mut test_count_per_package = BTreeMap::new(); + + for (package_name, package_tests) in packages_tests { + test_count_per_package.insert(package_name, package_tests.len()); + tests.extend(package_tests); + } + + // Now run all tests in parallel, but show output for each package sequentially + let tests_count = tests.len(); + let all_passed = self.run_all_tests(tests, &test_count_per_package); + + if tests_count == 0 { + match &self.pattern { + FunctionNameMatch::Exact(pattern) => { + return Err(CliError::Generic(format!( + "Found 0 tests matching input '{pattern}'.", + ))) + } + FunctionNameMatch::Contains(pattern) => { + return Err(CliError::Generic( + format!("Found 0 tests containing '{pattern}'.",), + )) + } + // If we are running all tests in a crate, having none is not an error + FunctionNameMatch::Anything => {} + }; + } -fn display_test_report( - file_manager: &FileManager, - package: &Package, - compile_options: &CompileOptions, - test_report: &[(String, TestStatus)], -) -> Result<(), CliError> { - let writer = StandardStream::stderr(ColorChoice::Always); - let mut writer = writer.lock(); - - for (test_name, test_status) in test_report { - write!(writer, "[{}] Testing {test_name}... ", package.name) - .expect("Failed to write to stderr"); - writer.flush().expect("Failed to flush writer"); - - match &test_status { - TestStatus::Pass { .. } => { - writer - .set_color(ColorSpec::new().set_fg(Some(Color::Green))) - .expect("Failed to set color"); - writeln!(writer, "ok").expect("Failed to write to stderr"); + if all_passed { + Ok(()) + } else { + Err(CliError::Generic(String::new())) + } + } + + /// Runs all tests. Returns `true` if all tests passed, `false` otherwise. + fn run_all_tests( + &self, + tests: Vec>, + test_count_per_package: &BTreeMap, + ) -> bool { + let mut all_passed = true; + + for (package_name, total_test_count) in test_count_per_package { + self.formatter + .package_start_async(package_name, *total_test_count) + .expect("Could not display package start"); + } + + let (sender, receiver) = mpsc::channel(); + let iter = &Mutex::new(tests.into_iter()); + thread::scope(|scope| { + // Start worker threads + for _ in 0..self.num_threads { + // Clone sender so it's dropped once the thread finishes + let thread_sender = sender.clone(); + thread::Builder::new() + // Specify a larger-than-default stack size to prevent overflowing stack in large programs. + // (the default is 2MB) + .stack_size(STACK_SIZE) + .spawn_scoped(scope, move || loop { + // Get next test to process from the iterator. + let Some(test) = iter.lock().unwrap().next() else { + break; + }; + + self.formatter + .test_start_async(&test.name, &test.package_name) + .expect("Could not display test start"); + + let time_before_test = std::time::Instant::now(); + let (status, output) = match catch_unwind(test.runner) { + Ok((status, output)) => (status, output), + Err(err) => ( + TestStatus::Fail { + message: + // It seems `panic!("...")` makes the error be `&str`, so we handle this common case + if let Some(message) = err.downcast_ref::<&str>() { + message.to_string() + } else { + "An unexpected error happened".to_string() + }, + error_diagnostic: None, + }, + String::new(), + ), + }; + let time_to_run = time_before_test.elapsed(); + + let test_result = TestResult { + name: test.name, + package_name: test.package_name, + status, + output, + time_to_run, + }; + + self.formatter + .test_end_async( + &test_result, + self.file_manager, + self.args.show_output, + self.args.compile_options.deny_warnings, + self.args.compile_options.silence_warnings, + ) + .expect("Could not display test start"); + + if thread_sender.send(test_result).is_err() { + break; + } + }) + .unwrap(); } - TestStatus::Fail { message, error_diagnostic } => { - writer - .set_color(ColorSpec::new().set_fg(Some(Color::Red))) - .expect("Failed to set color"); - writeln!(writer, "FAIL\n{message}\n").expect("Failed to write to stderr"); - if let Some(diag) = error_diagnostic { - noirc_errors::reporter::report_all( - file_manager.as_file_map(), - &[diag.clone()], - compile_options.deny_warnings, - compile_options.silence_warnings, - ); + + // Also drop main sender so the channel closes + drop(sender); + + // We'll go package by package, but we might get test results from packages ahead of us. + // We'll buffer those here and show them all at once when we get to those packages. + let mut buffer: HashMap> = HashMap::new(); + for (package_name, total_test_count) in test_count_per_package { + let mut test_report = Vec::new(); + + let mut current_test_count = 0; + let total_test_count = *total_test_count; + + self.formatter + .package_start_sync(package_name, total_test_count) + .expect("Could not display package start"); + + // Check if we have buffered test results for this package + if let Some(buffered_tests) = buffer.remove(package_name) { + for test_result in buffered_tests { + self.display_test_result( + &test_result, + current_test_count + 1, + total_test_count, + ) + .expect("Could not display test status"); + test_report.push(test_result); + current_test_count += 1; + } + } + + if current_test_count < total_test_count { + while let Ok(test_result) = receiver.recv() { + if test_result.status.failed() { + all_passed = false; + } + + // This is a test result from a different package: buffer it. + if &test_result.package_name != package_name { + buffer + .entry(test_result.package_name.clone()) + .or_default() + .push(test_result); + continue; + } + + self.display_test_result( + &test_result, + current_test_count + 1, + total_test_count, + ) + .expect("Could not display test status"); + test_report.push(test_result); + current_test_count += 1; + if current_test_count == total_test_count { + break; + } + } } + + self.formatter + .package_end( + package_name, + &test_report, + self.file_manager, + self.args.show_output, + self.args.compile_options.deny_warnings, + self.args.compile_options.silence_warnings, + ) + .expect("Could not display test report"); } - TestStatus::Skipped { .. } => { - writer - .set_color(ColorSpec::new().set_fg(Some(Color::Yellow))) - .expect("Failed to set color"); - writeln!(writer, "skipped").expect("Failed to write to stderr"); + }); + + all_passed + } + + /// Compiles all packages in parallel and returns their tests + fn collect_packages_tests(&'a self) -> Result>>, CliError> { + let mut package_tests = BTreeMap::new(); + let mut error = None; + + let (sender, receiver) = mpsc::channel(); + let iter = &Mutex::new(self.workspace.into_iter()); + + thread::scope(|scope| { + // Start worker threads + for _ in 0..self.num_threads { + // Clone sender so it's dropped once the thread finishes + let thread_sender = sender.clone(); + thread::Builder::new() + // Specify a larger-than-default stack size to prevent overflowing stack in large programs. + // (the default is 2MB) + .stack_size(STACK_SIZE) + .spawn_scoped(scope, move || loop { + // Get next package to process from the iterator. + let Some(package) = iter.lock().unwrap().next() else { + break; + }; + let tests = self.collect_package_tests::( + package, + self.args.oracle_resolver.as_deref(), + Some(self.workspace.root_dir.clone()), + package.name.to_string(), + ); + if thread_sender.send((package, tests)).is_err() { + break; + } + }) + .unwrap(); } - TestStatus::CompileError(err) => { - noirc_errors::reporter::report_all( - file_manager.as_file_map(), - &[err.clone()], - compile_options.deny_warnings, - compile_options.silence_warnings, - ); + + // Also drop main sender so the channel closes + drop(sender); + + for (package, tests) in receiver.iter() { + match tests { + Ok(tests) => { + package_tests.insert(package.name.to_string(), tests); + } + Err(err) => { + error = Some(err); + } + } } + }); + + if let Some(error) = error { + Err(error) + } else { + Ok(package_tests) } - writer.reset().expect("Failed to reset writer"); } - write!(writer, "[{}] ", package.name).expect("Failed to write to stderr"); + /// Compiles a single package and returns all of its tests + fn collect_package_tests + Default>( + &'a self, + package: &'a Package, + foreign_call_resolver_url: Option<&'a str>, + root_path: Option, + package_name: String, + ) -> Result>, CliError> { + let test_functions = self.get_tests_in_package(package)?; + + let tests: Vec = test_functions + .into_iter() + .map(|test_name| { + let test_name_copy = test_name.clone(); + let root_path = root_path.clone(); + let package_name_clone = package_name.clone(); + let package_name_clone2 = package_name.clone(); + let runner = Box::new(move || { + self.run_test::( + package, + &test_name, + foreign_call_resolver_url, + root_path, + package_name_clone.clone(), + ) + }); + Test { name: test_name_copy, package_name: package_name_clone2, runner } + }) + .collect(); - let count_all = test_report.len(); - let count_failed = test_report.iter().filter(|(_, status)| status.failed()).count(); - let plural = if count_all == 1 { "" } else { "s" }; - if count_failed == 0 { - writer.set_color(ColorSpec::new().set_fg(Some(Color::Green))).expect("Failed to set color"); - write!(writer, "{count_all} test{plural} passed").expect("Failed to write to stderr"); - writer.reset().expect("Failed to reset writer"); - writeln!(writer).expect("Failed to write to stderr"); - } else { - let count_passed = count_all - count_failed; - let plural_failed = if count_failed == 1 { "" } else { "s" }; - let plural_passed = if count_passed == 1 { "" } else { "s" }; - - if count_passed != 0 { - writer - .set_color(ColorSpec::new().set_fg(Some(Color::Green))) - .expect("Failed to set color"); - write!(writer, "{count_passed} test{plural_passed} passed, ",) - .expect("Failed to write to stderr"); - } + Ok(tests) + } + + /// Compiles a single package and returns all of its test names + fn get_tests_in_package(&'a self, package: &'a Package) -> Result, CliError> { + let (mut context, crate_id) = + prepare_package(self.file_manager, self.parsed_files, package); + check_crate_and_report_errors(&mut context, crate_id, &self.args.compile_options)?; - writer.set_color(ColorSpec::new().set_fg(Some(Color::Red))).expect("Failed to set color"); - writeln!(writer, "{count_failed} test{plural_failed} failed") - .expect("Failed to write to stderr"); - writer.reset().expect("Failed to reset writer"); + Ok(context + .get_all_test_functions_in_crate_matching(&crate_id, self.pattern) + .into_iter() + .map(|(test_name, _)| test_name) + .collect()) + } + + /// Runs a single test and returns its status together with whatever was printed to stdout + /// during the test. + fn run_test + Default>( + &'a self, + package: &Package, + fn_name: &str, + foreign_call_resolver_url: Option<&str>, + root_path: Option, + package_name: String, + ) -> (TestStatus, String) { + // This is really hacky but we can't share `Context` or `S` across threads. + // We then need to construct a separate copy for each test. + + let (mut context, crate_id) = + prepare_package(self.file_manager, self.parsed_files, package); + check_crate(&mut context, crate_id, &self.args.compile_options) + .expect("Any errors should have occurred when collecting test functions"); + + let test_functions = context + .get_all_test_functions_in_crate_matching(&crate_id, FunctionNameMatch::Exact(fn_name)); + let (_, test_function) = test_functions.first().expect("Test function should exist"); + + let blackbox_solver = S::default(); + let mut output_string = String::new(); + + let test_status = nargo::ops::run_test( + &blackbox_solver, + &mut context, + test_function, + PrintOutput::String(&mut output_string), + foreign_call_resolver_url, + root_path, + Some(package_name), + &self.args.compile_options, + ); + (test_status, output_string) } - Ok(()) + /// Display the status of a single test + fn display_test_result( + &'a self, + test_result: &'a TestResult, + current_test_count: usize, + total_test_count: usize, + ) -> std::io::Result<()> { + self.formatter.test_end_sync( + test_result, + current_test_count, + total_test_count, + self.file_manager, + self.args.show_output, + self.args.compile_options.deny_warnings, + self.args.compile_options.silence_warnings, + ) + } } diff --git a/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd/formatters.rs b/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd/formatters.rs new file mode 100644 index 00000000000..1b9b2d50378 --- /dev/null +++ b/noir/noir-repo/tooling/nargo_cli/src/cli/test_cmd/formatters.rs @@ -0,0 +1,539 @@ +use std::{io::Write, panic::RefUnwindSafe, time::Duration}; + +use fm::FileManager; +use nargo::ops::TestStatus; +use noirc_errors::{reporter::stack_trace, FileDiagnostic}; +use serde_json::{json, Map}; +use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, StandardStreamLock, WriteColor}; + +use super::TestResult; + +/// A formatter for showing test results. +/// +/// The order of events is: +/// 1. Compilation of all packages happen (in parallel). There's no formatter method for this. +/// 2. If compilation is successful, one `package_start_async` for each package. +/// 3. For each test, one `test_start_async` event +/// (there's no `test_start_sync` event because it would happen right before `test_end_sync`) +/// 4. For each package, sequentially: +/// a. A `package_start_sync` event +/// b. One `test_end` event for each test +/// a. A `package_end` event +/// +/// The reason we have some `sync` and `async` events is that formatters that show output +/// to humans rely on the `sync` events to show a more predictable output (package by package), +/// and formatters that output to a machine-readable format (like JSON) rely on the `async` +/// events to show things as soon as they happen, regardless of a package ordering. +pub(super) trait Formatter: Send + Sync + RefUnwindSafe { + fn package_start_async(&self, package_name: &str, test_count: usize) -> std::io::Result<()>; + + fn package_start_sync(&self, package_name: &str, test_count: usize) -> std::io::Result<()>; + + fn test_start_async(&self, name: &str, package_name: &str) -> std::io::Result<()>; + + #[allow(clippy::too_many_arguments)] + fn test_end_async( + &self, + test_result: &TestResult, + file_manager: &FileManager, + show_output: bool, + deny_warnings: bool, + silence_warnings: bool, + ) -> std::io::Result<()>; + + #[allow(clippy::too_many_arguments)] + fn test_end_sync( + &self, + test_result: &TestResult, + current_test_count: usize, + total_test_count: usize, + file_manager: &FileManager, + show_output: bool, + deny_warnings: bool, + silence_warnings: bool, + ) -> std::io::Result<()>; + + fn package_end( + &self, + package_name: &str, + test_results: &[TestResult], + file_manager: &FileManager, + show_output: bool, + deny_warnings: bool, + silence_warnings: bool, + ) -> std::io::Result<()>; +} + +pub(super) struct PrettyFormatter; + +impl Formatter for PrettyFormatter { + fn package_start_async(&self, _package_name: &str, _test_count: usize) -> std::io::Result<()> { + Ok(()) + } + + fn package_start_sync(&self, package_name: &str, test_count: usize) -> std::io::Result<()> { + package_start(package_name, test_count) + } + + fn test_start_async(&self, _name: &str, _package_name: &str) -> std::io::Result<()> { + Ok(()) + } + + fn test_end_async( + &self, + _test_result: &TestResult, + _file_manager: &FileManager, + _show_output: bool, + _deny_warnings: bool, + _silence_warnings: bool, + ) -> std::io::Result<()> { + Ok(()) + } + + fn test_end_sync( + &self, + test_result: &TestResult, + _current_test_count: usize, + _total_test_count: usize, + file_manager: &FileManager, + show_output: bool, + deny_warnings: bool, + silence_warnings: bool, + ) -> std::io::Result<()> { + let writer = StandardStream::stderr(ColorChoice::Always); + let mut writer = writer.lock(); + + let is_slow = test_result.time_to_run >= Duration::from_secs(30); + let show_time = |writer: &mut StandardStreamLock<'_>| { + if is_slow { + write!(writer, " <{:.3}s>", test_result.time_to_run.as_secs_f64()) + } else { + Ok(()) + } + }; + + write!(writer, "[{}] Testing {}... ", &test_result.package_name, &test_result.name)?; + writer.flush()?; + + match &test_result.status { + TestStatus::Pass { .. } => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(writer, "ok")?; + writer.reset()?; + show_time(&mut writer)?; + writeln!(writer)?; + } + TestStatus::Fail { message, error_diagnostic } => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; + write!(writer, "FAIL\n{message}\n")?; + writer.reset()?; + show_time(&mut writer)?; + writeln!(writer)?; + if let Some(diag) = error_diagnostic { + noirc_errors::reporter::report_all( + file_manager.as_file_map(), + &[diag.clone()], + deny_warnings, + silence_warnings, + ); + } + } + TestStatus::Skipped { .. } => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))?; + write!(writer, "skipped")?; + writer.reset()?; + show_time(&mut writer)?; + writeln!(writer)?; + } + TestStatus::CompileError(file_diagnostic) => { + noirc_errors::reporter::report_all( + file_manager.as_file_map(), + &[file_diagnostic.clone()], + deny_warnings, + silence_warnings, + ); + } + } + + if show_output && !test_result.output.is_empty() { + writeln!(writer, "--- {} stdout ---", test_result.name)?; + write!(writer, "{}", test_result.output)?; + let name_len = test_result.name.len(); + writeln!(writer, "{}", "-".repeat(name_len + "--- stdout ---".len())) + } else { + Ok(()) + } + } + + fn package_end( + &self, + package_name: &str, + test_results: &[TestResult], + _file_manager: &FileManager, + _show_output: bool, + _deny_warnings: bool, + _silence_warnings: bool, + ) -> std::io::Result<()> { + let writer = StandardStream::stderr(ColorChoice::Always); + let mut writer = writer.lock(); + + let failed_tests: Vec<_> = test_results + .iter() + .filter_map(|test_result| test_result.status.failed().then_some(&test_result.name)) + .collect(); + + if !failed_tests.is_empty() { + writeln!(writer)?; + writeln!(writer, "[{}] Failures:", package_name)?; + for failed_test in failed_tests { + writeln!(writer, " {}", failed_test)?; + } + writeln!(writer)?; + } + + write!(writer, "[{}] ", package_name)?; + + let count_all = test_results.len(); + let count_failed = + test_results.iter().filter(|test_result| test_result.status.failed()).count(); + let plural = if count_all == 1 { "" } else { "s" }; + if count_failed == 0 { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(writer, "{count_all} test{plural} passed")?; + writer.reset()?; + writeln!(writer)?; + } else { + let count_passed = count_all - count_failed; + let plural_failed = if count_failed == 1 { "" } else { "s" }; + let plural_passed = if count_passed == 1 { "" } else { "s" }; + + if count_passed != 0 { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(writer, "{count_passed} test{plural_passed} passed, ")?; + } + + writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; + writeln!(writer, "{count_failed} test{plural_failed} failed")?; + writer.reset()?; + } + + Ok(()) + } +} + +pub(super) struct TerseFormatter; + +impl Formatter for TerseFormatter { + fn package_start_async(&self, _package_name: &str, _test_count: usize) -> std::io::Result<()> { + Ok(()) + } + + fn package_start_sync(&self, package_name: &str, test_count: usize) -> std::io::Result<()> { + package_start(package_name, test_count) + } + + fn test_start_async(&self, _name: &str, _package_name: &str) -> std::io::Result<()> { + Ok(()) + } + + fn test_end_async( + &self, + _test_result: &TestResult, + _file_manager: &FileManager, + _show_output: bool, + _deny_warnings: bool, + _silence_warnings: bool, + ) -> std::io::Result<()> { + Ok(()) + } + + fn test_end_sync( + &self, + test_result: &TestResult, + current_test_count: usize, + total_test_count: usize, + _file_manager: &FileManager, + _show_output: bool, + _deny_warnings: bool, + _silence_warnings: bool, + ) -> std::io::Result<()> { + let writer = StandardStream::stderr(ColorChoice::Always); + let mut writer = writer.lock(); + + match &test_result.status { + TestStatus::Pass => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(writer, ".")?; + writer.reset()?; + } + TestStatus::Fail { .. } | TestStatus::CompileError(_) => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; + write!(writer, "F")?; + writer.reset()?; + } + TestStatus::Skipped => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))?; + write!(writer, "s")?; + writer.reset()?; + } + } + + // How many tests ('.', 'F', etc.) to print per line. + // We use 88 which is a bit more than the traditional 80 columns (screens are larger these days) + // but we also want the output to be readable in case the terminal isn't maximized. + const MAX_TESTS_PER_LINE: usize = 88; + + if current_test_count % MAX_TESTS_PER_LINE == 0 && current_test_count < total_test_count { + writeln!(writer, " {}/{}", current_test_count, total_test_count)?; + } + + Ok(()) + } + + fn package_end( + &self, + package_name: &str, + test_results: &[TestResult], + file_manager: &FileManager, + show_output: bool, + deny_warnings: bool, + silence_warnings: bool, + ) -> std::io::Result<()> { + let writer = StandardStream::stderr(ColorChoice::Always); + let mut writer = writer.lock(); + + if !test_results.is_empty() { + writeln!(writer)?; + } + + for test_result in test_results { + if (show_output && !test_result.output.is_empty()) || test_result.status.failed() { + writeln!(writer, "--- {} stdout ---", test_result.name)?; + if !test_result.output.is_empty() { + write!(writer, "{}", test_result.output)?; + } + + match &test_result.status { + TestStatus::Pass | TestStatus::Skipped => (), + TestStatus::Fail { message, error_diagnostic } => { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; + writeln!(writer, "{message}")?; + writer.reset()?; + if let Some(diag) = error_diagnostic { + noirc_errors::reporter::report_all( + file_manager.as_file_map(), + &[diag.clone()], + deny_warnings, + silence_warnings, + ); + } + } + TestStatus::CompileError(file_diagnostic) => { + noirc_errors::reporter::report_all( + file_manager.as_file_map(), + &[file_diagnostic.clone()], + deny_warnings, + silence_warnings, + ); + } + } + + let name_len = test_result.name.len(); + writeln!(writer, "{}", "-".repeat(name_len + "--- stdout ---".len()))?; + } + } + + let failed_tests: Vec<_> = test_results + .iter() + .filter_map(|test_result| test_result.status.failed().then_some(&test_result.name)) + .collect(); + + if !failed_tests.is_empty() { + writeln!(writer)?; + writeln!(writer, "[{}] Failures:", package_name)?; + for failed_test in failed_tests { + writeln!(writer, " {}", failed_test)?; + } + writeln!(writer)?; + } + + write!(writer, "[{}] ", package_name)?; + + let count_all = test_results.len(); + let count_failed = + test_results.iter().filter(|test_result| test_result.status.failed()).count(); + let plural = if count_all == 1 { "" } else { "s" }; + if count_failed == 0 { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(writer, "{count_all} test{plural} passed")?; + writer.reset()?; + writeln!(writer)?; + } else { + let count_passed = count_all - count_failed; + let plural_failed = if count_failed == 1 { "" } else { "s" }; + let plural_passed = if count_passed == 1 { "" } else { "s" }; + + if count_passed != 0 { + writer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(writer, "{count_passed} test{plural_passed} passed, ")?; + } + + writer.set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; + writeln!(writer, "{count_failed} test{plural_failed} failed")?; + writer.reset()?; + } + + Ok(()) + } +} + +pub(super) struct JsonFormatter; + +impl Formatter for JsonFormatter { + fn package_start_async(&self, package_name: &str, test_count: usize) -> std::io::Result<()> { + let json = json!({"type": "suite", "event": "started", "name": package_name, "test_count": test_count}); + println!("{json}"); + Ok(()) + } + + fn package_start_sync(&self, _package_name: &str, _test_count: usize) -> std::io::Result<()> { + Ok(()) + } + + fn test_start_async(&self, name: &str, package_name: &str) -> std::io::Result<()> { + let json = json!({"type": "test", "event": "started", "name": name, "suite": package_name}); + println!("{json}"); + Ok(()) + } + + fn test_end_async( + &self, + test_result: &TestResult, + file_manager: &FileManager, + show_output: bool, + _deny_warnings: bool, + silence_warnings: bool, + ) -> std::io::Result<()> { + let mut json = Map::new(); + json.insert("type".to_string(), json!("test")); + json.insert("name".to_string(), json!(&test_result.name)); + json.insert("exec_time".to_string(), json!(test_result.time_to_run.as_secs_f64())); + + let mut stdout = String::new(); + if show_output && !test_result.output.is_empty() { + stdout.push_str(test_result.output.trim()); + } + + match &test_result.status { + TestStatus::Pass => { + json.insert("event".to_string(), json!("ok")); + } + TestStatus::Fail { message, error_diagnostic } => { + json.insert("event".to_string(), json!("failed")); + + if !stdout.is_empty() { + stdout.push('\n'); + } + stdout.push_str(message.trim()); + + if let Some(diagnostic) = error_diagnostic { + if !(diagnostic.diagnostic.is_warning() && silence_warnings) { + stdout.push('\n'); + stdout.push_str(&diagnostic_to_string(diagnostic, file_manager)); + } + } + } + TestStatus::Skipped => { + json.insert("event".to_string(), json!("ignored")); + } + TestStatus::CompileError(diagnostic) => { + json.insert("event".to_string(), json!("failed")); + + if !(diagnostic.diagnostic.is_warning() && silence_warnings) { + if !stdout.is_empty() { + stdout.push('\n'); + } + stdout.push_str(&diagnostic_to_string(diagnostic, file_manager)); + } + } + } + + if !stdout.is_empty() { + json.insert("stdout".to_string(), json!(stdout)); + } + + let json = json!(json); + println!("{json}"); + + Ok(()) + } + + fn test_end_sync( + &self, + _test_result: &TestResult, + _current_test_count: usize, + _total_test_count: usize, + _file_manager: &FileManager, + _show_output: bool, + _deny_warnings: bool, + _silence_warnings: bool, + ) -> std::io::Result<()> { + Ok(()) + } + + fn package_end( + &self, + _package_name: &str, + test_results: &[TestResult], + _file_manager: &FileManager, + _show_output: bool, + _deny_warnings: bool, + _silence_warnings: bool, + ) -> std::io::Result<()> { + let mut passed = 0; + let mut failed = 0; + let mut ignored = 0; + for test_result in test_results { + match &test_result.status { + TestStatus::Pass => passed += 1, + TestStatus::Fail { .. } | TestStatus::CompileError(..) => failed += 1, + TestStatus::Skipped => ignored += 1, + } + } + let event = if failed == 0 { "ok" } else { "failed" }; + let json = json!({"type": "suite", "event": event, "passed": passed, "failed": failed, "ignored": ignored}); + println!("{json}"); + Ok(()) + } +} + +fn package_start(package_name: &str, test_count: usize) -> std::io::Result<()> { + let plural = if test_count == 1 { "" } else { "s" }; + println!("[{package_name}] Running {test_count} test function{plural}"); + Ok(()) +} + +fn diagnostic_to_string(file_diagnostic: &FileDiagnostic, file_manager: &FileManager) -> String { + let file_map = file_manager.as_file_map(); + + let custom_diagnostic = &file_diagnostic.diagnostic; + let mut message = String::new(); + message.push_str(custom_diagnostic.message.trim()); + + for note in &custom_diagnostic.notes { + message.push('\n'); + message.push_str(note.trim()); + } + + if let Ok(name) = file_map.get_name(file_diagnostic.file_id) { + message.push('\n'); + message.push_str(&format!("at {name}")); + } + + if !custom_diagnostic.call_stack.is_empty() { + message.push('\n'); + message.push_str(&stack_trace(file_map, &custom_diagnostic.call_stack)); + } + + message +} diff --git a/noir/noir-repo/tooling/nargo_cli/src/errors.rs b/noir/noir-repo/tooling/nargo_cli/src/errors.rs index b28012ae7aa..9255d6fc6a6 100644 --- a/noir/noir-repo/tooling/nargo_cli/src/errors.rs +++ b/noir/noir-repo/tooling/nargo_cli/src/errors.rs @@ -2,7 +2,11 @@ use acvm::{acir::native_types::WitnessStackError, FieldElement}; use nargo::{errors::CompileError, NargoError}; use nargo_toml::ManifestError; use noir_debugger::errors::DapError; -use noirc_abi::errors::{AbiError, InputParserError}; +use noirc_abi::{ + errors::{AbiError, InputParserError}, + input_parser::InputValue, + AbiReturnType, +}; use std::path::PathBuf; use thiserror::Error; @@ -32,6 +36,7 @@ pub(crate) enum FilesystemError { pub(crate) enum CliError { #[error("{0}")] Generic(String), + #[error("Error: destination {} already exists", .0.display())] DestinationAlreadyExists(PathBuf), @@ -63,4 +68,10 @@ pub(crate) enum CliError { /// Error from the compilation pipeline #[error(transparent)] CompileError(#[from] CompileError), + + #[error("Unexpected return value: expected {expected:?}; got {actual:?}")] + UnexpectedReturn { expected: InputValue, actual: Option }, + + #[error("Missing return witnesses; expected {expected:?}")] + MissingReturn { expected: AbiReturnType }, } diff --git a/noir/noir-repo/tooling/nargo_cli/tests/stdlib-props.rs b/noir/noir-repo/tooling/nargo_cli/tests/stdlib-props.rs index 86c225831b9..a19408bd5fd 100644 --- a/noir/noir-repo/tooling/nargo_cli/tests/stdlib-props.rs +++ b/noir/noir-repo/tooling/nargo_cli/tests/stdlib-props.rs @@ -2,7 +2,9 @@ use std::{cell::RefCell, collections::BTreeMap, path::Path}; use acvm::{acir::native_types::WitnessStack, AcirField, FieldElement}; use iter_extended::vecmap; -use nargo::{foreign_calls::DefaultForeignCallExecutor, ops::execute_program, parse_all}; +use nargo::{ + foreign_calls::DefaultForeignCallExecutor, ops::execute_program, parse_all, PrintOutput, +}; use noirc_abi::input_parser::InputValue; use noirc_driver::{ compile_main, file_manager_with_stdlib, prepare_crate, CompilationResult, CompileOptions, @@ -80,7 +82,7 @@ fn run_snippet_proptest( let blackbox_solver = bn254_blackbox_solver::Bn254BlackBoxSolver; let foreign_call_executor = - RefCell::new(DefaultForeignCallExecutor::new(false, None, None, None)); + RefCell::new(DefaultForeignCallExecutor::new(PrintOutput::None, None, None, None)); // Generate multiple input/output proptest!(ProptestConfig::with_cases(100), |(io in strategy)| { diff --git a/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs b/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs index 99f0c9a2e7f..29b871814b8 100644 --- a/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs +++ b/noir/noir-repo/tooling/nargo_cli/tests/stdlib-tests.rs @@ -2,6 +2,7 @@ #![allow(clippy::items_after_test_module)] use clap::Parser; use fm::FileManager; +use nargo::PrintOutput; use noirc_driver::{check_crate, file_manager_with_stdlib, CompileOptions}; use noirc_frontend::hir::FunctionNameMatch; use std::io::Write; @@ -86,7 +87,7 @@ fn run_stdlib_tests(force_brillig: bool, inliner_aggressiveness: i64) { &bn254_blackbox_solver::Bn254BlackBoxSolver, &mut context, &test_function, - true, + PrintOutput::Stdout, None, Some(dummy_package.root_dir.clone()), Some(dummy_package.name.to_string()), diff --git a/noir/noir-repo/tooling/nargo_toml/Cargo.toml b/noir/noir-repo/tooling/nargo_toml/Cargo.toml index 2bc24153836..f5f7d7cd595 100644 --- a/noir/noir-repo/tooling/nargo_toml/Cargo.toml +++ b/noir/noir-repo/tooling/nargo_toml/Cargo.toml @@ -25,4 +25,5 @@ noirc_driver.workspace = true semver = "1.0.20" [dev-dependencies] +tempfile.workspace = true test-case.workspace = true diff --git a/noir/noir-repo/tooling/nargo_toml/src/lib.rs b/noir/noir-repo/tooling/nargo_toml/src/lib.rs index c0d8c7997fd..b5c45977618 100644 --- a/noir/noir-repo/tooling/nargo_toml/src/lib.rs +++ b/noir/noir-repo/tooling/nargo_toml/src/lib.rs @@ -47,6 +47,35 @@ pub fn find_file_manifest(current_path: &Path) -> Option { } /// Returns the [PathBuf] of the directory containing the `Nargo.toml` by searching from `current_path` to the root of its [Path]. +/// When `workspace` is `true` it returns the topmost directory, when `false` the innermost one. +/// +/// Returns a [ManifestError] if no parent directories of `current_path` contain a manifest file. +pub fn find_root(current_path: &Path, workspace: bool) -> Result { + if workspace { + find_package_root(current_path) + } else { + find_file_root(current_path) + } +} + +/// Returns the [PathBuf] of the directory containing the `Nargo.toml` by searching from `current_path` to the root of its [Path], +/// returning at the innermost directory found, i.e. the one corresponding to the package that contains the `current_path`. +/// +/// Returns a [ManifestError] if no parent directories of `current_path` contain a manifest file. +pub fn find_file_root(current_path: &Path) -> Result { + match find_file_manifest(current_path) { + Some(manifest_path) => { + let package_root = manifest_path + .parent() + .expect("infallible: manifest file path can't be root directory"); + Ok(package_root.to_path_buf()) + } + None => Err(ManifestError::MissingFile(current_path.to_path_buf())), + } +} + +/// Returns the [PathBuf] of the directory containing the `Nargo.toml` by searching from `current_path` to the root of its [Path], +/// returning at the topmost directory found, i.e. the one corresponding to the entire workspace. /// /// Returns a [ManifestError] if no parent directories of `current_path` contain a manifest file. pub fn find_package_root(current_path: &Path) -> Result { @@ -60,6 +89,11 @@ pub fn find_package_root(current_path: &Path) -> Result } // TODO(#2323): We are probably going to need a "filepath utils" crate soon +/// Get the root of path, for example: +/// * `C:\foo\bar` -> `C:\foo` +/// * `//shared/foo/bar` -> `//shared/foo` +/// * `/foo` -> `/foo` +/// otherwise empty path. fn path_root(path: &Path) -> PathBuf { let mut components = path.components(); @@ -101,6 +135,7 @@ pub fn find_package_manifest( }) } } + /// Returns the [PathBuf] of the `Nargo.toml` file in the `current_path` directory. /// /// Returns a [ManifestError] if `current_path` does not contain a manifest file. @@ -469,7 +504,7 @@ fn resolve_package_from_toml( result } -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum PackageSelection { Selected(CrateName), DefaultOrAll, @@ -490,9 +525,20 @@ pub fn resolve_workspace_from_toml( Ok(workspace) } -#[test] -fn parse_standard_toml() { - let src = r#" +#[cfg(test)] +mod tests { + use std::{ + path::{Path, PathBuf}, + str::FromStr, + }; + + use test_case::test_matrix; + + use crate::{find_root, Config, ManifestError}; + + #[test] + fn parse_standard_toml() { + let src = r#" [package] name = "test" @@ -505,49 +551,49 @@ fn parse_standard_toml() { hello = {path = "./noir_driver"} "#; - assert!(Config::try_from(String::from(src)).is_ok()); - assert!(Config::try_from(src).is_ok()); -} + assert!(Config::try_from(String::from(src)).is_ok()); + assert!(Config::try_from(src).is_ok()); + } -#[test] -fn parse_package_toml_no_deps() { - let src = r#" + #[test] + fn parse_package_toml_no_deps() { + let src = r#" [package] name = "test" authors = ["kev", "foo"] compiler_version = "*" "#; - assert!(Config::try_from(String::from(src)).is_ok()); - assert!(Config::try_from(src).is_ok()); -} + assert!(Config::try_from(String::from(src)).is_ok()); + assert!(Config::try_from(src).is_ok()); + } -#[test] -fn parse_workspace_toml() { - let src = r#" + #[test] + fn parse_workspace_toml() { + let src = r#" [workspace] members = ["a", "b"] "#; - assert!(Config::try_from(String::from(src)).is_ok()); - assert!(Config::try_from(src).is_ok()); -} + assert!(Config::try_from(String::from(src)).is_ok()); + assert!(Config::try_from(src).is_ok()); + } -#[test] -fn parse_workspace_default_member_toml() { - let src = r#" + #[test] + fn parse_workspace_default_member_toml() { + let src = r#" [workspace] members = ["a", "b"] default-member = "a" "#; - assert!(Config::try_from(String::from(src)).is_ok()); - assert!(Config::try_from(src).is_ok()); -} + assert!(Config::try_from(String::from(src)).is_ok()); + assert!(Config::try_from(src).is_ok()); + } -#[test] -fn parse_package_expression_width_toml() { - let src = r#" + #[test] + fn parse_package_expression_width_toml() { + let src = r#" [package] name = "test" version = "0.1.0" @@ -556,6 +602,124 @@ fn parse_package_expression_width_toml() { expression_width = "3" "#; - assert!(Config::try_from(String::from(src)).is_ok()); - assert!(Config::try_from(src).is_ok()); + assert!(Config::try_from(String::from(src)).is_ok()); + assert!(Config::try_from(src).is_ok()); + } + + /// Test that `find_root` handles all kinds of prefixes. + /// (It dispatches based on `workspace` to methods which handle paths differently). + #[test_matrix( + [true, false], + ["C:\\foo\\bar", "//shared/foo/bar", "/foo/bar", "bar/baz", ""] + )] + fn test_find_root_does_not_panic(workspace: bool, path: &str) { + let path = PathBuf::from_str(path).unwrap(); + let error = find_root(&path, workspace).expect_err("non-existing paths"); + assert!(matches!(error, ManifestError::MissingFile(_))); + } + + /// Test to demonstrate how `find_root` works. + #[test] + fn test_find_root_example() { + const INDENT_SIZE: usize = 4; + /// Create directories and files according to a YAML-like layout below + fn setup(layout: &str, root: &Path) { + fn is_dir(item: &str) -> bool { + !item.contains('.') + } + let mut current_dir = root.to_path_buf(); + let mut current_indent = 0; + let mut last_item: Option = None; + + for line in layout.lines() { + if let Some((prefix, item)) = line.split_once('-') { + let item = item.replace(std::path::MAIN_SEPARATOR, "_").trim().to_string(); + + let indent = prefix.len() / INDENT_SIZE; + + if last_item.is_none() { + current_indent = indent; + } + + assert!( + indent <= current_indent + 1, + "cannot increase indent by more than {INDENT_SIZE}; item = {item}, current_dir={}", current_dir.display() + ); + + // Go into the last created directory + if indent > current_indent && last_item.is_some() { + let last_item = last_item.unwrap(); + assert!(is_dir(&last_item), "last item was not a dir: {last_item}"); + current_dir.push(last_item); + current_indent += 1; + } + // Go back into an ancestor directory + while indent < current_indent { + current_dir.pop(); + current_indent -= 1; + } + // Create a file or a directory + let item_path = current_dir.join(&item); + if is_dir(&item) { + std::fs::create_dir(&item_path).unwrap_or_else(|e| { + panic!("failed to create dir {}: {e}", item_path.display()) + }); + } else { + std::fs::write(&item_path, "").expect("failed to create file"); + } + + last_item = Some(item); + } + } + } + + // Temporary directory to hold the project. + let tmp = tempfile::tempdir().unwrap(); + // Join a string path to the tmp dir + let path = |p: &str| tmp.path().join(p); + // Check that an expected root is found + let assert_ok = |current_dir: &str, ws: bool, exp: &str| { + let root = find_root(&path(current_dir), ws).expect("should find a root"); + assert_eq!(root, path(exp)); + }; + // Check that a root is not found + let assert_err = |current_dir: &str| { + find_root(&path(current_dir), true).expect_err("shouldn't find a root"); + }; + + let layout = r" + - project + - docs + - workspace + - packages + - foo + - Nargo.toml + - Prover.toml + - src + - main.nr + - bar + - Nargo.toml + - src + - lib.nr + - Nargo.toml + - examples + - baz + - Nargo.toml + - src + - main.nr + "; + + // Set up the file system. + setup(layout, tmp.path()); + + assert_err("dummy"); + assert_err("project/docs"); + assert_err("project/examples"); + assert_ok("project/workspace", true, "project/workspace"); + assert_ok("project/workspace", false, "project/workspace"); + assert_ok("project/workspace/packages/foo", true, "project/workspace"); + assert_ok("project/workspace/packages/bar", false, "project/workspace/packages/bar"); + assert_ok("project/examples/baz/src", true, "project/examples/baz"); + assert_ok("project/examples/baz/src", false, "project/examples/baz"); + } } diff --git a/noir/noir-repo/tooling/profiler/src/cli/execution_flamegraph_cmd.rs b/noir/noir-repo/tooling/profiler/src/cli/execution_flamegraph_cmd.rs index 6d6da89f660..76b23ebf739 100644 --- a/noir/noir-repo/tooling/profiler/src/cli/execution_flamegraph_cmd.rs +++ b/noir/noir-repo/tooling/profiler/src/cli/execution_flamegraph_cmd.rs @@ -3,6 +3,7 @@ use std::path::{Path, PathBuf}; use acir::circuit::OpcodeLocation; use clap::Args; use color_eyre::eyre::{self, Context}; +use nargo::PrintOutput; use crate::flamegraph::{BrilligExecutionSample, FlamegraphGenerator, InfernoFlamegraphGenerator}; use crate::fs::{read_inputs_from_file, read_program_from_file}; @@ -54,7 +55,7 @@ fn run_with_generator( &program.bytecode, initial_witness, &Bn254BlackBoxSolver, - &mut DefaultForeignCallExecutor::new(true, None, None, None), + &mut DefaultForeignCallExecutor::new(PrintOutput::Stdout, None, None, None), )?; println!("Executed"); diff --git a/noir/noir-repo/yarn.lock b/noir/noir-repo/yarn.lock index 3c8df2b1772..07b6b677b62 100644 --- a/noir/noir-repo/yarn.lock +++ b/noir/noir-repo/yarn.lock @@ -226,7 +226,7 @@ __metadata: resolution: "@aztec/bb.js@portal:../../../../barretenberg/ts::locator=integration-tests%40workspace%3Acompiler%2Fintegration-tests" dependencies: comlink: ^4.4.1 - commander: ^10.0.1 + commander: ^12.1.0 debug: ^4.3.4 fflate: ^0.8.0 pako: ^2.1.0 @@ -9822,6 +9822,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 68e9818b00fc1ed9cdab9eb16905551c2b768a317ae69a5e3c43924c2b20ac9bb65b27e1cab36aeda7b6496376d4da908996ba2c0b5d79463e0fb1e77935d514 + languageName: node + linkType: hard + "commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" diff --git a/scripts/tmux_split_args.sh b/scripts/tmux_split_args.sh index 25b3a5a4b6f..4571c858cc9 100755 --- a/scripts/tmux_split_args.sh +++ b/scripts/tmux_split_args.sh @@ -29,17 +29,21 @@ commands=("$@") # Set pane-border-status to top and pane-border-format to display pane title tmux set-option -t "$session_name" pane-border-status top tmux set-option -t "$session_name" pane-border-format "#{pane_title}" +base_index=$(tmux show-options -g base-index 2>/dev/null | awk '{print $2}') +base_index=${base_index:-0} + +echo "Using tmux base_index=$base_index" # Create the necessary number of panes and set titles num_commands=${#commands[@]} for ((i=0; i&1 | grep -q "Starting containers" && \ echo "✅ Start command test passed" || \ @@ -97,7 +98,8 @@ test-data-dir: -p2p 40400 \ -ip 1.2.3.4 \ -k 0x00 \ - -d ./aztec-data + -d ./aztec-data \ + -n "troll-turtle" # Verify docker-compose.yml uses bind mount instead of named volume RUN grep -q "volumes:" docker-compose.yml && \ grep -q "./aztec-data:/var/lib/aztec" docker-compose.yml && \ @@ -113,7 +115,8 @@ test-p2p-key: -p2p 40400 \ -ip 1.2.3.4 \ -k 0x00 \ - -pk 00000 + -pk 00000 \ + -n "troll-turtle" # Verify the P2P private key was set in the .env file RUN test -f .env && \ grep -q "PEER_ID_PRIVATE_KEY=00000" .env && \ diff --git a/spartan/releases/rough-rhino/aztec-spartan.sh b/spartan/releases/rough-rhino/aztec-spartan.sh index efde3553553..c7cbe772395 100755 --- a/spartan/releases/rough-rhino/aztec-spartan.sh +++ b/spartan/releases/rough-rhino/aztec-spartan.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + # Colors and formatting BLUE='\033[0;34m' GREEN='\033[0;32m' @@ -8,7 +10,6 @@ YELLOW='\033[1;33m' NC='\033[0m' # No Color # Global variables -ARCH=$(uname -m) DEFAULT_P2P_PORT="40400" DEFAULT_PORT="8080" DEFAULT_KEY="0x0000000000000000000000000000000000000000000000000000000000000001" @@ -16,10 +17,27 @@ DEFAULT_KEY="0x0000000000000000000000000000000000000000000000000000000000000001" DEFAULT_IP=$(curl -s --connect-timeout 5 https://api.ipify.org?format=json | grep -o '"ip":"[^"]*' | cut -d'"' -f4 || echo "") DEFAULT_BIND_MOUNT_DIR="$HOME/aztec-data" + # Parse command line arguments parse_args() { while [[ $# -gt 0 ]]; do case $1 in + -b|--bootnode-url) + BOOTNODE_URL="$2" + shift 2 + ;; + -n|--network) + NETWORK="$2" + shift 2 + ;; + -i|--image) + IMAGE="$2" + shift 2 + ;; + -e|--ethereum-host) + ETHEREUM_HOST="$2" + shift 2 + ;; -p|--port) CLI_PORT="$2" shift 2 @@ -107,12 +125,64 @@ get_public_ip() { fi } +get_node_info() { + echo -e "${BLUE}Fetching node info...${NC}" + CMD="get-node-info --node-url ${BOOTNODE_URL} --json" + # TODO: use the correct (corresponding) image + # Can't do it today because `release/troll-turtle` doesn't support --json flag + NODE_INFO=$(curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"node_getNodeInfo","params":[],"id":1}' -s ${BOOTNODE_URL}) + + # Extract the relevant fields + result=$(echo $NODE_INFO | jq -r '.result') + L1_CHAIN_ID=$(echo $result | jq -r '.l1ChainId') + BOOTSTRAP_NODES=$(echo $result | jq -r '.enr') + REGISTRY_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.registryAddress') + GOVERNANCE_PROPOSER_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.governanceProposerAddress') + FEE_JUICE_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.feeJuiceAddress') + ROLLUP_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.rollupAddress') + REWARD_DISTRIBUTOR_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.rewardDistributorAddress') + GOVERNANCE_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.governanceAddress') + COIN_ISSUER_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.coinIssuerAddress') + FEE_JUICE_PORTAL_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.feeJuicePortalAddress') + INBOX_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.inboxAddress') + OUTBOX_CONTRACT_ADDRESS=$(echo $result | jq -r '.l1ContractAddresses.outboxAddress') + + echo -e "${GREEN}Node info fetched successfully${NC}" + return 0 +} + # Configure environment configure_environment() { local args=("$@") parse_args "${args[@]}" echo -e "${BLUE}Configuring environment...${NC}" + if [ -n "$NETWORK" ]; then + NETWORK="$NETWORK" + else + read -p "Network [troll-turtle]: " NETWORK + NETWORK=${NETWORK:-troll-turtle} + fi + + # if the network is `troll-turtle` + if [ "$NETWORK" = "troll-turtle" ]; then + BOOTNODE_URL="${BOOTNODE_URL:-http://34.82.213.6:8080}" + ETHEREUM_HOST="${ETHEREUM_HOST:-http://34.19.127.9:8545}" + IMAGE="${IMAGE:-aztecprotocol/aztec:0.67.1}" + else + # unknown network + echo -e "${RED}Unknown network: $NETWORK${NC}" + fi + + # Check that bootnode, ethereum host, and image are set + if [ -z "$BOOTNODE_URL" ] || [ -z "$ETHEREUM_HOST" ] || [ -z "$IMAGE" ]; then + echo -e "${RED}Bootnode, Ethereum host, and image are required${NC}" + exit 1 + fi + + # get the node info + get_node_info + if [ -n "$CLI_P2P_PORT" ]; then P2P_PORT="$CLI_P2P_PORT" @@ -184,25 +254,25 @@ DEBUG=aztec:*,-aztec:avm_simulator*,-aztec:circuits:artifact_hash,-aztec:libp2p_ LOG_LEVEL=debug AZTEC_PORT=${PORT} P2P_ENABLED=true -L1_CHAIN_ID=1337 +L1_CHAIN_ID=${L1_CHAIN_ID} PROVER_REAL_PROOFS=true PXE_PROVER_ENABLED=true ETHEREUM_SLOT_DURATION=12sec AZTEC_SLOT_DURATION=36 AZTEC_EPOCH_DURATION=32 AZTEC_EPOCH_PROOF_CLAIM_WINDOW_IN_L2_SLOTS=13 -ETHEREUM_HOST=http://34.48.76.131:8545 -BOOTSTRAP_NODES=enr:-Jq4QO_3szmgtG2cbEdnFDIhpGAQkc1HwfNy4-M6sG9QmQbPTmp9PMOHR3xslfR23hORiU-GpA7uM9uXw49lFcnuuvYGjWF6dGVjX25ldHdvcmsBgmlkgnY0gmlwhCIwTIOJc2VjcDI1NmsxoQKQTN17XKCwjYSSwmTc-6YzCMhd3v6Ofl8TS-WunX6LCoN0Y3CCndCDdWRwgp3Q -REGISTRY_CONTRACT_ADDRESS=0x5fbdb2315678afecb367f032d93f642f64180aa3 -GOVERNANCE_PROPOSER_CONTRACT_ADDRESS=0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0 -FEE_JUICE_CONTRACT_ADDRESS=0xe7f1725e7734ce288f8367e1bb143e90bb3f0512 -ROLLUP_CONTRACT_ADDRESS=0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 -REWARD_DISTRIBUTOR_CONTRACT_ADDRESS=0x5fc8d32690cc91d4c39d9d3abcbd16989f875707 -GOVERNANCE_CONTRACT_ADDRESS=0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9 -COIN_ISSUER_CONTRACT_ADDRESS=0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 -FEE_JUICE_PORTAL_CONTRACT_ADDRESS=0x0165878a594ca255338adfa4d48449f69242eb8f -INBOX_CONTRACT_ADDRESS=0xed179b78d5781f93eb169730d8ad1be7313123f4 -OUTBOX_CONTRACT_ADDRESS=0x1016b5aaa3270a65c315c664ecb238b6db270b64 +ETHEREUM_HOST=${ETHEREUM_HOST} +BOOTSTRAP_NODES=${BOOTSTRAP_NODES} +REGISTRY_CONTRACT_ADDRESS=${REGISTRY_CONTRACT_ADDRESS} +GOVERNANCE_PROPOSER_CONTRACT_ADDRESS=${GOVERNANCE_PROPOSER_CONTRACT_ADDRESS} +FEE_JUICE_CONTRACT_ADDRESS=${FEE_JUICE_CONTRACT_ADDRESS} +ROLLUP_CONTRACT_ADDRESS=${ROLLUP_CONTRACT_ADDRESS} +REWARD_DISTRIBUTOR_CONTRACT_ADDRESS=${REWARD_DISTRIBUTOR_CONTRACT_ADDRESS} +GOVERNANCE_CONTRACT_ADDRESS=${GOVERNANCE_CONTRACT_ADDRESS} +COIN_ISSUER_CONTRACT_ADDRESS=${COIN_ISSUER_CONTRACT_ADDRESS} +FEE_JUICE_PORTAL_CONTRACT_ADDRESS=${FEE_JUICE_PORTAL_CONTRACT_ADDRESS} +INBOX_CONTRACT_ADDRESS=${INBOX_CONTRACT_ADDRESS} +OUTBOX_CONTRACT_ADDRESS=${OUTBOX_CONTRACT_ADDRESS} P2P_UDP_LISTEN_ADDR=0.0.0.0:${P2P_PORT} P2P_TCP_LISTEN_ADDR=0.0.0.0:${P2P_PORT} DATA_DIRECTORY=/var/lib/aztec @@ -216,7 +286,7 @@ services: network_mode: host restart: unless-stopped env_file: .env - image: aztecprotocol/aztec:698cd3d62680629a3f1bfc0f82604534cedbccf3-${ARCH} + image: ${IMAGE} entrypoint: > sh -c ' diff --git a/spartan/terraform/deploy-metrics/main.tf b/spartan/terraform/deploy-metrics/main.tf index 2a72457fb6e..187e8ad88bb 100644 --- a/spartan/terraform/deploy-metrics/main.tf +++ b/spartan/terraform/deploy-metrics/main.tf @@ -40,6 +40,7 @@ resource "helm_release" "aztec-gke-cluster" { upgrade_install = true dependency_update = true force_update = true + reuse_values = true # base values file values = [file("../../metrics/values/${var.VALUES_FILE}")] diff --git a/spartan/terraform/deploy-release/main.tf b/spartan/terraform/deploy-release/main.tf index 73eba9e5b37..84d44bae93e 100644 --- a/spartan/terraform/deploy-release/main.tf +++ b/spartan/terraform/deploy-release/main.tf @@ -52,6 +52,11 @@ resource "helm_release" "aztec-gke-cluster" { value = var.L1_DEPLOYMENT_MNEMONIC } + set { + name = "aztec.l1Salt" + value = var.L1_DEPLOYMENT_SALT + } + # Setting timeout and wait conditions timeout = 1200 # 20 minutes in seconds wait = true diff --git a/spartan/terraform/deploy-release/variables.tf b/spartan/terraform/deploy-release/variables.tf index 0dff0d4509b..7a5fbc364aa 100644 --- a/spartan/terraform/deploy-release/variables.tf +++ b/spartan/terraform/deploy-release/variables.tf @@ -24,3 +24,9 @@ variable "L1_DEPLOYMENT_MNEMONIC" { type = string sensitive = true } + +variable "L1_DEPLOYMENT_SALT" { + description = "Salt to use for the L1 contract deployments" + type = string + default = "" +} diff --git a/spartan/terraform/gke-cluster/main.tf b/spartan/terraform/gke-cluster/main.tf index 2c169144485..c8cb9fbb442 100644 --- a/spartan/terraform/gke-cluster/main.tf +++ b/spartan/terraform/gke-cluster/main.tf @@ -124,7 +124,7 @@ resource "google_container_node_pool" "aztec_nodes" { # Enable autoscaling autoscaling { min_node_count = 1 - max_node_count = 128 + max_node_count = 256 } # Node configuration diff --git a/yarn-project/Earthfile b/yarn-project/Earthfile index 0fed665d9da..50e81f006cc 100644 --- a/yarn-project/Earthfile +++ b/yarn-project/Earthfile @@ -53,8 +53,7 @@ build: WORKDIR /usr/src/yarn-project COPY . . ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true - RUN ./bootstrap.sh full - + RUN ./bootstrap.sh build-dev: FROM +build @@ -195,7 +194,17 @@ export-aztec-faucet: # We care about creating a slimmed down e2e image because we have to serialize it from earthly to docker for running. end-to-end-prod: BUILD ../spartan/+charts - FROM +cli-base + FROM +build + # A fast build is not enough for the end-to-end tests, we still need to run webpack + RUN cd end-to-end && yarn build:web + # Now that the web is compiled, we can trim down the image further + RUN rm -rf \ + ../noir-projects \ + ../l1-contracts \ + ../barretenberg/ts/src \ + ../barretenberg/ts/dest/node-cjs \ + ../barretenberg/ts/dest/browser + RUN yarn workspaces focus @aztec/end-to-end @aztec/cli-wallet --production && yarn cache clean COPY --dir +rollup-verifier-contract/usr/src/bb /usr/src COPY --dir +build-dev/usr/src/noir-projects/noir-contracts /usr/src/noir-projects/noir-contracts diff --git a/yarn-project/accounts/src/testing/configuration.ts b/yarn-project/accounts/src/testing/configuration.ts index bfd74f9912f..6f74f3a4562 100644 --- a/yarn-project/accounts/src/testing/configuration.ts +++ b/yarn-project/accounts/src/testing/configuration.ts @@ -9,9 +9,9 @@ import { Fr } from '@aztec/foundation/fields'; import { SchnorrAccountContractArtifact, getSchnorrAccount } from '../schnorr/index.js'; export const INITIAL_TEST_SECRET_KEYS = [ - Fr.fromString('2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf085c281'), - Fr.fromString('aebd1b4be76efa44f5ee655c20bf9ea60f7ae44b9a7fd1fd9f189c7a0b0cdae'), - Fr.fromString('0f6addf0da06c33293df974a565b03d1ab096090d907d98055a8b7f4954e120c'), + Fr.fromHexString('2153536ff6628eee01cf4024889ff977a18d9fa61d0e414422f7681cf085c281'), + Fr.fromHexString('aebd1b4be76efa44f5ee655c20bf9ea60f7ae44b9a7fd1fd9f189c7a0b0cdae'), + Fr.fromHexString('0f6addf0da06c33293df974a565b03d1ab096090d907d98055a8b7f4954e120c'), ]; export const INITIAL_TEST_ENCRYPTION_KEYS = INITIAL_TEST_SECRET_KEYS.map(secretKey => diff --git a/yarn-project/archiver/package.json b/yarn-project/archiver/package.json index 61b84434170..c773e74ca99 100644 --- a/yarn-project/archiver/package.json +++ b/yarn-project/archiver/package.json @@ -6,7 +6,8 @@ ".": "./dest/index.js", "./data-retrieval": "./dest/archiver/data_retrieval.js", "./epoch": "./dest/archiver/epoch_helpers.js", - "./test": "./dest/test/index.js" + "./test": "./dest/test/index.js", + "./config": "./dest/archiver/config.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/archiver/src/archiver/archiver.test.ts b/yarn-project/archiver/src/archiver/archiver.test.ts index 87173270dc5..79ca76e7cd3 100644 --- a/yarn-project/archiver/src/archiver/archiver.test.ts +++ b/yarn-project/archiver/src/archiver/archiver.test.ts @@ -1,10 +1,12 @@ import { InboxLeaf, L2Block } from '@aztec/circuit-types'; import { GENESIS_ARCHIVE_ROOT, PrivateLog } from '@aztec/circuits.js'; import { DefaultL1ContractsConfig } from '@aztec/ethereum'; +import { Blob } from '@aztec/foundation/blob'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { sleep } from '@aztec/foundation/sleep'; import { type InboxAbi, RollupAbi } from '@aztec/l1-artifacts'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -84,7 +86,8 @@ describe('Archiver', () => { }) as any, }); - instrumentation = mock({ isEnabled: () => true }); + const tracer = new NoopTelemetryClient().getTracer(); + instrumentation = mock({ isEnabled: () => true, tracer }); archiverStore = new MemoryArchiverStore(1000); archiver = new Archiver( @@ -412,6 +415,7 @@ describe('Archiver', () => { function makeRollupTx(l2Block: L2Block) { const header = toHex(l2Block.header.toBuffer()); const body = toHex(l2Block.body.toBuffer()); + const blobInput = Blob.getEthBlobEvaluationInputs(Blob.getBlobs(l2Block.body.toBlobFields())); const archive = toHex(l2Block.archive.root.toBuffer()); const blockHash = toHex(l2Block.header.hash().toBuffer()); const input = encodeFunctionData({ @@ -421,6 +425,7 @@ function makeRollupTx(l2Block: L2Block) { { header, archive, blockHash, oracleInput: { provingCostModifier: 0n, feeAssetPriceModifier: 0n }, txHashes: [] }, [], body, + blobInput, ], }); return { input } as Transaction; diff --git a/yarn-project/archiver/src/archiver/archiver.ts b/yarn-project/archiver/src/archiver/archiver.ts index 1549767ba84..c116f738515 100644 --- a/yarn-project/archiver/src/archiver/archiver.ts +++ b/yarn-project/archiver/src/archiver/archiver.ts @@ -36,7 +36,6 @@ import { isValidUnconstrainedFunctionMembershipProof, } from '@aztec/circuits.js'; import { createEthereumChain } from '@aztec/ethereum'; -import { type ContractArtifact } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { type EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; @@ -47,11 +46,11 @@ import { elapsed } from '@aztec/foundation/timer'; import { InboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { ContractClassRegisteredEvent, - ContractInstanceDeployedEvent, PrivateFunctionBroadcastedEvent, UnconstrainedFunctionBroadcastedEvent, -} from '@aztec/protocol-contracts'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +} from '@aztec/protocol-contracts/class-registerer'; +import { ContractInstanceDeployedEvent } from '@aztec/protocol-contracts/instance-deployer'; +import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import groupBy from 'lodash.groupby'; import { @@ -85,7 +84,7 @@ export type ArchiveSource = L2BlockSource & * Responsible for handling robust L1 polling so that other components do not need to * concern themselves with it. */ -export class Archiver implements ArchiveSource { +export class Archiver implements ArchiveSource, Traceable { /** * A promise in which we will be continually fetching new L2 blocks. */ @@ -99,6 +98,8 @@ export class Archiver implements ArchiveSource { public l1BlockNumber: bigint | undefined; public l1Timestamp: bigint | undefined; + public readonly tracer: Tracer; + /** * Creates a new instance of the Archiver. * @param publicClient - A client for interacting with the Ethereum node. @@ -118,6 +119,7 @@ export class Archiver implements ArchiveSource { private readonly l1constants: L1RollupConstants, private readonly log: Logger = createLogger('archiver'), ) { + this.tracer = instrumentation.tracer; this.store = new ArchiverStoreHelper(dataStore); this.rollup = getContract({ @@ -194,24 +196,14 @@ export class Archiver implements ArchiveSource { await this.sync(blockUntilSynced); } - this.runningPromise = new RunningPromise(() => this.safeSync(), this.config.pollingIntervalMs); + this.runningPromise = new RunningPromise(() => this.sync(false), this.log, this.config.pollingIntervalMs); this.runningPromise.start(); } - /** - * Syncs and catches exceptions. - */ - private async safeSync() { - try { - await this.sync(false); - } catch (error) { - this.log.error('Error syncing archiver', error); - } - } - /** * Fetches logs from L1 contracts and processes them. */ + @trackSpan('Archiver.sync', initialRun => ({ [Attributes.INITIAL_SYNC]: initialRun })) private async sync(initialRun: boolean) { /** * We keep track of three "pointers" to L1 blocks: @@ -773,12 +765,8 @@ export class Archiver implements ArchiveSource { return; } - addContractArtifact(address: AztecAddress, artifact: ContractArtifact): Promise { - return this.store.addContractArtifact(address, artifact); - } - - getContractArtifact(address: AztecAddress): Promise { - return this.store.getContractArtifact(address); + registerContractFunctionNames(address: AztecAddress, names: Record): Promise { + return this.store.registerContractFunctionName(address, names); } getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise { @@ -921,7 +909,7 @@ class ArchiverStoreHelper for (const [classIdString, classEvents] of Object.entries( groupBy([...privateFnEvents, ...unconstrainedFnEvents], e => e.contractClassId.toString()), )) { - const contractClassId = Fr.fromString(classIdString); + const contractClassId = Fr.fromHexString(classIdString); const contractClass = await this.getContractClass(contractClassId); if (!contractClass) { this.#log.warn(`Skipping broadcasted functions as contract class ${contractClassId.toString()} was not found`); @@ -1085,11 +1073,8 @@ class ArchiverStoreHelper getContractClassIds(): Promise { return this.store.getContractClassIds(); } - addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise { - return this.store.addContractArtifact(address, contract); - } - getContractArtifact(address: AztecAddress): Promise { - return this.store.getContractArtifact(address); + registerContractFunctionName(address: AztecAddress, names: Record): Promise { + return this.store.registerContractFunctionName(address, names); } getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise { return this.store.getContractFunctionName(address, selector); diff --git a/yarn-project/archiver/src/archiver/archiver_store.ts b/yarn-project/archiver/src/archiver/archiver_store.ts index 11d0abd7c35..d2056cba085 100644 --- a/yarn-project/archiver/src/archiver/archiver_store.ts +++ b/yarn-project/archiver/src/archiver/archiver_store.ts @@ -18,7 +18,7 @@ import { type PrivateLog, type UnconstrainedFunctionWithMembershipProof, } from '@aztec/circuits.js'; -import { type ContractArtifact, type FunctionSelector } from '@aztec/foundation/abi'; +import { type FunctionSelector } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { type DataRetrieval } from './structs/data_retrieval.js'; @@ -261,12 +261,10 @@ export interface ArchiverDataStore { /** Returns the list of all class ids known by the archiver. */ getContractClassIds(): Promise; - addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise; - getContractArtifact(address: AztecAddress): Promise; - // TODO: These function names are in memory only as they are for development/debugging. They require the full contract // artifact supplied to the node out of band. This should be reviewed and potentially removed as part of // the node api cleanup process. + registerContractFunctionName(address: AztecAddress, names: Record): Promise; getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise; /** diff --git a/yarn-project/archiver/src/archiver/config.ts b/yarn-project/archiver/src/archiver/config.ts index d739314d468..32efc706cf6 100644 --- a/yarn-project/archiver/src/archiver/config.ts +++ b/yarn-project/archiver/src/archiver/config.ts @@ -21,6 +21,9 @@ export type ArchiverConfig = { /** URL for an archiver service. If set, will return an archiver client as opposed to starting a new one. */ archiverUrl?: string; + /** URL for an L1 consensus client */ + l1ConsensusClientUrl: string; + /** The polling interval in ms for retrieving new L2 blocks and encrypted logs. */ archiverPollingIntervalMS?: number; @@ -44,6 +47,11 @@ export const archiverConfigMappings: ConfigMappingsType = { description: 'URL for an archiver service. If set, will return an archiver client as opposed to starting a new one.', }, + l1ConsensusClientUrl: { + env: 'L1_CONSENSUS_CLIENT_URL', + description: 'URL for an L1 consensus client.', + parseEnv: (val: string) => (val ? val : 'http://localhost:5052'), + }, archiverPollingIntervalMS: { env: 'ARCHIVER_POLLING_INTERVAL_MS', description: 'The polling interval in ms for retrieving new L2 blocks and encrypted logs.', diff --git a/yarn-project/archiver/src/archiver/data_retrieval.ts b/yarn-project/archiver/src/archiver/data_retrieval.ts index 5ca7d17936e..1b6d2bf02a0 100644 --- a/yarn-project/archiver/src/archiver/data_retrieval.ts +++ b/yarn-project/archiver/src/archiver/data_retrieval.ts @@ -1,6 +1,7 @@ import { Body, InboxLeaf, L2Block } from '@aztec/circuit-types'; import { AppendOnlyTreeSnapshot, BlockHeader, Fr, Proof } from '@aztec/circuits.js'; import { asyncPool } from '@aztec/foundation/async-pool'; +import { Blob } from '@aztec/foundation/blob'; import { type EthAddress } from '@aztec/foundation/eth-address'; import { type ViemSignature } from '@aztec/foundation/eth-signature'; import { type Logger, createLogger } from '@aztec/foundation/log'; @@ -43,13 +44,15 @@ export async function retrieveBlocksFromRollup( if (searchStartBlock > searchEndBlock) { break; } - const l2BlockProposedLogs = await rollup.getEvents.L2BlockProposed( - {}, - { - fromBlock: searchStartBlock, - toBlock: searchEndBlock + 1n, - }, - ); + const l2BlockProposedLogs = ( + await rollup.getEvents.L2BlockProposed( + {}, + { + fromBlock: searchStartBlock, + toBlock: searchEndBlock, + }, + ) + ).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock); if (l2BlockProposedLogs.length === 0) { break; @@ -135,7 +138,8 @@ async function getBlockFromRollupTx( if (!allowedMethods.includes(functionName)) { throw new Error(`Unexpected method called ${functionName}`); } - const [decodedArgs, , bodyHex] = args! as readonly [ + // TODO(#9101): 'bodyHex' will be removed from below + const [decodedArgs, , bodyHex, blobInputs] = args! as readonly [ { header: Hex; archive: Hex; @@ -148,11 +152,38 @@ async function getBlockFromRollupTx( }, ViemSignature[], Hex, + Hex, ]; const header = BlockHeader.fromBuffer(Buffer.from(hexToBytes(decodedArgs.header))); + // TODO(#9101): Retreiving the block body from calldata is a temporary soln before we have + // either a beacon chain client or link to some blob store. Web2 is ok because we will + // verify the block body vs the blob as below. const blockBody = Body.fromBuffer(Buffer.from(hexToBytes(bodyHex))); + const blockFields = blockBody.toBlobFields(); + // TODO(#9101): The below reconstruction is currently redundant, but once we extract blobs will be the way to construct blocks. + // The blob source will give us blockFields, and we must construct the body from them: + // TODO(#8954): When logs are refactored into fields, we won't need to inject them here. + const reconstructedBlock = Body.fromBlobFields(blockFields, blockBody.unencryptedLogs, blockBody.contractClassLogs); + + if (!reconstructedBlock.toBuffer().equals(blockBody.toBuffer())) { + // TODO(#9101): Remove below check (without calldata there will be nothing to check against) + throw new Error(`Block reconstructed from blob fields does not match`); + } + + // TODO(#9101): Once we stop publishing calldata, we will still need the blobCheck below to ensure that the block we are building does correspond to the blob fields + const blobCheck = Blob.getBlobs(blockFields); + if (Blob.getEthBlobEvaluationInputs(blobCheck) !== blobInputs) { + // NB: We can just check the blobhash here, which is the first 32 bytes of blobInputs + // A mismatch means that the fields published in the blob in propose() do NOT match those in the extracted block. + throw new Error( + `Block body mismatched with blob for block number ${l2BlockNum}. \nExpected: ${Blob.getEthBlobEvaluationInputs( + blobCheck, + )} \nGot: ${blobInputs}`, + ); + } + const blockNumberFromHeader = header.globalVariables.blockNumber.toBigInt(); if (blockNumberFromHeader !== l2BlockNum) { @@ -189,13 +220,15 @@ export async function retrieveL1ToL2Messages( break; } - const messageSentLogs = await inbox.getEvents.MessageSent( - {}, - { - fromBlock: searchStartBlock, - toBlock: searchEndBlock + 1n, - }, - ); + const messageSentLogs = ( + await inbox.getEvents.MessageSent( + {}, + { + fromBlock: searchStartBlock, + toBlock: searchEndBlock, + }, + ) + ).filter(log => log.blockNumber! >= searchStartBlock && log.blockNumber! <= searchEndBlock); if (messageSentLogs.length === 0) { break; @@ -203,7 +236,7 @@ export async function retrieveL1ToL2Messages( for (const log of messageSentLogs) { const { index, hash } = log.args; - retrievedL1ToL2Messages.push(new InboxLeaf(index!, Fr.fromString(hash!))); + retrievedL1ToL2Messages.push(new InboxLeaf(index!, Fr.fromHexString(hash!))); } // handles the case when there are no new messages: @@ -222,7 +255,7 @@ export async function retrieveL2ProofVerifiedEvents( const logs = await publicClient.getLogs({ address: rollupAddress.toString(), fromBlock: searchStartBlock, - toBlock: searchEndBlock ? searchEndBlock + 1n : undefined, + toBlock: searchEndBlock ? searchEndBlock : undefined, strict: true, event: getAbiItem({ abi: RollupAbi, name: 'L2ProofVerified' }), }); @@ -230,7 +263,7 @@ export async function retrieveL2ProofVerifiedEvents( return logs.map(log => ({ l1BlockNumber: log.blockNumber, l2BlockNumber: log.args.blockNumber, - proverId: Fr.fromString(log.args.proverId), + proverId: Fr.fromHexString(log.args.proverId), txHash: log.transactionHash, })); } @@ -297,8 +330,8 @@ export async function getProofFromSubmitProofTx( ]; aggregationObject = Buffer.from(hexToBytes(decodedArgs.aggregationObject)); - proverId = Fr.fromString(decodedArgs.args[6]); - archiveRoot = Fr.fromString(decodedArgs.args[1]); + proverId = Fr.fromHexString(decodedArgs.args[6]); + archiveRoot = Fr.fromHexString(decodedArgs.args[1]); proof = Proof.fromBuffer(Buffer.from(hexToBytes(decodedArgs.proof))); } else { throw new Error(`Unexpected proof method called ${functionName}`); diff --git a/yarn-project/archiver/src/archiver/instrumentation.ts b/yarn-project/archiver/src/archiver/instrumentation.ts index 3d8768b4d2a..716f2948d0a 100644 --- a/yarn-project/archiver/src/archiver/instrumentation.ts +++ b/yarn-project/archiver/src/archiver/instrumentation.ts @@ -8,13 +8,14 @@ import { type LmdbStatsCallback, Metrics, type TelemetryClient, + type Tracer, type UpDownCounter, ValueType, - exponentialBuckets, - millisecondBuckets, } from '@aztec/telemetry-client'; export class ArchiverInstrumentation { + public readonly tracer: Tracer; + private blockHeight: Gauge; private blockSize: Gauge; private syncDuration: Histogram; @@ -26,6 +27,7 @@ export class ArchiverInstrumentation { private log = createLogger('archiver:instrumentation'); private constructor(private telemetry: TelemetryClient, lmdbStats?: LmdbStatsCallback) { + this.tracer = telemetry.getTracer('Archiver'); const meter = telemetry.getMeter('Archiver'); this.blockHeight = meter.createGauge(Metrics.ARCHIVER_BLOCK_HEIGHT, { description: 'The height of the latest block processed by the archiver', @@ -41,9 +43,6 @@ export class ArchiverInstrumentation { unit: 'ms', description: 'Duration to sync a block', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: exponentialBuckets(1, 16), - }, }); this.proofsSubmittedCount = meter.createUpDownCounter(Metrics.ARCHIVER_ROLLUP_PROOF_COUNT, { @@ -55,9 +54,6 @@ export class ArchiverInstrumentation { unit: 'ms', description: 'Time after a block is submitted until its proof is published', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(1, 80), // 10ms -> ~3hs - }, }); this.l1BlocksSynced = meter.createUpDownCounter(Metrics.ARCHIVER_L1_BLOCKS_SYNCED, { diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts deleted file mode 100644 index 54fc9c7d69e..00000000000 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AztecAddress } from '@aztec/circuits.js'; -import { openTmpStore } from '@aztec/kv-store/lmdb'; -import { BenchmarkingContractArtifact } from '@aztec/noir-contracts.js/Benchmarking'; - -import { beforeEach } from '@jest/globals'; - -import { KVArchiverDataStore } from './kv_archiver_store.js'; - -describe('Contract Artifact Store', () => { - let archiverStore: KVArchiverDataStore; - - beforeEach(() => { - archiverStore = new KVArchiverDataStore(openTmpStore()); - }); - - it('Should add and return contract artifacts', async () => { - const artifact = BenchmarkingContractArtifact; - const address = AztecAddress.random(); - await archiverStore.addContractArtifact(address, artifact); - await expect(archiverStore.getContractArtifact(address)).resolves.toEqual(artifact); - }); -}); diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.ts deleted file mode 100644 index 8e18df413f2..00000000000 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type AztecAddress } from '@aztec/circuits.js'; -import { type ContractArtifact } from '@aztec/foundation/abi'; -import { type AztecKVStore, type AztecMap } from '@aztec/kv-store'; -import { contractArtifactFromBuffer, contractArtifactToBuffer } from '@aztec/types/abi'; - -export class ContractArtifactsStore { - #contractArtifacts: AztecMap; - - constructor(db: AztecKVStore) { - this.#contractArtifacts = db.openMap('archiver_contract_artifacts'); - } - - addContractArtifact(address: AztecAddress, contractArtifact: ContractArtifact): Promise { - return this.#contractArtifacts.set(address.toString(), contractArtifactToBuffer(contractArtifact)); - } - - getContractArtifact(address: AztecAddress): ContractArtifact | undefined { - const contractArtifact = this.#contractArtifacts.get(address.toString()); - // TODO(@spalladino): AztecMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from. - return contractArtifact && contractArtifactFromBuffer(Buffer.from(contractArtifact)); - } -} diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts index ce8bbb823ce..c5a87590dfa 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_class_store.ts @@ -53,7 +53,7 @@ export class ContractClassStore { } getContractClassIds(): Fr[] { - return Array.from(this.#contractClasses.keys()).map(key => Fr.fromString(key)); + return Array.from(this.#contractClasses.keys()).map(key => Fr.fromHexString(key)); } async addFunctions( diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts index b7dfaa60041..ac12a3ba185 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.ts @@ -17,7 +17,7 @@ import { type PrivateLog, type UnconstrainedFunctionWithMembershipProof, } from '@aztec/circuits.js'; -import { type ContractArtifact, FunctionSelector } from '@aztec/foundation/abi'; +import { type FunctionSelector } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { createLogger } from '@aztec/foundation/log'; import { type AztecKVStore } from '@aztec/kv-store'; @@ -26,7 +26,6 @@ import { type ArchiverDataStore, type ArchiverL1SynchPoint } from '../archiver_s import { type DataRetrieval } from '../structs/data_retrieval.js'; import { type L1Published } from '../structs/published.js'; import { BlockStore } from './block_store.js'; -import { ContractArtifactsStore } from './contract_artifacts_store.js'; import { ContractClassStore } from './contract_class_store.js'; import { ContractInstanceStore } from './contract_instance_store.js'; import { LogStore } from './log_store.js'; @@ -43,7 +42,6 @@ export class KVArchiverDataStore implements ArchiverDataStore { #messageStore: MessageStore; #contractClassStore: ContractClassStore; #contractInstanceStore: ContractInstanceStore; - #contractArtifactStore: ContractArtifactsStore; private functionNames = new Map(); #log = createLogger('archiver:data-store'); @@ -54,27 +52,22 @@ export class KVArchiverDataStore implements ArchiverDataStore { this.#messageStore = new MessageStore(db); this.#contractClassStore = new ContractClassStore(db); this.#contractInstanceStore = new ContractInstanceStore(db); - this.#contractArtifactStore = new ContractArtifactsStore(db); this.#nullifierStore = new NullifierStore(db); } - getContractArtifact(address: AztecAddress): Promise { - return Promise.resolve(this.#contractArtifactStore.getContractArtifact(address)); - } - // TODO: These function names are in memory only as they are for development/debugging. They require the full contract // artifact supplied to the node out of band. This should be reviewed and potentially removed as part of // the node api cleanup process. - getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise { + getContractFunctionName(_address: AztecAddress, selector: FunctionSelector): Promise { return Promise.resolve(this.functionNames.get(selector.toString())); } - async addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise { - await this.#contractArtifactStore.addContractArtifact(address, contract); - // Building tup this map of selectors to function names save expensive re-hydration of contract artifacts later - contract.functions.forEach(f => { - this.functionNames.set(FunctionSelector.fromNameAndParameters(f.name, f.parameters).toString(), f.name); - }); + registerContractFunctionName(_address: AztecAddress, names: Record): Promise { + for (const [selector, name] of Object.entries(names)) { + this.functionNames.set(selector, name); + } + + return Promise.resolve(); } getContractClass(id: Fr): Promise { diff --git a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts index 9a88b744ba6..fab9073e458 100644 --- a/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts +++ b/yarn-project/archiver/src/archiver/memory_archiver_store/memory_archiver_store.ts @@ -28,7 +28,7 @@ import { type PrivateLog, type UnconstrainedFunctionWithMembershipProof, } from '@aztec/circuits.js'; -import { type ContractArtifact, FunctionSelector } from '@aztec/foundation/abi'; +import { type FunctionSelector } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { createLogger } from '@aztec/foundation/log'; @@ -68,8 +68,6 @@ export class MemoryArchiverStore implements ArchiverDataStore { */ private l1ToL2Messages = new L1ToL2MessageStore(); - private contractArtifacts: Map = new Map(); - private contractClasses: Map = new Map(); private bytecodeCommitments: Map = new Map(); @@ -86,6 +84,8 @@ export class MemoryArchiverStore implements ArchiverDataStore { private lastProvenL2BlockNumber: number = 0; private lastProvenL2EpochNumber: number = 0; + private functionNames = new Map(); + #log = createLogger('archiver:data-store'); constructor( @@ -105,7 +105,7 @@ export class MemoryArchiverStore implements ArchiverDataStore { } public getContractClassIds(): Promise { - return Promise.resolve(Array.from(this.contractClasses.keys()).map(key => Fr.fromString(key))); + return Promise.resolve(Array.from(this.contractClasses.keys()).map(key => Fr.fromHexString(key))); } public getContractInstance(address: AztecAddress): Promise { @@ -730,26 +730,16 @@ export class MemoryArchiverStore implements ArchiverDataStore { }); } - public addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise { - this.contractArtifacts.set(address.toString(), contract); - return Promise.resolve(); - } - - public getContractArtifact(address: AztecAddress): Promise { - return Promise.resolve(this.contractArtifacts.get(address.toString())); + public getContractFunctionName(_address: AztecAddress, selector: FunctionSelector): Promise { + return Promise.resolve(this.functionNames.get(selector.toString())); } - async getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise { - const artifact = await this.getContractArtifact(address); - - if (!artifact) { - return undefined; + public registerContractFunctionName(_address: AztecAddress, names: Record): Promise { + for (const [selector, name] of Object.entries(names)) { + this.functionNames.set(selector, name); } - const func = artifact.functions.find(f => - FunctionSelector.fromNameAndParameters({ name: f.name, parameters: f.parameters }).equals(selector), - ); - return Promise.resolve(func?.name); + return Promise.resolve(); } public estimateSize(): { mappingSize: number; actualSize: number; numItems: number } { diff --git a/yarn-project/archiver/src/factory.ts b/yarn-project/archiver/src/factory.ts index 45ab9705429..018cbec57f9 100644 --- a/yarn-project/archiver/src/factory.ts +++ b/yarn-project/archiver/src/factory.ts @@ -4,12 +4,15 @@ import { computePublicBytecodeCommitment, getContractClassFromArtifact, } from '@aztec/circuits.js'; +import { FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { createLogger } from '@aztec/foundation/log'; import { type Maybe } from '@aztec/foundation/types'; import { type DataStoreConfig } from '@aztec/kv-store/config'; import { createStore } from '@aztec/kv-store/lmdb'; -import { TokenBridgeContractArtifact, TokenContractArtifact } from '@aztec/noir-contracts.js'; -import { getCanonicalProtocolContract, protocolContractNames } from '@aztec/protocol-contracts'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; +import { TokenBridgeContractArtifact } from '@aztec/noir-contracts.js/TokenBridge'; +import { protocolContractNames } from '@aztec/protocol-contracts'; +import { getCanonicalProtocolContract } from '@aztec/protocol-contracts/bundle'; import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; @@ -43,7 +46,15 @@ async function registerProtocolContracts(store: KVArchiverDataStore) { privateFunctions: [], unconstrainedFunctions: [], }; - await store.addContractArtifact(contract.address, contract.artifact); + + const functionNames: Record = {}; + for (const fn of contract.artifact.functions) { + if (fn.functionType === FunctionType.PUBLIC) { + functionNames[FunctionSelector.fromNameAndParameters(fn.name, fn.parameters).toString()] = fn.name; + } + } + + await store.registerContractFunctionName(contract.address, functionNames); const bytecodeCommitment = computePublicBytecodeCommitment(contractClassPublic.packedBytecode); await store.addContractClasses([contractClassPublic], [bytecodeCommitment], blockNumber); await store.addContractInstances([contract.instance], blockNumber); diff --git a/yarn-project/aztec-faucet/package.json b/yarn-project/aztec-faucet/package.json index 2285a4087c0..5c0c9a01b91 100644 --- a/yarn-project/aztec-faucet/package.json +++ b/yarn-project/aztec-faucet/package.json @@ -5,7 +5,8 @@ "type": "module", "bin": "./dest/bin/index.js", "exports": { - ".": "./dest/index.js" + ".": "./dest/index.js", + "./config": "./dest/config.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/aztec-node/package.json b/yarn-project/aztec-node/package.json index f23417a5b7b..6ace5e54c53 100644 --- a/yarn-project/aztec-node/package.json +++ b/yarn-project/aztec-node/package.json @@ -3,7 +3,10 @@ "version": "0.1.0", "main": "dest/index.js", "type": "module", - "exports": "./dest/index.js", + "exports": { + ".": "./dest/index.js", + "./config": "./dest/aztec-node/config.js" + }, "bin": "./dest/bin/index.js", "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/aztec-node/src/aztec-node/config.ts b/yarn-project/aztec-node/src/aztec-node/config.ts index c083a518315..0489f18e909 100644 --- a/yarn-project/aztec-node/src/aztec-node/config.ts +++ b/yarn-project/aztec-node/src/aztec-node/config.ts @@ -1,11 +1,11 @@ -import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver'; +import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver/config'; import { type ConfigMappingsType, booleanConfigHelper, getConfigFromMappings } from '@aztec/foundation/config'; import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config'; -import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p'; -import { type ProverClientConfig, proverClientConfigMappings } from '@aztec/prover-client'; -import { type SequencerClientConfig, sequencerClientConfigMappings } from '@aztec/sequencer-client'; -import { type ValidatorClientConfig, validatorClientConfigMappings } from '@aztec/validator-client'; -import { type WorldStateConfig, worldStateConfigMappings } from '@aztec/world-state'; +import { type P2PConfig, p2pConfigMappings } from '@aztec/p2p/config'; +import { type ProverClientConfig, proverClientConfigMappings } from '@aztec/prover-client/config'; +import { type SequencerClientConfig, sequencerClientConfigMappings } from '@aztec/sequencer-client/config'; +import { type ValidatorClientConfig, validatorClientConfigMappings } from '@aztec/validator-client/config'; +import { type WorldStateConfig, worldStateConfigMappings } from '@aztec/world-state/config'; import { readFileSync } from 'fs'; import { dirname, resolve } from 'path'; diff --git a/yarn-project/aztec-node/src/aztec-node/node_metrics.ts b/yarn-project/aztec-node/src/aztec-node/node_metrics.ts index 27df451152d..8bddcce063b 100644 --- a/yarn-project/aztec-node/src/aztec-node/node_metrics.ts +++ b/yarn-project/aztec-node/src/aztec-node/node_metrics.ts @@ -18,9 +18,6 @@ export class NodeMetrics { description: 'The duration of the receiveTx method', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: [10, 50, 100, 200, 500, 1000, 2000, 5000], - }, }); } diff --git a/yarn-project/aztec-node/src/aztec-node/server.test.ts b/yarn-project/aztec-node/src/aztec-node/server.test.ts index 649c9bfe8fe..942c544b26f 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.test.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.test.ts @@ -39,6 +39,10 @@ describe('aztec node', () => { globalVariablesBuilder = mock(); merkleTreeOps = mock(); + merkleTreeOps.findLeafIndices.mockImplementation((_treeId: MerkleTreeId, _value: any[]) => { + return Promise.resolve([undefined]); + }); + const worldState = mock({ getCommitted: () => merkleTreeOps, }); @@ -106,9 +110,9 @@ describe('aztec node', () => { // We make a nullifier from `doubleSpendWithExistingTx` a part of the nullifier tree, so it gets rejected as double spend const doubleSpendNullifier = doubleSpendWithExistingTx.data.forRollup!.end.nullifiers[0].toBuffer(); - merkleTreeOps.findLeafIndex.mockImplementation((treeId: MerkleTreeId, value: any) => { + merkleTreeOps.findLeafIndices.mockImplementation((treeId: MerkleTreeId, value: any[]) => { return Promise.resolve( - treeId === MerkleTreeId.NULLIFIER_TREE && value.equals(doubleSpendNullifier) ? 1n : undefined, + treeId === MerkleTreeId.NULLIFIER_TREE && value[0].equals(doubleSpendNullifier) ? [1n] : [undefined], ); }); diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index 35476df3fc8..59ba35913fe 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -15,6 +15,7 @@ import { MerkleTreeId, NullifierMembershipWitness, type NullifierWithBlockSource, + P2PClientType, type ProcessedTx, type ProverConfig, PublicDataWitness, @@ -54,11 +55,10 @@ import { } from '@aztec/circuits.js'; import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; import { type L1ContractAddresses, createEthereumChain } from '@aztec/ethereum'; -import { type ContractArtifact } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { padArrayEnd } from '@aztec/foundation/collection'; import { type Logger, createLogger } from '@aztec/foundation/log'; -import { Timer } from '@aztec/foundation/timer'; +import { DateProvider, Timer } from '@aztec/foundation/timer'; import { type AztecKVStore } from '@aztec/kv-store'; import { openTmpStore } from '@aztec/kv-store/lmdb'; import { SHA256Trunc, StandardTree, UnbalancedTree } from '@aztec/merkle-tree'; @@ -74,7 +74,7 @@ import { import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { GlobalVariableBuilder, type L1Publisher, SequencerClient } from '@aztec/sequencer-client'; import { PublicProcessorFactory } from '@aztec/simulator'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { createValidatorClient } from '@aztec/validator-client'; import { createWorldStateSynchronizer } from '@aztec/world-state'; @@ -85,11 +85,12 @@ import { NodeMetrics } from './node_metrics.js'; /** * The aztec node. */ -export class AztecNodeService implements AztecNode { +export class AztecNodeService implements AztecNode, Traceable { private packageVersion: string; - private metrics: NodeMetrics; + public readonly tracer: Tracer; + constructor( protected config: AztecNodeConfig, protected readonly p2pClient: P2P, @@ -109,6 +110,7 @@ export class AztecNodeService implements AztecNode { ) { this.packageVersion = getPackageInfo().version; this.metrics = new NodeMetrics(telemetry, 'AztecNodeService'); + this.tracer = telemetry.getTracer('AztecNodeService'); this.log.info(`Aztec Node started on chain 0x${l1ChainId.toString(16)}`, config.l1Contracts); } @@ -136,10 +138,12 @@ export class AztecNodeService implements AztecNode { telemetry?: TelemetryClient; logger?: Logger; publisher?: L1Publisher; + dateProvider?: DateProvider; } = {}, ): Promise { const telemetry = deps.telemetry ?? new NoopTelemetryClient(); const log = deps.logger ?? createLogger('node'); + const dateProvider = deps.dateProvider ?? new DateProvider(); const ethereumChain = createEthereumChain(config.l1RpcUrl, config.l1ChainId); //validate that the actual chain id matches that specified in configuration if (config.l1ChainId !== ethereumChain.chainInfo.id) { @@ -152,7 +156,8 @@ export class AztecNodeService implements AztecNode { // we identify the P2P transaction protocol by using the rollup contract address. // this may well change in future - config.transactionProtocol = `/aztec/tx/${config.l1Contracts.rollupAddress.toString()}`; + const rollupAddress = config.l1Contracts.rollupAddress; + config.transactionProtocol = `/aztec/tx/${rollupAddress.toString()}`; // now create the merkle trees and the world state synchronizer const worldStateSynchronizer = await createWorldStateSynchronizer(config, archiver, telemetry); @@ -162,12 +167,19 @@ export class AztecNodeService implements AztecNode { } // create the tx pool and the p2p client, which will need the l2 block source - const p2pClient = await createP2PClient(config, archiver, proofVerifier, worldStateSynchronizer, telemetry); + const p2pClient = await createP2PClient( + P2PClientType.Full, + config, + archiver, + proofVerifier, + worldStateSynchronizer, + telemetry, + ); // start both and wait for them to sync from the block source await Promise.all([p2pClient.start(), worldStateSynchronizer.start()]); - const validatorClient = await createValidatorClient(config, config.l1Contracts.rollupAddress, p2pClient, telemetry); + const validatorClient = await createValidatorClient(config, rollupAddress, { p2pClient, telemetry, dateProvider }); // now create the sequencer const sequencer = config.disableValidator @@ -457,7 +469,10 @@ export class AztecNodeService implements AztecNode { leafValues: Fr[], ): Promise<(bigint | undefined)[]> { const committedDb = await this.#getWorldState(blockNumber); - return await Promise.all(leafValues.map(leafValue => committedDb.findLeafIndex(treeId, leafValue.toBuffer()))); + return await committedDb.findLeafIndices( + treeId, + leafValues.map(x => x.toBuffer()), + ); } /** @@ -664,7 +679,7 @@ export class AztecNodeService implements AztecNode { nullifier: Fr, ): Promise { const db = await this.#getWorldState(blockNumber); - const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); + const index = (await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0]; if (!index) { return undefined; } @@ -779,6 +794,9 @@ export class AztecNodeService implements AztecNode { * Simulates the public part of a transaction with the current state. * @param tx - The transaction to simulate. **/ + @trackSpan('AztecNodeService.simulatePublicCalls', (tx: Tx) => ({ + [Attributes.TX_HASH]: tx.tryGetTxHash()?.toString(), + })) public async simulatePublicCalls(tx: Tx): Promise { const txHash = tx.getTxHash(); const blockNumber = (await this.blockSource.getBlockNumber()) + 1; @@ -836,9 +854,7 @@ export class AztecNodeService implements AztecNode { new DataTxValidator(), new MetadataTxValidator(new Fr(this.l1ChainId), new Fr(blockNumber)), new DoubleSpendTxValidator({ - getNullifierIndex(nullifier) { - return db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); - }, + getNullifierIndices: nullifiers => db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers), }), ]; @@ -884,10 +900,8 @@ export class AztecNodeService implements AztecNode { return this.contractDataSource.addContractClass(contractClass); } - public addContractArtifact(address: AztecAddress, artifact: ContractArtifact): Promise { - this.log.info(`Adding contract artifact ${artifact.name} for ${address.toString()} via API`); - // TODO: Node should validate the artifact before accepting it - return this.contractDataSource.addContractArtifact(address, artifact); + public registerContractFunctionNames(_address: AztecAddress, names: Record): Promise { + return this.contractDataSource.registerContractFunctionNames(_address, names); } public flushTxs(): Promise { diff --git a/yarn-project/aztec.js/package.json b/yarn-project/aztec.js/package.json index f426c02a05d..5ebdafd8895 100644 --- a/yarn-project/aztec.js/package.json +++ b/yarn-project/aztec.js/package.json @@ -8,7 +8,8 @@ "./interfaces/pxe": "./dest/api/interfaces/pxe.js", "./abi": "./dest/api/abi.js", "./account": "./dest/api/account.js", - "./aztec_address": "./dest/api/aztec_address.js", + "./addresses": "./dest/api/addresses.js", + "./contracts": "./dest/contract/index.js", "./deployment": "./dest/api/deployment.js", "./entrypoint": "./dest/api/entrypoint.js", "./eth_address": "./dest/api/eth_address.js", @@ -17,8 +18,10 @@ "./fields": "./dest/api/fields.js", "./init": "./dest/api/init.js", "./log_id": "./dest/api/log_id.js", + "./rpc": "./dest/rpc_clients/index.js", "./tx_hash": "./dest/api/tx_hash.js", - "./wallet": "./dest/api/wallet.js" + "./wallet": "./dest/api/wallet.js", + "./utils": "./dest/utils/index.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/aztec.js/src/api/aztec_address.ts b/yarn-project/aztec.js/src/api/addresses.ts similarity index 54% rename from yarn-project/aztec.js/src/api/aztec_address.ts rename to yarn-project/aztec.js/src/api/addresses.ts index c6cece77dae..5b7111416c9 100644 --- a/yarn-project/aztec.js/src/api/aztec_address.ts +++ b/yarn-project/aztec.js/src/api/addresses.ts @@ -1 +1,2 @@ export { AztecAddress } from '@aztec/foundation/aztec-address'; +export { CompleteAddress } from '@aztec/circuits.js'; diff --git a/yarn-project/aztec.js/src/contract/base_contract_interaction.ts b/yarn-project/aztec.js/src/contract/base_contract_interaction.ts index 8ab2f2c91bd..ad8353d0d6c 100644 --- a/yarn-project/aztec.js/src/contract/base_contract_interaction.ts +++ b/yarn-project/aztec.js/src/contract/base_contract_interaction.ts @@ -122,6 +122,7 @@ export abstract class BaseContractInteraction { const defaultFeeOptions = await this.getDefaultFeeOptions(request.fee); const paymentMethod = defaultFeeOptions.paymentMethod; const maxFeesPerGas = defaultFeeOptions.gasSettings.maxFeesPerGas; + const maxPriorityFeesPerGas = defaultFeeOptions.gasSettings.maxPriorityFeesPerGas; let gasSettings = defaultFeeOptions.gasSettings; if (request.fee?.estimateGas) { @@ -132,7 +133,7 @@ export abstract class BaseContractInteraction { simulationResult, request.fee?.estimatedGasPadding, ); - gasSettings = GasSettings.from({ maxFeesPerGas, gasLimits, teardownGasLimits }); + gasSettings = GasSettings.from({ maxFeesPerGas, maxPriorityFeesPerGas, gasLimits, teardownGasLimits }); this.log.verbose( `Estimated gas limits for tx: DA=${gasLimits.daGas} L2=${gasLimits.l2Gas} teardownDA=${teardownGasLimits.daGas} teardownL2=${teardownGasLimits.l2Gas}`, ); diff --git a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts index 71117bdf280..35d2231522d 100644 --- a/yarn-project/aztec.js/src/contract/contract_function_interaction.ts +++ b/yarn-project/aztec.js/src/contract/contract_function_interaction.ts @@ -103,13 +103,20 @@ export class ContractFunctionInteraction extends BaseContractInteraction { const txRequest = await this.create(); const simulatedTx = await this.wallet.simulateTx(txRequest, true, options?.from, options?.skipTxValidation); - // As account entrypoints are private, for private functions we retrieve the return values from the first nested call - // since we're interested in the first set of values AFTER the account entrypoint - // For public functions we retrieve the first values directly from the public output. - const rawReturnValues = - this.functionDao.functionType == FunctionType.PRIVATE - ? simulatedTx.getPrivateReturnValues().nested?.[0].values - : simulatedTx.getPublicReturnValues()?.[0].values; + let rawReturnValues; + if (this.functionDao.functionType == FunctionType.PRIVATE) { + if (simulatedTx.getPrivateReturnValues().nested.length > 0) { + // The function invoked is private and it was called via an account contract + // TODO(#10631): There is a bug here: this branch might be triggered when there is no-account contract as well + rawReturnValues = simulatedTx.getPrivateReturnValues().nested[0].values; + } else { + // The function invoked is private and it was called directly (without account contract) + rawReturnValues = simulatedTx.getPrivateReturnValues().values; + } + } else { + // For public functions we retrieve the first values directly from the public output. + rawReturnValues = simulatedTx.getPublicReturnValues()?.[0].values; + } return rawReturnValues ? decodeFromAbi(this.functionDao.returnTypes, rawReturnValues) : []; } diff --git a/yarn-project/aztec.js/src/contract/index.ts b/yarn-project/aztec.js/src/contract/index.ts index dcf7b9a2dd5..b69395de86e 100644 --- a/yarn-project/aztec.js/src/contract/index.ts +++ b/yarn-project/aztec.js/src/contract/index.ts @@ -35,10 +35,14 @@ * * @packageDocumentation */ -export * from './contract.js'; -export * from './contract_function_interaction.js'; -export * from './sent_tx.js'; -export * from './contract_base.js'; -export * from './batch_call.js'; +export { Contract } from './contract.js'; +export { + ContractFunctionInteraction, + type ProfileResult, + type SendMethodOptions, +} from './contract_function_interaction.js'; +export { DefaultWaitOpts, SentTx, type WaitOpts } from './sent_tx.js'; +export { ContractBase, type ContractMethod, type ContractNotes, type ContractStorageLayout } from './contract_base.js'; +export { BatchCall } from './batch_call.js'; export { type DeployOptions, DeployMethod } from './deploy_method.js'; -export * from './deploy_sent_tx.js'; +export { DeploySentTx } from './deploy_sent_tx.js'; diff --git a/yarn-project/aztec.js/src/contract/sent_tx.test.ts b/yarn-project/aztec.js/src/contract/sent_tx.test.ts index c2bf65adb6a..c0f7daf8a57 100644 --- a/yarn-project/aztec.js/src/contract/sent_tx.test.ts +++ b/yarn-project/aztec.js/src/contract/sent_tx.test.ts @@ -23,22 +23,8 @@ describe('SentTx', () => { pxe.getTxReceipt.mockResolvedValue(txReceipt); }); - it('waits for all notes of the accounts to be available', async () => { - pxe.getSyncStatus.mockResolvedValueOnce({ blocks: 25 }).mockResolvedValueOnce({ blocks: 25 }); - - const actual = await sentTx.wait({ timeout: 1, interval: 0.4 }); - expect(actual).toEqual(txReceipt); - }); - - it('does not wait for notes sync', async () => { - pxe.getSyncStatus.mockResolvedValue({ blocks: 19 }); - const actual = await sentTx.wait({ timeout: 1, interval: 0.4, waitForNotesAvailable: false }); - expect(actual).toEqual(txReceipt); - }); - it('throws if tx is dropped', async () => { pxe.getTxReceipt.mockResolvedValue({ ...txReceipt, status: TxStatus.DROPPED } as TxReceipt); - pxe.getSyncStatus.mockResolvedValue({ blocks: 19 }); await expect(sentTx.wait({ timeout: 1, interval: 0.4, ignoreDroppedReceiptsFor: 0 })).rejects.toThrow(/dropped/); }); diff --git a/yarn-project/aztec.js/src/contract/sent_tx.ts b/yarn-project/aztec.js/src/contract/sent_tx.ts index b7803975b16..99c4eec8650 100644 --- a/yarn-project/aztec.js/src/contract/sent_tx.ts +++ b/yarn-project/aztec.js/src/contract/sent_tx.ts @@ -14,11 +14,6 @@ export type WaitOpts = { interval?: number; /** Whether to wait for the tx to be proven. */ proven?: boolean; - /** - * Whether to wait for the node to notify that the block in which this tx was mined is available to fetch notes from. - * If false, then any queries that depend on state set by this transaction may return stale data. Defaults to true. - **/ - waitForNotesAvailable?: boolean; /** Whether to include information useful for debugging/testing in the receipt. */ debug?: boolean; /** Whether to accept a revert as a status code for the tx when waiting for it. If false, will throw if the tx reverts. */ @@ -31,7 +26,6 @@ export const DefaultWaitOpts: WaitOpts = { provenTimeout: 600, interval: 1, debug: false, - waitForNotesAvailable: true, }; /** @@ -124,16 +118,7 @@ export class SentTx { } return undefined; } - // If we don't care about waiting for notes to be synced, return the receipt - const waitForNotesAvailable = opts?.waitForNotesAvailable ?? DefaultWaitOpts.waitForNotesAvailable; - if (!waitForNotesAvailable) { - return txReceipt; - } - // Check if all sync blocks on the PXE Service are greater or equal than the block in which the tx was mined - const { blocks } = await this.pxe.getSyncStatus(); - const targetBlock = txReceipt.blockNumber!; - const areNotesAvailable = blocks >= targetBlock; - return areNotesAvailable ? txReceipt : undefined; + return txReceipt; }, 'isMined', opts?.timeout ?? DefaultWaitOpts.timeout, diff --git a/yarn-project/aztec.js/src/fee/fee_juice_payment_method.ts b/yarn-project/aztec.js/src/fee/fee_juice_payment_method.ts index 94a3dc954ba..c5a8edfad28 100644 --- a/yarn-project/aztec.js/src/fee/fee_juice_payment_method.ts +++ b/yarn-project/aztec.js/src/fee/fee_juice_payment_method.ts @@ -11,7 +11,7 @@ export class FeeJuicePaymentMethod implements FeePaymentMethod { constructor(protected sender: AztecAddress) {} getAsset() { - return ProtocolContractAddress.FeeJuice; + return Promise.resolve(ProtocolContractAddress.FeeJuice); } getFunctionCalls(): Promise { diff --git a/yarn-project/aztec.js/src/fee/fee_juice_payment_method_with_claim.ts b/yarn-project/aztec.js/src/fee/fee_juice_payment_method_with_claim.ts index f69f515388e..4adcfcdddc7 100644 --- a/yarn-project/aztec.js/src/fee/fee_juice_payment_method_with_claim.ts +++ b/yarn-project/aztec.js/src/fee/fee_juice_payment_method_with_claim.ts @@ -1,7 +1,8 @@ import { type FunctionCall } from '@aztec/circuit-types'; import { type AztecAddress, Fr, FunctionSelector } from '@aztec/circuits.js'; import { FunctionType } from '@aztec/foundation/abi'; -import { ProtocolContractAddress, ProtocolContractArtifact } from '@aztec/protocol-contracts'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; +import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice'; import { type L2AmountClaim } from '../utils/portal_manager.js'; import { FeeJuicePaymentMethod } from './fee_juice_payment_method.js'; @@ -23,7 +24,7 @@ export class FeeJuicePaymentMethodWithClaim extends FeeJuicePaymentMethod { */ override getFunctionCalls(): Promise { const selector = FunctionSelector.fromNameAndParameters( - ProtocolContractArtifact.FeeJuice.functions.find(f => f.name === 'claim')!, + getCanonicalFeeJuice().artifact.functions.find(f => f.name === 'claim')!, ); return Promise.resolve([ diff --git a/yarn-project/aztec.js/src/fee/fee_payment_method.ts b/yarn-project/aztec.js/src/fee/fee_payment_method.ts index c27710efedb..6cdf795cd56 100644 --- a/yarn-project/aztec.js/src/fee/fee_payment_method.ts +++ b/yarn-project/aztec.js/src/fee/fee_payment_method.ts @@ -7,7 +7,7 @@ import { type AztecAddress } from '@aztec/foundation/aztec-address'; */ export interface FeePaymentMethod { /** The asset used to pay the fee. */ - getAsset(): AztecAddress; + getAsset(): Promise; /** * Creates a function call to pay the fee in the given asset. * @param gasSettings - The gas limits and max fees. diff --git a/yarn-project/aztec.js/src/fee/no_fee_payment_method.ts b/yarn-project/aztec.js/src/fee/no_fee_payment_method.ts index e9ed5809bc7..3692e990328 100644 --- a/yarn-project/aztec.js/src/fee/no_fee_payment_method.ts +++ b/yarn-project/aztec.js/src/fee/no_fee_payment_method.ts @@ -10,7 +10,7 @@ export class NoFeePaymentMethod implements FeePaymentMethod { constructor() {} getAsset() { - return AztecAddress.ZERO; + return Promise.resolve(AztecAddress.ZERO); } getFunctionCalls(): Promise { diff --git a/yarn-project/aztec.js/src/fee/private_fee_payment_method.ts b/yarn-project/aztec.js/src/fee/private_fee_payment_method.ts index e505901da36..717f5aec04d 100644 --- a/yarn-project/aztec.js/src/fee/private_fee_payment_method.ts +++ b/yarn-project/aztec.js/src/fee/private_fee_payment_method.ts @@ -5,17 +5,17 @@ import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; import { type Wallet } from '../account/wallet.js'; +import { ContractFunctionInteraction } from '../contract/contract_function_interaction.js'; +import { SignerlessWallet } from '../wallet/signerless_wallet.js'; import { type FeePaymentMethod } from './fee_payment_method.js'; /** * Holds information about how the fee for a transaction is to be paid. */ export class PrivateFeePaymentMethod implements FeePaymentMethod { + private assetPromise: Promise | null = null; + constructor( - /** - * The asset used to pay the fee. - */ - private asset: AztecAddress, /** * Address which will hold the fee payment. */ @@ -26,11 +26,6 @@ export class PrivateFeePaymentMethod implements FeePaymentMethod { */ private wallet: Wallet, - /** - * Address that the FPC sends notes it receives to. - */ - private feeRecipient: AztecAddress, - /** * If true, the max fee will be set to 1. * TODO(#7694): Remove this param once the lacking feature in TXE is implemented. @@ -42,8 +37,43 @@ export class PrivateFeePaymentMethod implements FeePaymentMethod { * The asset used to pay the fee. * @returns The asset used to pay the fee. */ - getAsset() { - return this.asset; + getAsset(): Promise { + if (!this.assetPromise) { + // We use signer-less wallet because this function could be triggered before the associated account is deployed. + const signerlessWallet = new SignerlessWallet(this.wallet); + + const interaction = new ContractFunctionInteraction( + signerlessWallet, + this.paymentContract, + { + name: 'get_accepted_asset', + functionType: FunctionType.PRIVATE, + isInternal: false, + isStatic: false, + parameters: [], + returnTypes: [ + { + kind: 'struct', + path: 'authwit::aztec::protocol_types::address::aztec_address::AztecAddress', + fields: [ + { + name: 'inner', + type: { + kind: 'field', + }, + }, + ], + }, + ], + errorTypes: {}, + isInitializer: false, + }, + [], + ); + + this.assetPromise = interaction.simulate(); + } + return this.assetPromise!; } getFeePayer(): Promise { @@ -65,11 +95,11 @@ export class PrivateFeePaymentMethod implements FeePaymentMethod { caller: this.paymentContract, action: { name: 'setup_refund', - args: [this.feeRecipient.toField(), this.wallet.getAddress().toField(), maxFee, nonce], - selector: FunctionSelector.fromSignature('setup_refund((Field),(Field),Field,Field)'), + args: [this.wallet.getAddress().toField(), maxFee, nonce], + selector: FunctionSelector.fromSignature('setup_refund((Field),Field,Field)'), type: FunctionType.PRIVATE, isStatic: false, - to: this.asset, + to: await this.getAsset(), returnTypes: [], }, }); @@ -78,10 +108,10 @@ export class PrivateFeePaymentMethod implements FeePaymentMethod { { name: 'fee_entrypoint_private', to: this.paymentContract, - selector: FunctionSelector.fromSignature('fee_entrypoint_private(Field,(Field),Field)'), + selector: FunctionSelector.fromSignature('fee_entrypoint_private(Field,Field)'), type: FunctionType.PRIVATE, isStatic: false, - args: [maxFee, this.asset.toField(), nonce], + args: [maxFee, nonce], returnTypes: [], }, ]; diff --git a/yarn-project/aztec.js/src/fee/public_fee_payment_method.ts b/yarn-project/aztec.js/src/fee/public_fee_payment_method.ts index 144e307d7ea..fddcf5e8daf 100644 --- a/yarn-project/aztec.js/src/fee/public_fee_payment_method.ts +++ b/yarn-project/aztec.js/src/fee/public_fee_payment_method.ts @@ -4,18 +4,18 @@ import { FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; +import { ContractFunctionInteraction } from '../contract/contract_function_interaction.js'; import { type AccountWallet } from '../wallet/account_wallet.js'; +import { SignerlessWallet } from '../wallet/signerless_wallet.js'; import { type FeePaymentMethod } from './fee_payment_method.js'; /** * Holds information about how the fee for a transaction is to be paid. */ export class PublicFeePaymentMethod implements FeePaymentMethod { + private assetPromise: Promise | null = null; + constructor( - /** - * The asset used to pay the fee. - */ - protected asset: AztecAddress, /** * Address which will hold the fee payment. */ @@ -30,8 +30,43 @@ export class PublicFeePaymentMethod implements FeePaymentMethod { * The asset used to pay the fee. * @returns The asset used to pay the fee. */ - getAsset() { - return this.asset; + getAsset(): Promise { + if (!this.assetPromise) { + // We use signer-less wallet because this function could be triggered before the associated account is deployed. + const signerlessWallet = new SignerlessWallet(this.wallet); + + const interaction = new ContractFunctionInteraction( + signerlessWallet, + this.paymentContract, + { + name: 'get_accepted_asset', + functionType: FunctionType.PRIVATE, + isInternal: false, + isStatic: false, + parameters: [], + returnTypes: [ + { + kind: 'struct', + path: 'authwit::aztec::protocol_types::address::aztec_address::AztecAddress', + fields: [ + { + name: 'inner', + type: { + kind: 'field', + }, + }, + ], + }, + ], + errorTypes: {}, + isInitializer: false, + }, + [], + ); + + this.assetPromise = interaction.simulate(); + } + return this.assetPromise!; } getFeePayer(): Promise { @@ -43,7 +78,7 @@ export class PublicFeePaymentMethod implements FeePaymentMethod { * @param gasSettings - The gas settings. * @returns The function call to pay the fee. */ - getFunctionCalls(gasSettings: GasSettings): Promise { + async getFunctionCalls(gasSettings: GasSettings): Promise { const nonce = Fr.random(); const maxFee = gasSettings.getFeeLimit(); @@ -58,7 +93,7 @@ export class PublicFeePaymentMethod implements FeePaymentMethod { selector: FunctionSelector.fromSignature('transfer_in_public((Field),(Field),Field,Field)'), type: FunctionType.PUBLIC, isStatic: false, - to: this.asset, + to: await this.getAsset(), returnTypes: [], }, }, @@ -68,10 +103,10 @@ export class PublicFeePaymentMethod implements FeePaymentMethod { { name: 'fee_entrypoint_public', to: this.paymentContract, - selector: FunctionSelector.fromSignature('fee_entrypoint_public(Field,(Field),Field)'), + selector: FunctionSelector.fromSignature('fee_entrypoint_public(Field,Field)'), type: FunctionType.PRIVATE, isStatic: false, - args: [maxFee, this.asset.toField(), nonce], + args: [maxFee, nonce], returnTypes: [], }, ]); diff --git a/yarn-project/aztec.js/src/index.ts b/yarn-project/aztec.js/src/index.ts index 4c42ac375de..4164b5000a8 100644 --- a/yarn-project/aztec.js/src/index.ts +++ b/yarn-project/aztec.js/src/index.ts @@ -13,29 +13,12 @@ * ```typescript * import { TxHash } from '@aztec.js/tx_hash' * import { type ContractArtifact, type FunctionArtifact, FunctionSelector } from '@aztec/aztec.js/abi'; - * import { AztecAddress } from '@aztec/aztec.js/aztec_address'; + * import { AztecAddress } from '@aztec/aztec.js/addresses'; * import { EthAddress } from '@aztec/aztec.js/eth_address'; * ``` * * TODO: Ultimately reimplement this mega exporter by mega exporting a granular api (then deprecate it). */ -export { - BatchCall, - Contract, - ContractBase, - ContractFunctionInteraction, - DefaultWaitOpts, - DeployMethod, - DeploySentTx, - SentTx, - type ContractMethod, - type ContractNotes, - type ContractStorageLayout, - type DeployOptions, - type ProfileResult, - type SendMethodOptions, - type WaitOpts, -} from './contract/index.js'; export { ContractDeployer } from './deployment/index.js'; @@ -79,7 +62,6 @@ export { AccountWallet, AccountWalletWithSecretKey, SignerlessWallet, type Walle // // TODO https://github.com/AztecProtocol/aztec-packages/issues/2632 --> FunctionSelector might not need to be exposed // // here once the issue is resolved. export { - AztecAddress, ContractClassWithId, ContractInstanceWithAddress, EthAddress, @@ -110,7 +92,6 @@ export { AuthWitness, Body, Comparator, - CompleteAddress, ContractClass2BlockL2Logs, EncryptedLogPayload, EpochProofQuote, @@ -149,7 +130,6 @@ export { type PXE, type PartialAddress, type PublicKey, - type SyncStatus, } from '@aztec/circuit-types'; // TODO: These kinds of things have no place on our public api. @@ -175,3 +155,6 @@ export { EthCheatCodes, deployL1Contract, deployL1Contracts, type DeployL1Contra export * from './api/abi.js'; export * from './api/fee.js'; export * from './api/init.js'; +// Granular export, even if not in the api folder +export * from './contract/index.js'; +export * from './api/addresses.js'; diff --git a/yarn-project/aztec.js/src/rpc_clients/pxe_client.ts b/yarn-project/aztec.js/src/rpc_clients/pxe_client.ts index b95c3802fff..f2afd1b3d7c 100644 --- a/yarn-project/aztec.js/src/rpc_clients/pxe_client.ts +++ b/yarn-project/aztec.js/src/rpc_clients/pxe_client.ts @@ -1,4 +1,4 @@ -import { type PXE, PXESchema } from '@aztec/circuit-types'; +import { type PXE, PXESchema } from '@aztec/circuit-types/interfaces'; import { createSafeJsonRpcClient, makeFetch } from '@aztec/foundation/json-rpc/client'; /** diff --git a/yarn-project/aztec.js/src/utils/anvil_test_watcher.ts b/yarn-project/aztec.js/src/utils/anvil_test_watcher.ts index 33d32ae42fd..307d52a18f0 100644 --- a/yarn-project/aztec.js/src/utils/anvil_test_watcher.ts +++ b/yarn-project/aztec.js/src/utils/anvil_test_watcher.ts @@ -46,7 +46,7 @@ export class AnvilTestWatcher { const isAutoMining = await this.cheatcodes.isAutoMining(); if (isAutoMining) { - this.filledRunningPromise = new RunningPromise(() => this.mineIfSlotFilled(), 1000); + this.filledRunningPromise = new RunningPromise(() => this.mineIfSlotFilled(), this.logger, 1000); this.filledRunningPromise.start(); this.logger.info(`Watcher started for rollup at ${this.rollup.address}`); } else { diff --git a/yarn-project/aztec.js/src/wallet/base_wallet.ts b/yarn-project/aztec.js/src/wallet/base_wallet.ts index 35694b490f5..e455ee4c0be 100644 --- a/yarn-project/aztec.js/src/wallet/base_wallet.ts +++ b/yarn-project/aztec.js/src/wallet/base_wallet.ts @@ -10,7 +10,6 @@ import { type PXEInfo, type PrivateExecutionResult, type SiblingPath, - type SyncStatus, type Tx, type TxExecutionRequest, type TxHash, @@ -170,12 +169,6 @@ export abstract class BaseWallet implements Wallet { getNodeInfo(): Promise { return this.pxe.getNodeInfo(); } - isGlobalStateSynchronized() { - return this.pxe.isGlobalStateSynchronized(); - } - getSyncStatus(): Promise { - return this.pxe.getSyncStatus(); - } addAuthWitness(authWitness: AuthWitness) { return this.pxe.addAuthWitness(authWitness); } diff --git a/yarn-project/aztec/CHANGELOG.md b/yarn-project/aztec/CHANGELOG.md index c7f9131d629..b0d385fd159 100644 --- a/yarn-project/aztec/CHANGELOG.md +++ b/yarn-project/aztec/CHANGELOG.md @@ -1,5 +1,36 @@ # Changelog +## [0.67.1](https://github.com/AztecProtocol/aztec-packages/compare/aztec-package-v0.67.0...aztec-package-v0.67.1) (2024-12-17) + + +### Miscellaneous + +* Granular CLI imports to reduce start time ([#10778](https://github.com/AztecProtocol/aztec-packages/issues/10778)) ([e2fd046](https://github.com/AztecProtocol/aztec-packages/commit/e2fd046250664cd785269a718b036c0310dfcda7)) +* Split up protocol contract artifacts ([#10765](https://github.com/AztecProtocol/aztec-packages/issues/10765)) ([5a9ca18](https://github.com/AztecProtocol/aztec-packages/commit/5a9ca18ceee03ca2175605d1029153a7bf228ea9)) +* Trace and handle errors in running promises ([#10645](https://github.com/AztecProtocol/aztec-packages/issues/10645)) ([4cc0a6d](https://github.com/AztecProtocol/aztec-packages/commit/4cc0a6d832e6ee1c3fcc6876517ed3f743f59d4b)) + +## [0.67.0](https://github.com/AztecProtocol/aztec-packages/compare/aztec-package-v0.66.0...aztec-package-v0.67.0) (2024-12-13) + + +### Features + +* Deploy faucet ([#10580](https://github.com/AztecProtocol/aztec-packages/issues/10580)) ([09e95a1](https://github.com/AztecProtocol/aztec-packages/commit/09e95a1d033deb5c31d9967d5100a6aeb8485ab5)) +* Expose P2P service API and clean up logs ([#10552](https://github.com/AztecProtocol/aztec-packages/issues/10552)) ([98cea58](https://github.com/AztecProtocol/aztec-packages/commit/98cea58dd9c7a4518daa8e625dd794a2b6f4b314)), closes [#10299](https://github.com/AztecProtocol/aztec-packages/issues/10299) +* PXE in the browser ([#10353](https://github.com/AztecProtocol/aztec-packages/issues/10353)) ([676f673](https://github.com/AztecProtocol/aztec-packages/commit/676f673dfbcb14f5351a0068aef9ad9fa4ebf879)) +* PXE sync on demand ([#10613](https://github.com/AztecProtocol/aztec-packages/issues/10613)) ([b2f1159](https://github.com/AztecProtocol/aztec-packages/commit/b2f11596e5c79be0c11ad298e734885e9657e640)) + + +### Bug Fixes + +* Do not load pino-pretty in production bundles ([#10578](https://github.com/AztecProtocol/aztec-packages/issues/10578)) ([e515e6e](https://github.com/AztecProtocol/aztec-packages/commit/e515e6e7644180bab72eb693d83b9496919cc159)) +* Tweaking Fr and Fq fromString functionality to distinguish number-only strings ([#10529](https://github.com/AztecProtocol/aztec-packages/issues/10529)) ([736fce1](https://github.com/AztecProtocol/aztec-packages/commit/736fce1f77533925943ef363d1803b2e55f83609)) + + +### Miscellaneous + +* Bump jest default test timeout to 30s ([#10550](https://github.com/AztecProtocol/aztec-packages/issues/10550)) ([841bf48](https://github.com/AztecProtocol/aztec-packages/commit/841bf48c27767c3a4a53aacd0115582e8397910f)) +* Rename logger modules ([#10404](https://github.com/AztecProtocol/aztec-packages/issues/10404)) ([7441767](https://github.com/AztecProtocol/aztec-packages/commit/7441767d7e8e7e7d602c447ca843dee43f8dc8f8)), closes [#10125](https://github.com/AztecProtocol/aztec-packages/issues/10125) + ## [0.66.0](https://github.com/AztecProtocol/aztec-packages/compare/aztec-package-v0.65.2...aztec-package-v0.66.0) (2024-12-06) diff --git a/yarn-project/aztec/docker-compose.yml b/yarn-project/aztec/docker-compose.yml index 3fe35cd42f8..7d158f93f30 100644 --- a/yarn-project/aztec/docker-compose.yml +++ b/yarn-project/aztec/docker-compose.yml @@ -29,7 +29,6 @@ services: P2P_BLOCK_CHECK_INTERVAL_MS: 50 SEQ_TX_POLLING_INTERVAL_MS: 50 WS_BLOCK_CHECK_INTERVAL_MS: 50 - PXE_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 volumes: - ./log:/usr/src/yarn-project/aztec/log:rw diff --git a/yarn-project/aztec/package.json b/yarn-project/aztec/package.json index 4f83270a6b2..5e9a1e1ef52 100644 --- a/yarn-project/aztec/package.json +++ b/yarn-project/aztec/package.json @@ -1,6 +1,6 @@ { "name": "@aztec/aztec", - "version": "0.66.0", + "version": "0.67.1", "type": "module", "exports": { ".": "./dest/index.js" diff --git a/yarn-project/aztec/src/bin/index.ts b/yarn-project/aztec/src/bin/index.ts index 39426945fd5..ff4828e6752 100644 --- a/yarn-project/aztec/src/bin/index.ts +++ b/yarn-project/aztec/src/bin/index.ts @@ -1,5 +1,4 @@ #!/usr/bin/env node -import { fileURLToPath } from '@aztec/aztec.js'; import { injectCommands as injectBuilderCommands } from '@aztec/builder'; import { injectCommands as injectWalletCommands } from '@aztec/cli-wallet'; import { injectCommands as injectContractCommands } from '@aztec/cli/contracts'; @@ -9,6 +8,7 @@ import { injectCommands as injectL1Commands } from '@aztec/cli/l1'; import { injectCommands as injectMiscCommands } from '@aztec/cli/misc'; import { injectCommands as injectPXECommands } from '@aztec/cli/pxe'; import { createConsoleLogger, createLogger } from '@aztec/foundation/log'; +import { fileURLToPath } from '@aztec/foundation/url'; import { Command } from 'commander'; import { readFileSync } from 'fs'; diff --git a/yarn-project/aztec/src/cli/aztec_start_action.ts b/yarn-project/aztec/src/cli/aztec_start_action.ts new file mode 100644 index 00000000000..983afecf019 --- /dev/null +++ b/yarn-project/aztec/src/cli/aztec_start_action.ts @@ -0,0 +1,101 @@ +import { deployInitialTestAccounts } from '@aztec/accounts/testing'; +import { AztecNodeApiSchema, PXESchema } from '@aztec/circuit-types'; +import { + type NamespacedApiHandlers, + createNamespacedSafeJsonRpcServer, + startHttpRpcServer, +} from '@aztec/foundation/json-rpc/server'; +import { type LogFn, type Logger } from '@aztec/foundation/log'; + +import { createSandbox } from '../sandbox.js'; +import { github, splash } from '../splash.js'; +import { createAccountLogs, extractNamespacedOptions, installSignalHandlers } from './util.js'; + +export async function aztecStart(options: any, userLog: LogFn, debugLogger: Logger) { + // list of 'stop' functions to call when process ends + const signalHandlers: Array<() => Promise> = []; + const services: NamespacedApiHandlers = {}; + + if (options.sandbox) { + const sandboxOptions = extractNamespacedOptions(options, 'sandbox'); + userLog(`${splash}\n${github}\n\n`); + userLog(`Setting up Aztec Sandbox, please stand by...`); + const { aztecNodeConfig, node, pxe, stop } = await createSandbox({ + enableGas: sandboxOptions.enableGas, + l1Mnemonic: options.l1Mnemonic, + l1RpcUrl: options.l1RpcUrl, + }); + + // Deploy test accounts by default + if (sandboxOptions.testAccounts) { + if (aztecNodeConfig.p2pEnabled) { + userLog(`Not setting up test accounts as we are connecting to a network`); + } else if (sandboxOptions.noPXE) { + userLog(`Not setting up test accounts as we are not exposing a PXE`); + } else { + userLog('Setting up test accounts...'); + const accounts = await deployInitialTestAccounts(pxe); + const accLogs = await createAccountLogs(accounts, pxe); + userLog(accLogs.join('')); + } + } + + // Start Node and PXE JSON-RPC server + signalHandlers.push(stop); + services.node = [node, AztecNodeApiSchema]; + if (!sandboxOptions.noPXE) { + services.pxe = [pxe, PXESchema]; + } else { + userLog(`Not exposing PXE API through JSON-RPC server`); + } + } else { + if (options.node) { + const { startNode } = await import('./cmds/start_node.js'); + await startNode(options, signalHandlers, services, userLog); + } else if (options.proofVerifier) { + const { startProofVerifier } = await import('./cmds/start_proof_verifier.js'); + await startProofVerifier(options, signalHandlers, userLog); + } else if (options.bot) { + const { startBot } = await import('./cmds/start_bot.js'); + await startBot(options, signalHandlers, services, userLog); + } else if (options.proverNode) { + const { startProverNode } = await import('./cmds/start_prover_node.js'); + await startProverNode(options, signalHandlers, services, userLog); + } else if (options.pxe) { + const { startPXE } = await import('./cmds/start_pxe.js'); + await startPXE(options, signalHandlers, services, userLog); + } else if (options.archiver) { + const { startArchiver } = await import('./cmds/start_archiver.js'); + await startArchiver(options, signalHandlers, services); + } else if (options.p2pBootstrap) { + const { startP2PBootstrap } = await import('./cmds/start_p2p_bootstrap.js'); + await startP2PBootstrap(options, signalHandlers, services, userLog); + } else if (options.proverAgent) { + const { startProverAgent } = await import('./cmds/start_prover_agent.js'); + await startProverAgent(options, signalHandlers, services, userLog); + } else if (options.proverBroker) { + const { startProverBroker } = await import('./cmds/start_prover_broker.js'); + await startProverBroker(options, signalHandlers, services, userLog); + } else if (options.txe) { + const { startTXE } = await import('./cmds/start_txe.js'); + await startTXE(options, debugLogger); + } else if (options.sequencer) { + userLog(`Cannot run a standalone sequencer without a node`); + process.exit(1); + } else if (options.faucet) { + const { startFaucet } = await import('./cmds/start_faucet.js'); + await startFaucet(options, signalHandlers, services, userLog); + } else { + userLog(`No module specified to start`); + process.exit(1); + } + } + + installSignalHandlers(debugLogger.info, signalHandlers); + + if (Object.entries(services).length > 0) { + const rpcServer = createNamespacedSafeJsonRpcServer(services, debugLogger); + const { port } = await startHttpRpcServer(rpcServer, { port: options.port }); + debugLogger.info(`Aztec Server listening on port ${port}`); + } +} diff --git a/yarn-project/aztec/src/cli/aztec_start_options.ts b/yarn-project/aztec/src/cli/aztec_start_options.ts index 06ae9c449d0..ab0c4d0fd4e 100644 --- a/yarn-project/aztec/src/cli/aztec_start_options.ts +++ b/yarn-project/aztec/src/cli/aztec_start_options.ts @@ -1,13 +1,13 @@ -import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver'; -import { faucetConfigMapping } from '@aztec/aztec-faucet'; -import { sequencerClientConfigMappings } from '@aztec/aztec-node'; -import { botConfigMappings } from '@aztec/bot'; +import { type ArchiverConfig, archiverConfigMappings } from '@aztec/archiver/config'; +import { faucetConfigMapping } from '@aztec/aztec-faucet/config'; +import { sequencerClientConfigMappings } from '@aztec/aztec-node/config'; +import { botConfigMappings } from '@aztec/bot/config'; import { type ProverAgentConfig, type ProverBrokerConfig, proverAgentConfigMappings, proverBrokerConfigMappings, -} from '@aztec/circuit-types'; +} from '@aztec/circuit-types/config'; import { type ConfigMapping, type EnvVar, @@ -15,13 +15,13 @@ import { isBooleanConfigValue, omitConfigMappings, } from '@aztec/foundation/config'; -import { bootnodeConfigMappings, p2pConfigMappings } from '@aztec/p2p'; -import { proofVerifierConfigMappings } from '@aztec/proof-verifier'; -import { proverNodeConfigMappings } from '@aztec/prover-node'; -import { allPxeConfigMappings } from '@aztec/pxe'; +import { bootnodeConfigMappings, p2pConfigMappings } from '@aztec/p2p/config'; +import { proofVerifierConfigMappings } from '@aztec/proof-verifier/config'; +import { proverNodeConfigMappings } from '@aztec/prover-node/config'; +import { allPxeConfigMappings } from '@aztec/pxe/config'; import { telemetryClientConfigMappings } from '@aztec/telemetry-client/start'; -import { defaultMnemonic } from '../sandbox.js'; +import { DefaultMnemonic } from '../mnemonic.js'; // Define an interface for options export interface AztecStartOption { @@ -115,7 +115,7 @@ export const aztecStartOptions: { [key: string]: AztecStartOption[] } = { { flag: '--l1-mnemonic ', description: 'Mnemonic for L1 accounts. Will be used if no publisher private keys are provided', - defaultValue: defaultMnemonic, + defaultValue: DefaultMnemonic, envVar: 'MNEMONIC', }, ], diff --git a/yarn-project/aztec/src/cli/cli.ts b/yarn-project/aztec/src/cli/cli.ts index 3273aa715a7..90ff22b6336 100644 --- a/yarn-project/aztec/src/cli/cli.ts +++ b/yarn-project/aztec/src/cli/cli.ts @@ -1,24 +1,9 @@ -import { deployInitialTestAccounts } from '@aztec/accounts/testing'; -import { AztecNodeApiSchema, PXESchema } from '@aztec/circuit-types'; -import { - type NamespacedApiHandlers, - createNamespacedSafeJsonRpcServer, - startHttpRpcServer, -} from '@aztec/foundation/json-rpc/server'; import { type LogFn, type Logger } from '@aztec/foundation/log'; import { Command } from 'commander'; -import { createSandbox } from '../sandbox.js'; -import { github, splash } from '../splash.js'; import { aztecStartOptions } from './aztec_start_options.js'; -import { - addOptions, - createAccountLogs, - extractNamespacedOptions, - installSignalHandlers, - printAztecStartHelpText, -} from './util.js'; +import { addOptions, printAztecStartHelpText } from './util.js'; /** * Returns commander program that defines the 'aztec' command line interface. @@ -38,92 +23,8 @@ export function injectAztecCommands(program: Command, userLog: LogFn, debugLogge startCmd.helpInformation = printAztecStartHelpText; startCmd.action(async options => { - // list of 'stop' functions to call when process ends - const signalHandlers: Array<() => Promise> = []; - const services: NamespacedApiHandlers = {}; - - if (options.sandbox) { - const sandboxOptions = extractNamespacedOptions(options, 'sandbox'); - userLog(`${splash}\n${github}\n\n`); - userLog(`Setting up Aztec Sandbox, please stand by...`); - const { aztecNodeConfig, node, pxe, stop } = await createSandbox({ - enableGas: sandboxOptions.enableGas, - l1Mnemonic: options.l1Mnemonic, - l1RpcUrl: options.l1RpcUrl, - }); - - // Deploy test accounts by default - if (sandboxOptions.testAccounts) { - if (aztecNodeConfig.p2pEnabled) { - userLog(`Not setting up test accounts as we are connecting to a network`); - } else if (sandboxOptions.noPXE) { - userLog(`Not setting up test accounts as we are not exposing a PXE`); - } else { - userLog('Setting up test accounts...'); - const accounts = await deployInitialTestAccounts(pxe); - const accLogs = await createAccountLogs(accounts, pxe); - userLog(accLogs.join('')); - } - } - - // Start Node and PXE JSON-RPC server - signalHandlers.push(stop); - services.node = [node, AztecNodeApiSchema]; - if (!sandboxOptions.noPXE) { - services.pxe = [pxe, PXESchema]; - } else { - userLog(`Not exposing PXE API through JSON-RPC server`); - } - } else { - if (options.node) { - const { startNode } = await import('./cmds/start_node.js'); - await startNode(options, signalHandlers, services, userLog); - } else if (options.proofVerifier) { - const { startProofVerifier } = await import('./cmds/start_proof_verifier.js'); - await startProofVerifier(options, signalHandlers, userLog); - } else if (options.bot) { - const { startBot } = await import('./cmds/start_bot.js'); - await startBot(options, signalHandlers, services, userLog); - } else if (options.proverNode) { - const { startProverNode } = await import('./cmds/start_prover_node.js'); - await startProverNode(options, signalHandlers, services, userLog); - } else if (options.pxe) { - const { startPXE } = await import('./cmds/start_pxe.js'); - await startPXE(options, signalHandlers, services, userLog); - } else if (options.archiver) { - const { startArchiver } = await import('./cmds/start_archiver.js'); - await startArchiver(options, signalHandlers, services); - } else if (options.p2pBootstrap) { - const { startP2PBootstrap } = await import('./cmds/start_p2p_bootstrap.js'); - await startP2PBootstrap(options, signalHandlers, services, userLog); - } else if (options.proverAgent) { - const { startProverAgent } = await import('./cmds/start_prover_agent.js'); - await startProverAgent(options, signalHandlers, services, userLog); - } else if (options.proverBroker) { - const { startProverBroker } = await import('./cmds/start_prover_broker.js'); - await startProverBroker(options, signalHandlers, services, userLog); - } else if (options.txe) { - const { startTXE } = await import('./cmds/start_txe.js'); - await startTXE(options, debugLogger); - } else if (options.sequencer) { - userLog(`Cannot run a standalone sequencer without a node`); - process.exit(1); - } else if (options.faucet) { - const { startFaucet } = await import('./cmds/start_faucet.js'); - await startFaucet(options, signalHandlers, services, userLog); - } else { - userLog(`No module specified to start`); - process.exit(1); - } - } - - installSignalHandlers(debugLogger.info, signalHandlers); - - if (Object.entries(services).length > 0) { - const rpcServer = createNamespacedSafeJsonRpcServer(services, debugLogger); - const { port } = await startHttpRpcServer(rpcServer, { port: options.port }); - debugLogger.info(`Aztec Server listening on port ${port}`); - } + const { aztecStart } = await import('./aztec_start_action.js'); + return await aztecStart(options, userLog, debugLogger); }); program.addCommand(startCmd); diff --git a/yarn-project/aztec/src/cli/cmds/start_bot.ts b/yarn-project/aztec/src/cli/cmds/start_bot.ts index 1d3e110db33..635549c189f 100644 --- a/yarn-project/aztec/src/cli/cmds/start_bot.ts +++ b/yarn-project/aztec/src/cli/cmds/start_bot.ts @@ -2,6 +2,11 @@ import { type BotConfig, BotRunner, botConfigMappings, getBotRunnerApiHandler } import { type AztecNode, type PXE } from '@aztec/circuit-types'; import { type NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server'; import { type LogFn } from '@aztec/foundation/log'; +import { type TelemetryClient } from '@aztec/telemetry-client'; +import { + createAndStartTelemetryClient, + getConfigEnvVars as getTelemetryClientConfig, +} from '@aztec/telemetry-client/start'; import { extractRelevantOptions } from '../util.js'; @@ -25,14 +30,15 @@ export async function startBot( pxe = await addPXE(options, signalHandlers, services, userLog); } - await addBot(options, signalHandlers, services, { pxe }); + const telemetry = await createAndStartTelemetryClient(getTelemetryClientConfig()); + await addBot(options, signalHandlers, services, { pxe, telemetry }); } export function addBot( options: any, signalHandlers: (() => Promise)[], services: NamespacedApiHandlers, - deps: { pxe?: PXE; node?: AztecNode } = {}, + deps: { pxe?: PXE; node?: AztecNode; telemetry: TelemetryClient }, ) { const config = extractRelevantOptions(options, botConfigMappings, 'bot'); diff --git a/yarn-project/aztec/src/cli/cmds/start_node.ts b/yarn-project/aztec/src/cli/cmds/start_node.ts index 2459533aa9f..1758ea35a38 100644 --- a/yarn-project/aztec/src/cli/cmds/start_node.ts +++ b/yarn-project/aztec/src/cli/cmds/start_node.ts @@ -88,10 +88,10 @@ export async function startNode( } const telemetryConfig = extractRelevantOptions(options, telemetryClientConfigMappings, 'tel'); - const telemetryClient = await createAndStartTelemetryClient(telemetryConfig); + const telemetry = await createAndStartTelemetryClient(telemetryConfig); // Create and start Aztec Node - const node = await createAztecNode(nodeConfig, telemetryClient); + const node = await createAztecNode(nodeConfig, telemetry); // Add node and p2p to services list services.node = [node, AztecNodeApiSchema]; @@ -110,6 +110,6 @@ export async function startNode( // Add a txs bot if requested if (options.bot) { const { addBot } = await import('./start_bot.js'); - await addBot(options, signalHandlers, services, { pxe, node }); + await addBot(options, signalHandlers, services, { pxe, node, telemetry }); } } diff --git a/yarn-project/aztec/src/cli/cmds/start_pxe.ts b/yarn-project/aztec/src/cli/cmds/start_pxe.ts index f1d8681982c..949995d70b7 100644 --- a/yarn-project/aztec/src/cli/cmds/start_pxe.ts +++ b/yarn-project/aztec/src/cli/cmds/start_pxe.ts @@ -93,8 +93,8 @@ export async function addPXE( l2Contracts[key] = { name: key, address: AztecAddress.fromString(basicContractsInfo[key].address), - initHash: Fr.fromString(basicContractsInfo[key].initHash), - salt: Fr.fromString(basicContractsInfo[key].salt), + initHash: Fr.fromHexString(basicContractsInfo[key].initHash), + salt: Fr.fromHexString(basicContractsInfo[key].salt), artifact: await getContractArtifact(artifactName, userLog), }; } @@ -117,8 +117,5 @@ export async function addPXE( // Add PXE to services list services.pxe = [pxe, PXESchema]; - // Add PXE stop function to signal handlers - signalHandlers.push(pxe.stop); - return pxe; } diff --git a/yarn-project/aztec/src/mnemonic.ts b/yarn-project/aztec/src/mnemonic.ts new file mode 100644 index 00000000000..35e4cc86b4a --- /dev/null +++ b/yarn-project/aztec/src/mnemonic.ts @@ -0,0 +1 @@ +export const DefaultMnemonic = 'test test test test test test test test test test test junk'; diff --git a/yarn-project/aztec/src/sandbox.ts b/yarn-project/aztec/src/sandbox.ts index 0545db16714..a271f11d05f 100644 --- a/yarn-project/aztec/src/sandbox.ts +++ b/yarn-project/aztec/src/sandbox.ts @@ -3,7 +3,7 @@ import { type AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec import { AnvilTestWatcher, EthCheatCodes, SignerlessWallet, retryUntil } from '@aztec/aztec.js'; import { DefaultMultiCallEntrypoint } from '@aztec/aztec.js/entrypoint'; import { type AztecNode } from '@aztec/circuit-types'; -import { setupCanonicalL2FeeJuice } from '@aztec/cli/misc'; +import { setupCanonicalL2FeeJuice } from '@aztec/cli/setup-contracts'; import { type DeployL1Contracts, NULL_KEY, @@ -25,7 +25,7 @@ import { type HDAccount, type PrivateKeyAccount, createPublicClient, http as htt import { mnemonicToAccount } from 'viem/accounts'; import { foundry } from 'viem/chains'; -export const defaultMnemonic = 'test test test test test test test test test test test junk'; +import { DefaultMnemonic } from './mnemonic.js'; const logger = createLogger('sandbox'); @@ -110,7 +110,7 @@ export type SandboxConfig = AztecNodeConfig & { */ export async function createSandbox(config: Partial = {}) { const aztecNodeConfig: AztecNodeConfig = { ...getConfigEnvVars(), ...config }; - const hdAccount = mnemonicToAccount(config.l1Mnemonic || defaultMnemonic); + const hdAccount = mnemonicToAccount(config.l1Mnemonic || DefaultMnemonic); if (!aztecNodeConfig.publisherPrivateKey || aztecNodeConfig.publisherPrivateKey === NULL_KEY) { const privKey = hdAccount.getHdKey().privateKey; aztecNodeConfig.publisherPrivateKey = `0x${Buffer.from(privKey!).toString('hex')}`; @@ -157,7 +157,6 @@ export async function createSandbox(config: Partial = {}) { } const stop = async () => { - await pxe.stop(); await node.stop(); await watcher?.stop(); }; diff --git a/yarn-project/bb-prover/package.json b/yarn-project/bb-prover/package.json index 9dff8dc8a80..1c109743f2c 100644 --- a/yarn-project/bb-prover/package.json +++ b/yarn-project/bb-prover/package.json @@ -4,9 +4,11 @@ "type": "module", "exports": { ".": "./dest/index.js", + "./wasm": "./dest/wasm/index.js", "./prover": "./dest/prover/index.js", "./verifier": "./dest/verifier/index.js", - "./test": "./dest/test/index.js" + "./test": "./dest/test/index.js", + "./config": "./dest/config.js" }, "bin": { "bb-cli": "./dest/bb/index.js" @@ -69,6 +71,7 @@ ] }, "dependencies": { + "@aztec/bb.js": "portal:../../barretenberg/ts", "@aztec/circuit-types": "workspace:^", "@aztec/circuits.js": "workspace:^", "@aztec/foundation": "workspace:^", @@ -80,6 +83,7 @@ "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi", "@noir-lang/types": "portal:../../noir/packages/types", "commander": "^12.1.0", + "pako": "^2.1.0", "source-map-support": "^0.5.21", "tslib": "^2.4.0" }, diff --git a/yarn-project/bb-prover/src/avm_proving.test.ts b/yarn-project/bb-prover/src/avm_proving.test.ts index 4986339dda7..f0c5582c996 100644 --- a/yarn-project/bb-prover/src/avm_proving.test.ts +++ b/yarn-project/bb-prover/src/avm_proving.test.ts @@ -85,6 +85,31 @@ describe('AVM WitGen, proof generation and verification', () => { }, TIMEOUT, ); + it( + 'Should prove and verify a top-level exceptional halt', + async () => { + await proveAndVerifyAvmTestContract('divide_by_zero', /*calldata=*/ [], /*expectRevert=*/ true); + }, + TIMEOUT, + ); + it( + 'Should prove and verify a nested exceptional halt that propagates to top-level', + async () => { + await proveAndVerifyAvmTestContract('external_call_to_divide_by_zero', /*calldata=*/ [], /*expectRevert=*/ true); + }, + TIMEOUT, + ); + it( + 'Should prove and verify a nested exceptional halt that is recovered from in caller', + async () => { + await proveAndVerifyAvmTestContract( + 'external_call_to_divide_by_zero_recovers', + /*calldata=*/ [], + /*expectRevert=*/ false, + ); + }, + TIMEOUT, + ); }); async function proveAndVerifyAvmTestContract(functionName: string, calldata: Fr[] = [], expectRevert = false) { diff --git a/yarn-project/bb-prover/src/bb/execute.ts b/yarn-project/bb-prover/src/bb/execute.ts index 9c5be4da622..788a5645e72 100644 --- a/yarn-project/bb-prover/src/bb/execute.ts +++ b/yarn-project/bb-prover/src/bb/execute.ts @@ -201,7 +201,6 @@ export async function executeBbClientIvcProof( bytecodeStackPath: string, witnessStackPath: string, log: LogFn, - noAutoVerify = false, ): Promise { // Check that the working directory exists try { @@ -238,9 +237,7 @@ export async function executeBbClientIvcProof( '--input_type', 'runtime_stack', ]; - if (noAutoVerify) { - args.push('--no_auto_verify'); - } + const timer = new Timer(); const logFunction = (message: string) => { log(`bb - ${message}`); diff --git a/yarn-project/bb-prover/src/instrumentation.ts b/yarn-project/bb-prover/src/instrumentation.ts index 3b2360e866c..782042da6f5 100644 --- a/yarn-project/bb-prover/src/instrumentation.ts +++ b/yarn-project/bb-prover/src/instrumentation.ts @@ -8,7 +8,6 @@ import { type TelemetryClient, type Tracer, ValueType, - millisecondBuckets, } from '@aztec/telemetry-client'; /** @@ -36,27 +35,18 @@ export class ProverInstrumentation { description: 'Records how long it takes to simulate a circuit', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(1), // 10ms -> ~327s - }, }); this.witGenDuration = meter.createHistogram(Metrics.CIRCUIT_WITNESS_GEN_DURATION, { description: 'Records how long it takes to generate the partial witness for a circuit', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(1), - }, }); this.provingDuration = meter.createHistogram(Metrics.CIRCUIT_PROVING_DURATION, { unit: 'ms', description: 'Records how long it takes to prove a circuit', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(2), // 100ms -> 54 minutes - }, }); this.witGenInputSize = meter.createGauge(Metrics.CIRCUIT_WITNESS_GEN_INPUT_SIZE, { diff --git a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts index 614329564cd..2d70f5726eb 100644 --- a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts @@ -1,22 +1,14 @@ +import { type PrivateKernelProver, type PrivateKernelSimulateOutput } from '@aztec/circuit-types'; +import { type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats'; import { - type AppCircuitSimulateOutput, - type PrivateKernelProver, - type PrivateKernelSimulateOutput, -} from '@aztec/circuit-types'; -import { type CircuitSimulationStats, type CircuitWitnessGenerationStats } from '@aztec/circuit-types/stats'; -import { - AGGREGATION_OBJECT_LENGTH, - ClientIvcProof, - Fr, + type ClientIvcProof, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, type PrivateKernelInnerCircuitPrivateInputs, type PrivateKernelResetCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, - Proof, - RecursiveProof, - type VerificationKeyAsFields, + type Proof, type VerificationKeyData, } from '@aztec/circuits.js'; import { runInDirectory } from '@aztec/foundation/fs'; @@ -48,19 +40,12 @@ import { type WitnessMap } from '@noir-lang/types'; import { promises as fs } from 'fs'; import path from 'path'; -import { - BB_RESULT, - PROOF_FIELDS_FILENAME, - PROOF_FILENAME, - computeGateCountForCircuit, - computeVerificationKey, - executeBbClientIvcProof, - verifyProof, -} from '../bb/execute.js'; +import { BB_RESULT, computeGateCountForCircuit, executeBbClientIvcProof, verifyProof } from '../bb/execute.js'; import { type BBConfig } from '../config.js'; import { type UltraHonkFlavor, getUltraHonkFlavorForCircuit } from '../honk.js'; import { mapProtocolArtifactNameToCircuitName } from '../stats.js'; import { extractVkData } from '../verification_key/verification_key_data.js'; +import { readFromOutputDirectory } from './client_ivc_proof_utils.js'; /** * This proof creator implementation uses the native bb binary. @@ -105,7 +90,6 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { path.join(directory, 'acir.msgpack'), path.join(directory, 'witnesses.msgpack'), this.log.info, - true, ); if (provingResult.status === BB_RESULT.FAILURE) { @@ -113,7 +97,7 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { throw new Error(provingResult.reason); } - const proof = await ClientIvcProof.readFromOutputDirectory(directory); + const proof = await readFromOutputDirectory(directory); this.log.info(`Generated IVC proof`, { duration: provingResult.durationMs, @@ -185,22 +169,6 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { ); } - public async computeAppCircuitVerificationKey( - bytecode: Buffer, - appCircuitName?: string, - ): Promise { - const operation = async (directory: string) => { - this.log.debug(`Proving app circuit`); - // App circuits are always recursive; the #[recursive] attribute used to be applied automatically - // by the `private` comptime macro in noir-projects/aztec-nr/aztec/src/macros/functions/mod.nr - // Yet, inside `computeVerificationKey` the `mega_honk` flavor is used, which doesn't use the recursive flag. - const recursive = true; - return await this.computeVerificationKey(directory, bytecode, recursive, 'App', appCircuitName); - }; - - return await this.runInDirectory(operation); - } - /** * Verifies a proof, will generate the verification key if one is not cached internally * @param circuitType - The type of circuit whose proof is to be verified @@ -314,99 +282,6 @@ export class BBNativePrivateKernelProver implements PrivateKernelProver { return kernelOutput; } - private async computeVerificationKey( - directory: string, - bytecode: Buffer, - recursive: boolean, - circuitType: ClientProtocolArtifact | 'App', - appCircuitName?: string, - ): Promise<{ - verificationKey: VerificationKeyAsFields; - }> { - const dbgCircuitName = appCircuitName ? `(${appCircuitName})` : ''; - this.log.info(`Computing VK of ${circuitType}${dbgCircuitName} circuit...`); - - const timer = new Timer(); - - const vkResult = await computeVerificationKey( - this.bbBinaryPath, - directory, - circuitType, - bytecode, - recursive, - circuitType === 'App' ? 'mega_honk' : getUltraHonkFlavorForCircuit(circuitType), - this.log.debug, - ); - - if (vkResult.status === BB_RESULT.FAILURE) { - this.log.error(`Failed to generate verification key for ${circuitType}${dbgCircuitName}: ${vkResult.reason}`); - throw new Error(vkResult.reason); - } - - this.log.info(`Generated ${circuitType}${dbgCircuitName} VK in ${Math.ceil(timer.ms())} ms`); - - if (circuitType === 'App') { - const vkData = await extractVkData(directory); - - this.log.debug(`Computed verification key`, { - circuitName: 'app-circuit', - duration: vkResult.durationMs, - eventName: 'circuit-simulation', - inputSize: bytecode.length, - outputSize: vkData.keyAsBytes.length, - circuitSize: vkData.circuitSize, - numPublicInputs: vkData.numPublicInputs, - } as CircuitSimulationStats); - - return { verificationKey: vkData.keyAsFields }; - } - - const vkData = await this.updateVerificationKeyAfterSimulation(directory, circuitType); - - this.log.debug(`Computed verification key`, { - circuitName: mapProtocolArtifactNameToCircuitName(circuitType), - duration: vkResult.durationMs, - eventName: 'circuit-simulation', - inputSize: bytecode.length, - outputSize: vkData.keyAsBytes.length, - circuitSize: vkData.circuitSize, - numPublicInputs: vkData.numPublicInputs, - } as CircuitSimulationStats); - - return { verificationKey: vkData.keyAsFields }; - } - - /** - * Parses and returns the proof data stored at the specified directory - * @param filePath - The directory containing the proof data - * @param circuitType - The type of circuit proven - * @returns The proof - */ - private async readProofAsFields( - filePath: string, - circuitType: ClientProtocolArtifact | 'App', - vkData: VerificationKeyData, - ): Promise> { - const [binaryProof, proofString] = await Promise.all([ - fs.readFile(`${filePath}/${PROOF_FILENAME}`), - fs.readFile(`${filePath}/${PROOF_FIELDS_FILENAME}`, { encoding: 'utf-8' }), - ]); - const json = JSON.parse(proofString); - const fields = json.map(Fr.fromString); - const numPublicInputs = vkData.numPublicInputs - AGGREGATION_OBJECT_LENGTH; - const fieldsWithoutPublicInputs = fields.slice(numPublicInputs); - this.log.info( - `Circuit type: ${circuitType}, complete proof length: ${fields.length}, without public inputs: ${fieldsWithoutPublicInputs.length}, num public inputs: ${numPublicInputs}, circuit size: ${vkData.circuitSize}, is recursive: ${vkData.isRecursive}, raw length: ${binaryProof.length}`, - ); - const proof = new RecursiveProof( - fieldsWithoutPublicInputs, - new Proof(binaryProof, vkData.numPublicInputs), - true, - fieldsWithoutPublicInputs.length, - ); - return proof; - } - private runInDirectory(fn: (dir: string) => Promise) { const log = this.log; return runInDirectory( diff --git a/yarn-project/bb-prover/src/prover/bb_prover.ts b/yarn-project/bb-prover/src/prover/bb_prover.ts index e84714085c6..62391579ed8 100644 --- a/yarn-project/bb-prover/src/prover/bb_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_prover.ts @@ -99,6 +99,7 @@ import { type UltraHonkFlavor, getUltraHonkFlavorForCircuit } from '../honk.js'; import { ProverInstrumentation } from '../instrumentation.js'; import { mapProtocolArtifactNameToCircuitName } from '../stats.js'; import { extractAvmVkData, extractVkData } from '../verification_key/verification_key_data.js'; +import { writeToOutputDirectory } from './client_ivc_proof_utils.js'; const logger = createLogger('bb-prover'); @@ -551,7 +552,7 @@ export class BBNativeRollupProver implements ServerCircuitProver { const hasher = crypto.createHash('sha256'); hasher.update(input.toBuffer()); - await input.clientIVCData.writeToOutputDirectory(bbWorkingDirectory); + await writeToOutputDirectory(input.clientIVCData, bbWorkingDirectory); const provingResult = await generateTubeProof(this.config.bbBinaryPath, bbWorkingDirectory, logger.verbose); if (provingResult.status === BB_RESULT.FAILURE) { @@ -795,8 +796,8 @@ export class BBNativeRollupProver implements ServerCircuitProver { const json = JSON.parse(proofString); const fields = json .slice(0, 3) - .map(Fr.fromString) - .concat(json.slice(3 + numPublicInputs).map(Fr.fromString)); + .map(Fr.fromHexString) + .concat(json.slice(3 + numPublicInputs).map(Fr.fromHexString)); return new RecursiveProof( fields, new Proof(proof.binaryProof.buffer, vk.numPublicInputs), @@ -877,8 +878,8 @@ export class BBNativeRollupProver implements ServerCircuitProver { const fieldsWithoutPublicInputs = json .slice(0, 3) - .map(Fr.fromString) - .concat(json.slice(3 + numPublicInputs).map(Fr.fromString)); + .map(Fr.fromHexString) + .concat(json.slice(3 + numPublicInputs).map(Fr.fromHexString)); logger.debug( `Circuit path: ${filePath}, complete proof length: ${json.length}, num public inputs: ${numPublicInputs}, circuit size: ${vkData.circuitSize}, is recursive: ${vkData.isRecursive}, raw length: ${binaryProof.length}`, ); diff --git a/yarn-project/bb-prover/src/prover/client_ivc_proof_utils.ts b/yarn-project/bb-prover/src/prover/client_ivc_proof_utils.ts new file mode 100644 index 00000000000..ba604dc6866 --- /dev/null +++ b/yarn-project/bb-prover/src/prover/client_ivc_proof_utils.ts @@ -0,0 +1,39 @@ +import { ClientIvcProof } from '@aztec/circuits.js'; + +import { promises as fs } from 'fs'; +import { join } from 'path'; + +/** + * TODO(#7371): eventually remove client_ivc_prove_output_all_msgpack and properly handle these accumulators and VKs + * Create a ClientIvcProof from the result of client_ivc_prove_output_all or client_ivc_prove_output_all_msgpack + * @param directory the directory of results + * @returns the encapsulated client ivc proof + */ +export async function readFromOutputDirectory(directory: string) { + const [clientIvcVkBuffer, clientIvcProofBuffer] = await Promise.all( + ['client_ivc_vk', 'client_ivc_proof'].map(fileName => fs.readFile(join(directory, fileName))), + ); + return new ClientIvcProof(clientIvcProofBuffer, clientIvcVkBuffer); +} + +/** + * TODO(#7371): eventually remove client_ivc_prove_output_all_msgpack and properly handle these accumulators and VKs + * Serialize a ClientIvcProof to the files expected by prove_tube + * + * Example usage: + * await runInDirectory(bbWorkingDirectory, async (dir: string) => { + * await privateTx.clientIvcProof!.writeToOutputDirectory(bbWorkingDirectory); + * const result = await generateTubeProof(bbPath, dir, logger.info) + * expect(result.status).toBe(BB_RESULT.SUCCESS) + * }); + * @param proof the ClientIvcProof from readFromOutputDirectory + * @param directory the directory of results + */ +export async function writeToOutputDirectory(clientIvcProof: ClientIvcProof, directory: string) { + const { clientIvcProofBuffer, clientIvcVkBuffer } = clientIvcProof; + const fileData = [ + ['client_ivc_proof', clientIvcProofBuffer], + ['client_ivc_vk', clientIvcVkBuffer], + ] as const; + await Promise.all(fileData.map(([fileName, buffer]) => fs.writeFile(join(directory, fileName), buffer))); +} diff --git a/yarn-project/bb-prover/src/prover/index.ts b/yarn-project/bb-prover/src/prover/index.ts index 61453485089..4079e27943c 100644 --- a/yarn-project/bb-prover/src/prover/index.ts +++ b/yarn-project/bb-prover/src/prover/index.ts @@ -1,2 +1,3 @@ export * from './bb_prover.js'; export * from './bb_private_kernel_prover.js'; +export * from './client_ivc_proof_utils.js'; diff --git a/yarn-project/bb-prover/src/test/test_circuit_prover.ts b/yarn-project/bb-prover/src/test/test_circuit_prover.ts index ca81962cbda..5ed9dfad7d5 100644 --- a/yarn-project/bb-prover/src/test/test_circuit_prover.ts +++ b/yarn-project/bb-prover/src/test/test_circuit_prover.ts @@ -46,8 +46,6 @@ import { convertBaseParityOutputsFromWitnessMap, convertBlockMergeRollupInputsToWitnessMap, convertBlockMergeRollupOutputsFromWitnessMap, - convertBlockRootRollupInputsToWitnessMap, - convertBlockRootRollupOutputsFromWitnessMap, convertEmptyBlockRootRollupInputsToWitnessMap, convertEmptyBlockRootRollupOutputsFromWitnessMap, convertMergeRollupInputsToWitnessMap, @@ -57,6 +55,8 @@ import { convertRootParityOutputsFromWitnessMap, convertRootRollupInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap, + convertSimulatedBlockRootRollupInputsToWitnessMap, + convertSimulatedBlockRootRollupOutputsFromWitnessMap, convertSimulatedPrivateBaseRollupInputsToWitnessMap, convertSimulatedPrivateBaseRollupOutputsFromWitnessMap, convertSimulatedPrivateKernelEmptyOutputsFromWitnessMap, @@ -215,8 +215,8 @@ export class TestCircuitProver implements ServerCircuitProver { input, 'BlockRootRollupArtifact', NESTED_RECURSIVE_PROOF_LENGTH, - convertBlockRootRollupInputsToWitnessMap, - convertBlockRootRollupOutputsFromWitnessMap, + convertSimulatedBlockRootRollupInputsToWitnessMap, + convertSimulatedBlockRootRollupOutputsFromWitnessMap, ); } @@ -313,7 +313,12 @@ export class TestCircuitProver implements ServerCircuitProver { const witnessMap = convertInput(input); const circuitName = mapProtocolArtifactNameToCircuitName(artifactName); - const simulationProvider = this.simulationProvider ?? this.wasmSimulator; + let simulationProvider = this.simulationProvider ?? this.wasmSimulator; + if (artifactName == 'BlockRootRollupArtifact') { + // TODO(#10323): temporarily force block root to use wasm while we simulate + // the blob operations with an oracle. Appears to be no way to provide nativeACVM with a foreign call hander. + simulationProvider = this.wasmSimulator; + } const witness = await simulationProvider.simulateCircuit(witnessMap, SimulatedServerCircuitArtifacts[artifactName]); const result = convertOutput(witness); diff --git a/yarn-project/bb-prover/src/verification_key/verification_key_data.ts b/yarn-project/bb-prover/src/verification_key/verification_key_data.ts index 98dd1ebff4c..3a3f975802e 100644 --- a/yarn-project/bb-prover/src/verification_key/verification_key_data.ts +++ b/yarn-project/bb-prover/src/verification_key/verification_key_data.ts @@ -23,7 +23,7 @@ export async function extractVkData(vkDirectoryPath: string): Promise> { + return await this.simulate( + inputs, + 'PrivateKernelInitArtifact', + convertPrivateKernelInitInputsToWitnessMap, + convertPrivateKernelInitOutputsFromWitnessMap, + ); + } + + public async simulateProofInner( + inputs: PrivateKernelInnerCircuitPrivateInputs, + ): Promise> { + return await this.simulate( + inputs, + 'PrivateKernelInnerArtifact', + convertPrivateKernelInnerInputsToWitnessMap, + convertPrivateKernelInnerOutputsFromWitnessMap, + ); + } + + public async simulateProofReset( + inputs: PrivateKernelResetCircuitPrivateInputs, + ): Promise> { + const variantInputs = inputs.trimToSizes(); + const artifactName = getPrivateKernelResetArtifactName(inputs.dimensions); + return await this.simulate( + variantInputs, + artifactName, + variantInputs => convertPrivateKernelResetInputsToWitnessMap(variantInputs, artifactName), + output => convertPrivateKernelResetOutputsFromWitnessMap(output, artifactName), + ); + } + + public async simulateProofTail( + inputs: PrivateKernelTailCircuitPrivateInputs, + ): Promise> { + if (!inputs.isForPublic()) { + return await this.simulate( + inputs, + 'PrivateKernelTailArtifact', + convertPrivateKernelTailInputsToWitnessMap, + convertPrivateKernelTailOutputsFromWitnessMap, + ); + } + return await this.simulate( + inputs, + 'PrivateKernelTailToPublicArtifact', + convertPrivateKernelTailToPublicInputsToWitnessMap, + convertPrivateKernelTailForPublicOutputsFromWitnessMap, + ); + } + + private async simulate< + I extends { toBuffer: () => Buffer }, + O extends PrivateKernelCircuitPublicInputs | PrivateKernelTailCircuitPublicInputs, + >( + inputs: I, + circuitType: ClientProtocolArtifact, + convertInputs: (inputs: I) => WitnessMap, + convertOutputs: (outputs: WitnessMap) => O, + ): Promise> { + this.log.debug(`Generating witness for ${circuitType}`); + const compiledCircuit: NoirCompiledCircuit = ClientCircuitArtifacts[circuitType]; + + const witnessMap = convertInputs(inputs); + const timer = new Timer(); + const outputWitness = await this.simulator.simulateCircuit(witnessMap, compiledCircuit); + const output = convertOutputs(outputWitness); + + this.log.debug(`Generated witness for ${circuitType}`, { + eventName: 'circuit-witness-generation', + circuitName: circuitType, + duration: timer.ms(), + inputSize: inputs.toBuffer().length, + outputSize: output.toBuffer().length, + }); + + const verificationKey = ClientCircuitVks[circuitType].keyAsFields; + const bytecode = Buffer.from(compiledCircuit.bytecode, 'base64'); + + const kernelOutput: PrivateKernelSimulateOutput = { + publicInputs: output, + verificationKey, + outputWitness, + bytecode, + }; + return kernelOutput; + } + + async createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise { + const timer = new Timer(); + this.log.info(`Generating ClientIVC proof...`); + const backend = new AztecClientBackend( + acirs.map(acir => ungzip(acir)), + { threads: this.threads }, + ); + + const [proof, vk] = await backend.prove(witnessStack.map(witnessMap => ungzip(serializeWitness(witnessMap)))); + await backend.destroy(); + this.log.info(`Generated ClientIVC proof`, { + eventName: 'client-ivc-proof-generation', + duration: timer.ms(), + proofSize: proof.length, + vkSize: vk.length, + }); + return new ClientIvcProof(Buffer.from(proof), Buffer.from(vk)); + } + + computeGateCountForCircuit(_bytecode: Buffer, _circuitName: string): Promise { + return Promise.resolve(0); + } +} diff --git a/yarn-project/bot/package.json b/yarn-project/bot/package.json index f2f8c952824..e44cad7a4a2 100644 --- a/yarn-project/bot/package.json +++ b/yarn-project/bot/package.json @@ -3,7 +3,8 @@ "version": "0.1.0", "type": "module", "exports": { - ".": "./dest/index.js" + ".": "./dest/index.js", + "./config": "./dest/config.js" }, "inherits": [ "../package.common.json" @@ -64,6 +65,7 @@ "@aztec/foundation": "workspace:^", "@aztec/noir-contracts.js": "workspace:^", "@aztec/protocol-contracts": "workspace:^", + "@aztec/telemetry-client": "workspace:^", "@aztec/types": "workspace:^", "source-map-support": "^0.5.21", "tslib": "^2.4.0", diff --git a/yarn-project/bot/src/bot.ts b/yarn-project/bot/src/bot.ts index 0cf02b758fe..3a9c9e48871 100644 --- a/yarn-project/bot/src/bot.ts +++ b/yarn-project/bot/src/bot.ts @@ -10,7 +10,8 @@ import { import { type AztecNode, type FunctionCall, type PXE } from '@aztec/circuit-types'; import { Gas } from '@aztec/circuits.js'; import { times } from '@aztec/foundation/collection'; -import { type EasyPrivateTokenContract, type TokenContract } from '@aztec/noir-contracts.js'; +import { type EasyPrivateTokenContract } from '@aztec/noir-contracts.js/EasyPrivateToken'; +import { type TokenContract } from '@aztec/noir-contracts.js/Token'; import { type BotConfig } from './config.js'; import { BotFactory } from './factory.js'; diff --git a/yarn-project/bot/src/config.ts b/yarn-project/bot/src/config.ts index a980e6e42be..0600bc99243 100644 --- a/yarn-project/bot/src/config.ts +++ b/yarn-project/bot/src/config.ts @@ -105,20 +105,20 @@ export const botConfigMappings: ConfigMappingsType = { senderPrivateKey: { env: 'BOT_PRIVATE_KEY', description: 'Signing private key for the sender account.', - parseEnv: (val: string) => Fr.fromString(val), + parseEnv: (val: string) => Fr.fromHexString(val), defaultValue: Fr.random(), }, recipientEncryptionSecret: { env: 'BOT_RECIPIENT_ENCRYPTION_SECRET', description: 'Encryption secret for a recipient account.', - parseEnv: (val: string) => Fr.fromString(val), - defaultValue: Fr.fromString('0xcafecafe'), + parseEnv: (val: string) => Fr.fromHexString(val), + defaultValue: Fr.fromHexString('0xcafecafe'), }, tokenSalt: { env: 'BOT_TOKEN_SALT', description: 'Salt for the token contract deployment.', - parseEnv: (val: string) => Fr.fromString(val), - defaultValue: Fr.fromString('1'), + parseEnv: (val: string) => Fr.fromHexString(val), + defaultValue: Fr.fromHexString('1'), }, txIntervalSeconds: { env: 'BOT_TX_INTERVAL_SECONDS', diff --git a/yarn-project/bot/src/factory.ts b/yarn-project/bot/src/factory.ts index aac66847624..440b219a3f5 100644 --- a/yarn-project/bot/src/factory.ts +++ b/yarn-project/bot/src/factory.ts @@ -6,11 +6,10 @@ import { type DeployOptions, createLogger, createPXEClient, - retryUntil, } from '@aztec/aztec.js'; import { type AztecNode, type FunctionCall, type PXE } from '@aztec/circuit-types'; import { Fr, deriveSigningKey } from '@aztec/circuits.js'; -import { EasyPrivateTokenContract } from '@aztec/noir-contracts.js'; +import { EasyPrivateTokenContract } from '@aztec/noir-contracts.js/EasyPrivateToken'; import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { type BotConfig, SupportedTokenContracts } from './config.js'; @@ -67,16 +66,6 @@ export class BotFactory { if (isInit) { this.log.info(`Account at ${account.getAddress().toString()} already initialized`); const wallet = await account.register(); - const blockNumber = await this.pxe.getBlockNumber(); - await retryUntil( - async () => { - const status = await this.pxe.getSyncStatus(); - return blockNumber <= status.blocks; - }, - 'pxe synch', - 3600, - 1, - ); return wallet; } else { this.log.info(`Initializing account at ${account.getAddress().toString()}`); diff --git a/yarn-project/bot/src/runner.ts b/yarn-project/bot/src/runner.ts index a15a1ffba85..626f8f6582c 100644 --- a/yarn-project/bot/src/runner.ts +++ b/yarn-project/bot/src/runner.ts @@ -1,11 +1,12 @@ import { type AztecNode, type PXE, createAztecNodeClient, createLogger } from '@aztec/aztec.js'; import { RunningPromise } from '@aztec/foundation/running-promise'; +import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { Bot } from './bot.js'; import { type BotConfig } from './config.js'; import { type BotRunnerApi } from './interface.js'; -export class BotRunner implements BotRunnerApi { +export class BotRunner implements BotRunnerApi, Traceable { private log = createLogger('bot'); private bot?: Promise; private pxe?: PXE; @@ -14,13 +15,19 @@ export class BotRunner implements BotRunnerApi { private consecutiveErrors = 0; private healthy = true; - public constructor(private config: BotConfig, dependencies: { pxe?: PXE; node?: AztecNode }) { + public readonly tracer: Tracer; + + public constructor( + private config: BotConfig, + dependencies: { pxe?: PXE; node?: AztecNode; telemetry: TelemetryClient }, + ) { + this.tracer = dependencies.telemetry.getTracer('Bot'); this.pxe = dependencies.pxe; if (!dependencies.node && !config.nodeUrl) { throw new Error(`Missing node URL in config or dependencies`); } this.node = dependencies.node ?? createAztecNodeClient(config.nodeUrl!); - this.runningPromise = new RunningPromise(() => this.#work(), config.txIntervalSeconds * 1000); + this.runningPromise = new RunningPromise(() => this.#work(), this.log, config.txIntervalSeconds * 1000); } /** Initializes the bot if needed. Blocks until the bot setup is finished. */ @@ -126,6 +133,7 @@ export class BotRunner implements BotRunnerApi { } } + @trackSpan('Bot.work') async #work() { if (this.config.maxPendingTxs > 0) { const pendingTxs = await this.node.getPendingTxs(); @@ -146,7 +154,7 @@ export class BotRunner implements BotRunnerApi { } if (!this.healthy && this.config.stopWhenUnhealthy) { - this.log.error(`Stopping bot due to errors`); + this.log.fatal(`Stopping bot due to errors`); process.exit(1); // workaround docker not restarting the container if its unhealthy. We have to exit instead } } diff --git a/yarn-project/bot/src/utils.ts b/yarn-project/bot/src/utils.ts index 0bc402c6a34..9a463598263 100644 --- a/yarn-project/bot/src/utils.ts +++ b/yarn-project/bot/src/utils.ts @@ -1,5 +1,5 @@ import { type AztecAddress } from '@aztec/circuits.js'; -import { type EasyPrivateTokenContract } from '@aztec/noir-contracts.js'; +import { type EasyPrivateTokenContract } from '@aztec/noir-contracts.js/EasyPrivateToken'; import { type TokenContract } from '@aztec/noir-contracts.js/Token'; /** diff --git a/yarn-project/bot/tsconfig.json b/yarn-project/bot/tsconfig.json index eb2c5396d8a..fadf21845ae 100644 --- a/yarn-project/bot/tsconfig.json +++ b/yarn-project/bot/tsconfig.json @@ -30,6 +30,9 @@ { "path": "../protocol-contracts" }, + { + "path": "../telemetry-client" + }, { "path": "../types" } diff --git a/yarn-project/circuit-types/package.json b/yarn-project/circuit-types/package.json index e8c4974633e..ea574a81948 100644 --- a/yarn-project/circuit-types/package.json +++ b/yarn-project/circuit-types/package.json @@ -9,7 +9,8 @@ "./interfaces": "./dest/interfaces/index.js", "./log_id": "./dest/logs/log_id.js", "./test": "./dest/test/index.js", - "./tx_hash": "./dest/tx/tx_hash.js" + "./tx_hash": "./dest/tx/tx_hash.js", + "./config": "./dest/config.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/circuit-types/src/body.test.ts b/yarn-project/circuit-types/src/body.test.ts new file mode 100644 index 00000000000..e5b3eb52698 --- /dev/null +++ b/yarn-project/circuit-types/src/body.test.ts @@ -0,0 +1,32 @@ +import { Fr } from '@aztec/circuits.js'; + +import { Body } from './body.js'; + +describe('Body', () => { + it('converts to and from buffer', () => { + const body = Body.random(); + const buf = body.toBuffer(); + expect(Body.fromBuffer(buf)).toEqual(body); + }); + + it('converts to and from fields', () => { + const body = Body.random(); + const fields = body.toBlobFields(); + // TODO(#8954): When logs are refactored into fields, we won't need to inject them here + expect(Body.fromBlobFields(fields, body.unencryptedLogs, body.contractClassLogs)).toEqual(body); + }); + + it('converts empty to and from fields', () => { + const body = Body.empty(); + const fields = body.toBlobFields(); + expect(Body.fromBlobFields(fields)).toEqual(body); + }); + + it('fails with invalid fields', () => { + const body = Body.random(); + const fields = body.toBlobFields(); + // Replace the initial field with an invalid encoding + fields[0] = new Fr(12); + expect(() => Body.fromBlobFields(fields)).toThrow('Invalid fields'); + }); +}); diff --git a/yarn-project/circuit-types/src/body.ts b/yarn-project/circuit-types/src/body.ts index d11e7e6dedc..a3967a6f738 100644 --- a/yarn-project/circuit-types/src/body.ts +++ b/yarn-project/circuit-types/src/body.ts @@ -1,6 +1,6 @@ +import { type Fr } from '@aztec/circuits.js'; import { type ZodFor } from '@aztec/foundation/schemas'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import { computeUnbalancedMerkleRoot } from '@aztec/foundation/trees'; import { inspect } from 'util'; import { z } from 'zod'; @@ -43,26 +43,50 @@ export class Body { return new this(reader.readVector(TxEffect)); } + /** + * Returns a flat packed array of fields of all tx effects - used for blobs. + */ + toBlobFields() { + let flattened: Fr[] = []; + this.txEffects.forEach((effect: TxEffect) => { + flattened = flattened.concat(effect.toBlobFields()); + }); + return flattened; + } + + /** + * Decodes a block from blob fields. + * TODO(#8954): When logs are refactored into fields, we won't need to inject them here, instead just reading from fields in TxEffect.fromBlobFields. + * Logs are best input by gathering from the getters below, as they don't remove empty log arrays. + */ + static fromBlobFields( + fields: Fr[], + unencryptedLogs?: UnencryptedL2BlockL2Logs, + contractClassLogs?: ContractClass2BlockL2Logs, + ) { + const txEffectsFields: Fr[][] = []; + let checkedFields = 0; + while (checkedFields !== fields.length) { + if (!TxEffect.isFirstField(fields[checkedFields])) { + throw new Error('Invalid fields given to Body.fromBlobFields(): First field invalid.'); + } + const len = TxEffect.decodeFirstField(fields[checkedFields]).length; + txEffectsFields.push(fields.slice(checkedFields, checkedFields + len)); + checkedFields += len; + } + const txEffects = txEffectsFields + .filter(effect => effect.length) + .map((effect, i) => TxEffect.fromBlobFields(effect, unencryptedLogs?.txLogs[i], contractClassLogs?.txLogs[i])); + return new this(txEffects); + } + [inspect.custom]() { return `Body { txEffects: ${inspect(this.txEffects)}, emptyTxEffectsCount: ${this.numberOfTxsIncludingPadded}, - emptyTxEffectHash: ${TxEffect.empty().hash().toString('hex')}, - txsEffectsHash: ${this.getTxsEffectsHash().toString('hex')}, }`; } - /** - * Computes the transactions effects hash for the L2 block - * This hash is also computed in the `TxDecoder`. - * @returns The txs effects hash. - */ - getTxsEffectsHash() { - const emptyTxEffectHash = TxEffect.empty().hash(); - const leaves: Buffer[] = this.txEffects.map(txEffect => txEffect.hash()); - return computeUnbalancedMerkleRoot(leaves, emptyTxEffectHash); - } - get unencryptedLogs(): UnencryptedL2BlockL2Logs { const logs = this.txEffects.map(txEffect => txEffect.unencryptedLogs); @@ -77,7 +101,6 @@ export class Body { /** * Computes the number of transactions in the block including padding transactions. - * @dev Modified code from TxsDecoder.computeNumTxEffectsToPad */ get numberOfTxsIncludingPadded() { const numTxEffects = this.txEffects.length; diff --git a/yarn-project/circuit-types/src/config.ts b/yarn-project/circuit-types/src/config.ts new file mode 100644 index 00000000000..73878d18416 --- /dev/null +++ b/yarn-project/circuit-types/src/config.ts @@ -0,0 +1,3 @@ +export { ProverAgentConfig, proverAgentConfigMappings } from './interfaces/prover-agent.js'; +export { ProverBrokerConfig, proverBrokerConfigMappings } from './interfaces/prover-broker.js'; +export { SequencerConfig, AllowedElement, SequencerConfigSchema } from './interfaces/configs.js'; diff --git a/yarn-project/circuit-types/src/interfaces/archiver.test.ts b/yarn-project/circuit-types/src/interfaces/archiver.test.ts index 04aa0e0341d..4824b95365a 100644 --- a/yarn-project/circuit-types/src/interfaces/archiver.test.ts +++ b/yarn-project/circuit-types/src/interfaces/archiver.test.ts @@ -17,7 +17,6 @@ import { type JsonRpcTestContext, createJsonRpcTestSetup } from '@aztec/foundati import { fileURLToPath } from '@aztec/foundation/url'; import { loadContractArtifact } from '@aztec/types/abi'; -import { deepStrictEqual } from 'assert'; import { readFileSync } from 'fs'; import omit from 'lodash.omit'; import { resolve } from 'path'; @@ -223,15 +222,12 @@ describe('ArchiverApiSchema', () => { expect(result).toBe(1n); }); - it('getContractArtifact', async () => { - const result = await context.client.getContractArtifact(AztecAddress.random()); - deepStrictEqual(result, artifact); + it('registerContractFunctionNames', async () => { + await context.client.registerContractFunctionNames(AztecAddress.random(), { + [FunctionSelector.random().toString()]: 'test_fn', + }); }); - it('addContractArtifact', async () => { - await context.client.addContractArtifact(AztecAddress.random(), artifact); - }, 20_000); - it('getContract', async () => { const address = AztecAddress.random(); const result = await context.client.getContract(address); @@ -378,10 +374,9 @@ class MockArchiver implements ArchiverApi { expect(address).toBeInstanceOf(AztecAddress); return Promise.resolve(this.artifact); } - addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise { + registerContractFunctionNames(address: AztecAddress, names: Record): Promise { expect(address).toBeInstanceOf(AztecAddress); - // We use node's native assertion because jest's is too slow - deepStrictEqual(contract, this.artifact); + expect(names).toEqual(expect.any(Object)); return Promise.resolve(); } getL1ToL2Messages(blockNumber: bigint): Promise { diff --git a/yarn-project/circuit-types/src/interfaces/archiver.ts b/yarn-project/circuit-types/src/interfaces/archiver.ts index bf8ace98b60..302df9b5732 100644 --- a/yarn-project/circuit-types/src/interfaces/archiver.ts +++ b/yarn-project/circuit-types/src/interfaces/archiver.ts @@ -6,7 +6,6 @@ import { PrivateLog, PublicFunctionSchema, } from '@aztec/circuits.js'; -import { ContractArtifactSchema } from '@aztec/foundation/abi'; import { type ApiSchemaFor, optional, schemas } from '@aztec/foundation/schemas'; import { z } from 'zod'; @@ -69,8 +68,10 @@ export const ArchiverApiSchema: ApiSchemaFor = { getBytecodeCommitment: z.function().args(schemas.Fr).returns(schemas.Fr), getContract: z.function().args(schemas.AztecAddress).returns(ContractInstanceWithAddressSchema.optional()), getContractClassIds: z.function().args().returns(z.array(schemas.Fr)), - getContractArtifact: z.function().args(schemas.AztecAddress).returns(ContractArtifactSchema.optional()), - addContractArtifact: z.function().args(schemas.AztecAddress, ContractArtifactSchema).returns(z.void()), + registerContractFunctionNames: z + .function() + .args(schemas.AztecAddress, z.record(z.string(), z.string())) + .returns(z.void()), getL1ToL2Messages: z.function().args(schemas.BigInt).returns(z.array(schemas.Fr)), getL1ToL2MessageIndex: z.function().args(schemas.Fr).returns(schemas.BigInt.optional()), // TODO(#10007): Remove this method diff --git a/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts b/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts index 3bb4ee18185..53fee1105c6 100644 --- a/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts +++ b/yarn-project/circuit-types/src/interfaces/aztec-node.test.ts @@ -19,13 +19,12 @@ import { getContractClassFromArtifact, } from '@aztec/circuits.js'; import { type L1ContractAddresses, L1ContractsNames } from '@aztec/ethereum'; -import { type ContractArtifact } from '@aztec/foundation/abi'; +import { type ContractArtifact, FunctionSelector } from '@aztec/foundation/abi'; import { memoize } from '@aztec/foundation/decorators'; import { type JsonRpcTestContext, createJsonRpcTestSetup } from '@aztec/foundation/json-rpc/test'; import { fileURLToPath } from '@aztec/foundation/url'; import { loadContractArtifact } from '@aztec/types/abi'; -import { deepStrictEqual } from 'assert'; import { readFileSync } from 'fs'; import omit from 'lodash.omit'; import times from 'lodash.times'; @@ -224,9 +223,11 @@ describe('AztecNodeApiSchema', () => { expect(response).toEqual(Object.fromEntries(ProtocolContractsNames.map(name => [name, expect.any(AztecAddress)]))); }); - it('addContractArtifact', async () => { - await context.client.addContractArtifact(AztecAddress.random(), artifact); - }, 20_000); + it('registerContractFunctionNames', async () => { + await context.client.registerContractFunctionNames(AztecAddress.random(), { + [FunctionSelector.random().toString()]: 'test_fn', + }); + }); it('getPrivateLogs', async () => { const response = await context.client.getPrivateLogs(1, 1); @@ -505,9 +506,7 @@ class MockAztecNode implements AztecNode { ) as ProtocolContractAddresses, ); } - addContractArtifact(address: AztecAddress, artifact: ContractArtifact): Promise { - expect(address).toBeInstanceOf(AztecAddress); - deepStrictEqual(artifact, this.artifact); + registerContractFunctionNames(_address: AztecAddress, _names: Record): Promise { return Promise.resolve(); } getPrivateLogs(_from: number, _limit: number): Promise { diff --git a/yarn-project/circuit-types/src/interfaces/aztec-node.ts b/yarn-project/circuit-types/src/interfaces/aztec-node.ts index 427ff8d88ac..f4b052b87fd 100644 --- a/yarn-project/circuit-types/src/interfaces/aztec-node.ts +++ b/yarn-project/circuit-types/src/interfaces/aztec-node.ts @@ -17,7 +17,6 @@ import { ProtocolContractAddressesSchema, } from '@aztec/circuits.js'; import { type L1ContractAddresses, L1ContractAddressesSchema } from '@aztec/ethereum'; -import { type ContractArtifact, ContractArtifactSchema } from '@aztec/foundation/abi'; import type { AztecAddress } from '@aztec/foundation/aztec-address'; import type { Fr } from '@aztec/foundation/fields'; import { createSafeJsonRpcClient, defaultFetch } from '@aztec/foundation/json-rpc/client'; @@ -287,7 +286,7 @@ export interface AztecNode * @param aztecAddress * @param artifact */ - addContractArtifact(address: AztecAddress, artifact: ContractArtifact): Promise; + registerContractFunctionNames(address: AztecAddress, names: Record): Promise; /** * Retrieves all private logs from up to `limit` blocks, starting from the block number `from`. @@ -315,7 +314,8 @@ export interface AztecNode * Gets all logs that match any of the received tags (i.e. logs with their first field equal to a tag). * @param tags - The tags to filter the logs by. * @returns For each received tag, an array of matching logs and metadata (e.g. tx hash) is returned. An empty - array implies no logs match that tag. + * array implies no logs match that tag. There can be multiple logs for 1 tag because tag reuse can happen + * --> e.g. when sending a note from multiple unsynched devices. */ getLogsByTags(tags: Fr[]): Promise; @@ -533,7 +533,10 @@ export const AztecNodeApiSchema: ApiSchemaFor = { getProtocolContractAddresses: z.function().returns(ProtocolContractAddressesSchema), - addContractArtifact: z.function().args(schemas.AztecAddress, ContractArtifactSchema).returns(z.void()), + registerContractFunctionNames: z + .function() + .args(schemas.AztecAddress, z.record(z.string(), z.string())) + .returns(z.void()), getPrivateLogs: z.function().args(z.number(), z.number()).returns(z.array(PrivateLog.schema)), diff --git a/yarn-project/circuit-types/src/interfaces/block-builder.ts b/yarn-project/circuit-types/src/interfaces/block-builder.ts index ecb0103ff1f..5b73b7d242c 100644 --- a/yarn-project/circuit-types/src/interfaces/block-builder.ts +++ b/yarn-project/circuit-types/src/interfaces/block-builder.ts @@ -8,17 +8,16 @@ import { type ProcessedTxHandler } from './processed-tx-handler.js'; export interface BlockBuilder extends ProcessedTxHandler { /** * Prepares to build a new block. Updates the L1 to L2 message tree. - * @param numTxs - The complete size of the block. * @param globalVariables - The global variables for this block. * @param l1ToL2Messages - The set of L1 to L2 messages to be included in this block. */ - startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise; + startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise; /** - * Adds a processed tx to the block. Updates world state with the effects from this tx. - * @param tx - The transaction to be added. + * Adds all processed txs to the block. Updates world state with the effects from this tx. + * @param txs - The transactions to be added. */ - addNewTx(tx: ProcessedTx): Promise; + addTxs(txs: ProcessedTx[]): Promise; /** * Pads the block with empty txs if it hasn't reached the declared number of txs. diff --git a/yarn-project/circuit-types/src/interfaces/configs.ts b/yarn-project/circuit-types/src/interfaces/configs.ts index 1c8398033f6..661e893a450 100644 --- a/yarn-project/circuit-types/src/interfaces/configs.ts +++ b/yarn-project/circuit-types/src/interfaces/configs.ts @@ -20,10 +20,6 @@ export interface SequencerConfig { maxTxsPerBlock?: number; /** The minimum number of txs to include in a block. */ minTxsPerBlock?: number; - /** The minimum number of seconds in-between consecutive blocks. */ - minSecondsBetweenBlocks?: number; - /** The maximum number of seconds in-between consecutive blocks. Sequencer will produce a block with less than minTxsPerBlock once this threshold is reached. */ - maxSecondsBetweenBlocks?: number; /** Recipient of block reward. */ coinbase?: EthAddress; /** Address to receive fees. */ @@ -34,8 +30,6 @@ export interface SequencerConfig { acvmBinaryPath?: string; /** The list of functions calls allowed to run in setup */ allowedInSetup?: AllowedElement[]; - /** The list of functions calls allowed to run teardown */ - allowedInTeardown?: AllowedElement[]; /** Max block size */ maxBlockSizeInBytes?: number; /** Whether to require every tx to have a fee payer */ @@ -57,14 +51,11 @@ export const SequencerConfigSchema = z.object({ transactionPollingIntervalMS: z.number().optional(), maxTxsPerBlock: z.number().optional(), minTxsPerBlock: z.number().optional(), - minSecondsBetweenBlocks: z.number().optional(), - maxSecondsBetweenBlocks: z.number().optional(), coinbase: schemas.EthAddress.optional(), feeRecipient: schemas.AztecAddress.optional(), acvmWorkingDirectory: z.string().optional(), acvmBinaryPath: z.string().optional(), - allowedInSetup: z.array(AllowedElementSchema), - allowedInTeardown: z.array(AllowedElementSchema), + allowedInSetup: z.array(AllowedElementSchema).optional(), maxBlockSizeInBytes: z.number().optional(), enforceFees: z.boolean().optional(), gerousiaPayload: schemas.EthAddress.optional(), diff --git a/yarn-project/circuit-types/src/interfaces/index.ts b/yarn-project/circuit-types/src/interfaces/index.ts index 3f05c960e1b..2b880ad7550 100644 --- a/yarn-project/circuit-types/src/interfaces/index.ts +++ b/yarn-project/circuit-types/src/interfaces/index.ts @@ -18,7 +18,6 @@ export * from './proving-job.js'; export * from './pxe.js'; export * from './server_circuit_prover.js'; export * from './service.js'; -export * from './sync-status.js'; export * from './world_state.js'; export * from './prover-broker.js'; export * from './p2p.js'; diff --git a/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts b/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts index db5728ac211..288c16ff3ae 100644 --- a/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts +++ b/yarn-project/circuit-types/src/interfaces/merkle_tree_operations.ts @@ -176,7 +176,10 @@ export interface MerkleTreeReadOperations { * @param treeId - The tree for which the index should be returned. * @param value - The value to search for in the tree. */ - findLeafIndex(treeId: ID, value: MerkleTreeLeafType): Promise; + findLeafIndices( + treeId: ID, + values: MerkleTreeLeafType[], + ): Promise<(bigint | undefined)[]>; /** * Returns the first index containing a leaf value after `startIndex`. @@ -184,11 +187,11 @@ export interface MerkleTreeReadOperations { * @param value - The value to search for in the tree. * @param startIndex - The index to start searching from (used when skipping nullified messages) */ - findLeafIndexAfter( + findLeafIndicesAfter( treeId: ID, - value: MerkleTreeLeafType, + values: MerkleTreeLeafType[], startIndex: bigint, - ): Promise; + ): Promise<(bigint | undefined)[]>; /** * Gets the value for a leaf in the tree. diff --git a/yarn-project/circuit-types/src/interfaces/p2p.ts b/yarn-project/circuit-types/src/interfaces/p2p.ts index 00fa526899d..d2032f9d129 100644 --- a/yarn-project/circuit-types/src/interfaces/p2p.ts +++ b/yarn-project/circuit-types/src/interfaces/p2p.ts @@ -3,6 +3,7 @@ import { type ApiSchemaFor, optional, schemas } from '@aztec/foundation/schemas' import { z } from 'zod'; import { BlockAttestation } from '../p2p/block_attestation.js'; +import { type P2PClientType } from '../p2p/client_type.js'; import { EpochProofQuote } from '../prover_coordination/epoch_proof_quote.js'; import { Tx } from '../tx/tx.js'; @@ -24,16 +25,7 @@ const PeerInfoSchema = z.discriminatedUnion('status', [ ]); /** Exposed API to the P2P module. */ -export interface P2PApi { - /** - * Queries the Attestation pool for attestations for the given slot - * - * @param slot - the slot to query - * @param proposalId - the proposal id to query, or undefined to query all proposals for the slot - * @returns BlockAttestations - */ - getAttestationsForSlot(slot: bigint, proposalId?: string): Promise; - +export interface P2PApiWithoutAttestations { /** * Queries the EpochProofQuote pool for quotes for the given epoch * @@ -59,6 +51,21 @@ export interface P2PApi { getPeers(includePending?: boolean): Promise; } +export interface P2PClient extends P2PApiWithoutAttestations { + /** + * Queries the Attestation pool for attestations for the given slot + * + * @param slot - the slot to query + * @param proposalId - the proposal id to query, or undefined to query all proposals for the slot + * @returns BlockAttestations + */ + getAttestationsForSlot(slot: bigint, proposalId?: string): Promise; +} + +export type P2PApi = T extends P2PClientType.Full + ? P2PClient & P2PApiWithoutAttestations + : P2PApiWithoutAttestations; + export const P2PApiSchema: ApiSchemaFor = { getAttestationsForSlot: z .function() diff --git a/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts b/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts index 9dd399919ce..f1ca3b8c0c6 100644 --- a/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts +++ b/yarn-project/circuit-types/src/interfaces/private_kernel_prover.ts @@ -98,15 +98,6 @@ export interface PrivateKernelProver { */ createClientIvcProof(acirs: Buffer[], witnessStack: WitnessMap[]): Promise; - /** - * Creates a proof for an app circuit. - * - * @param bytecode - The circuit bytecode in gzipped bincode format - * @param appCircuitName - Optionally specify the name of the app circuit - * @returns A Promise resolving to a Proof object - */ - computeAppCircuitVerificationKey(bytecode: Buffer, appCircuitName?: string): Promise; - /** * Compute the gate count for a given circuit. * @param bytecode - The circuit bytecode in gzipped bincode format diff --git a/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts b/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts index 2793b35bbef..6b215bc294b 100644 --- a/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts +++ b/yarn-project/circuit-types/src/interfaces/processed-tx-handler.ts @@ -3,8 +3,8 @@ import { type ProcessedTx } from '../tx/processed_tx.js'; /** Receives processed txs as part of block simulation or proving. */ export interface ProcessedTxHandler { /** - * Handles a processed txs. - * @param tx - The transaction to be handled. + * Handles processed txs. + * @param txs - The transactions to be handled. */ - addNewTx(tx: ProcessedTx): Promise; + addTxs(txs: ProcessedTx[]): Promise; } diff --git a/yarn-project/circuit-types/src/interfaces/prover-broker.ts b/yarn-project/circuit-types/src/interfaces/prover-broker.ts index fb2fdadef67..546b26aa672 100644 --- a/yarn-project/circuit-types/src/interfaces/prover-broker.ts +++ b/yarn-project/circuit-types/src/interfaces/prover-broker.ts @@ -61,12 +61,6 @@ export interface ProvingJobProducer { */ cancelProvingJob(id: ProvingJobId): Promise; - /** - * Cleans up after a job has completed. Throws if the job is in-progress - * @param id - The ID of the job to cancel - */ - cleanUpProvingJobState(id: ProvingJobId): Promise; - /** * Returns the current status fof the proving job * @param id - The ID of the job to get the status of diff --git a/yarn-project/circuit-types/src/interfaces/prover-client.ts b/yarn-project/circuit-types/src/interfaces/prover-client.ts index 29f8cc4fb53..384bf8331ec 100644 --- a/yarn-project/circuit-types/src/interfaces/prover-client.ts +++ b/yarn-project/circuit-types/src/interfaces/prover-client.ts @@ -7,7 +7,6 @@ import { z } from 'zod'; import { type TxHash } from '../tx/tx_hash.js'; import { type EpochProver } from './epoch-prover.js'; import { type ProvingJobConsumer } from './prover-broker.js'; -import { type ProvingJobStatus } from './proving-job.js'; export type ActualProverConfig = { /** Whether to construct real proofs */ @@ -24,9 +23,6 @@ export type ProverConfig = ActualProverConfig & { nodeUrl?: string; /** Identifier of the prover */ proverId: Fr; - /** Where to store temporary data */ - cacheDir?: string; - proverAgentCount: number; }; @@ -35,7 +31,6 @@ export const ProverConfigSchema = z.object({ realProofs: z.boolean(), proverId: schemas.Fr, proverTestDelayMs: z.number(), - cacheDir: z.string().optional(), proverAgentCount: z.number(), }) satisfies ZodFor; @@ -60,11 +55,6 @@ export const proverConfigMappings: ConfigMappingsType = { description: 'Artificial delay to introduce to all operations to the test prover.', ...numberConfigHelper(0), }, - cacheDir: { - env: 'PROVER_CACHE_DIR', - description: 'Where to store cache data generated while proving', - defaultValue: '/tmp/aztec-prover', - }, proverAgentCount: { env: 'PROVER_AGENT_COUNT', description: 'The number of prover agents to start', @@ -73,30 +63,7 @@ export const proverConfigMappings: ConfigMappingsType = { }; function parseProverId(str: string) { - return Fr.fromString(str.startsWith('0x') ? str : Buffer.from(str, 'utf8').toString('hex')); -} - -/** - * A database where the proving orchestrator can store intermediate results - */ -export interface ProverCache { - /** - * Saves the status of a proving job - * @param jobId - The job ID - * @param status - The status of the proof - */ - setProvingJobStatus(jobId: string, status: ProvingJobStatus): Promise; - - /** - * Retrieves the status of a proving job (if known) - * @param jobId - The job ID - */ - getProvingJobStatus(jobId: string): Promise; - - /** - * Closes the cache - */ - close(): Promise; + return Fr.fromHexString(str.startsWith('0x') ? str : Buffer.from(str, 'utf8').toString('hex')); } /** @@ -104,7 +71,7 @@ export interface ProverCache { * Provides the ability to generate proofs and build rollups. */ export interface EpochProverManager { - createEpochProver(cache?: ProverCache): EpochProver; + createEpochProver(): EpochProver; start(): Promise; diff --git a/yarn-project/circuit-types/src/interfaces/pxe.test.ts b/yarn-project/circuit-types/src/interfaces/pxe.test.ts index 8530f731bd1..9bf3ca99f59 100644 --- a/yarn-project/circuit-types/src/interfaces/pxe.test.ts +++ b/yarn-project/circuit-types/src/interfaces/pxe.test.ts @@ -43,7 +43,6 @@ import { Tx, TxHash, TxProvingResult, TxReceipt, TxSimulationResult } from '../t import { TxEffect } from '../tx_effect.js'; import { TxExecutionRequest } from '../tx_execution_request.js'; import { type EventMetadataDefinition, type PXE, type PXEInfo, PXESchema } from './pxe.js'; -import { type SyncStatus } from './sync-status.js'; jest.setTimeout(12_000); @@ -258,16 +257,6 @@ describe('PXESchema', () => { expect(result).toEqual(await handler.getPXEInfo()); }); - it('isGlobalStateSynchronized', async () => { - const result = await context.client.isGlobalStateSynchronized(); - expect(result).toBe(true); - }); - - it('getSyncStatus', async () => { - const result = await context.client.getSyncStatus(); - expect(result).toEqual(await handler.getSyncStatus()); - }); - it('getContractInstance', async () => { const result = await context.client.getContractInstance(address); expect(result).toEqual(instance); @@ -502,14 +491,6 @@ class MockPXE implements PXE { pxeVersion: '1.0', }); } - isGlobalStateSynchronized(): Promise { - return Promise.resolve(true); - } - getSyncStatus(): Promise { - return Promise.resolve({ - blocks: 1, - }); - } getContractInstance(address: AztecAddress): Promise { expect(address).toEqual(this.address); return Promise.resolve(this.instance); diff --git a/yarn-project/circuit-types/src/interfaces/pxe.ts b/yarn-project/circuit-types/src/interfaces/pxe.ts index 363511bad80..62c99eb84ba 100644 --- a/yarn-project/circuit-types/src/interfaces/pxe.ts +++ b/yarn-project/circuit-types/src/interfaces/pxe.ts @@ -43,7 +43,6 @@ import { SiblingPath } from '../sibling_path/sibling_path.js'; import { Tx, TxHash, TxProvingResult, TxReceipt, TxSimulationResult } from '../tx/index.js'; import { TxEffect } from '../tx_effect.js'; import { TxExecutionRequest } from '../tx_execution_request.js'; -import { type SyncStatus, SyncStatusSchema } from './sync-status.js'; // docs:start:pxe-interface /** @@ -351,22 +350,6 @@ export interface PXE { */ getPXEInfo(): Promise; - /** - * Checks whether all the blocks were processed (tree roots updated, txs updated with block info, etc.). - * @returns True if there are no outstanding blocks to be synched. - * @remarks This indicates that blocks and transactions are synched even if notes are not. Compares local block number with the block number from aztec node. - * @deprecated Use `getSyncStatus` instead. - */ - isGlobalStateSynchronized(): Promise; - - /** - * Returns the latest block that has been synchronized globally and for each account. The global block number - * indicates whether global state has been updated up to that block, whereas each address indicates up to which - * block the private state has been synced for that account. - * @returns The latest block synchronized for blocks, and the latest block synched for notes for each public key being tracked. - */ - getSyncStatus(): Promise; - /** * Returns a Contract Instance given its address, which includes the contract class identifier, * initialization hash, deployment salt, and public keys hash. @@ -540,8 +523,6 @@ export const PXESchema: ApiSchemaFor = { getProvenBlockNumber: z.function().returns(z.number()), getNodeInfo: z.function().returns(NodeInfoSchema), getPXEInfo: z.function().returns(PXEInfoSchema), - isGlobalStateSynchronized: z.function().returns(z.boolean()), - getSyncStatus: z.function().returns(SyncStatusSchema), getContractInstance: z .function() .args(schemas.AztecAddress) diff --git a/yarn-project/circuit-types/src/interfaces/sync-status.ts b/yarn-project/circuit-types/src/interfaces/sync-status.ts deleted file mode 100644 index b85a13620d6..00000000000 --- a/yarn-project/circuit-types/src/interfaces/sync-status.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { type ZodFor } from '@aztec/foundation/schemas'; - -import { z } from 'zod'; - -/** Provides up to which block has been synced by different components. */ -export type SyncStatus = { - /** Up to which block has been synched for blocks and txs. */ - blocks: number; -}; - -export const SyncStatusSchema = z.object({ - blocks: z.number(), -}) satisfies ZodFor; diff --git a/yarn-project/circuit-types/src/l2_block.ts b/yarn-project/circuit-types/src/l2_block.ts index c6d4f570595..3f60c192461 100644 --- a/yarn-project/circuit-types/src/l2_block.ts +++ b/yarn-project/circuit-types/src/l2_block.ts @@ -89,11 +89,9 @@ export class L2Block { ): L2Block { const body = Body.random(txsPerBlock, numPublicCallsPerTx, numUnencryptedLogsPerCall); - const txsEffectsHash = body.getTxsEffectsHash(); - return new L2Block( makeAppendOnlyTreeSnapshot(l2BlockNum + 1), - makeHeader(0, l2BlockNum, slotNumber ?? l2BlockNum, txsEffectsHash, inHash), + makeHeader(0, txsPerBlock, l2BlockNum, slotNumber ?? l2BlockNum, inHash), body, ); } @@ -121,6 +119,7 @@ export class L2Block { /** * Computes the public inputs hash for the L2 block. * The same output as the hash of RootRollupPublicInputs. + * TODO(Miranda): Check where/if this is used (v diff now with epochs and blobs) * @returns The public input hash for the L2 block as a field element. */ // TODO(#4844) @@ -137,7 +136,6 @@ export class L2Block { this.header.state.partial.publicDataTree, this.header.state.l1ToL2MessageTree, this.archive, - this.body.getTxsEffectsHash(), ]; return sha256ToField(preimage); diff --git a/yarn-project/circuit-types/src/l2_block_code_to_purge.ts b/yarn-project/circuit-types/src/l2_block_code_to_purge.ts index 70d2b3e8306..e30722d45cd 100644 --- a/yarn-project/circuit-types/src/l2_block_code_to_purge.ts +++ b/yarn-project/circuit-types/src/l2_block_code_to_purge.ts @@ -19,14 +19,14 @@ import { toBufferBE } from '@aztec/foundation/bigint-buffer'; */ export function makeHeader( seed = 0, + numTxs: number | undefined = undefined, blockNumber: number | undefined = undefined, slotNumber: number | undefined = undefined, - txsEffectsHash: Buffer | undefined = undefined, inHash: Buffer | undefined = undefined, ): BlockHeader { return new BlockHeader( makeAppendOnlyTreeSnapshot(seed + 0x100), - makeContentCommitment(seed + 0x200, txsEffectsHash, inHash), + makeContentCommitment(seed + 0x200, numTxs, inHash), makeStateReference(seed + 0x600), makeGlobalVariables((seed += 0x700), blockNumber, slotNumber ?? blockNumber), fr(seed + 0x800), @@ -48,12 +48,12 @@ export function makeAppendOnlyTreeSnapshot(seed = 1): AppendOnlyTreeSnapshot { */ function makeContentCommitment( seed = 0, - txsEffectsHash: Buffer | undefined = undefined, + numTxs: number | undefined = undefined, inHash: Buffer | undefined = undefined, ): ContentCommitment { return new ContentCommitment( - new Fr(seed), - txsEffectsHash ?? toBufferBE(BigInt(seed + 0x100), NUM_BYTES_PER_SHA256), + numTxs ? new Fr(numTxs) : new Fr(seed), + toBufferBE(BigInt(seed + 0x100), NUM_BYTES_PER_SHA256), inHash ?? toBufferBE(BigInt(seed + 0x200), NUM_BYTES_PER_SHA256), toBufferBE(BigInt(seed + 0x300), NUM_BYTES_PER_SHA256), ); diff --git a/yarn-project/circuit-types/src/l2_block_downloader/l2_block_stream.ts b/yarn-project/circuit-types/src/l2_block_downloader/l2_block_stream.ts index 00e81a388ff..10724c9b545 100644 --- a/yarn-project/circuit-types/src/l2_block_downloader/l2_block_stream.ts +++ b/yarn-project/circuit-types/src/l2_block_downloader/l2_block_stream.ts @@ -21,7 +21,7 @@ export class L2BlockStream { startingBlock?: number; } = {}, ) { - this.runningPromise = new RunningPromise(() => this.work(), this.opts.pollIntervalMS ?? 1000); + this.runningPromise = new RunningPromise(() => this.work(), log, this.opts.pollIntervalMS ?? 1000); } public start() { diff --git a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts index 93879b71d62..8fa34784694 100644 --- a/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts +++ b/yarn-project/circuit-types/src/logs/l1_payload/encrypted_log_payload.test.ts @@ -8,7 +8,7 @@ import { } from '@aztec/circuits.js'; import { randomBytes } from '@aztec/foundation/crypto'; import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; -import { updateInlineTestData } from '@aztec/foundation/testing'; +import { updateInlineTestData } from '@aztec/foundation/testing/files'; import { EncryptedLogPayload } from './encrypted_log_payload.js'; diff --git a/yarn-project/circuit-types/src/p2p/client_type.ts b/yarn-project/circuit-types/src/p2p/client_type.ts new file mode 100644 index 00000000000..75d1fea547c --- /dev/null +++ b/yarn-project/circuit-types/src/p2p/client_type.ts @@ -0,0 +1,6 @@ +export enum P2PClientType { + // Full p2p clients will subscribe to all gossip topics + Full, + // Prove p2p clients will only subscribe to transaction and proving topics + Prover, +} diff --git a/yarn-project/circuit-types/src/p2p/index.ts b/yarn-project/circuit-types/src/p2p/index.ts index 0974775870a..972988c8b7f 100644 --- a/yarn-project/circuit-types/src/p2p/index.ts +++ b/yarn-project/circuit-types/src/p2p/index.ts @@ -5,3 +5,4 @@ export * from './gossipable.js'; export * from './interface.js'; export * from './signature_utils.js'; export * from './topic_type.js'; +export * from './client_type.js'; diff --git a/yarn-project/circuit-types/src/p2p/topic_type.ts b/yarn-project/circuit-types/src/p2p/topic_type.ts index 8094905276c..db8d215a5ca 100644 --- a/yarn-project/circuit-types/src/p2p/topic_type.ts +++ b/yarn-project/circuit-types/src/p2p/topic_type.ts @@ -1,3 +1,5 @@ +import { P2PClientType } from './client_type.js'; + /** Create Topic String * * The topic channel identifier @@ -18,6 +20,13 @@ export enum TopicType { epoch_proof_quote = 'epoch_proof_quote', } +export function getTopicTypeForClientType(clientType: P2PClientType) { + if (clientType === P2PClientType.Full) { + return Object.values(TopicType); + } + return [TopicType.tx, TopicType.epoch_proof_quote]; +} + /** * Convert the topic string into a set of labels * diff --git a/yarn-project/circuit-types/src/tx/processed_tx.ts b/yarn-project/circuit-types/src/tx/processed_tx.ts index 15dc5e802ec..7006ee42e16 100644 --- a/yarn-project/circuit-types/src/tx/processed_tx.ts +++ b/yarn-project/circuit-types/src/tx/processed_tx.ts @@ -163,6 +163,12 @@ export function makeProcessedTxFromPrivateOnlyTx( }; } +export function toNumBlobFields(txs: ProcessedTx[]): number { + return txs.reduce((acc, tx) => { + return acc + tx.txEffect.toBlobFields().length; + }, 0); +} + export function makeProcessedTxFromTxWithPublicCalls( tx: Tx, avmProvingRequest: AvmProvingRequest, diff --git a/yarn-project/circuit-types/src/tx/validator/empty_validator.ts b/yarn-project/circuit-types/src/tx/validator/empty_validator.ts index 7ad6f80dcf1..2ea10e7a55a 100644 --- a/yarn-project/circuit-types/src/tx/validator/empty_validator.ts +++ b/yarn-project/circuit-types/src/tx/validator/empty_validator.ts @@ -1,8 +1,8 @@ import { type AnyTx, type TxValidator } from './tx_validator.js'; export class EmptyTxValidator implements TxValidator { - public validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> { - return Promise.resolve([txs, []]); + public validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[], skippedTxs: T[]]> { + return Promise.resolve([txs, [], []]); } public validateTx(_tx: T): Promise { diff --git a/yarn-project/circuit-types/src/tx/validator/tx_validator.ts b/yarn-project/circuit-types/src/tx/validator/tx_validator.ts index 6669b56055a..040d764cf3d 100644 --- a/yarn-project/circuit-types/src/tx/validator/tx_validator.ts +++ b/yarn-project/circuit-types/src/tx/validator/tx_validator.ts @@ -5,5 +5,5 @@ export type AnyTx = Tx | ProcessedTx; export interface TxValidator { validateTx(tx: T): Promise; - validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]>; + validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[], skippedTxs?: T[]]>; } diff --git a/yarn-project/circuit-types/src/tx_effect.test.ts b/yarn-project/circuit-types/src/tx_effect.test.ts index c3a06435402..41c9502b0d2 100644 --- a/yarn-project/circuit-types/src/tx_effect.test.ts +++ b/yarn-project/circuit-types/src/tx_effect.test.ts @@ -1,15 +1,54 @@ +import { Fr } from '@aztec/circuits.js'; + import { TxEffect } from './tx_effect.js'; describe('TxEffect', () => { - it('convert to and from buffer', () => { + it('converts to and from buffer', () => { const txEffect = TxEffect.random(); const buf = txEffect.toBuffer(); expect(TxEffect.fromBuffer(buf)).toEqual(txEffect); }); - it('hash of empty tx effect matches snapshot', () => { - const txEffectHash = TxEffect.empty().hash().toString('hex'); - // If you change this you have to change the hardcoded value in TxsDecoder.sol! - expect(txEffectHash).toMatchInlineSnapshot(`"0038249b91f300ff56f2a8135be3bdb4fc493df5771061b67f2ab01b620b22b7"`); + it('converts to and from fields', () => { + const txEffect = TxEffect.random(); + const fields = txEffect.toBlobFields(); + // TODO(#8954): When logs are refactored into fields, we won't need to inject them here + expect(TxEffect.fromBlobFields(fields, txEffect.unencryptedLogs, txEffect.contractClassLogs)).toEqual(txEffect); + }); + + it('converts empty to and from fields', () => { + const txEffect = TxEffect.empty(); + const fields = txEffect.toBlobFields(); + expect(TxEffect.fromBlobFields(fields)).toEqual(txEffect); + }); + + it('fails with invalid fields', () => { + let txEffect = TxEffect.random(); + let fields = txEffect.toBlobFields(); + // Replace the initial field with an invalid encoding + fields[0] = new Fr(12); + expect(() => TxEffect.fromBlobFields(fields)).toThrow('Invalid fields'); + + txEffect = TxEffect.random(); + fields = txEffect.toBlobFields(); + // Add an extra field + fields.push(new Fr(7)); + // TODO(#8954): When logs are refactored into fields, we won't need to inject them here + expect(() => TxEffect.fromBlobFields(fields, txEffect.unencryptedLogs, txEffect.contractClassLogs)).toThrow( + 'Too many fields', + ); + + txEffect = TxEffect.random(); + fields = txEffect.toBlobFields(); + const buf = Buffer.alloc(4); + buf.writeUint8(6); + buf.writeUint16BE(0, 2); + // Add an extra field which looks like a valid prefix + const fakePrefix = new Fr(buf); + fields.push(fakePrefix); + // TODO(#8954): When logs are refactored into fields, we won't need to inject them here + expect(() => TxEffect.fromBlobFields(fields, txEffect.unencryptedLogs, txEffect.contractClassLogs)).toThrow( + 'Invalid fields', + ); }); }); diff --git a/yarn-project/circuit-types/src/tx_effect.ts b/yarn-project/circuit-types/src/tx_effect.ts index 8a547c0988b..924f2e5bc95 100644 --- a/yarn-project/circuit-types/src/tx_effect.ts +++ b/yarn-project/circuit-types/src/tx_effect.ts @@ -1,31 +1,52 @@ import { + CONTRACT_CLASS_LOGS_PREFIX, Fr, + L2_L1_MSGS_PREFIX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, + NOTES_PREFIX, + NULLIFIERS_PREFIX, + PRIVATE_LOGS_PREFIX, PRIVATE_LOG_SIZE_IN_FIELDS, + PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, PrivateLog, PublicDataWrite, + REVERT_CODE_PREFIX, RevertCode, + TX_FEE_PREFIX, + TX_START_PREFIX, + UNENCRYPTED_LOGS_PREFIX, } from '@aztec/circuits.js'; import { type FieldsOf, makeTuple } from '@aztec/foundation/array'; +import { toBufferBE } from '@aztec/foundation/bigint-buffer'; import { padArrayEnd } from '@aztec/foundation/collection'; import { sha256Trunc } from '@aztec/foundation/crypto'; import { jsonStringify } from '@aztec/foundation/json-rpc'; import { schemas } from '@aztec/foundation/schemas'; -import { BufferReader, serializeArrayOfBufferableToVector, serializeToBuffer } from '@aztec/foundation/serialize'; +import { + BufferReader, + FieldReader, + serializeArrayOfBufferableToVector, + serializeToBuffer, +} from '@aztec/foundation/serialize'; import { bufferToHex, hexToBuffer } from '@aztec/foundation/string'; import { inspect } from 'util'; import { z } from 'zod'; -import { ContractClassTxL2Logs, UnencryptedTxL2Logs } from './logs/index.js'; +import { ContractClassTxL2Logs, type TxL2Logs, UnencryptedTxL2Logs } from './logs/index.js'; import { TxHash } from './tx/tx_hash.js'; export { RevertCodeEnum } from '@aztec/circuits.js'; +// These are helper constants to decode tx effects from blob encoded fields +const TX_START_PREFIX_BYTES_LENGTH = TX_START_PREFIX.toString(16).length / 2; +// 7 bytes for: | 0 | txlen[0] | txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revertCode | +const TX_EFFECT_PREFIX_BYTE_LENGTH = TX_START_PREFIX_BYTES_LENGTH + 7; + export class TxEffect { constructor( /** @@ -154,50 +175,10 @@ export class TxEffect { ); } - /** - * Computes the hash of the TxEffect object. - * @returns The hash of the TxEffect object. - * @dev This function must correspond with compute_tx_effects_hash() in Noir and TxsDecoder.sol decode(). - */ - hash() { - const padBuffer = (buf: Buffer, length: number) => Buffer.concat([buf, Buffer.alloc(length - buf.length)]); - - const noteHashesBuffer = padBuffer(serializeToBuffer(this.noteHashes), Fr.SIZE_IN_BYTES * MAX_NOTE_HASHES_PER_TX); - const nullifiersBuffer = padBuffer(serializeToBuffer(this.nullifiers), Fr.SIZE_IN_BYTES * MAX_NULLIFIERS_PER_TX); - const outHashBuffer = this.txOutHash(); - const publicDataWritesBuffer = padBuffer( - serializeToBuffer(this.publicDataWrites), - PublicDataWrite.SIZE_IN_BYTES * MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, - ); - const privateLogsBuffer = padBuffer( - serializeToBuffer(this.privateLogs), - PrivateLog.SIZE_IN_BYTES * MAX_PRIVATE_LOGS_PER_TX, - ); - - const unencryptedLogsHashKernel0 = this.unencryptedLogs.hash(); - const contractClassLogsHashKernel0 = this.contractClassLogs.hash(); - - const inputValue = Buffer.concat([ - this.revertCode.toHashPreimage(), - this.transactionFee.toBuffer(), - noteHashesBuffer, - nullifiersBuffer, - outHashBuffer, - publicDataWritesBuffer, - privateLogsBuffer, - this.unencryptedLogsLength.toBuffer(), - this.contractClassLogsLength.toBuffer(), - unencryptedLogsHashKernel0, - contractClassLogsHashKernel0, - ]); - - return sha256Trunc(inputValue); - } - /** * Computes txOutHash of this tx effect. * TODO(#7218): Revert to fixed height tree for outbox - * @dev Follows computeTxOutHash in TxsDecoder.sol and new_sha in variable_merkle_tree.nr + * @dev Follows new_sha in variable_merkle_tree.nr */ txOutHash() { const { l2ToL1Msgs } = this; @@ -227,7 +208,7 @@ export class TxEffect { const contractClassLogs = ContractClassTxL2Logs.random(1, 1); return new TxEffect( RevertCode.random(), - Fr.random(), + new Fr(Math.floor(Math.random() * 100_000)), makeTuple(MAX_NOTE_HASHES_PER_TX, Fr.random), makeTuple(MAX_NULLIFIERS_PER_TX, Fr.random), makeTuple(MAX_L2_TO_L1_MSGS_PER_TX, Fr.random), @@ -265,6 +246,250 @@ export class TxEffect { return bufferToHex(this.toBuffer()); } + /** + * Returns the prefix as used in a blob. + * Used to prefix a 'block' of tx effects with its type and length. + */ + private toPrefix(type: number, length: number): Fr { + const buf = Buffer.alloc(4); + buf.writeUint8(type); + buf.writeUInt16BE(length, 2); + return new Fr(buf); + } + + /** + * Decodes the prefix as used in a blob to tx effect type and length. + */ + static fromPrefix(prefix: Fr) { + const buf = prefix.toBuffer().subarray(-4); + return { type: buf[0], length: new Fr(buf.subarray(-2)).toNumber() }; + } + + /** + * Encodes the first field of a tx effect as used in a blob: + * TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + */ + private encodeFirstField(length: number, revertCode: RevertCode) { + const lengthBuf = Buffer.alloc(2); + lengthBuf.writeUInt16BE(length, 0); + return new Fr( + Buffer.concat([ + toBufferBE(TX_START_PREFIX, TX_START_PREFIX_BYTES_LENGTH), + Buffer.alloc(1), + lengthBuf, + Buffer.alloc(1), + Buffer.from([REVERT_CODE_PREFIX]), + Buffer.alloc(1), + revertCode.toBuffer(), + ]), + ); + } + + /** + * Decodes the first field of a tx effect as used in a blob: + * TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + * Assumes that isFirstField has been called already. + */ + static decodeFirstField(field: Fr) { + const buf = field.toBuffer().subarray(-TX_EFFECT_PREFIX_BYTE_LENGTH); + return { + length: new Fr(buf.subarray(TX_START_PREFIX_BYTES_LENGTH + 1, TX_START_PREFIX_BYTES_LENGTH + 3)).toNumber(), + revertCode: buf[buf.length - 1], + }; + } + + /** + * Determines whether a field is the first field of a tx effect + */ + static isFirstField(field: Fr) { + const buf = field.toBuffer(); + if ( + !buf + .subarray(0, field.size - TX_EFFECT_PREFIX_BYTE_LENGTH) + .equals(Buffer.alloc(field.size - TX_EFFECT_PREFIX_BYTE_LENGTH)) + ) { + return false; + } + const sliced = buf.subarray(-TX_EFFECT_PREFIX_BYTE_LENGTH); + if ( + // Checking we start with the correct prefix... + !new Fr(sliced.subarray(0, TX_START_PREFIX_BYTES_LENGTH)).equals(new Fr(TX_START_PREFIX)) || + // ...and include the revert code prefix.. + sliced[sliced.length - 3] !== REVERT_CODE_PREFIX || + // ...and the following revert code is valid. + sliced[sliced.length - 1] > 4 + ) { + return false; + } + return true; + } + + /** + * Returns a flat packed array of prefixed fields of all tx effects, used for blobs. + */ + toBlobFields(): Fr[] { + if (this.isEmpty()) { + return []; + } + const flattened: Fr[] = []; + // We reassign the first field when we know the length of all effects - see below + flattened.push(Fr.ZERO); + // TODO: how long should tx fee be? For now, not using toPrefix() + flattened.push( + new Fr( + Buffer.concat([Buffer.from([TX_FEE_PREFIX]), Buffer.alloc(1), this.transactionFee.toBuffer().subarray(3)]), + ), + ); + if (this.noteHashes.length) { + flattened.push(this.toPrefix(NOTES_PREFIX, this.noteHashes.length)); + flattened.push(...this.noteHashes); + } + if (this.nullifiers.length) { + flattened.push(this.toPrefix(NULLIFIERS_PREFIX, this.nullifiers.length)); + flattened.push(...this.nullifiers); + } + if (this.l2ToL1Msgs.length) { + flattened.push(this.toPrefix(L2_L1_MSGS_PREFIX, this.l2ToL1Msgs.length)); + flattened.push(...this.l2ToL1Msgs); + } + if (this.publicDataWrites.length) { + flattened.push(this.toPrefix(PUBLIC_DATA_UPDATE_REQUESTS_PREFIX, this.publicDataWrites.length * 2)); + flattened.push(...this.publicDataWrites.map(w => [w.leafSlot, w.value]).flat()); + } + if (this.privateLogs.length) { + flattened.push(this.toPrefix(PRIVATE_LOGS_PREFIX, this.privateLogs.length * PRIVATE_LOG_SIZE_IN_FIELDS)); + flattened.push(...this.privateLogs.map(l => l.fields).flat()); + } + // TODO(#8954): When logs are refactored into fields, we will append the values here + // Currently appending the single log hash as an interim solution + if (this.unencryptedLogs.unrollLogs().length) { + flattened.push(this.toPrefix(UNENCRYPTED_LOGS_PREFIX, this.unencryptedLogs.unrollLogs().length)); + flattened.push(...this.unencryptedLogs.unrollLogs().map(log => Fr.fromBuffer(log.getSiloedHash()))); + } + if (this.contractClassLogs.unrollLogs().length) { + flattened.push(this.toPrefix(CONTRACT_CLASS_LOGS_PREFIX, this.contractClassLogs.unrollLogs().length)); + flattened.push(...this.contractClassLogs.unrollLogs().map(log => Fr.fromBuffer(log.getSiloedHash()))); + } + + // The first value appended to each list of fields representing a tx effect is: + // TX_START_PREFIX | 0 | txlen[0] txlen[1] | 0 | REVERT_CODE_PREFIX | 0 | revert_code + // Tx start and len are to aid decomposing/ identifying when we reach a new tx effect + // The remaining bytes are used for revert code, since that only requires 3 bytes + flattened[0] = this.encodeFirstField(flattened.length, this.revertCode); + return flattened; + } + + /** + * Decodes a flat packed array of prefixed fields to TxEffect + * TODO(#8954): When logs are refactored into fields, we won't need to inject them here, instead just reading from fields as below + */ + static fromBlobFields( + fields: Fr[] | FieldReader, + unencryptedLogs?: UnencryptedTxL2Logs, + contractClassLogs?: ContractClassTxL2Logs, + ) { + const ensureEmpty = (arr: Array) => { + if (arr.length) { + throw new Error('Invalid fields given to TxEffect.fromBlobFields(): Attempted to assign property twice.'); + } + }; + const effect = this.empty(); + if (!(fields instanceof FieldReader) && !fields.length) { + return effect; + } + const reader = FieldReader.asReader(fields); + const firstField = reader.readField(); + if (!this.isFirstField(firstField)) { + throw new Error('Invalid fields given to TxEffect.fromBlobFields(): First field invalid.'); + } + const { length: _, revertCode } = this.decodeFirstField(firstField); + effect.revertCode = RevertCode.fromField(new Fr(revertCode)); + // TODO: how long should tx fee be? For now, not using fromPrefix() + const prefixedFee = reader.readField(); + // NB: Fr.fromBuffer hangs here if you provide a buffer less than 32 in len + // todo: try new Fr(prefixedFee.toBuffer().subarray(3)) + effect.transactionFee = Fr.fromBuffer(Buffer.concat([Buffer.alloc(3), prefixedFee.toBuffer().subarray(3)])); + while (!reader.isFinished()) { + const { type, length } = this.fromPrefix(reader.readField()); + switch (type) { + case NOTES_PREFIX: + ensureEmpty(effect.noteHashes); + effect.noteHashes = reader.readFieldArray(length); + break; + case NULLIFIERS_PREFIX: + ensureEmpty(effect.nullifiers); + effect.nullifiers = reader.readFieldArray(length); + break; + case L2_L1_MSGS_PREFIX: + ensureEmpty(effect.l2ToL1Msgs); + effect.l2ToL1Msgs = reader.readFieldArray(length); + break; + case PUBLIC_DATA_UPDATE_REQUESTS_PREFIX: { + ensureEmpty(effect.publicDataWrites); + const publicDataPairs = reader.readFieldArray(length); + for (let i = 0; i < length; i += 2) { + effect.publicDataWrites.push(new PublicDataWrite(publicDataPairs[i], publicDataPairs[i + 1])); + } + break; + } + case PRIVATE_LOGS_PREFIX: { + // TODO(Miranda): squash log 0s in a nested loop and add len prefix? + ensureEmpty(effect.privateLogs); + const flatPrivateLogs = reader.readFieldArray(length); + for (let i = 0; i < length; i += PRIVATE_LOG_SIZE_IN_FIELDS) { + effect.privateLogs.push(PrivateLog.fromFields(flatPrivateLogs.slice(i, i + PRIVATE_LOG_SIZE_IN_FIELDS))); + } + break; + } + // TODO(#8954): When logs are refactored into fields, we will append the read fields here + case UNENCRYPTED_LOGS_PREFIX: + // effect.unencryptedLogs = UnencryptedTxL2Logs.fromFields(reader.readFieldArray(length)); + ensureEmpty(effect.unencryptedLogs.functionLogs); + if (!unencryptedLogs) { + throw new Error(`Tx effect has unencrypted logs, but they were not passed raw to .fromBlobFields()`); + } + this.checkInjectedLogs(unencryptedLogs, reader.readFieldArray(length)); + effect.unencryptedLogs = unencryptedLogs; + effect.unencryptedLogsLength = new Fr(unencryptedLogs.getKernelLength()); + break; + case CONTRACT_CLASS_LOGS_PREFIX: + // effect.contractClassLogs = ContractClassTxL2Logs.fromFields(reader.readFieldArray(length)); + ensureEmpty(effect.contractClassLogs.functionLogs); + if (!contractClassLogs) { + throw new Error(`Tx effect has contractClassLogs logs, but they were not passed raw to .fromBlobFields()`); + } + this.checkInjectedLogs(contractClassLogs, reader.readFieldArray(length)); + effect.contractClassLogs = contractClassLogs; + effect.contractClassLogsLength = new Fr(contractClassLogs.getKernelLength()); + break; + case REVERT_CODE_PREFIX: + default: + throw new Error(`Too many fields to decode given to TxEffect.fromBlobFields()`); + } + } + + // If the input fields have no logs, ensure we match the original struct by reassigning injected logs + effect.unencryptedLogs = + !effect.unencryptedLogs.getTotalLogCount() && unencryptedLogs ? unencryptedLogs : effect.unencryptedLogs; + effect.contractClassLogs = + !effect.contractClassLogs.getTotalLogCount() && contractClassLogs ? contractClassLogs : effect.contractClassLogs; + return effect; + } + + // TODO(#8954): Remove below when logs are refactored into fields + private static checkInjectedLogs(injected: TxL2Logs, expectedHashes: Fr[]) { + injected.unrollLogs().forEach((log, i) => { + const logHash = log.getSiloedHash(); + if (!Fr.fromBuffer(logHash).equals(expectedHashes[i])) { + throw new Error( + `Log hash mismatch when reconstructing tx effect. Expected: ${Fr.fromBuffer(logHash)}, Got: ${ + expectedHashes[i] + }`, + ); + } + }); + } + static from(fields: Omit, 'txHash'>) { return new TxEffect( fields.revertCode, diff --git a/yarn-project/circuits.js/package.json b/yarn-project/circuits.js/package.json index 66d4573bdb0..3006bd8fc8b 100644 --- a/yarn-project/circuits.js/package.json +++ b/yarn-project/circuits.js/package.json @@ -59,7 +59,8 @@ "files": [ "dest", "src", - "!*.test.*" + "!*.test.*", + "!src/scripts/*" ], "types": "./dest/index.d.ts", "engines": { diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index eeb86040682..ac7e24b713c 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -77,8 +77,9 @@ export const PRIVATE_KERNEL_RESET_INDEX = 20; export const FUNCTION_SELECTOR_NUM_BYTES = 4; export const INITIALIZATION_SLOT_SEPARATOR = 1000000000; export const INITIAL_L2_BLOCK_NUM = 1; +export const FIELDS_PER_BLOB = 4096; +export const BLOBS_PER_BLOCK = 3; export const PRIVATE_LOG_SIZE_IN_FIELDS = 18; -export const BLOB_SIZE_IN_BYTES = 126976; export const AZTEC_MAX_EPOCH_DURATION = 48; export const GENESIS_ARCHIVE_ROOT = 1002640778211850180189505934749257244705296832326768971348723156503780793518n; export const FEE_JUICE_INITIAL_MINT = 200000000000000000000n; @@ -115,7 +116,7 @@ export const DEFAULT_TPK_M_Y = 1457571873670220605010242502922942621563166447116 export const AZTEC_ADDRESS_LENGTH = 1; export const GAS_FEES_LENGTH = 2; export const GAS_LENGTH = 2; -export const GAS_SETTINGS_LENGTH = 6; +export const GAS_SETTINGS_LENGTH = 8; export const CALL_CONTEXT_LENGTH = 4; export const CONTENT_COMMITMENT_LENGTH = 4; export const CONTRACT_INSTANCE_LENGTH = 16; @@ -126,6 +127,10 @@ export const FUNCTION_DATA_LENGTH = 2; export const FUNCTION_LEAF_PREIMAGE_LENGTH = 5; export const GLOBAL_VARIABLES_LENGTH = 9; export const APPEND_ONLY_TREE_SNAPSHOT_LENGTH = 2; +export const APPEND_ONLY_TREE_SNAPSHOT_LENGTH_BYTES = 36; +export const SPONGE_BLOB_LENGTH = 11; +export const BLOB_PUBLIC_INPUTS = 6; +export const BLOB_PUBLIC_INPUTS_BYTES = 112; export const L1_TO_L2_MESSAGE_LENGTH = 6; export const L2_TO_L1_MESSAGE_LENGTH = 3; export const SCOPED_L2_TO_L1_MESSAGE_LENGTH = 4; @@ -153,35 +158,36 @@ export const PUBLIC_INNER_CALL_REQUEST_LENGTH = 13; export const ROLLUP_VALIDATION_REQUESTS_LENGTH = 2; export const STATE_REFERENCE_LENGTH = 8; export const TREE_SNAPSHOTS_LENGTH = 8; -export const TX_CONTEXT_LENGTH = 8; -export const TX_REQUEST_LENGTH = 12; +export const TX_CONTEXT_LENGTH = 10; +export const TX_REQUEST_LENGTH = 14; export const TOTAL_FEES_LENGTH = 1; export const TOTAL_MANA_USED_LENGTH = 1; export const BLOCK_HEADER_LENGTH = 25; -export const PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 739; +export const BLOCK_HEADER_LENGTH_BYTES = 648; +export const PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH = 741; export const PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH = 867; -export const PRIVATE_CONTEXT_INPUTS_LENGTH = 38; +export const PRIVATE_CONTEXT_INPUTS_LENGTH = 40; export const FEE_RECIPIENT_LENGTH = 2; export const AGGREGATION_OBJECT_LENGTH = 16; export const SCOPED_READ_REQUEST_LEN = 3; export const PUBLIC_DATA_READ_LENGTH = 3; export const PRIVATE_VALIDATION_REQUESTS_LENGTH = 772; export const COMBINED_ACCUMULATED_DATA_LENGTH = 902; -export const TX_CONSTANT_DATA_LENGTH = 35; -export const COMBINED_CONSTANT_DATA_LENGTH = 44; +export const TX_CONSTANT_DATA_LENGTH = 37; +export const COMBINED_CONSTANT_DATA_LENGTH = 46; export const PRIVATE_ACCUMULATED_DATA_LENGTH = 1412; -export const PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 2226; +export const PRIVATE_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 2229; export const PRIVATE_TO_PUBLIC_ACCUMULATED_DATA_LENGTH = 900; export const PRIVATE_TO_AVM_ACCUMULATED_DATA_LENGTH = 160; export const NUM_PRIVATE_TO_AVM_ACCUMULATED_DATA_ARRAYS = 3; export const AVM_ACCUMULATED_DATA_LENGTH = 320; -export const PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1845; -export const KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 958; -export const AVM_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1009; +export const PRIVATE_TO_PUBLIC_KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1847; +export const KERNEL_CIRCUIT_PUBLIC_INPUTS_LENGTH = 960; +export const AVM_CIRCUIT_PUBLIC_INPUTS_LENGTH = 1011; export const CONSTANT_ROLLUP_DATA_LENGTH = 13; -export const BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 31; -export const BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 122; -export const ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH = 108; +export const BASE_OR_MERGE_PUBLIC_INPUTS_LENGTH = 52; +export const BLOCK_ROOT_OR_BLOCK_MERGE_PUBLIC_INPUTS_LENGTH = 986; +export const ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH = 972; export const GET_NOTES_ORACLE_RETURN_LENGTH = 674; export const NOTE_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 2048; export const NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP = 2048; @@ -194,9 +200,9 @@ export const L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP = 256; export const LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP = 64; export const NUM_MSGS_PER_BASE_PARITY = 4; export const NUM_BASE_PARITY_PER_ROOT_PARITY = 4; -export const RECURSIVE_PROOF_LENGTH = 463; -export const NESTED_RECURSIVE_PROOF_LENGTH = 463; -export const TUBE_PROOF_LENGTH = 463; +export const RECURSIVE_PROOF_LENGTH = 459; +export const NESTED_RECURSIVE_PROOF_LENGTH = 459; +export const TUBE_PROOF_LENGTH = 459; export const HONK_VERIFICATION_KEY_LENGTH_IN_FIELDS = 128; export const CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS = 143; export const AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS = 86; @@ -316,6 +322,16 @@ export const AVM_EMITNOTEHASH_BASE_DA_GAS = 512; export const AVM_EMITNULLIFIER_BASE_DA_GAS = 512; export const AVM_SENDL2TOL1MSG_BASE_DA_GAS = 512; export const AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS = 512; +export const TX_START_PREFIX = 8392562855083340404n; +export const REVERT_CODE_PREFIX = 1; +export const TX_FEE_PREFIX = 2; +export const NOTES_PREFIX = 3; +export const NULLIFIERS_PREFIX = 4; +export const L2_L1_MSGS_PREFIX = 5; +export const PUBLIC_DATA_UPDATE_REQUESTS_PREFIX = 6; +export const PRIVATE_LOGS_PREFIX = 7; +export const UNENCRYPTED_LOGS_PREFIX = 8; +export const CONTRACT_CLASS_LOGS_PREFIX = 9; export const PROOF_TYPE_PLONK = 0; export const PROOF_TYPE_HONK = 1; export const PROOF_TYPE_OINK = 2; diff --git a/yarn-project/circuits.js/src/contract/contract_class.test.ts b/yarn-project/circuits.js/src/contract/contract_class.test.ts index 2ae16daf901..096db939be4 100644 --- a/yarn-project/circuits.js/src/contract/contract_class.test.ts +++ b/yarn-project/circuits.js/src/contract/contract_class.test.ts @@ -10,7 +10,7 @@ describe('ContractClass', () => { const artifact = getBenchmarkContractArtifact(); const contractClass = getContractClassFromArtifact({ ...artifact, - artifactHash: Fr.fromString('0x1234'), + artifactHash: Fr.fromHexString('0x1234'), }); // Assert bytecode has a reasonable length diff --git a/yarn-project/circuits.js/src/contract/contract_class.ts b/yarn-project/circuits.js/src/contract/contract_class.ts index 8809a2bbe02..78c49020d92 100644 --- a/yarn-project/circuits.js/src/contract/contract_class.ts +++ b/yarn-project/circuits.js/src/contract/contract_class.ts @@ -35,7 +35,7 @@ export function getContractClassFromArtifact( ); if (!dispatchFunction) { throw new Error( - 'A contract with public functions should define a public_dispatch(Field) function as its public entrypoint.', + `A contract with public functions should define a public_dispatch(Field) function as its public entrypoint. Contract: ${artifact.name}`, ); } packedBytecode = dispatchFunction.bytecode; diff --git a/yarn-project/circuits.js/src/contract/contract_class_id.test.ts b/yarn-project/circuits.js/src/contract/contract_class_id.test.ts index 29abd4adc68..323c8783352 100644 --- a/yarn-project/circuits.js/src/contract/contract_class_id.test.ts +++ b/yarn-project/circuits.js/src/contract/contract_class_id.test.ts @@ -8,12 +8,12 @@ describe('ContractClass', () => { it('calculates the contract class id', () => { const contractClass: ContractClass = { version: 1, - artifactHash: Fr.fromString('0x1234'), + artifactHash: Fr.fromHexString('0x1234'), packedBytecode: Buffer.from('123456789012345678901234567890', 'hex'), privateFunctions: [ { selector: FunctionSelector.fromString('0x12345678'), - vkHash: Fr.fromString('0x1234'), + vkHash: Fr.fromHexString('0x1234'), }, ], publicFunctions: [ diff --git a/yarn-project/circuits.js/src/contract/interfaces/contract_data_source.ts b/yarn-project/circuits.js/src/contract/interfaces/contract_data_source.ts index 84ed5f4afd9..388a828b9cb 100644 --- a/yarn-project/circuits.js/src/contract/interfaces/contract_data_source.ts +++ b/yarn-project/circuits.js/src/contract/interfaces/contract_data_source.ts @@ -1,4 +1,4 @@ -import { type ContractArtifact, type FunctionSelector } from '@aztec/foundation/abi'; +import { type FunctionSelector } from '@aztec/foundation/abi'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { type Fr } from '@aztec/foundation/fields'; @@ -45,11 +45,8 @@ export interface ContractDataSource { */ getContractClassIds(): Promise; - /** Returns a contract artifact. */ - getContractArtifact(address: AztecAddress): Promise; - /** Returns a function's name */ getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise; - /** Registers a a contract artifact. */ - addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise; + /** Registers a function names. Useful for debugging. */ + registerContractFunctionNames(address: AztecAddress, names: Record): Promise; } diff --git a/yarn-project/circuits.js/src/fees/index.ts b/yarn-project/circuits.js/src/fees/index.ts new file mode 100644 index 00000000000..99ed046cf47 --- /dev/null +++ b/yarn-project/circuits.js/src/fees/index.ts @@ -0,0 +1 @@ +export * from './transaction_fee.js'; diff --git a/yarn-project/circuits.js/src/fees/transaction_fee.test.ts b/yarn-project/circuits.js/src/fees/transaction_fee.test.ts new file mode 100644 index 00000000000..b3c344601e1 --- /dev/null +++ b/yarn-project/circuits.js/src/fees/transaction_fee.test.ts @@ -0,0 +1,67 @@ +import { updateInlineTestData } from '@aztec/foundation/testing/files'; +import { type Writeable } from '@aztec/foundation/types'; + +import { Fr, Gas, GasFees, GasSettings } from '../structs/index.js'; +import { computeTransactionFee } from './transaction_fee.js'; + +describe('computeTransactionFee', () => { + let gasFees: GasFees; + let gasSettings: Writeable; + let gasUsed: Gas; + + const expectFee = (feeStr: string) => { + const fee = computeTransactionFee(gasFees, gasSettings, gasUsed); + expect(fee).toEqual(new Fr(BigInt(eval(feeStr)))); + }; + + beforeEach(() => { + gasFees = new GasFees(12, 34); + + const maxFeesPerGas = new GasFees(56, 78); + const maxPriorityFeesPerGas = new GasFees(5, 7); + gasSettings = GasSettings.from({ ...GasSettings.empty(), maxFeesPerGas, maxPriorityFeesPerGas }); + + gasUsed = new Gas(2, 3); + }); + + it('computes the transaction fee with priority fee', () => { + const feeStr = '2 * (12 + 5) + 3 * (34 + 7)'; + expectFee(feeStr); + + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/compute_transaction_fee.nr', + 'expected_fee', + feeStr, + ); + }); + + it('computes the transaction fee without priority fee', () => { + gasSettings.maxPriorityFeesPerGas = GasFees.empty(); + + const feeStr = '2 * 12 + 3 * 34'; + expectFee(feeStr); + + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/compute_transaction_fee.nr', + 'expected_fee_empty_priority', + feeStr, + ); + }); + + it('computes the transaction fee paying max fee', () => { + // Increase gas_fees so that gasFees + maxPriorityFeesPerGas > maxFeesPerGas. + gasFees = new GasFees(53, 74); + + const feeStr = '2 * 56 + 3 * 78'; + expectFee(feeStr); + + // Run with AZTEC_GENERATE_TEST_DATA=1 to update noir test data + updateInlineTestData( + 'noir-projects/noir-protocol-circuits/crates/rollup-lib/src/base/components/private_base_rollup_output_composer/compute_transaction_fee.nr', + 'expected_max_fee', + feeStr, + ); + }); +}); diff --git a/yarn-project/circuits.js/src/fees/transaction_fee.ts b/yarn-project/circuits.js/src/fees/transaction_fee.ts new file mode 100644 index 00000000000..017275091fe --- /dev/null +++ b/yarn-project/circuits.js/src/fees/transaction_fee.ts @@ -0,0 +1,17 @@ +import { type Fr, type Gas, GasFees, type GasSettings } from '../structs/index.js'; + +export function computeTransactionFee(gasFees: GasFees, gasSettings: GasSettings, gasUsed: Gas): Fr { + const { maxFeesPerGas, maxPriorityFeesPerGas } = gasSettings; + const minField = (f1: Fr, f2: Fr) => (f1.lt(f2) ? f1 : f2); + const priorityFees = new GasFees( + minField(maxPriorityFeesPerGas.feePerDaGas, maxFeesPerGas.feePerDaGas.sub(gasFees.feePerDaGas)), + minField(maxPriorityFeesPerGas.feePerL2Gas, maxFeesPerGas.feePerL2Gas.sub(gasFees.feePerL2Gas)), + ); + + const totalFees = new GasFees( + gasFees.feePerDaGas.add(priorityFees.feePerDaGas), + gasFees.feePerL2Gas.add(priorityFees.feePerL2Gas), + ); + + return gasUsed.computeFee(totalFees); +} diff --git a/yarn-project/circuits.js/src/hash/hash.test.ts b/yarn-project/circuits.js/src/hash/hash.test.ts index fc1f0bc9018..39fa210a6f3 100644 --- a/yarn-project/circuits.js/src/hash/hash.test.ts +++ b/yarn-project/circuits.js/src/hash/hash.test.ts @@ -1,5 +1,6 @@ import { times } from '@aztec/foundation/collection'; -import { setupCustomSnapshotSerializers, updateInlineTestData } from '@aztec/foundation/testing'; +import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; +import { updateInlineTestData } from '@aztec/foundation/testing/files'; import { AztecAddress, EthAddress, Fr, L2ToL1Message, ScopedL2ToL1Message } from '../index.js'; import { makeAztecAddress } from '../tests/factories.js'; diff --git a/yarn-project/circuits.js/src/hash/hash.ts b/yarn-project/circuits.js/src/hash/hash.ts index a6ca04d5227..79fd9d4d98e 100644 --- a/yarn-project/circuits.js/src/hash/hash.ts +++ b/yarn-project/circuits.js/src/hash/hash.ts @@ -39,11 +39,11 @@ export function siloNoteHash(contract: AztecAddress, uniqueNoteHash: Fr): Fr { * Computes a unique note hash. * @dev Includes a nonce which contains data that guarantees the resulting note hash will be unique. * @param nonce - A nonce (typically derived from tx hash and note hash index in the tx). - * @param noteHash - A note hash. + * @param siloedNoteHash - A note hash. * @returns A unique note hash. */ -export function computeUniqueNoteHash(nonce: Fr, noteHash: Fr): Fr { - return poseidon2HashWithSeparator([nonce, noteHash], GeneratorIndex.UNIQUE_NOTE_HASH); +export function computeUniqueNoteHash(nonce: Fr, siloedNoteHash: Fr): Fr { + return poseidon2HashWithSeparator([nonce, siloedNoteHash], GeneratorIndex.UNIQUE_NOTE_HASH); } /** diff --git a/yarn-project/circuits.js/src/hash/map_slot.test.ts b/yarn-project/circuits.js/src/hash/map_slot.test.ts index f21df688f33..b120c496ea5 100644 --- a/yarn-project/circuits.js/src/hash/map_slot.test.ts +++ b/yarn-project/circuits.js/src/hash/map_slot.test.ts @@ -1,6 +1,6 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; -import { updateInlineTestData } from '@aztec/foundation/testing'; +import { updateInlineTestData } from '@aztec/foundation/testing/files'; import { deriveStorageSlotInMap } from './index.js'; diff --git a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts index ef0a049e2a2..3ede0df8bad 100644 --- a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts +++ b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.test.ts @@ -4,7 +4,6 @@ import { Fr } from '@aztec/foundation/fields'; import { type Tuple } from '@aztec/foundation/serialize'; import { MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX } from '../constants.gen.js'; -import { siloNoteHash } from '../hash/index.js'; import { NoteHash, type NoteHashReadRequestHints, @@ -20,8 +19,7 @@ import { buildNoteHashReadRequestHints } from './build_note_hash_read_request_hi describe('buildNoteHashReadRequestHints', () => { const contractAddress = AztecAddress.random(); - const settledNoteHashInnerValues = [111, 222, 333]; - const settledNoteHashes = settledNoteHashInnerValues.map(noteHash => siloNoteHash(contractAddress, new Fr(noteHash))); + const settledNoteHashes = [111, 222, 333]; const settledLeafIndexes = [1010n, 2020n, 3030n]; const oracle = { getNoteHashMembershipWitness: (leafIndex: bigint) => @@ -60,10 +58,10 @@ describe('buildNoteHashReadRequestHints', () => { const readRequestIndex = numReadRequests; const hintIndex = numSettledReads; const value = settledNoteHashes[noteHashIndex]; - noteHashLeafIndexMap.set(value.toBigInt(), settledLeafIndexes[noteHashIndex]); - noteHashReadRequests[readRequestIndex] = makeReadRequest(settledNoteHashInnerValues[noteHashIndex]); + noteHashLeafIndexMap.set(BigInt(value), settledLeafIndexes[noteHashIndex]); + noteHashReadRequests[readRequestIndex] = makeReadRequest(settledNoteHashes[noteHashIndex]); expectedHints.readRequestStatuses[readRequestIndex] = ReadRequestStatus.settled(hintIndex); - expectedHints.settledReadHints[hintIndex] = new SettledReadHint(readRequestIndex, {} as any, value); + expectedHints.settledReadHints[hintIndex] = new SettledReadHint(readRequestIndex, {} as any, new Fr(value)); numReadRequests++; numSettledReads++; }; diff --git a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts index 7a749b9a9b8..21feaa4c05b 100644 --- a/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts +++ b/yarn-project/circuits.js/src/hints/build_note_hash_read_request_hints.ts @@ -5,7 +5,6 @@ import { MAX_NOTE_HASH_READ_REQUESTS_PER_TX, type NOTE_HASH_TREE_HEIGHT, } from '../constants.gen.js'; -import { siloNoteHash } from '../hash/index.js'; import { type MembershipWitness, NoteHashReadRequestHintsBuilder, @@ -86,13 +85,12 @@ export async function buildNoteHashReadRequestHintsFromResetStates { const masterOutgoingViewingPublicKey = new Point(new Fr(5), new Fr(6), false); const masterTaggingPublicKey = new Point(new Fr(7), new Fr(8), false); - const expected = Fr.fromString('0x0fecd9a32db731fec1fded1b9ff957a1625c069245a3613a2538bd527068b0ad'); + const expected = Fr.fromHexString('0x0fecd9a32db731fec1fded1b9ff957a1625c069245a3613a2538bd527068b0ad'); expect( new PublicKeys( masterNullifierPublicKey, @@ -59,7 +59,7 @@ describe('🔑', () => { const publicKeys = new PublicKeys(npkM, ivpkM, ovpkM, tpkM); - const partialAddress = Fr.fromString('0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de'); + const partialAddress = Fr.fromHexString('0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de'); const address = computeAddress(publicKeys, partialAddress).toString(); expect(address).toMatchSnapshot(); diff --git a/yarn-project/circuits.js/src/keys/derivation.ts b/yarn-project/circuits.js/src/keys/derivation.ts index 495ea964cf8..032141f9842 100644 --- a/yarn-project/circuits.js/src/keys/derivation.ts +++ b/yarn-project/circuits.js/src/keys/derivation.ts @@ -123,7 +123,8 @@ export function deriveKeys(secretKey: Fr) { }; } -export function computeTaggingSecret(knownAddress: CompleteAddress, ivsk: Fq, externalAddress: AztecAddress) { +// Returns shared tagging secret computed with Diffie-Hellman key exchange. +export function computeTaggingSecretPoint(knownAddress: CompleteAddress, ivsk: Fq, externalAddress: AztecAddress) { const knownPreaddress = computePreaddress(knownAddress.publicKeys.hash(), knownAddress.partialAddress); // TODO: #8970 - Computation of address point from x coordinate might fail const externalAddressPoint = externalAddress.toAddressPoint(); diff --git a/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap b/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap index 89e87fba81d..73f68740498 100644 --- a/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap +++ b/yarn-project/circuits.js/src/structs/__snapshots__/tx_request.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`TxRequest compute hash 1`] = `"0x1b15ac8432c3c35718075a277d86f11263f057e2325afa208d6b19e37ff59a8d"`; +exports[`TxRequest compute hash 1`] = `"0x2d265ee0e3b9d206873a66527485afa3c6ebbfbaf451811666c9558a9f6e3d46"`; diff --git a/yarn-project/circuits.js/src/structs/blob_public_inputs.test.ts b/yarn-project/circuits.js/src/structs/blob_public_inputs.test.ts new file mode 100644 index 00000000000..9dc9c42d7be --- /dev/null +++ b/yarn-project/circuits.js/src/structs/blob_public_inputs.test.ts @@ -0,0 +1,79 @@ +import { Blob } from '@aztec/foundation/blob'; +import { randomInt } from '@aztec/foundation/crypto'; + +import { BLOBS_PER_BLOCK, BLOB_PUBLIC_INPUTS } from '../constants.gen.js'; +import { makeBlobPublicInputs, makeBlockBlobPublicInputs } from '../tests/factories.js'; +import { BlobPublicInputs, BlockBlobPublicInputs } from './blob_public_inputs.js'; +import { Fr } from './index.js'; + +describe('BlobPublicInputs', () => { + let blobPI: BlobPublicInputs; + + beforeAll(() => { + blobPI = makeBlobPublicInputs(randomInt(1000)); + }); + + it('serializes to buffer and deserializes it back', () => { + const buffer = blobPI.toBuffer(); + const res = BlobPublicInputs.fromBuffer(buffer); + expect(res).toEqual(blobPI); + }); + + it('converts correctly from Blob class', () => { + const blob = new Blob(Array(400).fill(new Fr(3))); + const converted = BlobPublicInputs.fromBlob(blob); + expect(converted.z).toEqual(blob.challengeZ); + expect(Buffer.from(converted.y.toString(16), 'hex')).toEqual(blob.evaluationY); + expect(converted.kzgCommitment).toEqual(blob.commitmentToFields()); + expect(converted.commitmentToBuffer()).toEqual(blob.commitment); + }); + + it('serializes to field array and deserializes it back', () => { + const fieldArray = blobPI.toFields(); + const res = BlobPublicInputs.fromFields(fieldArray); + expect(res).toEqual(blobPI); + }); + + // NB: In noir, blob.y is represented as a BigNum = 3x Fr fields. In ts, we use bigint for ease of calcs. + it('number of fields matches constant', () => { + const fields = blobPI.toFields(); + expect(fields.length).toBe(BLOB_PUBLIC_INPUTS); + }); +}); + +describe('BlockBlobPublicInputs', () => { + let blobPI: BlockBlobPublicInputs; + + beforeAll(() => { + blobPI = makeBlockBlobPublicInputs(randomInt(1000)); + }); + + it('serializes to buffer and deserializes it back', () => { + const buffer = blobPI.toBuffer(); + const res = BlockBlobPublicInputs.fromBuffer(buffer); + expect(res).toEqual(blobPI); + }); + + it('converts correctly from Blob class', () => { + const blobs = Array.from({ length: BLOBS_PER_BLOCK }, (_, i) => new Blob(Array(400).fill(new Fr(i + 1)))); + const converted = BlockBlobPublicInputs.fromBlobs(blobs); + converted.inner.forEach((blobPI, i) => { + expect(blobPI.z).toEqual(blobs[i].challengeZ); + expect(Buffer.from(blobPI.y.toString(16), 'hex')).toEqual(blobs[i].evaluationY); + expect(blobPI.kzgCommitment).toEqual(blobs[i].commitmentToFields()); + expect(blobPI.commitmentToBuffer()).toEqual(blobs[i].commitment); + }); + }); + + it('serializes to field array and deserializes it back', () => { + const fieldArray = blobPI.toFields(); + const res = BlockBlobPublicInputs.fromFields(fieldArray); + expect(res).toEqual(blobPI); + }); + + // NB: In noir, blob.y is represented as a BigNum = 3x Fr fields. In ts, we use bigint for ease of calcs. + it('number of fields matches constant', () => { + const fields = blobPI.toFields(); + expect(fields.length).toBe(BLOB_PUBLIC_INPUTS * BLOBS_PER_BLOCK); + }); +}); diff --git a/yarn-project/circuits.js/src/structs/blob_public_inputs.ts b/yarn-project/circuits.js/src/structs/blob_public_inputs.ts new file mode 100644 index 00000000000..bbec9f51eaf --- /dev/null +++ b/yarn-project/circuits.js/src/structs/blob_public_inputs.ts @@ -0,0 +1,161 @@ +import { makeTuple } from '@aztec/foundation/array'; +import { toBigIntBE, toBufferBE, toHex } from '@aztec/foundation/bigint-buffer'; +import { type Blob } from '@aztec/foundation/blob'; +import { sha256, sha256Trunc } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; +import { BufferReader, FieldReader, type Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; +import { type FieldsOf } from '@aztec/foundation/types'; + +import { BLOBS_PER_BLOCK } from '../constants.gen.js'; + +// The prefix to the EVM blobHash, defined here: https://eips.ethereum.org/EIPS/eip-4844#specification +// Also defined in yarn-project/foundation/src/blob/index.ts, which can't take in our circuits.js constants +export const VERSIONED_HASH_VERSION_KZG = 0x01; + +/** + * Public inputs required to be passed from our rollup circuits to verify a blob. + */ +export class BlobPublicInputs { + constructor( + /** Challenge point z (= H(H(tx_effects), kzgCommmitment). */ + public z: Fr, + /** Evaluation y = p(z), where p() is the blob polynomial. */ + public y: bigint, + /** Commitment to the blob C. */ + public kzgCommitment: Tuple, + ) {} + + static empty(): BlobPublicInputs { + return new BlobPublicInputs(Fr.ZERO, 0n, [Fr.ZERO, Fr.ZERO]); + } + + isEmpty(): boolean { + return this.z.isZero() && this.y == 0n && this.kzgCommitment[0].isZero() && this.kzgCommitment[1].isZero(); + } + + static fromBuffer(buffer: Buffer | BufferReader): BlobPublicInputs { + const reader = BufferReader.asReader(buffer); + return new BlobPublicInputs(Fr.fromBuffer(reader), toBigIntBE(reader.readBytes(32)), reader.readArray(2, Fr)); + } + + toBuffer() { + return serializeToBuffer(...BlobPublicInputs.getFields(this)); + } + + static fromFields(fields: Fr[] | FieldReader): BlobPublicInputs { + const reader = FieldReader.asReader(fields); + // TODO: Create a BigNum to fields conversion we can use here and in type_conversion.ts + const fromBigNum = (fieldArr: Fr[]) => { + return BigInt( + fieldArr[2].toString().concat(fieldArr[1].toString().substring(2), fieldArr[0].toString().substring(2)), + ); + }; + return new BlobPublicInputs(reader.readField(), fromBigNum(reader.readFieldArray(3)), reader.readFieldArray(2)); + } + + // NB: y is NOT a BN254 field, it's a larger BLS field, we cannot use serialiseToFields here as it assumes bigints will fit + // TODO: Create a BigNum to fields conversion we can use here and in type_conversion.ts + toFields() { + const hex = toHex(this.y, true); + const bigNum = [ + Fr.fromString('0x' + hex.substring(36)), + Fr.fromString('0x' + hex.substring(6, 36)), + Fr.fromString(hex.substring(0, 6)), + ]; + return [this.z, ...bigNum, ...this.kzgCommitment]; + } + + static getFields(fields: FieldsOf) { + return [fields.z, fields.y, fields.kzgCommitment] as const; + } + + static fromBlob(input: Blob): BlobPublicInputs { + return new BlobPublicInputs(input.challengeZ, toBigIntBE(input.evaluationY), input.commitmentToFields()); + } + + getBlobHash(): Buffer { + const hash = sha256(this.commitmentToBuffer()); + hash[0] = VERSIONED_HASH_VERSION_KZG; + return hash; + } + + // Performs the reverse conversion of blob.commitmentToFields() + // 48 bytes encoded in fields as [Fr, Fr] = [0->31, 31->48] + commitmentToBuffer(): Buffer { + return Buffer.concat([ + this.kzgCommitment[0].toBuffer().subarray(1), + this.kzgCommitment[1].toBuffer().subarray(-17), + ]); + } + + equals(other: BlobPublicInputs) { + return ( + this.z.equals(other.z) && + this.y == other.y && + this.kzgCommitment[0].equals(other.kzgCommitment[0]) && + this.kzgCommitment[1].equals(other.kzgCommitment[1]) + ); + } +} + +// NB: it is much cleaner throughout the protocol circuits to define this struct rather than use a nested array. +// Once we accumulate blob inputs, it should be removed, and we just use BlobPublicInputs::accumulate everywhere. +export class BlockBlobPublicInputs { + constructor(public inner: Tuple) {} + + static empty(): BlockBlobPublicInputs { + return new BlockBlobPublicInputs(makeTuple(BLOBS_PER_BLOCK, BlobPublicInputs.empty)); + } + + static fromBuffer(buffer: Buffer | BufferReader): BlockBlobPublicInputs { + const reader = BufferReader.asReader(buffer); + return new BlockBlobPublicInputs(reader.readArray(BLOBS_PER_BLOCK, BlobPublicInputs)); + } + + toBuffer() { + return serializeToBuffer(...BlockBlobPublicInputs.getFields(this)); + } + + static fromFields(fields: Fr[] | FieldReader): BlockBlobPublicInputs { + const reader = FieldReader.asReader(fields); + return new BlockBlobPublicInputs(reader.readArray(BLOBS_PER_BLOCK, BlobPublicInputs)); + } + + toFields() { + return this.inner.map(i => i.toFields()).flat(); + } + + static getFields(fields: FieldsOf) { + return [fields.inner] as const; + } + + static fromBlobs(inputs: Blob[]): BlockBlobPublicInputs { + const inner = makeTuple(BLOBS_PER_BLOCK, BlobPublicInputs.empty); + if (inputs.length > BLOBS_PER_BLOCK) { + throw new Error(`Can only fit ${BLOBS_PER_BLOCK} in one BlockBlobPublicInputs instance (given ${inputs.length})`); + } + inputs.forEach((input, i) => { + inner[i] = BlobPublicInputs.fromBlob(input); + }); + return new BlockBlobPublicInputs(inner); + } + + getBlobsHash() { + const blobHashes = this.inner.map(item => (item.isEmpty() ? Buffer.alloc(0) : item.getBlobHash())); + return sha256Trunc(serializeToBuffer(blobHashes)); + } + + // The below is used to send to L1 for proof verification + toString() { + const nonEmptyBlobs = this.inner.filter(item => !item.isEmpty()); + // Write the number of blobs for L1 to verify + let buf = Buffer.alloc(1); + buf.writeUInt8(nonEmptyBlobs.length); + // Using standard toBuffer() does not correctly encode the commitment + // On L1, it's a 48 byte number, which we convert to 2 fields for use in the circuits + nonEmptyBlobs.forEach(blob => { + buf = Buffer.concat([buf, blob.z.toBuffer(), toBufferBE(blob.y, 32), blob.commitmentToBuffer()]); + }); + return buf.toString('hex'); + } +} diff --git a/yarn-project/circuits.js/src/structs/block_header.test.ts b/yarn-project/circuits.js/src/structs/block_header.test.ts index 053bf0d2639..40c7e3eec96 100644 --- a/yarn-project/circuits.js/src/structs/block_header.test.ts +++ b/yarn-project/circuits.js/src/structs/block_header.test.ts @@ -1,5 +1,6 @@ import { randomInt } from '@aztec/foundation/crypto'; -import { setupCustomSnapshotSerializers, updateInlineTestData } from '@aztec/foundation/testing'; +import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; +import { updateInlineTestData } from '@aztec/foundation/testing/files'; import { BLOCK_HEADER_LENGTH } from '../constants.gen.js'; import { makeHeader } from '../tests/factories.js'; diff --git a/yarn-project/circuits.js/src/structs/block_header.ts b/yarn-project/circuits.js/src/structs/block_header.ts index 5a09e139a3e..edfcabe8f78 100644 --- a/yarn-project/circuits.js/src/structs/block_header.ts +++ b/yarn-project/circuits.js/src/structs/block_header.ts @@ -166,8 +166,8 @@ export class BlockHeader { [inspect.custom]() { return `Header { lastArchive: ${inspect(this.lastArchive)}, - contentCommitment.numTx: ${this.contentCommitment.numTxs.toNumber()}, - contentCommitment.txsEffectsHash: ${this.contentCommitment.txsEffectsHash.toString('hex')}, + contentCommitment.numTxs: ${this.contentCommitment.numTxs.toNumber()}, + contentCommitment.blobsHash: ${this.contentCommitment.blobsHash.toString('hex')}, contentCommitment.inHash: ${this.contentCommitment.inHash.toString('hex')}, contentCommitment.outHash: ${this.contentCommitment.outHash.toString('hex')}, state.l1ToL2MessageTree: ${inspect(this.state.l1ToL2MessageTree)}, diff --git a/yarn-project/circuits.js/src/structs/client_ivc_proof.ts b/yarn-project/circuits.js/src/structs/client_ivc_proof.ts index 3ce4169c2f8..f8c2bf1b59e 100644 --- a/yarn-project/circuits.js/src/structs/client_ivc_proof.ts +++ b/yarn-project/circuits.js/src/structs/client_ivc_proof.ts @@ -1,9 +1,6 @@ import { bufferSchemaFor } from '@aztec/foundation/schemas'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import { promises as fs } from 'fs'; -import path from 'path'; - /** * TODO(https://github.com/AztecProtocol/aztec-packages/issues/7370) refactory this to * eventually we read all these VKs from the data tree instead of passing them @@ -25,41 +22,6 @@ export class ClientIvcProof { return new ClientIvcProof(Buffer.from(''), Buffer.from('')); } - /** - * TODO(#7371): eventually remove client_ivc_prove_output_all_msgpack and properly handle these accumulators and VKs - * Create a ClientIvcProof from the result of client_ivc_prove_output_all or client_ivc_prove_output_all_msgpack - * @param directory the directory of results - * @returns the encapsulated client ivc proof - */ - static async readFromOutputDirectory(directory: string) { - const [clientIvcVkBuffer, clientIvcProofBuffer] = await Promise.all( - ['client_ivc_vk', 'client_ivc_proof'].map(fileName => fs.readFile(path.join(directory, fileName))), - ); - return new ClientIvcProof(clientIvcProofBuffer, clientIvcVkBuffer); - } - - /** - * TODO(#7371): eventually remove client_ivc_prove_output_all_msgpack and properly handle these accumulators and VKs - * Serialize a ClientIvcProof to the files expected by prove_tube - * - * Example usage: - * await runInDirectory(bbWorkingDirectory, async (dir: string) => { - * await privateTx.clientIvcProof!.writeToOutputDirectory(bbWorkingDirectory); - * const result = await generateTubeProof(bbPath, dir, logger.info) - * expect(result.status).toBe(BB_RESULT.SUCCESS) - * }); - * @param proof the ClientIvcProof from readFromOutputDirectory - * @param directory the directory of results - */ - async writeToOutputDirectory(directory: string) { - const { clientIvcProofBuffer, clientIvcVkBuffer } = this; - const fileData = [ - ['client_ivc_proof', clientIvcProofBuffer], - ['client_ivc_vk', clientIvcVkBuffer], - ] as const; - await Promise.all(fileData.map(([fileName, buffer]) => fs.writeFile(path.join(directory, fileName), buffer))); - } - static get schema() { return bufferSchemaFor(ClientIvcProof); } diff --git a/yarn-project/circuits.js/src/structs/complete_address.test.ts b/yarn-project/circuits.js/src/structs/complete_address.test.ts index 5a2381605eb..a7f39f85bb9 100644 --- a/yarn-project/circuits.js/src/structs/complete_address.test.ts +++ b/yarn-project/circuits.js/src/structs/complete_address.test.ts @@ -40,7 +40,7 @@ describe('CompleteAddress', () => { ); const address = new AztecAddress( - Fr.fromString('0x24e4646f58b9fbe7d38e317db8d5636c423fbbdfbe119fc190fe9c64747e0c62'), + Fr.fromHexString('0x24e4646f58b9fbe7d38e317db8d5636c423fbbdfbe119fc190fe9c64747e0c62'), ); const npkM = Point.fromString( '0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7', @@ -55,7 +55,7 @@ describe('CompleteAddress', () => { '0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a7622f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a', ); - const partialAddress = Fr.fromString('0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de'); + const partialAddress = Fr.fromHexString('0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de'); const completeAddressFromComponents = new CompleteAddress( address, diff --git a/yarn-project/circuits.js/src/structs/content_commitment.ts b/yarn-project/circuits.js/src/structs/content_commitment.ts index bdb1b923478..5fe9a58a8c8 100644 --- a/yarn-project/circuits.js/src/structs/content_commitment.ts +++ b/yarn-project/circuits.js/src/structs/content_commitment.ts @@ -10,12 +10,13 @@ import { CONTENT_COMMITMENT_LENGTH } from '../constants.gen.js'; export const NUM_BYTES_PER_SHA256 = 32; export class ContentCommitment { - constructor(public numTxs: Fr, public txsEffectsHash: Buffer, public inHash: Buffer, public outHash: Buffer) { - if (txsEffectsHash.length !== NUM_BYTES_PER_SHA256) { - throw new Error(`txsEffectsHash buffer must be ${NUM_BYTES_PER_SHA256} bytes`); + constructor(public numTxs: Fr, public blobsHash: Buffer, public inHash: Buffer, public outHash: Buffer) { + // NB: we do not calculate blobHash in the circuit, but we still truncate it so it fits in a field + if (blobsHash.length !== NUM_BYTES_PER_SHA256) { + throw new Error(`blobsHash buffer must be ${NUM_BYTES_PER_SHA256} bytes`); } - if (txsEffectsHash[0] !== 0) { - throw new Error(`txsEffectsHash buffer should be truncated and left padded`); + if (blobsHash[0] !== 0) { + throw new Error(`blobsHash buffer should be truncated and left padded`); } if (inHash.length !== NUM_BYTES_PER_SHA256) { throw new Error(`inHash buffer must be ${NUM_BYTES_PER_SHA256} bytes`); @@ -35,13 +36,11 @@ export class ContentCommitment { return z .object({ numTxs: schemas.Fr, - txsEffectsHash: schemas.Buffer, + blobsHash: schemas.Buffer, inHash: schemas.Buffer, outHash: schemas.Buffer, }) - .transform( - ({ numTxs, txsEffectsHash, inHash, outHash }) => new ContentCommitment(numTxs, txsEffectsHash, inHash, outHash), - ); + .transform(({ numTxs, blobsHash, inHash, outHash }) => new ContentCommitment(numTxs, blobsHash, inHash, outHash)); } getSize() { @@ -49,13 +48,13 @@ export class ContentCommitment { } toBuffer() { - return serializeToBuffer(this.numTxs, this.txsEffectsHash, this.inHash, this.outHash); + return serializeToBuffer(this.numTxs, this.blobsHash, this.inHash, this.outHash); } toInspect() { return { numTxs: this.numTxs.toNumber(), - txsEffectsHash: bufferToHex(this.txsEffectsHash), + blobsHash: bufferToHex(this.blobsHash), inHash: bufferToHex(this.inHash), outHash: bufferToHex(this.outHash), }; @@ -64,12 +63,14 @@ export class ContentCommitment { toFields(): Fr[] { const serialized = [ this.numTxs, - Fr.fromBuffer(this.txsEffectsHash), + Fr.fromBuffer(this.blobsHash), Fr.fromBuffer(this.inHash), Fr.fromBuffer(this.outHash), ]; if (serialized.length !== CONTENT_COMMITMENT_LENGTH) { - throw new Error(`Expected content commitment to have 4 fields, but it has ${serialized.length} fields`); + throw new Error( + `Expected content commitment to have ${CONTENT_COMMITMENT_LENGTH} fields, but it has ${serialized.length} fields`, + ); } return serialized; } @@ -107,7 +108,7 @@ export class ContentCommitment { isEmpty(): boolean { return ( this.numTxs.isZero() && - this.txsEffectsHash.equals(Buffer.alloc(NUM_BYTES_PER_SHA256)) && + this.blobsHash.equals(Buffer.alloc(NUM_BYTES_PER_SHA256)) && this.inHash.equals(Buffer.alloc(NUM_BYTES_PER_SHA256)) && this.outHash.equals(Buffer.alloc(NUM_BYTES_PER_SHA256)) ); @@ -127,7 +128,7 @@ export class ContentCommitment { this.inHash.equals(other.inHash) && this.outHash.equals(other.outHash) && this.numTxs.equals(other.numTxs) && - this.txsEffectsHash.equals(other.txsEffectsHash) + this.blobsHash.equals(other.blobsHash) ); } } diff --git a/yarn-project/circuits.js/src/structs/gas_settings.ts b/yarn-project/circuits.js/src/structs/gas_settings.ts index c5449a7ac9d..e432c8a8f8a 100644 --- a/yarn-project/circuits.js/src/structs/gas_settings.ts +++ b/yarn-project/circuits.js/src/structs/gas_settings.ts @@ -14,6 +14,7 @@ export class GasSettings { public readonly gasLimits: Gas, public readonly teardownGasLimits: Gas, public readonly maxFeesPerGas: GasFees, + public readonly maxPriorityFeesPerGas: GasFees, ) {} static get schema() { @@ -22,6 +23,7 @@ export class GasSettings { gasLimits: Gas.schema, teardownGasLimits: Gas.schema, maxFeesPerGas: GasFees.schema, + maxPriorityFeesPerGas: GasFees.schema, }) .transform(GasSettings.from); } @@ -30,16 +32,27 @@ export class GasSettings { return this.toBuffer().length; } - static from(args: { gasLimits: FieldsOf; teardownGasLimits: FieldsOf; maxFeesPerGas: FieldsOf }) { + static from(args: { + gasLimits: FieldsOf; + teardownGasLimits: FieldsOf; + maxFeesPerGas: FieldsOf; + maxPriorityFeesPerGas: FieldsOf; + }) { return new GasSettings( Gas.from(args.gasLimits), Gas.from(args.teardownGasLimits), GasFees.from(args.maxFeesPerGas), + GasFees.from(args.maxPriorityFeesPerGas), ); } clone() { - return new GasSettings(this.gasLimits.clone(), this.teardownGasLimits.clone(), this.maxFeesPerGas.clone()); + return new GasSettings( + this.gasLimits.clone(), + this.teardownGasLimits.clone(), + this.maxFeesPerGas.clone(), + this.maxPriorityFeesPerGas.clone(), + ); } /** Returns the maximum fee to be paid according to gas limits and max fees set. */ @@ -56,11 +69,16 @@ export class GasSettings { /** Zero-value gas settings. */ static empty() { - return new GasSettings(Gas.empty(), Gas.empty(), GasFees.empty()); + return new GasSettings(Gas.empty(), Gas.empty(), GasFees.empty(), GasFees.empty()); } /** Default gas settings to use when user has not provided them. Requires explicit max fees per gas. */ - static default(overrides: { gasLimits?: Gas; teardownGasLimits?: Gas; maxFeesPerGas: GasFees }) { + static default(overrides: { + gasLimits?: Gas; + teardownGasLimits?: Gas; + maxFeesPerGas: GasFees; + maxPriorityFeesPerGas?: GasFees; + }) { return GasSettings.from({ gasLimits: overrides.gasLimits ?? { l2Gas: DEFAULT_GAS_LIMIT, daGas: DEFAULT_GAS_LIMIT }, teardownGasLimits: overrides.teardownGasLimits ?? { @@ -68,32 +86,36 @@ export class GasSettings { daGas: DEFAULT_TEARDOWN_GAS_LIMIT, }, maxFeesPerGas: overrides.maxFeesPerGas, - }); - } - - /** Default gas settings with no teardown */ - static teardownless(opts: { maxFeesPerGas: GasFees }) { - return GasSettings.default({ - teardownGasLimits: Gas.from({ l2Gas: 0, daGas: 0 }), - maxFeesPerGas: opts.maxFeesPerGas, + maxPriorityFeesPerGas: overrides.maxPriorityFeesPerGas ?? GasFees.empty(), }); } isEmpty() { - return this.gasLimits.isEmpty() && this.teardownGasLimits.isEmpty() && this.maxFeesPerGas.isEmpty(); + return ( + this.gasLimits.isEmpty() && + this.teardownGasLimits.isEmpty() && + this.maxFeesPerGas.isEmpty() && + this.maxPriorityFeesPerGas.isEmpty() + ); } equals(other: GasSettings) { return ( this.gasLimits.equals(other.gasLimits) && this.teardownGasLimits.equals(other.teardownGasLimits) && - this.maxFeesPerGas.equals(other.maxFeesPerGas) + this.maxFeesPerGas.equals(other.maxFeesPerGas) && + this.maxPriorityFeesPerGas.equals(other.maxPriorityFeesPerGas) ); } static fromBuffer(buffer: Buffer | BufferReader): GasSettings { const reader = BufferReader.asReader(buffer); - return new GasSettings(reader.readObject(Gas), reader.readObject(Gas), reader.readObject(GasFees)); + return new GasSettings( + reader.readObject(Gas), + reader.readObject(Gas), + reader.readObject(GasFees), + reader.readObject(GasFees), + ); } toBuffer() { @@ -102,7 +124,12 @@ export class GasSettings { static fromFields(fields: Fr[] | FieldReader): GasSettings { const reader = FieldReader.asReader(fields); - return new GasSettings(reader.readObject(Gas), reader.readObject(Gas), reader.readObject(GasFees)); + return new GasSettings( + reader.readObject(Gas), + reader.readObject(Gas), + reader.readObject(GasFees), + reader.readObject(GasFees), + ); } toFields(): Fr[] { @@ -116,6 +143,6 @@ export class GasSettings { } static getFields(fields: FieldsOf) { - return [fields.gasLimits, fields.teardownGasLimits, fields.maxFeesPerGas] as const; + return [fields.gasLimits, fields.teardownGasLimits, fields.maxFeesPerGas, fields.maxPriorityFeesPerGas] as const; } } diff --git a/yarn-project/circuits.js/src/structs/index.ts b/yarn-project/circuits.js/src/structs/index.ts index 4959a0fb048..4df382c6b57 100644 --- a/yarn-project/circuits.js/src/structs/index.ts +++ b/yarn-project/circuits.js/src/structs/index.ts @@ -2,6 +2,7 @@ export * from '@aztec/foundation/eth-address'; export * from './avm/avm.js'; export * from './avm/avm_accumulated_data.js'; export * from './avm/avm_circuit_public_inputs.js'; +export * from './blob_public_inputs.js'; export * from './call_context.js'; export * from './client_ivc_proof.js'; export * from './complete_address.js'; @@ -15,7 +16,7 @@ export * from './gas_fees.js'; export * from './gas_settings.js'; export * from './global_variables.js'; export * from './block_header.js'; -export * from './tagging_secret.js'; +export * from './indexed_tagging_secret.js'; export * from './kernel/combined_accumulated_data.js'; export * from './kernel/combined_constant_data.js'; export * from './kernel/private_kernel_empty_inputs.js'; @@ -89,6 +90,7 @@ export * from './rollup/state_diff_hints.js'; export * from './rollup/tube_inputs.js'; export * from './rollup_validation_requests.js'; export * from './scoped_key_validation_request_and_generator.js'; +export * from './sponge_blob.js'; export * from './shared.js'; export * from './state_reference.js'; export * from './tree_leaf_read_request.js'; diff --git a/yarn-project/circuits.js/src/structs/indexed_tagging_secret.ts b/yarn-project/circuits.js/src/structs/indexed_tagging_secret.ts new file mode 100644 index 00000000000..37b98d62282 --- /dev/null +++ b/yarn-project/circuits.js/src/structs/indexed_tagging_secret.ts @@ -0,0 +1,44 @@ +import { type AztecAddress } from '@aztec/foundation/aztec-address'; +import { poseidon2Hash } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; + +export class IndexedTaggingSecret { + constructor(public appTaggingSecret: Fr, public index: number) { + if (index < 0) { + throw new Error('IndexedTaggingSecret index out of bounds'); + } + } + + toFields(): Fr[] { + return [this.appTaggingSecret, new Fr(this.index)]; + } + + static fromFields(serialized: Fr[]) { + return new this(serialized[0], serialized[1].toNumber()); + } + + /** + * Computes the tag based on the app tagging secret, recipient and index. + * @dev By including the recipient we achieve "directionality" of the tag (when sending a note in the other + * direction, the tag will be different). + * @param recipient The recipient of the note + * @returns The tag. + */ + computeTag(recipient: AztecAddress) { + return poseidon2Hash([this.appTaggingSecret, recipient, this.index]); + } + + /** + * Computes the tag as it is submitted on-chain. + * @dev We do this second layer of siloing (one was already done as the tagging secret is app-siloed) because kernels + * do that to protect against contract impersonation attacks. This extra layer of siloing in kernels ensures that + * a malicious contract cannot emit a note with a tag corresponding to another contract. + * @param recipient The recipient of the note + * @param app The app address + * @returns The tag as it is submitted on-chain in a log. + */ + computeSiloedTag(recipient: AztecAddress, app: AztecAddress) { + const tag = this.computeTag(recipient); + return poseidon2Hash([app, tag]); + } +} diff --git a/yarn-project/circuits.js/src/structs/kernel/private_kernel_circuit_public_inputs.ts b/yarn-project/circuits.js/src/structs/kernel/private_kernel_circuit_public_inputs.ts index 1839ce2c98d..9147b1e1339 100644 --- a/yarn-project/circuits.js/src/structs/kernel/private_kernel_circuit_public_inputs.ts +++ b/yarn-project/circuits.js/src/structs/kernel/private_kernel_circuit_public_inputs.ts @@ -37,6 +37,10 @@ export class PrivateKernelCircuitPublicInputs { * The address of the fee payer for the transaction */ public feePayer: AztecAddress, + /** + * Wether this is a private only tx or not + */ + public isPrivateOnly: boolean, ) {} static get schema() { @@ -72,6 +76,7 @@ export class PrivateKernelCircuitPublicInputs { reader.readObject(PrivateAccumulatedData), reader.readObject(PublicCallRequest), reader.readObject(AztecAddress), + reader.readBoolean(), ); } @@ -83,6 +88,7 @@ export class PrivateKernelCircuitPublicInputs { PrivateAccumulatedData.empty(), PublicCallRequest.empty(), AztecAddress.ZERO, + false, ); } } diff --git a/yarn-project/circuits.js/src/structs/kernel/private_kernel_init_circuit_private_inputs.ts b/yarn-project/circuits.js/src/structs/kernel/private_kernel_init_circuit_private_inputs.ts index d09f903e5ff..771033c9542 100644 --- a/yarn-project/circuits.js/src/structs/kernel/private_kernel_init_circuit_private_inputs.ts +++ b/yarn-project/circuits.js/src/structs/kernel/private_kernel_init_circuit_private_inputs.ts @@ -25,6 +25,10 @@ export class PrivateKernelInitCircuitPrivateInputs { * Private calldata corresponding to this iteration of the kernel. */ public privateCall: PrivateCallData, + /** + * Wether this tx will make public calls or not. + */ + public isPrivateOnly: boolean, ) {} /** @@ -47,6 +51,7 @@ export class PrivateKernelInitCircuitPrivateInputs { Fr.fromBuffer(reader), Fr.fromBuffer(reader), reader.readObject(PrivateCallData), + reader.readBoolean(), ); } } diff --git a/yarn-project/circuits.js/src/structs/rollup/base_or_merge_rollup_public_inputs.ts b/yarn-project/circuits.js/src/structs/rollup/base_or_merge_rollup_public_inputs.ts index 4ad09b59c2c..afd619bdf9a 100644 --- a/yarn-project/circuits.js/src/structs/rollup/base_or_merge_rollup_public_inputs.ts +++ b/yarn-project/circuits.js/src/structs/rollup/base_or_merge_rollup_public_inputs.ts @@ -5,6 +5,7 @@ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string'; import { PartialStateReference } from '../partial_state_reference.js'; import { RollupTypes } from '../shared.js'; +import { SpongeBlob } from '../sponge_blob.js'; import { ConstantRollupData } from './constant_rollup_data.js'; /** @@ -33,16 +34,18 @@ export class BaseOrMergeRollupPublicInputs { */ public end: PartialStateReference, /** - * SHA256 hash of transactions effects. Used to make public inputs constant-sized (to then be unpacked on-chain). - * Note: Truncated to 31 bytes to fit in Fr. + * Sponge state to absorb blob inputs at the start of the rollup circuit. + */ + public startSpongeBlob: SpongeBlob, + /** + * Sponge state to absorb blob inputs at the end of the rollup circuit. */ - public txsEffectsHash: Fr, + public endSpongeBlob: SpongeBlob, /** * SHA256 hash of outhash. Used to make public inputs constant-sized (to then be unpacked on-chain). * Note: Truncated to 31 bytes to fit in Fr. */ public outHash: Fr, - /** * The summed `transaction_fee` of the constituent transactions. */ @@ -61,7 +64,8 @@ export class BaseOrMergeRollupPublicInputs { ConstantRollupData.empty(), PartialStateReference.empty(), PartialStateReference.empty(), - Fr.zero(), + SpongeBlob.empty(), + SpongeBlob.empty(), Fr.zero(), Fr.zero(), Fr.zero(), @@ -82,8 +86,8 @@ export class BaseOrMergeRollupPublicInputs { reader.readObject(ConstantRollupData), reader.readObject(PartialStateReference), reader.readObject(PartialStateReference), - //TODO check - Fr.fromBuffer(reader), + reader.readObject(SpongeBlob), + reader.readObject(SpongeBlob), Fr.fromBuffer(reader), Fr.fromBuffer(reader), Fr.fromBuffer(reader), @@ -103,7 +107,9 @@ export class BaseOrMergeRollupPublicInputs { this.start, this.end, - this.txsEffectsHash, + this.startSpongeBlob, + this.endSpongeBlob, + this.outHash, this.accumulatedFees, diff --git a/yarn-project/circuits.js/src/structs/rollup/base_rollup_hints.ts b/yarn-project/circuits.js/src/structs/rollup/base_rollup_hints.ts index fbec824f915..aedc17a3ee2 100644 --- a/yarn-project/circuits.js/src/structs/rollup/base_rollup_hints.ts +++ b/yarn-project/circuits.js/src/structs/rollup/base_rollup_hints.ts @@ -6,6 +6,7 @@ import { ARCHIVE_HEIGHT } from '../../constants.gen.js'; import { MembershipWitness } from '../membership_witness.js'; import { PartialStateReference } from '../partial_state_reference.js'; import { PublicDataHint } from '../public_data_hint.js'; +import { SpongeBlob } from '../sponge_blob.js'; import { ConstantRollupData } from './constant_rollup_data.js'; import { PrivateBaseStateDiffHints, PublicBaseStateDiffHints } from './state_diff_hints.js'; @@ -15,6 +16,8 @@ export class PrivateBaseRollupHints { constructor( /** Partial state reference at the start of the rollup. */ public start: PartialStateReference, + /** Sponge state to absorb blob inputs at the start of the rollup. */ + public startSpongeBlob: SpongeBlob, /** Hints used while proving state diff validity. */ public stateDiffHints: PrivateBaseStateDiffHints, /** Public data read hint for accessing the balance of the fee payer. */ @@ -37,6 +40,7 @@ export class PrivateBaseRollupHints { static getFields(fields: FieldsOf) { return [ fields.start, + fields.startSpongeBlob, fields.stateDiffHints, fields.feePayerFeeJuiceBalanceReadHint, fields.archiveRootMembershipWitness, @@ -64,6 +68,7 @@ export class PrivateBaseRollupHints { const reader = BufferReader.asReader(buffer); return new PrivateBaseRollupHints( reader.readObject(PartialStateReference), + reader.readObject(SpongeBlob), reader.readObject(PrivateBaseStateDiffHints), reader.readObject(PublicDataHint), MembershipWitness.fromBuffer(reader, ARCHIVE_HEIGHT), @@ -78,6 +83,7 @@ export class PrivateBaseRollupHints { static empty() { return new PrivateBaseRollupHints( PartialStateReference.empty(), + SpongeBlob.empty(), PrivateBaseStateDiffHints.empty(), PublicDataHint.empty(), MembershipWitness.empty(ARCHIVE_HEIGHT), @@ -90,6 +96,8 @@ export class PublicBaseRollupHints { constructor( /** Partial state reference at the start of the rollup. */ public start: PartialStateReference, + /** Sponge state to absorb blob inputs at the start of the rollup. */ + public startSpongeBlob: SpongeBlob, /** Hints used while proving state diff validity. */ public stateDiffHints: PublicBaseStateDiffHints, /** @@ -107,7 +115,13 @@ export class PublicBaseRollupHints { } static getFields(fields: FieldsOf) { - return [fields.start, fields.stateDiffHints, fields.archiveRootMembershipWitness, fields.constants] as const; + return [ + fields.start, + fields.startSpongeBlob, + fields.stateDiffHints, + fields.archiveRootMembershipWitness, + fields.constants, + ] as const; } /** @@ -130,6 +144,7 @@ export class PublicBaseRollupHints { const reader = BufferReader.asReader(buffer); return new PublicBaseRollupHints( reader.readObject(PartialStateReference), + reader.readObject(SpongeBlob), reader.readObject(PublicBaseStateDiffHints), MembershipWitness.fromBuffer(reader, ARCHIVE_HEIGHT), reader.readObject(ConstantRollupData), @@ -143,6 +158,7 @@ export class PublicBaseRollupHints { static empty() { return new PublicBaseRollupHints( PartialStateReference.empty(), + SpongeBlob.empty(), PublicBaseStateDiffHints.empty(), MembershipWitness.empty(ARCHIVE_HEIGHT), ConstantRollupData.empty(), diff --git a/yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs_test.ts b/yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs.test.ts similarity index 100% rename from yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs_test.ts rename to yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs.test.ts diff --git a/yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs.ts b/yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs.ts index 00eeb3666a7..6b53806f48b 100644 --- a/yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs.ts +++ b/yarn-project/circuits.js/src/structs/rollup/block_root_or_block_merge_public_inputs.ts @@ -6,6 +6,7 @@ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string'; import { type FieldsOf } from '@aztec/foundation/types'; import { AZTEC_MAX_EPOCH_DURATION } from '../../constants.gen.js'; +import { BlockBlobPublicInputs } from '../blob_public_inputs.js'; import { GlobalVariables } from '../global_variables.js'; import { AppendOnlyTreeSnapshot } from './append_only_tree_snapshot.js'; @@ -59,6 +60,10 @@ export class BlockRootOrBlockMergePublicInputs { * TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 */ public proverId: Fr, + /** + * Public inputs required to verify a blob (challenge point z, evaluation y = p(z), and the commitment to p() for each blob) + */ + public blobPublicInputs: Tuple, ) {} /** @@ -80,6 +85,7 @@ export class BlockRootOrBlockMergePublicInputs { Fr.fromBuffer(reader), Fr.fromBuffer(reader), Fr.fromBuffer(reader), + reader.readArray(AZTEC_MAX_EPOCH_DURATION, BlockBlobPublicInputs), ); } @@ -100,6 +106,7 @@ export class BlockRootOrBlockMergePublicInputs { this.vkTreeRoot, this.protocolContractTreeRoot, this.proverId, + this.blobPublicInputs, ); } diff --git a/yarn-project/circuits.js/src/structs/rollup/block_root_rollup.ts b/yarn-project/circuits.js/src/structs/rollup/block_root_rollup.ts index 18c1c289cb2..d12e42a5416 100644 --- a/yarn-project/circuits.js/src/structs/rollup/block_root_rollup.ts +++ b/yarn-project/circuits.js/src/structs/rollup/block_root_rollup.ts @@ -6,6 +6,8 @@ import { type FieldsOf } from '@aztec/foundation/types'; import { ARCHIVE_HEIGHT, + BLOBS_PER_BLOCK, + FIELDS_PER_BLOB, L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH, NESTED_RECURSIVE_PROOF_LENGTH, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, @@ -55,6 +57,22 @@ export class BlockRootRollupInputs { * TODO(#7346): Temporarily added prover_id while we verify block-root proofs on L1 */ public proverId: Fr, + /** + * Flat list of all tx effects which will be added to the blob. + * Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + * Tuple + */ + public blobFields: Fr[], + /** + * KZG commitments representing the blob (precomputed in ts, injected to use inside circuit). + * TODO(Miranda): Rename to kzg_commitment to match BlobPublicInputs? + */ + public blobCommitments: Tuple, typeof BLOBS_PER_BLOCK>, + /** + * The hash of eth blob hashes for this block + * See yarn-project/foundation/src/blob/index.ts or body.ts for calculation + */ + public blobsHash: Fr, ) {} /** @@ -98,6 +116,9 @@ export class BlockRootRollupInputs { fields.newArchiveSiblingPath, fields.previousBlockHash, fields.proverId, + fields.blobFields, + fields.blobCommitments, + fields.blobsHash, ] as const; } @@ -118,6 +139,11 @@ export class BlockRootRollupInputs { reader.readArray(ARCHIVE_HEIGHT, Fr), Fr.fromBuffer(reader), Fr.fromBuffer(reader), + // Below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + // reader.readArray(FIELDS_PER_BLOB, Fr), + Array.from({ length: FIELDS_PER_BLOB * BLOBS_PER_BLOCK }, () => Fr.fromBuffer(reader)), + reader.readArray(BLOBS_PER_BLOCK, { fromBuffer: () => reader.readArray(2, Fr) }), + Fr.fromBuffer(reader), ); } diff --git a/yarn-project/circuits.js/src/structs/rollup/root_rollup.test.ts b/yarn-project/circuits.js/src/structs/rollup/root_rollup.test.ts index 3b26ccb1cf9..7a10ef1d431 100644 --- a/yarn-project/circuits.js/src/structs/rollup/root_rollup.test.ts +++ b/yarn-project/circuits.js/src/structs/rollup/root_rollup.test.ts @@ -1,3 +1,4 @@ +import { ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH } from '../../constants.gen.js'; import { makeRootRollupPublicInputs } from '../../tests/factories.js'; import { RootRollupPublicInputs } from './root_rollup.js'; @@ -15,4 +16,10 @@ describe('structs/root_rollup', () => { const res = RootRollupPublicInputs.fromString(str); expect(res).toEqual(expected); }); + + it(`serializes a RootRollupPublicInputs to fields and matches constant`, () => { + const expected = makeRootRollupPublicInputs(); + const fields = expected.toFields(); + expect(fields.length).toBe(ROOT_ROLLUP_PUBLIC_INPUTS_LENGTH); + }); }); diff --git a/yarn-project/circuits.js/src/structs/rollup/root_rollup.ts b/yarn-project/circuits.js/src/structs/rollup/root_rollup.ts index 180bfbdcc30..1398b68e08a 100644 --- a/yarn-project/circuits.js/src/structs/rollup/root_rollup.ts +++ b/yarn-project/circuits.js/src/structs/rollup/root_rollup.ts @@ -5,6 +5,7 @@ import { bufferToHex, hexToBuffer } from '@aztec/foundation/string'; import { type FieldsOf } from '@aztec/foundation/types'; import { AZTEC_MAX_EPOCH_DURATION } from '../../constants.gen.js'; +import { BlockBlobPublicInputs } from '../blob_public_inputs.js'; import { AppendOnlyTreeSnapshot } from './append_only_tree_snapshot.js'; import { FeeRecipient } from './block_root_or_block_merge_public_inputs.js'; import { PreviousRollupBlockData } from './previous_rollup_block_data.js'; @@ -111,6 +112,7 @@ export class RootRollupPublicInputs { public vkTreeRoot: Fr, public protocolContractTreeRoot: Fr, public proverId: Fr, + public blobPublicInputs: Tuple, ) {} static getFields(fields: FieldsOf) { @@ -126,6 +128,7 @@ export class RootRollupPublicInputs { fields.vkTreeRoot, fields.protocolContractTreeRoot, fields.proverId, + fields.blobPublicInputs, ] as const; } @@ -160,6 +163,7 @@ export class RootRollupPublicInputs { Fr.fromBuffer(reader), Fr.fromBuffer(reader), Fr.fromBuffer(reader), + reader.readArray(AZTEC_MAX_EPOCH_DURATION, BlockBlobPublicInputs), ); } diff --git a/yarn-project/circuits.js/src/structs/sponge_blob.test.ts b/yarn-project/circuits.js/src/structs/sponge_blob.test.ts new file mode 100644 index 00000000000..574eb15f69c --- /dev/null +++ b/yarn-project/circuits.js/src/structs/sponge_blob.test.ts @@ -0,0 +1,55 @@ +import { poseidon2Hash } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; + +import { SPONGE_BLOB_LENGTH } from '../constants.gen.js'; +import { makeSpongeBlob } from '../tests/factories.js'; +import { SpongeBlob } from './sponge_blob.js'; + +describe('SpongeBlob', () => { + let spongeBlob: SpongeBlob; + + beforeAll(() => { + spongeBlob = makeSpongeBlob(1); + }); + + it('serializes to buffer and deserializes it back', () => { + const buffer = spongeBlob.toBuffer(); + const res = SpongeBlob.fromBuffer(buffer); + expect(res).toEqual(spongeBlob); + }); + + it('serializes to field array and deserializes it back', () => { + const fieldArray = spongeBlob.toFields(); + const res = SpongeBlob.fromFields(fieldArray); + expect(res).toEqual(spongeBlob); + }); + + it('number of fields matches constant', () => { + const fields = spongeBlob.sponge.cache.concat([ + ...spongeBlob.sponge.state, + new Fr(spongeBlob.sponge.cacheSize), + new Fr(spongeBlob.sponge.squeezeMode), + new Fr(spongeBlob.fields), + new Fr(spongeBlob.expectedFields), + ]); + expect(fields.length).toBe(SPONGE_BLOB_LENGTH); + }); + + it('matches an ordinary short poseidon2 hash', () => { + spongeBlob = SpongeBlob.init(4); + const input = [Fr.ONE, new Fr(2), new Fr(3), new Fr(4)]; + spongeBlob.absorb(input); + const expectedHash = poseidon2Hash(input); + const res = spongeBlob.squeeze(); + expect(res).toEqual(expectedHash); + }); + + it('matches an ordinary long poseidon2 hash', () => { + spongeBlob = SpongeBlob.init(4096); + const input = Array(4096).fill(new Fr(3)); + spongeBlob.absorb(input); + const expectedHash = poseidon2Hash(input); + const res = spongeBlob.squeeze(); + expect(res).toEqual(expectedHash); + }); +}); diff --git a/yarn-project/circuits.js/src/structs/sponge_blob.ts b/yarn-project/circuits.js/src/structs/sponge_blob.ts new file mode 100644 index 00000000000..c17bdee3915 --- /dev/null +++ b/yarn-project/circuits.js/src/structs/sponge_blob.ts @@ -0,0 +1,178 @@ +import { type FieldsOf, makeTuple } from '@aztec/foundation/array'; +import { poseidon2Permutation } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; +import { + BufferReader, + FieldReader, + type Tuple, + serializeToBuffer, + serializeToFields, +} from '@aztec/foundation/serialize'; + +/** + * A Poseidon2 sponge used to accumulate data that will be added to a blob. + * See noir-projects/noir-protocol-circuits/crates/types/src/abis/sponge_blob.nr. + */ +export class SpongeBlob { + constructor( + /** Sponge with absorbed tx effects that will go into a blob. */ + public readonly sponge: Poseidon2Sponge, + /** Number of effects absorbed so far. */ + public fields: number, + /** Number of effects that will be absorbed. */ + public readonly expectedFields: number, + ) {} + + static fromBuffer(buffer: Buffer | BufferReader): SpongeBlob { + const reader = BufferReader.asReader(buffer); + return new SpongeBlob(reader.readObject(Poseidon2Sponge), reader.readNumber(), reader.readNumber()); + } + + toBuffer() { + return serializeToBuffer(this.sponge, this.fields, this.expectedFields); + } + + static getFields(fields: FieldsOf) { + return [fields.sponge, fields.fields, fields.expectedFields]; + } + + toFields(): Fr[] { + return serializeToFields(...SpongeBlob.getFields(this)); + } + + static fromFields(fields: Fr[] | FieldReader): SpongeBlob { + const reader = FieldReader.asReader(fields); + return new SpongeBlob( + reader.readObject(Poseidon2Sponge), + reader.readField().toNumber(), + reader.readField().toNumber(), + ); + } + + clone() { + return SpongeBlob.fromBuffer(this.toBuffer()); + } + + absorb(fields: Fr[]) { + if (this.fields + fields.length > this.expectedFields) { + throw new Error( + `Attempted to fill spongeblob with ${this.fields + fields.length}, but it has a max of ${this.expectedFields}`, + ); + } + this.sponge.absorb(fields); + this.fields += fields.length; + } + + squeeze(): Fr { + // If the blob sponge is not 'full', we append 1 to match Poseidon2::hash_internal() + // NB: There is currently no use case in which we don't 'fill' a blob sponge, but adding for completeness + if (this.fields != this.expectedFields) { + this.sponge.absorb([Fr.ONE]); + } + return this.sponge.squeeze(); + } + + static empty(): SpongeBlob { + return new SpongeBlob(Poseidon2Sponge.empty(), 0, 0); + } + + static init(expectedFields: number): SpongeBlob { + return new SpongeBlob(Poseidon2Sponge.init(expectedFields), 0, expectedFields); + } +} + +// This is just noir's stdlib version of the poseidon2 sponge. We use it for a blob-specific implmentation of the hasher. +export class Poseidon2Sponge { + constructor( + public cache: Tuple, + public state: Tuple, + public cacheSize: number, + public squeezeMode: boolean, + ) {} + + static fromBuffer(buffer: Buffer | BufferReader): Poseidon2Sponge { + const reader = BufferReader.asReader(buffer); + return new Poseidon2Sponge( + reader.readArray(3, Fr), + reader.readArray(4, Fr), + reader.readNumber(), + reader.readBoolean(), + ); + } + + toBuffer() { + return serializeToBuffer(this.cache, this.state, this.cacheSize, this.squeezeMode); + } + + static getFields(fields: FieldsOf) { + return [fields.cache, fields.state, fields.cacheSize, fields.squeezeMode]; + } + + toFields(): Fr[] { + return serializeToFields(...Poseidon2Sponge.getFields(this)); + } + + static fromFields(fields: Fr[] | FieldReader): Poseidon2Sponge { + const reader = FieldReader.asReader(fields); + return new Poseidon2Sponge( + reader.readFieldArray(3), + reader.readFieldArray(4), + reader.readField().toNumber(), + reader.readBoolean(), + ); + } + + static empty(): Poseidon2Sponge { + return new Poseidon2Sponge( + makeTuple(3, () => Fr.ZERO), + makeTuple(4, () => Fr.ZERO), + 0, + false, + ); + } + + static init(expectedFields: number): Poseidon2Sponge { + const iv = new Fr(expectedFields).mul(new Fr(BigInt('18446744073709551616'))); + const sponge = Poseidon2Sponge.empty(); + sponge.state[3] = iv; + return sponge; + } + + // Note: there isn't currently an impl in ts that allows for a custom aborption via an + // existing sponge. + // A custom blob-based impl of noir/noir-repo/noir_stdlib/src/hash/poseidon2.nr + performDuplex() { + for (let i = 0; i < this.cache.length; i++) { + if (i < this.cacheSize) { + this.state[i] = this.state[i].add(this.cache[i]); + } + } + const perm = poseidon2Permutation(this.state); + // ts doesn't understand that the above always gives 4 + this.state = [perm[0], perm[1], perm[2], perm[3]]; + } + + absorb(fields: Fr[]) { + if (this.squeezeMode) { + throw new Error(`Poseidon sponge is not able to absorb more inputs.`); + } + fields.forEach(field => { + if (this.cacheSize == this.cache.length) { + this.performDuplex(); + this.cache[0] = field; + this.cacheSize = 1; + } else { + this.cache[this.cacheSize++] = field; + } + }); + } + + squeeze(): Fr { + if (this.squeezeMode) { + throw new Error(`Poseidon sponge has already been squeezed.`); + } + this.performDuplex(); + this.squeezeMode = true; + return this.state[0]; + } +} diff --git a/yarn-project/circuits.js/src/structs/tagging_secret.ts b/yarn-project/circuits.js/src/structs/tagging_secret.ts deleted file mode 100644 index 97371fe7a8b..00000000000 --- a/yarn-project/circuits.js/src/structs/tagging_secret.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { type AztecAddress } from '@aztec/foundation/aztec-address'; -import { poseidon2Hash } from '@aztec/foundation/crypto'; -import { Fr } from '@aztec/foundation/fields'; - -export class IndexedTaggingSecret { - constructor(public secret: Fr, public index: number) {} - - toFields(): Fr[] { - return [this.secret, new Fr(this.index)]; - } - - static fromFields(serialized: Fr[]) { - return new this(serialized[0], serialized[1].toNumber()); - } - - computeTag(recipient: AztecAddress) { - return poseidon2Hash([this.secret, recipient, this.index]); - } - - computeSiloedTag(recipient: AztecAddress, contractAddress: AztecAddress) { - const tag = this.computeTag(recipient); - return poseidon2Hash([contractAddress, tag]); - } -} diff --git a/yarn-project/circuits.js/src/structs/tx_request.test.ts b/yarn-project/circuits.js/src/structs/tx_request.test.ts index 8c97cd8e0f4..fec6fab23b7 100644 --- a/yarn-project/circuits.js/src/structs/tx_request.test.ts +++ b/yarn-project/circuits.js/src/structs/tx_request.test.ts @@ -2,7 +2,8 @@ import { FunctionSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { randomInt } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; -import { setupCustomSnapshotSerializers, updateInlineTestData } from '@aztec/foundation/testing'; +import { setupCustomSnapshotSerializers } from '@aztec/foundation/testing'; +import { updateInlineTestData } from '@aztec/foundation/testing/files'; import { TX_REQUEST_LENGTH } from '../constants.gen.js'; import { makeTxRequest } from '../tests/factories.js'; @@ -34,7 +35,7 @@ describe('TxRequest', () => { }); it('compute hash', () => { - const gasSettings = new GasSettings(new Gas(2, 2), new Gas(1, 1), new GasFees(3, 3)); + const gasSettings = new GasSettings(new Gas(2, 2), new Gas(1, 1), new GasFees(4, 4), new GasFees(3, 3)); const txRequest = TxRequest.from({ origin: AztecAddress.fromBigInt(1n), functionData: new FunctionData(FunctionSelector.fromField(new Fr(2n)), /*isPrivate=*/ true), diff --git a/yarn-project/circuits.js/src/tests/factories.ts b/yarn-project/circuits.js/src/tests/factories.ts index aa47b2becc3..a606dfb8684 100644 --- a/yarn-project/circuits.js/src/tests/factories.ts +++ b/yarn-project/circuits.js/src/tests/factories.ts @@ -24,6 +24,7 @@ import { AvmCircuitInputs, AvmContractInstanceHint, AvmExecutionHints, + BLOBS_PER_BLOCK, BaseOrMergeRollupPublicInputs, BaseParityInputs, CallContext, @@ -32,6 +33,7 @@ import { ConstantRollupData, ContractStorageRead, ContractStorageUpdateRequest, + FIELDS_PER_BLOB, Fr, FunctionData, FunctionSelector, @@ -131,7 +133,10 @@ import { AvmProofData, AvmPublicDataReadTreeHint, AvmPublicDataWriteTreeHint, + BlobPublicInputs, + BlockBlobPublicInputs, CountedPublicCallRequest, + Poseidon2Sponge, PrivateBaseRollupHints, PrivateBaseRollupInputs, PrivateBaseStateDiffHints, @@ -148,6 +153,7 @@ import { PublicDataWrite, PublicTubeData, ScopedL2ToL1Message, + SpongeBlob, TreeSnapshots, TxConstantData, VkWitnessData, @@ -632,6 +638,36 @@ export function makeAppendOnlyTreeSnapshot(seed = 1): AppendOnlyTreeSnapshot { return new AppendOnlyTreeSnapshot(fr(seed), seed); } +/** + * Makes arbitrary poseidon sponge for blob inputs. + * Note: will not verify inside the circuit. + * @param seed - The seed to use for generating the sponge. + * @returns A sponge blob instance. + */ +export function makeSpongeBlob(seed = 1): SpongeBlob { + return new SpongeBlob(new Poseidon2Sponge(makeTuple(3, fr), makeTuple(4, fr), 1, false), seed, seed + 1); +} + +/** + * Makes arbitrary blob public inputs. + * Note: will not verify inside the circuit. + * @param seed - The seed to use for generating the blob inputs. + * @returns A blob public inputs instance. + */ +export function makeBlobPublicInputs(seed = 1): BlobPublicInputs { + return new BlobPublicInputs(fr(seed), BigInt(seed + 1), makeTuple(2, fr)); +} + +/** + * Makes arbitrary block blob public inputs. + * Note: will not verify inside the circuit. + * @param seed - The seed to use for generating the blob inputs. + * @returns A block blob public inputs instance. + */ +export function makeBlockBlobPublicInputs(seed = 1): BlockBlobPublicInputs { + return new BlockBlobPublicInputs(makeTuple(BLOBS_PER_BLOCK, () => makeBlobPublicInputs(seed))); +} + /** * Makes arbitrary eth address. * @param seed - The seed to use for generating the eth address. @@ -685,10 +721,11 @@ export function makeBaseOrMergeRollupPublicInputs( makeConstantBaseRollupData(seed + 0x200, globalVariables), makePartialStateReference(seed + 0x300), makePartialStateReference(seed + 0x400), + makeSpongeBlob(seed + 0x500), + makeSpongeBlob(seed + 0x600), fr(seed + 0x901), fr(seed + 0x902), fr(seed + 0x903), - fr(seed + 0x904), ); } @@ -714,6 +751,7 @@ export function makeBlockRootOrBlockMergeRollupPublicInputs( fr(seed + 0x800), fr(seed + 0x801), fr(seed + 0x900), + makeTuple(AZTEC_MAX_EPOCH_DURATION, () => makeBlockBlobPublicInputs(seed), 0x100), ); } @@ -783,6 +821,9 @@ export function makeBlockRootRollupInputs(seed = 0, globalVariables?: GlobalVari makeTuple(ARCHIVE_HEIGHT, fr, 0x2300), fr(seed + 0x2400), fr(seed + 0x2500), + makeTuple(FIELDS_PER_BLOB * BLOBS_PER_BLOCK, fr, 0x2400), + makeTuple(BLOBS_PER_BLOCK, () => makeTuple(2, fr, 0x2500)), + fr(seed + 0x2600), ); } @@ -859,16 +900,17 @@ export function makeRootRollupPublicInputs(seed = 0): RootRollupPublicInputs { fr(seed + 0x100), fr(seed + 0x101), fr(seed + 0x200), + makeTuple(AZTEC_MAX_EPOCH_DURATION, () => makeBlockBlobPublicInputs(seed), 0x300), ); } /** * Makes content commitment */ -export function makeContentCommitment(seed = 0, txsEffectsHash: Buffer | undefined = undefined): ContentCommitment { +export function makeContentCommitment(seed = 0): ContentCommitment { return new ContentCommitment( new Fr(seed), - txsEffectsHash ?? toBufferBE(BigInt(seed + 0x100), NUM_BYTES_PER_SHA256), + toBufferBE(BigInt(seed + 0x100), NUM_BYTES_PER_SHA256), toBufferBE(BigInt(seed + 0x200), NUM_BYTES_PER_SHA256), toBufferBE(BigInt(seed + 0x300), NUM_BYTES_PER_SHA256), ); @@ -881,11 +923,10 @@ export function makeHeader( seed = 0, blockNumber: number | undefined = undefined, slotNumber: number | undefined = undefined, - txsEffectsHash: Buffer | undefined = undefined, ): BlockHeader { return new BlockHeader( makeAppendOnlyTreeSnapshot(seed + 0x100), - makeContentCommitment(seed + 0x200, txsEffectsHash), + makeContentCommitment(seed + 0x200), makeStateReference(seed + 0x600), makeGlobalVariables((seed += 0x700), { ...(blockNumber ? { blockNumber: new Fr(blockNumber) } : {}), @@ -1090,6 +1131,8 @@ function makePrivateTubeData(seed = 1, kernelPublicInputs?: KernelCircuitPublicI function makePrivateBaseRollupHints(seed = 1) { const start = makePartialStateReference(seed + 0x100); + const startSpongeBlob = makeSpongeBlob(seed + 0x200); + const stateDiffHints = makePrivateBaseStateDiffHints(seed + 0x600); const archiveRootMembershipWitness = makeMembershipWitness(ARCHIVE_HEIGHT, seed + 0x9000); @@ -1100,6 +1143,7 @@ function makePrivateBaseRollupHints(seed = 1) { return PrivateBaseRollupHints.from({ start, + startSpongeBlob, stateDiffHints, archiveRootMembershipWitness, constants, @@ -1110,6 +1154,8 @@ function makePrivateBaseRollupHints(seed = 1) { function makePublicBaseRollupHints(seed = 1) { const start = makePartialStateReference(seed + 0x100); + const startSpongeBlob = makeSpongeBlob(seed + 0x200); + const stateDiffHints = makePublicBaseStateDiffHints(seed + 0x600); const archiveRootMembershipWitness = makeMembershipWitness(ARCHIVE_HEIGHT, seed + 0x9000); @@ -1118,6 +1164,7 @@ function makePublicBaseRollupHints(seed = 1) { return PublicBaseRollupHints.from({ start, + startSpongeBlob, stateDiffHints, archiveRootMembershipWitness, constants, diff --git a/yarn-project/circuits.js/src/types/public_keys.test.ts b/yarn-project/circuits.js/src/types/public_keys.test.ts index b4a21a9e2c0..e8068ff6c31 100644 --- a/yarn-project/circuits.js/src/types/public_keys.test.ts +++ b/yarn-project/circuits.js/src/types/public_keys.test.ts @@ -1,5 +1,5 @@ import { Fr, Point } from '@aztec/foundation/fields'; -import { updateInlineTestData } from '@aztec/foundation/testing'; +import { updateInlineTestData } from '@aztec/foundation/testing/files'; import { PublicKeys } from './public_keys.js'; diff --git a/yarn-project/circuits.js/tsconfig.json b/yarn-project/circuits.js/tsconfig.json index fb67f66550e..f37d6d829a8 100644 --- a/yarn-project/circuits.js/tsconfig.json +++ b/yarn-project/circuits.js/tsconfig.json @@ -16,5 +16,6 @@ "path": "../types" } ], - "include": ["src"] + "include": ["src"], + "exclude": ["src/scripts"] } diff --git a/yarn-project/cli-wallet/src/bin/index.ts b/yarn-project/cli-wallet/src/bin/index.ts index bcdbb4d50a1..1147134a56f 100644 --- a/yarn-project/cli-wallet/src/bin/index.ts +++ b/yarn-project/cli-wallet/src/bin/index.ts @@ -2,7 +2,6 @@ import { Fr, computeSecretHash, fileURLToPath } from '@aztec/aztec.js'; import { LOCALHOST } from '@aztec/cli/cli-utils'; import { type LogFn, createConsoleLogger, createLogger } from '@aztec/foundation/log'; import { AztecLmdbStore } from '@aztec/kv-store/lmdb'; -import { type PXEService } from '@aztec/pxe'; import { Argument, Command, Option } from 'commander'; import { readFileSync } from 'fs'; @@ -94,11 +93,6 @@ async function main() { await pxeWrapper.init(nodeUrl, join(dataDir, 'pxe')); } db.init(AztecLmdbStore.open(dataDir)); - }) - .hook('postAction', async () => { - if (pxeWrapper.getPXE()) { - await (pxeWrapper.getPXE() as PXEService).stop(); - } }); injectCommands(program, userLog, debugLogger, db, pxeWrapper); diff --git a/yarn-project/cli-wallet/src/cmds/bridge_fee_juice.ts b/yarn-project/cli-wallet/src/cmds/bridge_fee_juice.ts index b9aaee12f58..105f9c5b261 100644 --- a/yarn-project/cli-wallet/src/cmds/bridge_fee_juice.ts +++ b/yarn-project/cli-wallet/src/cmds/bridge_fee_juice.ts @@ -68,7 +68,7 @@ export async function bridgeL1FeeJuice( setTimeout(async () => { const witness = await pxe.getL1ToL2MembershipWitness( feeJuiceAddress, - Fr.fromString(messageHash), + Fr.fromHexString(messageHash), claimSecret, ); resolve(witness); diff --git a/yarn-project/cli-wallet/src/cmds/cancel_tx.ts b/yarn-project/cli-wallet/src/cmds/cancel_tx.ts index 2d6ae924075..222fb7501cb 100644 --- a/yarn-project/cli-wallet/src/cmds/cancel_tx.ts +++ b/yarn-project/cli-wallet/src/cmds/cancel_tx.ts @@ -1,17 +1,19 @@ import { type AccountWalletWithSecretKey, type FeePaymentMethod, SentTx, type TxHash, TxStatus } from '@aztec/aztec.js'; import { type FeeOptions } from '@aztec/aztec.js/entrypoint'; -import { type Fr, type GasSettings } from '@aztec/circuits.js'; +import { type Fr, GasFees, GasSettings } from '@aztec/circuits.js'; import { type LogFn } from '@aztec/foundation/log'; export async function cancelTx( wallet: AccountWalletWithSecretKey, { txHash, - gasSettings, + gasSettings: prevTxGasSettings, nonce, cancellable, }: { txHash: TxHash; gasSettings: GasSettings; nonce: Fr; cancellable: boolean }, paymentMethod: FeePaymentMethod, + increasedFees: GasFees, + maxFeesPerGas: GasFees | undefined, log: LogFn, ) { const receipt = await wallet.getTxReceipt(txHash); @@ -20,13 +22,20 @@ export async function cancelTx( return; } + const maxPriorityFeesPerGas = new GasFees( + prevTxGasSettings.maxPriorityFeesPerGas.feePerDaGas.add(increasedFees.feePerDaGas), + prevTxGasSettings.maxPriorityFeesPerGas.feePerL2Gas.add(increasedFees.feePerL2Gas), + ); + const fee: FeeOptions = { paymentMethod, - gasSettings, + gasSettings: GasSettings.from({ + ...prevTxGasSettings, + maxPriorityFeesPerGas, + maxFeesPerGas: maxFeesPerGas ?? prevTxGasSettings.maxFeesPerGas, + }), }; - // TODO(#9805): Increase max_priority_fee_per_gas. - const txRequest = await wallet.createTxExecutionRequest({ calls: [], fee, diff --git a/yarn-project/cli-wallet/src/cmds/check_tx.ts b/yarn-project/cli-wallet/src/cmds/check_tx.ts index 945c0b2a0cd..b586cd28ae2 100644 --- a/yarn-project/cli-wallet/src/cmds/check_tx.ts +++ b/yarn-project/cli-wallet/src/cmds/check_tx.ts @@ -1,5 +1,5 @@ import { type PXE, type TxHash } from '@aztec/aztec.js'; -import { inspectTx } from '@aztec/cli/utils'; +import { inspectTx } from '@aztec/cli/inspect'; import { type LogFn } from '@aztec/foundation/log'; export async function checkTx(client: PXE, txHash: TxHash, statusOnly: boolean, log: LogFn) { diff --git a/yarn-project/cli-wallet/src/cmds/index.ts b/yarn-project/cli-wallet/src/cmds/index.ts index 864aa34ec42..1915e080af7 100644 --- a/yarn-project/cli-wallet/src/cmds/index.ts +++ b/yarn-project/cli-wallet/src/cmds/index.ts @@ -1,6 +1,8 @@ import { getIdentities } from '@aztec/accounts/utils'; -import { TxHash, createCompatibleClient } from '@aztec/aztec.js'; -import { PublicKeys } from '@aztec/circuits.js'; +import { createCompatibleClient } from '@aztec/aztec.js/rpc'; +import { TxHash } from '@aztec/aztec.js/tx_hash'; +import { GasFees } from '@aztec/circuits.js'; +import { PublicKeys } from '@aztec/circuits.js/types'; import { ETHEREUM_HOST, PRIVATE_KEY, @@ -37,6 +39,7 @@ import { createProfileOption, createTypeOption, integerArgParser, + parseGasFees, parsePaymentMethod, } from '../utils/options/index.js'; import { type PXEWrapper } from '../utils/pxe_wrapper.js'; @@ -579,7 +582,7 @@ export function injectCommands( program .command('cancel-tx') - .description('Cancels a peding tx by reusing its nonce with a higher fee and an empty payload') + .description('Cancels a pending tx by reusing its nonce with a higher fee and an empty payload') .argument('', 'A transaction hash to cancel.', txHash => aliasedTxHashParser(txHash, db)) .addOption(pxeOption) .addOption( @@ -587,21 +590,30 @@ export function injectCommands( ) .addOption(createAccountOption('Alias or address of the account to simulate from', !db, db)) .addOption(FeeOpts.paymentMethodOption().default('method=none')) + .option( + '-i --increased-fees ', + 'The amounts by which the fees are increased', + value => parseGasFees(value), + new GasFees(1, 1), + ) + .option('--max-fees-per-gas ', 'Maximum fees per gas unit for DA and L2 computation.', value => + parseGasFees(value), + ) .action(async (txHash, options) => { const { cancelTx } = await import('./cancel_tx.js'); - const { from: parsedFromAddress, rpcUrl, secretKey, payment } = options; + const { from: parsedFromAddress, rpcUrl, secretKey, payment, increasedFees, maxFeesPerGas } = options; const client = pxeWrapper?.getPXE() ?? (await createCompatibleClient(rpcUrl, debugLogger)); const account = await createOrRetrieveAccount(client, parsedFromAddress, db, secretKey); const wallet = await getWalletWithScopes(account, db); const txData = db?.retrieveTxData(txHash); - if (!txData) { - throw new Error('Transaction data not found in the database, cannnot reuse nonce'); + throw new Error('Transaction data not found in the database, cannot reuse nonce'); } + const paymentMethod = await parsePaymentMethod(payment, log, db)(wallet); - await cancelTx(wallet, txData, paymentMethod, log); + await cancelTx(wallet, txData, paymentMethod, increasedFees, maxFeesPerGas, log); }); program diff --git a/yarn-project/cli-wallet/src/cmds/send.ts b/yarn-project/cli-wallet/src/cmds/send.ts index b87097ec125..5fcdfc3a3ba 100644 --- a/yarn-project/cli-wallet/src/cmds/send.ts +++ b/yarn-project/cli-wallet/src/cmds/send.ts @@ -50,8 +50,8 @@ export async function send( log('Transaction pending. Check status with check-tx'); } const gasSettings = GasSettings.from({ + ...feeOpts.gasSettings, ...gasLimits, - maxFeesPerGas: feeOpts.gasSettings.maxFeesPerGas, }); return { txHash, diff --git a/yarn-project/cli-wallet/src/utils/accounts.ts b/yarn-project/cli-wallet/src/utils/accounts.ts index 8dbca3df63b..33bdbc4a772 100644 --- a/yarn-project/cli-wallet/src/utils/accounts.ts +++ b/yarn-project/cli-wallet/src/utils/accounts.ts @@ -1,10 +1,10 @@ -import { getEcdsaRSSHAccount } from '@aztec/accounts/ecdsa'; -import { getSchnorrAccount } from '@aztec/accounts/schnorr'; import { getIdentities } from '@aztec/accounts/utils'; import { type AccountManager, type AccountWalletWithSecretKey } from '@aztec/aztec.js'; -import { AztecAddress, Fr, deriveSigningKey } from '@aztec/circuits.js'; +import { type PXE } from '@aztec/circuit-types/interfaces'; +import { deriveSigningKey } from '@aztec/circuits.js/keys'; +import { AztecAddress } from '@aztec/foundation/aztec-address'; +import { Fr } from '@aztec/foundation/fields'; -import { type PXE } from '../../../circuit-types/src/interfaces/pxe.js'; import { type WalletDB } from '../storage/wallet_db.js'; import { extractECDSAPublicKeyFromBase64String } from './ecdsa.js'; @@ -38,6 +38,7 @@ export async function createOrRetrieveAccount( switch (type) { case 'schnorr': { + const { getSchnorrAccount } = await import('@aztec/accounts/schnorr'); account = getSchnorrAccount(pxe, secretKey, deriveSigningKey(secretKey), salt); break; } @@ -58,6 +59,7 @@ export async function createOrRetrieveAccount( throw new Error('Public key must be provided for ECDSA SSH account'); } + const { getEcdsaRSSHAccount } = await import('@aztec/accounts/ecdsa'); account = getEcdsaRSSHAccount(pxe, secretKey, publicSigningKey, salt); break; } diff --git a/yarn-project/cli-wallet/src/utils/options/fees.ts b/yarn-project/cli-wallet/src/utils/options/fees.ts index fd7f7327432..fbb6afb53ad 100644 --- a/yarn-project/cli-wallet/src/utils/options/fees.ts +++ b/yarn-project/cli-wallet/src/utils/options/fees.ts @@ -1,14 +1,4 @@ -import { - type AccountWallet, - FeeJuicePaymentMethod, - FeeJuicePaymentMethodWithClaim, - type FeePaymentMethod, - NoFeePaymentMethod, - type PXE, - PrivateFeePaymentMethod, - PublicFeePaymentMethod, - type SendMethodOptions, -} from '@aztec/aztec.js'; +import { type AccountWallet, type FeePaymentMethod, type PXE, type SendMethodOptions } from '@aztec/aztec.js'; import { AztecAddress, Fr, Gas, GasFees, GasSettings } from '@aztec/circuits.js'; import { type LogFn } from '@aztec/foundation/log'; @@ -22,6 +12,7 @@ export type CliFeeArgs = { gasLimits?: string; payment?: string; maxFeesPerGas?: string; + maxPriorityFeesPerGas?: string; estimateGas?: boolean; }; @@ -79,7 +70,11 @@ export class FeeOpts implements IFeeOpts { return [ new Option('--gas-limits ', 'Gas limits for the tx.'), FeeOpts.paymentMethodOption(), - new Option('--max-fee-per-gas ', 'Maximum fee per gas unit for DA and L2 computation.'), + new Option('--max-fees-per-gas ', 'Maximum fees per gas unit for DA and L2 computation.'), + new Option( + '--max-priority-fees-per-gas ', + 'Maximum priority fees per gas unit for DA and L2 computation.', + ), new Option('--no-estimate-gas', 'Whether to automatically estimate gas limits for the tx.'), new Option('--estimate-gas-only', 'Only report gas estimation for the tx, do not send it.'), ]; @@ -87,22 +82,28 @@ export class FeeOpts implements IFeeOpts { static async fromCli(args: CliFeeArgs, pxe: PXE, log: LogFn, db?: WalletDB) { const estimateOnly = args.estimateGasOnly; - const gasFees = args.maxFeesPerGas - ? parseGasFees(args.maxFeesPerGas) - : { maxFeesPerGas: await pxe.getCurrentBaseFees() }; + const gasLimits = args.gasLimits ? parseGasLimits(args.gasLimits) : {}; + const maxFeesPerGas = args.maxFeesPerGas ? parseGasFees(args.maxFeesPerGas) : await pxe.getCurrentBaseFees(); + const maxPriorityFeesPerGas = args.maxPriorityFeesPerGas ? parseGasFees(args.maxPriorityFeesPerGas) : undefined; const gasSettings = GasSettings.default({ - ...gasFees, - ...(args.gasLimits ? parseGasLimits(args.gasLimits) : {}), + ...gasLimits, + maxFeesPerGas, + maxPriorityFeesPerGas, }); if (!args.gasLimits && !args.payment) { return new NoFeeOpts(estimateOnly, gasSettings); } + const defaultPaymentMethod = async () => { + const { NoFeePaymentMethod } = await import('@aztec/aztec.js/fee'); + return new NoFeePaymentMethod(); + }; + return new FeeOpts( estimateOnly, gasSettings, - args.payment ? parsePaymentMethod(args.payment, log, db) : () => Promise.resolve(new NoFeePaymentMethod()), + args.payment ? parsePaymentMethod(args.payment, log, db) : defaultPaymentMethod, !!args.estimateGas, ); } @@ -134,23 +135,20 @@ export function parsePaymentMethod( if (!parsed.asset) { throw new Error('Missing "asset" in payment option'); } - if (!parsed.feeRecipient) { - // Recipient of a fee in the refund flow - throw new Error('Missing "feeRecipient" in payment option'); - } const fpc = aliasedAddressParser('contracts', parsed.fpc, db); - const feeRecipient = AztecAddress.fromString(parsed.feeRecipient); - return [AztecAddress.fromString(parsed.asset), fpc, feeRecipient]; + return [AztecAddress.fromString(parsed.asset), fpc]; }; return async (sender: AccountWallet) => { switch (parsed.method) { - case 'none': + case 'none': { log('Using no fee payment'); + const { NoFeePaymentMethod } = await import('@aztec/aztec.js/fee'); return new NoFeePaymentMethod(); - case 'native': + } + case 'native': { if (parsed.claim || (parsed.claimSecret && parsed.claimAmount && parsed.messageLeafIndex)) { let claimAmount, claimSecret, messageLeafIndex; if (parsed.claim && db) { @@ -163,26 +161,29 @@ export function parsePaymentMethod( ({ claimAmount, claimSecret, messageLeafIndex } = parsed); } log(`Using Fee Juice for fee payments with claim for ${claimAmount} tokens`); + const { FeeJuicePaymentMethodWithClaim } = await import('@aztec/aztec.js/fee'); return new FeeJuicePaymentMethodWithClaim(sender.getAddress(), { - claimAmount: typeof claimAmount === 'string' ? Fr.fromString(claimAmount) : new Fr(claimAmount), - claimSecret: Fr.fromString(claimSecret), + claimAmount: typeof claimAmount === 'string' ? Fr.fromHexString(claimAmount) : new Fr(claimAmount), + claimSecret: Fr.fromHexString(claimSecret), messageLeafIndex: BigInt(messageLeafIndex), }); } else { log(`Using Fee Juice for fee payment`); + const { FeeJuicePaymentMethod } = await import('@aztec/aztec.js/fee'); return new FeeJuicePaymentMethod(sender.getAddress()); } + } case 'fpc-public': { const [asset, fpc] = getFpcOpts(parsed, db); log(`Using public fee payment with asset ${asset} via paymaster ${fpc}`); - return new PublicFeePaymentMethod(asset, fpc, sender); + const { PublicFeePaymentMethod } = await import('@aztec/aztec.js/fee'); + return new PublicFeePaymentMethod(fpc, sender); } case 'fpc-private': { - const [asset, fpc, feeRecipient] = getFpcOpts(parsed, db); - log( - `Using private fee payment with asset ${asset} via paymaster ${fpc} with rebate secret ${feeRecipient.toString()}`, - ); - return new PrivateFeePaymentMethod(asset, fpc, sender, feeRecipient); + const [asset, fpc] = getFpcOpts(parsed, db); + log(`Using private fee payment with asset ${asset} via paymaster ${fpc}`); + const { PrivateFeePaymentMethod } = await import('@aztec/aztec.js/fee'); + return new PrivateFeePaymentMethod(fpc, sender); } case undefined: throw new Error('Missing "method" in payment option'); @@ -212,7 +213,7 @@ function parseGasLimits(gasLimits: string): { gasLimits: Gas; teardownGasLimits: }; } -function parseGasFees(gasFees: string): { maxFeesPerGas: GasFees } { +export function parseGasFees(gasFees: string): GasFees { const parsed = gasFees.split(',').reduce((acc, fee) => { const [dimension, value] = fee.split('='); acc[dimension] = parseInt(value, 10); @@ -226,5 +227,5 @@ function parseGasFees(gasFees: string): { maxFeesPerGas: GasFees } { } } - return { maxFeesPerGas: new GasFees(parsed.da, parsed.l2) }; + return new GasFees(parsed.da, parsed.l2); } diff --git a/yarn-project/cli/package.json b/yarn-project/cli/package.json index ea86f4fdb5d..7a9d39d31f8 100644 --- a/yarn-project/cli/package.json +++ b/yarn-project/cli/package.json @@ -10,7 +10,9 @@ "./pxe": "./dest/cmds/pxe/index.js", "./cli-utils": "./dest/utils/index.js", "./misc": "./dest/cmds/misc/index.js", - "./utils": "./dest/utils/index.js" + "./setup-contracts": "./dest/cmds/misc/setup_contracts.js", + "./utils": "./dest/utils/index.js", + "./inspect": "./dest/utils/inspect.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/cli/src/cmds/contracts/inspect_contract.ts b/yarn-project/cli/src/cmds/contracts/inspect_contract.ts index f1d4bbbb8ed..0c79238ae00 100644 --- a/yarn-project/cli/src/cmds/contracts/inspect_contract.ts +++ b/yarn-project/cli/src/cmds/contracts/inspect_contract.ts @@ -25,10 +25,18 @@ export async function inspectContract(contractArtifactFile: string, debugLogger: log(`\tprivate function tree root: ${contractClass.privateFunctionsRoot.toString()}`); log(`\tpublic bytecode commitment: ${contractClass.publicBytecodeCommitment.toString()}`); log(`\tpublic bytecode length: ${contractClass.packedBytecode.length} bytes (${bytecodeLengthInFields} fields)`); - log(`\nExternal functions:`); - contractFns.filter(f => !f.isInternal).forEach(f => logFunction(f, log)); - log(`\nInternal functions:`); - contractFns.filter(f => f.isInternal).forEach(f => logFunction(f, log)); + + const externalFunctions = contractFns.filter(f => !f.isInternal); + if (externalFunctions.length > 0) { + log(`\nExternal functions:`); + externalFunctions.forEach(f => logFunction(f, log)); + } + + const internalFunctions = contractFns.filter(f => f.isInternal); + if (internalFunctions.length > 0) { + log(`\nInternal functions:`); + internalFunctions.forEach(f => logFunction(f, log)); + } } function logFunction(fn: FunctionArtifact, log: LogFn) { diff --git a/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts b/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts index a02d5398051..fe8059e0203 100644 --- a/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts +++ b/yarn-project/cli/src/cmds/devnet/bootstrap_network.ts @@ -1,6 +1,13 @@ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; -import { BatchCall, type PXE, type WaitOpts, type Wallet, createCompatibleClient, retryUntil } from '@aztec/aztec.js'; -import { L1FeeJuicePortalManager } from '@aztec/aztec.js'; +import { + BatchCall, + L1FeeJuicePortalManager, + type PXE, + type WaitOpts, + type Wallet, + createCompatibleClient, + retryUntil, +} from '@aztec/aztec.js'; import { type AztecAddress, type EthAddress, FEE_FUNDING_FOR_TESTER_ACCOUNT, Fq, Fr } from '@aztec/circuits.js'; import { type ContractArtifacts, @@ -22,7 +29,7 @@ type ContractDeploymentInfo = { const waitOpts: WaitOpts = { timeout: 120, - provenTimeout: 1200, + provenTimeout: 4800, interval: 1, }; @@ -54,8 +61,8 @@ export async function bootstrapNetwork( await initPortal(pxe, l1Clients, erc20Address, portalAddress, bridge.address); - const feeRecipient = wallet.getAddress(); - const fpc = await deployFPC(wallet, token.address, feeRecipient); + const fpcAdmin = wallet.getAddress(); + const fpc = await deployFPC(wallet, token.address, fpcAdmin); const counter = await deployCounter(wallet); // NOTE: Disabling for now in order to get devnet running @@ -154,7 +161,10 @@ async function deployToken( ): Promise<{ token: ContractDeploymentInfo; bridge: ContractDeploymentInfo }> { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment - const { TokenContract, TokenBridgeContract } = await import('@aztec/noir-contracts.js'); + const { TokenContract } = await import('@aztec/noir-contracts.js/Token'); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment + const { TokenBridgeContract } = await import('@aztec/noir-contracts.js/TokenBridge'); const devCoin = await TokenContract.deploy(wallet, wallet.getAddress(), 'DevCoin', 'DEV', 18) .send({ universalDeploy: true }) .deployed(waitOpts); @@ -212,14 +222,12 @@ async function initPortal( async function deployFPC( wallet: Wallet, tokenAddress: AztecAddress, - feeRecipient: AztecAddress, + admin: AztecAddress, ): Promise { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment - const { FPCContract } = await import('@aztec/noir-contracts.js'); - const fpc = await FPCContract.deploy(wallet, tokenAddress, feeRecipient) - .send({ universalDeploy: true }) - .deployed(waitOpts); + const { FPCContract } = await import('@aztec/noir-contracts.js/FPC'); + const fpc = await FPCContract.deploy(wallet, tokenAddress, admin).send({ universalDeploy: true }).deployed(waitOpts); const info: ContractDeploymentInfo = { address: fpc.address, initHash: fpc.instance.initializationHash, @@ -231,7 +239,7 @@ async function deployFPC( async function deployCounter(wallet: Wallet): Promise { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment - const { CounterContract } = await import('@aztec/noir-contracts.js'); + const { CounterContract } = await import('@aztec/noir-contracts.js/Counter'); const counter = await CounterContract.deploy(wallet, 1, wallet.getAddress()) .send({ universalDeploy: true }) .deployed(waitOpts); @@ -253,7 +261,10 @@ async function fundFPC( ) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment - const { FeeJuiceContract, CounterContract } = await import('@aztec/noir-contracts.js'); + const { FeeJuiceContract } = await import('@aztec/noir-contracts.js/FeeJuice'); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment + const { CounterContract } = await import('@aztec/noir-contracts.js/Counter'); const { protocolContractAddresses: { feeJuice }, } = await wallet.getPXEInfo(); @@ -274,7 +285,12 @@ async function fundFPC( true, ); - await retryUntil(async () => await wallet.isL1ToL2MessageSynced(Fr.fromString(messageHash)), 'message sync', 600, 1); + await retryUntil( + async () => await wallet.isL1ToL2MessageSynced(Fr.fromHexString(messageHash)), + 'message sync', + 600, + 1, + ); const counter = await CounterContract.at(counterAddress, wallet); diff --git a/yarn-project/cli/src/cmds/l1/prover_stats.ts b/yarn-project/cli/src/cmds/l1/prover_stats.ts index 424b37b50bb..f30a3be2710 100644 --- a/yarn-project/cli/src/cmds/l1/prover_stats.ts +++ b/yarn-project/cli/src/cmds/l1/prover_stats.ts @@ -181,7 +181,7 @@ async function getL2BlockEvents( name: 'L2BlockProposed', }), fromBlock: blockNum, - toBlock: end + 1n, // the toBlock argument in getLogs is exclusive + toBlock: end, }); events.push(...newEvents); diff --git a/yarn-project/cli/src/cmds/misc/example_contracts.ts b/yarn-project/cli/src/cmds/misc/example_contracts.ts index c2f9d172b45..1c012f59f0c 100644 --- a/yarn-project/cli/src/cmds/misc/example_contracts.ts +++ b/yarn-project/cli/src/cmds/misc/example_contracts.ts @@ -1,9 +1,12 @@ import { type LogFn } from '@aztec/foundation/log'; -import { getExampleContractArtifacts } from '../../utils/aztec.js'; +import { getExampleContractNames } from '../../utils/aztec.js'; export async function exampleContracts(log: LogFn) { - const abisList = await getExampleContractArtifacts(); - const names = Object.keys(abisList).filter(name => name !== 'AvmTestContractArtifact'); - names.forEach(name => log(name)); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment + return (await getExampleContractNames()) + .filter(name => name !== 'AvmTest') + .sort() + .forEach(name => log(name)); } diff --git a/yarn-project/cli/src/cmds/misc/index.ts b/yarn-project/cli/src/cmds/misc/index.ts index addfbc8283f..b716dd3ad65 100644 --- a/yarn-project/cli/src/cmds/misc/index.ts +++ b/yarn-project/cli/src/cmds/misc/index.ts @@ -4,8 +4,6 @@ import { type Command } from 'commander'; import { prettyPrintJSON } from '../../utils/commands.js'; -export * from './setup_contracts.js'; - export function injectCommands(program: Command, log: LogFn) { program .command('generate-keys') diff --git a/yarn-project/cli/src/cmds/misc/setup_contracts.ts b/yarn-project/cli/src/cmds/misc/setup_contracts.ts index 70ea4b79dc6..d2d13c5ad1c 100644 --- a/yarn-project/cli/src/cmds/misc/setup_contracts.ts +++ b/yarn-project/cli/src/cmds/misc/setup_contracts.ts @@ -14,7 +14,7 @@ export async function setupCanonicalL2FeeJuice( ) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment - const { FeeJuiceContract } = await import('@aztec/noir-contracts.js'); + const { FeeJuiceContract } = await import('@aztec/noir-contracts.js/FeeJuice'); const feeJuiceContract = await FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, deployer); diff --git a/yarn-project/cli/src/cmds/pxe/get_block.ts b/yarn-project/cli/src/cmds/pxe/get_block.ts index d1584950ff1..f2951a9c8f6 100644 --- a/yarn-project/cli/src/cmds/pxe/get_block.ts +++ b/yarn-project/cli/src/cmds/pxe/get_block.ts @@ -3,29 +3,8 @@ import { type LogFn, type Logger } from '@aztec/foundation/log'; import { inspectBlock } from '../../utils/inspect.js'; -export async function getBlock( - rpcUrl: string, - maybeBlockNumber: number | undefined, - follow: boolean, - debugLogger: Logger, - log: LogFn, -) { +export async function getBlock(rpcUrl: string, maybeBlockNumber: number | undefined, debugLogger: Logger, log: LogFn) { const client = await createCompatibleClient(rpcUrl, debugLogger); const blockNumber = maybeBlockNumber ?? (await client.getBlockNumber()); await inspectBlock(client, blockNumber, log, { showTxs: true }); - - if (follow) { - let lastBlock = blockNumber; - setInterval(async () => { - const newBlock = await client.getBlockNumber(); - if (newBlock > lastBlock) { - const { blocks } = await client.getSyncStatus(); - if (blocks >= newBlock) { - log(''); - await inspectBlock(client, newBlock, log, { showTxs: true }); - lastBlock = newBlock; - } - } - }, 1000); - } } diff --git a/yarn-project/cli/src/cmds/pxe/get_node_info.ts b/yarn-project/cli/src/cmds/pxe/get_node_info.ts index d2972b9f1e6..329b2428297 100644 --- a/yarn-project/cli/src/cmds/pxe/get_node_info.ts +++ b/yarn-project/cli/src/cmds/pxe/get_node_info.ts @@ -1,7 +1,14 @@ import { type AztecNode, type PXE, createAztecNodeClient, createCompatibleClient } from '@aztec/aztec.js'; import { type LogFn, type Logger } from '@aztec/foundation/log'; -export async function getNodeInfo(rpcUrl: string, pxeRequest: boolean, debugLogger: Logger, log: LogFn) { +export async function getNodeInfo( + rpcUrl: string, + pxeRequest: boolean, + debugLogger: Logger, + json: boolean, + log: LogFn, + logJson: (output: any) => void, +) { let client: AztecNode | PXE; if (pxeRequest) { client = await createCompatibleClient(rpcUrl, debugLogger); @@ -9,26 +16,54 @@ export async function getNodeInfo(rpcUrl: string, pxeRequest: boolean, debugLogg client = createAztecNodeClient(rpcUrl); } const info = await client.getNodeInfo(); - log(`Node Version: ${info.nodeVersion}`); - log(`Chain Id: ${info.l1ChainId}`); - log(`Protocol Version: ${info.protocolVersion}`); - log(`Node ENR: ${info.enr}`); - log(`L1 Contract Addresses:`); - log(` Rollup Address: ${info.l1ContractAddresses.rollupAddress.toString()}`); - log(` Registry Address: ${info.l1ContractAddresses.registryAddress.toString()}`); - log(` L1 -> L2 Inbox Address: ${info.l1ContractAddresses.inboxAddress.toString()}`); - log(` L2 -> L1 Outbox Address: ${info.l1ContractAddresses.outboxAddress.toString()}`); - log(` Fee Juice Address: ${info.l1ContractAddresses.feeJuiceAddress.toString()}`); - log(` Staking Asset Address: ${info.l1ContractAddresses.stakingAssetAddress.toString()}`); - log(` Fee Juice Portal Address: ${info.l1ContractAddresses.feeJuicePortalAddress.toString()}`); - log(` CoinIssuer Address: ${info.l1ContractAddresses.coinIssuerAddress.toString()}`); - log(` RewardDistributor Address: ${info.l1ContractAddresses.rewardDistributorAddress.toString()}`); - log(` GovernanceProposer Address: ${info.l1ContractAddresses.governanceProposerAddress.toString()}`); - log(` Governance Address: ${info.l1ContractAddresses.governanceAddress.toString()}`); + if (json) { + logJson({ + nodeVersion: info.nodeVersion, + l1ChainId: info.l1ChainId, + protocolVersion: info.protocolVersion, + enr: info.enr, + l1ContractAddresses: { + rollup: info.l1ContractAddresses.rollupAddress.toString(), + registry: info.l1ContractAddresses.registryAddress.toString(), + inbox: info.l1ContractAddresses.inboxAddress.toString(), + outbox: info.l1ContractAddresses.outboxAddress.toString(), + feeJuice: info.l1ContractAddresses.feeJuiceAddress.toString(), + stakingAsset: info.l1ContractAddresses.stakingAssetAddress.toString(), + feeJuicePortal: info.l1ContractAddresses.feeJuicePortalAddress.toString(), + coinIssuer: info.l1ContractAddresses.coinIssuerAddress.toString(), + rewardDistributor: info.l1ContractAddresses.rewardDistributorAddress.toString(), + governanceProposer: info.l1ContractAddresses.governanceProposerAddress.toString(), + governance: info.l1ContractAddresses.governanceAddress.toString(), + }, + protocolContractAddresses: { + classRegisterer: info.protocolContractAddresses.classRegisterer.toString(), + feeJuice: info.protocolContractAddresses.feeJuice.toString(), + instanceDeployer: info.protocolContractAddresses.instanceDeployer.toString(), + multiCallEntrypoint: info.protocolContractAddresses.multiCallEntrypoint.toString(), + }, + }); + } else { + log(`Node Version: ${info.nodeVersion}`); + log(`Chain Id: ${info.l1ChainId}`); + log(`Protocol Version: ${info.protocolVersion}`); + log(`Node ENR: ${info.enr}`); + log(`L1 Contract Addresses:`); + log(` Rollup Address: ${info.l1ContractAddresses.rollupAddress.toString()}`); + log(` Registry Address: ${info.l1ContractAddresses.registryAddress.toString()}`); + log(` L1 -> L2 Inbox Address: ${info.l1ContractAddresses.inboxAddress.toString()}`); + log(` L2 -> L1 Outbox Address: ${info.l1ContractAddresses.outboxAddress.toString()}`); + log(` Fee Juice Address: ${info.l1ContractAddresses.feeJuiceAddress.toString()}`); + log(` Staking Asset Address: ${info.l1ContractAddresses.stakingAssetAddress.toString()}`); + log(` Fee Juice Portal Address: ${info.l1ContractAddresses.feeJuicePortalAddress.toString()}`); + log(` CoinIssuer Address: ${info.l1ContractAddresses.coinIssuerAddress.toString()}`); + log(` RewardDistributor Address: ${info.l1ContractAddresses.rewardDistributorAddress.toString()}`); + log(` GovernanceProposer Address: ${info.l1ContractAddresses.governanceProposerAddress.toString()}`); + log(` Governance Address: ${info.l1ContractAddresses.governanceAddress.toString()}`); - log(`L2 Contract Addresses:`); - log(` Class Registerer: ${info.protocolContractAddresses.classRegisterer.toString()}`); - log(` Fee Juice: ${info.protocolContractAddresses.feeJuice.toString()}`); - log(` Instance Deployer: ${info.protocolContractAddresses.instanceDeployer.toString()}`); - log(` MultiCall: ${info.protocolContractAddresses.multiCallEntrypoint.toString()}`); + log(`L2 Contract Addresses:`); + log(` Class Registerer: ${info.protocolContractAddresses.classRegisterer.toString()}`); + log(` Fee Juice: ${info.protocolContractAddresses.feeJuice.toString()}`); + log(` Instance Deployer: ${info.protocolContractAddresses.instanceDeployer.toString()}`); + log(` MultiCall: ${info.protocolContractAddresses.multiCallEntrypoint.toString()}`); + } } diff --git a/yarn-project/cli/src/cmds/pxe/index.ts b/yarn-project/cli/src/cmds/pxe/index.ts index e6e1f862725..56fe779ac17 100644 --- a/yarn-project/cli/src/cmds/pxe/index.ts +++ b/yarn-project/cli/src/cmds/pxe/index.ts @@ -54,11 +54,10 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger .command('get-block') .description('Gets info for a given block or latest.') .argument('[blockNumber]', 'Block height', parseOptionalInteger) - .option('-f, --follow', 'Keep polling for new blocks') .addOption(pxeOption) .action(async (blockNumber, options) => { const { getBlock } = await import('./get_block.js'); - await getBlock(options.rpcUrl, blockNumber, options.follow, debugLogger, log); + await getBlock(options.rpcUrl, blockNumber, debugLogger, log); }); program @@ -145,6 +144,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger .command('get-node-info') .description('Gets the information of an Aztec node from a PXE or directly from an Aztec node.') .option('--node-url ', 'URL of the node.') + .option('--json', 'Emit output as json') .addOption(makePxeOption(false)) .action(async options => { const { getNodeInfo } = await import('./get_node_info.js'); @@ -154,7 +154,7 @@ export function injectCommands(program: Command, log: LogFn, debugLogger: Logger } else { url = options.rpcUrl; } - await getNodeInfo(url, !options.nodeUrl, debugLogger, log); + await getNodeInfo(url, !options.nodeUrl, debugLogger, options.json, log, logJson(log)); }); program diff --git a/yarn-project/cli/src/utils/aztec.ts b/yarn-project/cli/src/utils/aztec.ts index 97759f65ec5..aa7388ab478 100644 --- a/yarn-project/cli/src/utils/aztec.ts +++ b/yarn-project/cli/src/utils/aztec.ts @@ -5,7 +5,7 @@ import { FunctionType } from '@aztec/foundation/abi'; import { type EthAddress } from '@aztec/foundation/eth-address'; import { type LogFn, type Logger } from '@aztec/foundation/log'; import { type NoirPackageConfig } from '@aztec/foundation/noir'; -import { RollupAbi } from '@aztec/l1-artifacts'; +import { RollupAbi } from '@aztec/l1-artifacts/RollupAbi'; import { ProtocolContractAddress, protocolContractTreeRoot } from '@aztec/protocol-contracts'; import TOML from '@iarna/toml'; @@ -23,13 +23,6 @@ import { import { encodeArgs } from './encoding.js'; -/** - * Helper type to dynamically import contracts. - */ -interface ArtifactsType { - [key: string]: ContractArtifact; -} - /** * Helper to get an ABI function or throw error if it doesn't exist. * @param artifact - Contract's build artifact in JSON format. @@ -98,13 +91,13 @@ export async function setAssumeProvenThrough( /** * Gets all contracts available in \@aztec/noir-contracts.js. - * @returns The contract ABIs. + * @returns The contract names. */ -export async function getExampleContractArtifacts(): Promise { +export async function getExampleContractNames(): Promise { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment - const imports = await import('@aztec/noir-contracts.js'); - return Object.fromEntries(Object.entries(imports).filter(([key]) => key.endsWith('Artifact'))) as any; + const { ContractNames } = await import('@aztec/noir-contracts.js'); + return ContractNames; } /** @@ -114,11 +107,17 @@ export async function getExampleContractArtifacts(): Promise { */ export async function getContractArtifact(fileDir: string, log: LogFn) { // first check if it's a noir-contracts example - const artifacts = await getExampleContractArtifacts(); - for (const key of [fileDir, fileDir + 'Artifact', fileDir + 'ContractArtifact']) { - if (artifacts[key]) { - return artifacts[key] as ContractArtifact; + const allNames = await getExampleContractNames(); + const contractName = fileDir.replace(/Contract(Artifact)?$/, ''); + if (allNames.includes(contractName)) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - Importing noir-contracts.js even in devDeps results in a circular dependency error. Need to ignore because this line doesn't cause an error in a dev environment + const imported = await import(`@aztec/noir-contracts.js/${contractName}`); + const artifact = imported[`${contractName}ContractArtifact`] as ContractArtifact; + if (!artifact) { + throw Error(`Could not import ${contractName}ContractArtifact from @aztec/noir-contracts.js/${contractName}`); } + return artifact; } let contents: string; diff --git a/yarn-project/cli/src/utils/commands.ts b/yarn-project/cli/src/utils/commands.ts index 6df225aed63..af672916438 100644 --- a/yarn-project/cli/src/utils/commands.ts +++ b/yarn-project/cli/src/utils/commands.ts @@ -1,11 +1,11 @@ import { FunctionSelector } from '@aztec/aztec.js/abi'; -import { AztecAddress } from '@aztec/aztec.js/aztec_address'; +import { AztecAddress } from '@aztec/aztec.js/addresses'; import { EthAddress } from '@aztec/aztec.js/eth_address'; import { Fr } from '@aztec/aztec.js/fields'; import { LogId } from '@aztec/aztec.js/log_id'; import { TxHash } from '@aztec/aztec.js/tx_hash'; import { type PXE } from '@aztec/circuit-types'; -import { PublicKeys } from '@aztec/circuits.js'; +import { PublicKeys } from '@aztec/circuits.js/types'; import { type LogFn } from '@aztec/foundation/log'; import { type Command, CommanderError, InvalidArgumentError, Option } from 'commander'; @@ -300,7 +300,7 @@ export function parsePublicKey(publicKey: string): PublicKeys | undefined { */ export function parsePartialAddress(address: string): Fr { try { - return Fr.fromString(address); + return Fr.fromHexString(address); } catch (err) { throw new InvalidArgumentError(`Invalid partial address: ${address}`); } @@ -314,7 +314,7 @@ export function parsePartialAddress(address: string): Fr { */ export function parseSecretKey(secretKey: string): Fr { try { - return Fr.fromString(secretKey); + return Fr.fromHexString(secretKey); } catch (err) { throw new InvalidArgumentError(`Invalid encryption secret key: ${secretKey}`); } @@ -330,7 +330,7 @@ export function parseField(field: string): Fr { try { const isHex = field.startsWith('0x') || field.match(new RegExp(`^[0-9a-f]{${Fr.SIZE_IN_BYTES * 2}}$`, 'i')); if (isHex) { - return Fr.fromString(field); + return Fr.fromHexString(field); } if (['true', 'false'].includes(field)) { diff --git a/yarn-project/cli/src/utils/index.ts b/yarn-project/cli/src/utils/index.ts index 1e4c577e271..49b74224250 100644 --- a/yarn-project/cli/src/utils/index.ts +++ b/yarn-project/cli/src/utils/index.ts @@ -2,4 +2,3 @@ export * from './commands.js'; export * from './aztec.js'; export * from './encoding.js'; export * from './github.js'; -export * from './inspect.js'; diff --git a/yarn-project/end-to-end/package.json b/yarn-project/end-to-end/package.json index c51b89150bb..4a31d3e2ee1 100644 --- a/yarn-project/end-to-end/package.json +++ b/yarn-project/end-to-end/package.json @@ -98,7 +98,6 @@ "devDependencies": { "0x": "^5.7.0", "@jest/globals": "^29.5.0", - "@sinonjs/fake-timers": "^13.0.5", "@types/jest": "^29.5.0", "@types/js-yaml": "^4.0.9", "@types/lodash.chunk": "^4.2.9", diff --git a/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml b/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml index 2fbbabb4d6d..b219e4d01de 100644 --- a/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml +++ b/yarn-project/end-to-end/scripts/docker-compose-no-sandbox.yml @@ -18,7 +18,6 @@ services: P2P_BLOCK_CHECK_INTERVAL_MS: 50 SEQ_TX_POLLING_INTERVAL_MS: 50 WS_BLOCK_CHECK_INTERVAL_MS: 50 - PXE_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 ENABLE_GAS: ${ENABLE_GAS:-''} JOB_NAME: ${JOB_NAME:-''} diff --git a/yarn-project/end-to-end/scripts/docker-compose-wallet.yml b/yarn-project/end-to-end/scripts/docker-compose-wallet.yml index b1a421ed575..d7e4541e7fb 100644 --- a/yarn-project/end-to-end/scripts/docker-compose-wallet.yml +++ b/yarn-project/end-to-end/scripts/docker-compose-wallet.yml @@ -18,7 +18,6 @@ services: P2P_BLOCK_CHECK_INTERVAL_MS: 50 SEQ_TX_POLLING_INTERVAL_MS: 50 WS_BLOCK_CHECK_INTERVAL_MS: 50 - PXE_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 ENABLE_GAS: ${ENABLE_GAS:-} HARDWARE_CONCURRENCY: ${HARDWARE_CONCURRENCY:-} diff --git a/yarn-project/end-to-end/scripts/docker-compose.yml b/yarn-project/end-to-end/scripts/docker-compose.yml index 4a96de1088d..eae41741bb5 100644 --- a/yarn-project/end-to-end/scripts/docker-compose.yml +++ b/yarn-project/end-to-end/scripts/docker-compose.yml @@ -18,7 +18,6 @@ services: P2P_BLOCK_CHECK_INTERVAL_MS: 50 SEQ_TX_POLLING_INTERVAL_MS: 50 WS_BLOCK_CHECK_INTERVAL_MS: 50 - PXE_BLOCK_POLLING_INTERVAL_MS: 50 ARCHIVER_VIEM_POLLING_INTERVAL_MS: 500 ENABLE_GAS: ${ENABLE_GAS:-} HARDWARE_CONCURRENCY: ${HARDWARE_CONCURRENCY:-} diff --git a/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts b/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts index adc29c28d63..167548937a7 100644 --- a/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts +++ b/yarn-project/end-to-end/src/benchmarks/bench_process_history.test.ts @@ -9,7 +9,7 @@ import { type BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking import { type SequencerClient } from '@aztec/sequencer-client'; import { type EndToEndContext } from '../fixtures/utils.js'; -import { benchmarkSetup, getFolderSize, makeDataDirectory, sendTxs, waitNewPXESynced } from './utils.js'; +import { benchmarkSetup, createNewPXE, getFolderSize, makeDataDirectory, sendTxs } from './utils.js'; const BLOCK_SIZE = BENCHMARK_HISTORY_BLOCK_SIZE; const CHAIN_LENGTHS = BENCHMARK_HISTORY_CHAIN_LENGTHS; @@ -69,7 +69,7 @@ describe('benchmarks/process_history', () => { // Create a new pxe and measure how much time it takes it to sync with failed and successful decryption // Skip the first two blocks used for setup (create account contract and deploy benchmarking contract) context.logger.info(`Starting new pxe`); - const pxe = await waitNewPXESynced(node, contract, INITIAL_L2_BLOCK_NUM + setupBlockCount); + const pxe = await createNewPXE(node, contract, INITIAL_L2_BLOCK_NUM + setupBlockCount); // Register the owner account and wait until it's synced so we measure how much time it took context.logger.info(`Registering owner account on new pxe`); @@ -81,8 +81,7 @@ describe('benchmarks/process_history', () => { context.logger.info(`Registering fresh account on new pxe`); await pxe.registerAccount(Fr.random(), Fr.random()); - // Stop the external node and pxe - await pxe.stop(); + // Stop the external node await node.stop(); lastBlock = chainLength; diff --git a/yarn-project/end-to-end/src/benchmarks/bench_prover.test.ts b/yarn-project/end-to-end/src/benchmarks/bench_prover.test.ts index d77451f317f..b4151bd06fa 100644 --- a/yarn-project/end-to-end/src/benchmarks/bench_prover.test.ts +++ b/yarn-project/end-to-end/src/benchmarks/bench_prover.test.ts @@ -3,7 +3,10 @@ import { PublicFeePaymentMethod, TxStatus, sleep } from '@aztec/aztec.js'; import { type AccountWallet } from '@aztec/aztec.js/wallet'; import { BBCircuitVerifier } from '@aztec/bb-prover'; import { CompleteAddress, FEE_FUNDING_FOR_TESTER_ACCOUNT, Fq, Fr, GasSettings } from '@aztec/circuits.js'; -import { FPCContract, FeeJuiceContract, TestContract, TokenContract } from '@aztec/noir-contracts.js'; +import { FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { type PXEService, type PXEServiceConfig, createPXEService } from '@aztec/pxe'; @@ -177,9 +180,6 @@ describe('benchmarks/proving', () => { }); afterAll(async () => { - for (const pxe of provingPxes) { - await pxe.stop(); - } await ctx.teardown(); await acvmCleanup(); await bbCleanup(); @@ -204,13 +204,12 @@ describe('benchmarks/proving', () => { const feeFnCall0 = { gasSettings, - paymentMethod: new PublicFeePaymentMethod(initialTokenContract.address, initialFpContract.address, wallet), + paymentMethod: new PublicFeePaymentMethod(initialFpContract.address, wallet), }; // const feeFnCall1 = { // gasSettings, // paymentMethod: new PrivateFeePaymentMethod( - // initialTokenContract.address, // initialFpContract.address, // await getWalletOnPxe(1), // ), diff --git a/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts b/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts index 21612ccbe85..97d7fb4b17b 100644 --- a/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts +++ b/yarn-project/end-to-end/src/benchmarks/bench_publish_rollup.test.ts @@ -5,7 +5,7 @@ import { type BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking import { type SequencerClient } from '@aztec/sequencer-client'; import { type EndToEndContext } from '../fixtures/utils.js'; -import { benchmarkSetup, sendTxs, waitNewPXESynced } from './utils.js'; +import { benchmarkSetup, createNewPXE, sendTxs } from './utils.js'; describe('benchmarks/publish_rollup', () => { let context: EndToEndContext; @@ -41,7 +41,7 @@ describe('benchmarks/publish_rollup', () => { // Spin up a new pxe and sync it, we'll use it to test sync times of new accounts for the last block context.logger.info(`Starting new pxe`); - const pxe = await waitNewPXESynced(node, contract, blockNumber! - 1); + const pxe = await createNewPXE(node, contract, blockNumber! - 1); // Register the owner account and wait until it's synced so we measure how much time it took context.logger.info(`Registering owner account on new pxe`); @@ -53,8 +53,7 @@ describe('benchmarks/publish_rollup', () => { context.logger.info(`Registering fresh account on new pxe`); await pxe.registerAccount(Fr.random(), Fr.random()); - // Stop the external node and pxe - await pxe.stop(); + // Stop the external node await node.stop(); }, 20 * 60_000, diff --git a/yarn-project/end-to-end/src/benchmarks/bench_tx_size_fees.test.ts b/yarn-project/end-to-end/src/benchmarks/bench_tx_size_fees.test.ts index 63f485f9c1a..02b8f858f30 100644 --- a/yarn-project/end-to-end/src/benchmarks/bench_tx_size_fees.test.ts +++ b/yarn-project/end-to-end/src/benchmarks/bench_tx_size_fees.test.ts @@ -8,7 +8,9 @@ import { TxStatus, } from '@aztec/aztec.js'; import { FEE_FUNDING_FOR_TESTER_ACCOUNT, GasSettings } from '@aztec/circuits.js'; -import { FPCContract, FeeJuiceContract, TokenContract } from '@aztec/noir-contracts.js'; +import { FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { jest } from '@jest/globals'; @@ -47,7 +49,10 @@ describe('benchmarks/tx_size_fees', () => { beforeAll(async () => { feeJuice = await FeeJuiceContract.at(ProtocolContractAddress.FeeJuice, aliceWallet); token = await TokenContract.deploy(aliceWallet, aliceWallet.getAddress(), 'test', 'test', 18).send().deployed(); - fpc = await FPCContract.deploy(aliceWallet, token.address, sequencerAddress).send().deployed(); + + // We set Alice as the FPC admin to avoid the need for deployment of another account. + const fpcAdmin = aliceWallet.getAddress(); + fpc = await FPCContract.deploy(aliceWallet, token.address, fpcAdmin).send().deployed(); }); // mint tokens @@ -89,7 +94,7 @@ describe('benchmarks/tx_size_fees', () => { ], [ 'public fee', - () => new PublicFeePaymentMethod(token.address, fpc.address, aliceWallet), + () => new PublicFeePaymentMethod(fpc.address, aliceWallet), // DA: // non-rev: 1 nullifiers, overhead; rev: 2 note hashes, 1 nullifier, 1168 B enc note logs, 0 B enc logs,0 B unenc logs, teardown // L2: @@ -98,7 +103,7 @@ describe('benchmarks/tx_size_fees', () => { ], [ 'private fee', - () => new PrivateFeePaymentMethod(token.address, fpc.address, aliceWallet, sequencerAddress), + () => new PrivateFeePaymentMethod(fpc.address, aliceWallet), // DA: // non-rev: 3 nullifiers, overhead; rev: 2 note hashes, 1168 B enc note logs, 0 B enc logs, 0 B unenc logs, teardown // L2: diff --git a/yarn-project/end-to-end/src/benchmarks/utils.ts b/yarn-project/end-to-end/src/benchmarks/utils.ts index 5dbebfa26ce..05c90892ae7 100644 --- a/yarn-project/end-to-end/src/benchmarks/utils.ts +++ b/yarn-project/end-to-end/src/benchmarks/utils.ts @@ -1,5 +1,5 @@ import { type AztecNodeConfig, type AztecNodeService } from '@aztec/aztec-node'; -import { type AztecNode, BatchCall, INITIAL_L2_BLOCK_NUM, type SentTx, retryUntil, sleep } from '@aztec/aztec.js'; +import { type AztecNode, BatchCall, INITIAL_L2_BLOCK_NUM, type SentTx, sleep } from '@aztec/aztec.js'; import { times } from '@aztec/foundation/collection'; import { randomInt } from '@aztec/foundation/crypto'; import { BenchmarkingContract } from '@aztec/noir-contracts.js/Benchmarking'; @@ -90,13 +90,13 @@ export async function sendTxs( } /** - * Creates a new PXE and awaits until it's synced with the node. + * Creates a new PXE * @param node - Node to connect the pxe to. * @param contract - Benchmark contract to add to the pxe. * @param startingBlock - First l2 block to process. * @returns The new PXE. */ -export async function waitNewPXESynced( +export async function createNewPXE( node: AztecNode, contract: BenchmarkingContract, startingBlock: number = INITIAL_L2_BLOCK_NUM, @@ -111,6 +111,5 @@ export async function waitNewPXESynced( } as PXEServiceConfig; const pxe = await createPXEService(node, pxeConfig); await pxe.registerContract(contract); - await retryUntil(() => pxe.isGlobalStateSynchronized(), 'pxe-global-sync'); return pxe; } diff --git a/yarn-project/end-to-end/src/composed/e2e_aztec_js_browser.test.ts b/yarn-project/end-to-end/src/composed/e2e_aztec_js_browser.test.ts index 51c7d8eab45..03ff98223ca 100644 --- a/yarn-project/end-to-end/src/composed/e2e_aztec_js_browser.test.ts +++ b/yarn-project/end-to-end/src/composed/e2e_aztec_js_browser.test.ts @@ -23,11 +23,10 @@ const pageLogger = createLogger('e2e:aztec_browser.js:web:page'); * To run the test, do the following: * 1) Build the whole repository, * 2) go to `yarn-project/end-to-end` and build the web packed package with `yarn build:web`, - * 3) start anvil: `anvil`, - * 4) if you intend to use a remotely running environment then export the URL of your PXE e.g. + * 3) if you intend to use a remotely running environment then export the URL of your PXE e.g. * `export PXE_URL='http://localhost:8080'` - * 5) go to `yarn-project/end-to-end` and run the test: `yarn test aztec_js_browser` - * 6) If you get dependency error run `apt install libnss3 libatk1.0-0t64 libatk-bridge2.0-0t64 libcups2t64 libxdamage1 libxkbcommon0 libpango-1.0-0 libcairo2 libasound2t64`. + * 4) go to `yarn-project/end-to-end` and run the test: `yarn test aztec_js_browser` + * 5) If you get dependency error run `apt install libnss3 libatk1.0-0t64 libatk-bridge2.0-0t64 libcups2t64 libxdamage1 libxkbcommon0 libpango-1.0-0 libcairo2 libasound2t64`. * * NOTE 1: If you see the logs spammed with unexpected logs there is probably a chrome process with a webpage * unexpectedly running in the background. Kill it with `killall chrome` diff --git a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts index d44b65c2024..f03231342b9 100644 --- a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts @@ -1,6 +1,6 @@ import { type ArchiveSource } from '@aztec/archiver'; import { getConfigEnvVars } from '@aztec/aztec-node'; -import { AztecAddress, EthCheatCodes, Fr, GlobalVariables, type L2Block, createLogger } from '@aztec/aztec.js'; +import { AztecAddress, Fr, GlobalVariables, type L2Block, createLogger } from '@aztec/aztec.js'; // eslint-disable-next-line no-restricted-imports import { type L2Tips, @@ -9,6 +9,7 @@ import { } from '@aztec/circuit-types'; import { makeBloatedProcessedTx } from '@aztec/circuit-types/test'; import { + BlockBlobPublicInputs, type BlockHeader, EthAddress, GENESIS_ARCHIVE_ROOT, @@ -19,7 +20,10 @@ import { } from '@aztec/circuits.js'; import { fr } from '@aztec/circuits.js/testing'; import { type L1ContractAddresses, createEthereumChain } from '@aztec/ethereum'; +import { EthCheatCodesWithState } from '@aztec/ethereum/test'; import { range } from '@aztec/foundation/array'; +import { Blob } from '@aztec/foundation/blob'; +import { sha256, sha256ToField } from '@aztec/foundation/crypto'; import { openTmpStore } from '@aztec/kv-store/lmdb'; import { OutboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree'; @@ -96,7 +100,7 @@ describe('L1Publisher integration', () => { let coinbase: EthAddress; let feeRecipient: AztecAddress; - let ethCheatCodes: EthCheatCodes; + let ethCheatCodes: EthCheatCodesWithState; let worldStateSynchronizer: ServerWorldStateSynchronizer; // To update the test data, run "export AZTEC_GENERATE_TEST_DATA=1" in shell and run the tests again @@ -122,7 +126,7 @@ describe('L1Publisher integration', () => { { assumeProvenThrough: undefined }, )); - ethCheatCodes = new EthCheatCodes(config.l1RpcUrl); + ethCheatCodes = new EthCheatCodesWithState(config.l1RpcUrl); rollupAddress = getAddress(l1ContractAddresses.rollupAddress.toString()); outboxAddress = getAddress(l1ContractAddresses.outboxAddress.toString()); @@ -242,6 +246,7 @@ describe('L1Publisher integration', () => { fileName: string, block: L2Block, l1ToL2Content: Fr[], + blobs: Blob[], recipientAddress: AztecAddress, deployerAddress: `0x${string}`, ): void => { @@ -268,13 +273,12 @@ describe('L1Publisher integration', () => { archive: `0x${block.archive.root.toBuffer().toString('hex').padStart(64, '0')}`, blockHash: `0x${block.hash().toBuffer().toString('hex').padStart(64, '0')}`, body: `0x${block.body.toBuffer().toString('hex')}`, - txsEffectsHash: `0x${block.body.getTxsEffectsHash().toString('hex').padStart(64, '0')}`, decodedHeader: { contentCommitment: { + blobsHash: `0x${block.header.contentCommitment.blobsHash.toString('hex').padStart(64, '0')}`, inHash: `0x${block.header.contentCommitment.inHash.toString('hex').padStart(64, '0')}`, outHash: `0x${block.header.contentCommitment.outHash.toString('hex').padStart(64, '0')}`, numTxs: Number(block.header.contentCommitment.numTxs), - txsEffectsHash: `0x${block.header.contentCommitment.txsEffectsHash.toString('hex').padStart(64, '0')}`, }, globalVariables: { blockNumber: block.number, @@ -321,6 +325,7 @@ describe('L1Publisher integration', () => { }, header: `0x${block.header.toBuffer().toString('hex')}`, publicInputsHash: `0x${block.getPublicInputsHash().toBuffer().toString('hex').padStart(64, '0')}`, + blobInputs: Blob.getEthBlobEvaluationInputs(blobs), numTxs: block.body.txEffects.length, }, }; @@ -333,10 +338,8 @@ describe('L1Publisher integration', () => { await worldStateSynchronizer.syncImmediate(); const tempFork = await worldStateSynchronizer.fork(); const tempBuilder = new LightweightBlockBuilder(tempFork, new NoopTelemetryClient()); - await tempBuilder.startNewBlock(txs.length, globalVariables, l1ToL2Messages); - for (const tx of txs) { - await tempBuilder.addNewTx(tx); - } + await tempBuilder.startNewBlock(globalVariables, l1ToL2Messages); + await tempBuilder.addTxs(txs); const block = await tempBuilder.setBlockCompleted(); await tempFork.close(); return block; @@ -401,7 +404,19 @@ describe('L1Publisher integration', () => { // Check that we have not yet written a root to this blocknumber expect(BigInt(emptyRoot)).toStrictEqual(0n); - writeJson(`mixed_block_${block.number}`, block, l1ToL2Content, recipientAddress, deployerAccount.address); + const blobs = Blob.getBlobs(block.body.toBlobFields()); + expect(block.header.contentCommitment.blobsHash).toEqual( + sha256ToField(blobs.map(b => b.getEthVersionedBlobHash())).toBuffer(), + ); + + writeJson( + `mixed_block_${block.number}`, + block, + l1ToL2Content, + blobs, + recipientAddress, + deployerAccount.address, + ); await publisher.proposeL2Block(block); blocks.push(block); @@ -421,6 +436,10 @@ describe('L1Publisher integration', () => { hash: logs[i].transactionHash!, }); + const blobPublicInputsHash = await rollup.read.getBlobPublicInputsHash([BigInt(i + 1)]); + const expectedHash = sha256(Buffer.from(BlockBlobPublicInputs.fromBlobs(blobs).toString().substring(2), 'hex')); + expect(blobPublicInputsHash).toEqual(`0x${expectedHash.toString('hex')}`); + const expectedData = encodeFunctionData({ abi: RollupAbi, functionName: 'propose', @@ -436,7 +455,9 @@ describe('L1Publisher integration', () => { txHashes: [], }, [], + // TODO(#9101): Extract blobs from beacon chain => calldata will only contain what's needed to verify blob: `0x${block.body.toBuffer().toString('hex')}`, + Blob.getEthBlobEvaluationInputs(blobs), ], }); expect(ethTx.input).toEqual(expectedData); @@ -502,7 +523,12 @@ describe('L1Publisher integration', () => { prevHeader = block.header; blockSource.getL1ToL2Messages.mockResolvedValueOnce(l1ToL2Messages); - writeJson(`empty_block_${block.number}`, block, [], AztecAddress.ZERO, deployerAccount.address); + const blobs = Blob.getBlobs(block.body.toBlobFields()); + expect(block.header.contentCommitment.blobsHash).toEqual( + sha256ToField(blobs.map(b => b.getEthVersionedBlobHash())).toBuffer(), + ); + + writeJson(`empty_block_${block.number}`, block, [], blobs, AztecAddress.ZERO, deployerAccount.address); await publisher.proposeL2Block(block); blocks.push(block); @@ -522,6 +548,10 @@ describe('L1Publisher integration', () => { hash: logs[i].transactionHash!, }); + const blobPublicInputsHash = await rollup.read.getBlobPublicInputsHash([BigInt(i + 1)]); + const expectedHash = sha256(Buffer.from(BlockBlobPublicInputs.fromBlobs(blobs).toString().substring(2), 'hex')); + expect(blobPublicInputsHash).toEqual(`0x${expectedHash.toString('hex')}`); + const expectedData = encodeFunctionData({ abi: RollupAbi, functionName: 'propose', @@ -537,7 +567,9 @@ describe('L1Publisher integration', () => { txHashes: [], }, [], + // TODO(#9101): Extract blobs from beacon chain => calldata will only contain what's needed to verify blob: `0x${block.body.toBuffer().toString('hex')}`, + Blob.getEthBlobEvaluationInputs(blobs), ], }); expect(ethTx.input).toEqual(expectedData); diff --git a/yarn-project/end-to-end/src/devnet/e2e_smoke.test.ts b/yarn-project/end-to-end/src/devnet/e2e_smoke.test.ts index 808c8c0f0aa..776b09f6865 100644 --- a/yarn-project/end-to-end/src/devnet/e2e_smoke.test.ts +++ b/yarn-project/end-to-end/src/devnet/e2e_smoke.test.ts @@ -19,7 +19,8 @@ import { deriveSigningKey } from '@aztec/circuits.js'; import { createNamespacedSafeJsonRpcServer, startHttpRpcServer } from '@aztec/foundation/json-rpc/server'; import { type Logger } from '@aztec/foundation/log'; import { promiseWithResolvers } from '@aztec/foundation/promise'; -import { FeeJuiceContract, TestContract } from '@aztec/noir-contracts.js'; +import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import getPort from 'get-port'; import { exec } from 'node:child_process'; @@ -179,8 +180,8 @@ describe('End-to-end tests for devnet', () => { .deploy({ fee: { paymentMethod: new FeeJuicePaymentMethodWithClaim(l2Account.getAddress(), { - claimAmount: Fr.fromString(claimAmount), - claimSecret: Fr.fromString(claimSecret.value), + claimAmount: Fr.fromHexString(claimAmount), + claimSecret: Fr.fromHexString(claimSecret.value), messageLeafIndex: BigInt(messageLeafIndex), }), }, diff --git a/yarn-project/end-to-end/src/e2e_2_pxes.test.ts b/yarn-project/end-to-end/src/e2e_2_pxes.test.ts index 87528585bd1..d52f3494ecd 100644 --- a/yarn-project/end-to-end/src/e2e_2_pxes.test.ts +++ b/yarn-project/end-to-end/src/e2e_2_pxes.test.ts @@ -8,10 +8,11 @@ import { type Logger, type PXE, type Wallet, - retryUntil, sleep, } from '@aztec/aztec.js'; -import { ChildContract, TestContract, TokenContract } from '@aztec/noir-contracts.js'; +import { ChildContract } from '@aztec/noir-contracts.js/Child'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { expect, jest } from '@jest/globals'; @@ -57,8 +58,7 @@ describe('e2e_2_pxes', () => { await teardownA(); }); - // TODO #10296 - it.skip('transfers funds from user A to B via PXE A followed by transfer from B to A via PXE B', async () => { + it('transfers funds from user A to B via PXE A followed by transfer from B to A via PXE B', async () => { const initialBalance = 987n; const transferAmount1 = 654n; const transferAmount2 = 323n; @@ -103,21 +103,12 @@ describe('e2e_2_pxes', () => { return contract.instance; }; - const awaitServerSynchronized = async (server: PXE) => { - const isServerSynchronized = async () => { - return await server.isGlobalStateSynchronized(); - }; - await retryUntil(isServerSynchronized, 'server sync', 10); - }; - const getChildStoredValue = (child: { address: AztecAddress }, pxe: PXE) => pxe.getPublicStorageAt(child.address, new Fr(1)); it('user calls a public function on a contract deployed by a different user using a different PXE', async () => { const childCompleteAddress = await deployChildContractViaServerA(); - await awaitServerSynchronized(pxeA); - // Add Child to PXE B await pxeB.registerContract({ artifact: ChildContract.artifact, @@ -129,8 +120,6 @@ describe('e2e_2_pxes', () => { const childContractWithWalletB = await ChildContract.at(childCompleteAddress.address, walletB); await childContractWithWalletB.methods.pub_inc_value(newValueToSet).send().wait({ interval: 0.1 }); - await awaitServerSynchronized(pxeA); - const storedValueOnB = await getChildStoredValue(childCompleteAddress, pxeB); expect(storedValueOnB).toEqual(newValueToSet); diff --git a/yarn-project/end-to-end/src/e2e_amm.test.ts b/yarn-project/end-to-end/src/e2e_amm.test.ts index 476bfb8be8b..9e87c17cc45 100644 --- a/yarn-project/end-to-end/src/e2e_amm.test.ts +++ b/yarn-project/end-to-end/src/e2e_amm.test.ts @@ -1,5 +1,6 @@ import { type AccountWallet, Fr, type Logger, type Wallet } from '@aztec/aztec.js'; -import { AMMContract, type TokenContract } from '@aztec/noir-contracts.js'; +import { AMMContract } from '@aztec/noir-contracts.js/AMM'; +import { type TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_authwit.test.ts b/yarn-project/end-to-end/src/e2e_authwit.test.ts index c59fbef886e..71d4331f054 100644 --- a/yarn-project/end-to-end/src/e2e_authwit.test.ts +++ b/yarn-project/end-to-end/src/e2e_authwit.test.ts @@ -1,5 +1,6 @@ import { type AccountWallet, Fr, computeAuthWitMessageHash, computeInnerAuthWitHash } from '@aztec/aztec.js'; -import { AuthRegistryContract, AuthWitTestContract } from '@aztec/noir-contracts.js'; +import { AuthRegistryContract } from '@aztec/noir-contracts.js/AuthRegistry'; +import { AuthWitTestContract } from '@aztec/noir-contracts.js/AuthWitTest'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { jest } from '@jest/globals'; @@ -43,7 +44,7 @@ describe('e2e_authwit_tests', () => { // 6. We check that the authwit is NOT valid in private for wallet[1] (check that it is not signed by 1) // docs:start:compute_inner_authwit_hash - const innerHash = computeInnerAuthWitHash([Fr.fromString('0xdead')]); + const innerHash = computeInnerAuthWitHash([Fr.fromHexString('0xdead')]); // docs:end:compute_inner_authwit_hash // docs:start:compute_arbitrary_authwit_hash @@ -87,7 +88,7 @@ describe('e2e_authwit_tests', () => { }); describe('failure case', () => { it('invalid chain id', async () => { - const innerHash = computeInnerAuthWitHash([Fr.fromString('0xdead'), Fr.fromString('0xbeef')]); + const innerHash = computeInnerAuthWitHash([Fr.fromHexString('0xdead'), Fr.fromHexString('0xbeef')]); const intent = { consumer: auth.address, innerHash }; const messageHash = computeAuthWitMessageHash(intent, { chainId: Fr.random(), version }); @@ -119,7 +120,7 @@ describe('e2e_authwit_tests', () => { }); it('invalid version', async () => { - const innerHash = computeInnerAuthWitHash([Fr.fromString('0xdead'), Fr.fromString('0xbeef')]); + const innerHash = computeInnerAuthWitHash([Fr.fromHexString('0xdead'), Fr.fromHexString('0xbeef')]); const intent = { consumer: auth.address, innerHash }; const messageHash = computeAuthWitMessageHash(intent, { chainId, version: Fr.random() }); @@ -157,7 +158,7 @@ describe('e2e_authwit_tests', () => { describe('Public', () => { describe('arbitrary data', () => { it('happy path', async () => { - const innerHash = computeInnerAuthWitHash([Fr.fromString('0xdead'), Fr.fromString('0x01')]); + const innerHash = computeInnerAuthWitHash([Fr.fromHexString('0xdead'), Fr.fromHexString('0x01')]); const intent = { consumer: wallets[1].getAddress(), innerHash }; @@ -185,7 +186,7 @@ describe('e2e_authwit_tests', () => { describe('failure case', () => { it('cancel before usage', async () => { - const innerHash = computeInnerAuthWitHash([Fr.fromString('0xdead'), Fr.fromString('0x02')]); + const innerHash = computeInnerAuthWitHash([Fr.fromHexString('0xdead'), Fr.fromHexString('0x02')]); const intent = { consumer: auth.address, innerHash }; expect(await wallets[0].lookupValidity(wallets[0].getAddress(), intent)).toEqual({ diff --git a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts index 8ec9c96f24d..b8e26d7f97e 100644 --- a/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts +++ b/yarn-project/end-to-end/src/e2e_avm_simulator.test.ts @@ -1,5 +1,6 @@ import { type AccountWallet, AztecAddress, BatchCall, Fr, TxStatus } from '@aztec/aztec.js'; -import { AvmInitializerTestContract, AvmTestContract } from '@aztec/noir-contracts.js'; +import { AvmInitializerTestContract } from '@aztec/noir-contracts.js/AvmInitializerTest'; +import { AvmTestContract } from '@aztec/noir-contracts.js/AvmTest'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts b/yarn-project/end-to-end/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts index d7dc45a2ca6..da4af23cdcc 100644 --- a/yarn-project/end-to-end/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +++ b/yarn-project/end-to-end/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts @@ -10,7 +10,9 @@ import { computeSecretHash, createLogger, } from '@aztec/aztec.js'; -import { DocsExampleContract, TokenBlacklistContract, type TokenContract } from '@aztec/noir-contracts.js'; +import { DocsExampleContract } from '@aztec/noir-contracts.js/DocsExample'; +import { type TokenContract } from '@aztec/noir-contracts.js/Token'; +import { TokenBlacklistContract } from '@aztec/noir-contracts.js/TokenBlacklist'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_block_building.test.ts b/yarn-project/end-to-end/src/e2e_block_building.test.ts index 38ff8cce2e1..d80f7f1ff87 100644 --- a/yarn-project/end-to-end/src/e2e_block_building.test.ts +++ b/yarn-project/end-to-end/src/e2e_block_building.test.ts @@ -20,7 +20,7 @@ import { import { getL1ContractsConfigEnvVars } from '@aztec/ethereum'; import { times } from '@aztec/foundation/collection'; import { poseidon2Hash } from '@aztec/foundation/crypto'; -import { StatefulTestContract, StatefulTestContractArtifact } from '@aztec/noir-contracts.js'; +import { StatefulTestContract, StatefulTestContractArtifact } from '@aztec/noir-contracts.js/StatefulTest'; import { TestContract } from '@aztec/noir-contracts.js/Test'; import { TokenContract } from '@aztec/noir-contracts.js/Token'; @@ -287,6 +287,8 @@ describe('e2e_block_building', () => { testContract = await TestContract.deploy(owner).send().deployed(); }, 60_000); + afterEach(() => teardown()); + it('calls a method with nested note encrypted logs', async () => { // account setup const privateKey = new Fr(7n); @@ -394,12 +396,12 @@ describe('e2e_block_building', () => { .send() .deployed(); - logger.info('Updating min txs per block to 4'); - await aztecNode.setConfig({ minTxsPerBlock: 4 }); + logger.info('Updating txs per block to 4'); + await aztecNode.setConfig({ minTxsPerBlock: 4, maxTxsPerBlock: 4 }); logger.info('Spamming the network with public txs'); const txs = []; - for (let i = 0; i < 30; i++) { + for (let i = 0; i < 24; i++) { const tx = token.methods.mint_to_public(owner.getAddress(), 10n); txs.push(tx.send({ skipPublicSimulation: false })); } @@ -483,14 +485,6 @@ describe('e2e_block_building', () => { // PXE should have cleared out the 30-note from tx2, but reapplied the 20-note from tx1 expect(await contract.methods.summed_values(ownerAddress).simulate()).toEqual(21n); - // PXE should be synced to the block number on the new chain - await retryUntil( - async () => (await pxe.getSyncStatus()).blocks === newTx1Receipt.blockNumber, - 'wait for pxe block header sync', - 15, - 1, - ); - // And we should be able to send a new tx on the new chain logger.info('Sending new tx on reorgd chain'); const tx3 = await contract.methods.create_note(ownerAddress, ownerAddress, 10).send().wait(); diff --git a/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts b/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts index 6dc08e64aee..280a8e5b743 100644 --- a/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts +++ b/yarn-project/end-to-end/src/e2e_cheat_codes.test.ts @@ -1,6 +1,6 @@ import { type AztecAddress, type CheatCodes, EthAddress, Fr, type Wallet } from '@aztec/aztec.js'; import { RollupAbi } from '@aztec/l1-artifacts'; -import { TokenContract } from '@aztec/noir-contracts.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { type Account, diff --git a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts index 2ee9eee8b68..b0d724f44f5 100644 --- a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +++ b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts @@ -12,7 +12,8 @@ import { } from '@aztec/aztec.js'; import { createL1Clients } from '@aztec/ethereum'; import { InboxAbi, OutboxAbi, RollupAbi } from '@aztec/l1-artifacts'; -import { TokenBridgeContract, TokenContract } from '@aztec/noir-contracts.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; +import { TokenBridgeContract } from '@aztec/noir-contracts.js/TokenBridge'; import { type Chain, type HttpTransport, type PublicClient, getContract } from 'viem'; diff --git a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l1_to_l2.test.ts b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l1_to_l2.test.ts index 7ff83ac3156..8c67dd634ba 100644 --- a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l1_to_l2.test.ts +++ b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l1_to_l2.test.ts @@ -1,5 +1,5 @@ import { type AztecAddress, Fr, generateClaimSecret } from '@aztec/aztec.js'; -import { TestContract } from '@aztec/noir-contracts.js'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { sendL1ToL2Message } from '../fixtures/l1_to_l2_messaging.js'; import { CrossChainMessagingTest } from './cross_chain_messaging_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l2_to_l1.test.ts b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l2_to_l1.test.ts index 60eb205af6e..bbe6be8e993 100644 --- a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l2_to_l1.test.ts +++ b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/l2_to_l1.test.ts @@ -1,7 +1,7 @@ import { Fr } from '@aztec/aztec.js'; import { sha256ToField } from '@aztec/foundation/crypto'; import { OutboxAbi } from '@aztec/l1-artifacts'; -import { TestContract } from '@aztec/noir-contracts.js'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { type Hex, decodeEventLog, getContract } from 'viem'; diff --git a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/token_bridge_public.test.ts b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/token_bridge_public.test.ts index e8eff976fbb..6f09c0bf374 100644 --- a/yarn-project/end-to-end/src/e2e_cross_chain_messaging/token_bridge_public.test.ts +++ b/yarn-project/end-to-end/src/e2e_cross_chain_messaging/token_bridge_public.test.ts @@ -48,7 +48,7 @@ describe('e2e_cross_chain_messaging token_bridge_public', () => { // 2. Deposit tokens to the TokenPortal logger.verbose(`2. Deposit tokens to the TokenPortal`); const claim = await crossChainTestHarness.sendTokensToPortalPublic(bridgeAmount); - const msgHash = Fr.fromString(claim.messageHash); + const msgHash = Fr.fromHexString(claim.messageHash); expect(await crossChainTestHarness.getL1BalanceOf(ethAccount)).toBe(l1TokenBalance - bridgeAmount); // Wait for the message to be available for consumption @@ -116,7 +116,7 @@ describe('e2e_cross_chain_messaging token_bridge_public', () => { await crossChainTestHarness.mintTokensOnL1(l1TokenBalance); const claim = await crossChainTestHarness.sendTokensToPortalPublic(bridgeAmount); - const msgHash = Fr.fromString(claim.messageHash); + const msgHash = Fr.fromHexString(claim.messageHash); expect(await crossChainTestHarness.getL1BalanceOf(ethAccount)).toBe(l1TokenBalance - bridgeAmount); await crossChainTestHarness.makeMessageConsumable(msgHash); diff --git a/yarn-project/end-to-end/src/e2e_crowdfunding_and_claim.test.ts b/yarn-project/end-to-end/src/e2e_crowdfunding_and_claim.test.ts index 4dcc22cad57..0ac2e55f332 100644 --- a/yarn-project/end-to-end/src/e2e_crowdfunding_and_claim.test.ts +++ b/yarn-project/end-to-end/src/e2e_crowdfunding_and_claim.test.ts @@ -12,9 +12,9 @@ import { deriveKeys, } from '@aztec/aztec.js'; import { GasSettings, TxContext, computePartialAddress } from '@aztec/circuits.js'; -import { InclusionProofsContract } from '@aztec/noir-contracts.js'; import { ClaimContract } from '@aztec/noir-contracts.js/Claim'; import { CrowdfundingContract } from '@aztec/noir-contracts.js/Crowdfunding'; +import { InclusionProofsContract } from '@aztec/noir-contracts.js/InclusionProofs'; import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts index 4ef0d5014d8..1223bcf3958 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/contract_class_registration.test.ts @@ -22,9 +22,10 @@ import { } from '@aztec/aztec.js/deployment'; import { type ContractClassIdPreimage, PublicKeys, computeContractClassId } from '@aztec/circuits.js'; import { FunctionSelector, FunctionType } from '@aztec/foundation/abi'; -import { writeTestData } from '@aztec/foundation/testing'; -import { StatefulTestContract, TokenContractArtifact } from '@aztec/noir-contracts.js'; +import { writeTestData } from '@aztec/foundation/testing/files'; +import { StatefulTestContract } from '@aztec/noir-contracts.js/StatefulTest'; import { TestContract } from '@aztec/noir-contracts.js/Test'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; import { DUPLICATE_NULLIFIER_ERROR } from '../fixtures/fixtures.js'; import { DeployTest, type StatefulContractCtorArgs } from './deploy_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts index a4d305c089e..5f2fe0781b4 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_method.test.ts @@ -1,6 +1,7 @@ import { getDeployedTestAccountsWallets } from '@aztec/accounts/testing'; import { AztecAddress, type Logger, type PXE, type Wallet, createPXEClient, makeFetch } from '@aztec/aztec.js'; -import { CounterContract, StatefulTestContract } from '@aztec/noir-contracts.js'; +import { CounterContract } from '@aztec/noir-contracts.js/Counter'; +import { StatefulTestContract } from '@aztec/noir-contracts.js/StatefulTest'; import { TestContract } from '@aztec/noir-contracts.js/Test'; import { TokenContract } from '@aztec/noir-contracts.js/Token'; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_test.ts index 2632b9e4d6d..4dbbc665577 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/deploy_test.ts @@ -13,7 +13,7 @@ import { createLogger, getContractInstanceFromDeployParams, } from '@aztec/aztec.js'; -import { type StatefulTestContract } from '@aztec/noir-contracts.js'; +import { type StatefulTestContract } from '@aztec/noir-contracts.js/StatefulTest'; import { type ISnapshotManager, addAccounts, createSnapshotManager } from '../fixtures/snapshot_manager.js'; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts index 1187950bbe9..81603e318ea 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/legacy.test.ts @@ -8,7 +8,7 @@ import { type Wallet, getContractInstanceFromDeployParams, } from '@aztec/aztec.js'; -import { StatefulTestContract } from '@aztec/noir-contracts.js'; +import { StatefulTestContract } from '@aztec/noir-contracts.js/StatefulTest'; import { TestContractArtifact } from '@aztec/noir-contracts.js/Test'; import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; diff --git a/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts b/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts index 8978e4f6a62..788ba730118 100644 --- a/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts +++ b/yarn-project/end-to-end/src/e2e_deploy_contract/private_initialization.test.ts @@ -1,6 +1,6 @@ import { BatchCall, Fr, type Logger, type PXE, SignerlessWallet, type Wallet } from '@aztec/aztec.js'; import { siloNullifier } from '@aztec/circuits.js/hash'; -import { StatefulTestContract } from '@aztec/noir-contracts.js'; +import { StatefulTestContract } from '@aztec/noir-contracts.js/StatefulTest'; import { TestContract } from '@aztec/noir-contracts.js/Test'; import { DeployTest, type StatefulContractCtorArgs } from './deploy_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_epochs.test.ts b/yarn-project/end-to-end/src/e2e_epochs.test.ts index 6c0a7c30096..9f71bfdac2b 100644 --- a/yarn-project/end-to-end/src/e2e_epochs.test.ts +++ b/yarn-project/end-to-end/src/e2e_epochs.test.ts @@ -24,9 +24,9 @@ describe('e2e_epochs', () => { let l1BlockNumber: number; let handle: NodeJS.Timeout; - const EPOCH_DURATION = 4; - const L1_BLOCK_TIME = 5; - const L2_SLOT_DURATION_IN_L1_BLOCKS = 2; + const EPOCH_DURATION_IN_L2_SLOTS = 4; + const L2_SLOT_DURATION_IN_L1_SLOTS = 2; + const L1_BLOCK_TIME_IN_S = 8; beforeAll(async () => { // Set up system without any account nor protocol contracts @@ -35,13 +35,16 @@ describe('e2e_epochs', () => { assumeProvenThrough: undefined, skipProtocolContracts: true, salt: 1, - aztecEpochDuration: EPOCH_DURATION, - aztecSlotDuration: L1_BLOCK_TIME * L2_SLOT_DURATION_IN_L1_BLOCKS, - ethereumSlotDuration: L1_BLOCK_TIME, - aztecEpochProofClaimWindowInL2Slots: EPOCH_DURATION / 2, + aztecEpochDuration: EPOCH_DURATION_IN_L2_SLOTS, + aztecSlotDuration: L1_BLOCK_TIME_IN_S * L2_SLOT_DURATION_IN_L1_SLOTS, + ethereumSlotDuration: L1_BLOCK_TIME_IN_S, + aztecEpochProofClaimWindowInL2Slots: EPOCH_DURATION_IN_L2_SLOTS / 2, minTxsPerBlock: 0, realProofs: false, startProverNode: true, + // This must be enough so that the tx from the prover is delayed properly, + // but not so much to hang the sequencer and timeout the teardown + txPropagationMaxQueryAttempts: 12, }); logger = context.logger; @@ -87,8 +90,8 @@ describe('e2e_epochs', () => { // Constants used for time calculation constants = { - epochDuration: EPOCH_DURATION, - slotDuration: L1_BLOCK_TIME * L2_SLOT_DURATION_IN_L1_BLOCKS, + epochDuration: EPOCH_DURATION_IN_L2_SLOTS, + slotDuration: L1_BLOCK_TIME_IN_S * L2_SLOT_DURATION_IN_L1_SLOTS, l1GenesisBlock: await rollup.getL1StartBlock(), l1GenesisTime: await rollup.getL1GenesisTime(), }; @@ -105,13 +108,13 @@ describe('e2e_epochs', () => { const waitUntilEpochStarts = async (epoch: number) => { const [start] = getTimestampRangeForEpoch(BigInt(epoch), constants); logger.info(`Waiting until L1 timestamp ${start} is reached as the start of epoch ${epoch}`); - await waitUntilL1Timestamp(l1Client, start - BigInt(L1_BLOCK_TIME)); + await waitUntilL1Timestamp(l1Client, start - BigInt(L1_BLOCK_TIME_IN_S)); return start; }; /** Waits until the given L2 block number is mined. */ const waitUntilL2BlockNumber = async (target: number) => { - await retryUntil(() => Promise.resolve(target === l2BlockNumber), `Wait until L2 block ${l2BlockNumber}`, 60, 0.1); + await retryUntil(() => Promise.resolve(target === l2BlockNumber), `Wait until L2 block ${target}`, 60, 0.1); }; it('does not allow submitting proof after epoch end', async () => { @@ -124,12 +127,14 @@ describe('e2e_epochs', () => { proverDelayer.pauseNextTxUntilTimestamp(epoch2Start); logger.info(`Delayed prover tx until epoch 2 starts at ${epoch2Start}`); - // Wait until the last block of epoch 1 is published and then hold off the sequencer - await waitUntilL2BlockNumber(blockNumberAtEndOfEpoch0 + EPOCH_DURATION); - sequencerDelayer.pauseNextTxUntilTimestamp(epoch2Start + BigInt(L1_BLOCK_TIME)); + // Wait until the last block of epoch 1 is published and then hold off the sequencer. + // Note that the tx below will block the sequencer until it times out + // the txPropagationMaxQueryAttempts until #10824 is fixed. + await waitUntilL2BlockNumber(blockNumberAtEndOfEpoch0 + EPOCH_DURATION_IN_L2_SLOTS); + sequencerDelayer.pauseNextTxUntilTimestamp(epoch2Start + BigInt(L1_BLOCK_TIME_IN_S)); // Next sequencer to publish a block should trigger a rollback to block 1 - await waitUntilL1Timestamp(l1Client, epoch2Start + BigInt(L1_BLOCK_TIME)); + await waitUntilL1Timestamp(l1Client, epoch2Start + BigInt(L1_BLOCK_TIME_IN_S)); expect(await rollup.getBlockNumber()).toEqual(1n); expect(await rollup.getSlotNumber()).toEqual(8n); @@ -142,5 +147,6 @@ describe('e2e_epochs', () => { const lastL2BlockTxReceipt = await l1Client.getTransactionReceipt({ hash: lastL2BlockTxHash! }); expect(lastL2BlockTxReceipt.status).toEqual('success'); expect(lastL2BlockTxReceipt.blockNumber).toBeGreaterThan(lastProverTxReceipt!.blockNumber); + logger.info(`Test succeeded`); }); }); diff --git a/yarn-project/end-to-end/src/e2e_event_logs.test.ts b/yarn-project/end-to-end/src/e2e_event_logs.test.ts index cdaf45e61d6..914b99ad8ac 100644 --- a/yarn-project/end-to-end/src/e2e_event_logs.test.ts +++ b/yarn-project/end-to-end/src/e2e_event_logs.test.ts @@ -9,7 +9,7 @@ import { import { EventSelector } from '@aztec/foundation/abi'; import { makeTuple } from '@aztec/foundation/array'; import { type Tuple } from '@aztec/foundation/serialize'; -import { type ExampleEvent0, type ExampleEvent1, TestLogContract } from '@aztec/noir-contracts.js'; +import { type ExampleEvent0, type ExampleEvent1, TestLogContract } from '@aztec/noir-contracts.js/TestLog'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_fees/account_init.test.ts b/yarn-project/end-to-end/src/e2e_fees/account_init.test.ts index 820d2a51ea5..e997538a6d1 100644 --- a/yarn-project/end-to-end/src/e2e_fees/account_init.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/account_init.test.ts @@ -20,7 +20,9 @@ import { Fq, type GasSettings, } from '@aztec/circuits.js'; -import { type TokenContract as BananaCoin, type FPCContract, SchnorrAccountContract } from '@aztec/noir-contracts.js'; +import { type FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { SchnorrAccountContract } from '@aztec/noir-contracts.js/SchnorrAccount'; +import { type TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; @@ -64,13 +66,11 @@ describe('e2e_fees account_init', () => { // Seeded by initBalances below in a beforeEach hook let fpcsInitialGas: bigint; let fpcsInitialPublicBananas: bigint; - let sequencerInitialPrivateBananas: bigint; async function initBalances() { - [[fpcsInitialGas], [fpcsInitialPublicBananas], [sequencerInitialPrivateBananas]] = await Promise.all([ + [[fpcsInitialGas], [fpcsInitialPublicBananas]] = await Promise.all([ t.getGasBalanceFn(bananaFPC.address), t.getBananaPublicBalanceFn(bananaFPC.address), - t.getBananaPrivateBalanceFn(t.sequencerAddress), ]); } @@ -115,12 +115,7 @@ describe('e2e_fees account_init', () => { await t.mintPrivateBananas(mintedBananas, bobsAddress); // Bob deploys his account through the private FPC - const paymentMethod = new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - await bobsAccountManager.getWallet(), - t.sequencerAddress, // Sequencer is the recipient of the refund fee notes because it's the FPC admin. - ); + const paymentMethod = new PrivateFeePaymentMethod(bananaFPC.address, await bobsAccountManager.getWallet()); const tx = await bobsAccountManager.deploy({ fee: { gasSettings, paymentMethod } }).wait(); const actualFee = tx.transactionFee!; @@ -130,8 +125,8 @@ describe('e2e_fees account_init', () => { await expect(t.getBananaPrivateBalanceFn(bobsAddress)).resolves.toEqual([mintedBananas - actualFee]); // the FPC admin (set to sequencer) got the banana fee note so his private balance should have increased by the actual fee - await expect(t.getBananaPrivateBalanceFn(t.sequencerAddress)).resolves.toEqual([ - sequencerInitialPrivateBananas + actualFee, + await expect(t.getBananaPublicBalanceFn(t.bananaFPC.address)).resolves.toEqual([ + fpcsInitialPublicBananas + actualFee, ]); // the FPC should have been the fee payer @@ -142,7 +137,7 @@ describe('e2e_fees account_init', () => { const mintedBananas = FEE_FUNDING_FOR_TESTER_ACCOUNT; await bananaCoin.methods.mint_to_public(bobsAddress, mintedBananas).send().wait(); - const paymentMethod = new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, bobsWallet); + const paymentMethod = new PublicFeePaymentMethod(bananaFPC.address, bobsWallet); const tx = await bobsAccountManager .deploy({ skipPublicDeployment: false, diff --git a/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts b/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts index 45665cfc883..d3bd333d2e7 100644 --- a/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/dapp_subscription.test.ts @@ -9,12 +9,10 @@ import { PublicFeePaymentMethod, } from '@aztec/aztec.js'; import { FEE_FUNDING_FOR_TESTER_ACCOUNT, type GasSettings } from '@aztec/circuits.js'; -import { - type AppSubscriptionContract, - type TokenContract as BananaCoin, - type CounterContract, - type FPCContract, -} from '@aztec/noir-contracts.js'; +import { type AppSubscriptionContract } from '@aztec/noir-contracts.js/AppSubscription'; +import { type CounterContract } from '@aztec/noir-contracts.js/Counter'; +import { type FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { type TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { expectMapping, expectMappingDelta } from '../fixtures/utils.js'; import { FeesTest } from './fees_test.js'; @@ -28,7 +26,6 @@ describe('e2e_fees dapp_subscription', () => { let aliceAddress: AztecAddress; // Dapp subscriber. let bobAddress: AztecAddress; // Dapp owner. let sequencerAddress: AztecAddress; - let feeRecipient: AztecAddress; // Account that receives the fees from the fee refund flow. let bananaCoin: BananaCoin; let counterContract: CounterContract; @@ -61,9 +58,6 @@ describe('e2e_fees dapp_subscription', () => { counterContract, pxe, } = await t.setup()); - - // We like sequencer so we send him the fees. - feeRecipient = sequencerAddress; }); afterAll(async () => { @@ -114,9 +108,7 @@ describe('e2e_fees dapp_subscription', () => { the FPC finalizes the partial notes for the fee and the refund */ - const { transactionFee } = await subscribe( - new PrivateFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet, feeRecipient), - ); + const { transactionFee } = await subscribe(new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet)); // We let Alice see Bob's notes because the expect uses Alice's wallet to interact with the contracts to "get" state. aliceWallet.setScopes([aliceAddress, bobAddress]); @@ -129,7 +121,7 @@ describe('e2e_fees dapp_subscription', () => { // alice, bob, fpc await expectBananasPrivateDelta(-t.SUBSCRIPTION_AMOUNT - transactionFee!, t.SUBSCRIPTION_AMOUNT, 0n); - await expectBananasPublicDelta(0n, 0n, 0n); + await expectBananasPublicDelta(0n, 0n, transactionFee!); // REFUND_AMOUNT is a transparent note note }); @@ -146,9 +138,7 @@ describe('e2e_fees dapp_subscription', () => { PUBLIC TEARDOWN the FPC finalizes the partial notes for the fee and the refund */ - const { transactionFee } = await subscribe( - new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), - ); + const { transactionFee } = await subscribe(new PublicFeePaymentMethod(bananaFPC.address, aliceWallet)); await expectMapping( t.getGasBalanceFn, @@ -167,7 +157,7 @@ describe('e2e_fees dapp_subscription', () => { it('should call dapp subscription entrypoint', async () => { // Subscribe again, so this test does not depend on the previous ones being run. - await subscribe(new PrivateFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet, feeRecipient)); + await subscribe(new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet)); expect(await subscriptionContract.methods.is_initialized(aliceAddress).simulate()).toBe(true); @@ -189,18 +179,14 @@ describe('e2e_fees dapp_subscription', () => { it('should reject after the sub runs out', async () => { // Subscribe again. This will overwrite the previous subscription. - await subscribe(new PrivateFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet, feeRecipient), 0); + await subscribe(new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), 0); // TODO(#6651): Change back to /(context.block_number()) as u64 < expiry_block_number as u64/ when fixed await expect(dappIncrement()).rejects.toThrow(/Note encrypted logs hash mismatch/); }); it('should reject after the txs run out', async () => { // Subscribe again. This will overwrite the previous subscription. - await subscribe( - new PrivateFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet, feeRecipient), - 5, - 1, - ); + await subscribe(new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), 5, 1); await expect(dappIncrement()).resolves.toBeDefined(); await expect(dappIncrement()).rejects.toThrow(/note.remaining_txs as u64 > 0/); }); diff --git a/yarn-project/end-to-end/src/e2e_fees/failures.test.ts b/yarn-project/end-to-end/src/e2e_fees/failures.test.ts index 57a7559e12f..ecc938877dc 100644 --- a/yarn-project/end-to-end/src/e2e_fees/failures.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/failures.test.ts @@ -10,7 +10,8 @@ import { } from '@aztec/aztec.js'; import { Gas, GasSettings } from '@aztec/circuits.js'; import { FunctionType } from '@aztec/foundation/abi'; -import { type TokenContract as BananaCoin, type FPCContract } from '@aztec/noir-contracts.js'; +import { type FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { type TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { expectMapping } from '../fixtures/utils.js'; import { FeesTest } from './fees_test.js'; @@ -39,12 +40,11 @@ describe('e2e_fees failures', () => { const outrageousPublicAmountAliceDoesNotHave = t.ALICE_INITIAL_BANANAS * 5n; const privateMintedAlicePrivateBananas = t.ALICE_INITIAL_BANANAS; - const [initialAlicePrivateBananas, initialSequencerPrivateBananas] = await t.getBananaPrivateBalanceFn( - aliceAddress, - sequencerAddress, - ); + const [initialAlicePrivateBananas] = await t.getBananaPrivateBalanceFn(aliceAddress, sequencerAddress); const [initialAliceGas, initialFPCGas] = await t.getGasBalanceFn(aliceAddress, bananaFPC.address); + const [initialFPCPublicBananas] = await t.getBananaPublicBalanceFn(bananaFPC.address); + await t.mintPrivateBananas(privateMintedAlicePrivateBananas, aliceAddress); // if we simulate locally, it throws an error @@ -55,12 +55,7 @@ describe('e2e_fees failures', () => { .send({ fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - aliceWallet, - t.sequencerAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(), @@ -84,12 +79,7 @@ describe('e2e_fees failures', () => { skipPublicSimulation: true, fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - aliceWallet, - t.sequencerAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait({ dontThrowOnRevert: true }); @@ -106,16 +96,19 @@ describe('e2e_fees failures', () => { // and thus we paid the fee await expectMapping( t.getBananaPrivateBalanceFn, - [aliceAddress, sequencerAddress], + [aliceAddress], [ // Even with the revert public teardown function got successfully executed so Alice received the refund note // and hence paid the actual fee. initialAlicePrivateBananas + privateMintedAlicePrivateBananas - feeAmount, - // Sequencer is the FPC admin/fee recipient and hence he should have received the fee amount note - initialSequencerPrivateBananas + feeAmount, ], ); + // FPC should have received the fee in public + await expect(t.getBananaPublicBalanceFn(t.bananaFPC.address)).resolves.toEqual([ + initialFPCPublicBananas + feeAmount, + ]); + // Gas balance of Alice should have stayed the same as the FPC paid the gas fee and not her (she paid bananas // to FPC admin). await expectMapping( @@ -151,7 +144,7 @@ describe('e2e_fees failures', () => { .send({ fee: { gasSettings, - paymentMethod: new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new PublicFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(), @@ -181,7 +174,7 @@ describe('e2e_fees failures', () => { skipPublicSimulation: true, fee: { gasSettings, - paymentMethod: new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new PublicFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait({ dontThrowOnRevert: true }); @@ -217,7 +210,7 @@ describe('e2e_fees failures', () => { .send({ fee: { gasSettings, - paymentMethod: new BuggedSetupFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new BuggedSetupFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(), @@ -231,7 +224,7 @@ describe('e2e_fees failures', () => { skipPublicSimulation: true, fee: { gasSettings, - paymentMethod: new BuggedSetupFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new BuggedSetupFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(), @@ -261,8 +254,7 @@ describe('e2e_fees failures', () => { await bananaCoin.methods.mint_to_public(aliceAddress, publicMintedAlicePublicBananas).send().wait(); const badGas = GasSettings.from({ - gasLimits: gasSettings.gasLimits, - maxFeesPerGas: gasSettings.maxFeesPerGas, + ...gasSettings, teardownGasLimits: Gas.empty(), }); @@ -272,7 +264,7 @@ describe('e2e_fees failures', () => { .send({ fee: { gasSettings: badGas, - paymentMethod: new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new PublicFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(), @@ -284,7 +276,7 @@ describe('e2e_fees failures', () => { skipPublicSimulation: true, fee: { gasSettings: badGas, - paymentMethod: new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new PublicFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait({ @@ -317,12 +309,14 @@ describe('e2e_fees failures', () => { }); class BuggedSetupFeePaymentMethod extends PublicFeePaymentMethod { - override getFunctionCalls(gasSettings: GasSettings): Promise { + override async getFunctionCalls(gasSettings: GasSettings): Promise { const maxFee = gasSettings.getFeeLimit(); const nonce = Fr.random(); const tooMuchFee = new Fr(maxFee.toBigInt() * 2n); + const asset = await this.getAsset(); + return Promise.resolve([ this.wallet .setPublicAuthWit( @@ -334,7 +328,7 @@ class BuggedSetupFeePaymentMethod extends PublicFeePaymentMethod { selector: FunctionSelector.fromSignature('transfer_in_public((Field),(Field),Field,Field)'), type: FunctionType.PUBLIC, isStatic: false, - to: this.asset, + to: asset, returnTypes: [], }, }, @@ -344,10 +338,10 @@ class BuggedSetupFeePaymentMethod extends PublicFeePaymentMethod { { name: 'fee_entrypoint_public', to: this.paymentContract, - selector: FunctionSelector.fromSignature('fee_entrypoint_public(Field,(Field),Field)'), + selector: FunctionSelector.fromSignature('fee_entrypoint_public(Field,Field)'), type: FunctionType.PRIVATE, isStatic: false, - args: [tooMuchFee, this.asset.toField(), nonce], + args: [tooMuchFee, nonce], returnTypes: [], }, ]); diff --git a/yarn-project/end-to-end/src/e2e_fees/fee_juice_payments.test.ts b/yarn-project/end-to-end/src/e2e_fees/fee_juice_payments.test.ts index 112425fafaf..8183915875c 100644 --- a/yarn-project/end-to-end/src/e2e_fees/fee_juice_payments.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/fee_juice_payments.test.ts @@ -5,7 +5,8 @@ import { FeeJuicePaymentMethodWithClaim, } from '@aztec/aztec.js'; import { FEE_FUNDING_FOR_TESTER_ACCOUNT, type GasSettings } from '@aztec/circuits.js'; -import { type TokenContract as BananaCoin, type FeeJuiceContract } from '@aztec/noir-contracts.js'; +import { type FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; +import { type TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { FeesTest } from './fees_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts index ffbf4d01f66..518f545c8de 100644 --- a/yarn-project/end-to-end/src/e2e_fees/fees_test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/fees_test.ts @@ -13,13 +13,11 @@ import { DefaultMultiCallEntrypoint } from '@aztec/aztec.js/entrypoint'; import { EthAddress, FEE_FUNDING_FOR_TESTER_ACCOUNT, GasSettings, computePartialAddress } from '@aztec/circuits.js'; import { createL1Clients } from '@aztec/ethereum'; import { TestERC20Abi } from '@aztec/l1-artifacts'; -import { - AppSubscriptionContract, - TokenContract as BananaCoin, - CounterContract, - FPCContract, - FeeJuiceContract, -} from '@aztec/noir-contracts.js'; +import { AppSubscriptionContract } from '@aztec/noir-contracts.js/AppSubscription'; +import { CounterContract } from '@aztec/noir-contracts.js/Counter'; +import { FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; +import { TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { getCanonicalFeeJuice } from '@aztec/protocol-contracts/fee-juice'; @@ -62,7 +60,7 @@ export class FeesTest { public sequencerAddress!: AztecAddress; public coinbase!: EthAddress; - public feeRecipient!: AztecAddress; // Account that receives the fees from the fee refund flow. + public fpcAdmin!: AztecAddress; public gasSettings!: GasSettings; @@ -142,8 +140,8 @@ export class FeesTest { [this.aliceWallet, this.bobWallet] = this.wallets.slice(0, 2); [this.aliceAddress, this.bobAddress, this.sequencerAddress] = this.wallets.map(w => w.getAddress()); - // We like sequencer so we send him the fees. - this.feeRecipient = this.sequencerAddress; + // We set Alice as the FPC admin to avoid the need for deployment of another account. + this.fpcAdmin = this.aliceAddress; this.feeJuiceContract = await FeeJuiceContract.at(getCanonicalFeeJuice().address, this.aliceWallet); const bobInstance = await this.bobWallet.getContractInstance(this.bobAddress); @@ -225,7 +223,7 @@ export class FeesTest { expect(await context.pxe.isContractPubliclyDeployed(feeJuiceContract.address)).toBe(true); const bananaCoin = this.bananaCoin; - const bananaFPC = await FPCContract.deploy(this.aliceWallet, bananaCoin.address, this.feeRecipient) + const bananaFPC = await FPCContract.deploy(this.aliceWallet, bananaCoin.address, this.fpcAdmin) .send() .deployed(); diff --git a/yarn-project/end-to-end/src/e2e_fees/gas_estimation.test.ts b/yarn-project/end-to-end/src/e2e_fees/gas_estimation.test.ts index f3655716c22..1d2a7427cc1 100644 --- a/yarn-project/end-to-end/src/e2e_fees/gas_estimation.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/gas_estimation.test.ts @@ -8,7 +8,8 @@ import { } from '@aztec/aztec.js'; import { GasSettings } from '@aztec/circuits.js'; import { type Logger } from '@aztec/foundation/log'; -import { TokenContract as BananaCoin, type FPCContract } from '@aztec/noir-contracts.js'; +import { type FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { inspect } from 'util'; @@ -95,7 +96,7 @@ describe('e2e_fees gas_estimation', () => { it('estimates gas with public payment method', async () => { const teardownFixedFee = gasSettings.teardownGasLimits.computeFee(gasSettings.maxFeesPerGas).toBigInt(); - const paymentMethod = new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet); + const paymentMethod = new PublicFeePaymentMethod(bananaFPC.address, aliceWallet); const estimatedGas = await makeTransferRequest().estimateGas({ fee: { gasSettings, paymentMethod, estimatedGasPadding: 0 }, }); diff --git a/yarn-project/end-to-end/src/e2e_fees/private_payments.test.ts b/yarn-project/end-to-end/src/e2e_fees/private_payments.test.ts index fd59e1f2140..39420fd44b8 100644 --- a/yarn-project/end-to-end/src/e2e_fees/private_payments.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/private_payments.test.ts @@ -1,6 +1,7 @@ import { type AccountWallet, type AztecAddress, BatchCall, PrivateFeePaymentMethod, sleep } from '@aztec/aztec.js'; import { GasSettings } from '@aztec/circuits.js'; -import { type TokenContract as BananaCoin, FPCContract } from '@aztec/noir-contracts.js'; +import { FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { type TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { expectMapping } from '../fixtures/utils.js'; import { FeesTest } from './fees_test.js'; @@ -38,7 +39,6 @@ describe('e2e_fees private_payment', () => { let initialBobPrivateBananas: bigint; let initialFPCPublicBananas: bigint; - let initialSequencerPrivateBananas: bigint; let initialFPCGas: bigint; let initialSequencerGas: bigint; @@ -52,11 +52,11 @@ describe('e2e_fees private_payment', () => { initialSequencerL1Gas = await t.getCoinbaseBalance(); [ - [initialAlicePrivateBananas, initialBobPrivateBananas, initialSequencerPrivateBananas], + [initialAlicePrivateBananas, initialBobPrivateBananas], [initialAlicePublicBananas, initialBobPublicBananas, initialFPCPublicBananas], [initialAliceGas, initialFPCGas, initialSequencerGas], ] = await Promise.all([ - t.getBananaPrivateBalanceFn(aliceAddress, bobAddress, sequencerAddress), + t.getBananaPrivateBalanceFn(aliceAddress, bobAddress), t.getBananaPublicBalanceFn(aliceAddress, bobAddress, bananaFPC.address), t.getGasBalanceFn(aliceAddress, bananaFPC.address, sequencerAddress), ]); @@ -93,12 +93,7 @@ describe('e2e_fees private_payment', () => { const settings = { fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - aliceWallet, - sequencerAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), }, }; const localTx = await interaction.prove(settings); @@ -139,15 +134,13 @@ describe('e2e_fees private_payment', () => { await expectMapping( t.getBananaPrivateBalanceFn, - [aliceAddress, bobAddress, bananaFPC.address, sequencerAddress], - [ - initialAlicePrivateBananas - feeAmount - transferAmount, - transferAmount, - 0n, - initialSequencerPrivateBananas + feeAmount, - ], + [aliceAddress, bobAddress], + [initialAlicePrivateBananas - feeAmount - transferAmount, transferAmount], ); + // FPC should have received fee amount of bananas + await expectMapping(t.getBananaPublicBalanceFn, [bananaFPC.address], [initialFPCPublicBananas + feeAmount]); + await expectMapping( t.getGasBalanceFn, [aliceAddress, bananaFPC.address, sequencerAddress], @@ -180,12 +173,7 @@ describe('e2e_fees private_payment', () => { .send({ fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - aliceWallet, - sequencerAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(); @@ -194,9 +182,13 @@ describe('e2e_fees private_payment', () => { await expectMapping( t.getBananaPrivateBalanceFn, - [aliceAddress, bananaFPC.address, sequencerAddress], - [initialAlicePrivateBananas - feeAmount + newlyMintedBananas, 0n, initialSequencerPrivateBananas + feeAmount], + [aliceAddress], + [initialAlicePrivateBananas - feeAmount + newlyMintedBananas], ); + + // FPC should have received fee amount of bananas + await expectMapping(t.getBananaPublicBalanceFn, [bananaFPC.address], [initialFPCPublicBananas + feeAmount]); + await expectMapping( t.getGasBalanceFn, [aliceAddress, bananaFPC.address, sequencerAddress], @@ -229,12 +221,7 @@ describe('e2e_fees private_payment', () => { .send({ fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - aliceWallet, - sequencerAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(); @@ -243,17 +230,13 @@ describe('e2e_fees private_payment', () => { await expectMapping( t.getBananaPrivateBalanceFn, - [aliceAddress, bananaFPC.address, sequencerAddress], - [ - initialAlicePrivateBananas - feeAmount + amountTransferredToPrivate, - 0n, - initialSequencerPrivateBananas + feeAmount, - ], + [aliceAddress], + [initialAlicePrivateBananas - feeAmount + amountTransferredToPrivate], ); await expectMapping( t.getBananaPublicBalanceFn, - [aliceAddress, bananaFPC.address, sequencerAddress], - [initialAlicePublicBananas - amountTransferredToPrivate, initialFPCPublicBananas, 0n], + [aliceAddress, bananaFPC.address], + [initialAlicePublicBananas - amountTransferredToPrivate, initialFPCPublicBananas + feeAmount], ); await expectMapping( t.getGasBalanceFn, @@ -292,12 +275,7 @@ describe('e2e_fees private_payment', () => { .send({ fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bananaFPC.address, - aliceWallet, - sequencerAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(); @@ -306,18 +284,16 @@ describe('e2e_fees private_payment', () => { await expectMapping( t.getBananaPrivateBalanceFn, - [aliceAddress, bobAddress, bananaFPC.address, sequencerAddress], + [aliceAddress, bobAddress], [ initialAlicePrivateBananas - feeAmount - amountTransferredInPrivate + amountTransferredToPrivate, initialBobPrivateBananas + amountTransferredInPrivate, - 0n, - initialSequencerPrivateBananas + feeAmount, ], ); await expectMapping( t.getBananaPublicBalanceFn, - [aliceAddress, bananaFPC.address, sequencerAddress], - [initialAlicePublicBananas - amountTransferredToPrivate, initialFPCPublicBananas, 0n], + [aliceAddress, bananaFPC.address], + [initialAlicePublicBananas - amountTransferredToPrivate, initialFPCPublicBananas + feeAmount], ); await expectMapping( t.getGasBalanceFn, @@ -341,12 +317,7 @@ describe('e2e_fees private_payment', () => { skipPublicSimulation: true, fee: { gasSettings, - paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, - bankruptFPC.address, - aliceWallet, - aliceAddress, - ), + paymentMethod: new PrivateFeePaymentMethod(bankruptFPC.address, aliceWallet), }, }) .wait(), @@ -361,14 +332,12 @@ describe('e2e_fees private_payment', () => { fee: { gasSettings: t.gasSettings, paymentMethod: new PrivateFeePaymentMethod( - bananaCoin.address, bananaFPC.address, aliceWallet, - sequencerAddress, // Sequencer is the recipient of the refund fee notes because it's the FPC admin. true, // We set max fee/funded amount to 1 to trigger the error. ), }, }), - ).rejects.toThrow('funded amount not enough to cover tx fee'); + ).rejects.toThrow('max fee not enough to cover tx fee'); }); }); diff --git a/yarn-project/end-to-end/src/e2e_fees/public_payments.test.ts b/yarn-project/end-to-end/src/e2e_fees/public_payments.test.ts index 83f4a4ef68b..8f1175fb0b0 100644 --- a/yarn-project/end-to-end/src/e2e_fees/public_payments.test.ts +++ b/yarn-project/end-to-end/src/e2e_fees/public_payments.test.ts @@ -1,6 +1,7 @@ import { type AccountWallet, type AztecAddress, PublicFeePaymentMethod } from '@aztec/aztec.js'; import { GasSettings } from '@aztec/circuits.js'; -import { type TokenContract as BananaCoin, type FPCContract } from '@aztec/noir-contracts.js'; +import { type FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { type TokenContract as BananaCoin } from '@aztec/noir-contracts.js/Token'; import { expectMapping } from '../fixtures/utils.js'; import { FeesTest } from './fees_test.js'; @@ -63,7 +64,7 @@ describe('e2e_fees public_payment', () => { .send({ fee: { gasSettings, - paymentMethod: new PublicFeePaymentMethod(bananaCoin.address, bananaFPC.address, aliceWallet), + paymentMethod: new PublicFeePaymentMethod(bananaFPC.address, aliceWallet), }, }) .wait(); diff --git a/yarn-project/end-to-end/src/e2e_keys.test.ts b/yarn-project/end-to-end/src/e2e_keys.test.ts index 7cab699963e..c114ec46a7c 100644 --- a/yarn-project/end-to-end/src/e2e_keys.test.ts +++ b/yarn-project/end-to-end/src/e2e_keys.test.ts @@ -19,7 +19,7 @@ import { } from '@aztec/circuits.js'; import { siloNullifier } from '@aztec/circuits.js/hash'; import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; -import { TestContract } from '@aztec/noir-contracts.js'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_lending_contract.test.ts b/yarn-project/end-to-end/src/e2e_lending_contract.test.ts index 6c0df07c5da..0b64d5aac47 100644 --- a/yarn-project/end-to-end/src/e2e_lending_contract.test.ts +++ b/yarn-project/end-to-end/src/e2e_lending_contract.test.ts @@ -1,6 +1,8 @@ import { type AccountWallet, type CheatCodes, type DeployL1Contracts, Fr, type Logger } from '@aztec/aztec.js'; import { RollupAbi } from '@aztec/l1-artifacts'; -import { LendingContract, PriceFeedContract, TokenContract } from '@aztec/noir-contracts.js'; +import { LendingContract } from '@aztec/noir-contracts.js/Lending'; +import { PriceFeedContract } from '@aztec/noir-contracts.js/PriceFeed'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { afterAll, jest } from '@jest/globals'; import { getContract } from 'viem'; diff --git a/yarn-project/end-to-end/src/e2e_max_block_number.test.ts b/yarn-project/end-to-end/src/e2e_max_block_number.test.ts index 0c05164a2c1..b83d613ad36 100644 --- a/yarn-project/end-to-end/src/e2e_max_block_number.test.ts +++ b/yarn-project/end-to-end/src/e2e_max_block_number.test.ts @@ -1,5 +1,5 @@ import { Fr, type PXE, type Wallet } from '@aztec/aztec.js'; -import { TestContract } from '@aztec/noir-contracts.js'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_nested_contract/importer.test.ts b/yarn-project/end-to-end/src/e2e_nested_contract/importer.test.ts index e11ce439df9..c4f49e20cd3 100644 --- a/yarn-project/end-to-end/src/e2e_nested_contract/importer.test.ts +++ b/yarn-project/end-to-end/src/e2e_nested_contract/importer.test.ts @@ -1,4 +1,5 @@ -import { ImportTestContract, TestContract } from '@aztec/noir-contracts.js'; +import { ImportTestContract } from '@aztec/noir-contracts.js/ImportTest'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { NestedContractTest } from './nested_contract_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_nested_contract/manual_private_enqueue.test.ts b/yarn-project/end-to-end/src/e2e_nested_contract/manual_private_enqueue.test.ts index a0ba5c148c0..57cd7354c6a 100644 --- a/yarn-project/end-to-end/src/e2e_nested_contract/manual_private_enqueue.test.ts +++ b/yarn-project/end-to-end/src/e2e_nested_contract/manual_private_enqueue.test.ts @@ -1,5 +1,6 @@ import { type AztecAddress, Fr } from '@aztec/aztec.js'; -import { ChildContract, ParentContract } from '@aztec/noir-contracts.js'; +import { ChildContract } from '@aztec/noir-contracts.js/Child'; +import { ParentContract } from '@aztec/noir-contracts.js/Parent'; import { NestedContractTest } from './nested_contract_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_nested_contract/nested_contract_test.ts b/yarn-project/end-to-end/src/e2e_nested_contract/nested_contract_test.ts index 11db0cb233c..733ecde7318 100644 --- a/yarn-project/end-to-end/src/e2e_nested_contract/nested_contract_test.ts +++ b/yarn-project/end-to-end/src/e2e_nested_contract/nested_contract_test.ts @@ -1,6 +1,7 @@ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; import { type AccountWallet, type CompleteAddress, type Logger, type PXE, createLogger } from '@aztec/aztec.js'; -import { ChildContract, ParentContract } from '@aztec/noir-contracts.js'; +import { ChildContract } from '@aztec/noir-contracts.js/Child'; +import { ParentContract } from '@aztec/noir-contracts.js/Parent'; import { type ISnapshotManager, diff --git a/yarn-project/end-to-end/src/e2e_nft.test.ts b/yarn-project/end-to-end/src/e2e_nft.test.ts index e79ffaed49f..b39228d5643 100644 --- a/yarn-project/end-to-end/src/e2e_nft.test.ts +++ b/yarn-project/end-to-end/src/e2e_nft.test.ts @@ -1,5 +1,5 @@ import { type AccountWallet, AztecAddress, Fr } from '@aztec/aztec.js'; -import { NFTContract } from '@aztec/noir-contracts.js'; +import { NFTContract } from '@aztec/noir-contracts.js/NFT'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_note_getter.test.ts b/yarn-project/end-to-end/src/e2e_note_getter.test.ts index e7aea9067a0..86c91c658af 100644 --- a/yarn-project/end-to-end/src/e2e_note_getter.test.ts +++ b/yarn-project/end-to-end/src/e2e_note_getter.test.ts @@ -1,5 +1,6 @@ import { type AztecAddress, Comparator, Fr, type Wallet } from '@aztec/aztec.js'; -import { DocsExampleContract, TestContract } from '@aztec/noir-contracts.js'; +import { DocsExampleContract } from '@aztec/noir-contracts.js/DocsExample'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_outbox.test.ts b/yarn-project/end-to-end/src/e2e_outbox.test.ts index a3eb8fb43a6..dfcc7979543 100644 --- a/yarn-project/end-to-end/src/e2e_outbox.test.ts +++ b/yarn-project/end-to-end/src/e2e_outbox.test.ts @@ -11,7 +11,7 @@ import { sha256ToField } from '@aztec/foundation/crypto'; import { truncateAndPad } from '@aztec/foundation/serialize'; import { OutboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { SHA256 } from '@aztec/merkle-tree'; -import { TestContract } from '@aztec/noir-contracts.js'; +import { TestContract } from '@aztec/noir-contracts.js/Test'; import { beforeEach, describe, expect, it } from '@jest/globals'; import { decodeEventLog, getContract } from 'viem'; diff --git a/yarn-project/end-to-end/src/e2e_p2p/gossip_network.test.ts b/yarn-project/end-to-end/src/e2e_p2p/gossip_network.test.ts index afa5cdbb1cd..7a74cb96163 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/gossip_network.test.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/gossip_network.test.ts @@ -76,6 +76,7 @@ describe('e2e_p2p_network', () => { t.logger.info('Creating nodes'); nodes = await createNodes( t.ctx.aztecNodeConfig, + t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_NODES, BOOT_NODE_UDP_PORT, diff --git a/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts b/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts index 09d282c4f43..2d55474e7c8 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/p2p_network.ts @@ -1,10 +1,11 @@ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; import { type AztecNodeConfig, type AztecNodeService } from '@aztec/aztec-node'; import { type AccountWalletWithSecretKey } from '@aztec/aztec.js'; -import { EthCheatCodes, MINIMUM_STAKE, getL1ContractsConfigEnvVars } from '@aztec/ethereum'; +import { MINIMUM_STAKE, getL1ContractsConfigEnvVars } from '@aztec/ethereum'; +import { EthCheatCodesWithState } from '@aztec/ethereum/test'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { RollupAbi, TestERC20Abi } from '@aztec/l1-artifacts'; -import { SpamContract } from '@aztec/noir-contracts.js'; +import { SpamContract } from '@aztec/noir-contracts.js/Spam'; import { type BootstrapNode } from '@aztec/p2p'; import { createBootstrapNodeFromPrivateKey } from '@aztec/p2p/mocks'; @@ -93,7 +94,7 @@ export class P2PNetworkTest { */ public async syncMockSystemTime() { this.logger.info('Syncing mock system time'); - const { timer, deployL1ContractsValues } = this.ctx!; + const { dateProvider, deployL1ContractsValues } = this.ctx!; // Send a tx and only update the time after the tx is mined, as eth time is not continuous const tx = await deployL1ContractsValues.walletClient.sendTransaction({ to: this.baseAccount.address, @@ -104,8 +105,7 @@ export class P2PNetworkTest { hash: tx, }); const timestamp = await deployL1ContractsValues.publicClient.getBlock({ blockNumber: receipt.blockNumber }); - timer.setSystemTime(Number(timestamp.timestamp) * 1000); - this.logger.info(`Synced mock system time to ${timestamp.timestamp * 1000n}`); + dateProvider.setTime(Number(timestamp.timestamp) * 1000); } static async create({ @@ -133,7 +133,7 @@ export class P2PNetworkTest { async applyBaseSnapshots() { await this.snapshotManager.snapshot( 'add-validators', - async ({ deployL1ContractsValues, aztecNodeConfig, timer }) => { + async ({ deployL1ContractsValues, aztecNodeConfig, dateProvider }) => { const rollup = getContract({ address: deployL1ContractsValues.l1ContractAddresses.rollupAddress.toString(), abi: RollupAbi, @@ -185,7 +185,7 @@ export class P2PNetworkTest { const slotsInEpoch = await rollup.read.EPOCH_DURATION(); const timestamp = await rollup.read.getTimestampForSlot([slotsInEpoch]); - const cheatCodes = new EthCheatCodes(aztecNodeConfig.l1RpcUrl); + const cheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrl); try { await cheatCodes.warp(Number(timestamp)); } catch (err) { @@ -203,7 +203,7 @@ export class P2PNetworkTest { // Set the system time in the node, only after we have warped the time and waited for a block // Time is only set in the NEXT block - timer.setSystemTime(Number(timestamp) * 1000); + dateProvider.setTime(Number(timestamp) * 1000); }, ); } @@ -244,7 +244,7 @@ export class P2PNetworkTest { async removeInitialNode() { await this.snapshotManager.snapshot( 'remove-inital-validator', - async ({ deployL1ContractsValues, aztecNode, timer }) => { + async ({ deployL1ContractsValues, aztecNode, dateProvider }) => { // Send and await a tx to make sure we mine a block for the warp to correctly progress. const receipt = await deployL1ContractsValues.publicClient.waitForTransactionReceipt({ hash: await deployL1ContractsValues.walletClient.sendTransaction({ @@ -256,7 +256,7 @@ export class P2PNetworkTest { const block = await deployL1ContractsValues.publicClient.getBlock({ blockNumber: receipt.blockNumber, }); - timer.setSystemTime(Number(block.timestamp) * 1000); + dateProvider.setTime(Number(block.timestamp) * 1000); await aztecNode.stop(); }, diff --git a/yarn-project/end-to-end/src/e2e_p2p/rediscovery.test.ts b/yarn-project/end-to-end/src/e2e_p2p/rediscovery.test.ts index 81d069b65c7..f7a8ffbfb4a 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/rediscovery.test.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/rediscovery.test.ts @@ -46,6 +46,7 @@ describe('e2e_p2p_rediscovery', () => { const contexts: NodeContext[] = []; nodes = await createNodes( t.ctx.aztecNodeConfig, + t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_NODES, BOOT_NODE_UDP_PORT, @@ -72,6 +73,7 @@ describe('e2e_p2p_rediscovery', () => { const newNode = await createNode( t.ctx.aztecNodeConfig, + t.ctx.dateProvider, i + 1 + BOOT_NODE_UDP_PORT, undefined, i, diff --git a/yarn-project/end-to-end/src/e2e_p2p/reex.test.ts b/yarn-project/end-to-end/src/e2e_p2p/reex.test.ts index 10b12d4da59..be5475755c0 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/reex.test.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/reex.test.ts @@ -65,6 +65,7 @@ describe('e2e_p2p_reex', () => { nodes = await createNodes( t.ctx.aztecNodeConfig, + t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_NODES, BOOT_NODE_UDP_PORT, diff --git a/yarn-project/end-to-end/src/e2e_p2p/reqresp.test.ts b/yarn-project/end-to-end/src/e2e_p2p/reqresp.test.ts index d9be627e861..fed938743d4 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/reqresp.test.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/reqresp.test.ts @@ -65,6 +65,7 @@ describe('e2e_p2p_reqresp_tx', () => { t.logger.info('Creating nodes'); nodes = await createNodes( t.ctx.aztecNodeConfig, + t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_NODES, BOOT_NODE_UDP_PORT, diff --git a/yarn-project/end-to-end/src/e2e_p2p/shared.ts b/yarn-project/end-to-end/src/e2e_p2p/shared.ts index a3fb06b49ae..5ff6a421157 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/shared.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/shared.ts @@ -3,7 +3,7 @@ import { type AztecNodeService } from '@aztec/aztec-node'; import { type Logger, type SentTx } from '@aztec/aztec.js'; import { CompleteAddress, TxStatus } from '@aztec/aztec.js'; import { Fr, GrumpkinScalar } from '@aztec/foundation/fields'; -import { type SpamContract } from '@aztec/noir-contracts.js'; +import { type SpamContract } from '@aztec/noir-contracts.js/Spam'; import { type PXEService, createPXEService, getPXEServiceConfig as getRpcConfig } from '@aztec/pxe'; import { type NodeContext } from '../fixtures/setup_p2p_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_p2p/upgrade_governance_proposer.test.ts b/yarn-project/end-to-end/src/e2e_p2p/upgrade_governance_proposer.test.ts index f7ef6b05195..9499bce2eef 100644 --- a/yarn-project/end-to-end/src/e2e_p2p/upgrade_governance_proposer.test.ts +++ b/yarn-project/end-to-end/src/e2e_p2p/upgrade_governance_proposer.test.ts @@ -130,6 +130,7 @@ describe('e2e_p2p_governance_proposer', () => { t.logger.info('Creating nodes'); nodes = await createNodes( { ...t.ctx.aztecNodeConfig, governanceProposerPayload: newPayloadAddress }, + t.ctx.dateProvider, t.bootstrapNodeEnr, NUM_NODES, BOOT_NODE_UDP_PORT, diff --git a/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts b/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts index c6d0bab98a7..aac3af2db0a 100644 --- a/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/e2e_prover_test.ts @@ -23,7 +23,7 @@ import { import { compileContract } from '@aztec/ethereum'; import { Buffer32 } from '@aztec/foundation/buffer'; import { RollupAbi, TestERC20Abi } from '@aztec/l1-artifacts'; -import { TokenContract } from '@aztec/noir-contracts.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node'; import { type PXEService } from '@aztec/pxe'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/end-to-end/src/e2e_prover/full.test.ts b/yarn-project/end-to-end/src/e2e_prover/full.test.ts index 6bc9e3f3005..8d9566d48ff 100644 --- a/yarn-project/end-to-end/src/e2e_prover/full.test.ts +++ b/yarn-project/end-to-end/src/e2e_prover/full.test.ts @@ -1,4 +1,6 @@ import { type AztecAddress, EthAddress, retryUntil } from '@aztec/aztec.js'; +import { isGenerateTestDataEnabled } from '@aztec/foundation/testing'; +import { switchGenerateProtocolCircuitTestData } from '@aztec/foundation/testing/files'; import { RewardDistributorAbi, RollupAbi, TestERC20Abi } from '@aztec/l1-artifacts'; import '@jest/globals'; @@ -6,7 +8,7 @@ import { type Chain, type GetContractReturnType, type HttpTransport, type Public import { FullProverTest } from './e2e_prover_test.js'; -const TIMEOUT = 1_800_000; +const TIMEOUT = 5_000_000; // This makes AVM proving throw if there's a failure. process.env.AVM_PROVING_STRICT = '1'; @@ -135,7 +137,7 @@ describe('full_prover', () => { // And wait for the first pair of txs to be proven logger.info(`Awaiting proof for the previous epoch`); - await Promise.all(txs.map(tx => tx.wait({ timeout: 300, interval: 10, proven: true, provenTimeout: 1500 }))); + await Promise.all(txs.map(tx => tx.wait({ timeout: 300, interval: 10, proven: true, provenTimeout: 3000 }))); const provenBn = await rollup.read.getProvenBlockNumber(); const balanceAfterCoinbase = await feeJuice.read.balanceOf([COINBASE_ADDRESS.toString()]); @@ -159,6 +161,94 @@ describe('full_prover', () => { TIMEOUT, ); + it('generates sample Prover.toml files if generate test data is on', async () => { + if (!isGenerateTestDataEnabled() || realProofs) { + return; + } else { + switchGenerateProtocolCircuitTestData(); + } + + // Create the two transactions + const privateBalance = await provenAssets[0].methods.balance_of_private(sender).simulate(); + const privateSendAmount = privateBalance / 20n; + expect(privateSendAmount).toBeGreaterThan(0n); + const firstPrivateInteraction = provenAssets[0].methods.transfer(recipient, privateSendAmount); + + const publicBalance = await provenAssets[1].methods.balance_of_public(sender).simulate(); + const publicSendAmount = publicBalance / 10n; + expect(publicSendAmount).toBeGreaterThan(0n); + const publicInteraction = provenAssets[1].methods.transfer_in_public(sender, recipient, publicSendAmount, 0); + + // Prove them + logger.info(`Proving txs`); + const provingOpts = { skipPublicSimulation: true }; + const [publicProvenTx, firstPrivateProvenTx] = await Promise.all([ + publicInteraction.prove(provingOpts), + firstPrivateInteraction.prove(provingOpts), + ]); + + // Sends the txs to node and awaits them to be mined separately, so they land on different blocks, + // and we have more than one block in the epoch we end up proving + logger.info(`Sending private txs`); + // First block, one private tx + const firstTxPrivate = firstPrivateProvenTx.send(); + await firstTxPrivate.wait({ timeout: 300, interval: 10, proven: false }); + + // Create and send a set of 3 txs for the second block, + // so we end up with three blocks and have merge and block-merge circuits + const secondBlockInteractions = [ + provenAssets[0].methods.transfer(recipient, privateSendAmount), + provenAssets[0].methods.set_admin(sender), + provenAssets[1].methods.transfer_in_public(sender, recipient, publicSendAmount, 0), + ]; + const secondBlockProvenTxs = await Promise.all(secondBlockInteractions.map(p => p.prove(provingOpts))); + const secondBlockTxs = await Promise.all(secondBlockProvenTxs.map(p => p.send())); + await Promise.all(secondBlockTxs.map(t => t.wait({ timeout: 300, interval: 10, proven: false }))); + + logger.info(`Sending public tx`); + // Third block, one public tx + const txPublic = publicProvenTx.send(); + await txPublic.wait({ timeout: 300, interval: 10, proven: false }); + + logger.info(`All txs have been mined`); + const txs = [firstTxPrivate, ...secondBlockTxs, txPublic]; + + // Flag the transfers on the token simulator + tokenSim.transferPrivate(sender, recipient, privateSendAmount); + tokenSim.transferPrivate(sender, recipient, privateSendAmount); + tokenSim.transferPublic(sender, recipient, publicSendAmount); + tokenSim.transferPublic(sender, recipient, publicSendAmount); + + // Warp to the next epoch + const epoch = await cheatCodes.rollup.getEpoch(); + logger.info(`Advancing from epoch ${epoch} to next epoch`); + await cheatCodes.rollup.advanceToNextEpoch(); + + // Wait until the prover node submits a quote + logger.info(`Waiting for prover node to submit quote for epoch ${epoch}`); + await retryUntil(() => t.aztecNode.getEpochProofQuotes(epoch).then(qs => qs.length > 0), 'quote', 60, 1); + + // Send another tx so the sequencer can assemble a block that includes the prover node claim + // so the prover node starts proving + logger.info(`Sending tx to trigger a new block that includes the quote from the prover node`); + const sendOpts = { skipPublicSimulation: true }; + await provenAssets[0].methods + .transfer(recipient, privateSendAmount) + .send(sendOpts) + .wait({ timeout: 300, interval: 10 }); + tokenSim.transferPrivate(sender, recipient, privateSendAmount); + + // Expect the block to have a claim + const claim = await cheatCodes.rollup.getProofClaim(); + expect(claim).toBeDefined(); + expect(claim?.epochToProve).toEqual(epoch); + + // And wait for the first pair of txs to be proven + logger.info(`Awaiting proof for the previous epoch`); + await Promise.all(txs.map(tx => tx.wait({ timeout: 300, interval: 10, proven: true, provenTimeout: 1500 }))); + switchGenerateProtocolCircuitTestData(); + }); + it('rejects txs with invalid proofs', async () => { if (!realProofs) { t.logger.warn(`Skipping test with fake proofs`); diff --git a/yarn-project/end-to-end/src/e2e_state_vars.test.ts b/yarn-project/end-to-end/src/e2e_state_vars.test.ts index 7a47098bc32..a32d0985945 100644 --- a/yarn-project/end-to-end/src/e2e_state_vars.test.ts +++ b/yarn-project/end-to-end/src/e2e_state_vars.test.ts @@ -1,5 +1,6 @@ import { BatchCall, Fr, type PXE, type Wallet } from '@aztec/aztec.js'; -import { AuthContract, DocsExampleContract } from '@aztec/noir-contracts.js'; +import { AuthContract } from '@aztec/noir-contracts.js/Auth'; +import { DocsExampleContract } from '@aztec/noir-contracts.js/DocsExample'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_static_calls.test.ts b/yarn-project/end-to-end/src/e2e_static_calls.test.ts index 1d670377c1a..b8d806de1c0 100644 --- a/yarn-project/end-to-end/src/e2e_static_calls.test.ts +++ b/yarn-project/end-to-end/src/e2e_static_calls.test.ts @@ -1,5 +1,6 @@ import { type AztecAddress, type Wallet } from '@aztec/aztec.js'; -import { StaticChildContract, StaticParentContract } from '@aztec/noir-contracts.js'; +import { StaticChildContract } from '@aztec/noir-contracts.js/StaticChild'; +import { StaticParentContract } from '@aztec/noir-contracts.js/StaticParent'; import { STATIC_CALL_STATE_MODIFICATION_ERROR, STATIC_CONTEXT_ASSERTION_ERROR } from './fixtures/fixtures.js'; import { setup } from './fixtures/utils.js'; diff --git a/yarn-project/end-to-end/src/e2e_synching.test.ts b/yarn-project/end-to-end/src/e2e_synching.test.ts index d4a5563fa37..50857c56baf 100644 --- a/yarn-project/end-to-end/src/e2e_synching.test.ts +++ b/yarn-project/end-to-end/src/e2e_synching.test.ts @@ -51,7 +51,9 @@ import { type AztecAddress } from '@aztec/circuits.js'; import { getL1ContractsConfigEnvVars } from '@aztec/ethereum'; import { Timer } from '@aztec/foundation/timer'; import { RollupAbi } from '@aztec/l1-artifacts'; -import { SchnorrHardcodedAccountContract, SpamContract, TokenContract } from '@aztec/noir-contracts.js'; +import { SchnorrHardcodedAccountContract } from '@aztec/noir-contracts.js/SchnorrHardcodedAccount'; +import { SpamContract } from '@aztec/noir-contracts.js/Spam'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { type PXEService } from '@aztec/pxe'; import { L1Publisher } from '@aztec/sequencer-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/end-to-end/src/e2e_token_contract/private_transfer_recursion.test.ts b/yarn-project/end-to-end/src/e2e_token_contract/private_transfer_recursion.test.ts index 7039882ac10..43e789c6887 100644 --- a/yarn-project/end-to-end/src/e2e_token_contract/private_transfer_recursion.test.ts +++ b/yarn-project/end-to-end/src/e2e_token_contract/private_transfer_recursion.test.ts @@ -1,5 +1,5 @@ import { BatchCall } from '@aztec/aztec.js'; -import { TokenContract, type Transfer } from '@aztec/noir-contracts.js'; +import { TokenContract, type Transfer } from '@aztec/noir-contracts.js/Token'; import { TokenContractTest } from './token_contract_test.js'; diff --git a/yarn-project/end-to-end/src/e2e_token_contract/token_contract_test.ts b/yarn-project/end-to-end/src/e2e_token_contract/token_contract_test.ts index 9453ef7692f..98b117652c7 100644 --- a/yarn-project/end-to-end/src/e2e_token_contract/token_contract_test.ts +++ b/yarn-project/end-to-end/src/e2e_token_contract/token_contract_test.ts @@ -1,6 +1,7 @@ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; import { type AccountWallet, type CompleteAddress, type Logger, createLogger } from '@aztec/aztec.js'; -import { DocsExampleContract, TokenContract } from '@aztec/noir-contracts.js'; +import { DocsExampleContract } from '@aztec/noir-contracts.js/DocsExample'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/e2e_token_contract/transfer.test.ts b/yarn-project/end-to-end/src/e2e_token_contract/transfer.test.ts index 619f24c3a7d..f586644a680 100644 --- a/yarn-project/end-to-end/src/e2e_token_contract/transfer.test.ts +++ b/yarn-project/end-to-end/src/e2e_token_contract/transfer.test.ts @@ -1,5 +1,5 @@ import { AztecAddress, CompleteAddress } from '@aztec/aztec.js'; -import { TokenContract, type Transfer } from '@aztec/noir-contracts.js'; +import { TokenContract, type Transfer } from '@aztec/noir-contracts.js/Token'; import { TokenContractTest } from './token_contract_test.js'; diff --git a/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json b/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json index c7ba001966f..0bd70d4dde7 100644 --- a/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json +++ b/yarn-project/end-to-end/src/fixtures/dumps/epoch_proof_result.json @@ -1 +1 @@ -{"proof":"00003f64000001fb0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000000119dc71af02455fd7b437af6a07b08fbe005c18b2f4be65c19bf1eb7cc0c884ad0000000000000000000000000000000000000000000000000000000000000002224a70c36120d8e08b02885ec88395e57c7db919607b2b26d7b1a761a85d3ba100000000000000000000000000000000000000000000000000000000000000040d500ce5eea424fc5dbedd9d2e20273f74ef1093210ecddec74c65b7fbec3a9d032a9a79c14883dbdd78fe7bab0394b0491e66bc66bfaac2edb5d1c5a5994f70000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160f89744843c7ed99f717a7b6285740719b13fc8c71cc781b2b7bc669662a6a0d560ad12f14dd5026070bc037ac343535db339212f0904dfc96c4aea4dcc8ab000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000834a970c905b9562b00000000000000000000000000000000000000000000000c7d5c02a95a9a337e000000000000000000000000000000000000000000000005ceda57613203dd4f0000000000000000000000000000000000000000000000000000c1c503300e3e000000000000000000000000000000000000000000000008082065a4a84a90e500000000000000000000000000000000000000000000000bb2b0f32aafcd2bff00000000000000000000000000000000000000000000000d67b884a1de8ecb920000000000000000000000000000000000000000000000000000fce7c0913d0a000000000000000000000000000000000000000000000002034d9338bd3d6ab7000000000000000000000000000000000000000000000008dcce0d1678c9907700000000000000000000000000000000000000000000000cf585a862aea5dd3d0000000000000000000000000000000000000000000000000000df8d6ba9e6b30000000000000000000000000000000000000000000000086294e2ab67d8865a000000000000000000000000000000000000000000000002ab59cc5bea75cef1000000000000000000000000000000000000000000000008b5087c2441388a6500000000000000000000000000000000000000000000000000002a1274ba4c66000000000000000000000000000000815438d32a9c665412bb63add5a5a3f35700000000000000000000000000000000001f69b29e9a7572dc5c068b26b81845000000000000000000000000000000d51931e4f65d90de5d3d1d7f51b4f5af9000000000000000000000000000000000001709882923c6136e725f50342baeb9000000000000000000000000000000eb683b39a96aa101869de13857b72f820400000000000000000000000000000000000a55283b4c720b959a7ecb72d77ee300000000000000000000000000000001a1d7e8e0cc06db48350f6dbe0cdd07850000000000000000000000000000000000046c847fe41f2349bdf2a9daaa62410000000000000000000000000000003fc174cc1e8138051cb9fe591e64be2f6f0000000000000000000000000000000000167ba0ea3e1b7617e0a3fe380d949e0000000000000000000000000000005a8f95cd9c2f71d1bdda70f82208c1c097000000000000000000000000000000000014be29da3c73a7cea72d0291594a5c00000000000000000000000000000024eba1cbffaf8f4196d7f6f82bd5bed62f00000000000000000000000000000000002e44b96fb9dc942c716766c5098d9600000000000000000000000000000071772aaa9d0de4691948882169ee308d430000000000000000000000000000000000084a44c23aeffc619c84d1f84df2720000000000000000000000000000008b094f2e2fbd2bfc9d0123d26c9a2fdca8000000000000000000000000000000000003b4f947cd0f6a54760e5df757134600000000000000000000000000000023e3f180615c14ae4eef7711ae7be4ab13000000000000000000000000000000000005e3308e8d1ad9cd86677acc1fc38a000000000000000000000000000000f6be300b828d885f1b77c5b1c5b3ab222800000000000000000000000000000000001251067fcf0ea9e69ad16a1ad576890000000000000000000000000000004a6257d9d6f0128f8482b92f0c8b95dc57000000000000000000000000000000000012d2725382847994628a8529f0a58d000000000000000000000000000000ae9ecf3f5472945da551ee4ff8543d64ad000000000000000000000000000000000000b21ccbda3256445ec970c016cbf000000000000000000000000000000080c24c54bc38f160c4cc5f6dc5f9fd4aa8000000000000000000000000000000000026037434a8c386531db65fafeb05c4000000000000000000000000000000c0a53b12577b4e8b96572a453261647b0e0000000000000000000000000000000000045617b9f8aba63a37ed91ef75174a000000000000000000000000000000649d3c201e7717b1729ef780274e715b2c00000000000000000000000000000000000cab2441a6c3879dc40976c37cdb7a056680c34d76bcd98f0137a4fb0ca95631fdfe8ab05916f574954cf2e7216f422afdcdaf93bae350294f0e118674af06f635e9bdc960599bcf4ca8a108de90bf0560d6087d6ea4c18b47883a22dbe84b56fbdc268ce787b1d6ae8912fb9cc2d71d73c0f88f27e449ec237e43be3e5c176ce40c46fb99fda058bab59c7e98952d015f76dda337eecc31d02c22fef79b53005d0177372d9495a921a4fecb8412b829fa56b116dc189245218cd08d6a76a4d34da00889372cef9ebf4bd713e51b133021ed58c231516ba3001a0a28f13f47c1312806404debe453e765207bd00d50176980aac4d5b564fc42ffc9d2a086fcbd6bb179ed47cd4ccaa9ace0a88b1a3d2196cfa5bba7c8441a19363af4c69f77f69e189ec77eb5b4f08b6aa47cd76ab72d310eb54beb06b5a035323b0d48a5871bfe19d7ed64fbc7128f586814ea8b181fc3f145066eee6589b045e34a0607097104b17e68636b0244c58a70c1d0b3a1097a1e158290570bc00c813cd33f1ef1122154e33b14b1af66f0f70a8cc130521906e6317d749728aa4565c01005a97c736cbbfb0ae9b1067e81e06bbe0624dd029e87080742fb8b66e349d69b404dd075226d82e849c65ec52eadda7c7c23340b449cb736ca47a116301d6b035155fa871645042ed38eee3030a74ea45a49422a4eb8236ab31db9b57bb6658dfec1a6397f3215ee55c23774597040993980951629ae3690fc60f87a95a85201d7b31d068efcb525ea603aab6f37ff21bdbd391c095a6ce972b0668f6a74ae3d9db3dd7dce63ed6f86f4aab902a9b3e0602ecb10b56a5c1c85d3e000ad9b1dcb66f5f5a2114744fd7033d5a8a9692f5b8f1b1118c4c5c9f73fc1064c22a41dae1c6961540a318f309c0d02db188dd44616fd9020126a5027cffa0e85fa56e93846e892864f8c5f9a6b11ef0883b009f7b0a8060c5b9acaa669825490067ec821d756228bff04f4ea2af65ba846779969595610011fe57ee3f0361ef72e60cb80c47015b47b52d1d4297d09181d8e597ffbddb92682fa60acf769cfe1e3486446839bdc3a5209bf694da2501167ed3eb863a2e92ffbf0154aa99c955f7b8ca53bacbc2e8b32ac013cd4cdd0a8cb6f65330bcd6328ce73b329dc97744499ed884d2c0d84b76cdb36d205819e7b3ec547745940fd0f94f69f19364dabf9e68a186eea14860c0ecff138da769e9198aaf5ec793472296b794c55eaef4469cf6730bb7a5958acd0a24b0d5856924f8136fb57af452b2c29732315e923938cd9dad83c4e79d169812c6adf8edae5e434ba1f5a71042c0530029c187c01d0dda2849f5673953f6789c9ec331ad0f0df5836d92834625e1fc97de6a83b3345a2fc583372f6d5b135a98292c155a1442a1e2e338b9929561defc27e1edfae36f0924ab82e221c623002e74488f7ec5443a888702b1d1e26101620abcbc79e777dfc58eeb69cf04d4d159a9584d242707f3c27eff7165c3d18e116d5e4fa21a1fe5ef1ff15c7a0d2edd2c2a0cc527b76c18adf3e9d8bf4380ef82ee1f7f1a709ea80e03a77b4eeb19590fe47028a1b395e832ad35fcf87841b6c94e930858746d46c1e557da06d88cb37081b5a5584a92fbaf35322af8092225ed900cec2d0b84b02730db921aa021926e63461c3fecd5783a5f259e3850c00fd9b4283a288e41f339b9a8e35d01b83957b2effc58aa7aa76c3c369ecbef02a1816c79934b3812596f467ad946c804e1246fdf32f4a18bef0cd7341f0a5791e3f1acbebf456af3ab16598c9ae6262c0d58dc67c1bc9c65ca4a60dda0002e219b248de765cd9811eda04c9680a092460db9a52c16e1109e076339601d681fe1eada3f9b645d1137fbf62ecd207b0bcb998127ab50f1c1fe30275d41e7ab41f1a9d752b53166228690f571717346085d90a5d2c620ee7f3b3f2e584dd23d223102c26931d4230800176a6e3e2df9412b1a073d083d624c920fa97cf0c24d01e2949903b511df4ede0914c945f1c3f91c1e75635de46d24b02d5e5bb2d16bfe3141c32803e9ec1ae774b3d1579fbd7ef01aa8429a773065a2a58bf78fa55c74124719f75c265599507a4b3496ab8ed0f4aa66ed0c56d7594d9576f19bdc60f2022b7236c6e35c65c922aa4ac430a27822a29ae39757d58de80ff4fd355b2a64b0b9fd2bb8d70e3f62dee506e7ae25df5fa1d004945f6dc7aee2c0cfe388c1dd10eaaa0d5faf75664d1891b866298024890ff041dc974865bf91e229e2df311111c4f2affd23bd3188f4d3661cff51c4120ff223883566e24be635939a36e920c1fbe5df0df0757b2e8ed41a73f3e67b9ed105702818bcac56cb72ff7990bd72b21ebf5a3bb60eee2e4ec77904d3df4fe36e16df2b37a5f373d4f07617f98338d2c44a3549f8bea983e343d512def355e07b24e16421b2e420d27a410abba810e1b1a171d98d03f04b6890ace2311eb6081ad05c67c07408a47784789b1634a2d073903f801f271c1ec2f8015bc85aa57c33fc03708b00ceac23c88f3def4dacf2c61fb5e1ae1075b0bb693ef315ea2ab7cb2651c710bcea3c7efc2ceb68f38ae13157311ebfba02f76e6755d09cdecec7c690c0b50786ffd2f27ebb641e7f41e1c7e70de65ea91e8ef2c07edcff57b33f0dce6a3898754048cfcaf6adce04db82cd96746130f154b0ac41b262ecab78cecc01554a8f79b2015ed8ab907aacf2c0fd9177a674cf381d48132d5ca350521ad0a9ff0fffdc0b80eff87d7a93e38cf0be20a8634d7b0086bb4c0647c0b9177d8637ffc52d1f3b000e98bbf3b82c67627a59bc28b1d5eed73df87e99bf1b6d5e5104c16f9e152ecbee45a592ac119af155e6e989e9db1a43643f84ba4d1f2164ca1285cfaa1c32f543867dfac7c99750e33156d21cfe439920056426908813d33955b8dcc56f7feb65bd74ecea391a31b15e885c6b8ce92b2626d32780179b4861f48433fbfcad20e9f959d6521d7ae03a1cbd120e0a559289f0b512a039117c97ee01d956bb7db867e3ae10df3d40a02ebb273078303ca8aec244f01e42ba39fdc8ac8d3234692e1450fcccfc4fd4211b9198c9c0d73052d3c61e2ec398371fb2fdb44f087149f7e1935f52e5d2c5012e66522d88d55351d7c90e8c2af4a1eece22c780f704af1481bbbae095ae8170d15226ddae72111f2e8efca4b3cee852f5a5bd7ea175246b16c0db582425c101480ce3dbf3f0c027929b61c1be491fd9904346cccb769db8e88d5e465c6e7161c5c955e54e2de59af4cb398ca17f83ab5c431f65ed713e8fffa53600143e0b21ab431b49c9ceaa3490a08f8e27324513f969aefedf9d394d48e635d2f158eb7117e82027fa262cd95f3a405f2a9a26cf62eaedf4dd85eead5fb7c546f20a2ea2aa1736e6af14ff49c8c2c39adad4d5c275cc3fd9c3f429db91fcd163b2eeb9c05c107c85eff294c8cfd32401f140e84984afd0f2ad015b0fe9a1dbdc3b190b816a88238822ec98717fa4ef757d93f1f7c553f84515479347b231ebf9a1e62d80c69964449414058923123754060cd7664209ca446405324d91edb3ab51f4bad2e0cd8b1ce22ca55b7e18bfa7e0d73394c6b6360602b89a2891df0e3ab3f97a81740cdddfc0732af881ea9a895a26bdcfae644d80a0cdd9728416df0be35f811218d2617a5008ac0e2e500d49b3462973162c7c50a72b691cf39c15817271f8d1bb962600afa00d2b545b296b9aaad418d7de95c3b8fa9b29b7407d330179b7222496bd3ef097eeaaa22ce94b0d3a3e685ad26b14b182f3cc2b024c33d982ac30679aa2120b99ce059abececd25817e9a0f7cdf9f45908f4e0eb57d984a00b601944a5b6d89192ae7a3da290f6b25c3b092dbd33bc8c4d90aa9f39a7ce6b8984250e84d0a949131da1b9ca5d2b6191a7ebb519cdd9191c991168d650f0814a7925faac7420767b339493c8800e3b7ae60f9c2f057c766e372b30a5f5a354d453137a3a74b822d13381b8ce7585039780da30f80cf9772fdf8889e96ae81a222426fd41dd51bb299aa342f76e78f1bfee84ea5d7a6c9f45a0103d0d04c824ddd21c748b8054dc7c817b9e544acfef01008a538320f16cd4e28847b3c5d58a918a228339750e806845a2cfb6caf2f376c14ba812aff17eb3bc3f3600fdcccc21162249e32424938ff11337d8d502d1bc3998942daab251eae3aacd758676c2cb5f2e915287894314c7806ad433897242e42e275cfc488af516f878881299e8d6451cf2098ad66ad7ef852e6efff7dcffd5bbf21faa63fc58b780b15dd7d1c7a2630211183ea91697718badca03a4da5355ae0b36a92f332ce6929f170dfe81b4101d08baf870347221afca53ae366071832c0dd253ccaf2cb65a3e7cef1462364622e0efa826243d49b60bf260c2c81d7c526047d5c79d7ed80a491b9b26c5bcd723a5d1a3b2149c6a32112c1345eedd2dcf307df0f8c4472c3c5cb0c5e5b6a03029ac1ab93f42eb3290da9caeb42504890bef82e4575e424f7641630dcc4b76002d4ecb799603ef5b21525ca3ca3181a4cf9c80a222f32dee584a136b4ab7eac41dab70e109ad4d478b2be79f23f417adddeab2d24a6aa0d6329e3e410a05738b04bb3814f0100d5d9437757f03ffc41ee1a04f7498ac0e9eac6bbd05ed1fedb51fb22a4bdeb1e837a68600c7c6977f8b7c8a555c8698e71cabdb869c75f44ca917595d20af2c25f24cf36f39cdf82a7558945a09c2878fe62a4b1bb1a895c84c03c53728bd6043f9ca1de6a92534d62720f9783efbc509e3221d074207a3db2e166f19215d4e4608fb6ff6bf21f70d019ec9eb80414cd13cfa882866cf33163a0356404967e67dfc99c119af4b6d19705da54c312a1836d50e7d1311584029d80f25ff2f2b30ed9856602b9ad550472ac77f2de92a8c7a063a1c78cd4bfa771610fff6b311f7e1b053ed69fa7a94ba39e462fb3bccd82937395dde56e0f791bc2d450f00ce020f218c443f9b744c4f8253ae445e9e7e2129ea0eca8c7ef7a2111bd87e8d1f0bdd2a31b1019add7f003d74a68b50ddedc5165895a4d8cf3a7e600c2c5645d1befb7ec8c989b489ef16818ea1d22c192d13c0abe6c603abb270692cf905b59bcd392bb6b2bf05ac778510eadf7bac3709272af90726cf3a35eb162a91c2365ac05e796f1d9628061db93e0e3b987e5a00837b9c9c045985bec32d099cd3d2a7923fe97caf6893b477f70e63545b4a1254d54bbae47f6b3845a94a28ef83b224deb69a8ff46c08f9065d06418fe75775f443befebd75d36d68bb562cc42de4ce5709663c605feea8712aa07cb6361b5596f0867ef0d30dadf9b6db02e5e06bc09e03f2682ab2a20bdcac8d0b1d5be9c71df873bbd9d72b3605f08203e8f6bf09c64c897d2e12e29adbf95399d3510373c97caa467a002b601623162a080613228fe088581bdb7ff1032eaa16f8dd73aa145aede9081e5cb9f645d32fa5dd1d6b553d7f9b224746cee59b035cfdc8a0a6babb420af12774eb113e242b3779e7b43fe5b9e24bf0ae965b357b0c08900a95c36ab50de660d446fc86930f38c3cb068d3054d8590596e0b1b8012f16fc8b6b9db4b678337b46d0f793572c11516df2c0e95757b295447bcc5ecc510210c914d30f7cc4d0feb4e4e9318c265dd0634e6e15d282c43d2b1e8dc503c9ae51ee7195c7731f5f4fde8e43d4fb0890f3c744b775f4b42f7932b503304fae42ee83ca2727d05b826be2e3a2e89721c97bed35c38bb8b946120f7ac9494537e442422271e6941685e12827c509d019e0484adff2c5613069925a8897dac838aa3628a0bbcfa63786bc8967a5d193076ee39d992e49d16a031643ca61b0f242f8ab797b07e2f292d746538d749b5c1e879a7abfb18f13d67b2e17f78a481e7c1e59e21aab58c0d9d9c953e85542341d7244510bc555f0b45c1c02c7e501e22e98b4a41976004f309e5564c4d4b09b22e8bd636668260e8fab34c986d4ae2145b1b188d1c23ed26e26660519beb0ef014c87d236b49066173fd5b58daea40f7dbc05692bd05ea0f164c451f26771a5276ab7fd34a84d1148632d560d0fce5bbd368dc04291e497312d7563204f16b117b430e558b4b5ab62e6e0666b9ff633d2fc719954f4a9b27f6bc0d85a7dd14e2b3dd35dfb3fec0a240e7752e5ffd4458c72a0eabb74838a038105a8baa284b907d4cafaa76d5b1514ce08731f6765c3a22e3c3689f89905efd62e12505aa0742046aef3e0e3f9168364f928a2e31b10d31c4df762752ab37c1727a46ee193bf0a2b4d884f2e5d41052b7f46cab545b3b189bbf6cafb61d53b7872be6b4e8ff61ff7a59efb4fc669521afd7c6bc05492db59daf5165e5c2edd99e432fd8bebb30a92cf5126efbe2f9443386826ddb05ca8ea5c018581a31b81c543427eed0392252d3b4a0aed3535dab3a44ebd46d7d256a9587e96db23550bf56d3eaacf40e92529095cb5130b1ea9ebcc6a3fb80c156a24fde3e42d217c62a2b012ed1ec75208da59d7f80314cab02dea1905691dd005353cfa45abd6d683e9de8fd535481e22df7dc4c4a1865d3a2d351486f4f20193dd8f1bfd3c9841f81bd3d01022a3462c01c7e1f70209631355452134cfa688155379ca9f19dfdb6a0b01d2b3b9d0df00b629f2af61f82cb80d918e443e01c98b272685d09316b65a7d780247f75c8b19d825486338b2a134309366f6caace6625e7e5fa35101779891244515628c240501a66c658717f5ccbc72a8b7b2ed7a04343acc7f914f853fd6f173145df37a0050899e0d2cd2312add28e523f951d9339a40937c703d2777b45d7426b6dd2324a9377a5403b441944ab9b8755c59951138b7fd95fe8d2cc3bd2303a346d04710b9fc8519da6af88b27ddeaad054cf34b8e819ed0932d73f0c40f70b9884f051688316db3f3e881e7f38c84f64af879e77fd60233e715eab4e631d0587932552a7ff53290ddd259e566fa547fc9b19114ef1f64d3fe32283734b6da099e4cae11f6745d94c2c224705f712040e33086233803aa3c9b482f7a5e9ff9afe59d8104d33dc6e86fcf551502a6b3e4a9633ffd968b0014c83846d09e977c1011d0781ccedd6da350b90fb9b8bdc8d9ae8b21e3d025624e1e4474a4f0ea777f2dd0f428553edb50baebc7fd7e3478c24d90bc357b3d012a102ca36ae59d9fe81eba9e03a0daa81fbba19d860a3ba8d6157a0bde3e8bf0121462b5e488c1656968bcd9054075d813740d03cf622e1fe358e1fb4e79e929423415fd19c7abc7140b0b691c2a655363e824d46f97201dcc6cc3540c653cdd008bb9b17e5a7d1a2cbf95a20ce8dd3adfd2a6ba00bb1fc9526c324c7e8cde668ae8664bdc9a593ad2eae3ab182f4319808798eac0aad1bb02c78886541218bb96351eaf0eae3c4e38429cef20bdcf55870d946c785a60fe77f6174a802f2afa17a1478bf57346d812d5ad0419953e087770a6213594f908c644b43c447b528784cca69eabb8ff47a016d8f00de77fe590bd012d7671e189d1895da73d65f7cedda30c386b0f655d890386182fba3ba61b5b0d5e1c721dba8afea640fb7d8d783ac2cfbc9866c1dcb5409f4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000299179abb56149560ed425c742bcb879811d3cf56071a479240e6108ffa6e131196edb574f4f8aadfa13d7e62fb99692e2e0fa43e6a54aa260c6d73fa1c4b30c1cb8df94b2d75c9fe6186fee49d3d9bc9520b5f980b68840f2e9e90be7e0b7f21c2904fb68813c3cdf8d382f80217c097f273b7d29064395fc683d53957c0d1b2d3aef80bb7d5396655edf72c6f9140670d783ac5dccb62b849f45af4a83e0ee23b35c3e9146662d8dc4a95928c57b71055fb2f077a36f3d65b20497867eaeb118dc253f6ed05239a407097e7d47768b08196aee4fd667dba80ff3dcfae66bf12060d77d50d38563d140d068dfdb10fbd8ea0f9d9682d68b7fd47878495b3f4216812a01bb27b89a07a146e1b22041d30ad8943fede9c71615a0637f2365aabe05048b371461e89a8552b6263b3359f68a3d8f4c00964fbcdbc703d13c837ad421c7ea0c8d3d13e8e5caa87bdbdb3d5a3319f89a6e01f55d5e526668a108a2b51f6a5f09a3fe264caeb7b3d9be6f18a7ff4be543cf7fa9aa6bf431bd26befdc72e02658f2328fcbcd74504d89e6f902234c6990c91cbea2425a8ad117b6f1bc4108c4d695b929454a048b4e60585dc1a0600619091340df45225a4c2f5de52cd1b0fc74f6af97cf5abc0df3cf93ef42b5ff9e387438a2805e5b9ee9ddf11d1ba1627888a418a71c8ee884fa5a61e2dd9d263d56a34321b359a878167f90fb0da22301fda5326289b7ad05633c00662dd4f6d438e48a63cce05e240575081066e2da263c7eeceaa3fa1996abe31daa005292db627d55f2c6f38a4441587525fa5215ae7f9a0fe09b07d47cec9487f021600714ff0772cac700270fbe6acc649fb294b306281b954f5d656d25dbd98c7e555b568f41bf21dff2a51ea96b9aabce708da306640224916198e73fb702a0895438155bf1f6f6167a9834e4532819911076e0b9b053be6d43a6f64821f665536cb356c0fcfc78d9870879e34a500c8ca1ead9bde7a5cdcd3388c7e2a356da23fabee65e1e4343a7c1aff58fc045fdc5d2effefbff062de159411942091d17f413795d7f564cf68e0d75a106e0d27d92509b9fbaf5100bacce4b6472d27174b85d1f65d0f82d819f9a74c1f62e03686ea1f38e29d6c37603356a2b4a58dba6c55db04ab7d9085e063c93d207a228ba6bd1b090beaf62e2c9223818642ec77a0936e4d3c937bae589a4df604d354c005951bc0cf093f4c46c7560ffec609e13fbcd21e019949c25eef6883ed30cd074b1f0eb835faf204891c1de6ca2ca159d514793776692f4ad1728a595ae670126e10154f590429d792afecfd2012dd607eb78366ec786a1ce9e45d4797e1d38d4082087f2be81fa4f338b979a9da6ece7ca24ba14595eb03d4c1d921f8c663b659930b647fe50351254950025b142ac6c41b653d4a103eabaf111defbc2ee1af56831325785c96572909c8c5664fe06d51717555462d92be073dcc0e19d37ff3b44e2a5102f3984771702abd115eae19b76d82d73614aaf665e8ba4b3a7c5575eb8326bd7c3f70db6924a833a5407d899f76c6c11efe33ff579cd9fb59b5915859bf1b3497278699f0f1562e49a6ecc45d091960cd440946dcfd59694d1612efa2d12f2fc9bb9499cb1019a8177346f49309bb69500cf849c58a922f1e9c9bd7210a2995e5699a307302115880edff6d068e91c61da9c7d123de7db435cfc8f78bce0f82fc7d4c3e7082d2a3f7f9b2675a56d723cc8f49cf648cb687bddd6c18add40b405c0e278c319aa7640c4941d30414fb5eb38baa23c7770717c4612b7c28382b621243320f945a50d26b10669236ccb3db47f70ab21854d0b7c0ba52ceefcd30111d2dda27762f06d7a78e812705088600748483eddf419a297a739c6c6d56190343291e732b096b3b0306e7844f708800fdee8c364253d8b9864cb3df109f0fe9edecf6da250feedbea86a921d8d844b022efc49ed46d29da4b74e3eacd9000000000000000000000000000000096d91c5fbcd9fa3f3c9c40376a5afcbc320000000000000000000000000000000000265110b7d31ca42e8272053eecc5f20000000000000000000000000000000a0a97acf20edd350325c3329ba77cc8df00000000000000000000000000000000000d19a7a1262a9c4baf3bfbb65045940000000000000000000000000000009c69ddd455e989f4084513595ca5dd14a5000000000000000000000000000000000014fe155cfadace223a4d9545bc9f6800000000000000000000000000000046bb732c16e0846bbcd158b61765e672a20000000000000000000000000000000000144accd117ba2915177973c6663f3a0000000000000000000000000000004acd3cb46ff38df9a81e8e5a7d5b123dff0000000000000000000000000000000000045df89ec8311432c488d379b0aa2d0000000000000000000000000000004a9b9f18f4ea8a68e7f8ef77364bf9af6e00000000000000000000000000000000002296a3c393a43befaa77b404ee521f0000000000000000000000000000007220ed1e5f16b3f8f0529c524d2b12414f00000000000000000000000000000000002e62d4271481355349b0d0189646e2000000000000000000000000000000e13bc6c670b6c72b2d2fc789bc04c71f470000000000000000000000000000000000002a3cd313014291a4695f75e410ef000000000000000000000000000000bcecb2a9d89c07a357c265035ddaff3e8100000000000000000000000000000000001b389f346d7cf2462cf2dec385e128000000000000000000000000000000a2154b076826e6bef085d73c13f49129310000000000000000000000000000000000031b6702b7cfb4be0f6692a3bac7b3000000000000000000000000000000dacd79a097522d56620088968f3bde767000000000000000000000000000000000001d0e74be751f05cc4b81a3fb6a422f0000000000000000000000000000003e8df4bb037daa92246b9ce5ddd0aac080000000000000000000000000000000000000f2b3440bbd00c687a407494a7dcc000000000000000000000000000000c0cce09b54f55ae72ff7b9d43e2fda988c00000000000000000000000000000000002b98d77e4b13864e69ebbaa48365e5000000000000000000000000000000fc3edae5ec8a24b61f0a07127c719bd9c900000000000000000000000000000000002ed7e6e96bdfbb4237def720a116e7000000000000000000000000000000525bc1f11cf0c314cd742bb2407c18adb700000000000000000000000000000000000ea314edb4407eddd6145319198d8d00000000000000000000000000000072310e9b94e317638eae85b8894596239800000000000000000000000000000000000bba580fb1b031fc0667552c430b9a0000000000000000000000000000009d268709493a2d6fd13967ff258469bc4000000000000000000000000000000000000f06c089dcda094fcad125e1ee91cf0000000000000000000000000000008df08f94dd49c762d588a09bdfb0dd72710000000000000000000000000000000000197df83785ff8906641cea13c2b6ca00000000000000000000000000000026f4cca45edbf52f9a297cd71beccfd15b0000000000000000000000000000000000302b83330392e9bc13cb1325598336000000000000000000000000000000dbe51a88266a67fa97161ffd0e67552fa50000000000000000000000000000000000038b8448a99858a1bfced9be9bd9bd000000000000000000000000000000f26857ed6499c96268dc09ec3b8024fb5a000000000000000000000000000000000014c05b26f75faf3d8f139bd609d1bc000000000000000000000000000000ec812c68c9a117e90de0ca9cd054a3d9b800000000000000000000000000000000002e62eff69e6e54d8f8abddbcf671c7000000000000000000000000000000dfae4bc64e124586b6da46a09fc536653d00000000000000000000000000000000001b9a470640d0be8f192d0cc3e4061d00000000000000000000000000000086ac1ae9d29f80c61275b685edd9d48c3400000000000000000000000000000000000fee993c976c5195ecedbac43db04b00000000000000000000000000000002d4e17f5dd313b0324586456514ba5f080000000000000000000000000000000000071e3ea502be114aa538455bbc319d0000000000000000000000000000004bea6399737139b8ce17fbe9f7b4c7607f000000000000000000000000000000000028ef9112bac3a48705f2d5c5991092000000000000000000000000000000a4765ec1e6e082bdb287a26f279cfbfe6600000000000000000000000000000000001817a75825ecff001deedc6d7c03f20000000000000000000000000000003d9c16043b4efcb3c1ccc01c73c0a5e5a100000000000000000000000000000000001850358f1b10eecd15d14cda40391d000000000000000000000000000000117dd106a740f124481f79c2e00dc0b517000000000000000000000000000000000022af6c8e792946f9ab0ece9f411942000000000000000000000000000000f626a621417487bba7182d071365f8e1d0000000000000000000000000000000000011ccea3a87b6944d2a2b4dea9de4a0000000000000000000000000000000d635f5b2342fda66e8d0d987d7772927de00000000000000000000000000000000001ff3095f983e3514ea01906271a49900000000000000000000000000000073e235ebd8bf9268b066ad05ba33792ecb000000000000000000000000000000000024e49fd470b55e99c25398393e2434000000000000000000000000000000b198d860097d71b1929f407d2066ee0dac000000000000000000000000000000000007941f15d06c8f65b144b7fa48dd03000000000000000000000000000000204923effd9d10b5727f667c50409f22ac000000000000000000000000000000000004a552c385e9e827284e948dd642e700000000000000000000000000000013ab17fc0be263fa84f71a27f77b3cb41500000000000000000000000000000000002b09b2ffbb071932461e8914f15572000000000000000000000000000000c09d31b362c36baf02bf9245ed044a0187000000000000000000000000000000000014f2af9791ca84baec34b4620024e0000000000000000000000000000000977eb643265e229fcd1485aa86890fedf5000000000000000000000000000000000025376db2aa47392181e97a46569a870000000000000000000000000000000103773f5e32275aa48148a6dde00ab912000000000000000000000000000000000022df157a2c015d47277241de82c2ba00000000000000000000000000000044509218df19dce556686e305fba5f51fc00000000000000000000000000000000001e52a95ede5c93d8eb151a8e462b52000000000000000000000000000000b395f548eb0cc1b64b12eb27229e8ce0d000000000000000000000000000000000001df0d2549017ea43d36f15c584154200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001d06d7c70fe39f4428f9759377ca84abd836c5962cf1585b9f551494a87771102011da31edb85766e836fc406c73f72dc84c90c338cadb8b0899cf4616dcb5350fa15ccbaf228f713cff3bb68a4e4679deeb156dbc4df4ca1669606e9f0a562f25a206b33e77861e1b562fed029453124a28588ef688ad7dd03f4ce24d54ad6a00071c3097afe8ad968e88550dab4f3330cbeb82fd9545eebb05ff72ccd0fad42867e4a60721834aaf9886194bb1e7e52ccfcbe8ff1d830d3f3e80074c4c86070c26992ef8619f0dda29daa6b77e3883f09980b2db8aef89ee792a7307aff99918a15ac4195de595cce8f90126dc475a9bf9470f1312a236edc760f6b9775d3808c2fa3a43e223ff44d383b9a15583b2d544a413c9eeb68712869120be1bde9e1b2e8f4759e322b32170f0f5b011a8e0bfffd3028a4b62a257e6543e39b03be402416c537aa8439fd8ae591c1a87b4558261dcc6c7c5e550ed62a67bdbb6d7e3005d15dd3b37fd10b4003ce9ec6a317ba9316bb550934e5f393bdf97381503c72d7a193185bb81ec73b39cad371e031a98cdd670e78cc0509fc39d0e9080f0cc17b1359d7211020b00bd867abe8d6876fd5b06791890bad16a923cd2408c28ca293c3f2b8535451e50186dedb36f1cef89afadcd502985b1683607a3e28d4313270b69abc41fa89654650a7baff92e515b6b6110a208aa3e05db1023deae679f1b33775bf329cdf22135cff5d71fef2fe91100e58c2155c610fc94717f07824e22203ebf5bcb50ae4c9c1ff3f29e2c9120e643fde1cddad7f94a8b213bd135aa28e5576baa55571c2acdc8d1c695c0667c0a880d67da8353622779f6984ab0220dad20b4105789c821521334826a43274146cff6f86c7ddee79925975d564c620852c38dadd36f4d64046c1c25cfb565825782ca80a26efb7ca44eaf06d3f5a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008db5060c8593df5608bd34ed5b021d1fb500000000000000000000000000000000000d964ebc77169d8ec65d38514421570000000000000000000000000000000a12d4a34607550641fd28c5dcf9c0b838000000000000000000000000000000000011ffa635b0d0c3410cbb8a2a6d7d32000000000000000000000000000000fa8e3ffe254c3bf4493a985bb2189c2e2c00000000000000000000000000000000000fa62dba3c96f2975fc88082aec4ea00000000000000000000000000000021472a58a601d94a319e0278603713afdc0000000000000000000000000000000000070a0839e4e42c6d5cf49680ceaee50000003c","publicInputs":"19dc71af02455fd7b437af6a07b08fbe005c18b2f4be65c19bf1eb7cc0c884ad00000002224a70c36120d8e08b02885ec88395e57c7db919607b2b26d7b1a761a85d3ba1000000040d500ce5eea424fc5dbedd9d2e20273f74ef1093210ecddec74c65b7fbec3a9d032a9a79c14883dbdd78fe7bab0394b0491e66bc66bfaac2edb5d1c5a5994f70000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160f89744843c7ed99f717a7b6285740719b13fc8c71cc781b2b7bc669662a6a0d560ad12f14dd5026070bc037ac343535db339212f0904dfc96c4aea4dcc8ab0000000000000000000000000000000000000000000000000000000000000000"} \ No newline at end of file +{"proof":"0x0000b3640000059b000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000000010237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae00000000000000000000000000000000000000000000000000000000000000012925752f6e51bf2738d82bf0e4cb0805eb37e908a909db140c8ce9073d03bad900000000000000000000000000000000000000000000000000000000000000032da55666630fdf8594065c377958c827dc1c130dac91f17c6699b53dce60ef752c2cd74ae9c2b2a1ab717d69eb4753f65607db94e93a8c0a51f23b96e34f3038000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241a65339d99ce6f973739bda9c459c80e677af4783b35941098d8cea5b54022dcbefa1ba7a12eb4f2ca5632698034aaab9a60c0428603cb64a7685760f203200000000000000000000000000000000000000000000000000000000000000000ac4f3ee53aedc4865073ae7fb664e7401d10eadbe3bbcc266c35059f14826bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac4f3ee53aedc4865073ae7fb664e7401d10eadbe3bbcc266c35059f14826bb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e7f4db29a33c7bc000000000000000000000000000000000000000000000000ed49e97fd7fe5ac9500000000000000000000000000000000000000000000000090b4c341609973f90000000000000000000000000000000000000000000000000001ca25a0325af100000000000000000000000000000000000000000000000dad49a5e22948da6a00000000000000000000000000000000000000000000000d1c2474fcbc5840fb00000000000000000000000000000000000000000000000dcaa30af196fd23d90000000000000000000000000000000000000000000000000002308ba6a6655e000000000000000000000000000000000000000000000004d28cdf4637523a2a00000000000000000000000000000000000000000000000d7853cd15fee2d4e500000000000000000000000000000000000000000000000c3f4ac44973c66a3000000000000000000000000000000000000000000000000000018be2f90f4088000000000000000000000000000000000000000000000001e3a57aa949af543d000000000000000000000000000000000000000000000007e5ea0fe99a92469900000000000000000000000000000000000000000000000f214cc918d2a5f92400000000000000000000000000000000000000000000000000023c100eb331e000000000000000000000000000000091f3bfe5f9c9c3b173e3036d8a3307e9de0000000000000000000000000000000000066b3766100e6228dbad6bac16f4c50000000000000000000000000000008c449318af170ae6213db4d074d95dc935000000000000000000000000000000000007795f6456bf9f0fb91b4b85da625e000000000000000000000000000000cf9848382a0e66a280138616fc9c249adb00000000000000000000000000000000001bcf32cbd55b6b3a666937fc3f8edf0000000000000000000000000000002f09183910cb0aefb011597b98f243f844000000000000000000000000000000000000593f0f28aab706e410019dcadba30000000000000000000000000000000a6033f17b156db5ccceee834fa616cff6000000000000000000000000000000000013c138c24dff08179431b79b5068c00000000000000000000000000000001ecac88156d61863938f02c41216b8db360000000000000000000000000000000000252f6b8dc18cb5f6b545dc0c60eb1200000000000000000000000000000096650cbf350fd79e4e21a3a53f084e5359000000000000000000000000000000000025e86237c45eeb6939f852e4019e10000000000000000000000000000000870ec61adc23bc1294a793de7d329135e300000000000000000000000000000000000d59e4f667228b55d76d57b80cbb4a000000000000000000000000000000dfa123d263c27f5e0a447510bbbf014a24000000000000000000000000000000000014c0e9197abcac09fcca8aa3f56231000000000000000000000000000000693200aaa7a1cf111060bfd9649742812e00000000000000000000000000000000000a64ac6619042e406467e1ef5c7d80000000000000000000000000000000943eb949eb308771c1e869edbf1841ff9600000000000000000000000000000000001500279270c3f90d607b10a71ddd52000000000000000000000000000000abd4c7d987d9fda5eba112d0af91347d290000000000000000000000000000000000287af2e9da0883ea9b240a315b9ef60000000000000000000000000000002de60d201937100a2eb81f8cf35567c96e0000000000000000000000000000000000176dda3e54555b05161896f6ece72700000000000000000000000000000042f29116c4bda52cefccab14522ac6036300000000000000000000000000000000002ae355e6dec29fab03b5ad15bddee20000000000000000000000000000007aea39ceaf25e6701dd110975058d4860a00000000000000000000000000000000001748775b76f6e7eef4030ca57412c00000000000000000000000000000004be73afdbee9f7c834b3aba893345a96dc00000000000000000000000000000000000e9d72e07666bd21f05a55343eaa4a030a7e92cb52c0fcdbc1e5b66db397763920c5c4354d4aec7ed14fb3c69ac3fa2d59cfe015dedf2cdc8e600013cdc0e6ef132284446c25a4c510a5e029653c072b41a16d2ed27f730ab204592e3a660f1f7dd9252855c1c4b271b9416bc4f20606b4d830d14765142ff08104c499bb24b5433cfcf25b3e3767ffafe13bdc62ed16d7a3775d3eaf1af8bc2d37a3316c488a8bbd181bcd33ca48ff0ed0158d1d6429e6528ff77358d50e1fae17bcf4fd1c3884eb4a74154398b666cf79a3b8486f27d3c21d06fc0d8b884a6e026f3c6cc010bb189ed50e543100766f67e363ed8f242a6b1bd551132d0f2a4cba597b9122e936d2af7990135e1349d66dc4f019d82d3124ae130c2fd190f750380fc127a9af0bc9aef9500e3139f536f4cf7fed762c948b4695e4b46af2aa64aa399febffa2c93befdb21e20ed3b00ba64370c3ac2722225004fdbaeb3719ba760fcec0b6d1233068f085314a809f42bb600ba06f2724a4f5fc44a362c707ae9620b83a6ee75bebd33dd277460e207aa845856e9801a4cbb20e0c748e1dd813a0fe3a9b663afe049bc95f92f0c5185a7d639da62719d3a08c7b6fbe96149bc60f81207e716590672a627dbc8e0fe4cb1cff7e63f92badc4e087622bda8db6f3d909c83238a6192f351c28a45d14b1991c2bd6c7db11856d4920ae25700ac65d48b4945beda5f3e37e0c67da7f2f565ccbba9b888516a4e9eda070f6a1da4adef274972cc8a9e4c15c648e959b98a7fa5cc357456f12deb2382f48c2bded2032382e20a70dbb628804e27f339001c93c7d5b98a6452450aa98ba8dd10a6678ea0242e65098c227bc1dc928563282c82c53faf537292ec403cf29a1319a021d06db6552065c5c4a7d68aae7257c62edd568ceb6934c2f34d040a39af552c560b5321c997bbd7ce4cfb6d7acadd9c22b14426af478ef26fb564ffffb9629240232aef5e42fa3db2d7832f5e6786aa79743d57e958b6d15b6218822172e8389a3f32dd58c7507485c89e47f647b865ee0adf8bb188bd824230a945a832165dfc93887de320b5d4ac54352b8b1ee1b761acd1fcb42b4e42a82daf4909f16b239d651a8de66331dd97efa6a21c89e49810ee2c3d26e483614db28fb02ea5d0a69e901b5a6a1a0ef1aad9306ebd1b832d28d81f54840ce481fc6bdda822c08068c9dc85ee6374de4fbd9799b4fd0a065e3801435d181d6ff2e1a516fd74d4d1b4ce61811114ce728b0085caa000652b4248c1b1b52ee397b17c0314b6a0b901cc12bcc75640fc3648f8a09b4003deb42ab618e3869b69d2a195fc243b2bbb004c78dd9ec4989bbf342e28cd900901938668664afc08b4a0126035159df2d6129688cc300df36c2c6a143b431b8b415993a6002aa45ad3c861e81a078dcd59cb7841e851a35218da2becd86b9d0040c9e84fde6aa8983dff90ea1df312fcc07e0e78a08d8685173ceb6dfc339292137026de21b9d45fc161c17c9b490d4f4f12790e28cf43b75a70c3e7338548a551273f37ada27ef9a1002116328debd7b8f0e88c0460efa16a5c2bffd1d1ce06b60a34e659b4d79f9f5d605ce6cd28ab72472748b1e8b67b70fcaf9c604697bddeece0aef1903a9b4addb1a64f2bbe4e2ff8d4a5f1db8d1f3365f63dd8df7f5c363e16238bb30f0fc46f11c8f5c39a96b7c1eb3249d330c7a306b03f6589c2726fb5d191c2ad285fcac00046a61db58ce5403c7ca5c35c4c563c2ad1e2d3cacdbd230ab5e883dade80dec18d51a4d605835b2d9272fb80af2de9c118b18e04d1797516d389fc3466ca0d91a9521139825aab4af6f53477d1403d013de6f768cc167495017a4774a5af12e268487a5a53bed1999dd7495a3411433d63634c8ad6ac9c6428008b55fb674e210ffcd055fec443a3809b4174d03145472e45436ee6b5bcb50921089e4007c221bc2f15b6864dbf87bb90e51eec3ef8c2027f8c5a092d1c41356c127f2f7debf1b3bf1345aab5c6c34da371b8af768a26410264e394e1428e0e0ea89687c33722598ae03328533f4de38f79c5e148f093c31dd597d269513c76ba68e1ef3b5ec08a15150a5fc50feb6305092b086215b18377c9770369bac72239cbae72cd6c3013771029abe458eb35b12a768d990b97ca89b7bb6a029a220f3b5e34e510cc31576e011b2686118e1d36d173766bd6b082a9ccd80f7aba59e3e4f9dab782dad049146a25646471002b57358c722b31a53b4ed59c033eb45124eedd6bb8879c20130eb718c07145fb9347ee363ec3dee946c3550ae738c1922d4a935b459097310ac7bd937f463c5f261fd65e681b0db557f303e7161fe77e7b83d427575119000475b48eb910b185fcfe1377461952dd3bb8012d3b0d67cfaa2299f9c9458792c41e141acc7c1b2a21bfc841d3e4d01f9182f71573a0a9a27de7ed91ed0d2442bfb71915b1563be538598d914d4f31496e954aa198d39edd1c369deb86c22dc19923c24ce6d55a387ff88a573b65e39aa4b55621a3fe535a764c850b09bafc01cb1ada2cd69a2d5a6fc511482746bf9de45af87ef726d6f88d2819a9a4dfa100fd1772394594e4709a6dcea556f8cd33cf2c5da33a59729b3b39e90c504da55100d29d4a6162a351f8391fef5b3c793be2da3c57583513f84136b7bdfecbb4201049d428ddd71ddb9b7adb5bc33ee937a12fc09c9159319f96e671e65fc1c1e0eb12a061cb8749aa019752521edc1894049f0b2f7d885559bd518bf4a3f0e562edf5b01980b1c53d913695f3b15e77ea043e43487b8c70c3469d9ea891ac942298a91098f0a5a9de683c1b3e82a203433c6a8f15361e91766876d9787d9734a24b012b46dd55aa12b5358c3b28b707ccbacffc4a76c47c6f5b7bcd6532cfe0e2e46deed7bc771e16c3639836ce9c9d973e60d25384cfd727380c40d88a86c122e9249471681f56974515ae6d44f129d6dd325f817fd848cbbffa80d3b8546d225ac98e3373b80b2eb4e0775dd9b576e1e627ef7aa77c15a5e813cb90b7fc2062cd6a7fc287ebbfe316f911ffd4cbceae909ee8ec068d83235a69c3cd6f8c2fe1d34db9077b71367bd6dfc797f91fc44e4deb469016dd4bd04f405e809933bac12dd72d845ae0c2ab8ca0a5cd357401d99d70bd3f8283b7dcb2fec435b59933d03935ea714fe02f0e541db40a308f18945c7066075e0786b8907ee22a29ea7491756b296d3347d7ea5d62fdaf65884c321ddf9e98b2857a970156930689ae05717866e82b8fb1402987ea51baaa86f2af7d7612b5fbd2e2cc41a49541a0500c21682b641d4d6afd438ed950a2a068e96013b47316ce035c7bce9c9b37d3367db10fe6348c0ed6b4d5d61f95cea1d5c63a7b3ec41c8f19e8f3e4c0d1d215ae1351ee7a9497c7c2dd42d568f2448faef048b19b39352fb4934fd7b078323e198400ec8406e8937901d5edac991b252070e4919b3c5716a1229efbe0681d16168052226d55b0d835f512be4d36abe8e3f158b7ccae5d5ef343b7fd958b53e3a13591e5bd7c4c2e6fb21222b5bf52d341f79d3ed8899e2fdefd65163a6b43bbee5012a05cd792640b15189fd6aa599a0cdb8349b39b35f361e166a5e323013711d011d56415ec0a4ffd85741322709766767e75d47cc9683d0063d6f5484283833340b1f4c8386e8053f150f3953ae8c05c00deb270e1feeee68b82976c31d72e2c0087ff388e8840fa2b6ac03b93bc5b8c82bade4abebc74b5fb3f03ebfd65bad21101cd9c9c6f677ca994c6795ad69d1cc98a86920f2e0767c6963ada0ca651e2d2c455d233930940935e6c0670d8186f8046a8df7ca53fecaa8508e3abc1a41ed1269839bae75863894238219b09f612f84b5773f644b2ee1a1a14661c9075ef52aa82e5d0babbef91c3e05aec3ca51fe2f741c86ba1c5b08a331fa79d4e13c240811954e8ec510f62d0532a533deb0c1c99dc97d4aa784abd2ee6ca364c39f8e2863fa053e7f9fb577e9a6d01b9ec7d5537615d71d9aff1b848da01516bd96a604b50f397c34834e06250ab04c7e10aa692eac8be6b36c712150af4e9ac414d32c985886c544aba1d713fa51cff707e09ba97c7d90c4506c0888ac0aefb4dd1e02759db149b40826b5de2c61297ed99581114136953a0ecbcce1e90e96d859c817ce75e5b7b86822cf6ebaba04dbfbc913c0972943aeb0b42e19de8a132ff62d110bb67c2df9b2287dbd6b4603df6869b6d3536bb5501184fdd76fc30adde8ea17dc026b8fb91b6691fdba900f0bac657a21f6885bc3321453094447a0d456d72540c6bab1c24355327e6f319e2d2bae3dc336bac5563c3f2ce4cc9ac889419b269200b9952d9f0083c0a1038c71a63f309a9eeb8690eeadc5c34b452ff1b1262c2ee193825b1ceae70d9505897ab96e1e7156560ee7ac8a66f038cf26fceddb1e2cf34e8077c6f976f532dcd384731001e2651f8ff32af7cc7e4a2b279c567f016d0ab776952cbe052bd1895c9bbb1d9b93a0f6a36de95b3968259acda0a3d51b5c9d352d7275181a80c1c8fe1479b46b48b50e19e64b61a66d975d399931d52ebd39222b2787e21e15957038211856d37b62e11812c0ef9e75822c2781c340235f6c206bc1f4f25ece1fb3877f15736a07d09e4f5d4aa0c907a1c615ba38362de8a3f081b9bcb451b87dbafd8185de5ba37e07778613f9546756b67d8552d612289d83b4fe1d0541a8071f13318b0cc0c7350d3c6706e3c09d9e6403fbecd82ada85cc595965bd8c02f6a3d328d4f9785eb83fd98d5207c128c3f215e938ae17a16b12c80bfcd185f3a9cc7e3a2732fa255e58143600f2f16d91e98e7eb4f706d9e22bf7c049156fafa3803fafa5086b264022d0d54b2c670755aa77ba95cc0a72edd2ce16bd3f69bd220ea0cd28e8fd227876538b57355d058ca3e8f590362fce1157836b2dbdd5a7306eba9cdcdacdf412021c9b996a4eccbf93992c532701cd672d78acce91c98cb99a23fb7c5cf40dde269f0f2270301fe4ab67da56ca0ff7a75a5c5380a28410ef82bc337ee2d57eb077a94f56e6aa4a6238ed0924470dd09741a7c8523fda77861d7af0948d975155b612d7e7d8ae2605f748df6b4f23366ea7ee86d370604aeaf8119db82c26c08d7a793344ebd3688a0ff917dabc0c3168b53f5be5a273a923f36019ada90147252002123eb3feb05155b95aceda12a841448b50e8ac9bee11ea1adbda0f042bec8cb941cadda12b01b06d4a713f073e2bd076c547d68ec3b19eb4a2fd65dcd660111de6529847a369876ffea86a24a1dd0db68254a6a7c7db6497e18c415078e29843846556e2eb672954e0bf72248889d551119d89a7c7e36a0d12efa851c506db54c7e788b52c9ebab2fb0cae2db43c10f5cbd33294ad252ecfbc20ddf5e18c2d6b5e661a3f00e8700bf22f4d0837ca356d58a7d41da23e4373e54179d97e595f8a544cd33ad1e1ce8d293429169964da6111712c45e7e5bddd9dd9b276f07d381267817f476ce9087c7b436607e208d1ae86ada32fd79602f1b26eb5fc810c58e8f3fa2237103e8c021eb0e21d7c6bb688a418a2259097eff23a365fa30f605057bcc2f604c4564f02114d0c2a6501bc5d47c980c8c8555fad40eb19878ac43955b32f66a6df8d42f85b18c90584b3ce3de7ae61c37b72db485b0d8ca07daa48c73a66f3312c5512b2ad6bcd04956451e4ec5938744282fdd9142e4d3de2a0ab2903bd0dd2277922466766b01d5539b2b5ffaaeefd830ce8e075b9097bc5954cb4c7f486d355b294d885157219c60aab412c8105113bc498e9d68c490d2453ca7994ceb23e2e76ae8631b9be0fc18d4da4add967e2fb52fa71157bf60569cf435e2830542af4ea9ac2c255a40cdf5ddd450e75c3c6cbf3533bc06395e272ed2e18c1a6a132dc411f496d8bed13232cc939a9d46a217f4b98e9d6f2c61f656e6679891c6acddfd7bb9f76b5422f7aac6066f61fe3e8b4815872c7e0fbb4122e05d0c8428fd475b7a6d6e2d1a60e6d49dfe364253e7a74615155ed5c51ab53ec4bab46043c53bc5b4a334815050006ea15b793ce863e21b6fc74f39ae4d73a3c1ba04b4371fba56680107ec599283e765accaec717186927afee813c0c61345620e41582a4b6e1763d239348c00aed40e84f6afbaa2f132a345af772acce7d8a3429fc72f12390691322afd6b21378102f808029399b18eee20eefb74308e22aa54272662f5e53ad6bce704aac277fa2d04933c524165ef30372adb95e6fb3c09c4623df2fa50a8826515a1fd7171723c7d36eb5a62ffb0a1e42eac359818f2f0613fd672de920b3514c251dc714682cd869e429808c60dc07939bfebf6f0b4e17d468d4bd4ef7d5c50b3c80fd0c2250c1ed3f10f37c4a7aae14efdc99528b787a14f90a8d3c97d2957c9db2471fbeaf4d5e970caee4fda90ef87aa3aa1b3fb3cf7cd2a8eb87588d13f7005236231fa0ccd4f023116f269e95dc0157e43d50fda9282243c2d3e0b9ba52dea1210116777d42045cb667086434b700584ed21175a0a713c220a9fb25769fd9a768038d24f1cba3abfe51a788769f09a8fc2d6273171d09a065187ed15ec5c941061f50bc49f3fa3a6dac9488e0a17b95984d31f230105f31d5c41cf319661ee2d50ef16f48a13c7fcde2b96c4c1b5fa6b08a80aeff3c8dd5fcd889d7684f72b0a11a89a8171d0f180ddee0e44b836d0e6950d3cd601eb9c418d48a246b4977762e2d75ebe775d3abef64e043d86cc9cb0531670ade2e0d1d915741de824706fcdc179bcf7582a09b675d67768db9aa27499d7d4cf07500923f7f0e681e3a852f5c11c56fd7d11c34d02212e8447b46f2c628e744caa9a1079eedf1c10c880be41c085512abda963eb5bbbc09d311b3a8a4377fd6e8c9f9b20e72168c031973135914b7fac24dc0e57b32e86b931e8d793d65ac984733dccb31225f5c7cb7676ac929f6eaa2e9741ed87c198556b124aabe2e8946ddaef7365e2c48d3ce79bc06371a09f587d1b99a488262031011186674cd9173eaae9217b3a44bf54ae3ed4a5d0fb4c9e7f866d7c93b3eab57fce71ecced8cc0009318cccf04b2a7abd1271857036e6b65a8881c2b5d61088cac87b72cbdb3ac7873271ca8f60a19d975b567bc2907124f5e0e4e8461223b870f06297a10f24311bf56f47c2f4deb4cd6db0a230a338b8383431309470ba3a3843785e4ef43a1c746d8651e99665da831d0004e21a1271314880dd1d29bb95f3f14c0f8b86aed6be2c80218508e2b77526db213080936a1f869d17a38b30ab453bcebe9fa18b2ea2262f49667edb780359605301a7498f7c542f884f8418df02fad03b8e06dec65355ed7d4c85cfa075bde264c0ecd7f93cff65c4e004085b228c14ff7a13f34a578d11d19cd58c3a105e86d4f209f7c56ab7204938156fc5b095917e7caded57715d3904cfef2be2ca8b4df212ea3db8726ba2e16d2e0e137dd0bc37539980be8b70ee95233302262c75f51b61f4a2bd88135279b18040b03044b93969f9a4b34582dd307821a0053674367e70b2c4a54e6388f9fd98526b773af9b31ef3e0b78d5af4a06296367fc3570247c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000237f2fd32765627dbcf6b00421894d9cd731548970aa8b15819fe62e85f1419a1a09f8dc69dc3bfe59a55c9095dd23d95f8aeb4a107f2ee1b2c16fbb4b20b9d313e9c7268c955e406bb09770414b87305ff00fb25c0b6ec827bafa780bc3b35c1370122a399a92211f41fec156c4590f817594f4752705640a508a9b7247bd660284df1f95cb01913f09f2db9a4e43987cedb15e180d91a487225828c268147525685b075335fed820a131ce5e9f3d5c437611891adc050cd7b9e187c2d8bf7e08976aa27380eaf8d41469af0e8d53da08f2cae637af290f0244a5fe92b85846222424b978fe0c9b6b728b54dff94e435ba2bda4919247d69d8c1f10af7537550aa1661e310ef589f7ca4f8d6cf299571aaf79605c753dfafe9da797dde22144090461edeabe61992c7cd8dc57e8a0f77a1c5fb3c14d23eae7f9bfc8267ff54226edd2c0001ee33b6621e441098dd4e572843a40500365c1fd9cd70c08288431036ea04071dfa48832b6bbdd3901d31ff7b5fc59c0a2892d301c2fe858c13e6a10974a0ad4c8bac6c7b505431016e5097f510e4d0212d3a22fab8e9d9cc76cde2dc7e7dbf42112c1387324b3ba611377051d23cd3f57bd55802c6896c8eb4461152eeac6f1630716d98a1ab87733a78e0a08048d0e2f0e4c087dced7f88b7cd22ed6c29ab52c06a825735d9ac733fc7345641b274c0a534a5e7d948f07afb17d158ccfc87344c2f5ef7201a8c99e20cfb2a82d6979649c57831866e1e77ab5e51db2ab55cb7ef10d7d57c4f1e730d1c3a8d3ef6e01b0dfc003b244c010b0a9740cf6f4e591e8bff4718a9a179200a4a6419eb0a3aa8f973829c34880879860a11d52e23031dad5ee05c173a00fe4cfe3254d9d7099706a4b69ac109817255b4406a3c48a334042c4446dc263bf5aa8b5eb7b80484ec5de3c95acc7b74ff0f2e20b5f3325ecf32f4019abeb0c8bf590065323951a5f8652786ac68bb960cb584702c6f37ee34622b5323576acce05eb63fe8e239f5660b1cbb880ca3f9ad8cf5f16ab08f5b502f9862ab2287632d219358f1a0cf333e6f842d0b8b5d47842c7b306042180f0166693e25651998e5612ee37761f5da0088e13837d060fa2cbcb1f2e9d30ddf1d9e01eb787ecf8aa565561928a33bdea5c92df61fab70a78a06a1b1edff7e1135a50c6dac0fd82585fd636a2452514a209365889f569faeb49882200f90584d66a4d1202045027bef9cd575bf692f4c925430a6fad49816936b29201d6ac7e814388642cf2bfe155a61703fe247056a46f19d5d904eb279cc4465102a62d744918c35b61f7e6755aba173ffe5d0561c561519b9e0b18231a6041fb12486e4d72e90695ab094d743a9a3b54d820231bd1970ee77f0116c2c84b05481cadcca23f0d2021c6e562c71d3d123e9da655cffdeaddd0890420da7621001b1242b48f2f4c931964e26957b6d3f556c30d11a3fbdf560ee418cabb487211eb24ca3eddf67c8d1be2441f5e3c6ef1c13597d909d6adfeb04db99fe90381af760fdccbf6dcd6476312cb6f1a28c8f83d7de852f5fcb70531160cb6743839e00c16eb1f4a2555c77b1ce69ac9bbf3455c7d33ce579d03868ea1618665ecb66eb30b27f01d3b8a68ea76d85ec5f4337bcb9730327918d3d85dc10c80b4c694e769008eefdbbead0f41a57b81c6fceee8ee269201af632be10441c0ba538f7daa7f2f870060719f256cd9638de56f4b9dc7e74dc0e673d5e19d7e4be3317b2c7f2d1e6ee6563882348656e52d572ca4b0606d34b01bdca5702f9152c2e0a4bde43211399c95d35176ee8a1b0289cd5a130217b037c310ad96f5cb9dc480cfe40f351500b70645a23ec61acdaa475c647f988f3f8744ac936809bb06e39ddeef67c72e28bc3bb2afe1e88c9495f7723ab75525dc1997bbfc4b9a7a06703043f2eb1609753dc35fb18ddeae42cde9646cef12495441ec20b29e480c64486bef6451ee00000000000000000000000000000021832da38a76f2cf570a85021b10d9b73200000000000000000000000000000000002bc1a1edeedb96ec58c2f796b244fc0000000000000000000000000000009d7f0285fb7f125457d05a7bf09ce62a0d00000000000000000000000000000000000034fd1e534c5d5fc47cadb62f7f70000000000000000000000000000000718a738370c68121898444c2f31fedc59a000000000000000000000000000000000007efa8939e0e7d2e0c3cf2e947a7bf00000000000000000000000000000081ca5e851ed9daf9f7f3e6f910d2ba3422000000000000000000000000000000000014740e632ad58f25b03cfd5d2f4af80000000000000000000000000000005a4af29b7861763ae072226dfad708158100000000000000000000000000000000000354c32b56722b40a1da12a948461600000000000000000000000000000034ae9b69e09f6fa305372d8d59897905df0000000000000000000000000000000000200b5bdac916509ef32fb70b19c6b700000000000000000000000000000040eafd7ba8e659703f8789a16655118394000000000000000000000000000000000015081872eb808acd83faa2195fae5c0000000000000000000000000000009863fd8cd6b56862c33bd03e422edb052900000000000000000000000000000000001ad2508b60a69c9dfc169484612aa60000000000000000000000000000002172add10f95b245472e56c1b5b771f6760000000000000000000000000000000000289438e0af460c55da1fb46bf04bb30000000000000000000000000000000e39d6ac65048a28d4c3e2f1a29957cdc90000000000000000000000000000000000184eb6259750b76db37dd6355550b000000000000000000000000000000037866489a22ebf296b6961a9cd34096b5b00000000000000000000000000000000002aeecefa9adf3761ed80cb30dbe07e00000000000000000000000000000087108f92ff7cac44040bb334249438727300000000000000000000000000000000000896ff02172853ed6903c5749d5ba0000000000000000000000000000000cd31ec7c968bb5fe7b5a4bad0f0eee550e00000000000000000000000000000000002dbda89b46e67c0e62ec2713869f32000000000000000000000000000000b3691c7d6165ef8ee7a03f8d5c2b23cd6500000000000000000000000000000000001f15e7996abcaf8c4df98ec8f7a98800000000000000000000000000000007da78e3c63a4ce2e06d7010071ec43ced00000000000000000000000000000000002e570068ca407364693025bd459f71000000000000000000000000000000139fdee42e16c73c68b47bf2c3a1d485f80000000000000000000000000000000000016684c552b8434f7d72effa112de10000000000000000000000000000009e93e240a5fda7767f876ca79bf705e8090000000000000000000000000000000000154c63195c44c538318cb912e4e9910000000000000000000000000000007d266afec0c3b1f516c70e1db41be2994d000000000000000000000000000000000008d773f6aa4d40e92b19627ab08d21000000000000000000000000000000a23106d0b9c127c2207bbd4ca55ac4c920000000000000000000000000000000000012d6f6e2ecfd810edc98e49d8a4456000000000000000000000000000000304934c2405c0fe101a5a4d2ce2593c28c000000000000000000000000000000000023220e4cc9443e0807c0c3b84747a8000000000000000000000000000000df5531781404739805e0a3521a1c36b15600000000000000000000000000000000001cdfe0a6a22614fd450da3c1fde51f000000000000000000000000000000b6545383732c969c0354ea7c6b2572c8cd00000000000000000000000000000000002d6166371a5a3ca6699c9a82454327000000000000000000000000000000a6b378e0affcaff899f951f7572016ca8c00000000000000000000000000000000002a2fe2a4b68944515d2ea065e863ca00000000000000000000000000000093605b491f1f433e8ba151074b8f7221ac00000000000000000000000000000000002f520182f125987ae0e990d1e2e55a00000000000000000000000000000038a682e98018da9f5872f89caf85a7842a000000000000000000000000000000000024aa2c8b84e50042933bc37a902fce00000000000000000000000000000076209f64e6436ecd39ca466f90bab9b0f4000000000000000000000000000000000007d634b9ead7c8e635fdd4a3ce264c000000000000000000000000000000ac6ddca15d8d72fd3c7c04dd677e4682d300000000000000000000000000000000000bff121dde91bd0842a7035af4333b0000000000000000000000000000001da55c8f6953530eea5f8b44c1d0d30fdb000000000000000000000000000000000022813be77edfd6fcd496e0762cfc6a000000000000000000000000000000cbc78b35a6385972a7d1893b2d6c89c3a900000000000000000000000000000000002e6aae447640071a78df475ef2937d000000000000000000000000000000ff020f82b567b7ad490338e9c5bc7ae7b40000000000000000000000000000000000294215b29e9953b9a29b6e7843fdbc000000000000000000000000000000dfab109744c0ebc6cbe431ab259e8b6ecb000000000000000000000000000000000029bc5b0e12d2a15245f45651206d36000000000000000000000000000000419a93b230a13698f1104ecbfe90b34aad00000000000000000000000000000000000e5426a396f8064d929fa383128a92000000000000000000000000000000ff2fc34f7823e392fd8eceda7336afdc5300000000000000000000000000000000001613ad953672393754e40a3ffd8d0300000000000000000000000000000017e2eb2c42b4997cfd046d27e127af79f300000000000000000000000000000000001eacdaf645dc631308c187a36dc24f000000000000000000000000000000eea9e38990eb71048d9742b7eb81ce5bd700000000000000000000000000000000002b622c508810fd1a751c49ab9524b9000000000000000000000000000000340323a65eb3c803bdf4d5fd70d10c5b340000000000000000000000000000000000029f8e5f38168ed7e401bff18421ac000000000000000000000000000000634b01df56c54b7e94fa30354df1a9c22c0000000000000000000000000000000000186cbbdcea11d10d22ecefd1eab80f000000000000000000000000000000227b9dcca51271edd73f05778d5d9cb8e100000000000000000000000000000000002f3546b6e65b130cbfa72fdc37824300000000000000000000000000000080c5281d0645614f9f39d8550c6001150200000000000000000000000000000000001c61ff8a26c657d6dd47a8ed2000d4000000000000000000000000000000dabdbc5c6b1311faeba2af94c2dab34ed0000000000000000000000000000000000003eee2291bbb77f7161dac074ab6c600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001217d5f9c62467c591956d4144b2d43a6cef051c29d4f4f5d46a6172c969b58d011468bdd6772fa6c0c44301411023d0c9c1d8a78312ebe267f666040f2687a92a1bc24f0488967f2d9a4a91f986641bcea7bc7dff4f21055c034262daeeaff3165125dd34228974a10a94207311d2d9907b5248fb2cd2aec3c511cef82a0db309eb9d9b32369d573b9d3f56dc6d29d55464fc62fc59f01c6526fe667827f2910064efc84a63839ba24296afce1ec0040a4648e52bc44ec8a01de9359a18e64729cca82acd4c4babff771ec5ea289c3743bf100c62309cdd54030f682ad37b102044e74074daa6a66a17d10eb36230dcb5e1acfdcd434cbe5e2e7c30d00160ae0d244931bd1808f837b89bdf0703e8ab09042350b73852a617ad033b6ac1b8cb10222fabcee4203d3a7fa21732f8dcb201e2f4176ac348dcb8e5fcbb442c8cfe2cef85f1c5bc63a50375505bdf06470bfea035edf59934489bff2d283a643f0c1e5facdbf0c7dd02c8991f33631aa12630bdc8862defedd441c9bc2a8960395f22860bcacedc5f989a6d814003a45b7b7f4d1cb35597c3f0426f348d8211588429b47624e027a3c169a72579bc0331485459f41520db6a3dcfb53a2e044f31761d76e84a99dd931f5a5970f6c3f15e127af855e89ce46453e936b74288a414432f01b6b538c510cc85641ede3ab2583d95ff25c59a856b9a92840e1a4f68e1400a8d8378c420b7aa8fb87bf3287fe73dfc405b2ed531aa35b3044bb1bf653b6909be0901c6ebf3c377bdbf3bf397e60069fb0278687998e667866b7ed43cef5b0b2e3d9bec91e167a63d13abd4091d24cc92d6102b33bc832e3c200b3f8f8e0715bff4ba5b6021fc4cd93cba6650acaabfe73457b3988036311879620a65c4c326096c677f92607e5f0cb1bf0948b065af3a032c5ac8f3690773c32fe29f552f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0609bbcee71e708093ece326ba89b8e6400000000000000000000000000000000000e2e4134b9d3e322d13f42bcf0f33e000000000000000000000000000000d05b774fe48d74f4207abf4fae1e2bbc3600000000000000000000000000000000000008eb62e7d152a6d9ab001e7c40b600000000000000000000000000000084d6718112c54eb0d13ee24a3c24332109000000000000000000000000000000000017f84b0afb48259e15b5eb4d7907cc0000000000000000000000000000004edfbdf184c6e4f277fd3b19eb0bb2199b00000000000000000000000000000000001493897df01651f2c7937511130c36000003dc","publicInputs":"0x0237797d6a2c04d20d4fa06b74482bd970ccd51a43d9b05b57e9b91fa1ae1cae000000012925752f6e51bf2738d82bf0e4cb0805eb37e908a909db140c8ce9073d03bad9000000032da55666630fdf8594065c377958c827dc1c130dac91f17c6699b53dce60ef752c2cd74ae9c2b2a1ab717d69eb4753f65607db94e93a8c0a51f23b96e34f3038000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020007638bb56b6dda2b64b8f76841114ac3a87a1820030e2e16772c4d294879c30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000241a65339d99ce6f973739bda9c459c80e677af4783b35941098d8cea5b54022dcbefa1ba7a12eb4f2ca5632698034aaab9a60c0428603cb64a7685760f203200000000000000000000000000000000000000000000000000000000000000000ac4f3ee53aedc4865073ae7fb664e7401d10eadbe3bbcc266c35059f14826bb000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ac4f3ee53aedc4865073ae7fb664e7401d10eadbe3bbcc266c35059f14826bb000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"} \ No newline at end of file diff --git a/yarn-project/end-to-end/src/fixtures/l1_to_l2_messaging.ts b/yarn-project/end-to-end/src/fixtures/l1_to_l2_messaging.ts index b4f7c44e5da..d61f3a62d69 100644 --- a/yarn-project/end-to-end/src/fixtures/l1_to_l2_messaging.ts +++ b/yarn-project/end-to-end/src/fixtures/l1_to_l2_messaging.ts @@ -53,5 +53,5 @@ export async function sendL1ToL2Message( const receivedMsgHash = topics.args.hash; const receivedGlobalLeafIndex = topics.args.index; - return [Fr.fromString(receivedMsgHash), new Fr(receivedGlobalLeafIndex)]; + return [Fr.fromHexString(receivedMsgHash), new Fr(receivedGlobalLeafIndex)]; } diff --git a/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts b/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts index b69ae1c69e0..1d31d41ab6c 100644 --- a/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts +++ b/yarn-project/end-to-end/src/fixtures/setup_p2p_test.ts @@ -4,6 +4,7 @@ import { type AztecNodeConfig, AztecNodeService } from '@aztec/aztec-node'; import { type SentTx, createLogger } from '@aztec/aztec.js'; import { type AztecAddress } from '@aztec/circuits.js'; +import { type DateProvider } from '@aztec/foundation/timer'; import { type PXEService } from '@aztec/pxe'; import getPort from 'get-port'; @@ -34,6 +35,7 @@ export function generatePrivateKeys(startIndex: number, numberOfKeys: number): ` export function createNodes( config: AztecNodeConfig, + dateProvider: DateProvider, bootstrapNodeEnr: string, numNodes: number, bootNodePort: number, @@ -46,7 +48,7 @@ export function createNodes( const port = bootNodePort + i + 1; const dataDir = dataDirectory ? `${dataDirectory}-${i}` : undefined; - const nodePromise = createNode(config, port, bootstrapNodeEnr, i, dataDir, metricsPort); + const nodePromise = createNode(config, dateProvider, port, bootstrapNodeEnr, i, dataDir, metricsPort); nodePromises.push(nodePromise); } return Promise.all(nodePromises); @@ -55,6 +57,7 @@ export function createNodes( // creates a P2P enabled instance of Aztec Node Service export async function createNode( config: AztecNodeConfig, + dateProvider: DateProvider, tcpPort: number, bootstrapNode: string | undefined, accountIndex: number, @@ -68,6 +71,7 @@ export async function createNode( return await AztecNodeService.createAndSync(validatorConfig, { telemetry: telemetryClient, logger: createLogger(`node:${tcpPort}`), + dateProvider, }); } diff --git a/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts b/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts index 7a0507a6e63..2acb78f7d47 100644 --- a/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts +++ b/yarn-project/end-to-end/src/fixtures/snapshot_manager.ts @@ -7,7 +7,6 @@ import { CheatCodes, type CompleteAddress, type DeployL1Contracts, - EthCheatCodes, Fr, GrumpkinScalar, type Logger, @@ -16,19 +15,22 @@ import { } from '@aztec/aztec.js'; import { deployInstance, registerContractClass } from '@aztec/aztec.js/deployment'; import { type DeployL1ContractsArgs, createL1Clients, getL1ContractsConfigEnvVars, l1Artifacts } from '@aztec/ethereum'; -import { startAnvil } from '@aztec/ethereum/test'; +import { EthCheatCodesWithState, startAnvil } from '@aztec/ethereum/test'; import { asyncMap } from '@aztec/foundation/async-map'; +import { randomBytes } from '@aztec/foundation/crypto'; import { createLogger } from '@aztec/foundation/log'; import { resolver, reviver } from '@aztec/foundation/serialize'; +import { TestDateProvider } from '@aztec/foundation/timer'; import { type ProverNode } from '@aztec/prover-node'; import { type PXEService, createPXEService, getPXEServiceConfig } from '@aztec/pxe'; import { createAndStartTelemetryClient, getConfigEnvVars as getTelemetryConfig } from '@aztec/telemetry-client/start'; -import { type InstalledClock, install } from '@sinonjs/fake-timers'; import { type Anvil } from '@viem/anvil'; import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'; import { copySync, removeSync } from 'fs-extra/esm'; -import { join } from 'path'; +import fs from 'fs/promises'; +import { tmpdir } from 'os'; +import path, { join } from 'path'; import { type Hex, getContract } from 'viem'; import { mnemonicToAccount } from 'viem/accounts'; @@ -50,7 +52,8 @@ export type SubsystemsContext = { proverNode?: ProverNode; watcher: AnvilTestWatcher; cheatCodes: CheatCodes; - timer: InstalledClock; + dateProvider: TestDateProvider; + directoryToCleanup?: string; }; type SnapshotEntry = { @@ -178,7 +181,7 @@ class SnapshotManager implements ISnapshotManager { await restore(snapshotData, context); // Save the snapshot data. - const ethCheatCodes = new EthCheatCodes(context.aztecNodeConfig.l1RpcUrl); + const ethCheatCodes = new EthCheatCodesWithState(context.aztecNodeConfig.l1RpcUrl); const anvilStateFile = `${this.livePath}/anvil.dat`; await ethCheatCodes.dumpChainState(anvilStateFile); writeFileSync(`${this.livePath}/${name}.json`, JSON.stringify(snapshotData || {}, resolver)); @@ -247,11 +250,13 @@ async function teardown(context: SubsystemsContext | undefined) { getLogger().info('Tearing down subsystems'); await context.proverNode?.stop(); await context.aztecNode.stop(); - await context.pxe.stop(); await context.acvmConfig?.cleanup(); + await context.bbConfig?.cleanup(); await context.anvil.stop(); await context.watcher.stop(); - context.timer?.uninstall(); + if (context.directoryToCleanup) { + await fs.rm(context.directoryToCleanup, { recursive: true, force: true }); + } } catch (err) { getLogger().error('Error during teardown', err); } @@ -273,13 +278,18 @@ async function setupFromFresh( ): Promise { logger.verbose(`Initializing state...`); - // Use sinonjs fake timers - const timer = install({ shouldAdvanceTime: true, advanceTimeDelta: 20, toFake: ['Date'] }); - // Fetch the AztecNode config. // TODO: For some reason this is currently the union of a bunch of subsystems. That needs fixing. const aztecNodeConfig: AztecNodeConfig & SetupOptions = { ...getConfigEnvVars(), ...opts }; - aztecNodeConfig.dataDirectory = statePath; + + // Create a temp directory for all ephemeral state and cleanup afterwards + const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex')); + await fs.mkdir(directoryToCleanup, { recursive: true }); + if (statePath === undefined) { + aztecNodeConfig.dataDirectory = directoryToCleanup; + } else { + aztecNodeConfig.dataDirectory = statePath; + } // Start anvil. We go via a wrapper script to ensure if the parent dies, anvil dies. logger.verbose('Starting anvil...'); @@ -299,7 +309,7 @@ async function setupFromFresh( aztecNodeConfig.publisherPrivateKey = `0x${publisherPrivKey!.toString('hex')}`; aztecNodeConfig.validatorPrivateKey = `0x${validatorPrivKey!.toString('hex')}`; - const ethCheatCodes = new EthCheatCodes(aztecNodeConfig.l1RpcUrl); + const ethCheatCodes = new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrl); if (opts.l1StartTime) { await ethCheatCodes.warp(opts.l1StartTime); @@ -338,7 +348,7 @@ async function setupFromFresh( } const watcher = new AnvilTestWatcher( - new EthCheatCodes(aztecNodeConfig.l1RpcUrl), + new EthCheatCodesWithState(aztecNodeConfig.l1RpcUrl), deployL1ContractsValues.l1ContractAddresses.rollupAddress, deployL1ContractsValues.publicClient, ); @@ -359,7 +369,8 @@ async function setupFromFresh( const telemetry = await getEndToEndTestTelemetryClient(opts.metricsPort); logger.verbose('Creating and synching an aztec node...'); - const aztecNode = await AztecNodeService.createAndSync(aztecNodeConfig, { telemetry }); + const dateProvider = new TestDateProvider(); + const aztecNode = await AztecNodeService.createAndSync(aztecNodeConfig, { telemetry, dateProvider }); let proverNode: ProverNode | undefined = undefined; if (opts.startProverNode) { @@ -368,12 +379,13 @@ async function setupFromFresh( `0x${proverNodePrivateKey!.toString('hex')}`, aztecNodeConfig, aztecNode, + path.join(directoryToCleanup, randomBytes(8).toString('hex')), ); } logger.verbose('Creating pxe...'); const pxeConfig = getPXEServiceConfig(); - pxeConfig.dataDirectory = statePath; + pxeConfig.dataDirectory = statePath ?? path.join(directoryToCleanup, randomBytes(8).toString('hex')); const pxe = await createPXEService(aztecNode, pxeConfig); const cheatCodes = await CheatCodes.create(aztecNodeConfig.l1RpcUrl, pxe); @@ -393,7 +405,8 @@ async function setupFromFresh( proverNode, watcher, cheatCodes, - timer, + dateProvider, + directoryToCleanup, }; } @@ -403,8 +416,8 @@ async function setupFromFresh( async function setupFromState(statePath: string, logger: Logger): Promise { logger.verbose(`Initializing with saved state at ${statePath}...`); - // TODO: make one function - const timer = install({ shouldAdvanceTime: true, advanceTimeDelta: 20, toFake: ['Date'] }); + const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex')); + await fs.mkdir(directoryToCleanup, { recursive: true }); // TODO: For some reason this is currently the union of a bunch of subsystems. That needs fixing. const aztecNodeConfig: AztecNodeConfig & SetupOptions = JSON.parse( @@ -418,7 +431,7 @@ async function setupFromState(statePath: string, logger: Logger): Promise Promise; }> { const pxeServiceConfig = { ...getPXEServiceConfig(), ...opts }; + + // If no data directory provided, create a temp directory and clean up afterwards + const configuredDataDirectory = pxeServiceConfig.dataDirectory; + if (!configuredDataDirectory) { + pxeServiceConfig.dataDirectory = path.join(tmpdir(), randomBytes(8).toString('hex')); + } + const pxe = await createPXEService(aztecNode, pxeServiceConfig, useLogSuffix, proofCreator); const teardown = async () => { - await pxe.stop(); + if (!configuredDataDirectory) { + await fs.rm(pxeServiceConfig.dataDirectory!, { recursive: true, force: true }); + } }; return { @@ -227,6 +239,7 @@ async function setupWithRemoteEnvironment( logger, cheatCodes, watcher: undefined, + dateProvider: undefined, teardown, }; } @@ -279,8 +292,10 @@ export type EndToEndContext = { logger: Logger; /** The cheat codes. */ cheatCodes: CheatCodes; - /** The anvil test watcher (undefined if connected to remove environment) */ + /** The anvil test watcher (undefined if connected to remote environment) */ watcher: AnvilTestWatcher | undefined; + /** Allows tweaking current system time, used by the epoch cache only (undefined if connected to remote environment) */ + dateProvider: TestDateProvider | undefined; /** Function to stop the started services. */ teardown: () => Promise; }; @@ -302,6 +317,13 @@ export async function setup( const config = { ...getConfigEnvVars(), ...opts }; const logger = getLogger(); + // Create a temp directory for any services that need it and cleanup later + const directoryToCleanup = path.join(tmpdir(), randomBytes(8).toString('hex')); + await fs.mkdir(directoryToCleanup, { recursive: true }); + if (!config.dataDirectory) { + config.dataDirectory = directoryToCleanup; + } + let anvil: Anvil | undefined; if (!config.l1RpcUrl) { @@ -326,7 +348,7 @@ export async function setup( setupMetricsLogger(filename); } - const ethCheatCodes = new EthCheatCodes(config.l1RpcUrl); + const ethCheatCodes = new EthCheatCodesWithState(config.l1RpcUrl); if (opts.stateLoad) { await ethCheatCodes.loadChainState(opts.stateLoad); @@ -393,7 +415,7 @@ export async function setup( } const watcher = new AnvilTestWatcher( - new EthCheatCodes(config.l1RpcUrl), + new EthCheatCodesWithState(config.l1RpcUrl), deployL1ContractsValues.l1ContractAddresses.rollupAddress, deployL1ContractsValues.publicClient, ); @@ -417,7 +439,8 @@ export async function setup( const telemetry = await telemetryPromise; const publisher = new TestL1Publisher(config, telemetry); - const aztecNode = await AztecNodeService.createAndSync(config, { telemetry, publisher }); + const dateProvider = new TestDateProvider(); + const aztecNode = await AztecNodeService.createAndSync(config, { telemetry, publisher, dateProvider }); const sequencer = aztecNode.getSequencer(); let proverNode: ProverNode | undefined = undefined; @@ -425,11 +448,16 @@ export async function setup( logger.verbose('Creating and syncing a simulated prover node...'); const proverNodePrivateKey = getPrivateKeyFromIndex(2); const proverNodePrivateKeyHex: Hex = `0x${proverNodePrivateKey!.toString('hex')}`; - proverNode = await createAndSyncProverNode(proverNodePrivateKeyHex, config, aztecNode); + proverNode = await createAndSyncProverNode( + proverNodePrivateKeyHex, + config, + aztecNode, + path.join(directoryToCleanup, randomBytes(8).toString('hex')), + ); } logger.verbose('Creating a pxe...'); - const { pxe } = await setupPXEService(aztecNode!, pxeOpts, logger); + const { pxe, teardown: pxeTeardown } = await setupPXEService(aztecNode!, pxeOpts, logger); if (!config.skipProtocolContracts) { logger.verbose('Setting up Fee Juice...'); @@ -442,12 +470,11 @@ export async function setup( const cheatCodes = await CheatCodes.create(config.l1RpcUrl, pxe!); const teardown = async () => { + await pxeTeardown(); + if (aztecNode instanceof AztecNodeService) { await aztecNode?.stop(); } - if (pxe instanceof PXEService) { - await pxe?.stop(); - } if (acvmConfig?.cleanup) { // remove the temp directory created for the acvm @@ -455,8 +482,19 @@ export async function setup( await acvmConfig.cleanup(); } + if (bbConfig?.cleanup) { + // remove the temp directory created for the acvm + logger.verbose(`Cleaning up BB state`); + await bbConfig.cleanup(); + } + await anvil?.stop(); await watcher.stop(); + + if (directoryToCleanup) { + logger.verbose(`Cleaning up data directory at ${directoryToCleanup}`); + await fs.rm(directoryToCleanup, { recursive: true, force: true }); + } }; return { @@ -471,6 +509,7 @@ export async function setup( cheatCodes, sequencer, watcher, + dateProvider, teardown, }; } @@ -659,6 +698,7 @@ export async function createAndSyncProverNode( proverNodePrivateKey: `0x${string}`, aztecNodeConfig: AztecNodeConfig, aztecNode: AztecNode, + dataDirectory: string, ) { // Disable stopping the aztec node as the prover coordination test will kill it otherwise // This is only required when stopping the prover node for testing @@ -669,7 +709,7 @@ export async function createAndSyncProverNode( }; // Creating temp store and archiver for simulated prover node - const archiverConfig = { ...aztecNodeConfig, dataDirectory: undefined }; + const archiverConfig = { ...aztecNodeConfig, dataDirectory }; const archiver = await createArchiver(archiverConfig, new NoopTelemetryClient(), { blockUntilSync: true }); // Prover node config is for simulated proofs diff --git a/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts b/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts index 534300c633a..7fc07cea262 100644 --- a/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts +++ b/yarn-project/end-to-end/src/flakey_e2e_inclusion_proofs_contract.test.ts @@ -9,8 +9,8 @@ import { } from '@aztec/aztec.js'; import { deployInstance, registerContractClass } from '@aztec/aztec.js/deployment'; import { randomInt } from '@aztec/foundation/crypto'; -import { StatefulTestContract, StatefulTestContractArtifact } from '@aztec/noir-contracts.js'; import { InclusionProofsContract } from '@aztec/noir-contracts.js/InclusionProofs'; +import { StatefulTestContract, StatefulTestContractArtifact } from '@aztec/noir-contracts.js/StatefulTest'; import { jest } from '@jest/globals'; import { type MemDown, default as memdown } from 'memdown'; diff --git a/yarn-project/end-to-end/src/guides/dapp_testing.test.ts b/yarn-project/end-to-end/src/guides/dapp_testing.test.ts index 001ecca4712..6364517d223 100644 --- a/yarn-project/end-to-end/src/guides/dapp_testing.test.ts +++ b/yarn-project/end-to-end/src/guides/dapp_testing.test.ts @@ -133,7 +133,7 @@ describe('guides/dapp/testing', () => { it('checks unencrypted logs, [Kinda broken with current implementation]', async () => { // docs:start:unencrypted-logs - const value = Fr.fromString('ef'); // Only 1 bytes will make its way in there :( so no larger stuff + const value = Fr.fromHexString('ef'); // Only 1 bytes will make its way in there :( so no larger stuff const tx = await testContract.methods.emit_unencrypted(value).send().wait(); const filter = { fromBlock: tx.blockNumber!, diff --git a/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts b/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts index 678aeaa5682..3ee8bc29725 100644 --- a/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts +++ b/yarn-project/end-to-end/src/guides/writing_an_account_contract.test.ts @@ -14,7 +14,7 @@ import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { setup } from '../fixtures/utils.js'; // docs:start:account-contract -const PRIVATE_KEY = GrumpkinScalar.fromString('0xd35d743ac0dfe3d6dbe6be8c877cb524a00ab1e3d52d7bada095dfc8894ccfa'); +const PRIVATE_KEY = GrumpkinScalar.fromHexString('0xd35d743ac0dfe3d6dbe6be8c877cb524a00ab1e3d52d7bada095dfc8894ccfa'); /** Account contract implementation that authenticates txs using Schnorr signatures. */ class SchnorrHardcodedKeyAccountContract extends DefaultAccountContract { diff --git a/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts b/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts index 25755714a88..7e70f26a566 100644 --- a/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts +++ b/yarn-project/end-to-end/src/prover-coordination/e2e_prover_coordination.test.ts @@ -15,7 +15,7 @@ import { Buffer32 } from '@aztec/foundation/buffer'; import { times } from '@aztec/foundation/collection'; import { Secp256k1Signer, keccak256, randomBigInt, randomInt } from '@aztec/foundation/crypto'; import { ProofCommitmentEscrowAbi, RollupAbi, TestERC20Abi } from '@aztec/l1-artifacts'; -import { StatefulTestContract, StatefulTestContractArtifact } from '@aztec/noir-contracts.js'; +import { StatefulTestContract, StatefulTestContractArtifact } from '@aztec/noir-contracts.js/StatefulTest'; import { createPXEService, getPXEServiceConfig } from '@aztec/pxe'; import { diff --git a/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts b/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts index 984260e425c..d78898c8bd8 100644 --- a/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts +++ b/yarn-project/end-to-end/src/public-testnet/e2e_public_testnet_transfer.test.ts @@ -1,6 +1,6 @@ import { createAccounts } from '@aztec/accounts/testing'; import { Fr, type Logger, type PXE } from '@aztec/aztec.js'; -import { EasyPrivateTokenContract } from '@aztec/noir-contracts.js'; +import { EasyPrivateTokenContract } from '@aztec/noir-contracts.js/EasyPrivateToken'; import { foundry, sepolia } from 'viem/chains'; diff --git a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs index 43217454be6..841ea5f7474 100644 --- a/yarn-project/end-to-end/src/sample-dapp/deploy.mjs +++ b/yarn-project/end-to-end/src/sample-dapp/deploy.mjs @@ -2,7 +2,8 @@ import { getInitialTestAccountsWallets } from '@aztec/accounts/testing'; import { Contract, createPXEClient, loadContractArtifact, waitForPXE } from '@aztec/aztec.js'; // docs:end:deploy-imports -import { TokenContract, TokenContractArtifact } from '@aztec/noir-contracts.js'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; diff --git a/yarn-project/end-to-end/src/shared/browser.ts b/yarn-project/end-to-end/src/shared/browser.ts index 8110a697898..f75fb3141cf 100644 --- a/yarn-project/end-to-end/src/shared/browser.ts +++ b/yarn-project/end-to-end/src/shared/browser.ts @@ -125,7 +125,7 @@ export const browserTestSuite = ( async (rpcUrl, secretKeyString) => { const { Fr, createPXEClient, getUnsafeSchnorrAccount } = window.AztecJs; const pxe = createPXEClient(rpcUrl!); - const secretKey = Fr.fromString(secretKeyString); + const secretKey = Fr.fromHexString(secretKeyString); const account = getUnsafeSchnorrAccount(pxe, secretKey); await account.waitSetup(); const completeAddress = account.getCompleteAddress(); diff --git a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts index 563c1a26523..19a8fb58f16 100644 --- a/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts +++ b/yarn-project/end-to-end/src/shared/cross_chain_test_harness.ts @@ -359,7 +359,7 @@ export class CrossChainTestHarness { * it's included it becomes available for consumption in the next block because the l1 to l2 message tree. */ async makeMessageConsumable(msgHash: Fr | Hex) { - const frMsgHash = typeof msgHash === 'string' ? Fr.fromString(msgHash) : msgHash; + const frMsgHash = typeof msgHash === 'string' ? Fr.fromHexString(msgHash) : msgHash; // We poll isL1ToL2MessageSynced endpoint until the message is available await retryUntil(async () => await this.aztecNode.isL1ToL2MessageSynced(frMsgHash), 'message sync', 10); diff --git a/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts b/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts index 0d54c623f2c..0f1e1ace4ad 100644 --- a/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts +++ b/yarn-project/end-to-end/src/shared/gas_portal_test_harness.ts @@ -9,7 +9,7 @@ import { type PXE, type Wallet, } from '@aztec/aztec.js'; -import { FeeJuiceContract } from '@aztec/noir-contracts.js'; +import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { type Account, type Chain, type HttpTransport, type PublicClient, type WalletClient } from 'viem'; diff --git a/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts b/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts index b8284aabfec..7c4789f5eb7 100644 --- a/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts +++ b/yarn-project/end-to-end/src/shared/uniswap_l1_l2.ts @@ -195,7 +195,7 @@ export const uniswapL1L2TestSuite = ( wethAmountToBridge, ); - await wethCrossChainHarness.makeMessageConsumable(Fr.fromString(wethDepositClaim.messageHash)); + await wethCrossChainHarness.makeMessageConsumable(Fr.fromHexString(wethDepositClaim.messageHash)); // 2. Claim WETH on L2 logger.info('Minting weth on L2'); @@ -331,7 +331,7 @@ export const uniswapL1L2TestSuite = ( // We get the msg leaf from event so that we can later wait for it to be available for consumption const inboxAddress = daiCrossChainHarness.l1ContractAddresses.inboxAddress.toString(); const txLog = extractEvent(txReceipt.logs, inboxAddress, InboxAbi, 'MessageSent'); - const tokenOutMsgHash = Fr.fromString(txLog.args.hash); + const tokenOutMsgHash = Fr.fromHexString(txLog.args.hash); const tokenOutMsgIndex = txLog.args.index; // weth was swapped to dai and send to portal @@ -559,7 +559,7 @@ export const uniswapL1L2TestSuite = ( // data: txLog.data, // topics: txLog.topics, // }); - // outTokenDepositMsgHash = Fr.fromString(topics.args.hash); + // outTokenDepositMsgHash = Fr.fromHexString(topics.args.hash); // } // // weth was swapped to dai and send to portal diff --git a/yarn-project/end-to-end/src/spartan/4epochs.test.ts b/yarn-project/end-to-end/src/spartan/4epochs.test.ts index 43d2a0da7ba..2e73cf2d1dd 100644 --- a/yarn-project/end-to-end/src/spartan/4epochs.test.ts +++ b/yarn-project/end-to-end/src/spartan/4epochs.test.ts @@ -1,7 +1,8 @@ -import { EthCheatCodes, readFieldCompressedString } from '@aztec/aztec.js'; +import { readFieldCompressedString } from '@aztec/aztec.js'; import { getL1ContractsConfigEnvVars } from '@aztec/ethereum'; +import { EthCheatCodesWithState } from '@aztec/ethereum/test'; import { createLogger } from '@aztec/foundation/log'; -import { TokenContract } from '@aztec/noir-contracts.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; @@ -58,7 +59,7 @@ describe('token transfer test', () => { }); it('transfer tokens for 4 epochs', async () => { - const ethCheatCodes = new EthCheatCodes(ETHEREUM_HOST); + const ethCheatCodes = new EthCheatCodesWithState(ETHEREUM_HOST); // Get 4 epochs const rollupCheatCodes = new RollupCheatCodes( ethCheatCodes, diff --git a/yarn-project/end-to-end/src/spartan/gating-passive.test.ts b/yarn-project/end-to-end/src/spartan/gating-passive.test.ts index 99d5b06dc2c..99c8394b5f1 100644 --- a/yarn-project/end-to-end/src/spartan/gating-passive.test.ts +++ b/yarn-project/end-to-end/src/spartan/gating-passive.test.ts @@ -1,4 +1,5 @@ -import { EthCheatCodes, createCompatibleClient, sleep } from '@aztec/aztec.js'; +import { createCompatibleClient, sleep } from '@aztec/aztec.js'; +import { EthCheatCodesWithState } from '@aztec/ethereum/test'; import { createLogger } from '@aztec/foundation/log'; import { expect, jest } from '@jest/globals'; @@ -84,7 +85,7 @@ describe('a test that passively observes the network in the presence of network }); const client = await createCompatibleClient(PXE_URL, debugLogger); - const ethCheatCodes = new EthCheatCodes(ETHEREUM_HOST); + const ethCheatCodes = new EthCheatCodesWithState(ETHEREUM_HOST); const rollupCheatCodes = new RollupCheatCodes( ethCheatCodes, await client.getNodeInfo().then(n => n.l1ContractAddresses), diff --git a/yarn-project/end-to-end/src/spartan/reorg.test.ts b/yarn-project/end-to-end/src/spartan/reorg.test.ts index f524503a4cf..ad221bbade7 100644 --- a/yarn-project/end-to-end/src/spartan/reorg.test.ts +++ b/yarn-project/end-to-end/src/spartan/reorg.test.ts @@ -1,4 +1,5 @@ -import { EthCheatCodes, sleep } from '@aztec/aztec.js'; +import { sleep } from '@aztec/aztec.js'; +import { EthCheatCodesWithState } from '@aztec/ethereum/test'; import { createLogger } from '@aztec/foundation/log'; import { expect, jest } from '@jest/globals'; @@ -59,7 +60,7 @@ describe('reorg test', () => { hostPort: HOST_ETHEREUM_PORT, }); testWallets = await setupTestWalletsWithTokens(PXE_URL, MINT_AMOUNT, debugLogger); - const ethCheatCodes = new EthCheatCodes(ETHEREUM_HOST); + const ethCheatCodes = new EthCheatCodesWithState(ETHEREUM_HOST); const rollupCheatCodes = new RollupCheatCodes( ethCheatCodes, await testWallets.pxe.getNodeInfo().then(n => n.l1ContractAddresses), diff --git a/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts b/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts index bb4528707a9..ae3abd9b625 100644 --- a/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts +++ b/yarn-project/end-to-end/src/spartan/setup_test_wallets.ts @@ -1,7 +1,7 @@ import { getSchnorrAccount } from '@aztec/accounts/schnorr'; import { type AccountWalletWithSecretKey, type AztecAddress, type PXE, createCompatibleClient } from '@aztec/aztec.js'; import { type Logger } from '@aztec/foundation/log'; -import { TokenContract } from '@aztec/noir-contracts.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { addAccounts } from '../fixtures/snapshot_manager.js'; diff --git a/yarn-project/end-to-end/src/spartan/transfer.test.ts b/yarn-project/end-to-end/src/spartan/transfer.test.ts index 4f0d79215f7..28905e96afb 100644 --- a/yarn-project/end-to-end/src/spartan/transfer.test.ts +++ b/yarn-project/end-to-end/src/spartan/transfer.test.ts @@ -1,6 +1,6 @@ import { readFieldCompressedString } from '@aztec/aztec.js'; import { createLogger } from '@aztec/foundation/log'; -import { TokenContract } from '@aztec/noir-contracts.js'; +import { TokenContract } from '@aztec/noir-contracts.js/Token'; import { jest } from '@jest/globals'; diff --git a/yarn-project/end-to-end/src/spartan/utils.ts b/yarn-project/end-to-end/src/spartan/utils.ts index 9874929f821..2f5b672b253 100644 --- a/yarn-project/end-to-end/src/spartan/utils.ts +++ b/yarn-project/end-to-end/src/spartan/utils.ts @@ -401,7 +401,7 @@ export async function enableValidatorDynamicBootNode( 'validator.dynamicBootNode': 'true', }, valuesFile: undefined, - timeout: '10m', + timeout: '15m', reuseValues: true, }); diff --git a/yarn-project/end-to-end/src/web/main.ts b/yarn-project/end-to-end/src/web/main.ts index 3e65f0760e9..bc44adf8fea 100644 --- a/yarn-project/end-to-end/src/web/main.ts +++ b/yarn-project/end-to-end/src/web/main.ts @@ -1,6 +1,16 @@ -export * from '@aztec/aztec.js'; -export * from '@aztec/accounts/testing'; -export * from '@aztec/accounts/single_key'; -export * from '@aztec/accounts/schnorr'; +export { Fr } from '@aztec/aztec.js/fields'; +export { createPXEClient } from '@aztec/aztec.js/rpc'; +export { getSchnorrAccount } from '@aztec/accounts/schnorr'; +export { getUnsafeSchnorrAccount } from '@aztec/accounts/single_key'; +export { + getDeployedTestAccountsWallets, + INITIAL_TEST_SECRET_KEYS, + INITIAL_TEST_SIGNING_KEYS, + INITIAL_TEST_ACCOUNT_SALTS, +} from '@aztec/accounts/testing'; +export { AztecAddress, CompleteAddress } from '@aztec/aztec.js/addresses'; +export { Contract, DeployMethod } from '@aztec/aztec.js/contracts'; +export { contractArtifactFromBuffer } from '@aztec/aztec.js/abi'; +export { generatePublicKey } from '@aztec/aztec.js/utils'; export { Buffer } from 'buffer/'; diff --git a/yarn-project/epoch-cache/src/epoch_cache.ts b/yarn-project/epoch-cache/src/epoch_cache.ts index b0c019c6b63..1cbe315c2bb 100644 --- a/yarn-project/epoch-cache/src/epoch_cache.ts +++ b/yarn-project/epoch-cache/src/epoch_cache.ts @@ -7,6 +7,7 @@ import { import { RollupContract, createEthereumChain } from '@aztec/ethereum'; import { EthAddress } from '@aztec/foundation/eth-address'; import { type Logger, createLogger } from '@aztec/foundation/log'; +import { DateProvider } from '@aztec/foundation/timer'; import { EventEmitter } from 'node:events'; import { createPublicClient, encodeAbiParameters, http, keccak256 } from 'viem'; @@ -40,6 +41,7 @@ export class EpochCache extends EventEmitter<{ committeeChanged: [EthAddress[], initialValidators: EthAddress[] = [], initialSampleSeed: bigint = 0n, private readonly l1constants: L1RollupConstants = EmptyL1RollupConstants, + private readonly dateProvider: DateProvider = new DateProvider(), ) { super(); this.committee = initialValidators; @@ -47,10 +49,14 @@ export class EpochCache extends EventEmitter<{ committeeChanged: [EthAddress[], this.log.debug(`Initialized EpochCache with constants and validators`, { l1constants, initialValidators }); - this.cachedEpoch = getEpochNumberAtTimestamp(BigInt(Math.floor(Date.now() / 1000)), this.l1constants); + this.cachedEpoch = getEpochNumberAtTimestamp(this.nowInSeconds(), this.l1constants); } - static async create(rollupAddress: EthAddress, config?: EpochCacheConfig) { + static async create( + rollupAddress: EthAddress, + config?: EpochCacheConfig, + deps: { dateProvider?: DateProvider } = {}, + ) { config = config ?? getEpochCacheConfigEnvVars(); const chain = createEthereumChain(config.l1RpcUrl, config.l1ChainId); @@ -81,16 +87,20 @@ export class EpochCache extends EventEmitter<{ committeeChanged: [EthAddress[], initialValidators.map(v => EthAddress.fromString(v)), sampleSeed, l1RollupConstants, + deps.dateProvider, ); } + private nowInSeconds(): bigint { + return BigInt(Math.floor(this.dateProvider.now() / 1000)); + } + getEpochAndSlotNow(): EpochAndSlot { - const now = BigInt(Math.floor(Date.now() / 1000)); - return this.getEpochAndSlotAtTimestamp(now); + return this.getEpochAndSlotAtTimestamp(this.nowInSeconds()); } getEpochAndSlotInNextSlot(): EpochAndSlot { - const nextSlotTs = BigInt(Math.floor(Date.now() / 1000) + this.l1constants.slotDuration); + const nextSlotTs = this.nowInSeconds() + BigInt(this.l1constants.slotDuration); return this.getEpochAndSlotAtTimestamp(nextSlotTs); } diff --git a/yarn-project/ethereum/src/eth_cheat_codes.ts b/yarn-project/ethereum/src/eth_cheat_codes.ts index a68646c17ab..2ec0706619f 100644 --- a/yarn-project/ethereum/src/eth_cheat_codes.ts +++ b/yarn-project/ethereum/src/eth_cheat_codes.ts @@ -3,7 +3,6 @@ import { keccak256 } from '@aztec/foundation/crypto'; import { type EthAddress } from '@aztec/foundation/eth-address'; import { createLogger } from '@aztec/foundation/log'; -import fs from 'fs'; import { type Hex } from 'viem'; /** @@ -196,33 +195,6 @@ export class EthCheatCodes { this.logger.verbose(`Warped L1 timestamp to ${timestamp}`); } - /** - * Dumps the current chain state to a file. - * @param fileName - The file name to dump state into - */ - public async dumpChainState(fileName: string): Promise { - const res = await this.rpcCall('hardhat_dumpState', []); - if (res.error) { - throw new Error(`Error dumping state: ${res.error.message}`); - } - const jsonContent = JSON.stringify(res.result); - fs.writeFileSync(`${fileName}.json`, jsonContent, 'utf8'); - this.logger.verbose(`Dumped state to ${fileName}`); - } - - /** - * Loads the chain state from a file. - * @param fileName - The file name to load state from - */ - public async loadChainState(fileName: string): Promise { - const data = JSON.parse(fs.readFileSync(`${fileName}.json`, 'utf8')); - const res = await this.rpcCall('hardhat_loadState', [data]); - if (res.error) { - throw new Error(`Error loading state: ${res.error.message}`); - } - this.logger.verbose(`Loaded state from ${fileName}`); - } - /** * Load the value at a storage slot of a contract address on eth * @param contract - The contract address diff --git a/yarn-project/ethereum/src/l1_tx_utils.ts b/yarn-project/ethereum/src/l1_tx_utils.ts index 5bcaf6f9391..607f06b9567 100644 --- a/yarn-project/ethereum/src/l1_tx_utils.ts +++ b/yarn-project/ethereum/src/l1_tx_utils.ts @@ -1,3 +1,4 @@ +import { times } from '@aztec/foundation/collection'; import { type ConfigMappingsType, bigintConfigHelper, @@ -71,6 +72,11 @@ export interface L1TxUtilsConfig { * How long to wait for a tx to be mined before giving up */ txTimeoutMs?: number; + /** + * How many attempts will be done to get a tx after it was sent? + * First attempt is done at 1s, second at 2s, third at 3s, etc. + */ + txPropagationMaxQueryAttempts?: number; } export const l1TxUtilsConfigMappings: ConfigMappingsType = { @@ -119,6 +125,11 @@ export const l1TxUtilsConfigMappings: ConfigMappingsType = { env: 'L1_TX_MONITOR_TX_TIMEOUT_MS', ...numberConfigHelper(300_000), // 5 mins }, + txPropagationMaxQueryAttempts: { + description: 'How many attempts will be done to get a tx after it was sent', + env: 'L1_TX_PROPAGATION_MAX_QUERY_ATTEMPTS', + ...numberConfigHelper(3), + }, }; export const defaultL1TxUtilsConfig = getDefaultConfig(l1TxUtilsConfigMappings); @@ -129,6 +140,12 @@ export interface L1TxRequest { value?: bigint; } +export interface L1BlobInputs { + blobs: Uint8Array[]; + kzg: any; + maxFeePerBlobGas: bigint; +} + interface GasPrice { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint; @@ -158,6 +175,7 @@ export class L1TxUtils { public async sendTransaction( request: L1TxRequest, _gasConfig?: Partial & { fixedGas?: bigint }, + _blobInputs?: L1BlobInputs, ): Promise<{ txHash: Hex; gasLimit: bigint; gasPrice: GasPrice }> { const gasConfig = { ...this.config, ..._gasConfig }; const account = this.walletClient.account; @@ -171,8 +189,10 @@ export class L1TxUtils { const gasPrice = await this.getGasPrice(gasConfig); + const blobInputs = _blobInputs || {}; const txHash = await this.walletClient.sendTransaction({ ...request, + ...blobInputs, gas: gasLimit, maxFeePerGas: gasPrice.maxFeePerGas, maxPriorityFeePerGas: gasPrice.maxPriorityFeePerGas, @@ -199,15 +219,19 @@ export class L1TxUtils { initialTxHash: Hex, params: { gasLimit: bigint }, _gasConfig?: Partial, + _blobInputs?: L1BlobInputs, ): Promise { const gasConfig = { ...this.config, ..._gasConfig }; const account = this.walletClient.account; + const blobInputs = _blobInputs || {}; + const makeGetTransactionBackoff = () => + makeBackoff(times(gasConfig.txPropagationMaxQueryAttempts ?? 3, i => i + 1)); // Retry a few times, in case the tx is not yet propagated. const tx = await retry( () => this.publicClient.getTransaction({ hash: initialTxHash }), `Getting L1 transaction ${initialTxHash}`, - makeBackoff([1, 2, 3]), + makeGetTransactionBackoff(), this.logger, true, ); @@ -250,7 +274,7 @@ export class L1TxUtils { const tx = await retry( () => this.publicClient.getTransaction({ hash: currentTxHash }), `Getting L1 transaction ${currentTxHash}`, - makeBackoff([1, 2, 3]), + makeGetTransactionBackoff(), this.logger, true, ); @@ -288,6 +312,7 @@ export class L1TxUtils { currentTxHash = await this.walletClient.sendTransaction({ ...request, + ...blobInputs, nonce, gas: params.gasLimit, maxFeePerGas: newGasPrice.maxFeePerGas, @@ -322,9 +347,10 @@ export class L1TxUtils { public async sendAndMonitorTransaction( request: L1TxRequest, gasConfig?: Partial & { fixedGas?: bigint }, + blobInputs?: L1BlobInputs, ): Promise { - const { txHash, gasLimit } = await this.sendTransaction(request, gasConfig); - return this.monitorTransaction(request, txHash, { gasLimit }, gasConfig); + const { txHash, gasLimit } = await this.sendTransaction(request, gasConfig, blobInputs); + return this.monitorTransaction(request, txHash, { gasLimit }, gasConfig, blobInputs); } /** @@ -392,9 +418,23 @@ export class L1TxUtils { /** * Estimates gas and adds buffer */ - public async estimateGas(account: Account, request: L1TxRequest, _gasConfig?: L1TxUtilsConfig): Promise { + public async estimateGas( + account: Account, + request: L1TxRequest, + _gasConfig?: L1TxUtilsConfig, + _blobInputs?: L1BlobInputs, + ): Promise { const gasConfig = { ...this.config, ..._gasConfig }; - const initialEstimate = await this.publicClient.estimateGas({ account, ...request }); + let initialEstimate = 0n; + // Viem does not allow blobs to be sent via public client's estimate gas, so any estimation will fail. + // Strangely, the only way to get gas and send blobs is prepareTransactionRequest(). + // See: https://github.com/wevm/viem/issues/2075 + if (_blobInputs) { + initialEstimate = (await this.walletClient.prepareTransactionRequest({ account, ...request, ..._blobInputs })) + .gas; + } else { + initialEstimate = await this.publicClient.estimateGas({ account, ...request }); + } // Add buffer based on either fixed amount or percentage const withBuffer = initialEstimate + (initialEstimate * (gasConfig.gasLimitBufferPercentage ?? 0n)) / 100n; diff --git a/yarn-project/ethereum/src/test/eth_cheat_codes_with_state.ts b/yarn-project/ethereum/src/test/eth_cheat_codes_with_state.ts new file mode 100644 index 00000000000..8f28d8961b0 --- /dev/null +++ b/yarn-project/ethereum/src/test/eth_cheat_codes_with_state.ts @@ -0,0 +1,36 @@ +import fs from 'fs'; + +import { EthCheatCodes } from '../eth_cheat_codes.js'; + +/** + * A class that provides utility functions for interacting with ethereum (L1) dumping/loading state to/from a file. + * It is separated to avoid importing fs in the main EthCheatCodes class, which might be used in the browser. + */ +export class EthCheatCodesWithState extends EthCheatCodes { + /** + * Dumps the current chain state to a file. + * @param fileName - The file name to dump state into + */ + public async dumpChainState(fileName: string): Promise { + const res = await this.rpcCall('hardhat_dumpState', []); + if (res.error) { + throw new Error(`Error dumping state: ${res.error.message}`); + } + const jsonContent = JSON.stringify(res.result); + fs.writeFileSync(`${fileName}.json`, jsonContent, 'utf8'); + this.logger.verbose(`Dumped state to ${fileName}`); + } + + /** + * Loads the chain state from a file. + * @param fileName - The file name to load state from + */ + public async loadChainState(fileName: string): Promise { + const data = JSON.parse(fs.readFileSync(`${fileName}.json`, 'utf8')); + const res = await this.rpcCall('hardhat_loadState', [data]); + if (res.error) { + throw new Error(`Error loading state: ${res.error.message}`); + } + this.logger.verbose(`Loaded state from ${fileName}`); + } +} diff --git a/yarn-project/ethereum/src/test/index.ts b/yarn-project/ethereum/src/test/index.ts index e6e7d745ad6..cdb11e52589 100644 --- a/yarn-project/ethereum/src/test/index.ts +++ b/yarn-project/ethereum/src/test/index.ts @@ -1,2 +1,3 @@ export * from './start_anvil.js'; export * from './tx_delayer.js'; +export * from './eth_cheat_codes_with_state.js'; diff --git a/yarn-project/ethereum/src/test/tx_delayer.ts b/yarn-project/ethereum/src/test/tx_delayer.ts index f96523dc797..afb117f4ea2 100644 --- a/yarn-project/ethereum/src/test/tx_delayer.ts +++ b/yarn-project/ethereum/src/test/tx_delayer.ts @@ -1,3 +1,4 @@ +import { omit } from '@aztec/foundation/collection'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { retryUntil } from '@aztec/foundation/retry'; @@ -8,6 +9,7 @@ import { type PublicClient, type WalletClient, keccak256, + parseTransaction, publicActions, walletActions, } from 'viem'; @@ -89,6 +91,7 @@ class DelayerImpl implements Delayer { /** * Returns a new client (without modifying the one passed in) with an injected tx delayer. * The delayer can be used to hold off the next tx to be sent until a given block number. + * TODO(#10824): This doesn't play along well with blob txs for some reason. */ export function withDelayer( client: T, @@ -116,16 +119,25 @@ export function withDelayer( // Compute the tx hash manually so we emulate sendRawTransaction response const { serializedTransaction } = args[0]; const txHash = keccak256(serializedTransaction); - logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`); + logger.info(`Delaying tx ${txHash} until ${inspect(waitUntil)}`, { + argsLen: args.length, + ...omit(parseTransaction(serializedTransaction), 'data', 'sidecars'), + }); // Do not await here so we can return the tx hash immediately as if it had been sent on the spot. // Instead, delay it so it lands on the desired block number or timestamp, assuming anvil will // mine it immediately. void wait .then(async () => { - const txHash = await client.sendRawTransaction(...args); - logger.info(`Sent previously delayed tx ${txHash} to land on ${inspect(waitUntil)}`); - delayer.txs.push(txHash); + const clientTxHash = await client.sendRawTransaction(...args); + if (clientTxHash !== txHash) { + logger.error(`Tx hash returned by the client does not match computed one`, { + clientTxHash, + computedTxHash: txHash, + }); + } + logger.info(`Sent previously delayed tx ${clientTxHash} to land on ${inspect(waitUntil)}`); + delayer.txs.push(clientTxHash); }) .catch(err => logger.error(`Error sending tx after delay`, err)); diff --git a/yarn-project/foundation/.eslintrc.cjs b/yarn-project/foundation/.eslintrc.cjs index ec3bcb348b7..6388fe800a8 100644 --- a/yarn-project/foundation/.eslintrc.cjs +++ b/yarn-project/foundation/.eslintrc.cjs @@ -78,5 +78,5 @@ module.exports = { // this unfortunately doesn't block `fit` and `fdescribe` 'no-only-tests/no-only-tests': ['error'], }, - ignorePatterns: ['node_modules', 'dest*', 'dist', '*.js', '.eslintrc.cjs', '.eslintrc.*.cjs'], + ignorePatterns: ['node_modules', 'dest*', 'dist', '*.js', 'scripts*', '.eslintrc.cjs', '.eslintrc.*.cjs'], }; diff --git a/yarn-project/foundation/package.json b/yarn-project/foundation/package.json index 616a186ef13..f6c94248bba 100644 --- a/yarn-project/foundation/package.json +++ b/yarn-project/foundation/package.json @@ -41,12 +41,14 @@ "./wasm": "./dest/wasm/index.js", "./worker": "./dest/worker/index.js", "./bigint-buffer": "./dest/bigint-buffer/index.js", + "./blob": "./dest/blob/index.js", "./types": "./dest/types/index.js", "./schemas": "./dest/schemas/index.js", "./url": "./dest/url/index.js", "./committable": "./dest/committable/index.js", "./noir": "./dest/noir/index.js", "./testing": "./dest/testing/index.js", + "./testing/files": "./dest/testing/files/index.js", "./array": "./dest/array/index.js", "./validation": "./dest/validation/index.js", "./promise": "./dest/promise/index.js", @@ -110,6 +112,7 @@ "@koa/cors": "^5.0.0", "@noble/curves": "^1.2.0", "bn.js": "^5.2.1", + "c-kzg": "4.0.0-alpha.1", "colorette": "^2.0.20", "debug": "^4.3.4", "detect-node": "^2.1.0", diff --git a/yarn-project/foundation/src/abi/encoder.ts b/yarn-project/foundation/src/abi/encoder.ts index 5f876a0e35d..f62cb2b22e9 100644 --- a/yarn-project/foundation/src/abi/encoder.ts +++ b/yarn-project/foundation/src/abi/encoder.ts @@ -49,7 +49,7 @@ class ArgumentEncoder { } else if (typeof arg === 'bigint') { this.flattened.push(new Fr(arg)); } else if (typeof arg === 'string') { - this.flattened.push(Fr.fromString(arg)); + this.flattened.push(Fr.fromHexString(arg)); } else if (typeof arg === 'boolean') { this.flattened.push(new Fr(arg ? 1n : 0n)); } else if (typeof arg === 'object') { @@ -58,7 +58,7 @@ class ArgumentEncoder { } else if (typeof arg.toField === 'function') { this.flattened.push(arg.toField()); } else if (typeof arg.value === 'string') { - this.flattened.push(Fr.fromString(arg.value)); + this.flattened.push(Fr.fromHexString(arg.value)); } else { throw new Error(`Argument for ${name} cannot be serialized to a field`); } diff --git a/yarn-project/foundation/src/blob/blob.test.ts b/yarn-project/foundation/src/blob/blob.test.ts new file mode 100644 index 00000000000..e4a5746ec06 --- /dev/null +++ b/yarn-project/foundation/src/blob/blob.test.ts @@ -0,0 +1,135 @@ +import cKzg from 'c-kzg'; +import type { Blob as BlobBuffer, Bytes48, KZGProof } from 'c-kzg'; + +import { poseidon2Hash } from '../crypto/index.js'; +import { Fr } from '../fields/index.js'; +import { Blob } from './index.js'; + +// Importing directly from 'c-kzg' does not work, ignoring import/no-named-as-default-member err: +/* eslint-disable import/no-named-as-default-member */ + +const { + BYTES_PER_BLOB, + FIELD_ELEMENTS_PER_BLOB, + blobToKzgCommitment, + computeBlobKzgProof, + computeKzgProof, + loadTrustedSetup, + verifyBlobKzgProofBatch, + verifyKzgProof, +} = cKzg; + +try { + loadTrustedSetup(); +} catch (error: any) { + if (error.message.includes('trusted setup is already loaded')) { + // NB: The c-kzg lib has no way of checking whether the setup is loaded or not, + // and it throws an error if it's already loaded, even though nothing is wrong. + // This is a rudimentary way of ensuring we load the trusted setup if we need it. + } else { + throw new Error(error); + } +} + +describe('blob', () => { + it('c-kzg lib should verify a batch of blobs', () => { + // This test is taken from the blob-lib repo + const BATCH_SIZE = 3; + const blobs: BlobBuffer[] = []; + const commitments: Bytes48[] = []; + const kzgProofs: KZGProof[] = []; + + for (let i = 0; i < BATCH_SIZE; i++) { + blobs.push(Buffer.alloc(BYTES_PER_BLOB)); + (blobs[i] as Buffer).write('potato', 0, 'utf8'); + (blobs[i] as Buffer).write('potato', BYTES_PER_BLOB - 50, 'utf8'); + commitments.push(blobToKzgCommitment(blobs[i])); + kzgProofs.push(computeBlobKzgProof(blobs[i], commitments[i])); + } + const isValid = verifyBlobKzgProofBatch(blobs, commitments, kzgProofs); + + expect(isValid).toBe(true); + }); + + it('should verify a kzg precise proof', () => { + // This test is taken from the blob-lib repo + const zBytes = Buffer.alloc(32); + + // blobs[0][31] = x, and z = 0x01 results in y = x. + // So the first blob field is evaluated at 0x01. + (zBytes as Buffer).write('01', 31, 'hex'); + + // This is the 2nd root of unity, after 1, because we actually get the bit_reversal_permutation of the root of unity. And although `7` is the primitive root of unity, the roots of unity are derived as 7 ^ ((BLS_MODULUS - 1) / FIELD_ELEMENTS_PER_BLOB) mod BLS_MODULUS. + (zBytes as Buffer).write('73EDA753299D7D483339D80809A1D80553BDA402FFFE5BFEFFFFFFFF00000000', 0, 'hex'); // equiv to 52435875175126190479447740508185965837690552500527637822603658699938581184512 which is actually -1 in the scalar field! + + const blob = Buffer.alloc(BYTES_PER_BLOB); + (blob as Buffer).write('09', 31, 'hex'); + (blob as Buffer).write('07', 31 + 32, 'hex'); + + const proofResult = computeKzgProof(blob, zBytes); + const commitment = blobToKzgCommitment(blob); + + const isValid = verifyKzgProof(commitment, zBytes, proofResult[1], proofResult[0]); + + expect(isValid).toBe(true); + }); + + it('should evaluate a blob of 400 items', () => { + // This test ensures that the Blob class correctly matches the c-kzg lib + // The values here are used to test Noir's blob evaluation in noir-projects/noir-protocol-circuits/crates/blob/src/blob.nr -> test_400 + const blobItems = Array(400).fill(new Fr(3)); + const ourBlob = new Blob(blobItems); + const blobItemsHash = poseidon2Hash(Array(400).fill(new Fr(3))); + expect(blobItemsHash).toEqual(ourBlob.fieldsHash); + expect(blobToKzgCommitment(ourBlob.data)).toEqual(ourBlob.commitment); + + const z = poseidon2Hash([blobItemsHash, ...ourBlob.commitmentToFields()]); + expect(z).toEqual(ourBlob.challengeZ); + + const res = computeKzgProof(ourBlob.data, ourBlob.challengeZ.toBuffer()); + expect(res[0]).toEqual(ourBlob.proof); + expect(res[1]).toEqual(ourBlob.evaluationY); + + const isValid = verifyKzgProof( + ourBlob.commitment, + ourBlob.challengeZ.toBuffer(), + ourBlob.evaluationY, + ourBlob.proof, + ); + expect(isValid).toBe(true); + }); + + it('should evaluate full blobs', () => { + // This test ensures that the Blob class correctly matches the c-kzg lib + // The values here are used to test Noir's blob evaluation in noir-projects/noir-protocol-circuits/crates/blob/src/blob.nr -> test_full_blobs + + const blobItems = []; + for (let j = 0; j < 3; j++) { + for (let i = 0; i < FIELD_ELEMENTS_PER_BLOB; i++) { + blobItems[j * FIELD_ELEMENTS_PER_BLOB + i] = new Fr(i + 2); + } + } + const blobItemsHash = poseidon2Hash(blobItems); + const blobs = Blob.getBlobs(blobItems); + blobs.forEach(ourBlob => { + // const ourBlob = new Blob(blobItems.slice(j * FIELD_ELEMENTS_PER_BLOB, (j + 1) * FIELD_ELEMENTS_PER_BLOB), blobItemsHash); + expect(blobItemsHash).toEqual(ourBlob.fieldsHash); + expect(blobToKzgCommitment(ourBlob.data)).toEqual(ourBlob.commitment); + + const z = poseidon2Hash([blobItemsHash, ...ourBlob.commitmentToFields()]); + expect(z).toEqual(ourBlob.challengeZ); + + const res = computeKzgProof(ourBlob.data, ourBlob.challengeZ.toBuffer()); + expect(res[0]).toEqual(ourBlob.proof); + expect(res[1]).toEqual(ourBlob.evaluationY); + + const isValid = verifyKzgProof( + ourBlob.commitment, + ourBlob.challengeZ.toBuffer(), + ourBlob.evaluationY, + ourBlob.proof, + ); + expect(isValid).toBe(true); + }); + }); +}); diff --git a/yarn-project/foundation/src/blob/index.ts b/yarn-project/foundation/src/blob/index.ts new file mode 100644 index 00000000000..6c1651f4c56 --- /dev/null +++ b/yarn-project/foundation/src/blob/index.ts @@ -0,0 +1,152 @@ +import cKzg from 'c-kzg'; +import type { Blob as BlobBuffer } from 'c-kzg'; + +import { poseidon2Hash, sha256 } from '../crypto/index.js'; +import { Fr } from '../fields/index.js'; +import { serializeToBuffer } from '../serialize/index.js'; + +// Importing directly from 'c-kzg' does not work, ignoring import/no-named-as-default-member err: +/* eslint-disable import/no-named-as-default-member */ + +const { + BYTES_PER_BLOB, + FIELD_ELEMENTS_PER_BLOB, + blobToKzgCommitment, + computeKzgProof, + loadTrustedSetup, + verifyKzgProof, +} = cKzg; + +try { + loadTrustedSetup(); +} catch (error: any) { + if (error.message.includes('trusted setup is already loaded')) { + // NB: The c-kzg lib has no way of checking whether the setup is loaded or not, + // and it throws an error if it's already loaded, even though nothing is wrong. + // This is a rudimentary way of ensuring we load the trusted setup if we need it. + } else { + throw new Error(error); + } +} + +// The prefix to the EVM blobHash, defined here: https://eips.ethereum.org/EIPS/eip-4844#specification +export const VERSIONED_HASH_VERSION_KZG = 0x01; + +/** + * A class to create, manage, and prove EVM blobs. + */ +export class Blob { + /** The blob to be broadcast on L1 in bytes form. */ + public readonly data: BlobBuffer; + /** The hash of all tx effects inside the blob. Used in generating the challenge z and proving that we have included all required effects. */ + public readonly fieldsHash: Fr; + /** Challenge point z (= H(H(tx_effects), kzgCommmitment). Used such that p(z) = y. */ + public readonly challengeZ: Fr; + /** Evaluation y = p(z), where p() is the blob polynomial. BLS12 field element, rep. as BigNum in nr, bigint in ts. */ + public readonly evaluationY: Buffer; + /** Commitment to the blob C. Used in compressed BLS12 point format (48 bytes). */ + public readonly commitment: Buffer; + /** KZG opening proof for y = p(z). The commitment to quotient polynomial Q, used in compressed BLS12 point format (48 bytes). */ + public readonly proof: Buffer; + + constructor( + /** All fields to be broadcast in the blob. */ + fields: Fr[], + /** If we want to broadcast more fields than fit into a blob, we hash those and used it as the fieldsHash across all blobs. + * This is much simpler and cheaper in the circuit to do, but MUST BE CHECKED before injecting here. + */ + multiBlobFieldsHash?: Fr, + ) { + if (fields.length > FIELD_ELEMENTS_PER_BLOB) { + throw new Error( + `Attempted to overfill blob with ${fields.length} elements. The maximum is ${FIELD_ELEMENTS_PER_BLOB}`, + ); + } + this.data = Buffer.concat([serializeToBuffer(fields)], BYTES_PER_BLOB); + // This matches the output of SpongeBlob.squeeze() in the blob circuit + this.fieldsHash = multiBlobFieldsHash ? multiBlobFieldsHash : poseidon2Hash(fields); + this.commitment = Buffer.from(blobToKzgCommitment(this.data)); + this.challengeZ = poseidon2Hash([this.fieldsHash, ...this.commitmentToFields()]); + const res = computeKzgProof(this.data, this.challengeZ.toBuffer()); + if (!verifyKzgProof(this.commitment, this.challengeZ.toBuffer(), res[1], res[0])) { + throw new Error(`KZG proof did not verify.`); + } + this.proof = Buffer.from(res[0]); + this.evaluationY = Buffer.from(res[1]); + } + + // 48 bytes encoded in fields as [Fr, Fr] = [0->31, 31->48] + commitmentToFields(): [Fr, Fr] { + return [new Fr(this.commitment.subarray(0, 31)), new Fr(this.commitment.subarray(31, 48))]; + } + + // Returns ethereum's versioned blob hash, following kzg_to_versioned_hash: https://eips.ethereum.org/EIPS/eip-4844#helpers + getEthVersionedBlobHash(): Buffer { + const hash = sha256(this.commitment); + hash[0] = VERSIONED_HASH_VERSION_KZG; + return hash; + } + + static getEthVersionedBlobHash(commitment: Buffer): Buffer { + const hash = sha256(commitment); + hash[0] = VERSIONED_HASH_VERSION_KZG; + return hash; + } + + // Returns a proof of opening of the blob to verify on L1 using the point evaluation precompile: + // * input[:32] - versioned_hash + // * input[32:64] - z + // * input[64:96] - y + // * input[96:144] - commitment C + // * input[144:192] - proof (a commitment to the quotient polynomial q(X)) + // See https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile + getEthBlobEvaluationInputs(): `0x${string}` { + const buf = Buffer.concat([ + this.getEthVersionedBlobHash(), + this.challengeZ.toBuffer(), + this.evaluationY, + this.commitment, + this.proof, + ]); + return `0x${buf.toString('hex')}`; + } + + static getEthBlobEvaluationInputs(blobs: Blob[]): `0x${string}` { + let buf = Buffer.alloc(0); + blobs.forEach(blob => { + buf = Buffer.concat([ + buf, + blob.getEthVersionedBlobHash(), + blob.challengeZ.toBuffer(), + blob.evaluationY, + blob.commitment, + blob.proof, + ]); + }); + // For multiple blobs, we prefix the number of blobs: + const lenBuf = Buffer.alloc(1); + lenBuf.writeUint8(blobs.length); + buf = Buffer.concat([lenBuf, buf]); + return `0x${buf.toString('hex')}`; + } + + static getViemKzgInstance() { + return { + blobToKzgCommitment: cKzg.blobToKzgCommitment, + computeBlobKzgProof: cKzg.computeBlobKzgProof, + }; + } + + // Returns as many blobs as we require to broadcast the given fields + // Assumes we share the fields hash between all blobs + static getBlobs(fields: Fr[]): Blob[] { + const numBlobs = Math.max(Math.ceil(fields.length / FIELD_ELEMENTS_PER_BLOB), 1); + const multiBlobFieldsHash = poseidon2Hash(fields); + const res = []; + for (let i = 0; i < numBlobs; i++) { + const end = fields.length < (i + 1) * FIELD_ELEMENTS_PER_BLOB ? fields.length : (i + 1) * FIELD_ELEMENTS_PER_BLOB; + res.push(new Blob(fields.slice(i * FIELD_ELEMENTS_PER_BLOB, end), multiBlobFieldsHash)); + } + return res; + } +} diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index cb43781825f..4828878d721 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -52,6 +52,7 @@ export type EnvVar = | 'GOVERNANCE_PROPOSER_PAYLOAD_ADDRESS' | 'INBOX_CONTRACT_ADDRESS' | 'L1_CHAIN_ID' + | 'L1_CONSENSUS_CLIENT_URL' | 'L1_PRIVATE_KEY' | 'L2_QUEUE_SIZE' | 'LOG_ELAPSED_TIME' @@ -125,8 +126,6 @@ export type EnvVar = | 'PROVER_REAL_PROOFS' | 'PROVER_REQUIRED_CONFIRMATIONS' | 'PROVER_TEST_DELAY_MS' - | 'PROVER_CACHE_DIR' - | 'PXE_BLOCK_POLLING_INTERVAL_MS' | 'PXE_L2_STARTING_BLOCK' | 'PXE_PROVER_ENABLED' | 'QUOTE_PROVIDER_BASIS_POINT_FEE' @@ -137,11 +136,8 @@ export type EnvVar = | 'REGISTRY_CONTRACT_ADDRESS' | 'ROLLUP_CONTRACT_ADDRESS' | 'SEQ_ALLOWED_SETUP_FN' - | 'SEQ_ALLOWED_TEARDOWN_FN' | 'SEQ_MAX_BLOCK_SIZE_IN_BYTES' - | 'SEQ_MAX_SECONDS_BETWEEN_BLOCKS' | 'SEQ_MAX_TX_PER_BLOCK' - | 'SEQ_MIN_SECONDS_BETWEEN_BLOCKS' | 'SEQ_MIN_TX_PER_BLOCK' | 'SEQ_PUBLISH_RETRY_INTERVAL_MS' | 'SEQ_PUBLISHER_PRIVATE_KEY' @@ -185,6 +181,7 @@ export type EnvVar = | 'L1_TX_MONITOR_CHECK_INTERVAL_MS' | 'L1_TX_MONITOR_STALL_TIME_MS' | 'L1_TX_MONITOR_TX_TIMEOUT_MS' + | 'L1_TX_PROPAGATION_MAX_QUERY_ATTEMPTS' | 'FAUCET_MNEMONIC_ACCOUNT_INDEX' | 'FAUCET_ETH_AMOUNT' | 'FAUCET_INTERVAL_MS' diff --git a/yarn-project/foundation/src/fields/fields.test.ts b/yarn-project/foundation/src/fields/fields.test.ts index 491b0d79756..7b8b4cd80d4 100644 --- a/yarn-project/foundation/src/fields/fields.test.ts +++ b/yarn-project/foundation/src/fields/fields.test.ts @@ -33,16 +33,53 @@ describe('GrumpkinScalar Serialization', () => { expect(deserialized).toEqual(original); // Note odd number of digits - const arbitraryString = '123'; - const arbitraryHexString = '0x123'; - const expectedBigInt = 291n; + const arbitraryNumericString = '123'; + const arbitraryNumericStringPrepended = '0x123'; + const expectedBigIntFromHex = 291n; - expect(GrumpkinScalar.fromString(arbitraryString).toBigInt()).toEqual(expectedBigInt); - expect(GrumpkinScalar.fromString(arbitraryHexString).toBigInt()).toEqual(expectedBigInt); + const anotherString = '1000a000'; + const anotherStringPrepended = '0x1000a000'; - const incorrectlyFormattedString = '12xx34xx45'; + const expectedValueOfAnotherHexString = 268476416n; - expect(() => GrumpkinScalar.fromString(incorrectlyFormattedString).toBigInt()).toThrow(); + expect(GrumpkinScalar.fromString(arbitraryNumericString).toBigInt()).toEqual(BigInt(arbitraryNumericString)); + expect(GrumpkinScalar.fromString(arbitraryNumericStringPrepended).toBigInt()).toEqual(expectedBigIntFromHex); + + expect(() => GrumpkinScalar.fromString(anotherString)).toThrow('Tried to create a Fq from an invalid string'); + expect(GrumpkinScalar.fromString(anotherStringPrepended).toBigInt()).toEqual(expectedValueOfAnotherHexString); + + const nonHexEncodedString = '0x12xx34xx45'; + expect(() => GrumpkinScalar.fromHexString(nonHexEncodedString)).toThrow('Invalid hex-encoded string'); + }); + + // Test case for GrumpkinScalar.fromHexString + it('fromHexString should serialize and deserialize correctly', () => { + const original = GrumpkinScalar.random(); + const hexString = original.toString(); + const deserialized = GrumpkinScalar.fromHexString(hexString); + + // Check if the deserialized instance is equal to the original + expect(deserialized).toEqual(original); + + // Note odd number of digits + const arbitraryNumericString = '123'; + const arbitraryNumericStringPrepended = '0x123'; + const expectedBigIntFromHex = 291n; + + const anotherString = 'deadbeef'; + const anotherStringPrepended = '0xdeadbeef'; + + const expectedValueOfAnotherHexString = 3735928559n; + + expect(GrumpkinScalar.fromHexString(arbitraryNumericString).toBigInt()).toEqual(expectedBigIntFromHex); + expect(GrumpkinScalar.fromHexString(arbitraryNumericStringPrepended).toBigInt()).toEqual(expectedBigIntFromHex); + + expect(GrumpkinScalar.fromHexString(anotherString).toBigInt()).toEqual(expectedValueOfAnotherHexString); + expect(GrumpkinScalar.fromHexString(anotherStringPrepended).toBigInt()).toEqual(expectedValueOfAnotherHexString); + + const nonHexEncodedString = '12xx34xx45'; + + expect(() => GrumpkinScalar.fromHexString(nonHexEncodedString).toBigInt()).toThrow(); }); // Test case for GrumpkinScalar.toBuffer @@ -59,7 +96,7 @@ describe('GrumpkinScalar Serialization', () => { it('toString should serialize and deserialize correctly', () => { const original = GrumpkinScalar.random(); const hexString = original.toString(); - const deserialized = GrumpkinScalar.fromString(hexString); + const deserialized = GrumpkinScalar.fromHexString(hexString); // Check if the deserialized instance is equal to the original expect(deserialized).toEqual(original); diff --git a/yarn-project/foundation/src/fields/fields.ts b/yarn-project/foundation/src/fields/fields.ts index 84b559c4f3c..0c849076bea 100644 --- a/yarn-project/foundation/src/fields/fields.ts +++ b/yarn-project/foundation/src/fields/fields.ts @@ -232,12 +232,31 @@ export class Fr extends BaseField { return fromBufferReduce(buffer, Fr); } + /** + * Creates a Fr instance from a string. + * @param buf - the string to create a Fr from. + * @returns the Fr instance + * @remarks if the string only consists of numbers, we assume we are parsing a bigint, + * otherwise we require the hex string to be prepended with "0x", to ensure there is no misunderstanding + * as to what is being parsed. + */ + static fromString(buf: string) { + if (buf.match(/^\d+$/) !== null) { + return new Fr(toBufferBE(BigInt(buf), 32)); + } + if (buf.match(/^0x/i) !== null) { + return fromHexString(buf, Fr); + } + + throw new Error('Tried to create a Fr from an invalid string'); + } + /** * Creates a Fr instance from a hex string. * @param buf - a hex encoded string. * @returns the Fr instance */ - static fromString(buf: string) { + static fromHexString(buf: string) { return fromHexString(buf, Fr); } @@ -368,12 +387,31 @@ export class Fq extends BaseField { return fromBufferReduce(buffer, Fq); } + /** + * Creates a Fq instance from a string. + * @param buf - the string to create a Fq from. + * @returns the Fq instance + * @remarks if the string only consists of numbers, we assume we are parsing a bigint, + * otherwise we require the hex string to be prepended with "0x", to ensure there is no misunderstanding + * as to what is being parsed. + */ + static fromString(buf: string) { + if (buf.match(/^\d+$/) !== null) { + return new Fq(toBufferBE(BigInt(buf), 32)); + } + if (buf.match(/^0x/i) !== null) { + return fromHexString(buf, Fq); + } + + throw new Error('Tried to create a Fq from an invalid string'); + } + /** * Creates a Fq instance from a hex string. * @param buf - a hex encoded string. * @returns the Fq instance */ - static fromString(buf: string) { + static fromHexString(buf: string) { return fromHexString(buf, Fq); } diff --git a/yarn-project/foundation/src/fields/point.test.ts b/yarn-project/foundation/src/fields/point.test.ts index f98771fb5c0..f7650b38da0 100644 --- a/yarn-project/foundation/src/fields/point.test.ts +++ b/yarn-project/foundation/src/fields/point.test.ts @@ -1,6 +1,6 @@ import { jsonParseWithSchema, jsonStringify } from '../json-rpc/convert.js'; import { schemas } from '../schemas/schemas.js'; -import { updateInlineTestData } from '../testing/test_data.js'; +import { updateInlineTestData } from '../testing/files/index.js'; import { Fr } from './fields.js'; import { Point } from './point.js'; diff --git a/yarn-project/foundation/src/index.ts b/yarn-project/foundation/src/index.ts index 78694f262f8..e8a8348de1f 100644 --- a/yarn-project/foundation/src/index.ts +++ b/yarn-project/foundation/src/index.ts @@ -3,6 +3,7 @@ export * as abi from './abi/index.js'; export * as asyncMap from './async-map/index.js'; export * as aztecAddress from './aztec-address/index.js'; export * as bigintBuffer from './bigint-buffer/index.js'; +export * as blob from './blob/index.js'; export * as collection from './collection/index.js'; export * as committable from './committable/index.js'; export * as crypto from './crypto/index.js'; diff --git a/yarn-project/foundation/src/log/pino-logger.ts b/yarn-project/foundation/src/log/pino-logger.ts index 1cc354b03bc..4178c4ff664 100644 --- a/yarn-project/foundation/src/log/pino-logger.ts +++ b/yarn-project/foundation/src/log/pino-logger.ts @@ -69,7 +69,46 @@ const [logLevel, logFilters] = parseEnv(process.env.LOG_LEVEL, defaultLogLevel); // Define custom logging levels for pino. const customLevels = { verbose: 25 }; -const pinoOpts = { customLevels, useOnlyCustomLevels: false, level: logLevel }; + +// inspired by https://github.com/pinojs/pino/issues/726#issuecomment-605814879 +const levelToSeverityFormatter = (label: string, level: number): object => { + // Severity labels https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity + let severity: string; + + switch (label as pino.Level | keyof typeof customLevels) { + case 'trace': + case 'debug': + severity = 'DEBUG'; + break; + case 'verbose': + case 'info': + severity = 'INFO'; + break; + case 'warn': + severity = 'WARNING'; + break; + case 'error': + severity = 'ERROR'; + break; + case 'fatal': + severity = 'CRITICAL'; + break; + default: + severity = 'DEFAULT'; + break; + } + + return { severity, level }; +}; + +const pinoOpts: pino.LoggerOptions = { + customLevels, + useOnlyCustomLevels: false, + level: logLevel, + formatters: { + level: levelToSeverityFormatter, + }, +}; export const levels = { labels: { ...pino.levels.labels, ...Object.fromEntries(Object.entries(customLevels).map(e => e.reverse())) }, diff --git a/yarn-project/foundation/src/promise/running-promise.test.ts b/yarn-project/foundation/src/promise/running-promise.test.ts index f1ac79297b7..f3ebe10d973 100644 --- a/yarn-project/foundation/src/promise/running-promise.test.ts +++ b/yarn-project/foundation/src/promise/running-promise.test.ts @@ -1,3 +1,4 @@ +import { type Logger, createLogger } from '../log/pino-logger.js'; import { sleep } from '../sleep/index.js'; import { RunningPromise } from './running-promise.js'; @@ -5,6 +6,7 @@ describe('RunningPromise', () => { let runningPromise: RunningPromise; let counter: number; let fn: () => Promise; + let logger: Logger; beforeEach(() => { counter = 0; @@ -12,7 +14,8 @@ describe('RunningPromise', () => { counter++; await sleep(100); }; - runningPromise = new RunningPromise(fn, 50); + logger = createLogger('test'); + runningPromise = new RunningPromise(fn, logger, 50); }); afterEach(async () => { @@ -40,5 +43,16 @@ describe('RunningPromise', () => { await runningPromise.trigger(); expect(counter).toEqual(2); }); + + it('handles errors', async () => { + const failingFn = async () => { + await fn(); + throw new Error('ouch'); + }; + runningPromise = new RunningPromise(failingFn, logger, 50); + runningPromise.start(); + await sleep(90); + expect(counter).toEqual(1); + }); }); }); diff --git a/yarn-project/foundation/src/promise/running-promise.ts b/yarn-project/foundation/src/promise/running-promise.ts index 47f7d1e643d..69288fcb0ca 100644 --- a/yarn-project/foundation/src/promise/running-promise.ts +++ b/yarn-project/foundation/src/promise/running-promise.ts @@ -1,3 +1,4 @@ +import { createLogger } from '../log/pino-logger.js'; import { InterruptibleSleep } from '../sleep/index.js'; import { type PromiseWithResolvers, promiseWithResolvers } from './utils.js'; @@ -12,7 +13,11 @@ export class RunningPromise { private interruptibleSleep = new InterruptibleSleep(); private requested: PromiseWithResolvers | undefined = undefined; - constructor(private fn: () => void | Promise, private pollingIntervalMS = 10000) {} + constructor( + private fn: () => void | Promise, + private logger = createLogger('running-promise'), + private pollingIntervalMS = 10000, + ) {} /** * Starts the running promise. @@ -23,7 +28,11 @@ export class RunningPromise { const poll = async () => { while (this.running) { const hasRequested = this.requested !== undefined; - await this.fn(); + try { + await this.fn(); + } catch (err) { + this.logger.error('Error in running promise', err); + } // If an immediate run had been requested *before* the function started running, resolve the request. if (hasRequested) { diff --git a/yarn-project/foundation/src/retry/index.ts b/yarn-project/foundation/src/retry/index.ts index bec54c65d7d..ce05747f7da 100644 --- a/yarn-project/foundation/src/retry/index.ts +++ b/yarn-project/foundation/src/retry/index.ts @@ -64,7 +64,7 @@ export async function retry( throw err; } log.verbose(`${name} failed. Will retry in ${s}s...`); - !failSilently && log.error(err); + !failSilently && log.error(`Error while retrying ${name}`, err); await sleep(s * 1000); continue; } diff --git a/yarn-project/foundation/src/schemas/utils.ts b/yarn-project/foundation/src/schemas/utils.ts index e09ef101d54..b98f3c3f783 100644 --- a/yarn-project/foundation/src/schemas/utils.ts +++ b/yarn-project/foundation/src/schemas/utils.ts @@ -75,10 +75,10 @@ export function hexSchemaFor { const stringSchema = refinement ? z.string().refine(refinement, `Not a valid instance`) : z.string(); - const hexSchema = stringSchema.refine(isHex, 'Not a valid hex string').transform(withoutHexPrefix); + const hexSchema = stringSchema.refine(isHex, 'Not a valid hex string'); return 'fromString' in klazz ? hexSchema.transform(klazz.fromString.bind(klazz)) - : hexSchema.transform(str => Buffer.from(str, 'hex')).transform(klazz.fromBuffer.bind(klazz)); + : hexSchema.transform(str => Buffer.from(withoutHexPrefix(str), 'hex')).transform(klazz.fromBuffer.bind(klazz)); } /** diff --git a/yarn-project/foundation/src/serialize/field_reader.ts b/yarn-project/foundation/src/serialize/field_reader.ts index 1c1242457b4..98e80c80909 100644 --- a/yarn-project/foundation/src/serialize/field_reader.ts +++ b/yarn-project/foundation/src/serialize/field_reader.ts @@ -140,4 +140,12 @@ export class FieldReader { }): T { return deserializer.fromFields(this); } + + /** + * Returns whether the reader has finished reading all fields. + * @returns A bool. + */ + public isFinished(): boolean { + return this.index === this.length; + } } diff --git a/yarn-project/foundation/src/string/index.ts b/yarn-project/foundation/src/string/index.ts index 1b85173fc1a..c6d0d4d8fc9 100644 --- a/yarn-project/foundation/src/string/index.ts +++ b/yarn-project/foundation/src/string/index.ts @@ -25,3 +25,7 @@ export function pluralize(str: string, count: number | bigint, plural?: string): export function count(count: number | bigint, str: string, plural?: string): string { return `${count} ${pluralize(str, count, plural)}`; } + +export function truncate(str: string, length: number = 64): string { + return str.length > length ? str.slice(0, length) + '...' : str; +} diff --git a/yarn-project/foundation/src/testing/files/index.ts b/yarn-project/foundation/src/testing/files/index.ts new file mode 100644 index 00000000000..a610bc9b473 --- /dev/null +++ b/yarn-project/foundation/src/testing/files/index.ts @@ -0,0 +1,76 @@ +import { existsSync, readFileSync, writeFileSync } from 'fs'; +import { dirname, join, resolve } from 'path'; + +import { createConsoleLogger } from '../../log/console.js'; +import { fileURLToPath } from '../../url/index.js'; +import { isGenerateTestDataEnabled } from '../test_data.js'; + +let generateProtocolCircuitTestData = false; + +/** + * This is separate so Prover.tomls don't get edited everytime any test is run, + * Only full.test updates prover tomls, then switches this off. + */ +export function switchGenerateProtocolCircuitTestData() { + generateProtocolCircuitTestData = !generateProtocolCircuitTestData; +} + +/** Writes the contents specified to the target file if test data generation is enabled. */ +export function writeTestData(targetFileFromRepoRoot: string, contents: string | Buffer) { + if (!isGenerateTestDataEnabled()) { + return; + } + const targetFile = getPathToFile(targetFileFromRepoRoot); + const toWrite = typeof contents === 'string' ? contents : contents.toString('hex'); + writeFileSync(targetFile, toWrite); + const logger = createConsoleLogger('aztec:testing:test_data'); + logger(`Wrote test data to ${targetFile}`); +} + +/** + * Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled. + * Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`, + * but running nargo fmt on it panics since the comment would be erased, so we roll with this for now. + * @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set + */ +export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string) { + if (!isGenerateTestDataEnabled()) { + return; + } + const logger = createConsoleLogger('aztec:testing:test_data'); + const targetFile = getPathToFile(targetFileFromRepoRoot); + const contents = readFileSync(targetFile, 'utf8').toString(); + const regex = new RegExp(`let ${itemName} =[\\s\\S]*?;`, 'g'); + if (!regex.exec(contents)) { + throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`); + } + + const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`); + writeFileSync(targetFile, updatedContents); + logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`); +} + +/** + * Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/. + * @remarks Requires AZTEC_GENERATE_TEST_DATA=1 & generateProtocolCircuitTestData=true to be set + * To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn workspace @aztec/end-to-end test full.test' + */ +export function updateProtocolCircuitSampleInputs(circuitName: string, value: string) { + if (!isGenerateTestDataEnabled() || !generateProtocolCircuitTestData) { + return; + } + const logger = createConsoleLogger('aztec:testing:test_data'); + const targetFileFromRepoRoot = `noir-projects/noir-protocol-circuits/crates/${circuitName}/Prover.toml`; + const targetFile = getPathToFile(targetFileFromRepoRoot); + writeFileSync(targetFile, value); + logger(`Updated test data in ${targetFile} for ${circuitName}`); +} + +function getPathToFile(targetFileFromRepoRoot: string) { + const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../../'); + if (!existsSync(join(repoRoot, 'CODEOWNERS'))) { + throw new Error(`Path to repo root is incorrect (got ${repoRoot})`); + } + + return join(repoRoot, targetFileFromRepoRoot); +} diff --git a/yarn-project/foundation/src/testing/index.ts b/yarn-project/foundation/src/testing/index.ts index b39430dd6f0..5d2ecb37c2b 100644 --- a/yarn-project/foundation/src/testing/index.ts +++ b/yarn-project/foundation/src/testing/index.ts @@ -1,3 +1,3 @@ -export * from './test_data.js'; export * from './snapshot_serializer.js'; export * from './port_allocator.js'; +export * from './test_data.js'; diff --git a/yarn-project/foundation/src/testing/test_data.ts b/yarn-project/foundation/src/testing/test_data.ts index 1268d4473b1..7e16b0e6be5 100644 --- a/yarn-project/foundation/src/testing/test_data.ts +++ b/yarn-project/foundation/src/testing/test_data.ts @@ -1,9 +1,3 @@ -import { existsSync, readFileSync, writeFileSync } from 'fs'; -import { dirname, join, resolve } from 'path'; - -import { createConsoleLogger } from '../log/console.js'; -import { fileURLToPath } from '../url/index.js'; - const testData: { [key: string]: unknown[] } = {}; /** Returns whether test data generation is enabled */ @@ -40,47 +34,3 @@ export function getTestData(itemName: string): unknown[] { const fullItemName = `${testName} ${itemName}`; return testData[fullItemName]; } - -/** Writes the contents specified to the target file if test data generation is enabled. */ -export function writeTestData(targetFileFromRepoRoot: string, contents: string | Buffer) { - if (!isGenerateTestDataEnabled()) { - return; - } - const targetFile = getPathToFile(targetFileFromRepoRoot); - const toWrite = typeof contents === 'string' ? contents : contents.toString('hex'); - writeFileSync(targetFile, toWrite); - const logger = createConsoleLogger('aztec:testing:test_data'); - logger(`Wrote test data to ${targetFile}`); -} - -/** - * Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled. - * Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`, - * but running nargo fmt on it panics since the comment would be erased, so we roll with this for now. - * @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set - */ -export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string) { - if (!isGenerateTestDataEnabled()) { - return; - } - const logger = createConsoleLogger('aztec:testing:test_data'); - const targetFile = getPathToFile(targetFileFromRepoRoot); - const contents = readFileSync(targetFile, 'utf8').toString(); - const regex = new RegExp(`let ${itemName} =[\\s\\S]*?;`, 'g'); - if (!regex.exec(contents)) { - throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`); - } - - const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`); - writeFileSync(targetFile, updatedContents); - logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`); -} - -function getPathToFile(targetFileFromRepoRoot: string) { - const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../'); - if (!existsSync(join(repoRoot, 'CODEOWNERS'))) { - throw new Error(`Path to repo root is incorrect (got ${repoRoot})`); - } - - return join(repoRoot, targetFileFromRepoRoot); -} diff --git a/yarn-project/foundation/src/timer/date.test.ts b/yarn-project/foundation/src/timer/date.test.ts new file mode 100644 index 00000000000..55aeac96d55 --- /dev/null +++ b/yarn-project/foundation/src/timer/date.test.ts @@ -0,0 +1,33 @@ +import { sleep } from '../sleep/index.js'; +import { TestDateProvider } from './date.js'; + +describe('TestDateProvider', () => { + let dateProvider: TestDateProvider; + beforeEach(() => { + dateProvider = new TestDateProvider(); + }); + + it('should return the current datetime', () => { + const currentTime = Date.now(); + const result = dateProvider.now(); + expect(result).toBeGreaterThanOrEqual(currentTime); + expect(result).toBeLessThan(currentTime + 100); + }); + + it('should return the overridden datetime', () => { + const overriddenTime = Date.now() + 1000; + dateProvider.setTime(overriddenTime); + const result = dateProvider.now(); + expect(result).toBeGreaterThanOrEqual(overriddenTime); + expect(result).toBeLessThan(overriddenTime + 100); + }); + + it('should keep ticking after overriding', async () => { + const overriddenTime = Date.now() + 1000; + dateProvider.setTime(overriddenTime); + await sleep(510); + const result = dateProvider.now(); + expect(result).toBeGreaterThanOrEqual(overriddenTime + 500); + expect(result).toBeLessThan(overriddenTime + 600); + }); +}); diff --git a/yarn-project/foundation/src/timer/date.ts b/yarn-project/foundation/src/timer/date.ts new file mode 100644 index 00000000000..f1ed1ee4361 --- /dev/null +++ b/yarn-project/foundation/src/timer/date.ts @@ -0,0 +1,24 @@ +import { createLogger } from '../log/pino-logger.js'; + +/** Returns current datetime. */ +export class DateProvider { + public now(): number { + return Date.now(); + } +} + +/** Returns current datetime and allows to override it. */ +export class TestDateProvider implements DateProvider { + private offset = 0; + + constructor(private readonly logger = createLogger('foundation:test-date-provider')) {} + + public now(): number { + return Date.now() + this.offset; + } + + public setTime(timeMs: number) { + this.offset = timeMs - Date.now(); + this.logger.warn(`Time set to ${timeMs}`); + } +} diff --git a/yarn-project/foundation/src/timer/index.ts b/yarn-project/foundation/src/timer/index.ts index 972248c8f41..afb200bb32f 100644 --- a/yarn-project/foundation/src/timer/index.ts +++ b/yarn-project/foundation/src/timer/index.ts @@ -1,3 +1,4 @@ export { TimeoutTask, executeTimeoutWithCustomError } from './timeout.js'; export { Timer } from './timer.js'; export { elapsed, elapsedSync } from './elapsed.js'; +export * from './date.js'; 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 index ae14f3cdf39..076e4518b75 100644 --- a/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts +++ b/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts @@ -1,5 +1,11 @@ -import { BB_RESULT, executeBbClientIvcProof, verifyClientIvcProof } from '@aztec/bb-prover'; -import { ClientIvcProof } from '@aztec/circuits.js'; +import { + BB_RESULT, + executeBbClientIvcProof, + readFromOutputDirectory, + verifyClientIvcProof, + writeToOutputDirectory, +} from '@aztec/bb-prover'; +import { type ClientIvcProof } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; import { jest } from '@jest/globals'; @@ -40,14 +46,13 @@ describe('Client IVC Integration', () => { path.join(bbWorkingDirectory, 'acir.msgpack'), path.join(bbWorkingDirectory, 'witnesses.msgpack'), logger.info, - true, ); if (provingResult.status === BB_RESULT.FAILURE) { throw new Error(provingResult.reason); } - return ClientIvcProof.readFromOutputDirectory(bbWorkingDirectory); + return readFromOutputDirectory(bbWorkingDirectory); } // This test will verify a client IVC proof of a simple tx: @@ -58,7 +63,7 @@ describe('Client IVC Integration', () => { const [bytecodes, witnessStack] = await generate3FunctionTestingIVCStack(); const proof = await createClientIvcProof(witnessStack, bytecodes); - await proof.writeToOutputDirectory(bbWorkingDirectory); + await writeToOutputDirectory(proof, bbWorkingDirectory); const verifyResult = await verifyClientIvcProof(bbBinaryPath, bbWorkingDirectory, logger.info); expect(verifyResult.status).toEqual(BB_RESULT.SUCCESS); @@ -75,7 +80,7 @@ describe('Client IVC Integration', () => { const [bytecodes, witnessStack] = await generate6FunctionTestingIVCStack(); const proof = await createClientIvcProof(witnessStack, bytecodes); - await proof.writeToOutputDirectory(bbWorkingDirectory); + await writeToOutputDirectory(proof, bbWorkingDirectory); const verifyResult = await verifyClientIvcProof(bbBinaryPath, bbWorkingDirectory, logger.info); expect(verifyResult.status).toEqual(BB_RESULT.SUCCESS); diff --git a/yarn-project/kv-store/src/indexeddb/store.ts b/yarn-project/kv-store/src/indexeddb/store.ts index ad841c0a9ab..fe72cdf0662 100644 --- a/yarn-project/kv-store/src/indexeddb/store.ts +++ b/yarn-project/kv-store/src/indexeddb/store.ts @@ -1,6 +1,6 @@ import { type Logger } from '@aztec/foundation/log'; -import { type DBSchema, type IDBPDatabase, openDB } from 'idb'; +import { type DBSchema, type IDBPDatabase, deleteDB, openDB } from 'idb'; import { type AztecAsyncArray } from '../interfaces/array.js'; import { type Key } from '../interfaces/common.js'; @@ -183,7 +183,8 @@ export class AztecIndexedDBStore implements AztecAsyncKVStore { /** Deletes this store and removes the database */ delete() { this.#containers.clear(); - return Promise.resolve(this.#rootDB.deleteObjectStore('data')); + this.#rootDB.close(); + return deleteDB(this.#name); } estimateSize(): { mappingSize: number; actualSize: number; numItems: number } { diff --git a/yarn-project/kv-store/src/interfaces/array_test_suite.ts b/yarn-project/kv-store/src/interfaces/array_test_suite.ts index 0affe23305e..552e7201cf1 100644 --- a/yarn-project/kv-store/src/interfaces/array_test_suite.ts +++ b/yarn-project/kv-store/src/interfaces/array_test_suite.ts @@ -20,6 +20,10 @@ export function describeAztecArray( arr = store.openArray('test'); }); + afterEach(async () => { + await store.delete(); + }); + async function length(sut: AztecAsyncArray | AztecArray = arr) { return isSyncStore(store) && !forceAsync ? (sut as AztecArray).length diff --git a/yarn-project/kv-store/src/interfaces/map.ts b/yarn-project/kv-store/src/interfaces/map.ts index 6ded76080db..f63505dae9f 100644 --- a/yarn-project/kv-store/src/interfaces/map.ts +++ b/yarn-project/kv-store/src/interfaces/map.ts @@ -62,6 +62,19 @@ export interface AztecMap extends AztecBaseMap { * @param range - The range of keys to iterate over */ keys(range?: Range): IterableIterator; + + /** + * Clears the map. + */ + clear(): Promise; +} + +export interface AztecMapWithSize extends AztecMap { + /** + * Gets the size of the map. + * @returns The size of the map + */ + size(): number; } /** @@ -82,6 +95,14 @@ export interface AztecMultiMap extends AztecMap { deleteValue(key: K, val: V): Promise; } +export interface AztecMultiMapWithSize extends AztecMultiMap { + /** + * Gets the size of the map. + * @returns The size of the map + */ + size(): number; +} + /** * A map backed by a persistent store. */ diff --git a/yarn-project/kv-store/src/interfaces/map_test_suite.ts b/yarn-project/kv-store/src/interfaces/map_test_suite.ts index 3c999f01b2c..7736315ec6f 100644 --- a/yarn-project/kv-store/src/interfaces/map_test_suite.ts +++ b/yarn-project/kv-store/src/interfaces/map_test_suite.ts @@ -21,6 +21,10 @@ export function describeAztecMap( map = store.openMultiMap('test'); }); + afterEach(async () => { + await store.delete(); + }); + async function get(key: Key, sut: AztecAsyncMap | AztecMap = map) { return isSyncStore(store) && !forceAsync ? (sut as AztecMultiMap).get(key) diff --git a/yarn-project/kv-store/src/interfaces/set_test_suite.ts b/yarn-project/kv-store/src/interfaces/set_test_suite.ts index 08f2758ebf3..ad2de503f31 100644 --- a/yarn-project/kv-store/src/interfaces/set_test_suite.ts +++ b/yarn-project/kv-store/src/interfaces/set_test_suite.ts @@ -21,6 +21,10 @@ export function describeAztecSet( set = store.openSet('test'); }); + afterEach(async () => { + await store.delete(); + }); + async function has(key: string) { return isSyncStore(store) && !forceAsync ? (set as AztecSet).has(key) diff --git a/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts b/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts index b3ad148f8d0..6ecaa24522d 100644 --- a/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts +++ b/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts @@ -18,6 +18,10 @@ export function describeAztecSingleton( singleton = store.openSingleton('test'); }); + afterEach(async () => { + await store.delete(); + }); + async function get() { return isSyncStore(store) && !forceAsync ? (singleton as AztecSingleton).get() diff --git a/yarn-project/kv-store/src/interfaces/store.ts b/yarn-project/kv-store/src/interfaces/store.ts index 81c4d956bed..bee1e2e0e8a 100644 --- a/yarn-project/kv-store/src/interfaces/store.ts +++ b/yarn-project/kv-store/src/interfaces/store.ts @@ -1,7 +1,14 @@ import { type AztecArray, type AztecAsyncArray } from './array.js'; import { type Key } from './common.js'; import { type AztecAsyncCounter, type AztecCounter } from './counter.js'; -import { type AztecAsyncMap, type AztecAsyncMultiMap, type AztecMap, type AztecMultiMap } from './map.js'; +import { + type AztecAsyncMap, + type AztecAsyncMultiMap, + type AztecMap, + type AztecMapWithSize, + type AztecMultiMap, + type AztecMultiMapWithSize, +} from './map.js'; import { type AztecAsyncSet, type AztecSet } from './set.js'; import { type AztecAsyncSingleton, type AztecSingleton } from './singleton.js'; @@ -29,6 +36,20 @@ export interface AztecKVStore { */ openMultiMap(name: string): AztecMultiMap; + /** + * Creates a new multi-map with size. + * @param name - The name of the multi-map + * @returns The multi-map + */ + openMultiMapWithSize(name: string): AztecMultiMapWithSize; + + /** + * Creates a new map with size. + * @param name - The name of the map + * @returns The map + */ + openMapWithSize(name: string): AztecMapWithSize; + /** * Creates a new array. * @param name - The name of the array diff --git a/yarn-project/kv-store/src/interfaces/store_test_suite.ts b/yarn-project/kv-store/src/interfaces/store_test_suite.ts index 91c2240ecc3..051504889f0 100644 --- a/yarn-project/kv-store/src/interfaces/store_test_suite.ts +++ b/yarn-project/kv-store/src/interfaces/store_test_suite.ts @@ -32,21 +32,25 @@ export function describeAztecStore( expect(await get(forkedStore, forkedSingleton)).to.equal('bar'); await forkedSingleton.delete(); expect(await get(store, singleton)).to.equal('foo'); + await forkedStore.delete(); }; it('forks a persistent store', async () => { const store = await getPersistentStore(); await itForks(store); + await store.delete(); }); it('forks a persistent store with no path', async () => { const store = await getPersistentNoPathStore(); await itForks(store); + await store.delete(); }); it('forks an ephemeral store', async () => { const store = await getEphemeralStore(); await itForks(store); + await store.delete(); }); }); } diff --git a/yarn-project/kv-store/src/lmdb/counter.test.ts b/yarn-project/kv-store/src/lmdb/counter.test.ts index 7e1c8524cf9..12b748fb358 100644 --- a/yarn-project/kv-store/src/lmdb/counter.test.ts +++ b/yarn-project/kv-store/src/lmdb/counter.test.ts @@ -3,8 +3,11 @@ import { toArray } from '@aztec/foundation/iterable'; import { expect, use } from 'chai'; import chaiAsPromised from 'chai-as-promised'; +import fs from 'fs/promises'; import { type Database, open } from 'lmdb'; import forEach from 'mocha-each'; +import { tmpdir } from 'os'; +import path from 'path'; import { LmdbAztecCounter } from './counter.js'; @@ -12,9 +15,18 @@ use(chaiAsPromised); describe('LmdbAztecCounter', () => { let db: Database; + let dir: string; - beforeEach(() => { - db = open({} as any); + beforeEach(async () => { + dir = path.join(tmpdir(), randomBytes(8).toString('hex')); + await fs.mkdir(dir, { recursive: true }); + db = open({ path: dir } as any); + }); + + afterEach(async () => { + await db.drop(); + await db.close(); + await fs.rm(dir, { recursive: true, force: true }); }); forEach([ diff --git a/yarn-project/kv-store/src/lmdb/map.test.ts b/yarn-project/kv-store/src/lmdb/map.test.ts index 224750df8e9..2f78d4aca63 100644 --- a/yarn-project/kv-store/src/lmdb/map.test.ts +++ b/yarn-project/kv-store/src/lmdb/map.test.ts @@ -1,3 +1,6 @@ +import { expect } from 'chai'; + +import { type AztecMapWithSize, type AztecMultiMapWithSize } from '../interfaces/map.js'; import { describeAztecMap } from '../interfaces/map_test_suite.js'; import { openTmpStore } from './index.js'; @@ -6,3 +9,53 @@ describe('LMDBMap', () => { describeAztecMap('Async AztecMap', () => Promise.resolve(openTmpStore(true)), true); }); + +describe('AztecMultiMapWithSize', () => { + let map: AztecMultiMapWithSize; + let map2: AztecMultiMapWithSize; + + beforeEach(() => { + const store = openTmpStore(true); + map = store.openMultiMapWithSize('test'); + map2 = store.openMultiMapWithSize('test2'); + }); + + it('should be able to delete values', async () => { + await map.set('foo', 'bar'); + await map.set('foo', 'baz'); + + await map2.set('foo', 'bar'); + await map2.set('foo', 'baz'); + + expect(map.size()).to.equal(2); + expect(map2.size()).to.equal(2); + + await map.deleteValue('foo', 'bar'); + + expect(map.size()).to.equal(1); + expect(map.get('foo')).to.equal('baz'); + + expect(map2.size()).to.equal(2); + }); +}); + +describe('AztecMapWithSize', () => { + let map: AztecMapWithSize; + + beforeEach(() => { + const store = openTmpStore(true); + map = store.openMapWithSize('test'); + }); + + it('should be able to delete values', async () => { + await map.set('foo', 'bar'); + await map.set('fizz', 'buzz'); + + expect(map.size()).to.equal(2); + + await map.delete('foo'); + + expect(map.size()).to.equal(1); + expect(map.get('fizz')).to.equal('buzz'); + }); +}); diff --git a/yarn-project/kv-store/src/lmdb/map.ts b/yarn-project/kv-store/src/lmdb/map.ts index 38d87cf9c6b..4458c3c3539 100644 --- a/yarn-project/kv-store/src/lmdb/map.ts +++ b/yarn-project/kv-store/src/lmdb/map.ts @@ -1,7 +1,7 @@ import { type Database, type RangeOptions } from 'lmdb'; import { type Key, type Range } from '../interfaces/common.js'; -import { type AztecAsyncMultiMap, type AztecMultiMap } from '../interfaces/map.js'; +import { type AztecAsyncMultiMap, type AztecMapWithSize, type AztecMultiMap } from '../interfaces/map.js'; /** The slot where a key-value entry would be stored */ type MapValueSlot = ['map', string, 'slot', K]; @@ -13,8 +13,8 @@ export class LmdbAztecMap implements AztecMultiMap, Azte protected db: Database<[K, V], MapValueSlot>; protected name: string; - #startSentinel: MapValueSlot; - #endSentinel: MapValueSlot; + protected startSentinel: MapValueSlot; + protected endSentinel: MapValueSlot; constructor(rootDb: Database, mapName: string) { this.name = mapName; @@ -23,8 +23,8 @@ export class LmdbAztecMap implements AztecMultiMap, Azte // sentinels are used to define the start and end of the map // with LMDB's key encoding, no _primitive value_ can be "less than" an empty buffer or greater than Byte 255 // these will be used later to answer range queries - this.#startSentinel = ['map', this.name, 'slot', Buffer.from([])]; - this.#endSentinel = ['map', this.name, 'slot', Buffer.from([255])]; + this.startSentinel = ['map', this.name, 'slot', Buffer.from([])]; + this.endSentinel = ['map', this.name, 'slot', Buffer.from([255])]; } close(): Promise { @@ -32,7 +32,7 @@ export class LmdbAztecMap implements AztecMultiMap, Azte } get(key: K): V | undefined { - return this.db.get(this.#slot(key))?.[1]; + return this.db.get(this.slot(key))?.[1]; } getAsync(key: K): Promise { @@ -40,7 +40,7 @@ export class LmdbAztecMap implements AztecMultiMap, Azte } *getValues(key: K): IterableIterator { - const values = this.db.getValues(this.#slot(key)); + const values = this.db.getValues(this.slot(key)); for (const value of values) { yield value?.[1]; } @@ -53,7 +53,7 @@ export class LmdbAztecMap implements AztecMultiMap, Azte } has(key: K): boolean { - return this.db.doesExist(this.#slot(key)); + return this.db.doesExist(this.slot(key)); } hasAsync(key: K): Promise { @@ -61,30 +61,30 @@ export class LmdbAztecMap implements AztecMultiMap, Azte } async set(key: K, val: V): Promise { - await this.db.put(this.#slot(key), [key, val]); + await this.db.put(this.slot(key), [key, val]); } swap(key: K, fn: (val: V | undefined) => V): Promise { return this.db.childTransaction(() => { - const slot = this.#slot(key); + const slot = this.slot(key); const entry = this.db.get(slot); void this.db.put(slot, [key, fn(entry?.[1])]); }); } setIfNotExists(key: K, val: V): Promise { - const slot = this.#slot(key); + const slot = this.slot(key); return this.db.ifNoExists(slot, () => { void this.db.put(slot, [key, val]); }); } async delete(key: K): Promise { - await this.db.remove(this.#slot(key)); + await this.db.remove(this.slot(key)); } async deleteValue(key: K, val: V): Promise { - await this.db.remove(this.#slot(key), [key, val]); + await this.db.remove(this.slot(key), [key, val]); } *entries(range: Range = {}): IterableIterator<[K, V]> { @@ -93,19 +93,19 @@ export class LmdbAztecMap implements AztecMultiMap, Azte // in that case, we need to swap the start and end sentinels const start = reverse ? range.end - ? this.#slot(range.end) - : this.#endSentinel + ? this.slot(range.end) + : this.endSentinel : range.start - ? this.#slot(range.start) - : this.#startSentinel; + ? this.slot(range.start) + : this.startSentinel; const end = reverse ? range.start - ? this.#slot(range.start) - : this.#startSentinel + ? this.slot(range.start) + : this.startSentinel : range.end - ? this.#slot(range.end) - : this.#endSentinel; + ? this.slot(range.end) + : this.endSentinel; const lmdbRange: RangeOptions = { start, @@ -153,7 +153,82 @@ export class LmdbAztecMap implements AztecMultiMap, Azte } } - #slot(key: K): MapValueSlot { + protected slot(key: K): MapValueSlot { return ['map', this.name, 'slot', key]; } + + async clear(): Promise { + const lmdbRange: RangeOptions = { + start: this.startSentinel, + end: this.endSentinel, + }; + + const iterator = this.db.getRange(lmdbRange); + + for (const { key } of iterator) { + await this.db.remove(key); + } + } +} + +export class LmdbAztecMapWithSize + extends LmdbAztecMap + implements AztecMapWithSize, AztecAsyncMultiMap +{ + #sizeCache?: number; + + constructor(rootDb: Database, mapName: string) { + super(rootDb, mapName); + } + + override async set(key: K, val: V): Promise { + await this.db.childTransaction(() => { + const exists = this.db.doesExist(this.slot(key)); + this.db.putSync(this.slot(key), [key, val], { + appendDup: true, + }); + if (!exists) { + this.#sizeCache = undefined; // Invalidate cache + } + }); + } + + override async delete(key: K): Promise { + await this.db.childTransaction(async () => { + const exists = this.db.doesExist(this.slot(key)); + if (exists) { + await this.db.remove(this.slot(key)); + this.#sizeCache = undefined; // Invalidate cache + } + }); + } + + override async deleteValue(key: K, val: V): Promise { + await this.db.childTransaction(async () => { + const exists = this.db.doesExist(this.slot(key)); + if (exists) { + await this.db.remove(this.slot(key), [key, val]); + this.#sizeCache = undefined; // Invalidate cache + } + }); + } + + /** + * Gets the size of the map by counting entries. + * @returns The number of entries in the map + */ + size(): number { + if (this.#sizeCache === undefined) { + this.#sizeCache = this.db.getCount({ + start: this.startSentinel, + end: this.endSentinel, + }); + } + return this.#sizeCache; + } + + // Reset cache on clear/drop operations + clearCache() { + this.#sizeCache = undefined; + } } diff --git a/yarn-project/kv-store/src/lmdb/store.ts b/yarn-project/kv-store/src/lmdb/store.ts index ad66ec76691..d78030ec373 100644 --- a/yarn-project/kv-store/src/lmdb/store.ts +++ b/yarn-project/kv-store/src/lmdb/store.ts @@ -1,20 +1,28 @@ +import { randomBytes } from '@aztec/foundation/crypto'; import { createLogger } from '@aztec/foundation/log'; import { promises as fs, mkdirSync } from 'fs'; import { type Database, type RootDatabase, open } from 'lmdb'; import { tmpdir } from 'os'; -import { dirname, join } from 'path'; +import { join } from 'path'; import { type AztecArray, type AztecAsyncArray } from '../interfaces/array.js'; import { type Key } from '../interfaces/common.js'; import { type AztecAsyncCounter, type AztecCounter } from '../interfaces/counter.js'; -import { type AztecAsyncMap, type AztecAsyncMultiMap, type AztecMap, type AztecMultiMap } from '../interfaces/map.js'; +import { + type AztecAsyncMap, + type AztecAsyncMultiMap, + type AztecMap, + type AztecMapWithSize, + type AztecMultiMap, + type AztecMultiMapWithSize, +} from '../interfaces/map.js'; import { type AztecAsyncSet, type AztecSet } from '../interfaces/set.js'; import { type AztecAsyncSingleton, type AztecSingleton } from '../interfaces/singleton.js'; import { type AztecAsyncKVStore, type AztecKVStore } from '../interfaces/store.js'; import { LmdbAztecArray } from './array.js'; import { LmdbAztecCounter } from './counter.js'; -import { LmdbAztecMap } from './map.js'; +import { LmdbAztecMap, LmdbAztecMapWithSize } from './map.js'; import { LmdbAztecSet } from './set.js'; import { LmdbAztecSingleton } from './singleton.js'; @@ -29,7 +37,7 @@ export class AztecLmdbStore implements AztecKVStore, AztecAsyncKVStore { #multiMapData: Database; #log = createLogger('kv-store:lmdb'); - constructor(rootDb: RootDatabase, public readonly isEphemeral: boolean, private path?: string) { + constructor(rootDb: RootDatabase, public readonly isEphemeral: boolean, private path: string) { this.#rootDb = rootDb; // big bucket to store all the data @@ -64,13 +72,12 @@ export class AztecLmdbStore implements AztecKVStore, AztecAsyncKVStore { ephemeral: boolean = false, log = createLogger('kv-store:lmdb'), ): AztecLmdbStore { - if (path) { - mkdirSync(path, { recursive: true }); - } + const dbPath = path ?? join(tmpdir(), randomBytes(8).toString('hex')); + mkdirSync(dbPath, { recursive: true }); const mapSize = 1024 * mapSizeKb; log.debug(`Opening LMDB database at ${path || 'temporary location'} with map size ${mapSize}`); - const rootDb = open({ path, noSync: ephemeral, mapSize }); - return new AztecLmdbStore(rootDb, ephemeral, path); + const rootDb = open({ path: dbPath, noSync: ephemeral, mapSize }); + return new AztecLmdbStore(rootDb, ephemeral, dbPath); } /** @@ -78,10 +85,9 @@ export class AztecLmdbStore implements AztecKVStore, AztecAsyncKVStore { * @returns A new AztecLmdbStore. */ async fork() { - const baseDir = this.path ? dirname(this.path) : tmpdir(); + const baseDir = this.path; this.#log.debug(`Forking store with basedir ${baseDir}`); - const forkPath = - (await fs.mkdtemp(join(baseDir, 'aztec-store-fork-'))) + (this.isEphemeral || !this.path ? '/data.mdb' : ''); + const forkPath = await fs.mkdtemp(join(baseDir, 'aztec-store-fork-')); this.#log.verbose(`Forking store to ${forkPath}`); await this.#rootDb.backup(forkPath, false); const forkDb = open(forkPath, { noSync: this.isEphemeral }); @@ -119,6 +125,23 @@ export class AztecLmdbStore implements AztecKVStore, AztecAsyncKVStore { openCounter(name: string): AztecCounter & AztecAsyncCounter { return new LmdbAztecCounter(this.#data, name); } + /** + * Creates a new AztecMultiMapWithSize in the store. A multi-map with size stores multiple values for a single key automatically. + * @param name - Name of the map + * @returns A new AztecMultiMapWithSize + */ + openMultiMapWithSize(name: string): AztecMultiMapWithSize { + return new LmdbAztecMapWithSize(this.#multiMapData, name); + } + + /** + * Creates a new AztecMapWithSize in the store. + * @param name - Name of the map + * @returns A new AztecMapWithSize + */ + openMapWithSize(name: string): AztecMapWithSize { + return new LmdbAztecMapWithSize(this.#data, name); + } /** * Creates a new AztecArray in the store. diff --git a/yarn-project/kv-store/src/stores/l2_tips_store.test.ts b/yarn-project/kv-store/src/stores/l2_tips_store.test.ts index d9ec9845fc1..32010b33985 100644 --- a/yarn-project/kv-store/src/stores/l2_tips_store.test.ts +++ b/yarn-project/kv-store/src/stores/l2_tips_store.test.ts @@ -17,6 +17,10 @@ describe('L2TipsStore', () => { tipsStore = new L2TipsStore(kvStore, 'test'); }); + afterEach(async () => { + await kvStore.delete(); + }); + const makeBlock = (number: number): L2Block => ({ number, header: { hash: () => new Fr(number) } as BlockHeader } as L2Block); diff --git a/yarn-project/kv-store/src/stores/l2_tips_store.ts b/yarn-project/kv-store/src/stores/l2_tips_store.ts index 149f7be80b3..33c513097e5 100644 --- a/yarn-project/kv-store/src/stores/l2_tips_store.ts +++ b/yarn-project/kv-store/src/stores/l2_tips_store.ts @@ -47,10 +47,10 @@ export class L2TipsStore implements L2BlockStreamEventHandler, L2BlockStreamLoca public async handleBlockStreamEvent(event: L2BlockStreamEvent): Promise { switch (event.type) { case 'blocks-added': - await this.l2TipsStore.set('latest', event.blocks.at(-1)!.number); for (const block of event.blocks) { await this.l2BlockHashesStore.set(block.number, block.header.hash().toString()); } + await this.l2TipsStore.set('latest', event.blocks.at(-1)!.number); break; case 'chain-pruned': await this.l2TipsStore.set('latest', event.blockNumber); diff --git a/yarn-project/l1-artifacts/package.json b/yarn-project/l1-artifacts/package.json index 5bf298bbb3c..6963e95d3cd 100644 --- a/yarn-project/l1-artifacts/package.json +++ b/yarn-project/l1-artifacts/package.json @@ -3,6 +3,7 @@ "version": "0.1.0", "type": "module", "exports": { + "./*": "./dest/*.js", ".": "./dest/index.js" }, "typedocOptions": { diff --git a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh index 3b78a796f50..896467dfd05 100755 --- a/yarn-project/l1-artifacts/scripts/generate-artifacts.sh +++ b/yarn-project/l1-artifacts/scripts/generate-artifacts.sh @@ -32,6 +32,13 @@ CONTRACTS=( "l1-contracts:ExtRollupLib" ) +# Read the error ABI's once and store it in COMBINED_ERRORS variable +COMBINED_ERRORS=$(jq -s ' + .[0].abi + .[1].abi | + unique_by({type: .type, name: .name}) +' \ + ../../l1-contracts/out/Errors.sol/Errors.json \ + ../../l1-contracts/out/libraries/Errors.sol/Errors.json) # create target dir if it doesn't exist mkdir -p "$target_dir"; @@ -44,7 +51,14 @@ for E in "${CONTRACTS[@]}"; do CONTRACT_NAME="${ARR[1]}"; echo -ne "/**\n * $CONTRACT_NAME ABI.\n */\nexport const ${CONTRACT_NAME}Abi = " > "$target_dir/${CONTRACT_NAME}Abi.ts"; - jq -j '.abi' ../../$ROOT/out/$CONTRACT_NAME.sol/$CONTRACT_NAME.json >> "$target_dir/${CONTRACT_NAME}Abi.ts"; + + # Merge contract abi and errors abi while removing duplicates based on both type and name + # Just merging it into all, it is not the cleanest, but it does the job. + jq -j --argjson errors "$COMBINED_ERRORS" ' + .abi + $errors | + unique_by({type: .type, name: .name}) + ' ../../$ROOT/out/$CONTRACT_NAME.sol/$CONTRACT_NAME.json >> "$target_dir/${CONTRACT_NAME}Abi.ts"; + echo " as const;" >> "$target_dir/${CONTRACT_NAME}Abi.ts"; echo -ne "/**\n * $CONTRACT_NAME bytecode.\n */\nexport const ${CONTRACT_NAME}Bytecode = \"" > "$target_dir/${CONTRACT_NAME}Bytecode.ts"; diff --git a/yarn-project/noir-contracts.js/scripts/generate-types.sh b/yarn-project/noir-contracts.js/scripts/generate-types.sh index 26a7eb20560..fb380b01264 100755 --- a/yarn-project/noir-contracts.js/scripts/generate-types.sh +++ b/yarn-project/noir-contracts.js/scripts/generate-types.sh @@ -40,7 +40,10 @@ done node --no-warnings ../builder/dest/bin/cli.js codegen -o $OUT_DIR artifacts # Append exports for each generated TypeScript file to index.ts +echo "/** List of contract names exported by this package. */" >>"$INDEX" +echo "export const ContractNames = [" >>"$INDEX" find "$OUT_DIR" -maxdepth 1 -type f -name '*.ts' ! -name 'index.ts' | while read -r TS_FILE; do CONTRACT_NAME=$(basename "$TS_FILE" .ts) # Remove the .ts extension to get the contract name - echo "export * from './${CONTRACT_NAME}.js';" >>"$INDEX" + echo " '$CONTRACT_NAME'," >>"$INDEX" done +echo "];" >>"$INDEX" diff --git a/yarn-project/noir-protocol-circuits-types/package.json b/yarn-project/noir-protocol-circuits-types/package.json index 4168c9fc5ff..3a16ad9a69e 100644 --- a/yarn-project/noir-protocol-circuits-types/package.json +++ b/yarn-project/noir-protocol-circuits-types/package.json @@ -4,6 +4,7 @@ "type": "module", "exports": { ".": "./dest/index.js", + "./client": "./dest/client.js", "./types": "./dest/types/index.js" }, "inherits": [ @@ -67,6 +68,7 @@ "@aztec/circuits.js": "workspace:^", "@aztec/foundation": "workspace:^", "@aztec/types": "workspace:^", + "@iarna/toml": "^2.2.5", "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js", "@noir-lang/noir_codegen": "portal:../../noir/packages/noir_codegen", "@noir-lang/noir_js": "file:../../noir/packages/noir_js", @@ -91,7 +93,8 @@ "dest", "src", "!*.test.*", - "artifacts" + "artifacts", + "!src/scripts/*" ], "types": "./dest/index.d.ts", "engines": { diff --git a/yarn-project/noir-protocol-circuits-types/src/artifacts.ts b/yarn-project/noir-protocol-circuits-types/src/artifacts.ts deleted file mode 100644 index d0339d17050..00000000000 --- a/yarn-project/noir-protocol-circuits-types/src/artifacts.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { type NoirCompiledCircuit } from '@aztec/types/noir'; - -import EmptyNestedJson from '../artifacts/empty_nested.json' assert { type: 'json' }; -import EmptyNestedSimulatedJson from '../artifacts/empty_nested_simulated.json' assert { type: 'json' }; -import BaseParityJson from '../artifacts/parity_base.json' assert { type: 'json' }; -import RootParityJson from '../artifacts/parity_root.json' assert { type: 'json' }; -import PrivateKernelEmptyJson from '../artifacts/private_kernel_empty.json' assert { type: 'json' }; -import PrivateKernelEmptySimulatedJson from '../artifacts/private_kernel_empty_simulated.json' assert { type: 'json' }; -import PrivateKernelInitJson from '../artifacts/private_kernel_init.json' assert { type: 'json' }; -import PrivateKernelInitSimulatedJson from '../artifacts/private_kernel_init_simulated.json' assert { type: 'json' }; -import PrivateKernelInnerJson from '../artifacts/private_kernel_inner.json' assert { type: 'json' }; -import PrivateKernelInnerSimulatedJson from '../artifacts/private_kernel_inner_simulated.json' assert { type: 'json' }; -import PrivateKernelTailJson from '../artifacts/private_kernel_tail.json' assert { type: 'json' }; -import PrivateKernelTailSimulatedJson from '../artifacts/private_kernel_tail_simulated.json' assert { type: 'json' }; -import PrivateKernelTailToPublicJson from '../artifacts/private_kernel_tail_to_public.json' assert { type: 'json' }; -import PrivateKernelTailToPublicSimulatedJson from '../artifacts/private_kernel_tail_to_public_simulated.json' assert { type: 'json' }; -import PrivateBaseRollupJson from '../artifacts/rollup_base_private.json' assert { type: 'json' }; -import PrivateBaseRollupSimulatedJson from '../artifacts/rollup_base_private_simulated.json' assert { type: 'json' }; -import PublicBaseRollupJson from '../artifacts/rollup_base_public.json' assert { type: 'json' }; -import PublicBaseRollupSimulatedJson from '../artifacts/rollup_base_public_simulated.json' assert { type: 'json' }; -import BlockMergeRollupJson from '../artifacts/rollup_block_merge.json' assert { type: 'json' }; -import BlockRootRollupJson from '../artifacts/rollup_block_root.json' assert { type: 'json' }; -import EmptyBlockRootRollupJson from '../artifacts/rollup_block_root_empty.json' assert { type: 'json' }; -import MergeRollupJson from '../artifacts/rollup_merge.json' assert { type: 'json' }; -import RootRollupJson from '../artifacts/rollup_root.json' assert { type: 'json' }; -import { - PrivateKernelResetArtifacts, - PrivateKernelResetSimulatedArtifacts, - type PrivateResetArtifact, -} from './private_kernel_reset_data.js'; - -// These are all circuits that should generate proofs with the `recursive` flag. -export type ServerProtocolArtifact = - | 'EmptyNestedArtifact' - | 'PrivateKernelEmptyArtifact' - | 'BaseParityArtifact' - | 'RootParityArtifact' - | 'PrivateBaseRollupArtifact' - | 'PublicBaseRollupArtifact' - | 'MergeRollupArtifact' - | 'BlockRootRollupArtifact' - | 'EmptyBlockRootRollupArtifact' - | 'BlockMergeRollupArtifact' - | 'RootRollupArtifact'; - -export type ClientProtocolArtifact = - | 'PrivateKernelInitArtifact' - | 'PrivateKernelInnerArtifact' - | 'PrivateKernelTailArtifact' - | 'PrivateKernelTailToPublicArtifact' - | PrivateResetArtifact; - -export type ProtocolArtifact = ServerProtocolArtifact | ClientProtocolArtifact; - -export const ServerCircuitArtifacts: Record = { - EmptyNestedArtifact: EmptyNestedJson as NoirCompiledCircuit, - PrivateKernelEmptyArtifact: PrivateKernelEmptyJson as NoirCompiledCircuit, - BaseParityArtifact: BaseParityJson as NoirCompiledCircuit, - RootParityArtifact: RootParityJson as NoirCompiledCircuit, - PrivateBaseRollupArtifact: PrivateBaseRollupJson as NoirCompiledCircuit, - PublicBaseRollupArtifact: PublicBaseRollupJson as NoirCompiledCircuit, - MergeRollupArtifact: MergeRollupJson as NoirCompiledCircuit, - BlockRootRollupArtifact: BlockRootRollupJson as NoirCompiledCircuit, - EmptyBlockRootRollupArtifact: EmptyBlockRootRollupJson as NoirCompiledCircuit, - BlockMergeRollupArtifact: BlockMergeRollupJson as NoirCompiledCircuit, - RootRollupArtifact: RootRollupJson as NoirCompiledCircuit, -}; - -export const SimulatedServerCircuitArtifacts: Record = { - EmptyNestedArtifact: EmptyNestedSimulatedJson as NoirCompiledCircuit, - PrivateKernelEmptyArtifact: PrivateKernelEmptySimulatedJson as NoirCompiledCircuit, - BaseParityArtifact: BaseParityJson as NoirCompiledCircuit, - RootParityArtifact: RootParityJson as NoirCompiledCircuit, - PrivateBaseRollupArtifact: PrivateBaseRollupSimulatedJson as NoirCompiledCircuit, - PublicBaseRollupArtifact: PublicBaseRollupSimulatedJson as NoirCompiledCircuit, - MergeRollupArtifact: MergeRollupJson as NoirCompiledCircuit, - BlockRootRollupArtifact: BlockRootRollupJson as NoirCompiledCircuit, - EmptyBlockRootRollupArtifact: EmptyBlockRootRollupJson as NoirCompiledCircuit, - BlockMergeRollupArtifact: BlockMergeRollupJson as NoirCompiledCircuit, - RootRollupArtifact: RootRollupJson as NoirCompiledCircuit, -}; - -export const ClientCircuitArtifacts: Record = { - PrivateKernelInitArtifact: PrivateKernelInitJson as NoirCompiledCircuit, - PrivateKernelInnerArtifact: PrivateKernelInnerJson as NoirCompiledCircuit, - PrivateKernelTailArtifact: PrivateKernelTailJson as NoirCompiledCircuit, - PrivateKernelTailToPublicArtifact: PrivateKernelTailToPublicJson as NoirCompiledCircuit, - ...PrivateKernelResetArtifacts, -}; - -export const SimulatedClientCircuitArtifacts: Record = { - PrivateKernelInitArtifact: PrivateKernelInitSimulatedJson as NoirCompiledCircuit, - PrivateKernelInnerArtifact: PrivateKernelInnerSimulatedJson as NoirCompiledCircuit, - PrivateKernelTailArtifact: PrivateKernelTailSimulatedJson as NoirCompiledCircuit, - PrivateKernelTailToPublicArtifact: PrivateKernelTailToPublicSimulatedJson as NoirCompiledCircuit, - ...PrivateKernelResetSimulatedArtifacts, -}; - -export const ProtocolCircuitArtifacts: Record = { - ...ClientCircuitArtifacts, - ...ServerCircuitArtifacts, -}; diff --git a/yarn-project/noir-protocol-circuits-types/src/artifacts/client.ts b/yarn-project/noir-protocol-circuits-types/src/artifacts/client.ts new file mode 100644 index 00000000000..256ac0405dd --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/artifacts/client.ts @@ -0,0 +1,38 @@ +import { type NoirCompiledCircuit } from '@aztec/types/noir'; + +import PrivateKernelInitJson from '../../artifacts/private_kernel_init.json' assert { type: 'json' }; +import PrivateKernelInitSimulatedJson from '../../artifacts/private_kernel_init_simulated.json' assert { type: 'json' }; +import PrivateKernelInnerJson from '../../artifacts/private_kernel_inner.json' assert { type: 'json' }; +import PrivateKernelInnerSimulatedJson from '../../artifacts/private_kernel_inner_simulated.json' assert { type: 'json' }; +import PrivateKernelTailJson from '../../artifacts/private_kernel_tail.json' assert { type: 'json' }; +import PrivateKernelTailSimulatedJson from '../../artifacts/private_kernel_tail_simulated.json' assert { type: 'json' }; +import PrivateKernelTailToPublicJson from '../../artifacts/private_kernel_tail_to_public.json' assert { type: 'json' }; +import PrivateKernelTailToPublicSimulatedJson from '../../artifacts/private_kernel_tail_to_public_simulated.json' assert { type: 'json' }; +import { + PrivateKernelResetArtifacts, + PrivateKernelResetSimulatedArtifacts, + type PrivateResetArtifact, +} from '../private_kernel_reset_data.js'; + +export type ClientProtocolArtifact = + | 'PrivateKernelInitArtifact' + | 'PrivateKernelInnerArtifact' + | 'PrivateKernelTailArtifact' + | 'PrivateKernelTailToPublicArtifact' + | PrivateResetArtifact; + +export const ClientCircuitArtifacts: Record = { + PrivateKernelInitArtifact: PrivateKernelInitJson as NoirCompiledCircuit, + PrivateKernelInnerArtifact: PrivateKernelInnerJson as NoirCompiledCircuit, + PrivateKernelTailArtifact: PrivateKernelTailJson as NoirCompiledCircuit, + PrivateKernelTailToPublicArtifact: PrivateKernelTailToPublicJson as NoirCompiledCircuit, + ...PrivateKernelResetArtifacts, +}; + +export const SimulatedClientCircuitArtifacts: Record = { + PrivateKernelInitArtifact: PrivateKernelInitSimulatedJson as NoirCompiledCircuit, + PrivateKernelInnerArtifact: PrivateKernelInnerSimulatedJson as NoirCompiledCircuit, + PrivateKernelTailArtifact: PrivateKernelTailSimulatedJson as NoirCompiledCircuit, + PrivateKernelTailToPublicArtifact: PrivateKernelTailToPublicSimulatedJson as NoirCompiledCircuit, + ...PrivateKernelResetSimulatedArtifacts, +}; diff --git a/yarn-project/noir-protocol-circuits-types/src/artifacts/index.ts b/yarn-project/noir-protocol-circuits-types/src/artifacts/index.ts new file mode 100644 index 00000000000..acf23c28593 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/artifacts/index.ts @@ -0,0 +1,14 @@ +import { type NoirCompiledCircuit } from '@aztec/types/noir'; + +import { ClientCircuitArtifacts, type ClientProtocolArtifact } from './client.js'; +import { ServerCircuitArtifacts, type ServerProtocolArtifact } from './server.js'; + +export * from './client.js'; +export * from './server.js'; + +export type ProtocolArtifact = ServerProtocolArtifact | ClientProtocolArtifact; + +export const ProtocolCircuitArtifacts: Record = { + ...ClientCircuitArtifacts, + ...ServerCircuitArtifacts, +}; diff --git a/yarn-project/noir-protocol-circuits-types/src/artifacts/server.ts b/yarn-project/noir-protocol-circuits-types/src/artifacts/server.ts new file mode 100644 index 00000000000..4952f994f19 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/artifacts/server.ts @@ -0,0 +1,60 @@ +import { type NoirCompiledCircuit } from '@aztec/types/noir'; + +import EmptyNestedJson from '../../artifacts/empty_nested.json' assert { type: 'json' }; +import EmptyNestedSimulatedJson from '../../artifacts/empty_nested_simulated.json' assert { type: 'json' }; +import BaseParityJson from '../../artifacts/parity_base.json' assert { type: 'json' }; +import RootParityJson from '../../artifacts/parity_root.json' assert { type: 'json' }; +import PrivateKernelEmptyJson from '../../artifacts/private_kernel_empty.json' assert { type: 'json' }; +import PrivateKernelEmptySimulatedJson from '../../artifacts/private_kernel_empty_simulated.json' assert { type: 'json' }; +import PrivateBaseRollupJson from '../../artifacts/rollup_base_private.json' assert { type: 'json' }; +import PrivateBaseRollupSimulatedJson from '../../artifacts/rollup_base_private_simulated.json' assert { type: 'json' }; +import PublicBaseRollupJson from '../../artifacts/rollup_base_public.json' assert { type: 'json' }; +import PublicBaseRollupSimulatedJson from '../../artifacts/rollup_base_public_simulated.json' assert { type: 'json' }; +import BlockMergeRollupJson from '../../artifacts/rollup_block_merge.json' assert { type: 'json' }; +import BlockRootRollupJson from '../../artifacts/rollup_block_root.json' assert { type: 'json' }; +import EmptyBlockRootRollupJson from '../../artifacts/rollup_block_root_empty.json' assert { type: 'json' }; +import BlockRootRollupSimulatedJson from '../../artifacts/rollup_block_root_simulated.json' assert { type: 'json' }; +import MergeRollupJson from '../../artifacts/rollup_merge.json' assert { type: 'json' }; +import RootRollupJson from '../../artifacts/rollup_root.json' assert { type: 'json' }; + +// These are all circuits that should generate proofs with the `recursive` flag. +export type ServerProtocolArtifact = + | 'EmptyNestedArtifact' + | 'PrivateKernelEmptyArtifact' + | 'BaseParityArtifact' + | 'RootParityArtifact' + | 'PrivateBaseRollupArtifact' + | 'PublicBaseRollupArtifact' + | 'MergeRollupArtifact' + | 'BlockRootRollupArtifact' + | 'EmptyBlockRootRollupArtifact' + | 'BlockMergeRollupArtifact' + | 'RootRollupArtifact'; + +export const ServerCircuitArtifacts: Record = { + EmptyNestedArtifact: EmptyNestedJson as NoirCompiledCircuit, + PrivateKernelEmptyArtifact: PrivateKernelEmptyJson as NoirCompiledCircuit, + BaseParityArtifact: BaseParityJson as NoirCompiledCircuit, + RootParityArtifact: RootParityJson as NoirCompiledCircuit, + PrivateBaseRollupArtifact: PrivateBaseRollupJson as NoirCompiledCircuit, + PublicBaseRollupArtifact: PublicBaseRollupJson as NoirCompiledCircuit, + MergeRollupArtifact: MergeRollupJson as NoirCompiledCircuit, + BlockRootRollupArtifact: BlockRootRollupJson as NoirCompiledCircuit, + EmptyBlockRootRollupArtifact: EmptyBlockRootRollupJson as NoirCompiledCircuit, + BlockMergeRollupArtifact: BlockMergeRollupJson as NoirCompiledCircuit, + RootRollupArtifact: RootRollupJson as NoirCompiledCircuit, +}; + +export const SimulatedServerCircuitArtifacts: Record = { + EmptyNestedArtifact: EmptyNestedSimulatedJson as NoirCompiledCircuit, + PrivateKernelEmptyArtifact: PrivateKernelEmptySimulatedJson as NoirCompiledCircuit, + BaseParityArtifact: BaseParityJson as NoirCompiledCircuit, + RootParityArtifact: RootParityJson as NoirCompiledCircuit, + PrivateBaseRollupArtifact: PrivateBaseRollupSimulatedJson as NoirCompiledCircuit, + PublicBaseRollupArtifact: PublicBaseRollupSimulatedJson as NoirCompiledCircuit, + MergeRollupArtifact: MergeRollupJson as NoirCompiledCircuit, + BlockRootRollupArtifact: BlockRootRollupSimulatedJson as NoirCompiledCircuit, + EmptyBlockRootRollupArtifact: EmptyBlockRootRollupJson as NoirCompiledCircuit, + BlockMergeRollupArtifact: BlockMergeRollupJson as NoirCompiledCircuit, + RootRollupArtifact: RootRollupJson as NoirCompiledCircuit, +}; diff --git a/yarn-project/noir-protocol-circuits-types/src/client.ts b/yarn-project/noir-protocol-circuits-types/src/client.ts new file mode 100644 index 00000000000..db2b21ae601 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/client.ts @@ -0,0 +1,24 @@ +export { + convertPrivateKernelInitInputsToWitnessMap, + convertPrivateKernelInitOutputsFromWitnessMap, + convertPrivateKernelInnerInputsToWitnessMap, + convertPrivateKernelInnerOutputsFromWitnessMap, + convertPrivateKernelResetInputsToWitnessMap, + convertPrivateKernelResetOutputsFromWitnessMap, + convertPrivateKernelTailForPublicOutputsFromWitnessMap, + convertPrivateKernelTailInputsToWitnessMap, + convertPrivateKernelTailOutputsFromWitnessMap, + convertPrivateKernelTailToPublicInputsToWitnessMap, + executeInit, + executeInner, + executeReset, + executeTail, + executeTailForPublic, +} from './execution/client.js'; + +export { ClientCircuitArtifacts, type ClientProtocolArtifact } from './artifacts/client.js'; + +export { getPrivateKernelResetArtifactName } from './utils/private_kernel_reset.js'; +export { maxPrivateKernelResetDimensions, privateKernelResetDimensionsConfig } from './private_kernel_reset_data.js'; +export { foreignCallHandler } from './utils/foreign_call_handler.js'; +export { ClientCircuitVks, getVKIndex, getVKTreeRoot, getVKSiblingPath } from './vks.js'; diff --git a/yarn-project/noir-protocol-circuits-types/src/execution/client.ts b/yarn-project/noir-protocol-circuits-types/src/execution/client.ts new file mode 100644 index 00000000000..cfa768c1742 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/execution/client.ts @@ -0,0 +1,438 @@ +import { + type PrivateKernelCircuitPublicInputs, + type PrivateKernelInitCircuitPrivateInputs, + type PrivateKernelInnerCircuitPrivateInputs, + type PrivateKernelResetCircuitPrivateInputs, + type PrivateKernelResetCircuitPrivateInputsVariants, + type PrivateKernelResetDimensions, + type PrivateKernelTailCircuitPrivateInputs, + type PrivateKernelTailCircuitPublicInputs, +} from '@aztec/circuits.js'; + +import { type CompiledCircuit, type InputMap, Noir, type WitnessMap } from '@noir-lang/noir_js'; +import { type Abi, abiDecode, abiEncode } from '@noir-lang/noirc_abi'; + +import { ClientCircuitArtifacts, SimulatedClientCircuitArtifacts } from '../artifacts/client.js'; +import { type PrivateResetArtifact } from '../private_kernel_reset_data.js'; +import { + mapFieldToNoir, + mapPrivateCallDataToNoir, + mapPrivateCircuitPublicInputsToNoir, + mapPrivateKernelCircuitPublicInputsFromNoir, + mapPrivateKernelCircuitPublicInputsToNoir, + mapPrivateKernelDataToNoir, + mapPrivateKernelResetHintsToNoir, + mapPrivateKernelTailCircuitPublicInputsForPublicFromNoir, + mapPrivateKernelTailCircuitPublicInputsForRollupFromNoir, + mapTxRequestToNoir, +} from '../type_conversion.js'; +import { + type PrivateKernelInitReturnType, + type PrivateKernelInnerReturnType, + type PrivateKernelResetReturnType, + type PrivateKernelTailReturnType, + type PrivateKernelTailToPublicReturnType, + PrivateKernelInit as executePrivateKernelInitWithACVM, + PrivateKernelInner as executePrivateKernelInnerWithACVM, + PrivateKernelTailToPublic as executePrivateKernelTailToPublicWithACVM, + PrivateKernelTail as executePrivateKernelTailWithACVM, +} from '../types/index.js'; +import { type DecodedInputs } from '../utils/decoded_inputs.js'; +import { foreignCallHandler } from '../utils/foreign_call_handler.js'; +import { getPrivateKernelResetArtifactName } from '../utils/private_kernel_reset.js'; + +/* eslint-disable camelcase */ + +// Utility function with self-contained dynamic imports, so it can be stripped from browser bundles +// This is only ever used in testing, so it's safe to do so +/* testing-only-start */ +async function updateProtocolCircuitSampleInputs(circuitName: string, inputs: any) { + const { updateProtocolCircuitSampleInputs } = await import('@aztec/foundation/testing/files'); + const TOML = await import('@iarna/toml'); + updateProtocolCircuitSampleInputs(circuitName, TOML.stringify(inputs)); +} +/* testing-only-end */ + +/** + * Executes the init private kernel. + * @param privateKernelInitCircuitPrivateInputs - The private inputs to the initial private kernel. + * @returns The public inputs. + */ +export async function executeInit( + privateKernelInitCircuitPrivateInputs: PrivateKernelInitCircuitPrivateInputs, +): Promise { + const inputs = { + tx_request: mapTxRequestToNoir(privateKernelInitCircuitPrivateInputs.txRequest), + vk_tree_root: mapFieldToNoir(privateKernelInitCircuitPrivateInputs.vkTreeRoot), + protocol_contract_tree_root: mapFieldToNoir(privateKernelInitCircuitPrivateInputs.protocolContractTreeRoot), + private_call: mapPrivateCallDataToNoir(privateKernelInitCircuitPrivateInputs.privateCall), + is_private_only: privateKernelInitCircuitPrivateInputs.isPrivateOnly, + app_public_inputs: mapPrivateCircuitPublicInputsToNoir( + privateKernelInitCircuitPrivateInputs.privateCall.publicInputs, + ), + }; + + // Allow bundlers to remove this code + /* testing-only-start */ + await updateProtocolCircuitSampleInputs('private-kernel-init', inputs); + /* testing-only-end */ + + const returnType = await executePrivateKernelInitWithACVM( + inputs.tx_request, + inputs.vk_tree_root, + inputs.protocol_contract_tree_root, + inputs.private_call, + inputs.is_private_only, + inputs.app_public_inputs, + SimulatedClientCircuitArtifacts.PrivateKernelInitArtifact as CompiledCircuit, + foreignCallHandler, + ); + + return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); +} + +/** + * Executes the inner private kernel. + * @param privateKernelInnerCircuitPrivateInputs - The private inputs to the inner private kernel. + * @returns The public inputs. + */ +export async function executeInner( + privateKernelInnerCircuitPrivateInputs: PrivateKernelInnerCircuitPrivateInputs, +): Promise { + const inputs = { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelInnerCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelInnerCircuitPrivateInputs.previousKernel.publicInputs, + ), + private_call: mapPrivateCallDataToNoir(privateKernelInnerCircuitPrivateInputs.privateCall), + app_public_inputs: mapPrivateCircuitPublicInputsToNoir( + privateKernelInnerCircuitPrivateInputs.privateCall.publicInputs, + ), + }; + + // Allow bundlers to remove this code + /* testing-only-start */ + await updateProtocolCircuitSampleInputs('private-kernel-inner', inputs); + /* testing-only-end */ + + const returnType = await executePrivateKernelInnerWithACVM( + inputs.previous_kernel, + inputs.previous_kernel_public_inputs, + inputs.private_call, + inputs.app_public_inputs, + SimulatedClientCircuitArtifacts.PrivateKernelInnerArtifact as CompiledCircuit, + foreignCallHandler, + ); + + return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); +} + +/** + * Executes the inner private kernel. + * @param privateKernelResetCircuitPrivateInputs - The private inputs to the reset private kernel. + * @returns The public inputs. + */ +export async function executeReset< + NH_RR_PENDING extends number, + NH_RR_SETTLED extends number, + NLL_RR_PENDING extends number, + NLL_RR_SETTLED extends number, + KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_HINTS extends number, +>( + privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants< + NH_RR_PENDING, + NH_RR_SETTLED, + NLL_RR_PENDING, + NLL_RR_SETTLED, + KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_HINTS + >, + dimensions: PrivateKernelResetDimensions, + // TODO: This input is a hack so we can write full reset inputs to a Prover.toml. Ideally we remove it in favour of adding a test that runs a full reset. + untrimmedPrivateKernelResetCircuitPrivateInputs?: PrivateKernelResetCircuitPrivateInputs, +): Promise { + const artifact = SimulatedClientCircuitArtifacts[getPrivateKernelResetArtifactName(dimensions)]; + const program = new Noir(artifact as CompiledCircuit); + if (untrimmedPrivateKernelResetCircuitPrivateInputs) { + await updateResetCircuitSampleInputs(untrimmedPrivateKernelResetCircuitPrivateInputs); + } + const args: InputMap = { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelResetCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelResetCircuitPrivateInputs.previousKernel.publicInputs, + ), + hints: mapPrivateKernelResetHintsToNoir(privateKernelResetCircuitPrivateInputs.hints), + }; + const { returnValue } = await program.execute(args, foreignCallHandler); + return mapPrivateKernelCircuitPublicInputsFromNoir(returnValue as any); +} + +/** + * Executes the tail private kernel. + * @param privateKernelCircuitPrivateInputs - The private inputs to the tail private kernel. + * @returns The public inputs. + */ +export async function executeTail( + privateInputs: PrivateKernelTailCircuitPrivateInputs, +): Promise { + const inputs = { + previous_kernel: mapPrivateKernelDataToNoir(privateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir(privateInputs.previousKernel.publicInputs), + }; + + // Allow bundlers to remove this code + /* testing-only-start */ + await updateProtocolCircuitSampleInputs('private-kernel-tail', inputs); + /* testing-only-end */ + + const returnType = await executePrivateKernelTailWithACVM( + inputs.previous_kernel, + inputs.previous_kernel_public_inputs, + SimulatedClientCircuitArtifacts.PrivateKernelTailArtifact as CompiledCircuit, + foreignCallHandler, + ); + + return mapPrivateKernelTailCircuitPublicInputsForRollupFromNoir(returnType); +} + +/** + * Executes the tail private kernel. + * @param privateKernelInnerCircuitPrivateInputs - The private inputs to the tail private kernel. + * @returns The public inputs. + */ +export async function executeTailForPublic( + privateInputs: PrivateKernelTailCircuitPrivateInputs, +): Promise { + const inputs = { + previous_kernel: mapPrivateKernelDataToNoir(privateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir(privateInputs.previousKernel.publicInputs), + }; + + // Allow bundlers to remove this code + /* testing-only-start */ + await updateProtocolCircuitSampleInputs('private-kernel-tail-to-public', inputs); + /* testing-only-end */ + + const returnType = await executePrivateKernelTailToPublicWithACVM( + inputs.previous_kernel, + inputs.previous_kernel_public_inputs, + SimulatedClientCircuitArtifacts.PrivateKernelTailToPublicArtifact as CompiledCircuit, + foreignCallHandler, + ); + + return mapPrivateKernelTailCircuitPublicInputsForPublicFromNoir(returnType); +} + +/** + * Converts the inputs of the private kernel init circuit into a witness map + * @param inputs - The private kernel inputs. + * @returns The witness map + */ +export function convertPrivateKernelInitInputsToWitnessMap( + privateKernelInitCircuitPrivateInputs: PrivateKernelInitCircuitPrivateInputs, +): WitnessMap { + const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelInitArtifact.abi, { + tx_request: mapTxRequestToNoir(privateKernelInitCircuitPrivateInputs.txRequest), + vk_tree_root: mapFieldToNoir(privateKernelInitCircuitPrivateInputs.vkTreeRoot), + protocol_contract_tree_root: mapFieldToNoir(privateKernelInitCircuitPrivateInputs.protocolContractTreeRoot), + private_call: mapPrivateCallDataToNoir(privateKernelInitCircuitPrivateInputs.privateCall), + is_private_only: privateKernelInitCircuitPrivateInputs.isPrivateOnly, + app_public_inputs: mapPrivateCircuitPublicInputsToNoir( + privateKernelInitCircuitPrivateInputs.privateCall.publicInputs, + ), + }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the private kernel inner circuit into a witness map + * @param inputs - The private kernel inputs. + * @returns The witness map + */ +export function convertPrivateKernelInnerInputsToWitnessMap( + privateKernelInnerCircuitPrivateInputs: PrivateKernelInnerCircuitPrivateInputs, +): WitnessMap { + const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelInnerArtifact.abi, { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelInnerCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelInnerCircuitPrivateInputs.previousKernel.publicInputs, + ), + private_call: mapPrivateCallDataToNoir(privateKernelInnerCircuitPrivateInputs.privateCall), + app_public_inputs: mapPrivateCircuitPublicInputsToNoir( + privateKernelInnerCircuitPrivateInputs.privateCall.publicInputs, + ), + }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the private kernel reset circuit into a witness map + * @param inputs - The private kernel inputs. + * @returns The witness map + */ +export function convertPrivateKernelResetInputsToWitnessMap< + NH_RR_PENDING extends number, + NH_RR_SETTLED extends number, + NLL_RR_PENDING extends number, + NLL_RR_SETTLED extends number, + KEY_VALIDATION_REQUESTS extends number, + NUM_TRANSIENT_DATA_HINTS extends number, +>( + privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants< + NH_RR_PENDING, + NH_RR_SETTLED, + NLL_RR_PENDING, + NLL_RR_SETTLED, + KEY_VALIDATION_REQUESTS, + NUM_TRANSIENT_DATA_HINTS + >, + artifactName: PrivateResetArtifact, +): WitnessMap { + const args: InputMap = { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelResetCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelResetCircuitPrivateInputs.previousKernel.publicInputs, + ), + hints: mapPrivateKernelResetHintsToNoir(privateKernelResetCircuitPrivateInputs.hints), + }; + const artifact = ClientCircuitArtifacts[artifactName]; + const initialWitnessMap = abiEncode(artifact.abi as Abi, args); + return initialWitnessMap; +} + +/** + * Converts the inputs of the private kernel tail circuit into a witness map + * @param inputs - The private kernel inputs. + * @returns The witness map + */ +export function convertPrivateKernelTailInputsToWitnessMap( + privateKernelTailCircuitPrivateInputs: PrivateKernelTailCircuitPrivateInputs, +): WitnessMap { + const args: InputMap = { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelTailCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelTailCircuitPrivateInputs.previousKernel.publicInputs, + ), + }; + const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelTailArtifact.abi, args); + return initialWitnessMap; +} + +/** + * Converts the inputs of the private kernel tail to public circuit into a witness map + * @param inputs - The private kernel inputs. + * @returns The witness map + */ +export function convertPrivateKernelTailToPublicInputsToWitnessMap( + privateKernelTailToPublicCircuitPrivateInputs: PrivateKernelTailCircuitPrivateInputs, +): WitnessMap { + const args: InputMap = { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelTailToPublicCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelTailToPublicCircuitPrivateInputs.previousKernel.publicInputs, + ), + }; + const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelTailToPublicArtifact.abi, args); + return initialWitnessMap; +} + +/** + * Converts the outputs of the private kernel init circuit from a witness map. + * @param outputs - The private kernel outputs as a witness map. + * @returns The public inputs. + */ +export function convertPrivateKernelInitOutputsFromWitnessMap(outputs: WitnessMap): PrivateKernelCircuitPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelInitArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as PrivateKernelInitReturnType; + + return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the private kernel inner circuit from a witness map. + * @param outputs - The private kernel outputs as a witness map. + * @returns The public inputs. + */ +export function convertPrivateKernelInnerOutputsFromWitnessMap(outputs: WitnessMap): PrivateKernelCircuitPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelInnerArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as PrivateKernelInnerReturnType; + + return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the private kernel reset circuit from a witness map. + * @param outputs - The private kernel outputs as a witness map. + * @returns The public inputs. + */ +export function convertPrivateKernelResetOutputsFromWitnessMap( + outputs: WitnessMap, + artifactName: PrivateResetArtifact, +): PrivateKernelCircuitPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const artifact = ClientCircuitArtifacts[artifactName]; + const decodedInputs: DecodedInputs = abiDecode(artifact.abi as Abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as PrivateKernelResetReturnType; + + return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the private kernel tail circuit from a witness map. + * @param outputs - The private kernel outputs as a witness map. + * @returns The public inputs. + */ +export function convertPrivateKernelTailOutputsFromWitnessMap( + outputs: WitnessMap, +): PrivateKernelTailCircuitPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelTailArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as PrivateKernelTailReturnType; + + return mapPrivateKernelTailCircuitPublicInputsForRollupFromNoir(returnType); +} + +/** + * Converts the outputs of the private kernel tail for public circuit from a witness map. + * @param outputs - The private kernel outputs as a witness map. + * @returns The public inputs. + */ +export function convertPrivateKernelTailForPublicOutputsFromWitnessMap( + outputs: WitnessMap, +): PrivateKernelTailCircuitPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelTailToPublicArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as PrivateKernelTailToPublicReturnType; + + return mapPrivateKernelTailCircuitPublicInputsForPublicFromNoir(returnType); +} + +async function updateResetCircuitSampleInputs( + privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputs, +) { + const inputs = { + previous_kernel: mapPrivateKernelDataToNoir(privateKernelResetCircuitPrivateInputs.previousKernel), + previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( + privateKernelResetCircuitPrivateInputs.previousKernel.publicInputs, + ), + hints: mapPrivateKernelResetHintsToNoir(privateKernelResetCircuitPrivateInputs.hints), + }; + + // Allow bundlers to remove this code + /* testing-only-start */ + await updateProtocolCircuitSampleInputs('private-kernel-reset', inputs); + /* testing-only-end */ +} diff --git a/yarn-project/noir-protocol-circuits-types/src/execution/index.ts b/yarn-project/noir-protocol-circuits-types/src/execution/index.ts new file mode 100644 index 00000000000..9ab6d0fec4c --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/execution/index.ts @@ -0,0 +1,2 @@ +export * from './client.js'; +export * from './server.js'; diff --git a/yarn-project/noir-protocol-circuits-types/src/execution/server.ts b/yarn-project/noir-protocol-circuits-types/src/execution/server.ts new file mode 100644 index 00000000000..5396265eea0 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/execution/server.ts @@ -0,0 +1,397 @@ +import { + type BaseOrMergeRollupPublicInputs, + type BaseParityInputs, + type BlockMergeRollupInputs, + type BlockRootOrBlockMergePublicInputs, + type BlockRootRollupInputs, + type EmptyBlockRootRollupInputs, + type KernelCircuitPublicInputs, + type MergeRollupInputs, + type ParityPublicInputs, + type PrivateBaseRollupInputs, + type PrivateKernelEmptyInputs, + type PublicBaseRollupInputs, + type RootParityInputs, + type RootRollupInputs, + type RootRollupPublicInputs, +} from '@aztec/circuits.js'; +import { updateProtocolCircuitSampleInputs } from '@aztec/foundation/testing/files'; + +import TOML from '@iarna/toml'; +import { type WitnessMap } from '@noir-lang/acvm_js'; +import { abiDecode, abiEncode } from '@noir-lang/noirc_abi'; + +import { ServerCircuitArtifacts, SimulatedServerCircuitArtifacts } from '../artifacts/server.js'; +import { + mapBaseOrMergeRollupPublicInputsFromNoir, + mapBaseParityInputsToNoir, + mapBlockMergeRollupInputsToNoir, + mapBlockRootOrBlockMergePublicInputsFromNoir, + mapBlockRootRollupInputsToNoir, + mapEmptyBlockRootRollupInputsToNoir, + mapEmptyKernelInputsToNoir, + mapKernelCircuitPublicInputsFromNoir, + mapMergeRollupInputsToNoir, + mapParityPublicInputsFromNoir, + mapPrivateBaseRollupInputsToNoir, + mapPublicBaseRollupInputsToNoir, + mapRootParityInputsToNoir, + mapRootRollupInputsToNoir, + mapRootRollupPublicInputsFromNoir, +} from '../type_conversion.js'; +import { + type ParityBaseReturnType, + type ParityRootReturnType, + type PrivateKernelEmptyReturnType, + type RollupBasePrivateReturnType, + type RollupBasePublicReturnType, + type RollupBlockMergeReturnType, + type RollupBlockRootEmptyReturnType, + type RollupBlockRootReturnType, + type RollupMergeReturnType, + type RollupRootReturnType, +} from '../types/index.js'; +import { type DecodedInputs } from '../utils/decoded_inputs.js'; + +/** + * Converts the inputs of the base parity circuit into a witness map. + * @param inputs - The base parity inputs. + * @returns The witness map + */ +export function convertBaseParityInputsToWitnessMap(inputs: BaseParityInputs): WitnessMap { + const mapped = mapBaseParityInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.BaseParityArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the root parity circuit into a witness map. + * @param inputs - The root parity inputs. + * @returns The witness map + */ +export function convertRootParityInputsToWitnessMap(inputs: RootParityInputs): WitnessMap { + const mapped = mapRootParityInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.RootParityArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +export function convertPrivateKernelEmptyInputsToWitnessMap(inputs: PrivateKernelEmptyInputs): WitnessMap { + const mapped = mapEmptyKernelInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.PrivateKernelEmptyArtifact.abi, { input: mapped as any }); + return initialWitnessMap; +} + +export function convertPrivateBaseRollupInputsToWitnessMap(inputs: PrivateBaseRollupInputs): WitnessMap { + const mapped = mapPrivateBaseRollupInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +export function convertSimulatedPrivateBaseRollupInputsToWitnessMap(inputs: PrivateBaseRollupInputs): WitnessMap { + const mapped = mapPrivateBaseRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-base-private', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(SimulatedServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, { + inputs: mapped as any, + }); + return initialWitnessMap; +} + +export function convertPublicBaseRollupInputsToWitnessMap(inputs: PublicBaseRollupInputs): WitnessMap { + const mapped = mapPublicBaseRollupInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.PublicBaseRollupArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +export function convertSimulatedPublicBaseRollupInputsToWitnessMap(inputs: PublicBaseRollupInputs): WitnessMap { + const mapped = mapPublicBaseRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-base-public', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(SimulatedServerCircuitArtifacts.PublicBaseRollupArtifact.abi, { + inputs: mapped as any, + }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the merge rollup circuit into a witness map. + * @param inputs - The merge rollup inputs. + * @returns The witness map + */ +export function convertMergeRollupInputsToWitnessMap(inputs: MergeRollupInputs): WitnessMap { + const mapped = mapMergeRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-merge', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.MergeRollupArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the block root rollup circuit into a witness map. + * @param inputs - The block root rollup inputs. + * @returns The witness map + */ +export function convertBlockRootRollupInputsToWitnessMap(inputs: BlockRootRollupInputs): WitnessMap { + const mapped = mapBlockRootRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-block-root', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.BlockRootRollupArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the simulated block root rollup circuit into a witness map. + * @param inputs - The block root rollup inputs. + * @returns The witness map + */ +export function convertSimulatedBlockRootRollupInputsToWitnessMap(inputs: BlockRootRollupInputs): WitnessMap { + const mapped = mapBlockRootRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-block-root', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(SimulatedServerCircuitArtifacts.BlockRootRollupArtifact.abi, { + inputs: mapped as any, + }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the empty block root rollup circuit into a witness map. + * @param inputs - The empty block root rollup inputs. + * @returns The witness map + */ +export function convertEmptyBlockRootRollupInputsToWitnessMap(inputs: EmptyBlockRootRollupInputs): WitnessMap { + const mapped = mapEmptyBlockRootRollupInputsToNoir(inputs); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.EmptyBlockRootRollupArtifact.abi, { + inputs: mapped as any, + }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the block merge rollup circuit into a witness map. + * @param inputs - The block merge rollup inputs. + * @returns The witness map + */ +export function convertBlockMergeRollupInputsToWitnessMap(inputs: BlockMergeRollupInputs): WitnessMap { + const mapped = mapBlockMergeRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-block-merge', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.BlockMergeRollupArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +/** + * Converts the inputs of the root rollup circuit into a witness map. + * @param inputs - The root rollup inputs. + * @returns The witness map + */ +export function convertRootRollupInputsToWitnessMap(inputs: RootRollupInputs): WitnessMap { + const mapped = mapRootRollupInputsToNoir(inputs); + updateProtocolCircuitSampleInputs('rollup-root', TOML.stringify({ inputs: mapped })); + const initialWitnessMap = abiEncode(ServerCircuitArtifacts.RootRollupArtifact.abi, { inputs: mapped as any }); + return initialWitnessMap; +} + +export function convertPrivateKernelEmptyOutputsFromWitnessMap(outputs: WitnessMap): KernelCircuitPublicInputs { + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.PrivateKernelEmptyArtifact.abi, outputs); + const returnType = decodedInputs.return_value as PrivateKernelEmptyReturnType; + + return mapKernelCircuitPublicInputsFromNoir(returnType); +} + +export function convertSimulatedPrivateKernelEmptyOutputsFromWitnessMap( + outputs: WitnessMap, +): KernelCircuitPublicInputs { + const decodedInputs: DecodedInputs = abiDecode( + SimulatedServerCircuitArtifacts.PrivateKernelEmptyArtifact.abi, + outputs, + ); + const returnType = decodedInputs.return_value as PrivateKernelEmptyReturnType; + + return mapKernelCircuitPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the simulated base rollup circuit from a witness map. + * @param outputs - The base rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertSimulatedPrivateBaseRollupOutputsFromWitnessMap( + outputs: WitnessMap, +): BaseOrMergeRollupPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode( + SimulatedServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, + outputs, + ); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBasePrivateReturnType; + + return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the base rollup circuit from a witness map. + * @param outputs - The base rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertPrivateBaseRollupOutputsFromWitnessMap(outputs: WitnessMap): BaseOrMergeRollupPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBasePrivateReturnType; + + return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the simulated base rollup circuit from a witness map. + * @param outputs - The base rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertSimulatedPublicBaseRollupOutputsFromWitnessMap( + outputs: WitnessMap, +): BaseOrMergeRollupPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(SimulatedServerCircuitArtifacts.PublicBaseRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBasePublicReturnType; + + return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the base rollup circuit from a witness map. + * @param outputs - The base rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertPublicBaseRollupOutputsFromWitnessMap(outputs: WitnessMap): BaseOrMergeRollupPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.PublicBaseRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBasePublicReturnType; + + return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the merge rollup circuit from a witness map. + * @param outputs - The merge rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertMergeRollupOutputsFromWitnessMap(outputs: WitnessMap): BaseOrMergeRollupPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.MergeRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupMergeReturnType; + + return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the empty block root rollup circuit from a witness map. + * @param outputs - The block root rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertEmptyBlockRootRollupOutputsFromWitnessMap( + outputs: WitnessMap, +): BlockRootOrBlockMergePublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.EmptyBlockRootRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBlockRootEmptyReturnType; + + return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the simulated block root rollup circuit from a witness map. + * @param outputs - The block root rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertSimulatedBlockRootRollupOutputsFromWitnessMap( + outputs: WitnessMap, +): BlockRootOrBlockMergePublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(SimulatedServerCircuitArtifacts.BlockRootRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBlockRootReturnType; + + return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the block root rollup circuit from a witness map. + * @param outputs - The block root rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertBlockRootRollupOutputsFromWitnessMap(outputs: WitnessMap): BlockRootOrBlockMergePublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.BlockRootRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBlockRootReturnType; + + return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the block merge rollup circuit from a witness map. + * @param outputs - The block merge rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertBlockMergeRollupOutputsFromWitnessMap(outputs: WitnessMap): BlockRootOrBlockMergePublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.BlockMergeRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupBlockMergeReturnType; + + return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the root rollup circuit from a witness map. + * @param outputs - The root rollup outputs as a witness map. + * @returns The public inputs. + */ +export function convertRootRollupOutputsFromWitnessMap(outputs: WitnessMap): RootRollupPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.RootRollupArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as RollupRootReturnType; + + return mapRootRollupPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the base parity circuit from a witness map. + * @param outputs - The base parity outputs as a witness map. + * @returns The public inputs. + */ +export function convertBaseParityOutputsFromWitnessMap(outputs: WitnessMap): ParityPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.BaseParityArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as ParityBaseReturnType; + + return mapParityPublicInputsFromNoir(returnType); +} + +/** + * Converts the outputs of the root parity circuit from a witness map. + * @param outputs - The root parity outputs as a witness map. + * @returns The public inputs. + */ +export function convertRootParityOutputsFromWitnessMap(outputs: WitnessMap): ParityPublicInputs { + // Decode the witness map into two fields, the return values and the inputs + const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.RootParityArtifact.abi, outputs); + + // Cast the inputs as the return type + const returnType = decodedInputs.return_value as ParityRootReturnType; + + return mapParityPublicInputsFromNoir(returnType); +} diff --git a/yarn-project/noir-protocol-circuits-types/src/index.ts b/yarn-project/noir-protocol-circuits-types/src/index.ts index 33a6adc74e6..22bb7a5a041 100644 --- a/yarn-project/noir-protocol-circuits-types/src/index.ts +++ b/yarn-project/noir-protocol-circuits-types/src/index.ts @@ -1,746 +1,7 @@ -import { - type BaseOrMergeRollupPublicInputs, - type BaseParityInputs, - type BlockMergeRollupInputs, - type BlockRootOrBlockMergePublicInputs, - type BlockRootRollupInputs, - type EmptyBlockRootRollupInputs, - Fr, - type KernelCircuitPublicInputs, - type MergeRollupInputs, - type ParityPublicInputs, - type PrivateBaseRollupInputs, - type PrivateKernelCircuitPublicInputs, - type PrivateKernelEmptyInputs, - type PrivateKernelInitCircuitPrivateInputs, - type PrivateKernelInnerCircuitPrivateInputs, - type PrivateKernelResetCircuitPrivateInputsVariants, - type PrivateKernelResetDimensions, - type PrivateKernelTailCircuitPrivateInputs, - type PrivateKernelTailCircuitPublicInputs, - type PublicBaseRollupInputs, - type RootParityInputs, - type RootRollupInputs, - type RootRollupPublicInputs, -} from '@aztec/circuits.js'; -import { applyStringFormatting, createLogger } from '@aztec/foundation/log'; +export * from './artifacts/index.js'; +export * from './execution/index.js'; -import { type ForeignCallInput, type ForeignCallOutput } from '@noir-lang/acvm_js'; -import { type CompiledCircuit, type InputMap, Noir } from '@noir-lang/noir_js'; -import { type Abi, abiDecode, abiEncode } from '@noir-lang/noirc_abi'; -import { type WitnessMap } from '@noir-lang/types'; -import { strict as assert } from 'assert'; - -import { - ClientCircuitArtifacts, - ServerCircuitArtifacts, - SimulatedClientCircuitArtifacts, - SimulatedServerCircuitArtifacts, -} from './artifacts.js'; -import { type PrivateResetArtifact } from './private_kernel_reset_data.js'; -import { - mapBaseOrMergeRollupPublicInputsFromNoir, - mapBaseParityInputsToNoir, - mapBlockMergeRollupInputsToNoir, - mapBlockRootOrBlockMergePublicInputsFromNoir, - mapBlockRootRollupInputsToNoir, - mapEmptyBlockRootRollupInputsToNoir, - mapEmptyKernelInputsToNoir, - mapFieldToNoir, - mapKernelCircuitPublicInputsFromNoir, - mapMergeRollupInputsToNoir, - mapParityPublicInputsFromNoir, - mapPrivateBaseRollupInputsToNoir, - mapPrivateCallDataToNoir, - mapPrivateCircuitPublicInputsToNoir, - mapPrivateKernelCircuitPublicInputsFromNoir, - mapPrivateKernelCircuitPublicInputsToNoir, - mapPrivateKernelDataToNoir, - mapPrivateKernelResetHintsToNoir, - mapPrivateKernelTailCircuitPublicInputsForPublicFromNoir, - mapPrivateKernelTailCircuitPublicInputsForRollupFromNoir, - mapPublicBaseRollupInputsToNoir, - mapRootParityInputsToNoir, - mapRootRollupInputsToNoir, - mapRootRollupPublicInputsFromNoir, - mapTxRequestToNoir, -} from './type_conversion.js'; -import { - type ParityBaseReturnType, - type ParityRootReturnType, - type PrivateKernelEmptyReturnType, - type PrivateKernelInitReturnType, - type PrivateKernelInnerReturnType, - type PrivateKernelResetReturnType, - type PrivateKernelTailReturnType, - type PrivateKernelTailToPublicReturnType, - type RollupBasePrivateReturnType, - type RollupBasePublicReturnType, - type RollupBlockMergeReturnType, - type RollupBlockRootEmptyReturnType, - type RollupBlockRootReturnType, - type RollupMergeReturnType, - type RollupRootReturnType, - PrivateKernelInit as executePrivateKernelInitWithACVM, - PrivateKernelInner as executePrivateKernelInnerWithACVM, - PrivateKernelTailToPublic as executePrivateKernelTailToPublicWithACVM, - PrivateKernelTail as executePrivateKernelTailWithACVM, -} from './types/index.js'; -import { getPrivateKernelResetArtifactName } from './utils/private_kernel_reset.js'; - -export * from './artifacts.js'; +export { getPrivateKernelResetArtifactName } from './utils/private_kernel_reset.js'; export { maxPrivateKernelResetDimensions, privateKernelResetDimensionsConfig } from './private_kernel_reset_data.js'; -export * from './utils/private_kernel_reset.js'; +export { foreignCallHandler } from './utils/foreign_call_handler.js'; export * from './vks.js'; - -/* eslint-disable camelcase */ - -// TODO(Tom): This should be exported from noirc_abi -/** - * The decoded inputs from the circuit. - */ -export type DecodedInputs = { - /** - * The inputs to the circuit - */ - inputs: Record; - /** - * The return value of the circuit - */ - return_value: any; -}; - -/** - * Executes the init private kernel. - * @param privateKernelInitCircuitPrivateInputs - The private inputs to the initial private kernel. - * @returns The public inputs. - */ -export async function executeInit( - privateKernelInitCircuitPrivateInputs: PrivateKernelInitCircuitPrivateInputs, -): Promise { - const returnType = await executePrivateKernelInitWithACVM( - mapTxRequestToNoir(privateKernelInitCircuitPrivateInputs.txRequest), - mapFieldToNoir(privateKernelInitCircuitPrivateInputs.vkTreeRoot), - mapFieldToNoir(privateKernelInitCircuitPrivateInputs.protocolContractTreeRoot), - mapPrivateCallDataToNoir(privateKernelInitCircuitPrivateInputs.privateCall), - mapPrivateCircuitPublicInputsToNoir(privateKernelInitCircuitPrivateInputs.privateCall.publicInputs), - SimulatedClientCircuitArtifacts.PrivateKernelInitArtifact as CompiledCircuit, - foreignCallHandler, - ); - - return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); -} - -/** - * Executes the inner private kernel. - * @param privateKernelInnerCircuitPrivateInputs - The private inputs to the inner private kernel. - * @returns The public inputs. - */ -export async function executeInner( - privateKernelInnerCircuitPrivateInputs: PrivateKernelInnerCircuitPrivateInputs, -): Promise { - const returnType = await executePrivateKernelInnerWithACVM( - mapPrivateKernelDataToNoir(privateKernelInnerCircuitPrivateInputs.previousKernel), - mapPrivateKernelCircuitPublicInputsToNoir(privateKernelInnerCircuitPrivateInputs.previousKernel.publicInputs), - mapPrivateCallDataToNoir(privateKernelInnerCircuitPrivateInputs.privateCall), - mapPrivateCircuitPublicInputsToNoir(privateKernelInnerCircuitPrivateInputs.privateCall.publicInputs), - SimulatedClientCircuitArtifacts.PrivateKernelInnerArtifact as CompiledCircuit, - foreignCallHandler, - ); - - return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); -} - -/** - * Executes the inner private kernel. - * @param privateKernelResetCircuitPrivateInputs - The private inputs to the reset private kernel. - * @returns The public inputs. - */ -export async function executeReset< - NH_RR_PENDING extends number, - NH_RR_SETTLED extends number, - NLL_RR_PENDING extends number, - NLL_RR_SETTLED extends number, - KEY_VALIDATION_REQUESTS extends number, - NUM_TRANSIENT_DATA_HINTS extends number, ->( - privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants< - NH_RR_PENDING, - NH_RR_SETTLED, - NLL_RR_PENDING, - NLL_RR_SETTLED, - KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_HINTS - >, - dimensions: PrivateKernelResetDimensions, -): Promise { - const artifact = SimulatedClientCircuitArtifacts[getPrivateKernelResetArtifactName(dimensions)]; - const program = new Noir(artifact as CompiledCircuit); - const args: InputMap = { - previous_kernel: mapPrivateKernelDataToNoir(privateKernelResetCircuitPrivateInputs.previousKernel), - previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( - privateKernelResetCircuitPrivateInputs.previousKernel.publicInputs, - ), - hints: mapPrivateKernelResetHintsToNoir(privateKernelResetCircuitPrivateInputs.hints), - }; - const { returnValue } = await program.execute(args, foreignCallHandler); - return mapPrivateKernelCircuitPublicInputsFromNoir(returnValue as any); -} - -/** - * Executes the tail private kernel. - * @param privateKernelCircuitPrivateInputs - The private inputs to the tail private kernel. - * @returns The public inputs. - */ -export async function executeTail( - privateInputs: PrivateKernelTailCircuitPrivateInputs, -): Promise { - const returnType = await executePrivateKernelTailWithACVM( - mapPrivateKernelDataToNoir(privateInputs.previousKernel), - mapPrivateKernelCircuitPublicInputsToNoir(privateInputs.previousKernel.publicInputs), - SimulatedClientCircuitArtifacts.PrivateKernelTailArtifact as CompiledCircuit, - foreignCallHandler, - ); - - return mapPrivateKernelTailCircuitPublicInputsForRollupFromNoir(returnType); -} - -/** - * Executes the tail private kernel. - * @param privateKernelInnerCircuitPrivateInputs - The private inputs to the tail private kernel. - * @returns The public inputs. - */ -export async function executeTailForPublic( - privateInputs: PrivateKernelTailCircuitPrivateInputs, -): Promise { - const returnType = await executePrivateKernelTailToPublicWithACVM( - mapPrivateKernelDataToNoir(privateInputs.previousKernel), - mapPrivateKernelCircuitPublicInputsToNoir(privateInputs.previousKernel.publicInputs), - SimulatedClientCircuitArtifacts.PrivateKernelTailToPublicArtifact as CompiledCircuit, - foreignCallHandler, - ); - - return mapPrivateKernelTailCircuitPublicInputsForPublicFromNoir(returnType); -} - -/** - * Converts the inputs of the private kernel init circuit into a witness map - * @param inputs - The private kernel inputs. - * @returns The witness map - */ -export function convertPrivateKernelInitInputsToWitnessMap( - privateKernelInitCircuitPrivateInputs: PrivateKernelInitCircuitPrivateInputs, -): WitnessMap { - const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelInitArtifact.abi, { - tx_request: mapTxRequestToNoir(privateKernelInitCircuitPrivateInputs.txRequest), - vk_tree_root: mapFieldToNoir(privateKernelInitCircuitPrivateInputs.vkTreeRoot), - protocol_contract_tree_root: mapFieldToNoir(privateKernelInitCircuitPrivateInputs.protocolContractTreeRoot), - private_call: mapPrivateCallDataToNoir(privateKernelInitCircuitPrivateInputs.privateCall), - app_public_inputs: mapPrivateCircuitPublicInputsToNoir( - privateKernelInitCircuitPrivateInputs.privateCall.publicInputs, - ), - }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the private kernel inner circuit into a witness map - * @param inputs - The private kernel inputs. - * @returns The witness map - */ -export function convertPrivateKernelInnerInputsToWitnessMap( - privateKernelInnerCircuitPrivateInputs: PrivateKernelInnerCircuitPrivateInputs, -): WitnessMap { - const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelInnerArtifact.abi, { - previous_kernel: mapPrivateKernelDataToNoir(privateKernelInnerCircuitPrivateInputs.previousKernel), - previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( - privateKernelInnerCircuitPrivateInputs.previousKernel.publicInputs, - ), - private_call: mapPrivateCallDataToNoir(privateKernelInnerCircuitPrivateInputs.privateCall), - app_public_inputs: mapPrivateCircuitPublicInputsToNoir( - privateKernelInnerCircuitPrivateInputs.privateCall.publicInputs, - ), - }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the private kernel reset circuit into a witness map - * @param inputs - The private kernel inputs. - * @returns The witness map - */ -export function convertPrivateKernelResetInputsToWitnessMap< - NH_RR_PENDING extends number, - NH_RR_SETTLED extends number, - NLL_RR_PENDING extends number, - NLL_RR_SETTLED extends number, - KEY_VALIDATION_REQUESTS extends number, - NUM_TRANSIENT_DATA_HINTS extends number, ->( - privateKernelResetCircuitPrivateInputs: PrivateKernelResetCircuitPrivateInputsVariants< - NH_RR_PENDING, - NH_RR_SETTLED, - NLL_RR_PENDING, - NLL_RR_SETTLED, - KEY_VALIDATION_REQUESTS, - NUM_TRANSIENT_DATA_HINTS - >, - artifactName: PrivateResetArtifact, -): WitnessMap { - const args: InputMap = { - previous_kernel: mapPrivateKernelDataToNoir(privateKernelResetCircuitPrivateInputs.previousKernel), - previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( - privateKernelResetCircuitPrivateInputs.previousKernel.publicInputs, - ), - hints: mapPrivateKernelResetHintsToNoir(privateKernelResetCircuitPrivateInputs.hints), - }; - const artifact = ClientCircuitArtifacts[artifactName]; - const initialWitnessMap = abiEncode(artifact.abi as Abi, args); - return initialWitnessMap; -} - -/** - * Converts the inputs of the private kernel tail circuit into a witness map - * @param inputs - The private kernel inputs. - * @returns The witness map - */ -export function convertPrivateKernelTailInputsToWitnessMap( - privateKernelTailCircuitPrivateInputs: PrivateKernelTailCircuitPrivateInputs, -): WitnessMap { - const args: InputMap = { - previous_kernel: mapPrivateKernelDataToNoir(privateKernelTailCircuitPrivateInputs.previousKernel), - previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( - privateKernelTailCircuitPrivateInputs.previousKernel.publicInputs, - ), - }; - const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelTailArtifact.abi, args); - return initialWitnessMap; -} - -/** - * Converts the inputs of the private kernel tail to public circuit into a witness map - * @param inputs - The private kernel inputs. - * @returns The witness map - */ -export function convertPrivateKernelTailToPublicInputsToWitnessMap( - privateKernelTailToPublicCircuitPrivateInputs: PrivateKernelTailCircuitPrivateInputs, -): WitnessMap { - const args: InputMap = { - previous_kernel: mapPrivateKernelDataToNoir(privateKernelTailToPublicCircuitPrivateInputs.previousKernel), - previous_kernel_public_inputs: mapPrivateKernelCircuitPublicInputsToNoir( - privateKernelTailToPublicCircuitPrivateInputs.previousKernel.publicInputs, - ), - }; - const initialWitnessMap = abiEncode(ClientCircuitArtifacts.PrivateKernelTailToPublicArtifact.abi, args); - return initialWitnessMap; -} - -/** - * Converts the outputs of the private kernel init circuit from a witness map. - * @param outputs - The private kernel outputs as a witness map. - * @returns The public inputs. - */ -export function convertPrivateKernelInitOutputsFromWitnessMap(outputs: WitnessMap): PrivateKernelCircuitPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelInitArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as PrivateKernelInitReturnType; - - return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the private kernel inner circuit from a witness map. - * @param outputs - The private kernel outputs as a witness map. - * @returns The public inputs. - */ -export function convertPrivateKernelInnerOutputsFromWitnessMap(outputs: WitnessMap): PrivateKernelCircuitPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelInnerArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as PrivateKernelInnerReturnType; - - return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the private kernel reset circuit from a witness map. - * @param outputs - The private kernel outputs as a witness map. - * @returns The public inputs. - */ -export function convertPrivateKernelResetOutputsFromWitnessMap( - outputs: WitnessMap, - artifactName: PrivateResetArtifact, -): PrivateKernelCircuitPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const artifact = ClientCircuitArtifacts[artifactName]; - const decodedInputs: DecodedInputs = abiDecode(artifact.abi as Abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as PrivateKernelResetReturnType; - - return mapPrivateKernelCircuitPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the private kernel tail circuit from a witness map. - * @param outputs - The private kernel outputs as a witness map. - * @returns The public inputs. - */ -export function convertPrivateKernelTailOutputsFromWitnessMap( - outputs: WitnessMap, -): PrivateKernelTailCircuitPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelTailArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as PrivateKernelTailReturnType; - - return mapPrivateKernelTailCircuitPublicInputsForRollupFromNoir(returnType); -} - -/** - * Converts the outputs of the private kernel tail for public circuit from a witness map. - * @param outputs - The private kernel outputs as a witness map. - * @returns The public inputs. - */ -export function convertPrivateKernelTailForPublicOutputsFromWitnessMap( - outputs: WitnessMap, -): PrivateKernelTailCircuitPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ClientCircuitArtifacts.PrivateKernelTailToPublicArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as PrivateKernelTailToPublicReturnType; - - return mapPrivateKernelTailCircuitPublicInputsForPublicFromNoir(returnType); -} - -/** - * Converts the inputs of the base parity circuit into a witness map. - * @param inputs - The base parity inputs. - * @returns The witness map - */ -export function convertBaseParityInputsToWitnessMap(inputs: BaseParityInputs): WitnessMap { - const mapped = mapBaseParityInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.BaseParityArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the root parity circuit into a witness map. - * @param inputs - The root parity inputs. - * @returns The witness map - */ -export function convertRootParityInputsToWitnessMap(inputs: RootParityInputs): WitnessMap { - const mapped = mapRootParityInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.RootParityArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -export function convertPrivateKernelEmptyInputsToWitnessMap(inputs: PrivateKernelEmptyInputs): WitnessMap { - const mapped = mapEmptyKernelInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.PrivateKernelEmptyArtifact.abi, { input: mapped as any }); - return initialWitnessMap; -} - -export function convertPrivateBaseRollupInputsToWitnessMap(inputs: PrivateBaseRollupInputs): WitnessMap { - const mapped = mapPrivateBaseRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -export function convertSimulatedPrivateBaseRollupInputsToWitnessMap(inputs: PrivateBaseRollupInputs): WitnessMap { - const mapped = mapPrivateBaseRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(SimulatedServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, { - inputs: mapped as any, - }); - return initialWitnessMap; -} - -export function convertPublicBaseRollupInputsToWitnessMap(inputs: PublicBaseRollupInputs): WitnessMap { - const mapped = mapPublicBaseRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.PublicBaseRollupArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -export function convertSimulatedPublicBaseRollupInputsToWitnessMap(inputs: PublicBaseRollupInputs): WitnessMap { - const mapped = mapPublicBaseRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(SimulatedServerCircuitArtifacts.PublicBaseRollupArtifact.abi, { - inputs: mapped as any, - }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the merge rollup circuit into a witness map. - * @param inputs - The merge rollup inputs. - * @returns The witness map - */ -export function convertMergeRollupInputsToWitnessMap(inputs: MergeRollupInputs): WitnessMap { - const mapped = mapMergeRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.MergeRollupArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the block root rollup circuit into a witness map. - * @param inputs - The block root rollup inputs. - * @returns The witness map - */ -export function convertBlockRootRollupInputsToWitnessMap(inputs: BlockRootRollupInputs): WitnessMap { - const mapped = mapBlockRootRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.BlockRootRollupArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the empty block root rollup circuit into a witness map. - * @param inputs - The empty block root rollup inputs. - * @returns The witness map - */ -export function convertEmptyBlockRootRollupInputsToWitnessMap(inputs: EmptyBlockRootRollupInputs): WitnessMap { - const mapped = mapEmptyBlockRootRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.EmptyBlockRootRollupArtifact.abi, { - inputs: mapped as any, - }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the block merge rollup circuit into a witness map. - * @param inputs - The block merge rollup inputs. - * @returns The witness map - */ -export function convertBlockMergeRollupInputsToWitnessMap(inputs: BlockMergeRollupInputs): WitnessMap { - const mapped = mapBlockMergeRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.BlockMergeRollupArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -/** - * Converts the inputs of the root rollup circuit into a witness map. - * @param inputs - The root rollup inputs. - * @returns The witness map - */ -export function convertRootRollupInputsToWitnessMap(inputs: RootRollupInputs): WitnessMap { - const mapped = mapRootRollupInputsToNoir(inputs); - const initialWitnessMap = abiEncode(ServerCircuitArtifacts.RootRollupArtifact.abi, { inputs: mapped as any }); - return initialWitnessMap; -} - -export function convertPrivateKernelEmptyOutputsFromWitnessMap(outputs: WitnessMap): KernelCircuitPublicInputs { - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.PrivateKernelEmptyArtifact.abi, outputs); - const returnType = decodedInputs.return_value as PrivateKernelEmptyReturnType; - - return mapKernelCircuitPublicInputsFromNoir(returnType); -} - -export function convertSimulatedPrivateKernelEmptyOutputsFromWitnessMap( - outputs: WitnessMap, -): KernelCircuitPublicInputs { - const decodedInputs: DecodedInputs = abiDecode( - SimulatedServerCircuitArtifacts.PrivateKernelEmptyArtifact.abi, - outputs, - ); - const returnType = decodedInputs.return_value as PrivateKernelEmptyReturnType; - - return mapKernelCircuitPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the simulated base rollup circuit from a witness map. - * @param outputs - The base rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertSimulatedPrivateBaseRollupOutputsFromWitnessMap( - outputs: WitnessMap, -): BaseOrMergeRollupPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode( - SimulatedServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, - outputs, - ); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBasePrivateReturnType; - - return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the base rollup circuit from a witness map. - * @param outputs - The base rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertPrivateBaseRollupOutputsFromWitnessMap(outputs: WitnessMap): BaseOrMergeRollupPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.PrivateBaseRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBasePrivateReturnType; - - return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the simulated base rollup circuit from a witness map. - * @param outputs - The base rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertSimulatedPublicBaseRollupOutputsFromWitnessMap( - outputs: WitnessMap, -): BaseOrMergeRollupPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(SimulatedServerCircuitArtifacts.PublicBaseRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBasePublicReturnType; - - return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the base rollup circuit from a witness map. - * @param outputs - The base rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertPublicBaseRollupOutputsFromWitnessMap(outputs: WitnessMap): BaseOrMergeRollupPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.PublicBaseRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBasePublicReturnType; - - return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the merge rollup circuit from a witness map. - * @param outputs - The merge rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertMergeRollupOutputsFromWitnessMap(outputs: WitnessMap): BaseOrMergeRollupPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.MergeRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupMergeReturnType; - - return mapBaseOrMergeRollupPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the empty block root rollup circuit from a witness map. - * @param outputs - The block root rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertEmptyBlockRootRollupOutputsFromWitnessMap( - outputs: WitnessMap, -): BlockRootOrBlockMergePublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.EmptyBlockRootRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBlockRootEmptyReturnType; - - return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the block root rollup circuit from a witness map. - * @param outputs - The block root rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertBlockRootRollupOutputsFromWitnessMap(outputs: WitnessMap): BlockRootOrBlockMergePublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.BlockRootRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBlockRootReturnType; - - return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the block merge rollup circuit from a witness map. - * @param outputs - The block merge rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertBlockMergeRollupOutputsFromWitnessMap(outputs: WitnessMap): BlockRootOrBlockMergePublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.BlockMergeRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupBlockMergeReturnType; - - return mapBlockRootOrBlockMergePublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the root rollup circuit from a witness map. - * @param outputs - The root rollup outputs as a witness map. - * @returns The public inputs. - */ -export function convertRootRollupOutputsFromWitnessMap(outputs: WitnessMap): RootRollupPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.RootRollupArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as RollupRootReturnType; - - return mapRootRollupPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the base parity circuit from a witness map. - * @param outputs - The base parity outputs as a witness map. - * @returns The public inputs. - */ -export function convertBaseParityOutputsFromWitnessMap(outputs: WitnessMap): ParityPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.BaseParityArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as ParityBaseReturnType; - - return mapParityPublicInputsFromNoir(returnType); -} - -/** - * Converts the outputs of the root parity circuit from a witness map. - * @param outputs - The root parity outputs as a witness map. - * @returns The public inputs. - */ -export function convertRootParityOutputsFromWitnessMap(outputs: WitnessMap): ParityPublicInputs { - // Decode the witness map into two fields, the return values and the inputs - const decodedInputs: DecodedInputs = abiDecode(ServerCircuitArtifacts.RootParityArtifact.abi, outputs); - - // Cast the inputs as the return type - const returnType = decodedInputs.return_value as ParityRootReturnType; - - return mapParityPublicInputsFromNoir(returnType); -} - -function fromACVMField(field: string): Fr { - return Fr.fromBuffer(Buffer.from(field.slice(2), 'hex')); -} - -export function foreignCallHandler(name: string, args: ForeignCallInput[]): Promise { - // ForeignCallInput is actually a string[], so the args are string[][]. - const log = createLogger('noir-protocol-circuits:oracle'); - - if (name === 'debugLog') { - assert(args.length === 3, 'expected 3 arguments for debugLog: msg, fields_length, fields'); - const [msgRaw, _ignoredFieldsSize, fields] = args; - const msg: string = msgRaw.map(acvmField => String.fromCharCode(fromACVMField(acvmField).toNumber())).join(''); - const fieldsFr: Fr[] = fields.map((field: string) => fromACVMField(field)); - log.verbose('debug_log ' + applyStringFormatting(msg, fieldsFr)); - } else { - throw Error(`unexpected oracle during execution: ${name}`); - } - - return Promise.resolve([]); -} diff --git a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts index 403e2ce8f61..47f65312f17 100644 --- a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts +++ b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts @@ -33,7 +33,7 @@ const main = async () => { if (!content.vkHash) { const { keyAsFields } = content; - content.vkHash = hashVK(keyAsFields.map((str: string) => Fr.fromString(str))).toString(); + content.vkHash = hashVK(keyAsFields.map((str: string) => Fr.fromHexString(str))).toString(); await fs.writeFile(keyPath, JSON.stringify(content, null, 2)); } } diff --git a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts index a5912d95589..e6dcafdeee5 100644 --- a/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts +++ b/yarn-project/noir-protocol-circuits-types/src/type_conversion.ts @@ -7,8 +7,11 @@ import { type AvmCircuitPublicInputs, type AvmProofData, AztecAddress, + BLOBS_PER_BLOCK, BaseOrMergeRollupPublicInputs, type BaseParityInputs, + BlobPublicInputs, + BlockBlobPublicInputs, BlockHeader, type BlockMergeRollupInputs, BlockRootOrBlockMergePublicInputs, @@ -71,6 +74,7 @@ import { PartialStateReference, type PendingReadHint, Point, + Poseidon2Sponge, type PreviousRollupBlockData, type PreviousRollupData, PrivateAccumulatedData, @@ -118,6 +122,7 @@ import { ScopedPrivateLogData, ScopedReadRequest, type SettledReadHint, + SpongeBlob, StateReference, type TUBE_PROOF_LENGTH, type TransientDataIndexHint, @@ -128,7 +133,7 @@ import { type VerificationKeyAsFields, type VkWitnessData, } from '@aztec/circuits.js'; -import { toBufferBE } from '@aztec/foundation/bigint-buffer'; +import { toBufferBE, toHex } from '@aztec/foundation/bigint-buffer'; import { type Tuple, mapTuple, toTruncField } from '@aztec/foundation/serialize'; import type { @@ -138,6 +143,10 @@ import type { AvmProofData as AvmProofDataNoir, BaseOrMergeRollupPublicInputs as BaseOrMergeRollupPublicInputsNoir, BaseParityInputs as BaseParityInputsNoir, + BigNum, + BlobCommitment as BlobCommitmentNoir, + BlobPublicInputs as BlobPublicInputsNoir, + BlockBlobPublicInputs as BlockBlobPublicInputsNoir, BlockHeader as BlockHeaderNoir, BlockMergeRollupInputs as BlockMergeRollupInputsNoir, BlockRootOrBlockMergePublicInputs as BlockRootOrBlockMergePublicInputsNoir, @@ -186,6 +195,7 @@ import type { RootParityInput as ParityRootParityInputNoir, PartialStateReference as PartialStateReferenceNoir, PendingReadHint as PendingReadHintNoir, + Poseidon2 as Poseidon2SpongeNoir, PreviousRollupBlockData as PreviousRollupBlockDataNoir, PreviousRollupData as PreviousRollupDataNoir, PrivateAccumulatedData as PrivateAccumulatedDataNoir, @@ -228,6 +238,7 @@ import type { ScopedNullifier as ScopedNullifierNoir, Scoped as ScopedPrivateLogDataNoir, ScopedReadRequest as ScopedReadRequestNoir, + SpongeBlob as SpongeBlobNoir, StateReference as StateReferenceNoir, TransientDataIndexHint as TransientDataIndexHintNoir, TreeSnapshots as TreeSnapshotsNoir, @@ -255,7 +266,7 @@ export function mapFieldToNoir(field: Fr): NoirField { * @returns The fr. */ export function mapFieldFromNoir(field: NoirField): Fr { - return Fr.fromString(field); + return Fr.fromHexString(field); } /** Maps a field to a noir wrapped field type (ie any type implemented as struct with an inner Field). */ @@ -274,13 +285,36 @@ export function mapWrappedFieldFromNoir(wrappedField: { inner: NoirField }): Fr * @returns The number */ export function mapNumberFromNoir(number: NoirField): number { - return Number(Fr.fromString(number).toBigInt()); + return Number(Fr.fromHexString(number).toBigInt()); } export function mapNumberToNoir(number: number): NoirField { return new Fr(BigInt(number)).toString(); } +/** + * Maps a BigNum coming to/from noir. + * TODO(): Is BigInt the best way to represent this? + * @param number - The BigNum representing the number. + * @returns The number + */ +export function mapBLS12BigNumFromNoir(bignum: BigNum): bigint { + // TODO(Miranda): there's gotta be a better way to convert this + const paddedLimbs = [ + `0x` + bignum.limbs[2].substring(2).padStart(4, '0'), + bignum.limbs[1].substring(2).padStart(30, '0'), + bignum.limbs[0].substring(2).padStart(30, '0'), + ]; + return BigInt(paddedLimbs[0].concat(paddedLimbs[1], paddedLimbs[2])); +} + +export function mapBLS12BigNumToNoir(number: bigint): BigNum { + const hex = toHex(number, true); + return { + limbs: ['0x' + hex.substring(36), '0x' + hex.substring(6, 36), hex.substring(0, 6)], + }; +} + /** * Maps a point to a noir point. * @param point - The point. @@ -490,6 +524,7 @@ export function mapGasSettingsFromNoir(gasSettings: GasSettingsNoir): GasSetting mapGasFromNoir(gasSettings.gas_limits), mapGasFromNoir(gasSettings.teardown_gas_limits), mapGasFeesFromNoir(gasSettings.max_fees_per_gas), + mapGasFeesFromNoir(gasSettings.max_priority_fees_per_gas), ); } @@ -498,6 +533,7 @@ export function mapGasSettingsToNoir(gasSettings: GasSettings): GasSettingsNoir gas_limits: mapGasToNoir(gasSettings.gasLimits), teardown_gas_limits: mapGasToNoir(gasSettings.teardownGasLimits), max_fees_per_gas: mapGasFeesToNoir(gasSettings.maxFeesPerGas), + max_priority_fees_per_gas: mapGasFeesToNoir(gasSettings.maxPriorityFeesPerGas), }; } @@ -1362,6 +1398,7 @@ export function mapPrivateKernelCircuitPublicInputsFromNoir( mapPrivateAccumulatedDataFromNoir(inputs.end), mapPublicCallRequestFromNoir(inputs.public_teardown_call_request), mapAztecAddressFromNoir(inputs.fee_payer), + inputs.is_private_only, ); } @@ -1375,6 +1412,7 @@ export function mapPrivateKernelCircuitPublicInputsToNoir( min_revertible_side_effect_counter: mapFieldToNoir(inputs.minRevertibleSideEffectCounter), public_teardown_call_request: mapPublicCallRequestToNoir(inputs.publicTeardownCallRequest), fee_payer: mapAztecAddressToNoir(inputs.feePayer), + is_private_only: inputs.isPrivateOnly, }; } @@ -1528,6 +1566,123 @@ export function mapFeeRecipientFromNoir(feeRecipient: FeeRecipientNoir): FeeReci return new FeeRecipient(mapEthAddressFromNoir(feeRecipient.recipient), mapFieldFromNoir(feeRecipient.value)); } +/** + * Maps poseidon sponge to noir. + * @param sponge - The circuits.js poseidon sponge. + * @returns The noir poseidon sponge. + */ +export function mapPoseidon2SpongeToNoir(sponge: Poseidon2Sponge): Poseidon2SpongeNoir { + return { + cache: mapTuple(sponge.cache, mapFieldToNoir), + state: mapTuple(sponge.state, mapFieldToNoir), + cache_size: mapNumberToNoir(sponge.cacheSize), + squeeze_mode: sponge.squeezeMode, + }; +} + +/** + * Maps poseidon sponge from noir. + * @param sponge - The noir poseidon sponge. + * @returns The circuits.js poseidon sponge. + */ +export function mapPoseidon2SpongeFromNoir(sponge: Poseidon2SpongeNoir): Poseidon2Sponge { + return new Poseidon2Sponge( + mapTupleFromNoir(sponge.cache, 3, mapFieldFromNoir), + mapTupleFromNoir(sponge.state, 4, mapFieldFromNoir), + mapNumberFromNoir(sponge.cache_size), + sponge.squeeze_mode, + ); +} + +/** + * Maps sponge blob to noir. + * @param spongeBlob - The circuits.js sponge blob. + * @returns The noir sponge blob. + */ +export function mapSpongeBlobToNoir(spongeBlob: SpongeBlob): SpongeBlobNoir { + return { + sponge: mapPoseidon2SpongeToNoir(spongeBlob.sponge), + fields: mapNumberToNoir(spongeBlob.fields), + expected_fields: mapNumberToNoir(spongeBlob.expectedFields), + }; +} + +/** + * Maps sponge blob from noir. + * @param spongeBlob - The noir sponge blob. + * @returns The circuits.js sponge blob. + */ +export function mapSpongeBlobFromNoir(spongeBlob: SpongeBlobNoir): SpongeBlob { + return new SpongeBlob( + mapPoseidon2SpongeFromNoir(spongeBlob.sponge), + mapNumberFromNoir(spongeBlob.fields), + mapNumberFromNoir(spongeBlob.expected_fields), + ); +} + +/** + * Maps blob commitment to noir. + * @param commitment - The circuits.js commitment. + * @returns The noir commitment. + */ +export function mapBlobCommitmentToNoir(commitment: [Fr, Fr]): BlobCommitmentNoir { + return { + inner: mapTuple(commitment, mapFieldToNoir), + }; +} + +/** + * Maps blob public inputs to noir. + * @param blobPublicInputs - The circuits.js blob public inputs. + * @returns The noir blob public inputs. + */ +export function mapBlobPublicInputsToNoir(blobPublicInputs: BlobPublicInputs): BlobPublicInputsNoir { + return { + z: mapFieldToNoir(blobPublicInputs.z), + y: mapBLS12BigNumToNoir(blobPublicInputs.y), + kzg_commitment: mapBlobCommitmentToNoir(blobPublicInputs.kzgCommitment), + }; +} + +/** + * Maps blob public inputs from noir. + * @param blobPublicInputs - The noir blob public inputs. + * @returns The circuits.js blob public inputs. + */ +export function mapBlobPublicInputsFromNoir(blobPublicInputs: BlobPublicInputsNoir): BlobPublicInputs { + return new BlobPublicInputs( + mapFieldFromNoir(blobPublicInputs.z), + mapBLS12BigNumFromNoir(blobPublicInputs.y), + mapTupleFromNoir(blobPublicInputs.kzg_commitment.inner, 2, mapFieldFromNoir), + ); +} + +/** + * Maps block blob public inputs to noir. + * @param blockBlobPublicInputs - The circuits.js block blob public inputs. + * @returns The noir block blob public inputs. + */ +export function mapBlockBlobPublicInputsToNoir( + blockBlobPublicInputs: BlockBlobPublicInputs, +): BlockBlobPublicInputsNoir { + return { + inner: mapTuple(blockBlobPublicInputs.inner, mapBlobPublicInputsToNoir), + }; +} + +/** + * Maps block blob public inputs from noir. + * @param blockBlobPublicInputs - The noir block blob public inputs. + * @returns The circuits.js block blob public inputs. + */ +export function mapBlockBlobPublicInputsFromNoir( + blockBlobPublicInputs: BlockBlobPublicInputsNoir, +): BlockBlobPublicInputs { + return new BlockBlobPublicInputs( + mapTupleFromNoir(blockBlobPublicInputs.inner, BLOBS_PER_BLOCK, mapBlobPublicInputsFromNoir), + ); +} + /** * Maps a constant rollup data to a noir constant rollup data. * @param constantRollupData - The circuits.js constant rollup data. @@ -1570,7 +1725,8 @@ export function mapBaseOrMergeRollupPublicInputsToNoir( constants: mapConstantRollupDataToNoir(baseOrMergeRollupPublicInputs.constants), start: mapPartialStateReferenceToNoir(baseOrMergeRollupPublicInputs.start), end: mapPartialStateReferenceToNoir(baseOrMergeRollupPublicInputs.end), - txs_effects_hash: mapFieldToNoir(baseOrMergeRollupPublicInputs.txsEffectsHash), + start_sponge_blob: mapSpongeBlobToNoir(baseOrMergeRollupPublicInputs.startSpongeBlob), + end_sponge_blob: mapSpongeBlobToNoir(baseOrMergeRollupPublicInputs.endSpongeBlob), out_hash: mapFieldToNoir(baseOrMergeRollupPublicInputs.outHash), accumulated_fees: mapFieldToNoir(baseOrMergeRollupPublicInputs.accumulatedFees), accumulated_mana_used: mapFieldToNoir(baseOrMergeRollupPublicInputs.accumulatedManaUsed), @@ -1597,6 +1753,7 @@ export function mapBlockRootOrBlockMergePublicInputsToNoir( vk_tree_root: mapFieldToNoir(blockRootOrBlockMergePublicInputs.vkTreeRoot), protocol_contract_tree_root: mapFieldToNoir(blockRootOrBlockMergePublicInputs.protocolContractTreeRoot), prover_id: mapFieldToNoir(blockRootOrBlockMergePublicInputs.proverId), + blob_public_inputs: mapTuple(blockRootOrBlockMergePublicInputs.blobPublicInputs, mapBlockBlobPublicInputsToNoir), }; } @@ -1644,7 +1801,8 @@ export function mapBaseOrMergeRollupPublicInputsFromNoir( mapConstantRollupDataFromNoir(baseOrMergeRollupPublicInputs.constants), mapPartialStateReferenceFromNoir(baseOrMergeRollupPublicInputs.start), mapPartialStateReferenceFromNoir(baseOrMergeRollupPublicInputs.end), - mapFieldFromNoir(baseOrMergeRollupPublicInputs.txs_effects_hash), + mapSpongeBlobFromNoir(baseOrMergeRollupPublicInputs.start_sponge_blob), + mapSpongeBlobFromNoir(baseOrMergeRollupPublicInputs.end_sponge_blob), mapFieldFromNoir(baseOrMergeRollupPublicInputs.out_hash), mapFieldFromNoir(baseOrMergeRollupPublicInputs.accumulated_fees), mapFieldFromNoir(baseOrMergeRollupPublicInputs.accumulated_mana_used), @@ -1671,6 +1829,11 @@ export function mapBlockRootOrBlockMergePublicInputsFromNoir( mapFieldFromNoir(blockRootOrBlockMergePublicInputs.vk_tree_root), mapFieldFromNoir(blockRootOrBlockMergePublicInputs.protocol_contract_tree_root), mapFieldFromNoir(blockRootOrBlockMergePublicInputs.prover_id), + mapTupleFromNoir( + blockRootOrBlockMergePublicInputs.blob_public_inputs, + AZTEC_MAX_EPOCH_DURATION, + mapBlockBlobPublicInputsFromNoir, + ), ); } @@ -1770,6 +1933,10 @@ export function mapBlockRootRollupInputsToNoir(rootRollupInputs: BlockRootRollup new_archive_sibling_path: mapTuple(rootRollupInputs.newArchiveSiblingPath, mapFieldToNoir), previous_block_hash: mapFieldToNoir(rootRollupInputs.previousBlockHash), prover_id: mapFieldToNoir(rootRollupInputs.proverId), + // @ts-expect-error - below line gives error 'Type instantiation is excessively deep and possibly infinite. ts(2589)' + blobs_fields: mapTuple(rootRollupInputs.blobFields, mapFieldToNoir), + blob_commitments: mapTuple(rootRollupInputs.blobCommitments, mapBlobCommitmentToNoir), + blobs_hash: mapFieldToNoir(rootRollupInputs.blobsHash), }; } @@ -1848,6 +2015,11 @@ export function mapRootRollupPublicInputsFromNoir( mapFieldFromNoir(rootRollupPublicInputs.vk_tree_root), mapFieldFromNoir(rootRollupPublicInputs.protocol_contract_tree_root), mapFieldFromNoir(rootRollupPublicInputs.prover_id), + mapTupleFromNoir( + rootRollupPublicInputs.blob_public_inputs, + AZTEC_MAX_EPOCH_DURATION, + mapBlockBlobPublicInputsFromNoir, + ), ); } @@ -1903,7 +2075,7 @@ export function mapHeaderFromNoir(header: BlockHeaderNoir): BlockHeader { export function mapContentCommitmentToNoir(contentCommitment: ContentCommitment): ContentCommitmentNoir { return { num_txs: mapFieldToNoir(contentCommitment.numTxs), - txs_effects_hash: mapSha256HashToNoir(contentCommitment.txsEffectsHash), + blobs_hash: mapSha256HashToNoir(contentCommitment.blobsHash), in_hash: mapSha256HashToNoir(contentCommitment.inHash), out_hash: mapSha256HashToNoir(contentCommitment.outHash), }; @@ -1916,7 +2088,7 @@ export function mapContentCommitmentToNoir(contentCommitment: ContentCommitment) export function mapContentCommitmentFromNoir(contentCommitment: ContentCommitmentNoir): ContentCommitment { return new ContentCommitment( mapFieldFromNoir(contentCommitment.num_txs), - mapSha256HashFromNoir(contentCommitment.txs_effects_hash), + mapSha256HashFromNoir(contentCommitment.blobs_hash), mapSha256HashFromNoir(contentCommitment.in_hash), mapSha256HashFromNoir(contentCommitment.out_hash), ); @@ -2143,8 +2315,8 @@ function mapPrivateTubeDataToNoir(data: PrivateTubeData): PrivateTubeDataNoir { export function mapPrivateBaseRollupInputsToNoir(inputs: PrivateBaseRollupInputs): PrivateBaseRollupInputsNoir { return { tube_data: mapPrivateTubeDataToNoir(inputs.tubeData), - start: mapPartialStateReferenceToNoir(inputs.hints.start), + start_sponge_blob: mapSpongeBlobToNoir(inputs.hints.startSpongeBlob), state_diff_hints: mapPrivateBaseStateDiffHintsToNoir(inputs.hints.stateDiffHints), archive_root_membership_witness: mapMembershipWitnessToNoir(inputs.hints.archiveRootMembershipWitness), @@ -2173,8 +2345,8 @@ export function mapPublicBaseRollupInputsToNoir(inputs: PublicBaseRollupInputs): return { tube_data: mapPublicTubeDataToNoir(inputs.tubeData), avm_proof_data: mapAvmProofDataToNoir(inputs.avmProofData), - start: mapPartialStateReferenceToNoir(inputs.hints.start), + start_sponge_blob: mapSpongeBlobToNoir(inputs.hints.startSpongeBlob), state_diff_hints: mapPublicBaseStateDiffHintsToNoir(inputs.hints.stateDiffHints), archive_root_membership_witness: mapMembershipWitnessToNoir(inputs.hints.archiveRootMembershipWitness), diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/decoded_inputs.ts b/yarn-project/noir-protocol-circuits-types/src/utils/decoded_inputs.ts new file mode 100644 index 00000000000..631b1a48f30 --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/utils/decoded_inputs.ts @@ -0,0 +1,14 @@ +// TODO(Tom): This should be exported from noirc_abi +/** + * The decoded inputs from the circuit. + */ +export type DecodedInputs = { + /** + * The inputs to the circuit + */ + inputs: Record; + /** + * The return value of the circuit + */ + return_value: any; +}; diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/foreign_call_handler.ts b/yarn-project/noir-protocol-circuits-types/src/utils/foreign_call_handler.ts new file mode 100644 index 00000000000..5cf86ef55eb --- /dev/null +++ b/yarn-project/noir-protocol-circuits-types/src/utils/foreign_call_handler.ts @@ -0,0 +1,66 @@ +import { BlockBlobPublicInputs, Fr, SpongeBlob } from '@aztec/circuits.js'; +import { Blob } from '@aztec/foundation/blob'; +import { applyStringFormatting, createLogger } from '@aztec/foundation/log'; + +import { type ForeignCallInput, type ForeignCallOutput } from '@noir-lang/acvm_js'; +import { strict as assert } from 'assert'; + +function fromACVMField(field: string): Fr { + return Fr.fromBuffer(Buffer.from(field.slice(2), 'hex')); +} + +function toACVMField(field: Fr): string { + return `0x${field.toBuffer().toString('hex')}`; +} + +export function foreignCallHandler(name: string, args: ForeignCallInput[]): Promise { + // ForeignCallInput is actually a string[], so the args are string[][]. + const log = createLogger('noir-protocol-circuits:oracle'); + + if (name === 'debugLog') { + assert(args.length === 3, 'expected 3 arguments for debugLog: msg, fields_length, fields'); + const [msgRaw, _ignoredFieldsSize, fields] = args; + const msg: string = msgRaw.map(acvmField => String.fromCharCode(fromACVMField(acvmField).toNumber())).join(''); + const fieldsFr: Fr[] = fields.map((field: string) => fromACVMField(field)); + log.verbose('debug_log ' + applyStringFormatting(msg, fieldsFr)); + } else if (name === 'evaluateBlobs') { + // TODO(#10323): this was added to save simulation time (~1min in ACVM, ~3mins in wasm -> 500ms). + // The use of bignum adds a lot of unconstrained code which overloads limits when simulating. + // If/when simulation times of unconstrained are improved, remove this. + // Create and evaulate our blobs: + const paddedBlobsAsFr: Fr[] = args[0].map((field: string) => fromACVMField(field)); + const kzgCommitments = args[1].map((field: string) => fromACVMField(field)); + const spongeBlob = SpongeBlob.fromFields( + args + .slice(2) + .flat() + .map((field: string) => fromACVMField(field)), + ); + const blobsAsFr = paddedBlobsAsFr.slice(0, spongeBlob.expectedFields); + // NB: the above used to be: + // const blobsAsFr: Fr[] = args[0].map((field: string) => fromACVMField(field)).filter(field => !field.isZero()); + // ...but we now have private logs which have a fixed number of fields and may have 0 values. + // TODO(Miranda): trim 0 fields from private logs + const blobs = Blob.getBlobs(blobsAsFr); + const blobPublicInputs = BlockBlobPublicInputs.fromBlobs(blobs); + // Checks on injected values: + const hash = spongeBlob.squeeze(); + blobs.forEach((blob, i) => { + const injected = kzgCommitments.slice(2 * i, 2 * i + 2); + const calculated = blob.commitmentToFields(); + if (!calculated[0].equals(injected[0]) || !calculated[1].equals(injected[1])) { + throw new Error(`Blob commitment mismatch. Real: ${calculated}, Injected: ${injected}`); + } + if (!hash.equals(blob.fieldsHash)) { + throw new Error( + `Injected blob fields do not match rolled up fields. Real hash: ${hash}, Injected hash: ${blob.fieldsHash}`, + ); + } + }); + return Promise.resolve([blobPublicInputs.toFields().map(toACVMField)]); + } else { + throw Error(`unexpected oracle during execution: ${name}`); + } + + return Promise.resolve([]); +} diff --git a/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts b/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts index 2640a9e5cbb..50d6a8e1797 100644 --- a/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts +++ b/yarn-project/noir-protocol-circuits-types/src/utils/vk_json.ts @@ -10,8 +10,8 @@ export function keyJsonToVKData(json: VkJson): VerificationKeyData { const { keyAsBytes, keyAsFields, vkHash } = json; return new VerificationKeyData( new VerificationKeyAsFields( - keyAsFields.map((str: string) => Fr.fromString(str)), - Fr.fromString(vkHash), + keyAsFields.map((str: string) => Fr.fromHexString(str)), + Fr.fromHexString(vkHash), ), Buffer.from(keyAsBytes, 'hex'), ); diff --git a/yarn-project/noir-protocol-circuits-types/src/vks.ts b/yarn-project/noir-protocol-circuits-types/src/vks.ts index ca1675d32ad..dbf31a3a6e3 100644 --- a/yarn-project/noir-protocol-circuits-types/src/vks.ts +++ b/yarn-project/noir-protocol-circuits-types/src/vks.ts @@ -41,7 +41,7 @@ import EmptyBlockRootRollupVkJson from '../artifacts/keys/rollup_block_root_empt import MergeRollupVkJson from '../artifacts/keys/rollup_merge.vk.data.json' assert { type: 'json' }; import RootRollupVkJson from '../artifacts/keys/rollup_root.vk.data.json' assert { type: 'json' }; import TubeVkJson from '../artifacts/keys/tube.vk.data.json' assert { type: 'json' }; -import { type ClientProtocolArtifact, type ProtocolArtifact, type ServerProtocolArtifact } from './artifacts.js'; +import { type ClientProtocolArtifact, type ProtocolArtifact, type ServerProtocolArtifact } from './artifacts/index.js'; import { PrivateKernelResetVkIndexes, PrivateKernelResetVks } from './private_kernel_reset_data.js'; import { keyJsonToVKData } from './utils/vk_json.js'; diff --git a/yarn-project/noir-protocol-circuits-types/tsconfig.json b/yarn-project/noir-protocol-circuits-types/tsconfig.json index 4544ee09c62..99be5d0c203 100644 --- a/yarn-project/noir-protocol-circuits-types/tsconfig.json +++ b/yarn-project/noir-protocol-circuits-types/tsconfig.json @@ -23,5 +23,6 @@ "path": "../merkle-tree" } ], - "include": ["src", "artifacts/*.d.json.ts", "artifacts/**/*.d.json.ts"] + "include": ["src", "artifacts/*.d.json.ts", "artifacts/**/*.d.json.ts"], + "exclude": ["src/scripts"] } diff --git a/yarn-project/p2p/package.json b/yarn-project/p2p/package.json index 69c44f33562..5be467e88f8 100644 --- a/yarn-project/p2p/package.json +++ b/yarn-project/p2p/package.json @@ -5,7 +5,8 @@ "exports": { ".": "./dest/index.js", "./mocks": "./dest/mocks/index.js", - "./bootstrap": "./dest/bootstrap/bootstrap.js" + "./bootstrap": "./dest/bootstrap/bootstrap.js", + "./config": "./dest/config.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/p2p/src/bootstrap/bootstrap.ts b/yarn-project/p2p/src/bootstrap/bootstrap.ts index ab4f84b6b79..32aa21faf3e 100644 --- a/yarn-project/p2p/src/bootstrap/bootstrap.ts +++ b/yarn-project/p2p/src/bootstrap/bootstrap.ts @@ -9,7 +9,7 @@ import type { PeerId } from '@libp2p/interface'; import { type Multiaddr, multiaddr } from '@multiformats/multiaddr'; import type { BootnodeConfig } from '../config.js'; -import { AZTEC_ENR_KEY, AZTEC_NET } from '../service/discV5_service.js'; +import { AZTEC_ENR_KEY, AZTEC_NET } from '../services/discv5/discV5_service.js'; import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js'; /** diff --git a/yarn-project/p2p/src/client/index.ts b/yarn-project/p2p/src/client/index.ts index 509e5d51614..9c4cca388db 100644 --- a/yarn-project/p2p/src/client/index.ts +++ b/yarn-project/p2p/src/client/index.ts @@ -1,4 +1,9 @@ -import type { ClientProtocolCircuitVerifier, L2BlockSource, WorldStateSynchronizer } from '@aztec/circuit-types'; +import { + type ClientProtocolCircuitVerifier, + type L2BlockSource, + P2PClientType, + type WorldStateSynchronizer, +} from '@aztec/circuit-types'; import { createLogger } from '@aztec/foundation/log'; import { type AztecKVStore } from '@aztec/kv-store'; import { type DataStoreConfig } from '@aztec/kv-store/config'; @@ -9,39 +14,47 @@ import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { P2PClient } from '../client/p2p_client.js'; import { type P2PConfig } from '../config.js'; import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js'; -import { InMemoryAttestationPool } from '../mem_pools/attestation_pool/memory_attestation_pool.js'; +import { KvAttestationPool } from '../mem_pools/attestation_pool/kv_attestation_pool.js'; import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js'; import { MemoryEpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/memory_epoch_proof_quote_pool.js'; import { type MemPools } from '../mem_pools/interface.js'; import { AztecKVTxPool, type TxPool } from '../mem_pools/tx_pool/index.js'; -import { DiscV5Service } from '../service/discV5_service.js'; -import { DummyP2PService } from '../service/dummy_service.js'; -import { LibP2PService } from '../service/index.js'; +import { DiscV5Service } from '../services/discv5/discV5_service.js'; +import { DummyP2PService } from '../services/dummy_service.js'; +import { LibP2PService } from '../services/index.js'; import { configureP2PClientAddresses, createLibP2PPeerIdFromPrivateKey, getPeerIdPrivateKey } from '../util.js'; export * from './p2p_client.js'; -export const createP2PClient = async ( +type P2PClientDeps = { + txPool?: TxPool; + store?: AztecKVStore; + attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined; + epochProofQuotePool?: EpochProofQuotePool; +}; + +export const createP2PClient = async ( + clientType: T, _config: P2PConfig & DataStoreConfig, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient = new NoopTelemetryClient(), - deps: { - txPool?: TxPool; - store?: AztecKVStore; - attestationPool?: AttestationPool; - epochProofQuotePool?: EpochProofQuotePool; - } = {}, + deps: P2PClientDeps = {}, ) => { let config = { ..._config }; const logger = createLogger('p2p'); const store = deps.store ?? (await createStore('p2p', config, createLogger('p2p:lmdb'))); - const mempools: MemPools = { + const mempools: MemPools = { txPool: deps.txPool ?? new AztecKVTxPool(store, telemetry), - attestationPool: deps.attestationPool ?? new InMemoryAttestationPool(telemetry), epochProofQuotePool: deps.epochProofQuotePool ?? new MemoryEpochProofQuotePool(telemetry), + attestationPool: + clientType === P2PClientType.Full + ? ((deps.attestationPool ?? new KvAttestationPool(store, telemetry)) as T extends P2PClientType.Full + ? AttestationPool + : undefined) + : undefined, }; let p2pService; @@ -55,7 +68,8 @@ export const createP2PClient = async ( const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey); const discoveryService = new DiscV5Service(peerId, config, telemetry); - p2pService = await LibP2PService.new( + p2pService = await LibP2PService.new( + clientType, config, discoveryService, peerId, @@ -70,5 +84,13 @@ export const createP2PClient = async ( logger.verbose('P2P is disabled. Using dummy P2P service'); p2pService = new DummyP2PService(); } - return new P2PClient(store, l2BlockSource, mempools, p2pService, config.keepProvenTxsInPoolFor, telemetry); + return new P2PClient( + clientType, + store, + l2BlockSource, + mempools, + p2pService, + config.keepProvenTxsInPoolFor, + telemetry, + ); }; diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 5d926dec481..577a9228bcd 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -1,5 +1,5 @@ import { MockL2BlockSource } from '@aztec/archiver/test'; -import { L2Block, mockEpochProofQuote, mockTx } from '@aztec/circuit-types'; +import { L2Block, P2PClientType, mockEpochProofQuote, mockTx } from '@aztec/circuit-types'; import { Fr } from '@aztec/circuits.js'; import { retryUntil } from '@aztec/foundation/retry'; import { sleep } from '@aztec/foundation/sleep'; @@ -49,7 +49,7 @@ describe('In-Memory P2P Client', () => { }; kvStore = openTmpStore(); - client = new P2PClient(kvStore, blockSource, mempools, p2pService, 0); + client = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 0); }); const advanceToProvenBlock = async (getProvenBlockNumber: number, provenEpochNumber = getProvenBlockNumber) => { @@ -119,7 +119,7 @@ describe('In-Memory P2P Client', () => { await client.start(); await client.stop(); - const client2 = new P2PClient(kvStore, blockSource, mempools, p2pService, 0); + const client2 = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 0); expect(client2.getSyncedLatestBlockNum()).toEqual(client.getSyncedLatestBlockNum()); }); @@ -134,7 +134,7 @@ describe('In-Memory P2P Client', () => { }); it('deletes txs after waiting the set number of blocks', async () => { - client = new P2PClient(kvStore, blockSource, mempools, p2pService, 10); + client = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 10); blockSource.setProvenBlockNumber(0); await client.start(); expect(txPool.deleteTxs).not.toHaveBeenCalled(); @@ -151,7 +151,7 @@ describe('In-Memory P2P Client', () => { }); it('stores and returns epoch proof quotes', async () => { - client = new P2PClient(kvStore, blockSource, mempools, p2pService, 0); + client = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 0); blockSource.setProvenEpochNumber(2); await client.start(); @@ -182,7 +182,7 @@ describe('In-Memory P2P Client', () => { }); it('deletes expired proof quotes', async () => { - client = new P2PClient(kvStore, blockSource, mempools, p2pService, 0); + client = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 0); blockSource.setProvenEpochNumber(1); blockSource.setProvenBlockNumber(1); @@ -245,7 +245,7 @@ describe('In-Memory P2P Client', () => { }); it('deletes txs created from a pruned block', async () => { - client = new P2PClient(kvStore, blockSource, mempools, p2pService, 10); + client = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 10); blockSource.setProvenBlockNumber(0); await client.start(); @@ -267,7 +267,7 @@ describe('In-Memory P2P Client', () => { }); it('moves mined and valid txs back to the pending set', async () => { - client = new P2PClient(kvStore, blockSource, mempools, p2pService, 10); + client = new P2PClient(P2PClientType.Full, kvStore, blockSource, mempools, p2pService, 10); blockSource.setProvenBlockNumber(0); await client.start(); diff --git a/yarn-project/p2p/src/client/p2p_client.ts b/yarn-project/p2p/src/client/p2p_client.ts index db1ced07f76..0db273a1bd6 100644 --- a/yarn-project/p2p/src/client/p2p_client.ts +++ b/yarn-project/p2p/src/client/p2p_client.ts @@ -5,10 +5,10 @@ import { type L2Block, type L2BlockId, type L2BlockSource, - L2BlockStream, type L2BlockStreamEvent, type L2Tips, type P2PApi, + type P2PClientType, type PeerInfo, type Tx, type TxHash, @@ -16,7 +16,13 @@ import { import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants'; import { createLogger } from '@aztec/foundation/log'; import { type AztecKVStore, type AztecMap, type AztecSingleton } from '@aztec/kv-store'; -import { Attributes, type TelemetryClient, WithTracer, trackSpan } from '@aztec/telemetry-client'; +import { + Attributes, + type TelemetryClient, + TraceableL2BlockStream, + WithTracer, + trackSpan, +} from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { type ENR } from '@chainsafe/enr'; @@ -26,8 +32,8 @@ import { type AttestationPool } from '../mem_pools/attestation_pool/attestation_ import { type EpochProofQuotePool } from '../mem_pools/epoch_proof_quote_pool/epoch_proof_quote_pool.js'; import { type MemPools } from '../mem_pools/interface.js'; import { type TxPool } from '../mem_pools/tx_pool/index.js'; -import { TX_REQ_PROTOCOL } from '../service/reqresp/interface.js'; -import type { P2PService } from '../service/service.js'; +import { TX_REQ_PROTOCOL } from '../services/reqresp/interface.js'; +import type { P2PService } from '../services/service.js'; /** * Enum defining the possible states of the p2p client. @@ -56,7 +62,7 @@ export interface P2PSyncState { /** * Interface of a P2P client. **/ -export interface P2P extends P2PApi { +export type P2P = P2PApi & { /** * Broadcasts a block proposal to other peers. * @@ -166,12 +172,15 @@ export interface P2P extends P2PApi { /** Identifies a p2p client. */ isP2PClient(): true; -} +}; /** * The P2P client implementation. */ -export class P2PClient extends WithTracer implements P2P { +export class P2PClient + extends WithTracer + implements P2P, P2P +{ /** Property that indicates whether the client is running. */ private stopping = false; @@ -189,7 +198,7 @@ export class P2PClient extends WithTracer implements P2P { private synchedProvenBlockNumber: AztecSingleton; private txPool: TxPool; - private attestationPool: AttestationPool; + private attestationPool: T extends P2PClientType.Full ? AttestationPool : undefined; private epochProofQuotePool: EpochProofQuotePool; /** How many slots to keep attestations for. */ @@ -207,9 +216,10 @@ export class P2PClient extends WithTracer implements P2P { * @param log - A logger. */ constructor( + clientType: T, store: AztecKVStore, private l2BlockSource: L2BlockSource, - mempools: MemPools, + mempools: MemPools, private p2pService: P2PService, private keepProvenTxsFor: number, telemetry: TelemetryClient = new NoopTelemetryClient(), @@ -221,7 +231,9 @@ export class P2PClient extends WithTracer implements P2P { this.keepAttestationsInPoolFor = keepAttestationsInPoolFor; - this.blockStream = new L2BlockStream(l2BlockSource, this, this, createLogger('p2p:block_stream'), { + const tracer = telemetry.getTracer('P2PL2BlockStream'); + const logger = createLogger('p2p:l2-block-stream'); + this.blockStream = new TraceableL2BlockStream(l2BlockSource, this, this, tracer, 'P2PL2BlockStream', logger, { batchSize: blockRequestBatchSize, pollIntervalMS: blockCheckIntervalMS, }); @@ -231,8 +243,8 @@ export class P2PClient extends WithTracer implements P2P { this.synchedProvenBlockNumber = store.openSingleton('p2p_pool_last_proven_l2_block'); this.txPool = mempools.txPool; - this.attestationPool = mempools.attestationPool; this.epochProofQuotePool = mempools.epochProofQuotePool; + this.attestationPool = mempools.attestationPool!; } public isP2PClient(): true { @@ -399,7 +411,7 @@ export class P2PClient extends WithTracer implements P2P { } public getAttestationsForSlot(slot: bigint, proposalId: string): Promise { - return Promise.resolve(this.attestationPool.getAttestationsForSlot(slot, proposalId)); + return Promise.resolve(this.attestationPool?.getAttestationsForSlot(slot, proposalId) ?? []); } // REVIEW: https://github.com/AztecProtocol/aztec-packages/issues/7963 @@ -644,16 +656,17 @@ export class P2PClient extends WithTracer implements P2P { // We delete attestations older than the last block slot minus the number of slots we want to keep in the pool. const lastBlockSlotMinusKeepAttestationsInPoolFor = lastBlockSlot - BigInt(this.keepAttestationsInPoolFor); if (lastBlockSlotMinusKeepAttestationsInPoolFor >= BigInt(INITIAL_L2_BLOCK_NUM)) { - await this.attestationPool.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor); + await this.attestationPool?.deleteAttestationsOlderThan(lastBlockSlotMinusKeepAttestationsInPoolFor); } - await this.synchedProvenBlockNumber.set(lastBlockNum); - this.log.debug(`Synched to proven block ${lastBlockNum}`); const provenEpochNumber = await this.l2BlockSource.getProvenL2EpochNumber(); if (provenEpochNumber !== undefined) { this.epochProofQuotePool.deleteQuotesToEpoch(BigInt(provenEpochNumber)); } + await this.synchedProvenBlockNumber.set(lastBlockNum); + this.log.debug(`Synched to proven block ${lastBlockNum}`); + await this.startServiceIfSynched(); } diff --git a/yarn-project/p2p/src/config.ts b/yarn-project/p2p/src/config.ts index ee3f4e98868..0e30bc2efe3 100644 --- a/yarn-project/p2p/src/config.ts +++ b/yarn-project/p2p/src/config.ts @@ -8,7 +8,7 @@ import { } from '@aztec/foundation/config'; import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config'; -import { type P2PReqRespConfig, p2pReqRespConfigMappings } from './service/reqresp/config.js'; +import { type P2PReqRespConfig, p2pReqRespConfigMappings } from './services/reqresp/config.js'; /** * P2P client configuration values. diff --git a/yarn-project/p2p/src/errors/reqresp.error.ts b/yarn-project/p2p/src/errors/reqresp.error.ts index a31973d3e67..21749b7473d 100644 --- a/yarn-project/p2p/src/errors/reqresp.error.ts +++ b/yarn-project/p2p/src/errors/reqresp.error.ts @@ -3,7 +3,7 @@ * This error will be thrown when a request to a specific peer times out. * @category Errors */ -export class IndiviualReqRespTimeoutError extends Error { +export class IndividualReqRespTimeoutError extends Error { constructor() { super(`Request to peer timed out`); } @@ -19,3 +19,17 @@ export class CollectiveReqRespTimeoutError extends Error { super(`Request to all peers timed out`); } } + +/** Invalid response error + * + * This error will be thrown when a response is received that is not valid. + * + * This error does not need to be punished as message validators will handle punishing invalid + * requests + * @category Errors + */ +export class InvalidResponseError extends Error { + constructor() { + super(`Invalid response received`); + } +} diff --git a/yarn-project/p2p/src/index.ts b/yarn-project/p2p/src/index.ts index d1cf3187d46..f8510cf8552 100644 --- a/yarn-project/p2p/src/index.ts +++ b/yarn-project/p2p/src/index.ts @@ -3,6 +3,6 @@ export * from './bootstrap/bootstrap.js'; export * from './client/index.js'; export * from './config.js'; export * from './mem_pools/epoch_proof_quote_pool/index.js'; -export * from './service/index.js'; +export * from './services/index.js'; export * from './mem_pools/tx_pool/index.js'; export * from './tx_validator/index.js'; diff --git a/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool.ts b/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool.ts index bb7ecb5b704..d7f3e434d09 100644 --- a/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool.ts +++ b/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool.ts @@ -39,6 +39,16 @@ export interface AttestationPool { */ deleteAttestationsForSlot(slot: bigint): Promise; + /** + * Delete Attestations for slot and proposal + * + * Removes all attestations associated with a slot and proposal + * + * @param slot - The slot to delete. + * @param proposalId - The proposal to delete. + */ + deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise; + /** * Get Attestations for slot * diff --git a/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts b/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts new file mode 100644 index 00000000000..f8f838a08ab --- /dev/null +++ b/yarn-project/p2p/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts @@ -0,0 +1,237 @@ +import { type BlockAttestation, TxHash } from '@aztec/circuit-types'; +import { Secp256k1Signer } from '@aztec/foundation/crypto'; +import { Fr } from '@aztec/foundation/fields'; + +import { jest } from '@jest/globals'; +import { type MockProxy, mock } from 'jest-mock-extended'; + +import { type PoolInstrumentation } from '../instrumentation.js'; +import { type AttestationPool } from './attestation_pool.js'; +import { mockAttestation } from './mocks.js'; + +const NUMBER_OF_SIGNERS_PER_TEST = 4; + +export function describeAttestationPool(getAttestationPool: () => AttestationPool) { + let ap: AttestationPool; + let signers: Secp256k1Signer[]; + + // Check that metrics are recorded correctly + let metricsMock: MockProxy>; + + beforeEach(() => { + ap = getAttestationPool(); + signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random()); + + metricsMock = mock>(); + // Can i overwrite this like this?? + (ap as any).metrics = metricsMock; + }); + + const createAttestationsForSlot = (slotNumber: number) => { + const archive = Fr.random(); + return signers.map(signer => mockAttestation(signer, slotNumber, archive)); + }; + + // We compare buffers as the objects can have cached values attached to them which are not serialised + // using array containing as the kv store does not respect insertion order + const compareAttestations = (a1: BlockAttestation[], a2: BlockAttestation[]) => { + const a1Buffer = a1.map(attestation => attestation.toBuffer()); + const a2Buffer = a2.map(attestation => attestation.toBuffer()); + expect(a1Buffer.length).toBe(a2Buffer.length); + expect(a1Buffer).toEqual(expect.arrayContaining(a2Buffer)); + }; + + it('should add attestations to pool', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive)); + + await ap.addAttestations(attestations); + + // Check metrics have been updated. + expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString()); + + expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + + compareAttestations(retreivedAttestations, attestations); + + // Delete by slot + await ap.deleteAttestationsForSlot(BigInt(slotNumber)); + + expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length); + + const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString()); + expect(retreivedAttestationsAfterDelete.length).toBe(0); + }); + + it('Should handle duplicate proposals in a slot', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const txs = [0, 1, 2, 3, 4, 5].map(() => TxHash.random()); + + // Use the same signer for all attestations + const attestations: BlockAttestation[] = []; + const signer = signers[0]; + for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) { + attestations.push(mockAttestation(signer, slotNumber, archive, txs)); + } + + await ap.addAttestations(attestations); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString()); + expect(retreivedAttestations.length).toBe(1); + expect(retreivedAttestations[0].toBuffer()).toEqual(attestations[0].toBuffer()); + expect(retreivedAttestations[0].payload.txHashes).toEqual(txs); + expect(retreivedAttestations[0].getSender().toString()).toEqual(signer.address.toString()); + }); + + it('Should store attestations by differing slot', async () => { + const slotNumbers = [1, 2, 3, 4]; + const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i])); + + await ap.addAttestations(attestations); + + for (const attestation of attestations) { + const slot = attestation.payload.header.globalVariables.slotNumber; + const archive = attestation.archive.toString(); + + const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), archive); + expect(retreivedAttestations.length).toBe(1); + expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer()); + expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot); + } + }); + + it('Should store attestations by differing slot and archive', async () => { + const slotNumbers = [1, 1, 2, 3]; + const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()]; + const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i])); + + await ap.addAttestations(attestations); + + for (const attestation of attestations) { + const slot = attestation.payload.header.globalVariables.slotNumber; + const proposalId = attestation.archive.toString(); + + const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), proposalId); + expect(retreivedAttestations.length).toBe(1); + expect(retreivedAttestations[0].toBuffer()).toEqual(attestation.toBuffer()); + expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot); + } + }); + + it('Should delete attestations', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive)); + const proposalId = attestations[0].archive.toString(); + + await ap.addAttestations(attestations); + + expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + compareAttestations(retreivedAttestations, attestations); + + await ap.deleteAttestations(attestations); + + expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length); + + const gottenAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(gottenAfterDelete.length).toBe(0); + }); + + it('Should blanket delete attestations per slot', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive))); + const proposalId = attestations[0].archive.toString(); + + await ap.addAttestations(attestations); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + compareAttestations(retreivedAttestations, attestations); + + await ap.deleteAttestationsForSlot(BigInt(slotNumber)); + + const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestationsAfterDelete.length).toBe(0); + }); + + it('Should blanket delete attestations per slot and proposal', async () => { + const slotNumber = 420; + const archive = Fr.random(); + const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive)); + const proposalId = attestations[0].archive.toString(); + + // Add another set of attestations with a different proposalId, yet the same slot + const archive2 = Fr.random(); + const attestations2 = signers.map(signer => mockAttestation(signer, slotNumber, archive2)); + const proposalId2 = attestations2[0].archive.toString(); + + await ap.addAttestations(attestations); + await ap.addAttestations(attestations2); + + expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length); + expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations2.length); + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + compareAttestations(retreivedAttestations, attestations); + + await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId); + + expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length); + + const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestationsAfterDelete.length).toBe(0); + + const retreivedAttestationsAfterDeleteForOtherProposal = await ap.getAttestationsForSlot( + BigInt(slotNumber), + proposalId2, + ); + expect(retreivedAttestationsAfterDeleteForOtherProposal.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); + compareAttestations(retreivedAttestationsAfterDeleteForOtherProposal, attestations2); + }); + + it('Should blanket delete attestations per slot and proposal (does not perform db ops if there are no attestations)', async () => { + const slotNumber = 420; + const proposalId = 'proposalId'; + + const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); + expect(retreivedAttestations.length).toBe(0); + + await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId); + + expect(metricsMock.recordRemovedObjects).toHaveBeenCalledTimes(0); + }); + + it('Should delete attestations older than a given slot', async () => { + const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420]; + const attestations = slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)).flat(); + const proposalId = attestations[0].archive.toString(); + + await ap.addAttestations(attestations); + + const attestationsForSlot1 = await ap.getAttestationsForSlot(BigInt(1), proposalId); + expect(attestationsForSlot1.length).toBe(signers.length); + + const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot'); + + await ap.deleteAttestationsOlderThan(BigInt(73)); + + const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlot(BigInt(1), proposalId); + expect(attestationsForSlot1AfterDelete.length).toBe(0); + + expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5); + expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1)); + expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2)); + expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3)); + expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69)); + expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72)); + }); +} diff --git a/yarn-project/p2p/src/mem_pools/attestation_pool/kv_attestation_pool.test.ts b/yarn-project/p2p/src/mem_pools/attestation_pool/kv_attestation_pool.test.ts new file mode 100644 index 00000000000..2832694784c --- /dev/null +++ b/yarn-project/p2p/src/mem_pools/attestation_pool/kv_attestation_pool.test.ts @@ -0,0 +1,18 @@ +import { type AztecKVStore } from '@aztec/kv-store'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; + +import { describeAttestationPool } from './attestation_pool_test_suite.js'; +import { KvAttestationPool } from './kv_attestation_pool.js'; + +describe('KV Attestation Pool', () => { + let kvAttestationPool: KvAttestationPool; + let store: AztecKVStore; + + beforeEach(() => { + store = openTmpStore(); + kvAttestationPool = new KvAttestationPool(store, new NoopTelemetryClient()); + }); + + describeAttestationPool(() => kvAttestationPool); +}); diff --git a/yarn-project/p2p/src/mem_pools/attestation_pool/kv_attestation_pool.ts b/yarn-project/p2p/src/mem_pools/attestation_pool/kv_attestation_pool.ts new file mode 100644 index 00000000000..8de98828eed --- /dev/null +++ b/yarn-project/p2p/src/mem_pools/attestation_pool/kv_attestation_pool.ts @@ -0,0 +1,153 @@ +import { BlockAttestation } from '@aztec/circuit-types'; +import { Fr } from '@aztec/foundation/fields'; +import { createLogger } from '@aztec/foundation/log'; +import { type AztecKVStore, type AztecMapWithSize, type AztecMultiMap } from '@aztec/kv-store'; +import { type TelemetryClient } from '@aztec/telemetry-client'; + +import { PoolInstrumentation, PoolName } from '../instrumentation.js'; +import { type AttestationPool } from './attestation_pool.js'; + +export class KvAttestationPool implements AttestationPool { + private metrics: PoolInstrumentation; + + // Index of all proposal ids in a slot + private attestations: AztecMultiMap; + + constructor( + private store: AztecKVStore, + telemetry: TelemetryClient, + private log = createLogger('aztec:attestation_pool'), + ) { + this.attestations = store.openMultiMap('attestations'); + this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL); + } + + private getProposalMapKey(slot: string, proposalId: string): string { + return `proposal-${slot}-${proposalId}`; + } + + /** + * Get the proposal map for a given slot and proposalId + * + * Essentially a nested mapping of address -> attestation + * + * @param slot - The slot to get the proposal map for + * @param proposalId - The proposalId to get the map for + * @returns The proposal map + */ + private getProposalMap(slot: string, proposalId: string): AztecMapWithSize { + const mapKey = this.getProposalMapKey(slot, proposalId); + return this.store.openMapWithSize(mapKey); + } + + public async addAttestations(attestations: BlockAttestation[]): Promise { + for (const attestation of attestations) { + const slotNumber = attestation.payload.header.globalVariables.slotNumber.toString(); + const proposalId = attestation.archive.toString(); + const address = attestation.getSender().toString(); + + // Index the proposalId in the slot map + await this.attestations.set(slotNumber, proposalId); + + // Store the actual attestation in the proposal map + const proposalMap = this.getProposalMap(slotNumber, proposalId); + await proposalMap.set(address, attestation.toBuffer()); + + this.log.verbose(`Added attestation for slot ${slotNumber} from ${address}`); + } + + this.metrics.recordAddedObjects(attestations.length); + } + + public getAttestationsForSlot(slot: bigint, proposalId: string): Promise { + const slotNumber = new Fr(slot).toString(); + const proposalMap = this.getProposalMap(slotNumber, proposalId); + const attestations = proposalMap.values(); + const attestationsArray = Array.from(attestations).map(attestation => BlockAttestation.fromBuffer(attestation)); + return Promise.resolve(attestationsArray); + } + + public async deleteAttestationsOlderThan(oldestSlot: bigint): Promise { + const olderThan = []; + + const slots = this.attestations.keys(); + for (const slot of slots) { + if (BigInt(slot) < oldestSlot) { + olderThan.push(slot); + } + } + + await Promise.all(olderThan.map(oldSlot => this.deleteAttestationsForSlot(BigInt(oldSlot)))); + return Promise.resolve(); + } + + public async deleteAttestationsForSlot(slot: bigint): Promise { + const deletionPromises = []; + + const slotString = new Fr(slot).toString(); + let numberOfAttestations = 0; + const proposalIds = this.attestations.getValues(slotString); + + if (proposalIds) { + for (const proposalId of proposalIds) { + const proposalMap = this.getProposalMap(slotString, proposalId); + numberOfAttestations += proposalMap.size(); + deletionPromises.push(proposalMap.clear()); + } + } + + await Promise.all(deletionPromises); + + this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot}`); + this.metrics.recordRemovedObjects(numberOfAttestations); + return Promise.resolve(); + } + + public async deleteAttestationsForSlotAndProposal(slot: bigint, proposalId: string): Promise { + const deletionPromises = []; + + const slotString = new Fr(slot).toString(); + const exists = this.attestations.get(slotString); + + if (exists) { + // Remove the proposalId from the slot index + deletionPromises.push(this.attestations.deleteValue(slotString, proposalId)); + + // Delete all attestations for the proposalId + const proposalMap = this.getProposalMap(slotString, proposalId); + const numberOfAttestations = proposalMap.size(); + deletionPromises.push(proposalMap.clear()); + + this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`); + this.metrics.recordRemovedObjects(numberOfAttestations); + } + + await Promise.all(deletionPromises); + return Promise.resolve(); + } + + public async deleteAttestations(attestations: BlockAttestation[]): Promise { + const deletionPromises = []; + + for (const attestation of attestations) { + const slotNumber = attestation.payload.header.globalVariables.slotNumber.toString(); + const proposalId = attestation.archive.toString(); + const proposalMap = this.getProposalMap(slotNumber, proposalId); + + if (proposalMap) { + const address = attestation.getSender().toString(); + deletionPromises.push(proposalMap.delete(address)); + this.log.debug(`Deleted attestation for slot ${slotNumber} from ${address}`); + } + + if (proposalMap.size() === 0) { + deletionPromises.push(this.attestations.deleteValue(slotNumber, proposalId)); + } + } + + await Promise.all(deletionPromises); + + this.metrics.recordRemovedObjects(attestations.length); + return Promise.resolve(); + } +} diff --git a/yarn-project/p2p/src/mem_pools/attestation_pool/memory_attestation_pool.test.ts b/yarn-project/p2p/src/mem_pools/attestation_pool/memory_attestation_pool.test.ts index ef80dad21ec..5d2cd81b625 100644 --- a/yarn-project/p2p/src/mem_pools/attestation_pool/memory_attestation_pool.test.ts +++ b/yarn-project/p2p/src/mem_pools/attestation_pool/memory_attestation_pool.test.ts @@ -1,205 +1,13 @@ -import { type BlockAttestation, TxHash } from '@aztec/circuit-types'; -import { Secp256k1Signer } from '@aztec/foundation/crypto'; -import { Fr } from '@aztec/foundation/fields'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; -import { jest } from '@jest/globals'; -import { type MockProxy, mock } from 'jest-mock-extended'; - -import { type PoolInstrumentation } from '../instrumentation.js'; +import { describeAttestationPool } from './attestation_pool_test_suite.js'; import { InMemoryAttestationPool } from './memory_attestation_pool.js'; -import { mockAttestation } from './mocks.js'; - -const NUMBER_OF_SIGNERS_PER_TEST = 4; - -describe('MemoryAttestationPool', () => { - let ap: InMemoryAttestationPool; - let signers: Secp256k1Signer[]; - const telemetry = new NoopTelemetryClient(); - - // Check that metrics are recorded correctly - let metricsMock: MockProxy>; +describe('In-Memory Attestation Pool', () => { + let inMemoryAttestationPool: InMemoryAttestationPool; beforeEach(() => { - // Use noop telemetry client while testing. - - ap = new InMemoryAttestationPool(telemetry); - signers = Array.from({ length: NUMBER_OF_SIGNERS_PER_TEST }, () => Secp256k1Signer.random()); - - metricsMock = mock>(); - // Can i overwrite this like this?? - (ap as any).metrics = metricsMock; - }); - - const createAttestationsForSlot = (slotNumber: number) => { - const archive = Fr.random(); - return signers.map(signer => mockAttestation(signer, slotNumber, archive)); - }; - - it('should add attestations to pool', async () => { - const slotNumber = 420; - const archive = Fr.random(); - const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive)); - - await ap.addAttestations(attestations); - - // Check metrics have been updated. - expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length); - - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString()); - - expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); - expect(retreivedAttestations).toEqual(attestations); - - // Delete by slot - await ap.deleteAttestationsForSlot(BigInt(slotNumber)); - - expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length); - - const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString()); - expect(retreivedAttestationsAfterDelete.length).toBe(0); - }); - - it('Should handle duplicate proposals in a slot', async () => { - const slotNumber = 420; - const archive = Fr.random(); - const txs = [0, 1, 2, 3, 4, 5].map(() => TxHash.random()); - - // Use the same signer for all attestations - const attestations: BlockAttestation[] = []; - const signer = signers[0]; - for (let i = 0; i < NUMBER_OF_SIGNERS_PER_TEST; i++) { - attestations.push(mockAttestation(signer, slotNumber, archive, txs)); - } - - await ap.addAttestations(attestations); - - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), archive.toString()); - expect(retreivedAttestations.length).toBe(1); - expect(retreivedAttestations[0]).toEqual(attestations[0]); - expect(retreivedAttestations[0].payload.txHashes).toEqual(txs); - expect(retreivedAttestations[0].getSender().toString()).toEqual(signer.address.toString()); - }); - - it('Should store attestations by differing slot', async () => { - const slotNumbers = [1, 2, 3, 4]; - const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i])); - - await ap.addAttestations(attestations); - - for (const attestation of attestations) { - const slot = attestation.payload.header.globalVariables.slotNumber; - const archive = attestation.archive.toString(); - - const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), archive); - expect(retreivedAttestations.length).toBe(1); - expect(retreivedAttestations[0]).toEqual(attestation); - expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot); - } - }); - - it('Should store attestations by differing slot and archive', async () => { - const slotNumbers = [1, 2, 3, 4]; - const archives = [Fr.random(), Fr.random(), Fr.random(), Fr.random()]; - const attestations = signers.map((signer, i) => mockAttestation(signer, slotNumbers[i], archives[i])); - - await ap.addAttestations(attestations); - - for (const attestation of attestations) { - const slot = attestation.payload.header.globalVariables.slotNumber; - const proposalId = attestation.archive.toString(); - - const retreivedAttestations = await ap.getAttestationsForSlot(slot.toBigInt(), proposalId); - expect(retreivedAttestations.length).toBe(1); - expect(retreivedAttestations[0]).toEqual(attestation); - expect(retreivedAttestations[0].payload.header.globalVariables.slotNumber).toEqual(slot); - } - }); - - it('Should delete attestations', async () => { - const slotNumber = 420; - const archive = Fr.random(); - const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive)); - const proposalId = attestations[0].archive.toString(); - - await ap.addAttestations(attestations); - - expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length); - - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); - expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); - expect(retreivedAttestations).toEqual(attestations); - - await ap.deleteAttestations(attestations); - - expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length); - - const gottenAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); - expect(gottenAfterDelete.length).toBe(0); - }); - - it('Should blanket delete attestations per slot', async () => { - const slotNumber = 420; - const archive = Fr.random(); - const attestations = await Promise.all(signers.map(signer => mockAttestation(signer, slotNumber, archive))); - const proposalId = attestations[0].archive.toString(); - - await ap.addAttestations(attestations); - - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); - expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); - expect(retreivedAttestations).toEqual(attestations); - - await ap.deleteAttestationsForSlot(BigInt(slotNumber)); - - const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); - expect(retreivedAttestationsAfterDelete.length).toBe(0); + inMemoryAttestationPool = new InMemoryAttestationPool(new NoopTelemetryClient()); }); - it('Should blanket delete attestations per slot and proposal', async () => { - const slotNumber = 420; - const archive = Fr.random(); - const attestations = signers.map(signer => mockAttestation(signer, slotNumber, archive)); - const proposalId = attestations[0].archive.toString(); - - await ap.addAttestations(attestations); - - expect(metricsMock.recordAddedObjects).toHaveBeenCalledWith(attestations.length); - - const retreivedAttestations = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); - expect(retreivedAttestations.length).toBe(NUMBER_OF_SIGNERS_PER_TEST); - expect(retreivedAttestations).toEqual(attestations); - - await ap.deleteAttestationsForSlotAndProposal(BigInt(slotNumber), proposalId); - - expect(metricsMock.recordRemovedObjects).toHaveBeenCalledWith(attestations.length); - - const retreivedAttestationsAfterDelete = await ap.getAttestationsForSlot(BigInt(slotNumber), proposalId); - expect(retreivedAttestationsAfterDelete.length).toBe(0); - }); - - it('Should delete attestations older than a given slot', async () => { - const slotNumbers = [1, 2, 3, 69, 72, 74, 88, 420]; - const attestations = slotNumbers.map(slotNumber => createAttestationsForSlot(slotNumber)).flat(); - const proposalId = attestations[0].archive.toString(); - - await ap.addAttestations(attestations); - - const attestationsForSlot1 = await ap.getAttestationsForSlot(BigInt(1), proposalId); - expect(attestationsForSlot1.length).toBe(signers.length); - - const deleteAttestationsSpy = jest.spyOn(ap, 'deleteAttestationsForSlot'); - - await ap.deleteAttestationsOlderThan(BigInt(73)); - - const attestationsForSlot1AfterDelete = await ap.getAttestationsForSlot(BigInt(1), proposalId); - expect(attestationsForSlot1AfterDelete.length).toBe(0); - - expect(deleteAttestationsSpy).toHaveBeenCalledTimes(5); - expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(1)); - expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(2)); - expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(3)); - expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(69)); - expect(deleteAttestationsSpy).toHaveBeenCalledWith(BigInt(72)); - }); + describeAttestationPool(() => inMemoryAttestationPool); }); diff --git a/yarn-project/p2p/src/mem_pools/instrumentation.ts b/yarn-project/p2p/src/mem_pools/instrumentation.ts index 0d5fda2687e..431a3e95c89 100644 --- a/yarn-project/p2p/src/mem_pools/instrumentation.ts +++ b/yarn-project/p2p/src/mem_pools/instrumentation.ts @@ -72,17 +72,6 @@ export class PoolInstrumentation { this.objectSize = meter.createHistogram(metricsLabels.objectSize, { unit: 'By', description: 'The size of transactions in the mempool', - advice: { - explicitBucketBoundaries: [ - 5_000, // 5KB - 10_000, - 20_000, - 50_000, - 75_000, - 100_000, // 100KB - 200_000, - ], - }, }); this.dbMetrics = new LmdbMetrics( diff --git a/yarn-project/p2p/src/mem_pools/interface.ts b/yarn-project/p2p/src/mem_pools/interface.ts index faf38e0638c..4db4c0fa899 100644 --- a/yarn-project/p2p/src/mem_pools/interface.ts +++ b/yarn-project/p2p/src/mem_pools/interface.ts @@ -1,3 +1,5 @@ +import { type P2PClientType } from '@aztec/circuit-types'; + import { type AttestationPool } from './attestation_pool/attestation_pool.js'; import { type EpochProofQuotePool } from './epoch_proof_quote_pool/epoch_proof_quote_pool.js'; import { type TxPool } from './tx_pool/tx_pool.js'; @@ -5,8 +7,8 @@ import { type TxPool } from './tx_pool/tx_pool.js'; /** * A interface the combines all mempools */ -export interface MemPools { +export type MemPools = { txPool: TxPool; - attestationPool: AttestationPool; + attestationPool?: T extends P2PClientType.Full ? AttestationPool : undefined; epochProofQuotePool: EpochProofQuotePool; -} +}; diff --git a/yarn-project/p2p/src/mocks/index.ts b/yarn-project/p2p/src/mocks/index.ts index d0524378806..56a98c4462d 100644 --- a/yarn-project/p2p/src/mocks/index.ts +++ b/yarn-project/p2p/src/mocks/index.ts @@ -1,6 +1,7 @@ import { type ClientProtocolCircuitVerifier, type L2BlockSource, + type P2PClientType, type Tx, type WorldStateSynchronizer, } from '@aztec/circuit-types'; @@ -23,11 +24,11 @@ import { type Libp2p, type Libp2pOptions, createLibp2p } from 'libp2p'; import { BootstrapNode } from '../bootstrap/bootstrap.js'; import { type BootnodeConfig, type P2PConfig } from '../config.js'; import { type MemPools } from '../mem_pools/interface.js'; -import { DiscV5Service } from '../service/discV5_service.js'; -import { LibP2PService } from '../service/libp2p_service.js'; -import { type PeerManager } from '../service/peer_manager.js'; -import { type P2PReqRespConfig } from '../service/reqresp/config.js'; -import { pingHandler, statusHandler } from '../service/reqresp/handlers.js'; +import { DiscV5Service } from '../services/discv5/discV5_service.js'; +import { LibP2PService } from '../services/libp2p/libp2p_service.js'; +import { type PeerManager } from '../services/peer_manager.js'; +import { type P2PReqRespConfig } from '../services/reqresp/config.js'; +import { pingHandler, statusHandler } from '../services/reqresp/handlers.js'; import { PING_PROTOCOL, type ReqRespSubProtocolHandlers, @@ -35,8 +36,8 @@ import { STATUS_PROTOCOL, TX_REQ_PROTOCOL, noopValidator, -} from '../service/reqresp/interface.js'; -import { ReqResp } from '../service/reqresp/reqresp.js'; +} from '../services/reqresp/interface.js'; +import { ReqResp } from '../services/reqresp/reqresp.js'; import { type PubSubLibp2p } from '../util.js'; /** @@ -95,11 +96,12 @@ export async function createLibp2pNode( * * */ -export async function createTestLibP2PService( +export async function createTestLibP2PService( + clientType: T, boostrapAddrs: string[] = [], l2BlockSource: L2BlockSource, worldStateSynchronizer: WorldStateSynchronizer, - mempools: MemPools, + mempools: MemPools, telemetry: TelemetryClient, port: number = 0, peerId?: PeerId, @@ -123,7 +125,8 @@ export async function createTestLibP2PService( // No bootstrap nodes provided as the libp2p service will register them in the constructor const p2pNode = await createLibp2pNode([], peerId, port, /*enable gossip */ true, /**start */ false); - return new LibP2PService( + return new LibP2PService( + clientType, config, p2pNode as PubSubLibp2p, discoveryService, diff --git a/yarn-project/p2p/src/service/index.ts b/yarn-project/p2p/src/service/index.ts deleted file mode 100644 index 4e197f1c107..00000000000 --- a/yarn-project/p2p/src/service/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './service.js'; -export * from './libp2p_service.js'; diff --git a/yarn-project/p2p/src/service/data_store.test.ts b/yarn-project/p2p/src/services/data_store.test.ts similarity index 100% rename from yarn-project/p2p/src/service/data_store.test.ts rename to yarn-project/p2p/src/services/data_store.test.ts diff --git a/yarn-project/p2p/src/service/data_store.ts b/yarn-project/p2p/src/services/data_store.ts similarity index 100% rename from yarn-project/p2p/src/service/data_store.ts rename to yarn-project/p2p/src/services/data_store.ts diff --git a/yarn-project/p2p/src/service/discV5_service.ts b/yarn-project/p2p/src/services/discv5/discV5_service.ts similarity index 98% rename from yarn-project/p2p/src/service/discV5_service.ts rename to yarn-project/p2p/src/services/discv5/discV5_service.ts index 5b2ceffcd4c..3ce7e499ae6 100644 --- a/yarn-project/p2p/src/service/discV5_service.ts +++ b/yarn-project/p2p/src/services/discv5/discV5_service.ts @@ -8,9 +8,9 @@ import type { PeerId } from '@libp2p/interface'; import { type Multiaddr, multiaddr } from '@multiformats/multiaddr'; import EventEmitter from 'events'; -import type { P2PConfig } from '../config.js'; -import { convertToMultiaddr } from '../util.js'; -import { type PeerDiscoveryService, PeerDiscoveryState } from './service.js'; +import type { P2PConfig } from '../../config.js'; +import { convertToMultiaddr } from '../../util.js'; +import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js'; export const AZTEC_ENR_KEY = 'aztec_network'; diff --git a/yarn-project/p2p/src/service/discv5_service.test.ts b/yarn-project/p2p/src/services/discv5/discv5_service.test.ts similarity index 97% rename from yarn-project/p2p/src/service/discv5_service.test.ts rename to yarn-project/p2p/src/services/discv5/discv5_service.test.ts index 1f2ce69cb34..552aa98e6df 100644 --- a/yarn-project/p2p/src/service/discv5_service.test.ts +++ b/yarn-project/p2p/src/services/discv5/discv5_service.test.ts @@ -7,10 +7,10 @@ import { jest } from '@jest/globals'; import type { PeerId } from '@libp2p/interface'; import { createSecp256k1PeerId } from '@libp2p/peer-id-factory'; -import { BootstrapNode } from '../bootstrap/bootstrap.js'; -import { type BootnodeConfig, type P2PConfig, getP2PDefaultConfig } from '../config.js'; +import { BootstrapNode } from '../../bootstrap/bootstrap.js'; +import { type BootnodeConfig, type P2PConfig, getP2PDefaultConfig } from '../../config.js'; +import { PeerDiscoveryState } from '../service.js'; import { DiscV5Service } from './discV5_service.js'; -import { PeerDiscoveryState } from './service.js'; const waitForPeers = (node: DiscV5Service, expectedCount: number): Promise => { const timeout = 7_000; diff --git a/yarn-project/p2p/src/service/dummy_service.ts b/yarn-project/p2p/src/services/dummy_service.ts similarity index 100% rename from yarn-project/p2p/src/service/dummy_service.ts rename to yarn-project/p2p/src/services/dummy_service.ts diff --git a/yarn-project/p2p/src/service/encoding.ts b/yarn-project/p2p/src/services/encoding.ts similarity index 74% rename from yarn-project/p2p/src/service/encoding.ts rename to yarn-project/p2p/src/services/encoding.ts index 0713b7e8a26..3d9e41f7db3 100644 --- a/yarn-project/p2p/src/service/encoding.ts +++ b/yarn-project/p2p/src/services/encoding.ts @@ -49,13 +49,31 @@ export function getMsgIdFn(message: Message) { return sha256(Buffer.concat(vec)).subarray(0, 20); } +/** + * Snappy transform for libp2p gossipsub + */ export class SnappyTransform implements DataTransform { + // Topic string included to satisfy DataTransform interface inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array { - const uncompressed = Buffer.from(uncompressSync(Buffer.from(data), { asBuffer: true })); - return new Uint8Array(uncompressed); + return this.inboundTransformNoTopic(Buffer.from(data)); + } + + public inboundTransformNoTopic(data: Buffer): Buffer { + if (data.length === 0) { + return data; + } + return Buffer.from(uncompressSync(data, { asBuffer: true })); } + // Topic string included to satisfy DataTransform interface outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array { - return new Uint8Array(compressSync(Buffer.from(data))); + return this.outboundTransformNoTopic(Buffer.from(data)); + } + + public outboundTransformNoTopic(data: Buffer): Buffer { + if (data.length === 0) { + return data; + } + return Buffer.from(compressSync(data)); } } diff --git a/yarn-project/p2p/src/services/index.ts b/yarn-project/p2p/src/services/index.ts new file mode 100644 index 00000000000..41c15c7624b --- /dev/null +++ b/yarn-project/p2p/src/services/index.ts @@ -0,0 +1,2 @@ +export * from './service.js'; +export * from './libp2p/libp2p_service.js'; diff --git a/yarn-project/p2p/src/service/libp2p_service.ts b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts similarity index 71% rename from yarn-project/p2p/src/service/libp2p_service.ts rename to yarn-project/p2p/src/services/libp2p/libp2p_service.ts index b0f10aec8bf..bfbf5b7df20 100644 --- a/yarn-project/p2p/src/service/libp2p_service.ts +++ b/yarn-project/p2p/src/services/libp2p/libp2p_service.ts @@ -8,13 +8,14 @@ import { MerkleTreeId, type PeerInfo, type RawGossipMessage, - TopicType, TopicTypeMap, Tx, TxHash, type WorldStateSynchronizer, + getTopicTypeForClientType, metricsTopicStrToLabels, } from '@aztec/circuit-types'; +import { P2PClientType } from '@aztec/circuit-types'; import { Fr } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; import { SerialQueue } from '@aztec/foundation/queue'; @@ -28,26 +29,26 @@ import { createPeerScoreParams, createTopicScoreParams } from '@chainsafe/libp2p import { noise } from '@chainsafe/libp2p-noise'; import { yamux } from '@chainsafe/libp2p-yamux'; import { identify } from '@libp2p/identify'; -import type { PeerId } from '@libp2p/interface'; +import { type Message, type PeerId, TopicValidatorResult } from '@libp2p/interface'; import '@libp2p/kad-dht'; import { mplex } from '@libp2p/mplex'; import { tcp } from '@libp2p/tcp'; import { createLibp2p } from 'libp2p'; -import { type P2PConfig } from '../config.js'; -import { type MemPools } from '../mem_pools/interface.js'; +import { type P2PConfig } from '../../config.js'; +import { type MemPools } from '../../mem_pools/interface.js'; import { DataTxValidator, DoubleSpendTxValidator, MetadataTxValidator, TxProofValidator, -} from '../tx_validator/index.js'; -import { type PubSubLibp2p, convertToMultiaddr } from '../util.js'; -import { AztecDatastore } from './data_store.js'; -import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from './encoding.js'; -import { PeerManager } from './peer_manager.js'; -import { PeerErrorSeverity } from './peer_scoring.js'; -import { pingHandler, statusHandler } from './reqresp/handlers.js'; +} from '../../tx_validator/index.js'; +import { type PubSubLibp2p, convertToMultiaddr } from '../../util.js'; +import { AztecDatastore } from '../data_store.js'; +import { SnappyTransform, fastMsgIdFn, getMsgIdFn, msgIdToStrFn } from '../encoding.js'; +import { PeerErrorSeverity } from '../peer-scoring/peer_scoring.js'; +import { PeerManager } from '../peer_manager.js'; +import { pingHandler, statusHandler } from '../reqresp/handlers.js'; import { DEFAULT_SUB_PROTOCOL_HANDLERS, DEFAULT_SUB_PROTOCOL_VALIDATORS, @@ -57,14 +58,29 @@ import { STATUS_PROTOCOL, type SubProtocolMap, TX_REQ_PROTOCOL, -} from './reqresp/interface.js'; -import { ReqResp } from './reqresp/reqresp.js'; -import type { P2PService, PeerDiscoveryService } from './service.js'; +} from '../reqresp/interface.js'; +import { ReqResp } from '../reqresp/reqresp.js'; +import type { P2PService, PeerDiscoveryService } from '../service.js'; + +interface MessageValidator { + validator: { + validateTx(tx: Tx): Promise; + }; + severity: PeerErrorSeverity; +} + +interface ValidationResult { + name: string; + isValid: boolean; + severity: PeerErrorSeverity; +} + +type ValidationOutcome = { allPassed: true } | { allPassed: false; failure: ValidationResult }; /** * Lib P2P implementation of the P2PService interface. */ -export class LibP2PService extends WithTracer implements P2PService { +export class LibP2PService extends WithTracer implements P2PService { private jobQueue: SerialQueue = new SerialQueue(); private peerManager: PeerManager; private discoveryRunningPromise?: RunningPromise; @@ -80,10 +96,11 @@ export class LibP2PService extends WithTracer implements P2PService { private blockReceivedCallback: (block: BlockProposal) => Promise; constructor( + private clientType: T, private config: P2PConfig, private node: PubSubLibp2p, private peerDiscoveryService: PeerDiscoveryService, - private mempools: MemPools, + private mempools: MemPools, private l2BlockSource: L2BlockSource, private proofVerifier: ClientProtocolCircuitVerifier, private worldStateSynchronizer: WorldStateSynchronizer, @@ -93,7 +110,7 @@ export class LibP2PService extends WithTracer implements P2PService { ) { super(telemetry, 'LibP2PService'); - this.peerManager = new PeerManager(node, peerDiscoveryService, config, logger); + this.peerManager = new PeerManager(node, peerDiscoveryService, config, this.tracer, logger); this.node.services.pubsub.score.params.appSpecificScore = (peerId: string) => { return this.peerManager.getPeerScore(peerId); }; @@ -131,22 +148,27 @@ export class LibP2PService extends WithTracer implements P2PService { await this.node.start(); // Subscribe to standard GossipSub topics by default - for (const topic in TopicType) { + for (const topic of getTopicTypeForClientType(this.clientType)) { this.subscribeToTopic(TopicTypeMap[topic].p2pTopic); } + // Add p2p topic validators + this.node.services.pubsub.topicValidators.set(Tx.p2pTopic, this.validatePropagatedTxFromMessage.bind(this)); + // add GossipSub listener this.node.services.pubsub.addEventListener('gossipsub:message', async e => { - const { msg, propagationSource: peerId } = e.detail; + const { msg } = e.detail; this.logger.trace(`Received PUBSUB message.`); - await this.jobQueue.put(() => this.handleNewGossipMessage(msg, peerId)); + await this.jobQueue.put(() => this.handleNewGossipMessage(msg)); }); // Start running promise for peer discovery - this.discoveryRunningPromise = new RunningPromise(() => { - this.peerManager.heartbeat(); - }, this.config.peerCheckIntervalMS); + this.discoveryRunningPromise = new RunningPromise( + () => this.peerManager.heartbeat(), + this.logger, + this.config.peerCheckIntervalMS, + ); this.discoveryRunningPromise.start(); // Define the sub protocol validators - This is done within this start() method to gain a callback to the existing validateTx function @@ -186,11 +208,12 @@ export class LibP2PService extends WithTracer implements P2PService { * @param txPool - The transaction pool to be accessed by the service. * @returns The new service. */ - public static async new( + public static async new( + clientType: T, config: P2PConfig, peerDiscoveryService: PeerDiscoveryService, peerId: PeerId, - mempools: MemPools, + mempools: MemPools, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, @@ -251,6 +274,7 @@ export class LibP2PService extends WithTracer implements P2PService { dataTransform: new SnappyTransform(), metricsRegister: otelMetricsAdapter, metricsTopicStrToLabel: metricsTopicStrToLabels(), + asyncValidation: true, scoreParams: createPeerScoreParams({ topics: { [Tx.p2pTopic]: createTopicScoreParams({ @@ -299,6 +323,7 @@ export class LibP2PService extends WithTracer implements P2PService { }; return new LibP2PService( + clientType, config, node, peerDiscoveryService, @@ -376,12 +401,12 @@ export class LibP2PService extends WithTracer implements P2PService { * @param topic - The message's topic. * @param data - The message data */ - private async handleNewGossipMessage(message: RawGossipMessage, peerId: PeerId) { + private async handleNewGossipMessage(message: RawGossipMessage) { if (message.topic === Tx.p2pTopic) { const tx = Tx.fromBuffer(Buffer.from(message.data)); - await this.processTxFromPeer(tx, peerId); + await this.processTxFromPeer(tx); } - if (message.topic === BlockAttestation.p2pTopic) { + if (message.topic === BlockAttestation.p2pTopic && this.clientType === P2PClientType.Full) { const attestation = BlockAttestation.fromBuffer(Buffer.from(message.data)); await this.processAttestationFromPeer(attestation); } @@ -410,7 +435,7 @@ export class LibP2PService extends WithTracer implements P2PService { })) private async processAttestationFromPeer(attestation: BlockAttestation): Promise { this.logger.debug(`Received attestation ${attestation.p2pMessageIdentifier()} from external peer.`); - await this.mempools.attestationPool.addAttestations([attestation]); + await this.mempools.attestationPool!.addAttestations([attestation]); } /**Process block from peer @@ -468,16 +493,11 @@ export class LibP2PService extends WithTracer implements P2PService { }); } - private async processTxFromPeer(tx: Tx, peerId: PeerId): Promise { + private async processTxFromPeer(tx: Tx): Promise { const txHash = tx.getTxHash(); const txHashString = txHash.toString(); this.logger.verbose(`Received tx ${txHashString} from external peer.`); - - const isValidTx = await this.validatePropagatedTx(tx, peerId); - - if (isValidTx) { - await this.mempools.txPool.addTxs([tx]); - } + await this.mempools.txPool.addTxs([tx]); } /** @@ -494,6 +514,9 @@ export class LibP2PService extends WithTracer implements P2PService { * @param peerId - The peer ID of the peer that sent the tx. * @returns True if the tx is valid, false otherwise. */ + @trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx) => ({ + [Attributes.TX_HASH]: requestedTxHash.toString(), + })) private async validateRequestedTx(requestedTxHash: TxHash, responseTx: Tx, peerId: PeerId): Promise { const proofValidator = new TxProofValidator(this.proofVerifier); const validProof = await proofValidator.validateTx(responseTx); @@ -514,67 +537,150 @@ export class LibP2PService extends WithTracer implements P2PService { return true; } + private async validatePropagatedTxFromMessage( + propagationSource: PeerId, + msg: Message, + ): Promise { + const tx = Tx.fromBuffer(Buffer.from(msg.data)); + const isValid = await this.validatePropagatedTx(tx, propagationSource); + this.logger.trace(`validatePropagatedTx: ${isValid}`, { + [Attributes.TX_HASH]: tx.getTxHash().toString(), + [Attributes.P2P_ID]: propagationSource.toString(), + }); + return isValid ? TopicValidatorResult.Accept : TopicValidatorResult.Reject; + } + + /** + * Validate a tx that has been propagated from a peer. + * @param tx - The tx to validate. + * @param peerId - The peer ID of the peer that sent the tx. + * @returns True if the tx is valid, false otherwise. + */ + @trackSpan('Libp2pService.validatePropagatedTx', tx => ({ + [Attributes.TX_HASH]: tx.getTxHash().toString(), + })) private async validatePropagatedTx(tx: Tx, peerId: PeerId): Promise { const blockNumber = (await this.l2BlockSource.getBlockNumber()) + 1; - // basic data validation - const dataValidator = new DataTxValidator(); - const validData = await dataValidator.validateTx(tx); - if (!validData) { - // penalize - this.node.services.pubsub.score.markInvalidMessageDelivery(peerId.toString(), Tx.p2pTopic); - return false; + const messageValidators = this.createMessageValidators(blockNumber); + const outcome = await this.runValidations(tx, messageValidators); + + if (outcome.allPassed) { + return true; } - // metadata validation - const metadataValidator = new MetadataTxValidator(new Fr(this.config.l1ChainId), new Fr(blockNumber)); - const validMetadata = await metadataValidator.validateTx(tx); - if (!validMetadata) { - // penalize - this.node.services.pubsub.score.markInvalidMessageDelivery(peerId.toString(), Tx.p2pTopic); - return false; + const { name, severity } = outcome.failure; + + // Double spend validator has a special case handler + if (name === 'doubleSpendValidator') { + const isValid = await this.handleDoubleSpendFailure(tx, blockNumber, peerId); + if (isValid) { + return true; + } } - // double spend validation - const doubleSpendValidator = new DoubleSpendTxValidator({ - getNullifierIndex: async (nullifier: Fr) => { - const merkleTree = this.worldStateSynchronizer.getCommitted(); - const index = await merkleTree.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); - return index; + this.peerManager.penalizePeer(peerId, severity); + return false; + } + + /** + * Create message validators for the given block number. + * + * Each validator is a pair of a validator and a severity. + * If a validator fails, the peer is penalized with the severity of the validator. + * + * @param blockNumber - The block number to create validators for. + * @returns The message validators. + */ + private createMessageValidators(blockNumber: number): Record { + return { + dataValidator: { + validator: new DataTxValidator(), + severity: PeerErrorSeverity.HighToleranceError, }, - }); - const validDoubleSpend = await doubleSpendValidator.validateTx(tx); - if (!validDoubleSpend) { - // check if nullifier is older than 20 blocks - if (blockNumber - this.config.severePeerPenaltyBlockLength > 0) { - const snapshotValidator = new DoubleSpendTxValidator({ - getNullifierIndex: async (nullifier: Fr) => { - const merkleTree = this.worldStateSynchronizer.getSnapshot( - blockNumber - this.config.severePeerPenaltyBlockLength, - ); - const index = await merkleTree.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); - return index; + metadataValidator: { + validator: new MetadataTxValidator(new Fr(this.config.l1ChainId), new Fr(blockNumber)), + severity: PeerErrorSeverity.HighToleranceError, + }, + proofValidator: { + validator: new TxProofValidator(this.proofVerifier), + severity: PeerErrorSeverity.MidToleranceError, + }, + doubleSpendValidator: { + validator: new DoubleSpendTxValidator({ + getNullifierIndices: (nullifiers: Buffer[]) => { + const merkleTree = this.worldStateSynchronizer.getCommitted(); + return merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers); }, - }); - - const validSnapshot = await snapshotValidator.validateTx(tx); - // High penalty if nullifier is older than 20 blocks - if (!validSnapshot) { - // penalize - this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError); - return false; - } - } - // penalize - this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError); + }), + severity: PeerErrorSeverity.HighToleranceError, + }, + }; + } + + /** + * Run validations on a tx. + * @param tx - The tx to validate. + * @param messageValidators - The message validators to run. + * @returns The validation outcome. + */ + private async runValidations( + tx: Tx, + messageValidators: Record, + ): Promise { + const validationPromises = Object.entries(messageValidators).map(async ([name, { validator, severity }]) => { + const isValid = await validator.validateTx(tx); + return { name, isValid, severity }; + }); + + // A promise that resolves when all validations have been run + const allValidations = Promise.all(validationPromises); + + // A promise that resolves when the first validation fails + const firstFailure = Promise.race( + validationPromises.map(async promise => { + const result = await promise; + return result.isValid ? new Promise(() => {}) : result; + }), + ); + + // Wait for the first validation to fail or all validations to pass + const result = await Promise.race([ + allValidations.then(() => ({ allPassed: true as const })), + firstFailure.then(failure => ({ allPassed: false as const, failure: failure as ValidationResult })), + ]); + + // If all validations pass, allPassed will be true, if failed, then the failure will be the first validation to fail + return result; + } + + /** + * Handle a double spend failure. + * + * Double spend failures are managed on their own because they are a special case. + * We must check if the double spend is recent or old, if it is past a threshold, then we heavily penalize the peer. + * + * @param tx - The tx that failed the double spend validator. + * @param blockNumber - The block number of the tx. + * @param peerId - The peer ID of the peer that sent the tx. + * @returns True if the tx is valid, false otherwise. + */ + private async handleDoubleSpendFailure(tx: Tx, blockNumber: number, peerId: PeerId): Promise { + if (blockNumber <= this.config.severePeerPenaltyBlockLength) { return false; } - // proof validation - const proofValidator = new TxProofValidator(this.proofVerifier); - const validProof = await proofValidator.validateTx(tx); - if (!validProof) { - // penalize - this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError); + const snapshotValidator = new DoubleSpendTxValidator({ + getNullifierIndices: (nullifiers: Buffer[]) => { + const merkleTree = this.worldStateSynchronizer.getSnapshot( + blockNumber - this.config.severePeerPenaltyBlockLength, + ); + return merkleTree.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers); + }, + }); + + const validSnapshot = await snapshotValidator.validateTx(tx); + if (!validSnapshot) { + this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError); return false; } diff --git a/yarn-project/p2p/src/service/peer_scoring.test.ts b/yarn-project/p2p/src/services/peer-scoring/peer_scoring.test.ts similarity index 98% rename from yarn-project/p2p/src/service/peer_scoring.test.ts rename to yarn-project/p2p/src/services/peer-scoring/peer_scoring.test.ts index 328f5dcd232..92592d9a026 100644 --- a/yarn-project/p2p/src/service/peer_scoring.test.ts +++ b/yarn-project/p2p/src/services/peer-scoring/peer_scoring.test.ts @@ -1,6 +1,6 @@ import { jest } from '@jest/globals'; -import { getP2PDefaultConfig } from '../config.js'; +import { getP2PDefaultConfig } from '../../config.js'; import { PeerErrorSeverity, PeerScoring } from './peer_scoring.js'; describe('PeerScoring', () => { diff --git a/yarn-project/p2p/src/service/peer_scoring.ts b/yarn-project/p2p/src/services/peer-scoring/peer_scoring.ts similarity index 98% rename from yarn-project/p2p/src/service/peer_scoring.ts rename to yarn-project/p2p/src/services/peer-scoring/peer_scoring.ts index abf407798e1..93a62645e0e 100644 --- a/yarn-project/p2p/src/service/peer_scoring.ts +++ b/yarn-project/p2p/src/services/peer-scoring/peer_scoring.ts @@ -1,6 +1,6 @@ import { median } from '@aztec/foundation/collection'; -import { type P2PConfig } from '../config.js'; +import { type P2PConfig } from '../../config.js'; export enum PeerErrorSeverity { /** diff --git a/yarn-project/p2p/src/service/peer_manager.ts b/yarn-project/p2p/src/services/peer_manager.ts similarity index 96% rename from yarn-project/p2p/src/service/peer_manager.ts rename to yarn-project/p2p/src/services/peer_manager.ts index 0a174d54258..f078b2924d4 100644 --- a/yarn-project/p2p/src/service/peer_manager.ts +++ b/yarn-project/p2p/src/services/peer_manager.ts @@ -1,5 +1,6 @@ import { type PeerInfo } from '@aztec/circuit-types'; import { createLogger } from '@aztec/foundation/log'; +import { type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { type ENR } from '@chainsafe/enr'; import { type PeerId } from '@libp2p/interface'; @@ -8,7 +9,7 @@ import { inspect } from 'util'; import { type P2PConfig } from '../config.js'; import { type PubSubLibp2p } from '../util.js'; -import { type PeerErrorSeverity, PeerScoring } from './peer_scoring.js'; +import { type PeerErrorSeverity, PeerScoring } from './peer-scoring/peer_scoring.js'; import { type PeerDiscoveryService } from './service.js'; const MAX_DIAL_ATTEMPTS = 3; @@ -21,7 +22,7 @@ type CachedPeer = { dialAttempts: number; }; -export class PeerManager { +export class PeerManager implements Traceable { private cachedPeers: Map = new Map(); private peerScoring: PeerScoring; private heartbeatCounter: number = 0; @@ -30,6 +31,7 @@ export class PeerManager { private libP2PNode: PubSubLibp2p, private peerDiscoveryService: PeerDiscoveryService, private config: P2PConfig, + public readonly tracer: Tracer, private logger = createLogger('p2p:peer-manager'), ) { this.peerScoring = new PeerScoring(config); @@ -59,6 +61,7 @@ export class PeerManager { }); } + @trackSpan('PeerManager.heartbeat') public heartbeat() { this.heartbeatCounter++; this.discover(); diff --git a/yarn-project/p2p/src/service/reqresp/config.ts b/yarn-project/p2p/src/services/reqresp/config.ts similarity index 100% rename from yarn-project/p2p/src/service/reqresp/config.ts rename to yarn-project/p2p/src/services/reqresp/config.ts diff --git a/yarn-project/p2p/src/service/reqresp/handlers.ts b/yarn-project/p2p/src/services/reqresp/handlers.ts similarity index 100% rename from yarn-project/p2p/src/service/reqresp/handlers.ts rename to yarn-project/p2p/src/services/reqresp/handlers.ts diff --git a/yarn-project/p2p/src/service/reqresp/index.ts b/yarn-project/p2p/src/services/reqresp/index.ts similarity index 100% rename from yarn-project/p2p/src/service/reqresp/index.ts rename to yarn-project/p2p/src/services/reqresp/index.ts diff --git a/yarn-project/p2p/src/service/reqresp/interface.ts b/yarn-project/p2p/src/services/reqresp/interface.ts similarity index 100% rename from yarn-project/p2p/src/service/reqresp/interface.ts rename to yarn-project/p2p/src/services/reqresp/interface.ts diff --git a/yarn-project/p2p/src/service/reqresp/rate_limiter/index.ts b/yarn-project/p2p/src/services/reqresp/rate_limiter/index.ts similarity index 100% rename from yarn-project/p2p/src/service/reqresp/rate_limiter/index.ts rename to yarn-project/p2p/src/services/reqresp/rate_limiter/index.ts diff --git a/yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limiter.test.ts b/yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limiter.test.ts similarity index 98% rename from yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limiter.test.ts rename to yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limiter.test.ts index 813eb1ddbc9..019d0a7183b 100644 --- a/yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limiter.test.ts +++ b/yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limiter.test.ts @@ -2,8 +2,8 @@ import { jest } from '@jest/globals'; import { type PeerId } from '@libp2p/interface'; import { type MockProxy, mock } from 'jest-mock-extended'; +import { PeerErrorSeverity } from '../../peer-scoring/peer_scoring.js'; import { type PeerManager } from '../../peer_manager.js'; -import { PeerErrorSeverity } from '../../peer_scoring.js'; import { PING_PROTOCOL, type ReqRespSubProtocolRateLimits, TX_REQ_PROTOCOL } from '../interface.js'; import { RequestResponseRateLimiter } from './rate_limiter.js'; diff --git a/yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limiter.ts b/yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limiter.ts similarity index 99% rename from yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limiter.ts rename to yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limiter.ts index 37b2909c9ae..be92f06ec2f 100644 --- a/yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limiter.ts +++ b/yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limiter.ts @@ -5,8 +5,8 @@ */ import { type PeerId } from '@libp2p/interface'; +import { PeerErrorSeverity } from '../../peer-scoring/peer_scoring.js'; import { type PeerManager } from '../../peer_manager.js'; -import { PeerErrorSeverity } from '../../peer_scoring.js'; import { type ReqRespSubProtocol, type ReqRespSubProtocolRateLimits } from '../interface.js'; import { DEFAULT_RATE_LIMITS } from './rate_limits.js'; diff --git a/yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limits.ts b/yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limits.ts similarity index 100% rename from yarn-project/p2p/src/service/reqresp/rate_limiter/rate_limits.ts rename to yarn-project/p2p/src/services/reqresp/rate_limiter/rate_limits.ts diff --git a/yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts b/yarn-project/p2p/src/services/reqresp/reqresp.integration.test.ts similarity index 95% rename from yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts rename to yarn-project/p2p/src/services/reqresp/reqresp.integration.test.ts index 739da0d5a09..d94075e288c 100644 --- a/yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts +++ b/yarn-project/p2p/src/services/reqresp/reqresp.integration.test.ts @@ -1,6 +1,11 @@ // An integration test for the p2p client to test req resp protocols import { MockL2BlockSource } from '@aztec/archiver/test'; -import { type ClientProtocolCircuitVerifier, type WorldStateSynchronizer, mockTx } from '@aztec/circuit-types'; +import { + type ClientProtocolCircuitVerifier, + P2PClientType, + type WorldStateSynchronizer, + mockTx, +} from '@aztec/circuit-types'; import { createLogger } from '@aztec/foundation/log'; import { sleep } from '@aztec/foundation/sleep'; import { type AztecKVStore } from '@aztec/kv-store'; @@ -21,8 +26,8 @@ import { type EpochProofQuotePool } from '../../mem_pools/epoch_proof_quote_pool import { type TxPool } from '../../mem_pools/tx_pool/index.js'; import { AlwaysFalseCircuitVerifier, AlwaysTrueCircuitVerifier } from '../../mocks/index.js'; import { convertToMultiaddr, createLibP2PPeerIdFromPrivateKey } from '../../util.js'; -import { AZTEC_ENR_KEY, AZTEC_NET } from '../discV5_service.js'; -import { PeerErrorSeverity } from '../peer_scoring.js'; +import { AZTEC_ENR_KEY, AZTEC_NET } from '../discv5/discV5_service.js'; +import { PeerErrorSeverity } from '../peer-scoring/peer_scoring.js'; /** * Mockify helper for testing purposes. @@ -64,6 +69,7 @@ const makeMockPools = () => { deleteAttestations: jest.fn(), deleteAttestationsForSlot: jest.fn(), deleteAttestationsOlderThan: jest.fn(), + deleteAttestationsForSlotAndProposal: jest.fn(), getAttestationsForSlot: jest.fn().mockReturnValue(undefined), }, epochProofQuotePool: { @@ -148,7 +154,15 @@ describe('Req Resp p2p client integration', () => { epochProofQuotePool: epochProofQuotePool as unknown as EpochProofQuotePool, store: kvStore, }; - const client = await createP2PClient(config, l2BlockSource, proofVerifier, worldState, undefined, deps); + const client = await createP2PClient( + P2PClientType.Full, + config, + l2BlockSource, + proofVerifier, + worldState, + undefined, + deps, + ); await client.start(); clients.push(client); diff --git a/yarn-project/p2p/src/service/reqresp/reqresp.test.ts b/yarn-project/p2p/src/services/reqresp/reqresp.test.ts similarity index 81% rename from yarn-project/p2p/src/service/reqresp/reqresp.test.ts rename to yarn-project/p2p/src/services/reqresp/reqresp.test.ts index f7091c2d5eb..499ebd63564 100644 --- a/yarn-project/p2p/src/service/reqresp/reqresp.test.ts +++ b/yarn-project/p2p/src/services/reqresp/reqresp.test.ts @@ -4,7 +4,7 @@ import { sleep } from '@aztec/foundation/sleep'; import { describe, expect, it, jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; -import { CollectiveReqRespTimeoutError } from '../../errors/reqresp.error.js'; +import { CollectiveReqRespTimeoutError, IndividualReqRespTimeoutError } from '../../errors/reqresp.error.js'; import { MOCK_SUB_PROTOCOL_HANDLERS, MOCK_SUB_PROTOCOL_VALIDATORS, @@ -14,8 +14,8 @@ import { startNodes, stopNodes, } from '../../mocks/index.js'; +import { PeerErrorSeverity } from '../peer-scoring/peer_scoring.js'; import { type PeerManager } from '../peer_manager.js'; -import { PeerErrorSeverity } from '../peer_scoring.js'; import { PING_PROTOCOL, RequestableBuffer, TX_REQ_PROTOCOL } from './interface.js'; const PING_REQUEST = RequestableBuffer.fromBuffer(Buffer.from('ping')); @@ -86,9 +86,27 @@ describe('ReqResp', () => { void nodes[1].req.stop(); void nodes[2].req.stop(); + const loggerSpy = jest.spyOn((nodes[0].req as any).logger, 'debug'); + // send from the first node const res = await nodes[0].req.sendRequest(PING_PROTOCOL, PING_REQUEST); + // We expect the logger to have been called twice with the peer ids citing the inability to connect + expect(loggerSpy).toHaveBeenCalledWith( + expect.stringContaining(`Connection reset: ${nodes[1].p2p.peerId.toString()}`), + { + peerId: nodes[1].p2p.peerId.toString(), + subProtocol: PING_PROTOCOL, + }, + ); + expect(loggerSpy).toHaveBeenCalledWith( + expect.stringContaining(`Connection reset: ${nodes[2].p2p.peerId.toString()}`), + { + peerId: nodes[2].p2p.peerId.toString(), + subProtocol: PING_PROTOCOL, + }, + ); + expect(res?.toBuffer().toString('utf-8')).toEqual('pong'); }); @@ -111,7 +129,7 @@ describe('ReqResp', () => { // Make sure the error message is logged const errorMessage = `Rate limit exceeded for ${PING_PROTOCOL} from ${nodes[0].p2p.peerId.toString()}`; - expect(loggerSpy).toHaveBeenCalledWith(errorMessage); + expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining(errorMessage)); }); describe('Tx req protocol', () => { @@ -139,6 +157,29 @@ describe('ReqResp', () => { expect(res).toEqual(tx); }); + it('Handle returning empty buffers', async () => { + const tx = mockTx(); + const txHash = tx.getTxHash(); + + const protocolHandlers = MOCK_SUB_PROTOCOL_HANDLERS; + protocolHandlers[TX_REQ_PROTOCOL] = (_message: Buffer): Promise => { + return Promise.resolve(Buffer.alloc(0)); + }; + + nodes = await createNodes(peerManager, 2); + + const spySendRequestToPeer = jest.spyOn(nodes[0].req, 'sendRequestToPeer'); + + await startNodes(nodes, protocolHandlers); + await sleep(500); + await connectToPeers(nodes); + await sleep(500); + + const res = await nodes[0].req.sendRequest(TX_REQ_PROTOCOL, txHash); + expect(spySendRequestToPeer).toHaveBeenCalledTimes(1); + expect(res).toEqual(undefined); + }); + it('Does not crash if tx hash returns undefined', async () => { const tx = mockTx(); const txHash = tx.getTxHash(); @@ -170,7 +211,7 @@ describe('ReqResp', () => { }); // Spy on the logger to make sure the error message is logged - const loggerSpy = jest.spyOn((nodes[0].req as any).logger, 'error'); + const loggerSpy = jest.spyOn((nodes[0].req as any).logger, 'debug'); await sleep(500); await connectToPeers(nodes); @@ -183,9 +224,13 @@ describe('ReqResp', () => { // Make sure the error message is logged const peerId = nodes[1].p2p.peerId.toString(); expect(loggerSpy).toHaveBeenCalledWith( - expect.stringMatching(/Error sending request to peer/i), - expect.any(Error), - { peerId, subProtocol: '/aztec/req/tx/0.1.0' }, + `Timeout error: ${ + new IndividualReqRespTimeoutError().message + } | peerId: ${peerId} | subProtocol: ${TX_REQ_PROTOCOL}`, + expect.objectContaining({ + peerId: peerId, + subProtocol: TX_REQ_PROTOCOL, + }), ); // Expect the peer to be penalized for timing out @@ -209,7 +254,7 @@ describe('ReqResp', () => { } // Spy on the logger to make sure the error message is logged - const loggerSpy = jest.spyOn((nodes[0].req as any).logger, 'error'); + const loggerSpy = jest.spyOn((nodes[0].req as any).logger, 'debug'); await sleep(500); await connectToPeers(nodes); diff --git a/yarn-project/p2p/src/service/reqresp/reqresp.ts b/yarn-project/p2p/src/services/reqresp/reqresp.ts similarity index 75% rename from yarn-project/p2p/src/service/reqresp/reqresp.ts rename to yarn-project/p2p/src/services/reqresp/reqresp.ts index e6794c6fecf..261c2d09fd2 100644 --- a/yarn-project/p2p/src/service/reqresp/reqresp.ts +++ b/yarn-project/p2p/src/services/reqresp/reqresp.ts @@ -5,12 +5,16 @@ import { executeTimeoutWithCustomError } from '@aztec/foundation/timer'; import { type IncomingStreamData, type PeerId, type Stream } from '@libp2p/interface'; import { pipe } from 'it-pipe'; import { type Libp2p } from 'libp2p'; -import { compressSync, uncompressSync } from 'snappy'; import { type Uint8ArrayList } from 'uint8arraylist'; -import { CollectiveReqRespTimeoutError, IndiviualReqRespTimeoutError } from '../../errors/reqresp.error.js'; +import { + CollectiveReqRespTimeoutError, + IndividualReqRespTimeoutError, + InvalidResponseError, +} from '../../errors/reqresp.error.js'; +import { SnappyTransform } from '../encoding.js'; +import { PeerErrorSeverity } from '../peer-scoring/peer_scoring.js'; import { type PeerManager } from '../peer_manager.js'; -import { PeerErrorSeverity } from '../peer_scoring.js'; import { type P2PReqRespConfig } from './config.js'; import { DEFAULT_SUB_PROTOCOL_HANDLERS, @@ -49,6 +53,8 @@ export class ReqResp { private rateLimiter: RequestResponseRateLimiter; + private snappyTransform: SnappyTransform; + constructor(config: P2PReqRespConfig, protected readonly libp2p: Libp2p, private peerManager: PeerManager) { this.logger = createLogger('p2p:reqresp'); @@ -56,6 +62,7 @@ export class ReqResp { this.individualRequestTimeoutMs = config.individualRequestTimeoutMs; this.rateLimiter = new RequestResponseRateLimiter(peerManager); + this.snappyTransform = new SnappyTransform(); } /** @@ -143,8 +150,7 @@ export class ReqResp { // The response validator handles peer punishment within const isValid = await responseValidator(request, object, peer); if (!isValid) { - this.logger.error(`Invalid response for ${subProtocol} from ${peer.toString()}`); - return undefined; + throw new InvalidResponseError(); } return object; } @@ -159,7 +165,7 @@ export class ReqResp { () => new CollectiveReqRespTimeoutError(), ); } catch (e: any) { - this.logger.error(`${e.message} | subProtocol: ${subProtocol}`); + this.logger.debug(`${e.message} | subProtocol: ${subProtocol}`); return undefined; } } @@ -200,18 +206,14 @@ export class ReqResp { // Open the stream with a timeout const result = await executeTimeoutWithCustomError( - (): Promise => pipe([payload], stream!, this.readMessage), + (): Promise => pipe([payload], stream!, this.readMessage.bind(this)), this.individualRequestTimeoutMs, - () => new IndiviualReqRespTimeoutError(), + () => new IndividualReqRespTimeoutError(), ); - await stream.close(); - this.logger.trace(`Stream closed with ${peerId.toString()} for ${subProtocol}`); - return result; } catch (e: any) { - this.logger.error(`Error sending request to peer`, e, { peerId: peerId.toString(), subProtocol }); - this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError); + this.handleResponseError(e, peerId, subProtocol); } finally { if (stream) { try { @@ -224,7 +226,70 @@ export class ReqResp { } } } - return undefined; + } + + /** + * Handle a response error + * + * ReqResp errors are punished differently depending on the severity of the offense + * + * @param e - The error + * @param peerId - The peer id + * @param subProtocol - The sub protocol + * @returns If the error is non pubishable, then undefined is returned, otherwise the peer is penalized + */ + private handleResponseError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): void { + const severity = this.categorizeError(e, peerId, subProtocol); + if (severity) { + this.peerManager.penalizePeer(peerId, severity); + } + } + + /** + * Categorize the error and log it. + */ + private categorizeError(e: any, peerId: PeerId, subProtocol: ReqRespSubProtocol): PeerErrorSeverity | undefined { + // Non pubishable errors + // We do not punish a collective timeout, as the node triggers this interupt, independent of the peer's behaviour + const logTags = { + peerId: peerId.toString(), + subProtocol, + }; + if (e instanceof CollectiveReqRespTimeoutError || e instanceof InvalidResponseError) { + this.logger.debug( + `Non-punishable error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`, + logTags, + ); + return undefined; + } + + // Pubishable errors + // Connection reset errors in the networking stack are punished with high severity + // it just signals an unreliable peer + // We assume that the requesting node has a functioning networking stack. + if (e?.code === 'ECONNRESET' || e?.code === 'EPIPE') { + this.logger.debug(`Connection reset: ${peerId.toString()}`, logTags); + return PeerErrorSeverity.HighToleranceError; + } + + if (e?.code === 'ECONNREFUSED') { + this.logger.debug(`Connection refused: ${peerId.toString()}`, logTags); + return PeerErrorSeverity.HighToleranceError; + } + + // Timeout errors are punished with high tolerance, they can be due to a geogrpahically far away peer or an + // overloaded peer + if (e instanceof IndividualReqRespTimeoutError) { + this.logger.debug( + `Timeout error: ${e.message} | peerId: ${peerId.toString()} | subProtocol: ${subProtocol}`, + logTags, + ); + return PeerErrorSeverity.HighToleranceError; + } + + // Catch all error + this.logger.error(`Unexpected error sending request to peer`, e, logTags); + return PeerErrorSeverity.HighToleranceError; } /** @@ -235,8 +300,8 @@ export class ReqResp { for await (const chunk of source) { chunks.push(chunk.subarray()); } - const messageData = chunks.concat(); - return uncompressSync(Buffer.concat(messageData), { asBuffer: true }) as Buffer; + const messageData = Buffer.concat(chunks); + return this.snappyTransform.inboundTransformNoTopic(messageData); } /** @@ -266,6 +331,7 @@ export class ReqResp { } const handler = this.subProtocolHandlers[protocol]; + const transform = this.snappyTransform; try { await pipe( @@ -274,7 +340,7 @@ export class ReqResp { for await (const chunkList of source) { const msg = Buffer.from(chunkList.subarray()); const response = await handler(msg); - yield new Uint8Array(compressSync(response)); + yield new Uint8Array(transform.outboundTransformNoTopic(response)); } }, stream, diff --git a/yarn-project/p2p/src/service/service.ts b/yarn-project/p2p/src/services/service.ts similarity index 100% rename from yarn-project/p2p/src/service/service.ts rename to yarn-project/p2p/src/services/service.ts diff --git a/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.test.ts b/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.test.ts index c74a0fc5e16..bd315664445 100644 --- a/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.test.ts +++ b/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.test.ts @@ -6,24 +6,53 @@ describe('AggregateTxValidator', () => { it('allows txs that pass all validation', async () => { const txs = [mockTx(0), mockTx(1), mockTx(2), mockTx(3), mockTx(4)]; const agg = new AggregateTxValidator( - new TxDenyList(txs[0].getTxHash(), txs[1].getTxHash()), - new TxDenyList(txs[2].getTxHash(), txs[3].getTxHash()), + new TxDenyList([txs[0].getTxHash(), txs[1].getTxHash()], []), + new TxDenyList([txs[2].getTxHash(), txs[4].getTxHash()], []), ); - await expect(agg.validateTxs(txs)).resolves.toEqual([[txs[4]], [txs[0], txs[1], txs[2], txs[3]]]); + const validTxs = [txs[3]]; + const invalidTxs = [txs[0], txs[1], txs[2], txs[4]]; + const skippedTxs: AnyTx[] = []; + await expect(agg.validateTxs(txs)).resolves.toEqual([validTxs, invalidTxs, skippedTxs]); + }); + + it('aggregate skipped txs ', async () => { + const txs = [mockTx(0), mockTx(1), mockTx(2), mockTx(3), mockTx(4)]; + const agg = new AggregateTxValidator( + new TxDenyList([txs[0].getTxHash()], []), + new TxDenyList([], [txs[1].getTxHash(), txs[2].getTxHash()]), + new TxDenyList([], [txs[4].getTxHash()]), + ); + + const validTxs = [txs[3]]; + const invalidTxs = [txs[0]]; + const skippedTxs = [txs[1], txs[2], txs[4]]; + await expect(agg.validateTxs(txs)).resolves.toEqual([validTxs, invalidTxs, skippedTxs]); }); class TxDenyList implements TxValidator { denyList: Set; - constructor(...txHashes: TxHash[]) { - this.denyList = new Set(txHashes.map(hash => hash.toString())); + skippedList: Set; + constructor(deniedTxHashes: TxHash[], skippedTxHashes: TxHash[]) { + this.denyList = new Set(deniedTxHashes.map(hash => hash.toString())); + this.skippedList = new Set(skippedTxHashes.map(hash => hash.toString())); } - validateTxs(txs: AnyTx[]): Promise<[AnyTx[], AnyTx[]]> { - return Promise.resolve([ - txs.filter(tx => !this.denyList.has(Tx.getHash(tx).toString())), - txs.filter(tx => this.denyList.has(Tx.getHash(tx).toString())), - ]); + validateTxs(txs: AnyTx[]): Promise<[AnyTx[], AnyTx[], AnyTx[] | undefined]> { + const validTxs: AnyTx[] = []; + const invalidTxs: AnyTx[] = []; + const skippedTxs: AnyTx[] = []; + txs.forEach(tx => { + const txHash = Tx.getHash(tx).toString(); + if (this.skippedList.has(txHash)) { + skippedTxs.push(tx); + } else if (this.denyList.has(txHash)) { + invalidTxs.push(tx); + } else { + validTxs.push(tx); + } + }); + return Promise.resolve([validTxs, invalidTxs, skippedTxs.length ? skippedTxs : undefined]); } validateTx(tx: AnyTx): Promise { diff --git a/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.ts b/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.ts index 99dfb6c282d..21bf24ddb8d 100644 --- a/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.ts +++ b/yarn-project/p2p/src/tx_validator/aggregate_tx_validator.ts @@ -10,16 +10,18 @@ export class AggregateTxValidator implements TxValid this.#validators = validators; } - async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> { + async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[], skippedTxs: T[]]> { const invalidTxs: T[] = []; + const skippedTxs: T[] = []; let txPool = txs; for (const validator of this.#validators) { - const [valid, invalid] = await validator.validateTxs(txPool); + const [valid, invalid, skipped] = await validator.validateTxs(txPool); invalidTxs.push(...invalid); + skippedTxs.push(...(skipped ?? [])); txPool = valid; } - return [txPool, invalidTxs]; + return [txPool, invalidTxs, skippedTxs]; } async validateTx(tx: T): Promise { diff --git a/yarn-project/p2p/src/tx_validator/double_spend_validator.test.ts b/yarn-project/p2p/src/tx_validator/double_spend_validator.test.ts index 1c123319f33..7b0fbb13974 100644 --- a/yarn-project/p2p/src/tx_validator/double_spend_validator.test.ts +++ b/yarn-project/p2p/src/tx_validator/double_spend_validator.test.ts @@ -10,8 +10,8 @@ describe('DoubleSpendTxValidator', () => { beforeEach(() => { nullifierSource = mock({ - getNullifierIndex: mockFn().mockImplementation(() => { - return Promise.resolve(undefined); + getNullifierIndices: mockFn().mockImplementation(() => { + return Promise.resolve([undefined]); }), }); txValidator = new DoubleSpendTxValidator(nullifierSource); @@ -48,7 +48,7 @@ describe('DoubleSpendTxValidator', () => { it('rejects duplicates against history', async () => { const badTx = mockTx(); - nullifierSource.getNullifierIndex.mockReturnValueOnce(Promise.resolve(1n)); + nullifierSource.getNullifierIndices.mockReturnValueOnce(Promise.resolve([1n])); await expect(txValidator.validateTxs([badTx])).resolves.toEqual([[], [badTx]]); }); }); diff --git a/yarn-project/p2p/src/tx_validator/double_spend_validator.ts b/yarn-project/p2p/src/tx_validator/double_spend_validator.ts index 5bb06bf1fa9..9f735e197b0 100644 --- a/yarn-project/p2p/src/tx_validator/double_spend_validator.ts +++ b/yarn-project/p2p/src/tx_validator/double_spend_validator.ts @@ -1,9 +1,8 @@ import { type AnyTx, Tx, type TxValidator } from '@aztec/circuit-types'; -import { Fr } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; export interface NullifierSource { - getNullifierIndex: (nullifier: Fr) => Promise; + getNullifierIndices: (nullifiers: Buffer[]) => Promise<(bigint | undefined)[]>; } export class DoubleSpendTxValidator implements TxValidator { @@ -36,9 +35,7 @@ export class DoubleSpendTxValidator implements TxValidator { } async #uniqueNullifiers(tx: AnyTx, thisBlockNullifiers: Set): Promise { - const nullifiers = (tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers).map(x => - x.toBigInt(), - ); + const nullifiers = tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers; // Ditch this tx if it has repeated nullifiers const uniqueNullifiers = new Set(nullifiers); @@ -49,16 +46,17 @@ export class DoubleSpendTxValidator implements TxValidator { if (this.isValidatingBlock) { for (const nullifier of nullifiers) { - if (thisBlockNullifiers.has(nullifier)) { + const nullifierBigInt = nullifier.toBigInt(); + if (thisBlockNullifiers.has(nullifierBigInt)) { this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`); return false; } - thisBlockNullifiers.add(nullifier); + thisBlockNullifiers.add(nullifierBigInt); } } - const nullifierIndexes = await Promise.all(nullifiers.map(n => this.#nullifierSource.getNullifierIndex(new Fr(n)))); + const nullifierIndexes = await this.#nullifierSource.getNullifierIndices(nullifiers.map(n => n.toBuffer())); const hasDuplicates = nullifierIndexes.some(index => index !== undefined); if (hasDuplicates) { diff --git a/yarn-project/proof-verifier/package.json b/yarn-project/proof-verifier/package.json index 9dcd38472e9..9a1fed2dba8 100644 --- a/yarn-project/proof-verifier/package.json +++ b/yarn-project/proof-verifier/package.json @@ -2,7 +2,8 @@ "name": "@aztec/proof-verifier", "type": "module", "exports": { - ".": "./dest/index.js" + ".": "./dest/index.js", + "./config": "./dest/config.js" }, "scripts": { "build": "yarn clean && tsc -b", diff --git a/yarn-project/proof-verifier/src/proof_verifier.ts b/yarn-project/proof-verifier/src/proof_verifier.ts index f87f50612a0..11ba8bfa203 100644 --- a/yarn-project/proof-verifier/src/proof_verifier.ts +++ b/yarn-project/proof-verifier/src/proof_verifier.ts @@ -3,7 +3,16 @@ import { BBCircuitVerifier } from '@aztec/bb-prover'; import { createEthereumChain } from '@aztec/ethereum'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; -import { Attributes, Metrics, type TelemetryClient, type UpDownCounter, ValueType } from '@aztec/telemetry-client'; +import { + Attributes, + Metrics, + type TelemetryClient, + type Traceable, + type Tracer, + type UpDownCounter, + ValueType, + trackSpan, +} from '@aztec/telemetry-client'; import { type PublicClient, createPublicClient, http } from 'viem'; @@ -11,12 +20,14 @@ import { type ProofVerifierConfig } from './config.js'; const EXPECTED_PROOF_SIZE = 13988; -export class ProofVerifier { +export class ProofVerifier implements Traceable { private runningPromise: RunningPromise; private synchedToL1Block = 0n; private proofVerified: UpDownCounter; + public readonly tracer: Tracer; + constructor( private config: ProofVerifierConfig, private client: PublicClient, @@ -24,7 +35,8 @@ export class ProofVerifier { telemetryClient: TelemetryClient, private logger: Logger, ) { - this.runningPromise = new RunningPromise(this.work.bind(this), config.pollIntervalMs); + this.tracer = telemetryClient.getTracer('ProofVerifier'); + this.runningPromise = new RunningPromise(this.work.bind(this), this.logger, config.pollIntervalMs); this.proofVerified = telemetryClient.getMeter('ProofVerifier').createUpDownCounter(Metrics.PROOF_VERIFIER_COUNT, { valueType: ValueType.INT, description: 'The number of proofs verified by the block verifier bot', @@ -53,6 +65,7 @@ export class ProofVerifier { await this.runningPromise.stop(); } + @trackSpan('ProofVerifier.work') private async work() { const startBlock = this.synchedToL1Block + 1n; this.logger.debug(`Fetching proofs from L1 block ${startBlock}`); diff --git a/yarn-project/protocol-contracts/package.json b/yarn-project/protocol-contracts/package.json index d12d967b95e..b63606a7f63 100644 --- a/yarn-project/protocol-contracts/package.json +++ b/yarn-project/protocol-contracts/package.json @@ -6,6 +6,7 @@ "type": "module", "exports": { ".": "./dest/index.js", + "./bundle": "./dest/bundle/index.js", "./*": "./dest/*/index.js" }, "typedocOptions": { @@ -94,7 +95,8 @@ "dest", "src", "!*.test.*", - "artifacts" + "artifacts", + "!src/scripts/*" ], "engines": { "node": ">=18" diff --git a/yarn-project/protocol-contracts/src/auth-registry/index.ts b/yarn-project/protocol-contracts/src/auth-registry/index.ts index a5d5c399e0e..60438443618 100644 --- a/yarn-project/protocol-contracts/src/auth-registry/index.ts +++ b/yarn-project/protocol-contracts/src/auth-registry/index.ts @@ -1,6 +1,18 @@ -import { type ProtocolContract, getCanonicalProtocolContract } from '../protocol_contract.js'; +import { loadContractArtifact } from '@aztec/types/abi'; +import { type NoirCompiledContract } from '@aztec/types/noir'; + +import AuthRegistryJson from '../../artifacts/AuthRegistry.json' assert { type: 'json' }; +import { makeProtocolContract } from '../make_protocol_contract.js'; +import { type ProtocolContract } from '../protocol_contract.js'; + +let protocolContract: ProtocolContract; + +export const AuthRegistryArtifact = loadContractArtifact(AuthRegistryJson as NoirCompiledContract); /** Returns the canonical deployment of the auth registry. */ export function getCanonicalAuthRegistry(): ProtocolContract { - return getCanonicalProtocolContract('AuthRegistry'); + if (!protocolContract) { + protocolContract = makeProtocolContract('AuthRegistry', AuthRegistryArtifact); + } + return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/bundle/index.ts b/yarn-project/protocol-contracts/src/bundle/index.ts new file mode 100644 index 00000000000..a8203e7dc33 --- /dev/null +++ b/yarn-project/protocol-contracts/src/bundle/index.ts @@ -0,0 +1,36 @@ +import { getContractClassFromArtifact, getContractInstanceFromDeployParams } from '@aztec/circuits.js'; +import { type ContractArtifact } from '@aztec/foundation/abi'; + +import { AuthRegistryArtifact } from '../auth-registry/index.js'; +import { ContractClassRegistererArtifact } from '../class-registerer/index.js'; +import { FeeJuiceArtifact } from '../fee-juice/index.js'; +import { ContractInstanceDeployerArtifact } from '../instance-deployer/index.js'; +import { MultiCallEntrypointArtifact } from '../multi-call-entrypoint/index.js'; +import { type ProtocolContract } from '../protocol_contract.js'; +import { ProtocolContractAddress, type ProtocolContractName, ProtocolContractSalt } from '../protocol_contract_data.js'; +import { RouterArtifact } from '../router/index.js'; + +/** Returns the canonical deployment a given artifact. */ +export function getCanonicalProtocolContract(name: ProtocolContractName): ProtocolContract { + const artifact = ProtocolContractArtifact[name]; + const address = ProtocolContractAddress[name]; + const salt = ProtocolContractSalt[name]; + // TODO(@spalladino): This computes the contract class from the artifact twice. + const contractClass = getContractClassFromArtifact(artifact); + const instance = getContractInstanceFromDeployParams(artifact, { salt }); + return { + instance: { ...instance, address }, + contractClass, + artifact, + address, + }; +} + +export const ProtocolContractArtifact: Record = { + AuthRegistry: AuthRegistryArtifact, + ContractInstanceDeployer: ContractInstanceDeployerArtifact, + ContractClassRegisterer: ContractClassRegistererArtifact, + MultiCallEntrypoint: MultiCallEntrypointArtifact, + FeeJuice: FeeJuiceArtifact, + Router: RouterArtifact, +}; diff --git a/yarn-project/protocol-contracts/src/class-registerer/index.ts b/yarn-project/protocol-contracts/src/class-registerer/index.ts index b30844b28fa..9967cc1a225 100644 --- a/yarn-project/protocol-contracts/src/class-registerer/index.ts +++ b/yarn-project/protocol-contracts/src/class-registerer/index.ts @@ -1,10 +1,25 @@ -import { type ProtocolContract, getCanonicalProtocolContract } from '../protocol_contract.js'; +import { loadContractArtifact } from '@aztec/types/abi'; +import { type NoirCompiledContract } from '@aztec/types/noir'; + +import ContractClassRegistererJson from '../../artifacts/ContractClassRegisterer.json' assert { type: 'json' }; +import { makeProtocolContract } from '../make_protocol_contract.js'; +import { type ProtocolContract } from '../protocol_contract.js'; export * from './contract_class_registered_event.js'; export * from './private_function_broadcasted_event.js'; export * from './unconstrained_function_broadcasted_event.js'; -/** Returns the canonical deployment of the class registerer contract. */ +export const ContractClassRegistererArtifact = loadContractArtifact( + ContractClassRegistererJson as NoirCompiledContract, +); + +let protocolContract: ProtocolContract; + +/** Returns the canonical deployment of the contract. */ export function getCanonicalClassRegisterer(): ProtocolContract { - return getCanonicalProtocolContract('ContractClassRegisterer'); + if (!protocolContract) { + const artifact = ContractClassRegistererArtifact; + protocolContract = makeProtocolContract('ContractClassRegisterer', artifact); + } + return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/fee-juice/index.ts b/yarn-project/protocol-contracts/src/fee-juice/index.ts index b92451bdb74..3c2baabf873 100644 --- a/yarn-project/protocol-contracts/src/fee-juice/index.ts +++ b/yarn-project/protocol-contracts/src/fee-juice/index.ts @@ -1,6 +1,18 @@ -import { type ProtocolContract, getCanonicalProtocolContract } from '../protocol_contract.js'; +import { loadContractArtifact } from '@aztec/types/abi'; +import { type NoirCompiledContract } from '@aztec/types/noir'; -/** Returns the canonical deployment of the Fee Juice. */ +import FeeJuiceJson from '../../artifacts/FeeJuice.json' assert { type: 'json' }; +import { makeProtocolContract } from '../make_protocol_contract.js'; +import { type ProtocolContract } from '../protocol_contract.js'; + +export const FeeJuiceArtifact = loadContractArtifact(FeeJuiceJson as NoirCompiledContract); + +let protocolContract: ProtocolContract; + +/** Returns the canonical deployment of the contract. */ export function getCanonicalFeeJuice(): ProtocolContract { - return getCanonicalProtocolContract('FeeJuice'); + if (!protocolContract) { + protocolContract = makeProtocolContract('FeeJuice', FeeJuiceArtifact); + } + return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/index.ts b/yarn-project/protocol-contracts/src/index.ts index 029032c827f..adb7745ebef 100644 --- a/yarn-project/protocol-contracts/src/index.ts +++ b/yarn-project/protocol-contracts/src/index.ts @@ -1,8 +1,3 @@ -export * from './auth-registry/index.js'; -export * from './class-registerer/index.js'; -export * from './fee-juice/index.js'; -export * from './instance-deployer/index.js'; -export * from './multi-call-entrypoint/index.js'; export * from './protocol_contract.js'; export * from './protocol_contract_data.js'; export * from './protocol_contract_tree.js'; diff --git a/yarn-project/protocol-contracts/src/instance-deployer/index.ts b/yarn-project/protocol-contracts/src/instance-deployer/index.ts index 1253aeb915d..7af519ff744 100644 --- a/yarn-project/protocol-contracts/src/instance-deployer/index.ts +++ b/yarn-project/protocol-contracts/src/instance-deployer/index.ts @@ -1,8 +1,22 @@ -import { type ProtocolContract, getCanonicalProtocolContract } from '../protocol_contract.js'; +import { loadContractArtifact } from '@aztec/types/abi'; +import { type NoirCompiledContract } from '@aztec/types/noir'; + +import ContractInstanceDeployerJson from '../../artifacts/ContractInstanceDeployer.json' assert { type: 'json' }; +import { makeProtocolContract } from '../make_protocol_contract.js'; +import { type ProtocolContract } from '../protocol_contract.js'; export * from './contract_instance_deployed_event.js'; -/** Returns the canonical deployment of the instance deployer contract. */ +export const ContractInstanceDeployerArtifact = loadContractArtifact( + ContractInstanceDeployerJson as NoirCompiledContract, +); + +let protocolContract: ProtocolContract; + +/** Returns the canonical deployment of the contract. */ export function getCanonicalInstanceDeployer(): ProtocolContract { - return getCanonicalProtocolContract('ContractInstanceDeployer'); + if (!protocolContract) { + protocolContract = makeProtocolContract('ContractInstanceDeployer', ContractInstanceDeployerArtifact); + } + return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/make_protocol_contract.ts b/yarn-project/protocol-contracts/src/make_protocol_contract.ts new file mode 100644 index 00000000000..fdd05e4e4c5 --- /dev/null +++ b/yarn-project/protocol-contracts/src/make_protocol_contract.ts @@ -0,0 +1,23 @@ +import { getContractClassFromArtifact, getContractInstanceFromDeployParams } from '@aztec/circuits.js'; +import { type ContractArtifact } from '@aztec/foundation/abi'; + +import { type ProtocolContract } from './protocol_contract.js'; +import { ProtocolContractAddress, type ProtocolContractName, ProtocolContractSalt } from './protocol_contract_data.js'; + +/** + * Returns the canonical deployment given its name and artifact. + * To be used internally within the protocol-contracts package. + */ +export function makeProtocolContract(name: ProtocolContractName, artifact: ContractArtifact): ProtocolContract { + const address = ProtocolContractAddress[name]; + const salt = ProtocolContractSalt[name]; + // TODO(@spalladino): This computes the contract class from the artifact twice. + const contractClass = getContractClassFromArtifact(artifact); + const instance = getContractInstanceFromDeployParams(artifact, { salt }); + return { + instance: { ...instance, address }, + contractClass, + artifact, + address, + }; +} diff --git a/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts b/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts index 7766894654c..862a32b76a2 100644 --- a/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts +++ b/yarn-project/protocol-contracts/src/multi-call-entrypoint/index.ts @@ -1,5 +1,18 @@ -import { type ProtocolContract, getCanonicalProtocolContract } from '../protocol_contract.js'; +import { loadContractArtifact } from '@aztec/types/abi'; +import { type NoirCompiledContract } from '@aztec/types/noir'; -export function getCanonicalMultiCallEntrypointContract(): ProtocolContract { - return getCanonicalProtocolContract('MultiCallEntrypoint'); +import MultiCallEntrypointJson from '../../artifacts/MultiCallEntrypoint.json' assert { type: 'json' }; +import { makeProtocolContract } from '../make_protocol_contract.js'; +import { type ProtocolContract } from '../protocol_contract.js'; + +export const MultiCallEntrypointArtifact = loadContractArtifact(MultiCallEntrypointJson as NoirCompiledContract); + +let protocolContract: ProtocolContract; + +/** Returns the canonical deployment of the contract. */ +export function getCanonicalMultiCallEntrypoint(): ProtocolContract { + if (!protocolContract) { + protocolContract = makeProtocolContract('MultiCallEntrypoint', MultiCallEntrypointArtifact); + } + return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/protocol_contract.ts b/yarn-project/protocol-contracts/src/protocol_contract.ts index bf3f2dbd805..96e8d69e987 100644 --- a/yarn-project/protocol-contracts/src/protocol_contract.ts +++ b/yarn-project/protocol-contracts/src/protocol_contract.ts @@ -3,17 +3,10 @@ import { type ContractClassIdPreimage, type ContractClassWithId, type ContractInstanceWithAddress, - getContractClassFromArtifact, - getContractInstanceFromDeployParams, } from '@aztec/circuits.js'; import { type ContractArtifact } from '@aztec/foundation/abi'; -import { - ProtocolContractAddress, - ProtocolContractArtifact, - type ProtocolContractName, - ProtocolContractSalt, -} from './protocol_contract_data.js'; +import { ProtocolContractAddress } from './protocol_contract_data.js'; /** Represents a canonical contract in the protocol. */ export interface ProtocolContract { @@ -27,22 +20,6 @@ export interface ProtocolContract { address: AztecAddress; } -/** Returns the canonical deployment a given artifact. */ -export function getCanonicalProtocolContract(name: ProtocolContractName): ProtocolContract { - const artifact = ProtocolContractArtifact[name]; - const address = ProtocolContractAddress[name]; - const salt = ProtocolContractSalt[name]; - // TODO(@spalladino): This computes the contract class from the artifact twice. - const contractClass = getContractClassFromArtifact(artifact); - const instance = getContractInstanceFromDeployParams(artifact, { salt }); - return { - instance: { ...instance, address }, - contractClass, - artifact, - address, - }; -} - export function isProtocolContract(address: AztecAddress) { return Object.values(ProtocolContractAddress).some(a => a.equals(address)); } diff --git a/yarn-project/protocol-contracts/src/router/index.ts b/yarn-project/protocol-contracts/src/router/index.ts index 8ea8e67e12a..a8bf704aa68 100644 --- a/yarn-project/protocol-contracts/src/router/index.ts +++ b/yarn-project/protocol-contracts/src/router/index.ts @@ -1,6 +1,18 @@ -import { type ProtocolContract, getCanonicalProtocolContract } from '../protocol_contract.js'; +import { loadContractArtifact } from '@aztec/types/abi'; +import { type NoirCompiledContract } from '@aztec/types/noir'; -/** Returns the canonical deployment of the router. */ +import RouterJson from '../../artifacts/Router.json' assert { type: 'json' }; +import { makeProtocolContract } from '../make_protocol_contract.js'; +import { type ProtocolContract } from '../protocol_contract.js'; + +export const RouterArtifact = loadContractArtifact(RouterJson as NoirCompiledContract); + +let protocolContract: ProtocolContract; + +/** Returns the canonical deployment of the contract. */ export function getCanonicalRouter(): ProtocolContract { - return getCanonicalProtocolContract('Router'); + if (!protocolContract) { + protocolContract = makeProtocolContract('Router', RouterArtifact); + } + return protocolContract; } diff --git a/yarn-project/protocol-contracts/src/scripts/generate_data.ts b/yarn-project/protocol-contracts/src/scripts/generate_data.ts index e7f1545a3b5..b803b63f8f0 100644 --- a/yarn-project/protocol-contracts/src/scripts/generate_data.ts +++ b/yarn-project/protocol-contracts/src/scripts/generate_data.ts @@ -97,26 +97,6 @@ function generateNames(names: string[]) { `; } -function generateArtifacts(names: string[]) { - const imports = names - .map(name => { - return ` - import ${name}Json from '../artifacts/${name}.json' assert { type: 'json' }; - `; - }) - .join('\n'); - - const exports = names.map(name => `${name}: loadContractArtifact(${name}Json as NoirCompiledContract)`).join(',\n'); - - return ` - ${imports} - - export const ProtocolContractArtifact: Record = { - ${exports} - }; - `; -} - function generateSalts(names: string[]) { return ` export const ProtocolContractSalt: Record = { @@ -137,7 +117,7 @@ function generateContractAddresses(names: string[]) { function generateContractLeaves(names: string[], leaves: Fr[]) { return ` export const ProtocolContractLeaf = { - ${leaves.map((leaf, i) => `${names[i]}: Fr.fromString('${leaf.toString()}')`).join(',\n')} + ${leaves.map((leaf, i) => `${names[i]}: Fr.fromHexString('${leaf.toString()}')`).join(',\n')} }; `; } @@ -145,7 +125,7 @@ function generateContractLeaves(names: string[], leaves: Fr[]) { function generateRoot(names: string[], leaves: Fr[]) { const root = computeRoot(names, leaves); return ` - export const protocolContractTreeRoot = Fr.fromString('${root.toString()}'); + export const protocolContractTreeRoot = Fr.fromHexString('${root.toString()}'); `; } @@ -154,7 +134,7 @@ function generateLogTags() { export const REGISTERER_CONTRACT_CLASS_REGISTERED_TAG = new Fr(${REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE}n); export const REGISTERER_PRIVATE_FUNCTION_BROADCASTED_TAG = new Fr(${REGISTERER_PRIVATE_FUNCTION_BROADCASTED_MAGIC_VALUE}n); export const REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_TAG = new Fr(${REGISTERER_UNCONSTRAINED_FUNCTION_BROADCASTED_MAGIC_VALUE}n); - export const DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_TAG = Fr.fromString('${poseidon2Hash([ + export const DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_TAG = Fr.fromHexString('${poseidon2Hash([ DEPLOYER_CONTRACT_ADDRESS, DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE, ])}'); @@ -165,14 +145,9 @@ async function generateOutputFile(names: string[], leaves: Fr[]) { const content = ` // GENERATED FILE - DO NOT EDIT. RUN \`yarn generate\` or \`yarn generate:data\` import { AztecAddress, Fr } from '@aztec/circuits.js'; - import { type ContractArtifact } from '@aztec/foundation/abi'; - import { loadContractArtifact } from '@aztec/types/abi'; - import { type NoirCompiledContract } from '@aztec/types/noir'; ${generateNames(names)} - ${generateArtifacts(names)} - ${generateSalts(names)} ${generateContractAddresses(names)} diff --git a/yarn-project/protocol-contracts/tsconfig.json b/yarn-project/protocol-contracts/tsconfig.json index 96ab4e32557..db070c81cb1 100644 --- a/yarn-project/protocol-contracts/tsconfig.json +++ b/yarn-project/protocol-contracts/tsconfig.json @@ -16,5 +16,6 @@ "path": "../types" } ], - "include": ["src", "artifacts/*.d.json.ts"] + "include": ["src", "artifacts/*.d.json.ts"], + "exclude": ["src/scripts"] } diff --git a/yarn-project/prover-client/package.json b/yarn-project/prover-client/package.json index 4bf5b869215..9278090708f 100644 --- a/yarn-project/prover-client/package.json +++ b/yarn-project/prover-client/package.json @@ -8,7 +8,8 @@ "./broker": "./dest/proving_broker/index.js", "./prover-agent": "./dest/prover-agent/index.js", "./orchestrator": "./dest/orchestrator/index.js", - "./helpers": "./dest/orchestrator/block-building-helpers.js" + "./helpers": "./dest/orchestrator/block-building-helpers.js", + "./config": "./dest/config.js" }, "typedocOptions": { "entryPoints": [ @@ -28,7 +29,7 @@ "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", "bb": "node --no-warnings ./dest/bb/index.js", - "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=1500000 --forceExit", + "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=3500000 --forceExit", "test:debug": "LOG_LEVEL=debug NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=1500000 --forceExit --testNamePattern prover/bb_prover/parity" }, "jest": { diff --git a/yarn-project/prover-client/package.local.json b/yarn-project/prover-client/package.local.json index 74d761e17a1..a940d68ef7e 100644 --- a/yarn-project/prover-client/package.local.json +++ b/yarn-project/prover-client/package.local.json @@ -1,5 +1,5 @@ { "scripts": { - "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=1500000 --forceExit" + "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --testTimeout=3500000 --forceExit" } } diff --git a/yarn-project/prover-client/src/block_builder/light.test.ts b/yarn-project/prover-client/src/block_builder/light.test.ts index 337492e5ff4..c40b340da4e 100644 --- a/yarn-project/prover-client/src/block_builder/light.test.ts +++ b/yarn-project/prover-client/src/block_builder/light.test.ts @@ -5,13 +5,16 @@ import { type ProcessedTx, type ServerCircuitProver, makeEmptyProcessedTx, + toNumBlobFields, } from '@aztec/circuit-types'; import { makeBloatedProcessedTx } from '@aztec/circuit-types/test'; import { type AppendOnlyTreeSnapshot, + BLOBS_PER_BLOCK, type BaseOrMergeRollupPublicInputs, BaseParityInputs, BlockRootRollupInputs, + FIELDS_PER_BLOB, Fr, type GlobalVariables, L1_TO_L2_MSG_SUBTREE_HEIGHT, @@ -29,6 +32,7 @@ import { type RecursiveProof, RootParityInput, RootParityInputs, + SpongeBlob, TUBE_VK_INDEX, VK_TREE_HEIGHT, type VerificationKeyAsFields, @@ -36,7 +40,9 @@ import { makeEmptyRecursiveProof, } from '@aztec/circuits.js'; import { makeGlobalVariables } from '@aztec/circuits.js/testing'; +import { Blob } from '@aztec/foundation/blob'; import { padArrayEnd, times } from '@aztec/foundation/collection'; +import { sha256ToField } from '@aztec/foundation/crypto'; import { type Logger, createLogger } from '@aztec/foundation/log'; import { type Tuple, assertLength } from '@aztec/foundation/serialize'; import { @@ -194,11 +200,8 @@ describe('LightBlockBuilder', () => { // Builds the block header using the ts block builder const buildHeader = async (txs: ProcessedTx[], l1ToL2Messages: Fr[]) => { - const txCount = Math.max(2, txs.length); - await builder.startNewBlock(txCount, globalVariables, l1ToL2Messages); - for (const tx of txs) { - await builder.addNewTx(tx); - } + await builder.startNewBlock(globalVariables, l1ToL2Messages); + await builder.addTxs(txs); const { header } = await builder.setBlockCompleted(); return header; }; @@ -235,7 +238,7 @@ describe('LightBlockBuilder', () => { const l1ToL2Snapshot = await getL1ToL2Snapshot(l1ToL2Messages); const parityOutput = await getParityOutput(l1ToL2Messages); const messageTreeSnapshot = await getTreeSnapshot(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, expectsFork); - const rootOutput = await getBlockRootOutput(mergeLeft, mergeRight, parityOutput, l1ToL2Snapshot); + const rootOutput = await getBlockRootOutput(mergeLeft, mergeRight, parityOutput, l1ToL2Snapshot, txs); const expectedHeader = buildHeaderFromCircuitOutputs( [mergeLeft, mergeRight], parityOutput, @@ -267,12 +270,13 @@ describe('LightBlockBuilder', () => { const getPrivateBaseRollupOutputs = async (txs: ProcessedTx[]) => { const rollupOutputs = []; + const spongeBlobState = SpongeBlob.init(toNumBlobFields(txs)); for (const tx of txs) { const vkIndex = TUBE_VK_INDEX; const vkPath = getVKSiblingPath(vkIndex); const vkData = new VkWitnessData(TubeVk, vkIndex, vkPath); const tubeData = new PrivateTubeData(tx.data.toKernelCircuitPublicInputs(), emptyProof, vkData); - const hints = await buildBaseRollupHints(tx, globalVariables, expectsFork); + const hints = await buildBaseRollupHints(tx, globalVariables, expectsFork, spongeBlobState); const inputs = new PrivateBaseRollupInputs(tubeData, hints as PrivateBaseRollupHints); const result = await simulator.getPrivateBaseRollupProof(inputs); rollupOutputs.push(result.inputs); @@ -318,6 +322,7 @@ describe('LightBlockBuilder', () => { newL1ToL2MessageTreeRootSiblingPath: Tuple; messageTreeSnapshot: AppendOnlyTreeSnapshot; }, + txs: ProcessedTx[], ) => { const mergeRollupVk = ProtocolCircuitVks['MergeRollupArtifact'].keyAsFields; const mergeRollupVkWitness = getVkMembershipWitness(mergeRollupVk); @@ -328,7 +333,9 @@ describe('LightBlockBuilder', () => { const newArchiveSiblingPath = await getRootTreeSiblingPath(MerkleTreeId.ARCHIVE, expectsFork); const previousBlockHashLeafIndex = BigInt(startArchiveSnapshot.nextAvailableLeafIndex - 1); const previousBlockHash = (await expectsFork.getLeafValue(MerkleTreeId.ARCHIVE, previousBlockHashLeafIndex))!; - + const blobFields = txs.map(tx => tx.txEffect.toBlobFields()).flat(); + const blobs = Blob.getBlobs(blobFields); + const blobsHash = sha256ToField(blobs.map(b => b.getEthVersionedBlobHash())); const rootParityVk = ProtocolCircuitVks['RootParityArtifact'].keyAsFields; const rootParityVkWitness = getVkMembershipWitness(rootParityVk); @@ -349,6 +356,13 @@ describe('LightBlockBuilder', () => { newArchiveSiblingPath, previousBlockHash, proverId: Fr.ZERO, + blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK), + blobCommitments: padArrayEnd( + blobs.map(b => b.commitmentToFields()), + [Fr.ZERO, Fr.ZERO], + BLOBS_PER_BLOCK, + ), + blobsHash, }); const result = await simulator.getBlockRootRollupProof(inputs); diff --git a/yarn-project/prover-client/src/block_builder/light.ts b/yarn-project/prover-client/src/block_builder/light.ts index 02906a42666..9a95b6ef1ca 100644 --- a/yarn-project/prover-client/src/block_builder/light.ts +++ b/yarn-project/prover-client/src/block_builder/light.ts @@ -5,8 +5,9 @@ import { type MerkleTreeWriteOperations, type ProcessedTx, makeEmptyProcessedTx, + toNumBlobFields, } from '@aztec/circuit-types'; -import { Fr, type GlobalVariables, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; +import { Fr, type GlobalVariables, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, SpongeBlob } from '@aztec/circuits.js'; import { padArrayEnd } from '@aztec/foundation/collection'; import { createLogger } from '@aztec/foundation/log'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; @@ -25,37 +26,44 @@ import { */ export class LightweightBlockBuilder implements BlockBuilder { private numTxs?: number; + private spongeBlobState?: SpongeBlob; private globalVariables?: GlobalVariables; private l1ToL2Messages?: Fr[]; - private readonly txs: ProcessedTx[] = []; + private txs: ProcessedTx[] = []; private readonly logger = createLogger('prover-client:block_builder'); constructor(private db: MerkleTreeWriteOperations, private telemetry: TelemetryClient) {} - async startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise { - this.logger.debug('Starting new block', { numTxs, globalVariables: globalVariables.toInspect(), l1ToL2Messages }); - this.numTxs = numTxs; + async startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]): Promise { + this.logger.debug('Starting new block', { globalVariables: globalVariables.toInspect(), l1ToL2Messages }); this.globalVariables = globalVariables; this.l1ToL2Messages = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP); + this.txs = []; + this.numTxs = 0; + this.spongeBlobState = undefined; // Update L1 to L2 tree await this.db.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, this.l1ToL2Messages!); } - async addNewTx(tx: ProcessedTx): Promise { - this.logger.debug(tx.hash.isZero() ? 'Adding padding tx to block' : 'Adding new tx to block', { - txHash: tx.hash.toString(), - }); - this.txs.push(tx); - await buildBaseRollupHints(tx, this.globalVariables!, this.db); + async addTxs(txs: ProcessedTx[]): Promise { + this.numTxs = Math.max(2, txs.length); + this.spongeBlobState = SpongeBlob.init(toNumBlobFields(txs)); + for (const tx of txs) { + this.logger.debug(tx.hash.isZero() ? 'Adding padding tx to block' : 'Adding new tx to block', { + txHash: tx.hash.toString(), + }); + this.txs.push(tx); + await buildBaseRollupHints(tx, this.globalVariables!, this.db, this.spongeBlobState!); + } } async setBlockCompleted(): Promise { const paddingTxCount = this.numTxs! - this.txs.length; for (let i = 0; i < paddingTxCount; i++) { - await this.addNewTx( + await this.addTxs([ makeEmptyProcessedTx( this.db.getInitialHeader(), this.globalVariables!.chainId, @@ -63,7 +71,7 @@ export class LightweightBlockBuilder implements BlockBuilder { getVKTreeRoot(), protocolContractTreeRoot, ), - ); + ]); } return this.buildBlock(); @@ -112,9 +120,7 @@ export async function buildBlock( telemetry: TelemetryClient = new NoopTelemetryClient(), ) { const builder = new LightweightBlockBuilder(db, telemetry); - await builder.startNewBlock(Math.max(txs.length, 2), globalVariables, l1ToL2Messages); - for (const tx of txs) { - await builder.addNewTx(tx); - } + await builder.startNewBlock(globalVariables, l1ToL2Messages); + await builder.addTxs(txs); return await builder.setBlockCompleted(); } diff --git a/yarn-project/prover-client/src/index.ts b/yarn-project/prover-client/src/index.ts index 822b565f54a..60feee5fa19 100644 --- a/yarn-project/prover-client/src/index.ts +++ b/yarn-project/prover-client/src/index.ts @@ -2,4 +2,3 @@ export { EpochProverManager } from '@aztec/circuit-types'; export * from './prover-client/index.js'; export * from './config.js'; -export * from './proving_broker/prover_cache/memory.js'; diff --git a/yarn-project/prover-client/src/mocks/test_context.ts b/yarn-project/prover-client/src/mocks/test_context.ts index 52181faf594..803b8d8300e 100644 --- a/yarn-project/prover-client/src/mocks/test_context.ts +++ b/yarn-project/prover-client/src/mocks/test_context.ts @@ -2,14 +2,19 @@ import { type BBProverConfig } from '@aztec/bb-prover'; import { type L2Block, type ProcessedTx, - type ProcessedTxHandler, type PublicExecutionRequest, type ServerCircuitProver, type Tx, type TxValidator, } from '@aztec/circuit-types'; import { makeBloatedProcessedTx } from '@aztec/circuit-types/test'; -import { type AppendOnlyTreeSnapshot, BlockHeader, type Gas, type GlobalVariables } from '@aztec/circuits.js'; +import { + type AppendOnlyTreeSnapshot, + BlockHeader, + type Gas, + type GlobalVariables, + TreeSnapshots, +} from '@aztec/circuits.js'; import { times } from '@aztec/foundation/collection'; import { Fr } from '@aztec/foundation/fields'; import { type Logger } from '@aztec/foundation/log'; @@ -37,7 +42,7 @@ import { buildBlock } from '../block_builder/light.js'; import { ProvingOrchestrator } from '../orchestrator/index.js'; import { MemoryProvingQueue } from '../prover-agent/memory-proving-queue.js'; import { ProverAgent } from '../prover-agent/prover-agent.js'; -import { getEnvironmentConfig, getSimulationProvider, makeGlobals } from './fixtures.js'; +import { getEnvironmentConfig, getSimulationProvider, makeGlobals, updateExpectedTreesFromTxs } from './fixtures.js'; export class TestContext { private headers: Map = new Map(); @@ -79,7 +84,7 @@ export class TestContext { worldStateDB.getMerkleInterface.mockReturnValue(publicDb); - const publicTxSimulator = new PublicTxSimulator(publicDb, worldStateDB, telemetry, globalVariables); + const publicTxSimulator = new PublicTxSimulator(publicDb, worldStateDB, telemetry, globalVariables, true); const processor = new PublicProcessor( publicDb, globalVariables, @@ -114,7 +119,7 @@ export class TestContext { const queue = new MemoryProvingQueue(telemetry); const orchestrator = new TestProvingOrchestrator(ws, queue, telemetry, Fr.ZERO); - const agent = new ProverAgent(localProver, proverCount); + const agent = new ProverAgent(localProver, proverCount, undefined, telemetry); queue.start(); agent.start(queue); @@ -180,6 +185,7 @@ export class TestContext { const txs = times(numTxs, i => this.makeProcessedTx({ seed: i + blockNum * 1000, globalVariables, ...makeProcessedTxOpts(i) }), ); + await this.setEndTreeRoots(txs); const block = await buildBlock(txs, globalVariables, msgs, db); this.headers.set(blockNum, block.header); @@ -187,12 +193,7 @@ export class TestContext { return { block, txs, msgs }; } - public async processPublicFunctions( - txs: Tx[], - maxTransactions: number, - txHandler?: ProcessedTxHandler, - txValidator?: TxValidator, - ) { + public async processPublicFunctions(txs: Tx[], maxTransactions: number, txValidator?: TxValidator) { const defaultExecutorImplementation = ( _stateManager: AvmPersistableStateManager, executionRequest: PublicExecutionRequest, @@ -217,16 +218,30 @@ export class TestContext { return await this.processPublicFunctionsWithMockExecutorImplementation( txs, maxTransactions, - txHandler, txValidator, defaultExecutorImplementation, ); } + public async setEndTreeRoots(txs: ProcessedTx[]) { + const db = await this.worldState.fork(); + for (const tx of txs) { + await updateExpectedTreesFromTxs(db, [tx]); + const stateReference = await db.getStateReference(); + if (tx.avmProvingRequest) { + tx.avmProvingRequest.inputs.output.endTreeSnapshots = new TreeSnapshots( + stateReference.l1ToL2MessageTree, + stateReference.partial.noteHashTree, + stateReference.partial.nullifierTree, + stateReference.partial.publicDataTree, + ); + } + } + } + private async processPublicFunctionsWithMockExecutorImplementation( txs: Tx[], maxTransactions: number, - txHandler?: ProcessedTxHandler, txValidator?: TxValidator, executorMock?: ( stateManager: AvmPersistableStateManager, @@ -254,7 +269,7 @@ export class TestContext { if (executorMock) { simulateInternal.mockImplementation(executorMock); } - return await this.publicProcessor.process(txs, maxTransactions, txHandler, txValidator); + return await this.publicProcessor.process(txs, maxTransactions, txValidator); } } diff --git a/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts b/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts index d6c913125ca..c0271c4a56b 100644 --- a/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts +++ b/yarn-project/prover-client/src/orchestrator/block-building-helpers.ts @@ -45,15 +45,17 @@ import { PublicDataTreeLeafPreimage, type RecursiveProof, RootRollupInputs, + type SpongeBlob, StateReference, VK_TREE_HEIGHT, type VerificationKeyAsFields, } from '@aztec/circuits.js'; import { makeTuple } from '@aztec/foundation/array'; +import { Blob } from '@aztec/foundation/blob'; import { padArrayEnd } from '@aztec/foundation/collection'; import { sha256Trunc } from '@aztec/foundation/crypto'; import { type Logger } from '@aztec/foundation/log'; -import { type Tuple, assertLength, toFriendlyJSON } from '@aztec/foundation/serialize'; +import { type Tuple, assertLength, serializeToBuffer, toFriendlyJSON } from '@aztec/foundation/serialize'; import { computeUnbalancedMerkleRoot } from '@aztec/foundation/trees'; import { getVKIndex, getVKSiblingPath, getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; import { protocolContractTreeRoot } from '@aztec/protocol-contracts'; @@ -76,6 +78,7 @@ export async function buildBaseRollupHints( tx: ProcessedTx, globalVariables: GlobalVariables, db: MerkleTreeWriteOperations, + startSpongeBlob: SpongeBlob, ) { // Get trees info before any changes hit const constants = await getConstantRollupData(globalVariables, db); @@ -132,6 +135,10 @@ export async function buildBaseRollupHints( i < nullifierSubtreeSiblingPathArray.length ? nullifierSubtreeSiblingPathArray[i] : Fr.ZERO, ); + // Append new data to startSpongeBlob + const inputSpongeBlob = startSpongeBlob.clone(); + startSpongeBlob.absorb(tx.txEffect.toBlobFields()); + if (tx.avmProvingRequest) { // Build public base rollup hints const stateDiffHints = PublicBaseStateDiffHints.from({ @@ -176,6 +183,7 @@ export async function buildBaseRollupHints( return PublicBaseRollupHints.from({ start, + startSpongeBlob: inputSpongeBlob, stateDiffHints, archiveRootMembershipWitness, constants, @@ -235,6 +243,7 @@ export async function buildBaseRollupHints( return PrivateBaseRollupHints.from({ start, + startSpongeBlob: inputSpongeBlob, stateDiffHints, feePayerFeeJuiceBalanceReadHint: feePayerFeeJuiceBalanceReadHint, archiveRootMembershipWitness, @@ -300,11 +309,10 @@ export function buildHeaderFromCircuitOutputs( updatedL1ToL2TreeSnapshot: AppendOnlyTreeSnapshot, logger?: Logger, ) { + const blobsHash = rootRollupOutputs.blobPublicInputs[0].getBlobsHash(); const contentCommitment = new ContentCommitment( new Fr(previousMergeData[0].numTxs + previousMergeData[1].numTxs), - sha256Trunc( - Buffer.concat([previousMergeData[0].txsEffectsHash.toBuffer(), previousMergeData[1].txsEffectsHash.toBuffer()]), - ), + blobsHash, parityPublicInputs.shaRoot.toBuffer(), sha256Trunc(Buffer.concat([previousMergeData[0].outHash.toBuffer(), previousMergeData[1].outHash.toBuffer()])), ); @@ -359,10 +367,11 @@ export async function buildHeaderAndBodyFromTxs( const parityShaRoot = new MerkleTreeCalculator(parityHeight, Fr.ZERO.toBuffer(), hasher).computeTreeRoot( l1ToL2Messages.map(msg => msg.toBuffer()), ); + const blobsHash = getBlobsHashFromBlobs(Blob.getBlobs(body.toBlobFields())); const contentCommitment = new ContentCommitment( new Fr(body.numberOfTxsIncludingPadded), - body.getTxsEffectsHash(), + blobsHash, parityShaRoot, outHash, ); @@ -375,6 +384,11 @@ export async function buildHeaderAndBodyFromTxs( return { header, body }; } +export function getBlobsHashFromBlobs(inputs: Blob[]): Buffer { + const blobHashes = serializeToBuffer(inputs.map(b => b.getEthVersionedBlobHash())); + return sha256Trunc(serializeToBuffer(blobHashes)); +} + // Validate that the roots of all local trees match the output of the root circuit simulation export async function validateBlockRootOutput( blockRootOutput: BlockRootOrBlockMergePublicInputs, @@ -547,7 +561,7 @@ export async function getMembershipWitnessFor( return makeEmptyMembershipWitness(height); } - const index = await db.findLeafIndex(treeId, value.toBuffer()); + const index = (await db.findLeafIndices(treeId, [value.toBuffer()]))[0]; if (index === undefined) { throw new Error(`Leaf with value ${value} not found in tree ${MerkleTreeId[treeId]}`); } diff --git a/yarn-project/prover-client/src/orchestrator/block-proving-state.ts b/yarn-project/prover-client/src/orchestrator/block-proving-state.ts index 450715d8c06..0c22fe718f5 100644 --- a/yarn-project/prover-client/src/orchestrator/block-proving-state.ts +++ b/yarn-project/prover-client/src/orchestrator/block-proving-state.ts @@ -14,6 +14,7 @@ import { type RECURSIVE_PROOF_LENGTH, type RecursiveProof, type RootParityInput, + SpongeBlob, type VerificationKeyAsFields, } from '@aztec/circuits.js'; import { type Tuple } from '@aztec/foundation/serialize'; @@ -44,12 +45,13 @@ export class BlockProvingState { public blockRootRollupStarted: boolean = false; public finalProof: Proof | undefined; public block: L2Block | undefined; + public spongeBlobState: SpongeBlob | undefined; + public totalNumTxs: number; private txs: TxProvingState[] = []; public error: string | undefined; constructor( public readonly index: number, - public readonly totalNumTxs: number, public readonly globalVariables: GlobalVariables, public readonly newL1ToL2Messages: Tuple, public readonly messageTreeSnapshot: AppendOnlyTreeSnapshot, @@ -61,6 +63,7 @@ export class BlockProvingState { private readonly parentEpoch: EpochProvingState, ) { this.rootParityInputs = Array.from({ length: NUM_BASE_PARITY_PER_ROOT_PARITY }).map(_ => undefined); + this.totalNumTxs = 0; } public get blockNumber() { @@ -98,8 +101,21 @@ export class BlockProvingState { return [mergeLevel - 1n, thisIndex >> 1n, thisIndex & 1n]; } + public startNewBlock(numTxs: number, numBlobFields: number) { + if (this.spongeBlobState) { + throw new Error(`Block ${this.blockNumber} already initalised.`); + } + // Initialise the sponge which will eventually absorb all tx effects to be added to the blob. + // Like l1 to l2 messages, we need to know beforehand how many effects will be absorbed. + this.spongeBlobState = SpongeBlob.init(numBlobFields); + this.totalNumTxs = numTxs; + } + // Adds a transaction to the proving state, returns it's index public addNewTx(tx: TxProvingState) { + if (!this.spongeBlobState) { + throw new Error(`Invalid block proving state, call startNewBlock before adding transactions.`); + } this.txs.push(tx); return this.txs.length - 1; } @@ -199,11 +215,6 @@ export class BlockProvingState { return this.rootParityInputs.findIndex(p => !p) === -1; } - // Returns true if we are still able to accept transactions, false otherwise - public isAcceptingTransactions() { - return this.totalNumTxs > this.txs.length; - } - // Returns whether the proving state is still valid public verifyState() { return this.parentEpoch.verifyState(); diff --git a/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts b/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts index 97ae9e361e9..b4005052c53 100644 --- a/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts +++ b/yarn-project/prover-client/src/orchestrator/epoch-proving-state.ts @@ -97,7 +97,6 @@ export class EpochProvingState { // Adds a block to the proving state, returns its index // Will update the proving life cycle if this is the last block public startNewBlock( - numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[], messageTreeSnapshot: AppendOnlyTreeSnapshot, @@ -110,7 +109,6 @@ export class EpochProvingState { const index = globalVariables.blockNumber.toNumber() - this.firstBlockNumber; const block = new BlockProvingState( index, - numTxs, globalVariables, padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP), messageTreeSnapshot, diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator.ts b/yarn-project/prover-client/src/orchestrator/orchestrator.ts index 9545f30a559..30a4312f97e 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator.ts @@ -4,6 +4,7 @@ import { type ProcessedTx, type ServerCircuitProver, makeEmptyProcessedTx, + toNumBlobFields, } from '@aztec/circuit-types'; import { type EpochProver, @@ -16,13 +17,16 @@ import { AVM_PROOF_LENGTH_IN_FIELDS, AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS, type AppendOnlyTreeSnapshot, + BLOBS_PER_BLOCK, type BaseOrMergeRollupPublicInputs, BaseParityInputs, type BaseRollupHints, + BlobPublicInputs, type BlockHeader, type BlockRootOrBlockMergePublicInputs, BlockRootRollupInputs, EmptyBlockRootRollupInputs, + FIELDS_PER_BLOB, Fr, type GlobalVariables, L1_TO_L2_MSG_SUBTREE_HEIGHT, @@ -40,7 +44,9 @@ import { makeEmptyRecursiveProof, } from '@aztec/circuits.js'; import { makeTuple } from '@aztec/foundation/array'; +import { Blob } from '@aztec/foundation/blob'; import { maxBy, padArrayEnd } from '@aztec/foundation/collection'; +import { sha256ToField } from '@aztec/foundation/crypto'; import { AbortError } from '@aztec/foundation/error'; import { createLogger } from '@aztec/foundation/log'; import { promiseWithResolvers } from '@aztec/foundation/promise'; @@ -139,17 +145,14 @@ export class ProvingOrchestrator implements EpochProver { /** * Starts off a new block - * @param numTxs - The total number of transactions in the block. * @param globalVariables - The global variables for the block * @param l1ToL2Messages - The l1 to l2 messages for the block - * @param verificationKeys - The private kernel verification keys * @returns A proving ticket, containing a promise notifying of proving completion */ - @trackSpan('ProvingOrchestrator.startNewBlock', (numTxs, globalVariables) => ({ - [Attributes.BLOCK_SIZE]: numTxs, + @trackSpan('ProvingOrchestrator.startNewBlock', globalVariables => ({ [Attributes.BLOCK_NUMBER]: globalVariables.blockNumber.toNumber(), })) - public async startNewBlock(numTxs: number, globalVariables: GlobalVariables, l1ToL2Messages: Fr[]) { + public async startNewBlock(globalVariables: GlobalVariables, l1ToL2Messages: Fr[]) { if (!this.provingState) { throw new Error(`Invalid proving state, call startNewEpoch before starting a block`); } @@ -158,12 +161,8 @@ export class ProvingOrchestrator implements EpochProver { throw new Error(`Epoch not accepting further blocks`); } - if (!Number.isInteger(numTxs) || numTxs < 2) { - throw new Error(`Invalid number of txs for block (got ${numTxs})`); - } - logger.info( - `Starting block ${globalVariables.blockNumber.toNumber()} for slot ${globalVariables.slotNumber.toNumber()} with ${numTxs} transactions`, + `Starting block ${globalVariables.blockNumber.toNumber()} for slot ${globalVariables.slotNumber.toNumber()}`, ); // Fork world state at the end of the immediately previous block @@ -210,7 +209,6 @@ export class ProvingOrchestrator implements EpochProver { ); const blockProvingState = this.provingState!.startNewBlock( - numTxs, globalVariables, l1ToL2MessagesPadded, messageTreeSnapshot, @@ -228,47 +226,56 @@ export class ProvingOrchestrator implements EpochProver { } /** - * The interface to add a simulated transaction to the scheduler - * @param tx - The transaction to be proven + * The interface to add simulated transactions to the scheduler + * @param txs - The transactions to be proven */ - @trackSpan('ProvingOrchestrator.addNewTx', tx => ({ - [Attributes.TX_HASH]: tx.hash.toString(), + @trackSpan('ProvingOrchestrator.addTxs', txs => ({ + [Attributes.BLOCK_TXS_COUNT]: txs.length, })) - public async addNewTx(tx: ProcessedTx): Promise { - const blockNumber = tx.constants.globalVariables.blockNumber.toNumber(); - try { - const provingState = this.provingState?.getBlockProvingStateByBlockNumber(blockNumber); - if (!provingState) { - throw new Error(`Block proving state for ${blockNumber} not found`); - } - - if (!provingState.isAcceptingTransactions()) { - throw new Error(`Rollup not accepting further transactions`); - } + public async addTxs(txs: ProcessedTx[]): Promise { + if (!txs.length) { + // To avoid an ugly throw below. If we require an empty block, we can just call setBlockCompleted + // on a block with no txs. We cannot do that here because we cannot find the blockNumber without any txs. + logger.warn(`Provided no txs to orchestrator addTxs.`); + return; + } + const blockNumber = txs[0].constants.globalVariables.blockNumber.toNumber(); + const provingState = this.provingState?.getBlockProvingStateByBlockNumber(blockNumber!); + if (!provingState) { + throw new Error(`Block proving state for ${blockNumber} not found`); + } - if (!provingState.verifyState()) { - throw new Error(`Invalid proving state when adding a tx`); - } + const numBlobFields = toNumBlobFields(txs); + provingState.startNewBlock(Math.max(2, txs.length), numBlobFields); - validateTx(tx); + logger.info( + `Adding ${txs.length} transactions with ${numBlobFields} blob fields to block ${provingState?.blockNumber}`, + ); + for (const tx of txs) { + try { + if (!provingState.verifyState()) { + throw new Error(`Invalid proving state when adding a tx`); + } - logger.info(`Received transaction: ${tx.hash}`); + validateTx(tx); - if (tx.isEmpty) { - logger.warn(`Ignoring empty transaction ${tx.hash} - it will not be added to this block`); - return; - } + logger.info(`Received transaction: ${tx.hash}`); - const [hints, treeSnapshots] = await this.prepareTransaction(tx, provingState); - this.enqueueFirstProofs(hints, treeSnapshots, tx, provingState); + if (tx.isEmpty) { + logger.warn(`Ignoring empty transaction ${tx.hash} - it will not be added to this block`); + continue; + } - if (provingState.transactionsReceived === provingState.totalNumTxs) { - logger.verbose(`All transactions received for block ${provingState.globalVariables.blockNumber}.`); + const [hints, treeSnapshots] = await this.prepareTransaction(tx, provingState); + this.enqueueFirstProofs(hints, treeSnapshots, tx, provingState); + } catch (err: any) { + throw new Error(`Error adding transaction ${tx.hash.toString()} to block ${blockNumber}: ${err.message}`, { + cause: err, + }); } - } catch (err: any) { - throw new Error(`Error adding transaction ${tx.hash.toString()} to block ${blockNumber}: ${err.message}`, { - cause: err, - }); + } + if (provingState.transactionsReceived === provingState.totalNumTxs) { + logger.verbose(`All transactions received for block ${provingState.globalVariables.blockNumber}.`); } } @@ -285,6 +292,12 @@ export class ProvingOrchestrator implements EpochProver { throw new Error(`Block proving state for ${blockNumber} not found`); } + if (!provingState.spongeBlobState) { + // If we are completing an empty block, initialise the provingState. + // We will have 2 padding txs, and => no blob fields. + provingState.startNewBlock(2, 0); + } + if (!provingState.verifyState()) { throw new Error(`Block proving failed: ${provingState.error}`); } @@ -326,7 +339,7 @@ export class ProvingOrchestrator implements EpochProver { } // And build the block header - logger.verbose(`Block ${provingState.globalVariables.blockNumber} completed. Assembling header.`); + logger.verbose(`Block ${blockNumber} completed. Assembling header.`); await this.buildBlock(provingState, expectedHeader); // If the proofs were faster than the block building, then we need to try the block root rollup again here @@ -435,14 +448,6 @@ export class ProvingOrchestrator implements EpochProver { const newArchive = await getTreeSnapshot(MerkleTreeId.ARCHIVE, db); const l2Block = new L2Block(newArchive, header, body); - if (!l2Block.body.getTxsEffectsHash().equals(header.contentCommitment.txsEffectsHash)) { - throw new Error( - `Txs effects hash mismatch, ${l2Block.body - .getTxsEffectsHash() - .toString('hex')} == ${header.contentCommitment.txsEffectsHash.toString('hex')} `, - ); - } - await this.verifyBuiltBlockAgainstSyncedState(l2Block, newArchive); logger.verbose(`Orchestrator finalised block ${l2Block.number}`); @@ -566,6 +571,22 @@ export class ProvingOrchestrator implements EpochProver { ); } + /** + * Collect all new nullifiers, commitments, and contracts from all txs in a block + * @returns The array of non empty tx effects. + */ + private extractTxEffects(provingState: BlockProvingState) { + // Note: this check should ensure that we have all txs and their effects ready. + if (!provingState.finalRootParityInput?.publicInputs.shaRoot) { + throw new Error(`Invalid proving state, a block must be ready to be proven before its effects can be extracted.`); + } + const nonEmptyTxEffects = provingState.allTxs + .map(txProvingState => txProvingState.processedTx.txEffect) + .filter(txEffect => !txEffect.isEmpty()); + + return nonEmptyTxEffects; + } + /** * Returns the proof for the current epoch. */ @@ -692,7 +713,7 @@ export class ProvingOrchestrator implements EpochProver { provingState: BlockProvingState | undefined, tx: ProcessedTx, ): Promise<[BaseRollupHints, TreeSnapshots] | undefined> { - if (!provingState?.verifyState()) { + if (!provingState?.verifyState() || !provingState.spongeBlobState) { logger.debug('Not preparing base rollup inputs, state invalid'); return; } @@ -701,7 +722,9 @@ export class ProvingOrchestrator implements EpochProver { // We build the base rollup inputs using a mock proof and verification key. // These will be overwritten later once we have proven the tube circuit and any public kernels - const [ms, hints] = await elapsed(buildBaseRollupHints(tx, provingState.globalVariables, db)); + const [ms, hints] = await elapsed( + buildBaseRollupHints(tx, provingState.globalVariables, db, provingState.spongeBlobState), + ); if (!tx.isEmpty) { this.metrics.recordBaseRollupInputs(ms); @@ -774,7 +797,7 @@ export class ProvingOrchestrator implements EpochProver { ); } - // Enqueues the tub circuit for a given transaction index + // Enqueues the tube circuit for a given transaction index // Once completed, will enqueue the next circuit, either a public kernel or the base rollup private enqueueTube(provingState: BlockProvingState, txIndex: number) { if (!provingState?.verifyState()) { @@ -856,9 +879,14 @@ export class ProvingOrchestrator implements EpochProver { provingState.blockRootRollupStarted = true; const mergeInputData = provingState.getMergeInputs(0); const rootParityInput = provingState.finalRootParityInput!; + const blobFields = this.extractTxEffects(provingState) + .map(tx => tx.toBlobFields()) + .flat(); + const blobs = Blob.getBlobs(blobFields); + const blobsHash = sha256ToField(blobs.map(b => b.getEthVersionedBlobHash())); logger.debug( - `Enqueuing block root rollup for block ${provingState.blockNumber} with ${provingState.newL1ToL2Messages.length} l1 to l2 msgs`, + `Enqueuing block root rollup for block ${provingState.blockNumber} with ${provingState.newL1ToL2Messages.length} l1 to l2 msgs and ${blobs.length} blobs.`, ); const previousRollupData: BlockRootRollupInputs['previousRollupData'] = makeTuple(2, i => @@ -879,6 +907,13 @@ export class ProvingOrchestrator implements EpochProver { newArchiveSiblingPath: provingState.archiveTreeRootSiblingPath, previousBlockHash: provingState.previousBlockHash, proverId: this.proverId, + blobFields: padArrayEnd(blobFields, Fr.ZERO, FIELDS_PER_BLOB * BLOBS_PER_BLOCK), + blobCommitments: padArrayEnd( + blobs.map(b => b.commitmentToFields()), + [Fr.ZERO, Fr.ZERO], + BLOBS_PER_BLOCK, + ), + blobsHash: blobsHash, }); this.deferredProving( @@ -903,6 +938,17 @@ export class ProvingOrchestrator implements EpochProver { provingState.blockRootRollupPublicInputs = result.inputs; provingState.finalProof = result.proof.binaryProof; + const blobOutputs = result.inputs.blobPublicInputs[0]; + blobOutputs.inner.forEach((blobOutput, i) => { + if (!blobOutput.isEmpty() && !blobOutput.equals(BlobPublicInputs.fromBlob(blobs[i]))) { + throw new Error( + `Rollup circuits produced mismatched blob evaluation: + z: ${blobOutput.z} == ${blobs[i].challengeZ}, + y: ${blobOutput.y.toString(16)} == ${blobs[i].evaluationY.toString('hex')}, + C: ${blobOutput.kzgCommitment} == ${blobs[i].commitmentToFields()}`, + ); + } + }); logger.debug(`Completed proof for block root rollup for ${provingState.block?.number}`); // validatePartialState(result.inputs.end, tx.treeSnapshots); // TODO(palla/prover) @@ -1196,10 +1242,13 @@ export class ProvingOrchestrator implements EpochProver { return await this.prover.getAvmProof(inputs, signal, provingState.epochNumber); } catch (err) { if (process.env.AVM_PROVING_STRICT) { + logger.error(`Error thrown when proving AVM circuit with AVM_PROVING_STRICT on`, err); throw err; } else { logger.warn( - `Error thrown when proving AVM circuit, but AVM_PROVING_STRICT is off, so faking AVM proof and carrying on. Error: ${err}.`, + `Error thrown when proving AVM circuit but AVM_PROVING_STRICT is off. Faking AVM proof and carrying on. ${inspect( + err, + )}.`, ); return { proof: makeEmptyRecursiveProof(AVM_PROOF_LENGTH_IN_FIELDS), diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts index a9691584743..296c46f45d7 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_errors.test.ts @@ -25,16 +25,14 @@ describe('prover/orchestrator/errors', () => { describe('errors', () => { it('throws if adding too many transactions', async () => { const txs = times(4, i => context.makeProcessedTx(i + 1)); + await context.setEndTreeRoots(txs); orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(txs.length, context.globalVariables, []); + await orchestrator.startNewBlock(context.globalVariables, []); + await orchestrator.addTxs(txs); - for (const tx of txs) { - await orchestrator.addNewTx(tx); - } - - await expect(async () => await orchestrator.addNewTx(context.makeProcessedTx())).rejects.toThrow( - /Rollup not accepting further transactions/, + await expect(async () => await orchestrator.addTxs([context.makeProcessedTx()])).rejects.toThrow( + `Block ${context.blockNumber} already initalised.`, ); const block = await orchestrator.setBlockCompleted(context.blockNumber); @@ -44,23 +42,23 @@ describe('prover/orchestrator/errors', () => { it('throws if adding too many blocks', async () => { orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(2, context.globalVariables, []); + await orchestrator.startNewBlock(context.globalVariables, []); await orchestrator.setBlockCompleted(context.blockNumber); - await expect(async () => await orchestrator.startNewBlock(2, context.globalVariables, [])).rejects.toThrow( + await expect(async () => await orchestrator.startNewBlock(context.globalVariables, [])).rejects.toThrow( 'Epoch not accepting further blocks', ); }); it('throws if adding a transaction before starting epoch', async () => { - await expect(async () => await orchestrator.addNewTx(context.makeProcessedTx())).rejects.toThrow( + await expect(async () => await orchestrator.addTxs([context.makeProcessedTx()])).rejects.toThrow( /Block proving state for 1 not found/, ); }); it('throws if adding a transaction before starting block', async () => { orchestrator.startNewEpoch(1, 1, 1); - await expect(async () => await orchestrator.addNewTx(context.makeProcessedTx())).rejects.toThrow( + await expect(async () => await orchestrator.addTxs([context.makeProcessedTx()])).rejects.toThrow( /Block proving state for 1 not found/, ); }); @@ -72,34 +70,16 @@ describe('prover/orchestrator/errors', () => { ); }); - it('throws if setting an incomplete block as completed', async () => { - orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(3, context.globalVariables, []); - await expect(async () => await orchestrator.setBlockCompleted(context.blockNumber)).rejects.toThrow( - `Block not ready for completion: expecting ${3} more transactions.`, - ); - }); - it('throws if adding to a cancelled block', async () => { orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(2, context.globalVariables, []); + await orchestrator.startNewBlock(context.globalVariables, []); orchestrator.cancel(); - await expect(async () => await orchestrator.addNewTx(context.makeProcessedTx())).rejects.toThrow( + await expect(async () => await context.orchestrator.addTxs([context.makeProcessedTx()])).rejects.toThrow( 'Invalid proving state when adding a tx', ); }); - it.each([[-4], [0], [1], [8.1]] as const)( - 'fails to start a block with %i transactions', - async (blockSize: number) => { - orchestrator.startNewEpoch(1, 1, 1); - await expect( - async () => await orchestrator.startNewBlock(blockSize, context.globalVariables, []), - ).rejects.toThrow(`Invalid number of txs for block (got ${blockSize})`); - }, - ); - it.each([[-4], [0], [8.1]] as const)('fails to start an epoch with %i blocks', (epochSize: number) => { orchestrator.startNewEpoch(1, 1, 1); expect(() => orchestrator.startNewEpoch(1, 1, epochSize)).toThrow( @@ -111,7 +91,7 @@ describe('prover/orchestrator/errors', () => { const l1ToL2Messages = new Array(100).fill(new Fr(0n)); orchestrator.startNewEpoch(1, 1, 1); await expect( - async () => await orchestrator.startNewBlock(2, context.globalVariables, l1ToL2Messages), + async () => await orchestrator.startNewBlock(context.globalVariables, l1ToL2Messages), ).rejects.toThrow('Too many L1 to L2 messages'); }); }); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts index 5b6f59c1f0d..bf758abd286 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_failures.test.ts @@ -42,15 +42,13 @@ describe('prover/orchestrator/failures', () => { for (const { block, txs, msgs } of blocks) { // these operations could fail if the target circuit fails before adding all blocks or txs try { - await orchestrator.startNewBlock(txs.length, block.header.globalVariables, msgs); + await orchestrator.startNewBlock(block.header.globalVariables, msgs); let allTxsAdded = true; - for (const tx of txs) { - try { - await orchestrator.addNewTx(tx); - } catch (err) { - allTxsAdded = false; - break; - } + try { + await orchestrator.addTxs(txs); + } catch (err) { + allTxsAdded = false; + break; } if (!allTxsAdded) { diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts index 89b0e58fdd0..29537740bfb 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_lifecycle.test.ts @@ -38,7 +38,7 @@ describe('prover/orchestrator/lifecycle', () => { }); orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(2, context.globalVariables, []); + await orchestrator.startNewBlock(context.globalVariables, []); await sleep(1); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_metrics.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_metrics.ts index 08811291d82..749f4648706 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_metrics.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_metrics.ts @@ -1,11 +1,4 @@ -import { - type Histogram, - Metrics, - type TelemetryClient, - type Tracer, - ValueType, - millisecondBuckets, -} from '@aztec/telemetry-client'; +import { type Histogram, Metrics, type TelemetryClient, type Tracer, ValueType } from '@aztec/telemetry-client'; export class ProvingOrchestratorMetrics { public readonly tracer: Tracer; @@ -20,9 +13,6 @@ export class ProvingOrchestratorMetrics { unit: 'ms', description: 'Duration to build base rollup inputs', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(1), // 10ms -> ~327s - }, }); } diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts index c22e9ce1df6..ba6f5a45048 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_mixed_blocks.test.ts @@ -22,14 +22,13 @@ describe('prover/orchestrator/mixed-blocks', () => { describe('blocks', () => { it('builds an unbalanced L2 block', async () => { const txs = times(3, i => context.makeProcessedTx(i + 1)); + await context.setEndTreeRoots(txs); const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(3, context.globalVariables, l1ToL2Messages); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.startNewBlock(context.globalVariables, l1ToL2Messages); + await context.orchestrator.addTxs(txs); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); @@ -38,15 +37,14 @@ describe('prover/orchestrator/mixed-blocks', () => { it.each([2, 4, 5, 8] as const)('builds an L2 block with %i bloated txs', async (totalCount: number) => { const txs = times(totalCount, i => context.makeProcessedTx(i + 1)); + await context.setEndTreeRoots(txs); const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(txs.length, context.globalVariables, l1ToL2Messages); + await context.orchestrator.startNewBlock(context.globalVariables, l1ToL2Messages); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.addTxs(txs); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts index b0f1151e34e..768bf80046e 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_multi_public_functions.test.ts @@ -1,4 +1,4 @@ -import { EmptyTxValidator, mockTx } from '@aztec/circuit-types'; +import { mockTx } from '@aztec/circuit-types'; import { times } from '@aztec/foundation/collection'; import { createLogger } from '@aztec/foundation/log'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; @@ -41,20 +41,13 @@ describe('prover/orchestrator/public-functions', () => { } context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(numTransactions, context.globalVariables, []); + await context.orchestrator.startNewBlock(context.globalVariables, []); - const [processed, failed] = await context.processPublicFunctions( - txs, - numTransactions, - undefined, - new EmptyTxValidator(), - ); + const [processed, failed] = await context.processPublicFunctions(txs, numTransactions); expect(processed.length).toBe(numTransactions); expect(failed.length).toBe(0); - for (const tx of processed) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.addTxs(processed); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts index 4b20b74480f..4ad9959fdca 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_multiple_blocks.test.ts @@ -26,10 +26,8 @@ describe('prover/orchestrator/multi-block', () => { logger.info(`Starting new epoch with ${numBlocks}`); context.orchestrator.startNewEpoch(1, 1, numBlocks); for (const { block, txs } of blocks) { - await context.orchestrator.startNewBlock(Math.max(txCount, 2), block.header.globalVariables, []); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.startNewBlock(block.header.globalVariables, []); + await context.orchestrator.addTxs(txs); await context.orchestrator.setBlockCompleted(block.number); } @@ -48,10 +46,8 @@ describe('prover/orchestrator/multi-block', () => { context.orchestrator.startNewEpoch(1, 1, numBlocks); await Promise.all( blocks.map(async ({ block, txs }) => { - await context.orchestrator.startNewBlock(Math.max(txCount, 2), block.header.globalVariables, []); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.startNewBlock(block.header.globalVariables, []); + await context.orchestrator.addTxs(txs); await context.orchestrator.setBlockCompleted(block.number); }), ); @@ -74,10 +70,8 @@ describe('prover/orchestrator/multi-block', () => { context.orchestrator.startNewEpoch(epochIndex + 1, epochIndex * numBlocks + 1, numBlocks); await Promise.all( blocks.slice(epochIndex * numBlocks, (epochIndex + 1) * numBlocks).map(async ({ block, txs }) => { - await context.orchestrator.startNewBlock(Math.max(txCount, 2), block.header.globalVariables, []); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.startNewBlock(block.header.globalVariables, []); + await context.orchestrator.addTxs(txs); await context.orchestrator.setBlockCompleted(block.number); }), ); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts index 5d228f3d40b..b0d111a15ed 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_public_functions.test.ts @@ -39,15 +39,13 @@ describe('prover/orchestrator/public-functions', () => { tx.data.constants.vkTreeRoot = getVKTreeRoot(); tx.data.constants.protocolContractTreeRoot = protocolContractTreeRoot; - const [processed, _] = await context.processPublicFunctions([tx], 1, undefined); + const [processed, _] = await context.processPublicFunctions([tx], 1); // This will need to be a 2 tx block context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(2, context.globalVariables, []); + await context.orchestrator.startNewBlock(context.globalVariables, []); - for (const processedTx of processed) { - await context.orchestrator.addNewTx(processedTx); - } + await context.orchestrator.addTxs(processed); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts index daf63d32757..b076158e4bb 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_single_blocks.test.ts @@ -3,7 +3,6 @@ import { fr } from '@aztec/circuits.js/testing'; import { range } from '@aztec/foundation/array'; import { times } from '@aztec/foundation/collection'; import { createLogger } from '@aztec/foundation/log'; -import { sleep } from '@aztec/foundation/sleep'; import { TestContext } from '../mocks/test_context.js'; @@ -23,7 +22,7 @@ describe('prover/orchestrator/blocks', () => { describe('blocks', () => { it('builds an empty L2 block', async () => { context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(2, context.globalVariables, []); + await context.orchestrator.startNewBlock(context.globalVariables, []); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); @@ -32,14 +31,13 @@ describe('prover/orchestrator/blocks', () => { it('builds a block with 1 transaction', async () => { const txs = [context.makeProcessedTx(1)]; + await context.setEndTreeRoots(txs); // This will need to be a 2 tx block context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(2, context.globalVariables, []); + await context.orchestrator.startNewBlock(context.globalVariables, []); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - } + await context.orchestrator.addTxs(txs); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); @@ -48,16 +46,13 @@ describe('prover/orchestrator/blocks', () => { it('builds a block concurrently with transaction simulation', async () => { const txs = times(4, i => context.makeProcessedTx(i + 1)); - + await context.setEndTreeRoots(txs); const l1ToL2Messages = range(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, 1 + 0x400).map(fr); context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(txs.length, context.globalVariables, l1ToL2Messages); + await context.orchestrator.startNewBlock(context.globalVariables, l1ToL2Messages); - for (const tx of txs) { - await context.orchestrator.addNewTx(tx); - await sleep(1000); - } + await context.orchestrator.addTxs(txs); const block = await context.orchestrator.setBlockCompleted(context.blockNumber); await context.orchestrator.finaliseEpoch(); diff --git a/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts b/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts index e5a1ed7d591..8c9cccc45b9 100644 --- a/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts +++ b/yarn-project/prover-client/src/orchestrator/orchestrator_workflow.test.ts @@ -76,7 +76,7 @@ describe('prover/orchestrator', () => { }); orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(2, globalVariables, [message]); + await orchestrator.startNewBlock(globalVariables, [message]); await sleep(10); expect(mockProver.getBaseParityProof).toHaveBeenCalledTimes(NUM_BASE_PARITY_PER_ROOT_PARITY); @@ -105,9 +105,10 @@ describe('prover/orchestrator', () => { it('waits for block to be completed before enqueueing block root proof', async () => { orchestrator.startNewEpoch(1, 1, 1); - await orchestrator.startNewBlock(2, globalVariables, []); - await orchestrator.addNewTx(context.makeProcessedTx(1)); - await orchestrator.addNewTx(context.makeProcessedTx(2)); + await orchestrator.startNewBlock(globalVariables, []); + const txs = [context.makeProcessedTx(1), context.makeProcessedTx(2)]; + await context.setEndTreeRoots(txs); + await orchestrator.addTxs(txs); // wait for the block root proof to try to be enqueued await sleep(1000); diff --git a/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts b/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts index dd7b05a21cf..19657111997 100644 --- a/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts +++ b/yarn-project/prover-client/src/prover-agent/memory-proving-queue.ts @@ -35,7 +35,7 @@ import { AbortError, TimeoutError } from '@aztec/foundation/error'; import { createLogger } from '@aztec/foundation/log'; import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise'; import { PriorityMemoryQueue } from '@aztec/foundation/queue'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store.js'; import { ProvingQueueMetrics } from './queue_metrics.js'; @@ -65,6 +65,8 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource private runningPromise: RunningPromise; private metrics: ProvingQueueMetrics; + public readonly tracer: Tracer; + constructor( client: TelemetryClient, /** Timeout the job if an agent doesn't report back in this time */ @@ -75,8 +77,9 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource private timeSource = defaultTimeSource, private proofStore: ProofStore = new InlineProofStore(), ) { + this.tracer = client.getTracer('MemoryProvingQueue'); this.metrics = new ProvingQueueMetrics(client, 'MemoryProvingQueue'); - this.runningPromise = new RunningPromise(this.poll, pollingIntervalMs); + this.runningPromise = new RunningPromise(this.poll.bind(this), this.log, pollingIntervalMs); } public start() { @@ -202,7 +205,8 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource return this.jobsInProgress.has(jobId); } - private poll = () => { + @trackSpan('MemoryProvingQueue.poll') + private poll() { const now = this.timeSource(); this.metrics.recordQueueSize(this.queue.length()); @@ -220,7 +224,7 @@ export class MemoryProvingQueue implements ServerCircuitProver, ProvingJobSource this.queue.put(job); } } - }; + } private async enqueue( type: T, diff --git a/yarn-project/prover-client/src/prover-agent/prover-agent.ts b/yarn-project/prover-client/src/prover-agent/prover-agent.ts index b2c6aebbf27..235d8264b93 100644 --- a/yarn-project/prover-client/src/prover-agent/prover-agent.ts +++ b/yarn-project/prover-client/src/prover-agent/prover-agent.ts @@ -11,26 +11,29 @@ import { import { createLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; import { elapsed } from '@aztec/foundation/timer'; +import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { InlineProofStore } from '../proving_broker/proof_store.js'; const PRINT_THRESHOLD_NS = 6e10; // 60 seconds +type InFlightPromise = { + id: string; + type: ProvingRequestType; + promise: Promise; +}; + /** * A helper class that encapsulates a circuit prover and connects it to a job source. */ -export class ProverAgent implements ProverAgentApi { - private inFlightPromises = new Map< - string, - { - id: string; - type: ProvingRequestType; - promise: Promise; - } - >(); +export class ProverAgent implements ProverAgentApi, Traceable { + private inFlightPromises = new Map(); private runningPromise?: RunningPromise; private proofInputsDatabase = new InlineProofStore(); + public readonly tracer: Tracer; + constructor( /** The prover implementation to defer jobs to */ private circuitProver: ServerCircuitProver, @@ -38,8 +41,13 @@ export class ProverAgent implements ProverAgentApi { private maxConcurrency = 1, /** How long to wait between jobs */ private pollIntervalMs = 100, + /** Telemetry client */ + private telemetry: TelemetryClient = new NoopTelemetryClient(), + /** Logger */ private log = createLogger('prover-client:prover-agent'), - ) {} + ) { + this.tracer = telemetry.getTracer('ProverAgent'); + } setMaxConcurrency(maxConcurrency: number): Promise { if (maxConcurrency < 1) { @@ -74,49 +82,53 @@ export class ProverAgent implements ProverAgentApi { let lastPrint = process.hrtime.bigint(); - this.runningPromise = new RunningPromise(async () => { - for (const jobId of this.inFlightPromises.keys()) { - await jobSource.heartbeat(jobId); - } - - const now = process.hrtime.bigint(); - - if (now - lastPrint >= PRINT_THRESHOLD_NS) { - // only log if we're actually doing work - if (this.inFlightPromises.size > 0) { - const jobs = Array.from(this.inFlightPromises.values()) - .map(job => `id=${job.id},type=${ProvingRequestType[job.type]}`) - .join(' '); - this.log.info(`Agent is running with ${this.inFlightPromises.size} in-flight jobs: ${jobs}`); + this.runningPromise = new RunningPromise( + async () => { + for (const jobId of this.inFlightPromises.keys()) { + await jobSource.heartbeat(jobId); } - lastPrint = now; - } - while (this.inFlightPromises.size < this.maxConcurrency) { - try { - const job = await jobSource.getProvingJob(); - if (!job) { - // job source is fully drained, sleep for a bit and try again - return; + const now = process.hrtime.bigint(); + + if (now - lastPrint >= PRINT_THRESHOLD_NS) { + // only log if we're actually doing work + if (this.inFlightPromises.size > 0) { + const jobs = Array.from(this.inFlightPromises.values()) + .map(job => `id=${job.id},type=${ProvingRequestType[job.type]}`) + .join(' '); + this.log.info(`Agent is running with ${this.inFlightPromises.size} in-flight jobs: ${jobs}`); } + lastPrint = now; + } + while (this.inFlightPromises.size < this.maxConcurrency) { try { - const promise = this.work(jobSource, job).finally(() => this.inFlightPromises.delete(job.id)); - this.inFlightPromises.set(job.id, { - id: job.id, - type: job.type, - promise, - }); + const job = await jobSource.getProvingJob(); + if (!job) { + // job source is fully drained, sleep for a bit and try again + return; + } + + try { + const promise = this.work(jobSource, job).finally(() => this.inFlightPromises.delete(job.id)); + this.inFlightPromises.set(job.id, { + id: job.id, + type: job.type, + promise, + }); + } catch (err) { + this.log.warn( + `Error processing job! type=${ProvingRequestType[job.type]}: ${err}. ${(err as Error).stack}`, + ); + } } catch (err) { - this.log.warn( - `Error processing job! type=${ProvingRequestType[job.type]}: ${err}. ${(err as Error).stack}`, - ); + this.log.error(`Error fetching job`, err); } - } catch (err) { - this.log.error(`Error fetching job`, err); } - } - }, this.pollIntervalMs); + }, + this.log, + this.pollIntervalMs, + ); this.runningPromise.start(); this.log.info(`Agent started with concurrency=${this.maxConcurrency}`); @@ -133,9 +145,16 @@ export class ProverAgent implements ProverAgentApi { this.log.info('Agent stopped'); } + @trackSpan('ProverAgent.work', (_jobSoure, job) => ({ + [Attributes.PROVING_JOB_ID]: job.id, + [Attributes.PROVING_JOB_TYPE]: ProvingRequestType[job.type], + })) private async work(jobSource: ProvingJobSource, job: ProvingJob): Promise { try { - this.log.debug(`Picked up proving job id=${job.id} type=${ProvingRequestType[job.type]}`); + this.log.debug(`Picked up proving job ${job.id} ${ProvingRequestType[job.type]}`, { + jobId: job.id, + jobType: ProvingRequestType[job.type], + }); const type = job.type; const inputs = await this.proofInputsDatabase.getProofInput(job.inputsUri); const [time, result] = await elapsed(this.getProof(inputs)); diff --git a/yarn-project/prover-client/src/prover-client/prover-client.ts b/yarn-project/prover-client/src/prover-client/prover-client.ts index b5d81a34905..115b2a9f784 100644 --- a/yarn-project/prover-client/src/prover-client/prover-client.ts +++ b/yarn-project/prover-client/src/prover-client/prover-client.ts @@ -4,7 +4,6 @@ import { type EpochProver, type EpochProverManager, type ForkMerkleTreeOperations, - type ProverCache, type ProvingJobBroker, type ProvingJobConsumer, type ProvingJobProducer, @@ -16,13 +15,10 @@ import { createLogger } from '@aztec/foundation/log'; import { NativeACVMSimulator } from '@aztec/simulator'; import { type TelemetryClient } from '@aztec/telemetry-client'; -import { join } from 'path'; - import { type ProverClientConfig } from '../config.js'; import { ProvingOrchestrator } from '../orchestrator/orchestrator.js'; -import { CachingBrokerFacade } from '../proving_broker/caching_broker_facade.js'; +import { BrokerCircuitProverFacade } from '../proving_broker/broker_prover_facade.js'; import { InlineProofStore } from '../proving_broker/proof_store.js'; -import { InMemoryProverCache } from '../proving_broker/prover_cache/memory.js'; import { ProvingAgent } from '../proving_broker/proving_agent.js'; /** Manages proving of epochs by orchestrating the proving of individual blocks relying on a pool of prover agents. */ @@ -30,8 +26,6 @@ export class ProverClient implements EpochProverManager { private running = false; private agents: ProvingAgent[] = []; - private cacheDir?: string; - private constructor( private config: ProverClientConfig, private worldState: ForkMerkleTreeOperations, @@ -42,13 +36,12 @@ export class ProverClient implements EpochProverManager { ) { // TODO(palla/prover-node): Cache the paddingTx here, and not in each proving orchestrator, // so it can be reused across multiple ones and not recomputed every time. - this.cacheDir = this.config.cacheDir ? join(this.config.cacheDir, `tx_prover_${this.config.proverId}`) : undefined; } - public createEpochProver(cache: ProverCache = new InMemoryProverCache()): EpochProver { + public createEpochProver(): EpochProver { return new ProvingOrchestrator( this.worldState, - new CachingBrokerFacade(this.orchestratorClient, cache), + new BrokerCircuitProverFacade(this.orchestratorClient), this.telemetry, this.config.proverId, ); diff --git a/yarn-project/prover-client/src/proving_broker/broker_prover_facade.test.ts b/yarn-project/prover-client/src/proving_broker/broker_prover_facade.test.ts new file mode 100644 index 00000000000..13c09f09011 --- /dev/null +++ b/yarn-project/prover-client/src/proving_broker/broker_prover_facade.test.ts @@ -0,0 +1,152 @@ +import { makePublicInputsAndRecursiveProof } from '@aztec/circuit-types'; +import { RECURSIVE_PROOF_LENGTH, VerificationKeyData, makeRecursiveProof } from '@aztec/circuits.js'; +import { makeBaseParityInputs, makeParityPublicInputs } from '@aztec/circuits.js/testing'; +import { promiseWithResolvers } from '@aztec/foundation/promise'; +import { sleep } from '@aztec/foundation/sleep'; + +import { jest } from '@jest/globals'; + +import { MockProver, TestBroker } from '../test/mock_prover.js'; +import { BrokerCircuitProverFacade } from './broker_prover_facade.js'; +import { InlineProofStore } from './proof_store.js'; + +describe('BrokerCircuitProverFacade', () => { + let facade: BrokerCircuitProverFacade; + let proofStore: InlineProofStore; + let broker: TestBroker; + let prover: MockProver; + let agentPollInterval: number; + + beforeEach(async () => { + proofStore = new InlineProofStore(); + prover = new MockProver(); + agentPollInterval = 100; + broker = new TestBroker(2, prover, proofStore, agentPollInterval); + facade = new BrokerCircuitProverFacade(broker, proofStore); + + await broker.start(); + }); + + it('sends jobs to the broker', async () => { + const inputs = makeBaseParityInputs(); + const controller = new AbortController(); + + jest.spyOn(broker, 'enqueueProvingJob'); + jest.spyOn(prover, 'getBaseParityProof'); + + await expect(facade.getBaseParityProof(inputs, controller.signal, 42)).resolves.toBeDefined(); + + expect(broker.enqueueProvingJob).toHaveBeenCalled(); + expect(prover.getBaseParityProof).toHaveBeenCalledWith(inputs, expect.anything(), 42); + }); + + it('handles multiple calls for the same job', async () => { + const inputs = makeBaseParityInputs(); + const controller = new AbortController(); + const promises: Promise[] = []; + + const resultPromise = promiseWithResolvers(); + jest.spyOn(broker, 'enqueueProvingJob'); + jest.spyOn(prover, 'getBaseParityProof').mockReturnValue(resultPromise.promise); + + // send N identical proof requests + const CALLS = 50; + for (let i = 0; i < CALLS; i++) { + promises.push(facade.getBaseParityProof(inputs, controller.signal, 42)); + } + + await sleep(agentPollInterval); + // the broker should have received all of them + expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(CALLS); + + // but really, it should have only enqueued just one + expect(prover.getBaseParityProof).toHaveBeenCalledTimes(1); + expect(prover.getBaseParityProof).toHaveBeenCalledWith(inputs, expect.anything(), 42); + + // now we have 50 promises all waiting on the same result + // resolve the proof + const result = makePublicInputsAndRecursiveProof( + makeParityPublicInputs(), + makeRecursiveProof(RECURSIVE_PROOF_LENGTH), + VerificationKeyData.makeFakeHonk(), + ); + resultPromise.resolve(result); + + // enqueue another N requests for the same jobs + for (let i = 0; i < CALLS; i++) { + promises.push(facade.getBaseParityProof(inputs, controller.signal, 42)); + } + + await sleep(agentPollInterval); + // the broker will have received the new requests + expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(2 * CALLS); + // but no new jobs where created + expect(prover.getBaseParityProof).toHaveBeenCalledTimes(1); + + // and all 2 * N requests will have been resolved with the same result + for (const promise of promises) { + await expect(promise).resolves.toEqual(result); + } + }); + + it('handles proof errors', async () => { + const inputs = makeBaseParityInputs(); + const controller = new AbortController(); + const promises: Promise[] = []; + + const resultPromise = promiseWithResolvers(); + jest.spyOn(broker, 'enqueueProvingJob'); + jest.spyOn(prover, 'getBaseParityProof').mockReturnValue(resultPromise.promise); + + // send N identical proof requests + const CALLS = 50; + for (let i = 0; i < CALLS; i++) { + // wrap the error in a resolved promises so that we don't have unhandled rejections + promises.push(facade.getBaseParityProof(inputs, controller.signal, 42).catch(err => ({ err }))); + } + + await sleep(agentPollInterval); + // the broker should have received all of them + expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(CALLS); + + // but really, it should have only enqueued just one + expect(prover.getBaseParityProof).toHaveBeenCalledTimes(1); + expect(prover.getBaseParityProof).toHaveBeenCalledWith(inputs, expect.anything(), 42); + + resultPromise.reject(new Error('TEST ERROR')); + + // enqueue another N requests for the same jobs + for (let i = 0; i < CALLS; i++) { + promises.push(facade.getBaseParityProof(inputs, controller.signal, 42).catch(err => ({ err }))); + } + + await sleep(agentPollInterval); + // the broker will have received the new requests + expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(2 * CALLS); + // but no new jobs where created + expect(prover.getBaseParityProof).toHaveBeenCalledTimes(1); + + // and all 2 * N requests will have been resolved with the same result + for (const promise of promises) { + await expect(promise).resolves.toEqual({ err: new Error('TEST ERROR') }); + } + }); + + it('handles aborts', async () => { + const inputs = makeBaseParityInputs(); + const controller = new AbortController(); + + const resultPromise = promiseWithResolvers(); + jest.spyOn(broker, 'enqueueProvingJob'); + jest.spyOn(prover, 'getBaseParityProof').mockReturnValue(resultPromise.promise); + + const promise = facade.getBaseParityProof(inputs, controller.signal, 42).catch(err => ({ err })); + + await sleep(agentPollInterval); + expect(prover.getBaseParityProof).toHaveBeenCalled(); + + controller.abort(); + + await expect(promise).resolves.toEqual({ err: new Error('Aborted') }); + }); +}); diff --git a/yarn-project/prover-client/src/proving_broker/caching_broker_facade.ts b/yarn-project/prover-client/src/proving_broker/broker_prover_facade.ts similarity index 71% rename from yarn-project/prover-client/src/proving_broker/caching_broker_facade.ts rename to yarn-project/prover-client/src/proving_broker/broker_prover_facade.ts index 82c59e7ea0f..dc20621706d 100644 --- a/yarn-project/prover-client/src/proving_broker/caching_broker_facade.ts +++ b/yarn-project/prover-client/src/proving_broker/broker_prover_facade.ts @@ -1,6 +1,5 @@ import { type ProofAndVerificationKey, - type ProverCache, type ProvingJobId, type ProvingJobInputsMap, type ProvingJobProducer, @@ -35,24 +34,20 @@ import { import { sha256 } from '@aztec/foundation/crypto'; import { createLogger } from '@aztec/foundation/log'; import { retryUntil } from '@aztec/foundation/retry'; +import { truncate } from '@aztec/foundation/string'; import { InlineProofStore, type ProofStore } from './proof_store.js'; -import { InMemoryProverCache } from './prover_cache/memory.js'; // 20 minutes, roughly the length of an Aztec epoch. If a proof isn't ready in this amount of time then we've failed to prove the whole epoch const MAX_WAIT_MS = 1_200_000; -/** - * A facade around a job broker that generates stable job ids and caches results - */ -export class CachingBrokerFacade implements ServerCircuitProver { +export class BrokerCircuitProverFacade implements ServerCircuitProver { constructor( private broker: ProvingJobProducer, - private cache: ProverCache = new InMemoryProverCache(), private proofStore: ProofStore = new InlineProofStore(), private waitTimeoutMs = MAX_WAIT_MS, private pollIntervalMs = 1000, - private log = createLogger('prover-client:caching-prover-broker'), + private log = createLogger('prover-client:broker-circuit-prover-facade'), ) {} private async enqueueAndWaitForJob( @@ -62,49 +57,23 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber = 0, signal?: AbortSignal, ): Promise { - // first try the cache - let jobEnqueued = false; - try { - const cachedResult = await this.cache.getProvingJobStatus(id); - if (cachedResult.status !== 'not-found') { - this.log.debug(`Found cached result for job=${id}: status=${cachedResult.status}`); - } - - if (cachedResult.status === 'fulfilled') { - const output = await this.proofStore.getProofOutput(cachedResult.value); - if (output.type === type) { - return output.result as ProvingJobResultsMap[T]; - } else { - this.log.warn(`Cached result type mismatch for job=${id}. Expected=${type} but got=${output.type}`); - } - } else if (cachedResult.status === 'rejected') { - // prefer returning a rejected promises so that we don't trigger the catch block below - return Promise.reject(new Error(cachedResult.reason)); - } else if (cachedResult.status === 'in-progress' || cachedResult.status === 'in-queue') { - jobEnqueued = true; - } else { - jobEnqueued = false; - } - } catch (err) { - this.log.warn(`Failed to get cached proving job id=${id}: ${err}. Re-running job`); - } + const inputsUri = await this.proofStore.saveProofInput(id, type, inputs); + await this.broker.enqueueProvingJob({ + id, + type, + inputsUri, + epochNumber, + }); - if (!jobEnqueued) { - try { - const inputsUri = await this.proofStore.saveProofInput(id, type, inputs); - await this.broker.enqueueProvingJob({ - id, - type, - inputsUri, - epochNumber, - }); - await this.cache.setProvingJobStatus(id, { status: 'in-queue' }); - } catch (err) { - this.log.error(`Failed to enqueue proving job id=${id}: ${err}`); - await this.cache.setProvingJobStatus(id, { status: 'not-found' }); - throw err; - } - } + this.log.verbose( + `Sent proving job to broker id=${id} type=${ProvingRequestType[type]} epochNumber=${epochNumber}`, + { + provingJobId: id, + provingJobType: ProvingRequestType[type], + epochNumber, + inputsUri: truncate(inputsUri), + }, + ); // notify broker of cancelled job const abortFn = async () => { @@ -131,26 +100,18 @@ export class CachingBrokerFacade implements ServerCircuitProver { this.pollIntervalMs / 1000, ); - try { - await this.cache.setProvingJobStatus(id, result); - } catch (err) { - this.log.warn(`Failed to cache proving job id=${id} resultStatus=${result.status}: ${err}`); - } - if (result.status === 'fulfilled') { const output = await this.proofStore.getProofOutput(result.value); if (output.type === type) { return output.result as ProvingJobResultsMap[T]; } else { - return Promise.reject(new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`)); + throw new Error(`Unexpected proof type: ${output.type}. Expected: ${type}`); } } else { - return Promise.reject(new Error(result.reason)); + throw new Error(result.reason); } } finally { signal?.removeEventListener('abort', abortFn); - // we've saved the result in our cache. We can tell the broker to clear its state - await this.broker.cleanUpProvingJobState(id); } } @@ -160,7 +121,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.PUBLIC_VM, inputs), + this.generateId(ProvingRequestType.PUBLIC_VM, inputs, epochNumber), ProvingRequestType.PUBLIC_VM, inputs, epochNumber, @@ -174,7 +135,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.BASE_PARITY, inputs), + this.generateId(ProvingRequestType.BASE_PARITY, inputs, epochNumber), ProvingRequestType.BASE_PARITY, inputs, epochNumber, @@ -188,7 +149,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.BLOCK_MERGE_ROLLUP, input), + this.generateId(ProvingRequestType.BLOCK_MERGE_ROLLUP, input, epochNumber), ProvingRequestType.BLOCK_MERGE_ROLLUP, input, epochNumber, @@ -202,7 +163,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.BLOCK_ROOT_ROLLUP, input), + this.generateId(ProvingRequestType.BLOCK_ROOT_ROLLUP, input, epochNumber), ProvingRequestType.BLOCK_ROOT_ROLLUP, input, epochNumber, @@ -216,7 +177,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input), + this.generateId(ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input, epochNumber), ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP, input, epochNumber, @@ -230,7 +191,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs), + this.generateId(ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs, epochNumber), ProvingRequestType.PRIVATE_KERNEL_EMPTY, inputs, epochNumber, @@ -244,7 +205,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.MERGE_ROLLUP, input), + this.generateId(ProvingRequestType.MERGE_ROLLUP, input, epochNumber), ProvingRequestType.MERGE_ROLLUP, input, epochNumber, @@ -257,7 +218,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput), + this.generateId(ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput, epochNumber), ProvingRequestType.PRIVATE_BASE_ROLLUP, baseRollupInput, epochNumber, @@ -271,7 +232,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs), + this.generateId(ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, epochNumber), ProvingRequestType.PUBLIC_BASE_ROLLUP, inputs, epochNumber, @@ -285,7 +246,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.ROOT_PARITY, inputs), + this.generateId(ProvingRequestType.ROOT_PARITY, inputs, epochNumber), ProvingRequestType.ROOT_PARITY, inputs, epochNumber, @@ -299,7 +260,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.ROOT_ROLLUP, input), + this.generateId(ProvingRequestType.ROOT_ROLLUP, input, epochNumber), ProvingRequestType.ROOT_ROLLUP, input, epochNumber, @@ -313,7 +274,7 @@ export class CachingBrokerFacade implements ServerCircuitProver { epochNumber?: number, ): Promise> { return this.enqueueAndWaitForJob( - this.generateId(ProvingRequestType.TUBE_PROOF, tubeInput), + this.generateId(ProvingRequestType.TUBE_PROOF, tubeInput, epochNumber), ProvingRequestType.TUBE_PROOF, tubeInput, epochNumber, @@ -321,8 +282,8 @@ export class CachingBrokerFacade implements ServerCircuitProver { ); } - private generateId(type: ProvingRequestType, inputs: { toBuffer(): Buffer }) { + private generateId(type: ProvingRequestType, inputs: { toBuffer(): Buffer }, epochNumber = 0) { const inputsHash = sha256(inputs.toBuffer()); - return `${ProvingRequestType[type]}:${inputsHash.toString('hex')}`; + return `${epochNumber}:${ProvingRequestType[type]}:${inputsHash.toString('hex')}`; } } diff --git a/yarn-project/prover-client/src/proving_broker/caching_broker_facade.test.ts b/yarn-project/prover-client/src/proving_broker/caching_broker_facade.test.ts deleted file mode 100644 index a72918ade09..00000000000 --- a/yarn-project/prover-client/src/proving_broker/caching_broker_facade.test.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { type ProvingJobProducer, ProvingRequestType, makePublicInputsAndRecursiveProof } from '@aztec/circuit-types'; -import { RECURSIVE_PROOF_LENGTH, VerificationKeyData, makeRecursiveProof } from '@aztec/circuits.js'; -import { makeBaseParityInputs, makeParityPublicInputs } from '@aztec/circuits.js/testing'; -import { promiseWithResolvers } from '@aztec/foundation/promise'; - -import { jest } from '@jest/globals'; -import { type MockProxy, mock } from 'jest-mock-extended'; - -import { CachingBrokerFacade } from './caching_broker_facade.js'; -import { InlineProofStore } from './proof_store.js'; -import { InMemoryProverCache } from './prover_cache/memory.js'; - -describe('CachingBrokerFacade', () => { - let facade: CachingBrokerFacade; - let cache: InMemoryProverCache; - let proofStore: InlineProofStore; - let broker: MockProxy; - - beforeAll(() => { - jest.useFakeTimers(); - }); - - beforeEach(() => { - broker = mock({ - enqueueProvingJob: jest.fn(), - getProvingJobStatus: jest.fn(), - cancelProvingJob: jest.fn(), - cleanUpProvingJobState: jest.fn(), - waitForJobToSettle: jest.fn(), - }); - cache = new InMemoryProverCache(); - proofStore = new InlineProofStore(); - facade = new CachingBrokerFacade(broker, cache, proofStore); - }); - - it('marks job as in progress', async () => { - const controller = new AbortController(); - void facade.getBaseParityProof(makeBaseParityInputs(), controller.signal); - - await jest.advanceTimersToNextTimerAsync(); - - expect(broker.enqueueProvingJob).toHaveBeenCalled(); - const job = broker.enqueueProvingJob.mock.calls[0][0]; - - await expect(cache.getProvingJobStatus(job.id)).resolves.toEqual({ status: 'in-queue' }); - controller.abort(); - }); - - it('removes the cached value if a job fails to enqueue', async () => { - const { promise, reject } = promiseWithResolvers(); - broker.enqueueProvingJob.mockResolvedValue(promise); - - void facade.getBaseParityProof(makeBaseParityInputs()).catch(() => {}); - await jest.advanceTimersToNextTimerAsync(); - - const job = broker.enqueueProvingJob.mock.calls[0][0]; - - reject(new Error('Failed to enqueue job')); - - await jest.advanceTimersToNextTimerAsync(); - await expect(cache.getProvingJobStatus(job.id)).resolves.toEqual({ status: 'not-found' }); - }); - - it('awaits existing job if in progress', async () => { - const inputs = makeBaseParityInputs(); - void facade.getBaseParityProof(inputs).catch(() => {}); - await jest.advanceTimersToNextTimerAsync(); - expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(1); - - void facade.getBaseParityProof(inputs).catch(() => {}); - await jest.advanceTimersToNextTimerAsync(); - expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(1); - }); - - it('reuses already cached results', async () => { - const { promise, resolve } = promiseWithResolvers(); - broker.enqueueProvingJob.mockResolvedValue(Promise.resolve()); - broker.waitForJobToSettle.mockResolvedValue(promise); - - const inputs = makeBaseParityInputs(); - void facade.getBaseParityProof(inputs); - await jest.advanceTimersToNextTimerAsync(); - - expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(1); - const job = broker.enqueueProvingJob.mock.calls[0][0]; - - const result = makePublicInputsAndRecursiveProof( - makeParityPublicInputs(), - makeRecursiveProof(RECURSIVE_PROOF_LENGTH), - VerificationKeyData.makeFakeHonk(), - ); - - const outputUri = await proofStore.saveProofOutput(job.id, ProvingRequestType.BASE_PARITY, result); - resolve({ - status: 'fulfilled', - value: outputUri, - }); - - await jest.advanceTimersToNextTimerAsync(); - await expect(cache.getProvingJobStatus(job.id)).resolves.toEqual({ status: 'fulfilled', value: outputUri }); - - await expect(facade.getBaseParityProof(inputs)).resolves.toEqual(result); - expect(broker.enqueueProvingJob).toHaveBeenCalledTimes(1); // job was only ever enqueued once - }); - - it('clears broker state after a job resolves', async () => { - const { promise, resolve } = promiseWithResolvers(); - broker.enqueueProvingJob.mockResolvedValue(Promise.resolve()); - broker.waitForJobToSettle.mockResolvedValue(promise); - - const inputs = makeBaseParityInputs(); - void facade.getBaseParityProof(inputs); - await jest.advanceTimersToNextTimerAsync(); - - const job = broker.enqueueProvingJob.mock.calls[0][0]; - const result = makePublicInputsAndRecursiveProof( - makeParityPublicInputs(), - makeRecursiveProof(RECURSIVE_PROOF_LENGTH), - VerificationKeyData.makeFakeHonk(), - ); - const outputUri = await proofStore.saveProofOutput(job.id, ProvingRequestType.BASE_PARITY, result); - resolve({ - status: 'fulfilled', - value: outputUri, - }); - - await jest.advanceTimersToNextTimerAsync(); - expect(broker.cleanUpProvingJobState).toHaveBeenCalled(); - }); - - it('clears broker state after a job is canceled', async () => { - const { promise, resolve } = promiseWithResolvers(); - const catchSpy = jest.fn(); - broker.enqueueProvingJob.mockResolvedValue(Promise.resolve()); - broker.waitForJobToSettle.mockResolvedValue(promise); - - const inputs = makeBaseParityInputs(); - const controller = new AbortController(); - void facade.getBaseParityProof(inputs, controller.signal).catch(catchSpy); - await jest.advanceTimersToNextTimerAsync(); - - expect(broker.cancelProvingJob).not.toHaveBeenCalled(); - controller.abort(); - await jest.advanceTimersToNextTimerAsync(); - expect(broker.cancelProvingJob).toHaveBeenCalled(); - - resolve({ - status: 'rejected', - reason: 'Aborted', - }); - - await jest.advanceTimersToNextTimerAsync(); - expect(broker.cleanUpProvingJobState).toHaveBeenCalled(); - expect(catchSpy).toHaveBeenCalledWith(new Error('Aborted')); - }); -}); diff --git a/yarn-project/prover-client/src/proving_broker/prover_cache/memory.ts b/yarn-project/prover-client/src/proving_broker/prover_cache/memory.ts deleted file mode 100644 index b4da076cbcb..00000000000 --- a/yarn-project/prover-client/src/proving_broker/prover_cache/memory.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { ProverCache, ProvingJobStatus } from '@aztec/circuit-types'; - -export class InMemoryProverCache implements ProverCache { - private proofs: Record = {}; - - constructor() {} - - setProvingJobStatus(jobId: string, status: ProvingJobStatus): Promise { - this.proofs[jobId] = status; - return Promise.resolve(); - } - - getProvingJobStatus(jobId: string): Promise { - return Promise.resolve(this.proofs[jobId] ?? { status: 'not-found' }); - } - - close(): Promise { - return Promise.resolve(); - } -} diff --git a/yarn-project/prover-client/src/proving_broker/proving_agent.ts b/yarn-project/prover-client/src/proving_broker/proving_agent.ts index 7cb29c7446a..3c099c8f1a5 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_agent.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_agent.ts @@ -10,8 +10,9 @@ import { } from '@aztec/circuit-types'; import { createLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; +import { truncate } from '@aztec/foundation/string'; import { Timer } from '@aztec/foundation/timer'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { type ProofStore } from './proof_store.js'; import { ProvingAgentInstrumentation } from './proving_agent_instrumentation.js'; @@ -20,12 +21,14 @@ import { ProvingJobController, ProvingJobControllerStatus } from './proving_job_ /** * A helper class that encapsulates a circuit prover and connects it to a job source. */ -export class ProvingAgent { +export class ProvingAgent implements Traceable { private currentJobController?: ProvingJobController; private runningPromise: RunningPromise; private instrumentation: ProvingAgentInstrumentation; private idleTimer: Timer | undefined; + public readonly tracer: Tracer; + constructor( /** The source of proving jobs */ private broker: ProvingJobConsumer, @@ -41,8 +44,9 @@ export class ProvingAgent { private pollIntervalMs = 1000, private log = createLogger('prover-client:proving-agent'), ) { + this.tracer = client.getTracer('ProvingAgent'); this.instrumentation = new ProvingAgentInstrumentation(client); - this.runningPromise = new RunningPromise(this.safeWork, this.pollIntervalMs); + this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollIntervalMs); } public setCircuitProver(circuitProver: ServerCircuitProver): void { @@ -63,76 +67,74 @@ export class ProvingAgent { await this.runningPromise.stop(); } - private safeWork = async () => { - try { - // every tick we need to - // (1) either do a heartbeat, telling the broker that we're working - // (2) get a new job - // If during (1) the broker returns a new job that means we can cancel the current job and start the new one - let maybeJob: { job: ProvingJob; time: number } | undefined; - if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) { - maybeJob = await this.broker.reportProvingJobProgress( - this.currentJobController.getJobId(), - this.currentJobController.getStartedAt(), - { allowList: this.proofAllowList }, - ); - } else { - maybeJob = await this.broker.getProvingJob({ allowList: this.proofAllowList }); - } - - if (!maybeJob) { - return; - } - - let abortedProofJobId: string | undefined; - let abortedProofName: string | undefined; - if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) { - abortedProofJobId = this.currentJobController.getJobId(); - abortedProofName = this.currentJobController.getProofTypeName(); - this.currentJobController?.abort(); - } - - const { job, time } = maybeJob; - let inputs: ProvingJobInputs; - try { - inputs = await this.proofStore.getProofInput(job.inputsUri); - } catch (err) { - await this.broker.reportProvingJobError(job.id, 'Failed to load proof inputs', true); - return; - } - - this.currentJobController = new ProvingJobController( - job.id, - inputs, - time, - this.circuitProver, - this.handleJobResult, + @trackSpan('ProvingAgent.safeWork') + private async work() { + // every tick we need to + // (1) either do a heartbeat, telling the broker that we're working + // (2) get a new job + // If during (1) the broker returns a new job that means we can cancel the current job and start the new one + let maybeJob: { job: ProvingJob; time: number } | undefined; + if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) { + maybeJob = await this.broker.reportProvingJobProgress( + this.currentJobController.getJobId(), + this.currentJobController.getStartedAt(), + { allowList: this.proofAllowList }, ); + } else { + maybeJob = await this.broker.getProvingJob({ allowList: this.proofAllowList }); + } + + if (!maybeJob) { + return; + } + + let abortedProofJobId: string | undefined; + let abortedProofName: string | undefined; + if (this.currentJobController?.getStatus() === ProvingJobControllerStatus.PROVING) { + abortedProofJobId = this.currentJobController.getJobId(); + abortedProofName = this.currentJobController.getProofTypeName(); + this.currentJobController?.abort(); + } - if (abortedProofJobId) { - this.log.info( - `Aborting job id=${abortedProofJobId} type=${abortedProofName} to start new job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncateString( - job.inputsUri, - )}`, - ); - } else { - this.log.info( - `Starting job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncateString( - job.inputsUri, - )}`, - ); - } - - if (this.idleTimer) { - this.instrumentation.recordIdleTime(this.idleTimer); - } - this.idleTimer = undefined; - - this.currentJobController.start(); + const { job, time } = maybeJob; + let inputs: ProvingJobInputs; + try { + inputs = await this.proofStore.getProofInput(job.inputsUri); } catch (err) { - this.log.error(`Error in ProvingAgent: ${String(err)}`); + await this.broker.reportProvingJobError(job.id, 'Failed to load proof inputs', true); + return; } - }; + + this.currentJobController = new ProvingJobController( + job.id, + inputs, + job.epochNumber, + time, + this.circuitProver, + this.handleJobResult, + ); + + if (abortedProofJobId) { + this.log.info( + `Aborting job id=${abortedProofJobId} type=${abortedProofName} to start new job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncate( + job.inputsUri, + )}`, + ); + } else { + this.log.info( + `Starting job id=${this.currentJobController.getJobId()} type=${this.currentJobController.getProofTypeName()} inputsUri=${truncate( + job.inputsUri, + )}`, + ); + } + + if (this.idleTimer) { + this.instrumentation.recordIdleTime(this.idleTimer); + } + this.idleTimer = undefined; + + this.currentJobController.start(); + } handleJobResult = async ( jobId: ProvingJobId, @@ -147,14 +149,8 @@ export class ProvingAgent { return this.broker.reportProvingJobError(jobId, err.message, retry); } else if (result) { const outputUri = await this.proofStore.saveProofOutput(jobId, type, result); - this.log.info( - `Job id=${jobId} type=${ProvingRequestType[type]} completed outputUri=${truncateString(outputUri)}`, - ); + this.log.info(`Job id=${jobId} type=${ProvingRequestType[type]} completed outputUri=${truncate(outputUri)}`); return this.broker.reportProvingJobSuccess(jobId, outputUri); } }; } - -function truncateString(str: string, length: number = 64): string { - return str.length > length ? str.slice(0, length) + '...' : str; -} diff --git a/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts b/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts index 454e840543f..4782cd61489 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts @@ -1,4 +1,10 @@ -import { type ProofUri, type ProvingJob, type ProvingJobId, ProvingRequestType } from '@aztec/circuit-types'; +import { + type ProofUri, + type ProvingJob, + type ProvingJobId, + type ProvingJobStatus, + ProvingRequestType, +} from '@aztec/circuit-types'; import { randomBytes } from '@aztec/foundation/crypto'; import { sleep } from '@aztec/foundation/sleep'; import { openTmpStore } from '@aztec/kv-store/lmdb'; @@ -57,6 +63,28 @@ describe.each([ await broker.stop(); }); + it('refuses stale jobs', async () => { + const id = makeProvingJobId(); + await broker.enqueueProvingJob({ + id, + epochNumber: 42, + type: ProvingRequestType.BASE_PARITY, + inputsUri: makeInputsUri(), + }); + expect(await broker.getProvingJobStatus(id)).toEqual({ status: 'in-queue' }); + + const id2 = makeProvingJobId(); + await expect( + broker.enqueueProvingJob({ + id: id2, + epochNumber: 1, + type: ProvingRequestType.PRIVATE_BASE_ROLLUP, + inputsUri: makeInputsUri(), + }), + ).rejects.toThrow(); + await assertJobStatus(id2, 'not-found'); + }); + it('enqueues jobs', async () => { const id = makeProvingJobId(); await broker.enqueueProvingJob({ @@ -204,15 +232,7 @@ describe.each([ inputsUri: makeInputsUri(), }; - const provingJob3: ProvingJob = { - id: makeProvingJobId(), - type: ProvingRequestType.BASE_PARITY, - epochNumber: 3, - inputsUri: makeInputsUri(), - }; - await broker.enqueueProvingJob(provingJob2); - await broker.enqueueProvingJob(provingJob3); await broker.enqueueProvingJob(provingJob1); await getAndAssertNextJobId(provingJob1.id, ProvingRequestType.BASE_PARITY); @@ -639,10 +659,8 @@ describe.each([ await assertJobStatus(id, 'in-progress'); // advance time so job times out because of no heartbeats - await sleep(jobTimeoutMs + brokerIntervalMs); - - // should be back in the queue now - await assertJobStatus(id, 'in-queue'); + await sleep(jobTimeoutMs); + await assertJobTransition(id, 'in-progress', 'in-queue'); }); it('cancel stale jobs that time out', async () => { @@ -659,10 +677,10 @@ describe.each([ await assertJobStatus(id, 'in-progress'); // advance time so job times out because of no heartbeats - await sleep(jobTimeoutMs + brokerIntervalMs); + await sleep(jobTimeoutMs); // should be back in the queue now - await assertJobStatus(id, 'in-queue'); + await assertJobTransition(id, 'in-progress', 'in-queue'); // another agent picks it up await getAndAssertNextJobId(id); @@ -926,48 +944,6 @@ describe.each([ await getAndAssertNextJobId(id2); }); - it('clears job state when job is removed', async () => { - const id1 = makeProvingJobId(); - - await database.addProvingJob({ - id: id1, - type: ProvingRequestType.BASE_PARITY, - epochNumber: 1, - inputsUri: makeInputsUri(), - }); - await database.setProvingJobResult(id1, makeOutputsUri()); - - const id2 = makeProvingJobId(); - await database.addProvingJob({ - id: id2, - type: ProvingRequestType.PRIVATE_BASE_ROLLUP, - epochNumber: 2, - inputsUri: makeInputsUri(), - }); - - await broker.start(); - - await assertJobStatus(id1, 'fulfilled'); - await assertJobStatus(id2, 'in-queue'); - - jest.spyOn(database, 'deleteProvingJobAndResult'); - - await broker.cleanUpProvingJobState(id1); - await sleep(brokerIntervalMs); - expect(database.deleteProvingJobAndResult).toHaveBeenNthCalledWith(1, id1); - - await broker.cancelProvingJob(id2); - await broker.cleanUpProvingJobState(id2); - await sleep(brokerIntervalMs); - - expect(database.deleteProvingJobAndResult).toHaveBeenNthCalledWith(2, id2); - - await expect(broker.getProvingJobStatus(id1)).resolves.toEqual({ status: 'not-found' }); - await expect(broker.getProvingJobStatus(id2)).resolves.toEqual({ status: 'not-found' }); - await assertJobStatus(id1, 'not-found'); - await assertJobStatus(id2, 'not-found'); - }); - it('saves job when enqueued', async () => { await broker.start(); const job: ProvingJob = { @@ -1017,7 +993,7 @@ describe.each([ expect(database.setProvingJobResult).toHaveBeenCalledWith(job.id, expect.any(String)); }); - it('does not retain job result if database fails to save', async () => { + it('saves result even if database fails to save', async () => { await broker.start(); jest.spyOn(database, 'setProvingJobResult').mockRejectedValue(new Error('db error')); const id = makeProvingJobId(); @@ -1028,7 +1004,7 @@ describe.each([ inputsUri: makeInputsUri(), }); await expect(broker.reportProvingJobSuccess(id, makeOutputsUri())).rejects.toThrow(new Error('db error')); - await assertJobStatus(id, 'in-queue'); + await assertJobStatus(id, 'fulfilled'); }); it('saves job error', async () => { @@ -1050,7 +1026,7 @@ describe.each([ expect(database.setProvingJobError).toHaveBeenCalledWith(id, error); }); - it('does not retain job error if database fails to save', async () => { + it('saves job error even if database fails to save', async () => { await broker.start(); jest.spyOn(database, 'setProvingJobError').mockRejectedValue(new Error('db error')); const id = makeProvingJobId(); @@ -1061,7 +1037,7 @@ describe.each([ inputsUri: makeInputsUri(), }); await expect(broker.reportProvingJobError(id, 'test error')).rejects.toThrow(new Error('db error')); - await assertJobStatus(id, 'in-queue'); + await assertJobStatus(id, 'rejected'); }); it('does not save job result if job is unknown', async () => { @@ -1167,10 +1143,30 @@ describe.each([ }); }); - async function assertJobStatus(id: ProvingJobId, status: string) { + async function assertJobStatus(id: ProvingJobId, status: ProvingJobStatus['status']) { await expect(broker.getProvingJobStatus(id)).resolves.toEqual(expect.objectContaining({ status })); } + async function assertJobTransition( + id: ProvingJobId, + currentStatus: ProvingJobStatus['status'], + expectedStatus: ProvingJobStatus['status'], + timeoutMs = 5000, + interval = brokerIntervalMs / 4, + ): Promise { + let status; + const timeout = now() + timeoutMs; + while (now() < timeout) { + ({ status } = await broker.getProvingJobStatus(id)); + if (status !== currentStatus) { + break; + } + await sleep(interval); + } + + expect(status).toEqual(expectedStatus); + } + async function getAndAssertNextJobId(id: ProvingJobId, ...allowList: ProvingRequestType[]) { await expect(broker.getProvingJob({ allowList })).resolves.toEqual( expect.objectContaining({ job: expect.objectContaining({ id }) }), diff --git a/yarn-project/prover-client/src/proving_broker/proving_broker.ts b/yarn-project/prover-client/src/proving_broker/proving_broker.ts index 3487f83e7e8..7ffbb5244ed 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_broker.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_broker.ts @@ -14,7 +14,7 @@ import { createLogger } from '@aztec/foundation/log'; import { type PromiseWithResolvers, RunningPromise, promiseWithResolvers } from '@aztec/foundation/promise'; import { PriorityMemoryQueue } from '@aztec/foundation/queue'; import { Timer } from '@aztec/foundation/timer'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import assert from 'assert'; @@ -41,7 +41,7 @@ type EnqueuedProvingJob = Pick; * A broker that manages proof requests and distributes them to workers based on their priority. * It takes a backend that is responsible for storing and retrieving proof requests and results. */ -export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { +export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer, Traceable { private queues: ProvingQueues = { [ProvingRequestType.PUBLIC_VM]: new PriorityMemoryQueue(provingJobComparator), [ProvingRequestType.TUBE_PROOF]: new PriorityMemoryQueue(provingJobComparator), @@ -87,6 +87,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { private maxRetries: number; private instrumentation: ProvingBrokerInstrumentation; + public readonly tracer: Tracer; private maxParallelCleanUps: number; @@ -115,8 +116,9 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { }: ProofRequestBrokerConfig = {}, private logger = createLogger('prover-client:proving-broker'), ) { + this.tracer = client.getTracer('ProvingBroker'); this.instrumentation = new ProvingBrokerInstrumentation(client); - this.cleanupPromise = new RunningPromise(this.cleanupPass, timeoutIntervalMs); + this.cleanupPromise = new RunningPromise(this.cleanupPass.bind(this), this.logger, timeoutIntervalMs); this.jobTimeoutMs = jobTimeoutMs; this.maxRetries = maxRetries; this.maxEpochsToKeepResultsFor = maxEpochsToKeepResultsFor; @@ -141,7 +143,10 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { public start(): Promise { for (const [item, result] of this.database.allProvingJobs()) { - this.logger.info(`Restoring proving job id=${item.id} settled=${!!result}`); + this.logger.info(`Restoring proving job id=${item.id} settled=${!!result}`, { + provingJobId: item.id, + status: result ? result.status : 'pending', + }); this.jobsCache.set(item.id, item); this.promises.set(item.id, promiseWithResolvers()); @@ -150,7 +155,6 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { this.promises.get(item.id)!.resolve(result); this.resultsCache.set(item.id, result); } else { - this.logger.debug(`Re-enqueuing proving job id=${item.id}`); this.enqueueJobInternal(item); } } @@ -171,37 +175,66 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { if (this.jobsCache.has(job.id)) { const existing = this.jobsCache.get(job.id); assert.deepStrictEqual(job, existing, 'Duplicate proving job ID'); + this.logger.debug(`Duplicate proving job id=${job.id} epochNumber=${job.epochNumber}. Ignoring`, { + provingJobId: job.id, + }); return; } - await this.database.addProvingJob(job); - this.jobsCache.set(job.id, job); - this.enqueueJobInternal(job); + if (this.isJobStale(job)) { + this.logger.warn(`Tried enqueueing stale proving job id=${job.id} epochNumber=${job.epochNumber}`, { + provingJobId: job.id, + }); + throw new Error(`Epoch too old: job epoch ${job.epochNumber}, current epoch: ${this.epochHeight}`); + } + + this.logger.info(`New proving job id=${job.id} epochNumber=${job.epochNumber}`, { provingJobId: job.id }); + try { + // do this first so it acts as a "lock". If this job is enqueued again while we're saving it the if at the top will catch it. + this.jobsCache.set(job.id, job); + await this.database.addProvingJob(job); + this.enqueueJobInternal(job); + } catch (err) { + this.logger.error(`Failed to save proving job id=${job.id}: ${err}`, err, { provingJobId: job.id }); + this.jobsCache.delete(job.id); + throw err; + } } public waitForJobToSettle(id: ProvingJobId): Promise { const promiseWithResolvers = this.promises.get(id); if (!promiseWithResolvers) { + this.logger.warn(`Job id=${id} not found`, { provingJobId: id }); return Promise.resolve({ status: 'rejected', reason: `Job ${id} not found` }); } return promiseWithResolvers.promise; } public async cancelProvingJob(id: ProvingJobId): Promise { + if (!this.jobsCache.has(id)) { + this.logger.warn(`Can't cancel a job that doesn't exist id=${id}`, { provingJobId: id }); + return; + } + // notify listeners of the cancellation if (!this.resultsCache.has(id)) { - this.logger.info(`Cancelling job id=${id}`); + this.logger.info(`Cancelling job id=${id}`, { provingJobId: id }); await this.reportProvingJobError(id, 'Aborted', false); } } - public async cleanUpProvingJobState(id: ProvingJobId): Promise { + private async cleanUpProvingJobState(id: ProvingJobId): Promise { + if (!this.jobsCache.has(id)) { + this.logger.warn(`Can't clean up a job that doesn't exist id=${id}`, { provingJobId: id }); + return; + } + if (!this.resultsCache.has(id)) { - this.logger.warn(`Can't cleanup busy proving job: id=${id}`); + this.logger.warn(`Can't cleanup busy proving job: id=${id}`, { provingJobId: id }); return; } - this.logger.debug(`Cleaning up state for job id=${id}`); + this.logger.debug(`Cleaning up state for job id=${id}`, { provingJobId: id }); await this.database.deleteProvingJobAndResult(id); this.jobsCache.delete(id); this.promises.delete(id); @@ -219,7 +252,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { const item = this.jobsCache.get(id); if (!item) { - this.logger.warn(`Proving job id=${id} not found`); + this.logger.warn(`Proving job id=${id} not found`, { provingJobId: id }); return Promise.resolve({ status: 'not-found' }); } @@ -272,45 +305,68 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { const retries = this.retries.get(id) ?? 0; if (!item) { - this.logger.warn(`Proving job id=${id} not found`); + this.logger.warn(`Can't set error on unknown proving job id=${id} err=${err}`, { provingJoId: id }); return; } if (!info) { - this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set`); + this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set`, { + provingJobId: id, + }); } else { this.inProgress.delete(id); } if (this.resultsCache.has(id)) { - this.logger.warn(`Proving job id=${id} already is already settled, ignoring error`); + this.logger.warn(`Proving job id=${id} is already settled, ignoring err=${err}`, { + provingJobId: id, + }); return; } if (retry && retries + 1 < this.maxRetries && !this.isJobStale(item)) { - this.logger.info(`Retrying proving job id=${id} type=${ProvingRequestType[item.type]} retry=${retries + 1}`); + this.logger.info( + `Retrying proving job id=${id} type=${ProvingRequestType[item.type]} retry=${retries + 1} err=${err}`, + { + provingJobId: id, + }, + ); this.retries.set(id, retries + 1); this.enqueueJobInternal(item); this.instrumentation.incRetriedJobs(item.type); return; } - this.logger.warn( + this.logger.info( `Marking proving job as failed id=${id} type=${ProvingRequestType[item.type]} totalAttempts=${ retries + 1 } err=${err}`, + { + provingJobId: id, + }, ); - await this.database.setProvingJobError(id, err); - + // save the result to the cache and notify clients of the job status + // this should work even if our database breaks because the result is cached in memory const result: ProvingJobSettledResult = { status: 'rejected', reason: String(err) }; this.resultsCache.set(id, result); this.promises.get(id)!.resolve(result); + this.instrumentation.incRejectedJobs(item.type); if (info) { const duration = this.msTimeSource() - info.startedAt; this.instrumentation.recordJobDuration(item.type, duration); } + + try { + await this.database.setProvingJobError(id, err); + } catch (saveErr) { + this.logger.error(`Failed to save proving job error status id=${id} jobErr=${err}`, saveErr, { + provingJobId: id, + }); + + throw saveErr; + } } reportProvingJobProgress( @@ -320,12 +376,12 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { ): Promise<{ job: ProvingJob; time: number } | undefined> { const job = this.jobsCache.get(id); if (!job) { - this.logger.warn(`Proving job id=${id} does not exist`); + this.logger.warn(`Proving job id=${id} does not exist`, { provingJobId: id }); return filter ? this.getProvingJob(filter) : Promise.resolve(undefined); } if (this.resultsCache.has(id)) { - this.logger.warn(`Proving job id=${id} has already been completed`); + this.logger.warn(`Proving job id=${id} has already been completed`, { provingJobId: id }); return filter ? this.getProvingJob(filter) : Promise.resolve(undefined); } @@ -334,6 +390,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { if (!metadata) { this.logger.warn( `Proving job id=${id} type=${ProvingRequestType[job.type]} not found in the in-progress cache, adding it`, + { provingJobId: id }, ); // the queue will still contain the item at this point! // we need to be careful when popping off the queue to make sure we're not sending @@ -346,11 +403,12 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { return Promise.resolve(undefined); } else if (startedAt <= metadata.startedAt) { if (startedAt < metadata.startedAt) { - this.logger.debug( + this.logger.info( `Proving job id=${id} type=${ProvingRequestType[job.type]} startedAt=${startedAt} older agent has taken job`, + { provingJobId: id }, ); } else { - this.logger.debug(`Proving job id=${id} type=${ProvingRequestType[job.type]} heartbeat`); + this.logger.debug(`Proving job id=${id} type=${ProvingRequestType[job.type]} heartbeat`, { provingJobId: id }); } metadata.startedAt = startedAt; metadata.lastUpdatedAt = now; @@ -360,6 +418,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { `Proving job id=${id} type=${ ProvingRequestType[job.type] } already being worked on by another agent. Sending new one`, + { provingJobId: id }, ); return this.getProvingJob(filter); } else { @@ -372,37 +431,57 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { const item = this.jobsCache.get(id); const retries = this.retries.get(id) ?? 0; if (!item) { - this.logger.warn(`Proving job id=${id} not found`); + this.logger.warn(`Proving job id=${id} not found`, { provingJobId: id }); return; } if (!info) { - this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set`); + this.logger.warn(`Proving job id=${id} type=${ProvingRequestType[item.type]} not in the in-progress set`, { + provingJobId: id, + }); } else { this.inProgress.delete(id); } if (this.resultsCache.has(id)) { - this.logger.warn(`Proving job id=${id} already settled, ignoring result`); + this.logger.warn(`Proving job id=${id} already settled, ignoring result`, { provingJobId: id }); return; } - this.logger.debug( + this.logger.info( `Proving job complete id=${id} type=${ProvingRequestType[item.type]} totalAttempts=${retries + 1}`, + { provingJobId: id }, ); - await this.database.setProvingJobResult(id, value); - + // save result to our local cache and notify clients + // if save to database fails, that's ok because we have the result in memory + // if the broker crashes and needs the result again, we're covered because we can just recompute it const result: ProvingJobSettledResult = { status: 'fulfilled', value }; this.resultsCache.set(id, result); this.promises.get(id)!.resolve(result); + this.instrumentation.incResolvedJobs(item.type); + if (info) { + const duration = this.msTimeSource() - info.startedAt; + this.instrumentation.recordJobDuration(item.type, duration); + } + + try { + await this.database.setProvingJobResult(id, value); + } catch (saveErr) { + this.logger.error(`Failed to save proving job result id=${id}`, saveErr, { + provingJobId: id, + }); + + throw saveErr; + } } - private cleanupPass = async () => { + @trackSpan('ProvingBroker.cleanupPass') + private async cleanupPass() { await this.cleanupStaleJobs(); await this.reEnqueueExpiredJobs(); - }; + } private async cleanupStaleJobs() { const jobIds = Array.from(this.jobsCache.keys()); @@ -416,7 +495,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { } if (jobsToClean.length > 0) { - this.logger.info(`Cleaning up [${jobsToClean.join(',')}]`); + this.logger.info(`Cleaning up jobs=${jobsToClean.length}`); await asyncPool(this.maxParallelCleanUps, jobsToClean, async jobId => { await this.cleanUpProvingJobState(jobId); }); @@ -428,7 +507,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { for (const [id, metadata] of inProgressEntries) { const item = this.jobsCache.get(id); if (!item) { - this.logger.warn(`Proving job id=${id} not found. Removing it from the queue.`); + this.logger.warn(`Proving job id=${id} not found. Removing it from the queue.`, { provingJobId: id }); this.inProgress.delete(id); continue; } @@ -440,7 +519,7 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { // the job has timed out and it's also old, just cancel and move on await this.cancelProvingJob(item.id); } else { - this.logger.warn(`Proving job id=${id} timed out. Adding it back to the queue.`); + this.logger.warn(`Proving job id=${id} timed out. Adding it back to the queue.`, { provingJobId: id }); this.inProgress.delete(id); this.enqueueJobInternal(item); this.instrumentation.incTimedOutJobs(item.type); @@ -459,7 +538,6 @@ export class ProvingBroker implements ProvingJobProducer, ProvingJobConsumer { }); this.enqueuedAt.set(job.id, new Timer()); this.epochHeight = Math.max(this.epochHeight, job.epochNumber); - this.logger.debug(`Enqueued new proving job id=${job.id}`); } private isJobStale(job: ProvingJob) { diff --git a/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts b/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts index 2379bdd8a32..5a17de276a6 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_broker_instrumentation.ts @@ -9,7 +9,6 @@ import { type TelemetryClient, type UpDownCounter, ValueType, - millisecondBuckets, } from '@aztec/telemetry-client'; export type MonitorCallback = (proofType: ProvingRequestType) => number; @@ -55,18 +54,12 @@ export class ProvingBrokerInstrumentation { description: 'Records how long a job sits in the queue', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(1), // 10ms -> ~327s - }, }); this.jobDuration = meter.createHistogram(Metrics.PROVING_QUEUE_JOB_DURATION, { description: 'Records how long a job takes to complete', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(1), // 10ms -> ~327s - }, }); } diff --git a/yarn-project/prover-client/src/proving_broker/proving_job_controller.test.ts b/yarn-project/prover-client/src/proving_broker/proving_job_controller.test.ts index 364703b23cf..1c5fc3c0223 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_job_controller.test.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_job_controller.test.ts @@ -23,6 +23,7 @@ describe('ProvingJobController', () => { type: ProvingRequestType.BASE_PARITY, inputs: makeBaseParityInputs(), }, + 42, 0, prover, onComplete, diff --git a/yarn-project/prover-client/src/proving_broker/proving_job_controller.ts b/yarn-project/prover-client/src/proving_broker/proving_job_controller.ts index 2ce47cbe6f7..0b08e0ad69c 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_job_controller.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_job_controller.ts @@ -30,6 +30,7 @@ export class ProvingJobController { constructor( private jobId: ProvingJobId, private inputs: ProvingJobInputs, + private epochNumber: number, private startedAt: number, private circuitProver: ServerCircuitProver, private onComplete: ProvingJobCompletionCallback, @@ -100,51 +101,51 @@ export class ProvingJobController { const signal = this.abortController.signal; switch (type) { case ProvingRequestType.PUBLIC_VM: { - return await this.circuitProver.getAvmProof(inputs, signal); + return await this.circuitProver.getAvmProof(inputs, signal, this.epochNumber); } case ProvingRequestType.PRIVATE_BASE_ROLLUP: { - return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal); + return await this.circuitProver.getPrivateBaseRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.PUBLIC_BASE_ROLLUP: { - return await this.circuitProver.getPublicBaseRollupProof(inputs, signal); + return await this.circuitProver.getPublicBaseRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.MERGE_ROLLUP: { - return await this.circuitProver.getMergeRollupProof(inputs, signal); + return await this.circuitProver.getMergeRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.EMPTY_BLOCK_ROOT_ROLLUP: { - return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal); + return await this.circuitProver.getEmptyBlockRootRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.BLOCK_ROOT_ROLLUP: { - return await this.circuitProver.getBlockRootRollupProof(inputs, signal); + return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.BLOCK_MERGE_ROLLUP: { - return await this.circuitProver.getBlockMergeRollupProof(inputs, signal); + return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.ROOT_ROLLUP: { - return await this.circuitProver.getRootRollupProof(inputs, signal); + return await this.circuitProver.getRootRollupProof(inputs, signal, this.epochNumber); } case ProvingRequestType.BASE_PARITY: { - return await this.circuitProver.getBaseParityProof(inputs, signal); + return await this.circuitProver.getBaseParityProof(inputs, signal, this.epochNumber); } case ProvingRequestType.ROOT_PARITY: { - return await this.circuitProver.getRootParityProof(inputs, signal); + return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber); } case ProvingRequestType.PRIVATE_KERNEL_EMPTY: { - return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal); + return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal, this.epochNumber); } case ProvingRequestType.TUBE_PROOF: { - return await this.circuitProver.getTubeProof(inputs, signal); + return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber); } default: { diff --git a/yarn-project/prover-client/src/proving_broker/rpc.ts b/yarn-project/prover-client/src/proving_broker/rpc.ts index 0d63dcebeac..3dec6bedbdb 100644 --- a/yarn-project/prover-client/src/proving_broker/rpc.ts +++ b/yarn-project/prover-client/src/proving_broker/rpc.ts @@ -28,7 +28,6 @@ const GetProvingJobResponse = z.object({ export const ProvingJobProducerSchema: ApiSchemaFor = { enqueueProvingJob: z.function().args(ProvingJob).returns(z.void()), getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus), - cleanUpProvingJobState: z.function().args(ProvingJobId).returns(z.void()), cancelProvingJob: z.function().args(ProvingJobId).returns(z.void()), waitForJobToSettle: z.function().args(ProvingJobId).returns(ProvingJobSettledResult), }; diff --git a/yarn-project/prover-client/src/test/bb_prover_base_rollup.test.ts b/yarn-project/prover-client/src/test/bb_prover_base_rollup.test.ts index 033bd762ee8..61b99669c8f 100644 --- a/yarn-project/prover-client/src/test/bb_prover_base_rollup.test.ts +++ b/yarn-project/prover-client/src/test/bb_prover_base_rollup.test.ts @@ -6,6 +6,7 @@ import { PrivateBaseRollupInputs, PrivateKernelEmptyInputData, PrivateTubeData, + SpongeBlob, VkWitnessData, } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; @@ -41,6 +42,7 @@ describe('prover/bb_prover/base-rollup', () => { const vkTreeRoot = getVKTreeRoot(); const tx = makeEmptyProcessedTx(header, chainId, version, vkTreeRoot, protocolContractTreeRoot); + const startSpongeBlob = SpongeBlob.init(tx.txEffect.toBlobFields().length); logger.verbose('Building empty private proof'); const privateInputs = new PrivateKernelEmptyInputData( @@ -59,7 +61,12 @@ describe('prover/bb_prover/base-rollup', () => { const tubeData = new PrivateTubeData(tubeProof.inputs, tubeProof.proof, vkData); - const baseRollupHints = await buildBaseRollupHints(tx, context.globalVariables, await context.getFork()); + const baseRollupHints = await buildBaseRollupHints( + tx, + context.globalVariables, + await context.getFork(), + startSpongeBlob, + ); const baseRollupInputs = new PrivateBaseRollupInputs(tubeData, baseRollupHints as PrivateBaseRollupHints); logger.verbose('Proving base rollups'); diff --git a/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts b/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts index 4980e21ccb3..fcd971b41e5 100644 --- a/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts +++ b/yarn-project/prover-client/src/test/bb_prover_full_rollup.test.ts @@ -4,7 +4,8 @@ import { Fr, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/circuits.js'; import { makeTuple } from '@aztec/foundation/array'; import { times } from '@aztec/foundation/collection'; import { type Logger, createLogger } from '@aztec/foundation/log'; -import { getTestData, isGenerateTestDataEnabled, writeTestData } from '@aztec/foundation/testing'; +import { getTestData, isGenerateTestDataEnabled } from '@aztec/foundation/testing'; +import { writeTestData } from '@aztec/foundation/testing/files'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; @@ -32,7 +33,7 @@ describe('prover/bb_prover/full-rollup', () => { it.each([ [1, 1, 0, 2], // Epoch with a single block, requires one padding block proof - [2, 2, 0, 2], // Full epoch with two blocks + // [2, 2, 0, 2], // Full epoch with two blocks // TODO(#10678) disabled for time x resource usage on main runner // [2, 3, 0, 2], // Epoch with two blocks but the block merge tree was assembled as with 3 leaves, requires one padding block proof; commented out to reduce running time ])( 'proves a private-only epoch with %i/%i blocks with %i/%i non-empty txs each', @@ -54,11 +55,13 @@ describe('prover/bb_prover/full-rollup', () => { }); log.info(`Starting new block #${blockNum}`); - await context.orchestrator.startNewBlock(totalTxs, globals, l1ToL2Messages); + + await context.orchestrator.startNewBlock(globals, l1ToL2Messages); log.info(`Processing public functions`); - const [processed, failed] = await context.processPublicFunctions(txs, nonEmptyTxs, context.epochProver); + const [processed, failed] = await context.processPublicFunctions(txs, nonEmptyTxs); expect(processed.length).toBe(nonEmptyTxs); expect(failed.length).toBe(0); + await context.orchestrator.addTxs(processed); log.info(`Setting block as completed`); await context.orchestrator.setBlockCompleted(blockNum); @@ -104,13 +107,15 @@ describe('prover/bb_prover/full-rollup', () => { context.orchestrator.startNewEpoch(1, 1, 1); - await context.orchestrator.startNewBlock(numTransactions, context.globalVariables, l1ToL2Messages); + await context.orchestrator.startNewBlock(context.globalVariables, l1ToL2Messages); - const [processed, failed] = await context.processPublicFunctions(txs, numTransactions, context.epochProver); + const [processed, failed] = await context.processPublicFunctions(txs, numTransactions); expect(processed.length).toBe(numTransactions); expect(failed.length).toBe(0); + await context.orchestrator.addTxs(processed); + await context.orchestrator.setBlockCompleted(context.blockNumber); const result = await context.orchestrator.finaliseEpoch(); diff --git a/yarn-project/prover-client/src/test/mock_prover.ts b/yarn-project/prover-client/src/test/mock_prover.ts index a4ab77fc24d..baf581d8f8e 100644 --- a/yarn-project/prover-client/src/test/mock_prover.ts +++ b/yarn-project/prover-client/src/test/mock_prover.ts @@ -58,8 +58,12 @@ export class TestBroker implements ProvingJobProducer { agentCount: number, prover: ServerCircuitProver, private proofStore: ProofStore = new InlineProofStore(), + agentPollInterval = 100, ) { - this.agents = times(agentCount, () => new ProvingAgent(this.broker, proofStore, prover, new NoopTelemetryClient())); + this.agents = times( + agentCount, + () => new ProvingAgent(this.broker, proofStore, prover, new NoopTelemetryClient(), undefined, agentPollInterval), + ); } public async start() { @@ -82,9 +86,6 @@ export class TestBroker implements ProvingJobProducer { getProvingJobStatus(id: ProvingJobId): Promise { return this.broker.getProvingJobStatus(id); } - cleanUpProvingJobState(id: ProvingJobId): Promise { - return this.broker.cleanUpProvingJobState(id); - } cancelProvingJob(id: string): Promise { return this.broker.cancelProvingJob(id); } diff --git a/yarn-project/prover-node/package.json b/yarn-project/prover-node/package.json index 27bb2c8bd60..4d0fc44fd24 100644 --- a/yarn-project/prover-node/package.json +++ b/yarn-project/prover-node/package.json @@ -3,7 +3,8 @@ "version": "0.1.0", "type": "module", "exports": { - ".": "./dest/index.js" + ".": "./dest/index.js", + "./config": "./dest/config.js" }, "inherits": [ "../package.common.json" diff --git a/yarn-project/prover-node/src/config.ts b/yarn-project/prover-node/src/config.ts index b609ffd7d5c..7bdde17af5c 100644 --- a/yarn-project/prover-node/src/config.ts +++ b/yarn-project/prover-node/src/config.ts @@ -1,11 +1,11 @@ -import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver'; -import { type ACVMConfig, type BBConfig } from '@aztec/bb-prover'; +import { type ArchiverConfig, archiverConfigMappings, getArchiverConfigFromEnv } from '@aztec/archiver/config'; +import { type ACVMConfig, type BBConfig } from '@aztec/bb-prover/config'; import { type ProverAgentConfig, type ProverBrokerConfig, proverAgentConfigMappings, proverBrokerConfigMappings, -} from '@aztec/circuit-types'; +} from '@aztec/circuit-types/config'; import { type ConfigMappingsType, bigintConfigHelper, @@ -13,13 +13,13 @@ import { numberConfigHelper, } from '@aztec/foundation/config'; import { type DataStoreConfig, dataConfigMappings, getDataConfigFromEnv } from '@aztec/kv-store/config'; -import { type P2PConfig, getP2PConfigFromEnv, p2pConfigMappings } from '@aztec/p2p'; +import { type P2PConfig, getP2PConfigFromEnv, p2pConfigMappings } from '@aztec/p2p/config'; import { type ProverClientConfig, bbConfigMappings, getProverEnvVars, proverClientConfigMappings, -} from '@aztec/prover-client'; +} from '@aztec/prover-client/config'; import { type PublisherConfig, type TxSenderConfig, @@ -27,8 +27,8 @@ import { getPublisherConfigMappings, getTxSenderConfigFromEnv, getTxSenderConfigMappings, -} from '@aztec/sequencer-client'; -import { type WorldStateConfig, getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state'; +} from '@aztec/sequencer-client/config'; +import { type WorldStateConfig, getWorldStateConfigFromEnv, worldStateConfigMappings } from '@aztec/world-state/config'; import { type ProverBondManagerConfig, proverBondManagerConfigMappings } from './bond/config.js'; import { diff --git a/yarn-project/prover-node/src/factory.ts b/yarn-project/prover-node/src/factory.ts index 57429290be7..c1a5f27026a 100644 --- a/yarn-project/prover-node/src/factory.ts +++ b/yarn-project/prover-node/src/factory.ts @@ -12,14 +12,12 @@ import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { createWorldStateSynchronizer } from '@aztec/world-state'; -import { join } from 'path'; import { createPublicClient, getAddress, getContract, http } from 'viem'; import { createBondManager } from './bond/factory.js'; import { type ProverNodeConfig, type QuoteProviderConfig } from './config.js'; import { ClaimsMonitor } from './monitors/claims-monitor.js'; import { EpochMonitor } from './monitors/epoch-monitor.js'; -import { ProverCacheManager } from './prover-cache/cache_manager.js'; import { createProverCoordination } from './prover-coordination/factory.js'; import { ProverNode, type ProverNodeOptions } from './prover-node.js'; import { HttpQuoteProvider } from './quote-provider/http.js'; @@ -71,16 +69,13 @@ export async function createProverNode( maxParallelBlocksPerEpoch: config.proverNodeMaxParallelBlocksPerEpoch, }; - const claimsMonitor = new ClaimsMonitor(publisher, proverNodeConfig); - const epochMonitor = new EpochMonitor(archiver, proverNodeConfig); + const claimsMonitor = new ClaimsMonitor(publisher, telemetry, proverNodeConfig); + const epochMonitor = new EpochMonitor(archiver, telemetry, proverNodeConfig); const rollupContract = publisher.getRollupContract(); const walletClient = publisher.getClient(); const bondManager = await createBondManager(rollupContract, walletClient, config); - const cacheDir = config.cacheDir ? join(config.cacheDir, `prover_${config.proverId}`) : undefined; - const cacheManager = new ProverCacheManager(cacheDir); - return new ProverNode( prover, publisher, @@ -95,7 +90,6 @@ export async function createProverNode( epochMonitor, bondManager, telemetry, - cacheManager, proverNodeConfig, ); } diff --git a/yarn-project/prover-node/src/job/epoch-proving-job.ts b/yarn-project/prover-node/src/job/epoch-proving-job.ts index ba48a49bde3..ffe46a1e5e8 100644 --- a/yarn-project/prover-node/src/job/epoch-proving-job.ts +++ b/yarn-project/prover-node/src/job/epoch-proving-job.ts @@ -17,6 +17,7 @@ import { promiseWithResolvers } from '@aztec/foundation/promise'; import { Timer } from '@aztec/foundation/timer'; import { type L1Publisher } from '@aztec/sequencer-client'; import { type PublicProcessor, type PublicProcessorFactory } from '@aztec/simulator'; +import { Attributes, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import * as crypto from 'node:crypto'; @@ -27,13 +28,15 @@ import { type ProverNodeMetrics } from '../metrics.js'; * re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the * world state as part of public call execution via the public processor. */ -export class EpochProvingJob { +export class EpochProvingJob implements Traceable { private state: EpochProvingJobState = 'initialized'; private log = createLogger('prover-node:epoch-proving-job'); private uuid: string; private runPromise: Promise | undefined; + public readonly tracer: Tracer; + constructor( private dbProvider: ForkMerkleTreeOperations, private epochNumber: bigint, @@ -49,6 +52,7 @@ export class EpochProvingJob { private cleanUp: (job: EpochProvingJob) => Promise = () => Promise.resolve(), ) { this.uuid = crypto.randomUUID(); + this.tracer = metrics.client.getTracer('EpochProvingJob'); } public getId(): string { @@ -62,11 +66,20 @@ export class EpochProvingJob { /** * Proves the given epoch and submits the proof to L1. */ + @trackSpan('EpochProvingJob.run', function () { + return { [Attributes.EPOCH_NUMBER]: Number(this.epochNumber) }; + }) public async run() { const epochNumber = Number(this.epochNumber); const epochSize = this.blocks.length; - const firstBlockNumber = this.blocks[0].number; - this.log.info(`Starting epoch proving job`, { firstBlockNumber, epochSize, epochNumber, uuid: this.uuid }); + const [fromBlock, toBlock] = [this.blocks[0].number, this.blocks.at(-1)!.number]; + this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, { + fromBlock, + toBlock, + epochSize, + epochNumber, + uuid: this.uuid, + }); this.state = 'processing'; const timer = new Timer(); @@ -74,17 +87,17 @@ export class EpochProvingJob { this.runPromise = promise; try { - this.prover.startNewEpoch(epochNumber, firstBlockNumber, epochSize); + this.prover.startNewEpoch(epochNumber, fromBlock, epochSize); await asyncPool(this.config.parallelBlockLimit, this.blocks, async block => { const globalVariables = block.header.globalVariables; const txHashes = block.body.txEffects.map(tx => tx.txHash); const txCount = block.body.numberOfTxsIncludingPadded; const l1ToL2Messages = await this.getL1ToL2Messages(block); - const txs = await this.getTxs(txHashes); + const txs = await this.getTxs(txHashes, block.number); const previousHeader = await this.getBlockHeader(block.number - 1); - this.log.verbose(`Starting block processing`, { + this.log.verbose(`Starting processing block ${block.number}`, { number: block.number, blockHash: block.hash().toString(), lastArchive: block.header.lastArchive.root, @@ -95,16 +108,16 @@ export class EpochProvingJob { uuid: this.uuid, ...globalVariables, }); - // Start block proving - await this.prover.startNewBlock(txCount, globalVariables, l1ToL2Messages); + await this.prover.startNewBlock(globalVariables, l1ToL2Messages); // Process public fns const db = await this.dbProvider.fork(block.number - 1); const publicProcessor = this.publicProcessorFactory.create(db, previousHeader, globalVariables); - await this.processTxs(publicProcessor, txs, txCount); + const processed = await this.processTxs(publicProcessor, txs, txCount); + await this.prover.addTxs(processed); await db.close(); - this.log.verbose(`Processed all txs for block`, { + this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, { blockNumber: block.number, blockHash: block.hash().toString(), uuid: this.uuid, @@ -116,17 +129,16 @@ export class EpochProvingJob { this.state = 'awaiting-prover'; const { publicInputs, proof } = await this.prover.finaliseEpoch(); - this.log.info(`Finalised proof for epoch`, { epochNumber, uuid: this.uuid, duration: timer.ms() }); + this.log.info(`Finalised proof for epoch ${epochNumber}`, { epochNumber, uuid: this.uuid, duration: timer.ms() }); this.state = 'publishing-proof'; - const [fromBlock, toBlock] = [this.blocks[0].number, this.blocks.at(-1)!.number]; await this.publisher.submitEpochProof({ fromBlock, toBlock, epochNumber, publicInputs, proof }); this.log.info(`Submitted proof for epoch`, { epochNumber, uuid: this.uuid }); this.state = 'completed'; this.metrics.recordProvingJob(timer); } catch (err) { - this.log.error(`Error running epoch prover job`, err, { uuid: this.uuid }); + this.log.error(`Error running epoch ${epochNumber} prover job`, err, { uuid: this.uuid, epochNumber }); this.state = 'failed'; } finally { await this.cleanUp(this); @@ -149,13 +161,15 @@ export class EpochProvingJob { return this.l2BlockSource.getBlockHeader(blockNumber); } - private async getTxs(txHashes: TxHash[]): Promise { + private async getTxs(txHashes: TxHash[], blockNumber: number): Promise { const txs = await Promise.all( txHashes.map(txHash => this.coordination.getTxByHash(txHash).then(tx => [txHash, tx] as const)), ); const notFound = txs.filter(([_, tx]) => !tx); if (notFound.length) { - throw new Error(`Txs not found: ${notFound.map(([txHash]) => txHash.toString()).join(', ')}`); + throw new Error( + `Txs not found for block ${blockNumber}: ${notFound.map(([txHash]) => txHash.toString()).join(', ')}`, + ); } return txs.map(([_, tx]) => tx!); } @@ -169,12 +183,7 @@ export class EpochProvingJob { txs: Tx[], totalNumberOfTxs: number, ): Promise { - const [processedTxs, failedTxs] = await publicProcessor.process( - txs, - totalNumberOfTxs, - this.prover, - new EmptyTxValidator(), - ); + const [processedTxs, failedTxs] = await publicProcessor.process(txs, totalNumberOfTxs, new EmptyTxValidator()); if (failedTxs.length) { throw new Error( diff --git a/yarn-project/prover-node/src/metrics.ts b/yarn-project/prover-node/src/metrics.ts index 8ce6e25db81..f37e12ef299 100644 --- a/yarn-project/prover-node/src/metrics.ts +++ b/yarn-project/prover-node/src/metrics.ts @@ -1,18 +1,15 @@ import { type Timer } from '@aztec/foundation/timer'; -import { type Histogram, Metrics, type TelemetryClient, ValueType, millisecondBuckets } from '@aztec/telemetry-client'; +import { type Histogram, Metrics, type TelemetryClient, ValueType } from '@aztec/telemetry-client'; export class ProverNodeMetrics { provingJobDuration: Histogram; - constructor(client: TelemetryClient, name = 'ProverNode') { + constructor(public readonly client: TelemetryClient, name = 'ProverNode') { const meter = client.getMeter(name); this.provingJobDuration = meter.createHistogram(Metrics.PROVER_NODE_JOB_DURATION, { description: 'Duration of proving job', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(2), // 60 buckets spanning an interval of ~100ms to ~1hour - }, }); } diff --git a/yarn-project/prover-node/src/monitors/claims-monitor.test.ts b/yarn-project/prover-node/src/monitors/claims-monitor.test.ts index 610284e3caa..0771faaf161 100644 --- a/yarn-project/prover-node/src/monitors/claims-monitor.test.ts +++ b/yarn-project/prover-node/src/monitors/claims-monitor.test.ts @@ -2,6 +2,7 @@ import { type EpochProofClaim } from '@aztec/circuit-types'; import { EthAddress } from '@aztec/circuits.js'; import { sleep } from '@aztec/foundation/sleep'; import { type L1Publisher } from '@aztec/sequencer-client'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -21,7 +22,7 @@ describe('ClaimsMonitor', () => { publisherAddress = EthAddress.random(); l1Publisher.getSenderAddress.mockReturnValue(publisherAddress); - claimsMonitor = new ClaimsMonitor(l1Publisher, { pollingIntervalMs: 10 }); + claimsMonitor = new ClaimsMonitor(l1Publisher, new NoopTelemetryClient(), { pollingIntervalMs: 10 }); }); afterEach(async () => { diff --git a/yarn-project/prover-node/src/monitors/claims-monitor.ts b/yarn-project/prover-node/src/monitors/claims-monitor.ts index 8e2781f86c0..9aecb95b639 100644 --- a/yarn-project/prover-node/src/monitors/claims-monitor.ts +++ b/yarn-project/prover-node/src/monitors/claims-monitor.ts @@ -3,20 +3,28 @@ import { type EthAddress } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; import { type L1Publisher } from '@aztec/sequencer-client'; +import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; export interface ClaimsMonitorHandler { handleClaim(proofClaim: EpochProofClaim): Promise; } -export class ClaimsMonitor { +export class ClaimsMonitor implements Traceable { private runningPromise: RunningPromise; private log = createLogger('prover-node:claims-monitor'); private handler: ClaimsMonitorHandler | undefined; private lastClaimEpochNumber: bigint | undefined; - constructor(private readonly l1Publisher: L1Publisher, private options: { pollingIntervalMs: number }) { - this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs); + public readonly tracer: Tracer; + + constructor( + private readonly l1Publisher: L1Publisher, + telemetry: TelemetryClient, + private options: { pollingIntervalMs: number }, + ) { + this.tracer = telemetry.getTracer('ClaimsMonitor'); + this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs); } public start(handler: ClaimsMonitorHandler) { @@ -31,9 +39,11 @@ export class ClaimsMonitor { this.log.info('Stopped ClaimsMonitor'); } + @trackSpan('ClaimsMonitor.work') public async work() { const proofClaim = await this.l1Publisher.getProofClaim(); if (!proofClaim) { + this.log.trace(`Found no proof claim`); return; } diff --git a/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts b/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts index f7a0d7dc406..033cc74d1b3 100644 --- a/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts +++ b/yarn-project/prover-node/src/monitors/epoch-monitor.test.ts @@ -1,5 +1,6 @@ import { type L2BlockSource } from '@aztec/circuit-types'; import { sleep } from '@aztec/foundation/sleep'; +import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -20,7 +21,7 @@ describe('EpochMonitor', () => { }, }); - epochMonitor = new EpochMonitor(l2BlockSource, { pollingIntervalMs: 10 }); + epochMonitor = new EpochMonitor(l2BlockSource, new NoopTelemetryClient(), { pollingIntervalMs: 10 }); }); afterEach(async () => { diff --git a/yarn-project/prover-node/src/monitors/epoch-monitor.ts b/yarn-project/prover-node/src/monitors/epoch-monitor.ts index 332923ddbab..503429cf853 100644 --- a/yarn-project/prover-node/src/monitors/epoch-monitor.ts +++ b/yarn-project/prover-node/src/monitors/epoch-monitor.ts @@ -1,22 +1,29 @@ import { type L2BlockSource } from '@aztec/circuit-types'; import { createLogger } from '@aztec/foundation/log'; import { RunningPromise } from '@aztec/foundation/running-promise'; +import { type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; export interface EpochMonitorHandler { handleInitialEpochSync(epochNumber: bigint): Promise; handleEpochCompleted(epochNumber: bigint): Promise; } -export class EpochMonitor { +export class EpochMonitor implements Traceable { private runningPromise: RunningPromise; private log = createLogger('prover-node:epoch-monitor'); + public readonly tracer: Tracer; private handler: EpochMonitorHandler | undefined; private latestEpochNumber: bigint | undefined; - constructor(private readonly l2BlockSource: L2BlockSource, private options: { pollingIntervalMs: number }) { - this.runningPromise = new RunningPromise(this.work.bind(this), this.options.pollingIntervalMs); + constructor( + private readonly l2BlockSource: L2BlockSource, + telemetry: TelemetryClient, + private options: { pollingIntervalMs: number }, + ) { + this.tracer = telemetry.getTracer('EpochMonitor'); + this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.options.pollingIntervalMs); } public start(handler: EpochMonitorHandler) { @@ -30,6 +37,7 @@ export class EpochMonitor { this.log.info('Stopped EpochMonitor'); } + @trackSpan('EpochMonitor.work') public async work() { if (!this.latestEpochNumber) { const epochNumber = await this.l2BlockSource.getL2EpochNumber(); diff --git a/yarn-project/prover-node/src/prover-cache/cache_manager.ts b/yarn-project/prover-node/src/prover-cache/cache_manager.ts deleted file mode 100644 index 497300d1e42..00000000000 --- a/yarn-project/prover-node/src/prover-cache/cache_manager.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { type ProverCache } from '@aztec/circuit-types'; -import { createLogger } from '@aztec/foundation/log'; -import { AztecLmdbStore } from '@aztec/kv-store/lmdb'; -import { InMemoryProverCache } from '@aztec/prover-client'; - -import { type Dirent } from 'fs'; -import { mkdir, readFile, readdir, rm, writeFile } from 'fs/promises'; -import { join } from 'path'; - -import { KVProverCache } from './kv_cache.js'; - -const EPOCH_DIR_PREFIX = 'epoch'; -const EPOCH_DIR_SEPARATOR = '_'; -const EPOCH_HASH_FILENAME = 'epoch_hash.txt'; - -export class ProverCacheManager { - constructor(private cacheDir?: string, private log = createLogger('prover-node:cache-manager')) {} - - public async openCache(epochNumber: bigint, epochHash: Buffer): Promise { - if (!this.cacheDir) { - return new InMemoryProverCache(); - } - - const epochDir = EPOCH_DIR_PREFIX + EPOCH_DIR_SEPARATOR + epochNumber; - const dataDir = join(this.cacheDir, epochDir); - - const storedEpochHash = await readFile(join(dataDir, EPOCH_HASH_FILENAME), 'hex').catch(() => Buffer.alloc(0)); - if (storedEpochHash.toString() !== epochHash.toString()) { - await rm(dataDir, { recursive: true, force: true }); - } - - await mkdir(dataDir, { recursive: true }); - await writeFile(join(dataDir, EPOCH_HASH_FILENAME), epochHash.toString('hex')); - - const store = AztecLmdbStore.open(dataDir); - this.log.debug(`Created new database for epoch ${epochNumber} at ${dataDir}`); - const cleanup = () => store.close(); - return new KVProverCache(store, cleanup); - } - - /** - * Removes all caches for epochs older than the given epoch (including) - * @param upToAndIncludingEpoch - The epoch number up to which to remove caches - */ - public async removeStaleCaches(upToAndIncludingEpoch: bigint): Promise { - if (!this.cacheDir) { - return; - } - - const entries: Dirent[] = await readdir(this.cacheDir, { withFileTypes: true }).catch(() => []); - - for (const item of entries) { - if (!item.isDirectory()) { - continue; - } - - const [prefix, epochNumber] = item.name.split(EPOCH_DIR_SEPARATOR); - if (prefix !== EPOCH_DIR_PREFIX) { - continue; - } - - const epochNumberInt = BigInt(epochNumber); - if (epochNumberInt <= upToAndIncludingEpoch) { - this.log.info(`Removing old epoch database for epoch ${epochNumberInt} at ${join(this.cacheDir, item.name)}`); - await rm(join(this.cacheDir, item.name), { recursive: true }); - } - } - } -} diff --git a/yarn-project/prover-node/src/prover-cache/kv_cache.ts b/yarn-project/prover-node/src/prover-cache/kv_cache.ts deleted file mode 100644 index 82b216e384a..00000000000 --- a/yarn-project/prover-node/src/prover-cache/kv_cache.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { ProverCache, ProvingJobStatus } from '@aztec/circuit-types'; -import type { AztecKVStore, AztecMap } from '@aztec/kv-store'; - -export class KVProverCache implements ProverCache { - private proofs: AztecMap; - - constructor(store: AztecKVStore, private cleanup?: () => Promise) { - this.proofs = store.openMap('prover_node_proof_status'); - } - - getProvingJobStatus(jobId: string): Promise { - const item = this.proofs.get(jobId); - if (!item) { - return Promise.resolve({ status: 'not-found' }); - } - - return Promise.resolve(JSON.parse(item)); - } - - setProvingJobStatus(jobId: string, status: ProvingJobStatus): Promise { - return this.proofs.set(jobId, JSON.stringify(status)); - } - - async close(): Promise { - await this.cleanup?.(); - } -} diff --git a/yarn-project/prover-node/src/prover-coordination/factory.ts b/yarn-project/prover-node/src/prover-coordination/factory.ts index e8e94f1153a..48194d44c47 100644 --- a/yarn-project/prover-node/src/prover-coordination/factory.ts +++ b/yarn-project/prover-node/src/prover-coordination/factory.ts @@ -1,6 +1,11 @@ import { type ArchiveSource, type Archiver } from '@aztec/archiver'; import { BBCircuitVerifier, TestCircuitVerifier } from '@aztec/bb-prover'; -import { type ProverCoordination, type WorldStateSynchronizer, createAztecNodeClient } from '@aztec/circuit-types'; +import { + P2PClientType, + type ProverCoordination, + type WorldStateSynchronizer, + createAztecNodeClient, +} from '@aztec/circuit-types'; import { createLogger } from '@aztec/foundation/log'; import { type DataStoreConfig } from '@aztec/kv-store/config'; import { createP2PClient } from '@aztec/p2p'; @@ -42,6 +47,7 @@ export async function createProverCoordination( const proofVerifier = config.realProofs ? await BBCircuitVerifier.new(config) : new TestCircuitVerifier(); const p2pClient = await createP2PClient( + P2PClientType.Prover, config, deps.archiver, proofVerifier, diff --git a/yarn-project/prover-node/src/prover-node.test.ts b/yarn-project/prover-node/src/prover-node.test.ts index 98714c2e1d0..f3fce627a36 100644 --- a/yarn-project/prover-node/src/prover-node.test.ts +++ b/yarn-project/prover-node/src/prover-node.test.ts @@ -7,7 +7,7 @@ import { type L2Block, type L2BlockSource, type MerkleTreeWriteOperations, - type ProverCache, + P2PClientType, type ProverCoordination, WorldStateRunningState, type WorldStateSynchronizer, @@ -15,15 +15,10 @@ import { import { type ContractDataSource, EthAddress, Fr } from '@aztec/circuits.js'; import { times } from '@aztec/foundation/collection'; import { Signature } from '@aztec/foundation/eth-signature'; +import { makeBackoff, retry } from '@aztec/foundation/retry'; import { sleep } from '@aztec/foundation/sleep'; import { openTmpStore } from '@aztec/kv-store/lmdb'; -import { - type BootstrapNode, - InMemoryAttestationPool, - InMemoryTxPool, - MemoryEpochProofQuotePool, - P2PClient, -} from '@aztec/p2p'; +import { type BootstrapNode, InMemoryTxPool, MemoryEpochProofQuotePool, P2PClient } from '@aztec/p2p'; import { createBootstrapNode, createTestLibP2PService } from '@aztec/p2p/mocks'; import { type L1Publisher } from '@aztec/sequencer-client'; import { type PublicProcessorFactory } from '@aztec/simulator'; @@ -36,7 +31,6 @@ import { type BondManager } from './bond/bond-manager.js'; import { type EpochProvingJob } from './job/epoch-proving-job.js'; import { ClaimsMonitor } from './monitors/claims-monitor.js'; import { EpochMonitor } from './monitors/epoch-monitor.js'; -import { ProverCacheManager } from './prover-cache/cache_manager.js'; import { ProverNode, type ProverNodeOptions } from './prover-node.js'; import { type QuoteProvider } from './quote-provider/index.js'; import { type QuoteSigner } from './quote-signer.js'; @@ -103,7 +97,6 @@ describe('prover-node', () => { epochMonitor, bondManager, telemetryClient, - new ProverCacheManager(), config, ); @@ -225,17 +218,15 @@ describe('prover-node', () => { }); it('starts proving if there is a claim sent by us', async () => { - publisher.getProofClaim.mockResolvedValue(claim); l2BlockSource.getProvenL2EpochNumber.mockResolvedValue(9); - await proverNode.handleInitialEpochSync(10n); + await proverNode.handleClaim(claim); expect(jobs[0].epochNumber).toEqual(10n); }); it('does not start proving if there is a claim sent by us but proof has already landed', async () => { - publisher.getProofClaim.mockResolvedValue(claim); l2BlockSource.getProvenL2EpochNumber.mockResolvedValue(10); - await proverNode.handleInitialEpochSync(10n); + await proverNode.handleClaim(claim); expect(jobs.length).toEqual(0); }); @@ -249,8 +240,9 @@ describe('prover-node', () => { let lastEpochComplete: bigint = 0n; beforeEach(() => { - claimsMonitor = new ClaimsMonitor(publisher, config); - epochMonitor = new EpochMonitor(l2BlockSource, config); + const telemetry = new NoopTelemetryClient(); + claimsMonitor = new ClaimsMonitor(publisher, telemetry, config); + epochMonitor = new EpochMonitor(l2BlockSource, telemetry, config); l2BlockSource.isEpochComplete.mockImplementation(epochNumber => Promise.resolve(epochNumber <= lastEpochComplete), @@ -267,6 +259,27 @@ describe('prover-node', () => { expect(coordination.addEpochProofQuote).toHaveBeenCalledTimes(1); }); + it('starts proving if there is a claim during initial sync', async () => { + l2BlockSource.getL2EpochNumber.mockResolvedValue(11n); + publisher.getProofClaim.mockResolvedValue(claim); + + await proverNode.start(); + await sleep(100); + + expect(jobs[0].epochNumber).toEqual(10n); + expect(jobs.length).toEqual(1); + }); + + it('does not start proving if there is a claim for proven epoch during initial sync', async () => { + l2BlockSource.getProvenL2EpochNumber.mockResolvedValue(10); + publisher.getProofClaim.mockResolvedValue(claim); + + await proverNode.start(); + await sleep(100); + + expect(jobs.length).toEqual(0); + }); + it('sends another quote when a new epoch is completed', async () => { lastEpochComplete = 10n; l2BlockSource.getL2EpochNumber.mockResolvedValue(11n); @@ -297,16 +310,16 @@ describe('prover-node', () => { // - The prover node can get the it is missing via p2p, or it has them in it's mempool describe('Using a p2p coordination', () => { let bootnode: BootstrapNode; - let p2pClient: P2PClient; - let otherP2PClient: P2PClient; + let p2pClient: P2PClient; + let otherP2PClient: P2PClient; const createP2PClient = async (bootnodeAddr: string, port: number) => { const mempools = { txPool: new InMemoryTxPool(telemetryClient), - attestationPool: new InMemoryAttestationPool(telemetryClient), epochProofQuotePool: new MemoryEpochProofQuotePool(telemetryClient), }; const libp2pService = await createTestLibP2PService( + P2PClientType.Prover, [bootnodeAddr], l2BlockSource, worldState, @@ -315,7 +328,7 @@ describe('prover-node', () => { port, ); const kvStore = openTmpStore(); - return new P2PClient(kvStore, l2BlockSource, mempools, libp2pService, 0); + return new P2PClient(P2PClientType.Prover, kvStore, l2BlockSource, mempools, libp2pService, 0); }; beforeEach(async () => { @@ -367,10 +380,15 @@ describe('prover-node', () => { await proverNode.handleEpochCompleted(10n); // Wait for message to be propagated - await sleep(1000); - - // Check the other node received a quote via p2p - expect(p2pEpochReceivedSpy).toHaveBeenCalledTimes(1); + await retry( + // eslint-disable-next-line require-await + async () => { + // Check the other node received a quote via p2p + expect(p2pEpochReceivedSpy).toHaveBeenCalledTimes(1); + }, + 'Waiting for quote to be received', + makeBackoff(times(20, () => 1)), + ); // We should be able to retreive the quote from the other node const peerFinalStateQuotes = await otherP2PClient.getEpochProofQuotes(10n); @@ -383,7 +401,6 @@ describe('prover-node', () => { protected override doCreateEpochProvingJob( epochNumber: bigint, _blocks: L2Block[], - _cache: ProverCache, _publicProcessorFactory: PublicProcessorFactory, cleanUp: (job: EpochProvingJob) => Promise, ): EpochProvingJob { diff --git a/yarn-project/prover-node/src/prover-node.ts b/yarn-project/prover-node/src/prover-node.ts index d70ce17bb87..8eec703ffed 100644 --- a/yarn-project/prover-node/src/prover-node.ts +++ b/yarn-project/prover-node/src/prover-node.ts @@ -6,7 +6,7 @@ import { type L1ToL2MessageSource, type L2Block, type L2BlockSource, - type ProverCache, + type P2PClientType, type ProverCoordination, type ProverNodeApi, type Service, @@ -15,20 +15,18 @@ import { } from '@aztec/circuit-types'; import { type ContractDataSource } from '@aztec/circuits.js'; import { compact } from '@aztec/foundation/collection'; -import { sha256 } from '@aztec/foundation/crypto'; import { createLogger } from '@aztec/foundation/log'; import { type Maybe } from '@aztec/foundation/types'; import { type P2P } from '@aztec/p2p'; import { type L1Publisher } from '@aztec/sequencer-client'; import { PublicProcessorFactory } from '@aztec/simulator'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { type BondManager } from './bond/bond-manager.js'; import { EpochProvingJob, type EpochProvingJobState } from './job/epoch-proving-job.js'; import { ProverNodeMetrics } from './metrics.js'; import { type ClaimsMonitor, type ClaimsMonitorHandler } from './monitors/claims-monitor.js'; import { type EpochMonitor, type EpochMonitorHandler } from './monitors/epoch-monitor.js'; -import { type ProverCacheManager } from './prover-cache/cache_manager.js'; import { type QuoteProvider } from './quote-provider/index.js'; import { type QuoteSigner } from './quote-signer.js'; @@ -44,7 +42,7 @@ export type ProverNodeOptions = { * from a tx source in the p2p network or an external node, re-executes their public functions, creates a rollup * proof for the epoch, and submits it to L1. */ -export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, ProverNodeApi { +export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, ProverNodeApi, Traceable { private log = createLogger('prover-node'); private latestEpochWeAreProving: bigint | undefined; @@ -52,6 +50,8 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr private options: ProverNodeOptions; private metrics: ProverNodeMetrics; + public readonly tracer: Tracer; + constructor( private readonly prover: EpochProverManager, private readonly publisher: L1Publisher, @@ -66,7 +66,6 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr private readonly epochsMonitor: EpochMonitor, private readonly bondManager: BondManager, private readonly telemetryClient: TelemetryClient, - private readonly proverCacheManager: ProverCacheManager, options: Partial = {}, ) { this.options = { @@ -77,10 +76,11 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr }; this.metrics = new ProverNodeMetrics(telemetryClient, 'ProverNode'); + this.tracer = telemetryClient.getTracer('ProverNode'); } public getP2P() { - const asP2PClient = this.coordination as P2P; + const asP2PClient = this.coordination as P2P; if (typeof asP2PClient.isP2PClient === 'function' && asP2PClient.isP2PClient()) { return asP2PClient; } @@ -93,6 +93,12 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr return; } + const provenEpoch = await this.l2BlockSource.getProvenL2EpochNumber(); + if (provenEpoch !== undefined && proofClaim.epochToProve <= provenEpoch) { + this.log.verbose(`Claim for epoch ${proofClaim.epochToProve} is already proven`); + return; + } + try { await this.startProof(proofClaim.epochToProve); this.latestEpochWeAreProving = proofClaim.epochToProve; @@ -117,12 +123,8 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr try { const claim = await this.publisher.getProofClaim(); if (!claim || claim.epochToProve < epochNumber) { + this.log.verbose(`Handling epoch ${epochNumber} completed as initial sync`); await this.handleEpochCompleted(epochNumber); - } else if (claim && claim.bondProvider.equals(this.publisher.getSenderAddress())) { - const lastEpochProven = await this.l2BlockSource.getProvenL2EpochNumber(); - if (lastEpochProven === undefined || lastEpochProven < claim.epochToProve) { - await this.handleClaim(claim); - } } } catch (err) { this.log.error(`Error handling initial epoch sync`, err); @@ -245,6 +247,7 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr return maxPendingJobs === 0 || this.jobs.size < maxPendingJobs; } + @trackSpan('ProverNode.createProvingJob', epochNumber => ({ [Attributes.EPOCH_NUMBER]: Number(epochNumber) })) private async createProvingJob(epochNumber: bigint) { if (!this.checkMaximumPendingJobs()) { throw new Error(`Maximum pending proving jobs ${this.options.maxPendingJobs} reached. Cannot create new job.`); @@ -265,16 +268,12 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr // Create a processor using the forked world state const publicProcessorFactory = new PublicProcessorFactory(this.contractDataSource, this.telemetryClient); - const epochHash = sha256(Buffer.concat(blocks.map(block => block.hash().toBuffer()))); - const proverCache = await this.proverCacheManager.openCache(epochNumber, epochHash); - - const cleanUp = async () => { - await proverCache.close(); - await this.proverCacheManager.removeStaleCaches(epochNumber); + const cleanUp = () => { this.jobs.delete(job.getId()); + return Promise.resolve(); }; - const job = this.doCreateEpochProvingJob(epochNumber, blocks, proverCache, publicProcessorFactory, cleanUp); + const job = this.doCreateEpochProvingJob(epochNumber, blocks, publicProcessorFactory, cleanUp); this.jobs.set(job.getId(), job); return job; } @@ -283,7 +282,6 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr protected doCreateEpochProvingJob( epochNumber: bigint, blocks: L2Block[], - proverCache: ProverCache, publicProcessorFactory: PublicProcessorFactory, cleanUp: () => Promise, ) { @@ -291,7 +289,7 @@ export class ProverNode implements ClaimsMonitorHandler, EpochMonitorHandler, Pr this.worldState, epochNumber, blocks, - this.prover.createEpochProver(proverCache), + this.prover.createEpochProver(), publicProcessorFactory, this.publisher, this.l2BlockSource, diff --git a/yarn-project/pxe/src/bin/index.ts b/yarn-project/pxe/src/bin/index.ts index 5ba7ce5aa0e..66f451dae92 100644 --- a/yarn-project/pxe/src/bin/index.ts +++ b/yarn-project/pxe/src/bin/index.ts @@ -5,7 +5,7 @@ import { createLogger } from '@aztec/foundation/log'; import { getPXEServiceConfig } from '../config/index.js'; import { startPXEHttpServer } from '../pxe_http/index.js'; -import { createPXEService } from '../utils/index.js'; +import { createPXEService } from '../utils/create_pxe_service.js'; const { PXE_PORT = 8080, AZTEC_NODE_URL = 'http://localhost:8079' } = process.env; @@ -23,9 +23,8 @@ async function main() { const nodeRpcClient = createAztecNodeClient(AZTEC_NODE_URL); const pxeService = await createPXEService(nodeRpcClient, pxeConfig); - const shutdown = async () => { + const shutdown = () => { logger.info('Shutting down...'); - await pxeService.stop(); process.exit(0); }; diff --git a/yarn-project/pxe/src/config/index.ts b/yarn-project/pxe/src/config/index.ts index 4841f7ce6fd..7eeb270453f 100644 --- a/yarn-project/pxe/src/config/index.ts +++ b/yarn-project/pxe/src/config/index.ts @@ -28,8 +28,6 @@ export interface KernelProverConfig { * Configuration settings for the PXE. */ export interface PXEConfig { - /** The interval to wait between polling for new blocks. */ - l2BlockPollingIntervalMS: number; /** L2 block to start scanning from for new accounts */ l2StartingBlock: number; } @@ -47,11 +45,6 @@ export type CliPXEOptions = { export const pxeConfigMappings: ConfigMappingsType = { ...dataConfigMappings, - l2BlockPollingIntervalMS: { - env: 'PXE_BLOCK_POLLING_INTERVAL_MS', - description: 'The interval to wait between polling for new blocks.', - ...numberConfigHelper(1_000), - }, l2StartingBlock: { env: 'PXE_L2_STARTING_BLOCK', ...numberConfigHelper(INITIAL_L2_BLOCK_NUM), diff --git a/yarn-project/pxe/src/database/incoming_note_dao.ts b/yarn-project/pxe/src/database/incoming_note_dao.ts index 2c9c62821cb..d4c4192c3a5 100644 --- a/yarn-project/pxe/src/database/incoming_note_dao.ts +++ b/yarn-project/pxe/src/database/incoming_note_dao.ts @@ -78,7 +78,7 @@ export class IncomingNoteDao implements NoteData { this.noteTypeId, this.txHash.buffer, this.l2BlockNumber, - Fr.fromString(this.l2BlockHash), + Fr.fromHexString(this.l2BlockHash), this.nonce, this.noteHash, this.siloedNullifier, diff --git a/yarn-project/pxe/src/database/kv_pxe_database.ts b/yarn-project/pxe/src/database/kv_pxe_database.ts index 866d2df92c7..7ff1f19062b 100644 --- a/yarn-project/pxe/src/database/kv_pxe_database.ts +++ b/yarn-project/pxe/src/database/kv_pxe_database.ts @@ -46,7 +46,6 @@ export class KVPxeDatabase implements PxeDatabase { #nullifiedNotesByTxHash: AztecAsyncMultiMap; #nullifiedNotesByAddressPoint: AztecAsyncMultiMap; #nullifiedNotesByNullifier: AztecAsyncMap; - #syncedBlockPerPublicKey: AztecAsyncMap; #contractArtifacts: AztecAsyncMap; #contractInstances: AztecAsyncMap; #db: AztecAsyncKVStore; @@ -79,7 +78,6 @@ export class KVPxeDatabase implements PxeDatabase { this.#contractInstances = db.openMap('contracts_instances'); this.#synchronizedBlock = db.openSingleton('header'); - this.#syncedBlockPerPublicKey = db.openMap('synced_block_per_public_key'); this.#notes = db.openMap('notes'); this.#nullifiedNotes = db.openMap('nullified_notes'); @@ -564,14 +562,6 @@ export class KVPxeDatabase implements PxeDatabase { return true; } - getSynchedBlockNumberForAccount(account: AztecAddress): Promise { - return this.#syncedBlockPerPublicKey.getAsync(account.toString()); - } - - setSynchedBlockNumberForAccount(account: AztecAddress, blockNumber: number): Promise { - return this.#syncedBlockPerPublicKey.set(account.toString(), blockNumber); - } - async estimateSize(): Promise { const incomingNotesSize = (await this.getIncomingNotes({})).reduce((sum, note) => sum + note.getSize(), 0); @@ -595,7 +585,9 @@ export class KVPxeDatabase implements PxeDatabase { async #setTaggingSecretsIndexes(indexedSecrets: IndexedTaggingSecret[], storageMap: AztecAsyncMap) { await Promise.all( - indexedSecrets.map(indexedSecret => storageMap.set(indexedSecret.secret.toString(), indexedSecret.index)), + indexedSecrets.map(indexedSecret => + storageMap.set(indexedSecret.appTaggingSecret.toString(), indexedSecret.index), + ), ); } diff --git a/yarn-project/pxe/src/database/outgoing_note_dao.ts b/yarn-project/pxe/src/database/outgoing_note_dao.ts index 386b23ecd57..211c66cea7b 100644 --- a/yarn-project/pxe/src/database/outgoing_note_dao.ts +++ b/yarn-project/pxe/src/database/outgoing_note_dao.ts @@ -71,7 +71,7 @@ export class OutgoingNoteDao { this.noteTypeId, this.txHash.buffer, this.l2BlockNumber, - Fr.fromString(this.l2BlockHash), + Fr.fromHexString(this.l2BlockHash), this.nonce, this.noteHash, this.index, diff --git a/yarn-project/pxe/src/database/pxe_database.ts b/yarn-project/pxe/src/database/pxe_database.ts index 0b24e77b99a..4f2fd1557f2 100644 --- a/yarn-project/pxe/src/database/pxe_database.ts +++ b/yarn-project/pxe/src/database/pxe_database.ts @@ -160,19 +160,6 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD */ getCompleteAddresses(): Promise; - /** - * Updates up to which block number we have processed notes for a given public key. - * @param account - The account to set the synched block number for. - * @param blockNumber - The block number to set. - */ - setSynchedBlockNumberForAccount(account: AztecAddress, blockNumber: number): Promise; - - /** - * Get the synched block number for a given public key. - * @param account - The account to get the synched block number for. - */ - getSynchedBlockNumberForAccount(account: AztecAddress): Promise; - /** * Returns the estimated size in bytes of this db. * @returns The estimated size in bytes of this db. diff --git a/yarn-project/pxe/src/index.ts b/yarn-project/pxe/src/index.ts index d0bdaa737a6..e97f38565f2 100644 --- a/yarn-project/pxe/src/index.ts +++ b/yarn-project/pxe/src/index.ts @@ -1,6 +1,7 @@ export * from './pxe_service/index.js'; export * from './pxe_http/index.js'; export * from './config/index.js'; +export * from './utils/create_pxe_service.js'; export { Tx, TxHash } from '@aztec/circuit-types'; @@ -10,7 +11,6 @@ export * from '@aztec/foundation/eth-address'; export * from '@aztec/foundation/aztec-address'; export * from '@aztec/key-store'; export * from './database/index.js'; -export * from './utils/index.js'; export { ContractDataOracle } from './contract_data_oracle/index.js'; export { PrivateFunctionsTree } from './contract_data_oracle/private_functions_tree.js'; export { SimulatorOracle } from './simulator_oracle/index.js'; diff --git a/yarn-project/pxe/src/kernel_oracle/index.ts b/yarn-project/pxe/src/kernel_oracle/index.ts index 7a5648ed7c3..030f8d4cf0f 100644 --- a/yarn-project/pxe/src/kernel_oracle/index.ts +++ b/yarn-project/pxe/src/kernel_oracle/index.ts @@ -15,7 +15,7 @@ import { import { createLogger } from '@aztec/foundation/log'; import { type Tuple } from '@aztec/foundation/serialize'; import { type KeyStore } from '@aztec/key-store'; -import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types'; +import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-types/client'; import { type ContractDataOracle } from '../contract_data_oracle/index.js'; import { type ProvingDataOracle } from './../kernel_prover/proving_data_oracle.js'; diff --git a/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts b/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts index 438506677df..b7435a4483b 100644 --- a/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts +++ b/yarn-project/pxe/src/kernel_prover/hints/build_private_kernel_reset_private_inputs.ts @@ -37,7 +37,7 @@ import { import { makeTuple } from '@aztec/foundation/array'; import { padArrayEnd } from '@aztec/foundation/collection'; import { type Tuple, assertLength } from '@aztec/foundation/serialize'; -import { privateKernelResetDimensionsConfig } from '@aztec/noir-protocol-circuits-types'; +import { privateKernelResetDimensionsConfig } from '@aztec/noir-protocol-circuits-types/client'; import { type ProvingDataOracle } from '../proving_data_oracle.js'; diff --git a/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts b/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts index d7ae9401a9b..7795a069f7e 100644 --- a/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts +++ b/yarn-project/pxe/src/kernel_prover/kernel_prover.test.ts @@ -111,12 +111,6 @@ describe('Kernel Prover', () => { }; }; - const computeAppCircuitVerificationKeyOutput = () => { - return { - verificationKey: VerificationKeyAsFields.makeEmpty(CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS), - }; - }; - const expectExecution = (fns: string[]) => { const callStackItemsInit = proofCreator.simulateProofInit.mock.calls.map(args => String.fromCharCode(args[0].privateCall.publicInputs.callContext.functionSelector.value), @@ -157,7 +151,6 @@ describe('Kernel Prover', () => { proofCreator.simulateProofInner.mockResolvedValue(simulateProofOutput([])); proofCreator.simulateProofReset.mockResolvedValue(simulateProofOutput([])); proofCreator.simulateProofTail.mockResolvedValue(simulateProofOutputFinal([])); - proofCreator.computeAppCircuitVerificationKey.mockResolvedValue(computeAppCircuitVerificationKeyOutput()); prover = new KernelProver(oracle, proofCreator); }); diff --git a/yarn-project/pxe/src/kernel_prover/kernel_prover.ts b/yarn-project/pxe/src/kernel_prover/kernel_prover.ts index 9969c9ab210..a43676a6bbe 100644 --- a/yarn-project/pxe/src/kernel_prover/kernel_prover.ts +++ b/yarn-project/pxe/src/kernel_prover/kernel_prover.ts @@ -31,7 +31,8 @@ import { vkAsFieldsMegaHonk } from '@aztec/foundation/crypto'; import { createLogger } from '@aztec/foundation/log'; import { assertLength } from '@aztec/foundation/serialize'; import { pushTestData } from '@aztec/foundation/testing'; -import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; +import { Timer } from '@aztec/foundation/timer'; +import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/client'; import { getProtocolContractSiblingPath, isProtocolContract, @@ -118,6 +119,10 @@ export class KernelProver { profile: boolean = false, dryRun: boolean = false, ): Promise> { + const timer = new Timer(); + + const isPrivateOnlyTx = this.isPrivateOnly(executionResult); + const executionStack = [executionResult]; let firstIteration = true; @@ -193,8 +198,11 @@ export class KernelProver { getVKTreeRoot(), protocolContractTreeRoot, privateCallData, + isPrivateOnlyTx, ); + pushTestData('private-kernel-inputs-init', proofInput); + output = await this.proofCreator.simulateProofInit(proofInput); acirs.push(output.bytecode); @@ -211,7 +219,9 @@ export class KernelProver { assertLength(previousVkMembershipWitness.siblingPath, VK_TREE_HEIGHT), ); const proofInput = new PrivateKernelInnerCircuitPrivateInputs(previousKernelData, privateCallData); + pushTestData('private-kernel-inputs-inner', proofInput); + output = await this.proofCreator.simulateProofInner(proofInput); acirs.push(output.bytecode); @@ -264,6 +274,7 @@ export class KernelProver { const privateInputs = new PrivateKernelTailCircuitPrivateInputs(previousKernelData); pushTestData('private-kernel-inputs-ordering', privateInputs); + const tailOutput = await this.proofCreator.simulateProofTail(privateInputs); if (tailOutput.publicInputs.forPublic) { const privateLogs = privateInputs.previousKernel.publicInputs.end.privateLogs; @@ -279,6 +290,8 @@ export class KernelProver { tailOutput.profileResult = { gateCounts }; } + this.log.info(`Witness generation took ${timer.ms()}ms`); + // TODO(#7368) how do we 'bincode' encode these inputs? if (!dryRun) { const ivcProof = await this.proofCreator.createClientIvcProof(acirs, witnessStack); @@ -324,4 +337,14 @@ export class KernelProver { acirHash, }); } + + private isPrivateOnly(executionResult: PrivateExecutionResult): boolean { + const makesPublicCalls = + executionResult.enqueuedPublicFunctionCalls.some(enqueuedCall => !enqueuedCall.isEmpty()) || + !executionResult.publicTeardownFunctionCall.isEmpty(); + return ( + !makesPublicCalls && + executionResult.nestedExecutions.every(nestedExecution => this.isPrivateOnly(nestedExecution)) + ); + } } diff --git a/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts b/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts index deaa11cbd38..b6e4e918077 100644 --- a/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts +++ b/yarn-project/pxe/src/kernel_prover/test/test_circuit_prover.ts @@ -1,11 +1,6 @@ -import { - type AppCircuitSimulateOutput, - type PrivateKernelProver, - type PrivateKernelSimulateOutput, -} from '@aztec/circuit-types'; +import { type PrivateKernelProver, type PrivateKernelSimulateOutput } from '@aztec/circuit-types'; import type { CircuitSimulationStats } from '@aztec/circuit-types/stats'; import { - CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS, ClientIvcProof, type PrivateKernelCircuitPublicInputs, type PrivateKernelInitCircuitPrivateInputs, @@ -13,13 +8,12 @@ import { type PrivateKernelResetCircuitPrivateInputs, type PrivateKernelTailCircuitPrivateInputs, type PrivateKernelTailCircuitPublicInputs, - VerificationKeyAsFields, } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; import { elapsed } from '@aztec/foundation/timer'; import { - type ProtocolArtifact, - ProtocolCircuitVks, + ClientCircuitVks, + type ClientProtocolArtifact, executeInit, executeInner, executeReset, @@ -27,7 +21,7 @@ import { executeTailForPublic, getPrivateKernelResetArtifactName, maxPrivateKernelResetDimensions, -} from '@aztec/noir-protocol-circuits-types'; +} from '@aztec/noir-protocol-circuits-types/client'; import { type WitnessMap } from '@noir-lang/types'; @@ -73,7 +67,9 @@ export class TestPrivateKernelProver implements PrivateKernelProver { privateInputs: PrivateKernelResetCircuitPrivateInputs, ): Promise> { const variantPrivateInputs = privateInputs.trimToSizes(); - const [duration, result] = await elapsed(() => executeReset(variantPrivateInputs, privateInputs.dimensions)); + const [duration, result] = await elapsed(() => + executeReset(variantPrivateInputs, privateInputs.dimensions, privateInputs), + ); this.log.debug(`Simulated private kernel reset`, { eventName: 'circuit-simulation', circuitName: 'private-kernel-reset', @@ -112,22 +108,12 @@ export class TestPrivateKernelProver implements PrivateKernelProver { return Promise.resolve(0); } - computeAppCircuitVerificationKey( - _bytecode: Buffer, - _appCircuitName?: string | undefined, - ): Promise { - const appCircuitProofOutput: AppCircuitSimulateOutput = { - verificationKey: VerificationKeyAsFields.makeEmpty(CLIENT_IVC_VERIFICATION_KEY_LENGTH_IN_FIELDS), - }; - return Promise.resolve(appCircuitProofOutput); - } - private makeEmptyKernelSimulateOutput< PublicInputsType extends PrivateKernelTailCircuitPublicInputs | PrivateKernelCircuitPublicInputs, - >(publicInputs: PublicInputsType, circuitType: ProtocolArtifact) { + >(publicInputs: PublicInputsType, circuitType: ClientProtocolArtifact) { const kernelProofOutput: PrivateKernelSimulateOutput = { publicInputs, - verificationKey: ProtocolCircuitVks[circuitType].keyAsFields, + verificationKey: ClientCircuitVks[circuitType].keyAsFields, outputWitness: new Map(), bytecode: Buffer.from([]), }; diff --git a/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts b/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts index 3632949065d..7ce0ade4c4a 100644 --- a/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts +++ b/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts @@ -18,7 +18,7 @@ export interface NoteInfo { * @dev Finds the index in the note hash tree by computing the note hash with different nonce and see which hash for * the current tx matches this value. * @remarks This method assists in identifying spent notes in the note hash tree. - * @param siloedNoteHashes - Note hashes in the tx. One of them should correspond to the note we are looking for + * @param uniqueNoteHashes - Note hashes in the tx. One of them should correspond to the note we are looking for * @param txHash - Hash of a tx the note was emitted in. * @param contractAddress - Address of the contract the note was emitted in. * @param storageSlot - Storage slot of the note. @@ -32,7 +32,7 @@ export interface NoteInfo { */ export async function bruteForceNoteInfo( simulator: AcirSimulator, - siloedNoteHashes: Fr[], + uniqueNoteHashes: Fr[], txHash: TxHash, contractAddress: AztecAddress, storageSlot: Fr, @@ -44,22 +44,22 @@ export async function bruteForceNoteInfo( let noteHashIndex = 0; let nonce: Fr | undefined; let noteHash: Fr | undefined; - let siloedNoteHash: Fr | undefined; + let uniqueNoteHash: Fr | undefined; let innerNullifier: Fr | undefined; const firstNullifier = Fr.fromBuffer(txHash.toBuffer()); - for (; noteHashIndex < siloedNoteHashes.length; ++noteHashIndex) { + for (; noteHashIndex < uniqueNoteHashes.length; ++noteHashIndex) { if (excludedIndices.has(noteHashIndex)) { continue; } - const siloedNoteHashFromTxEffect = siloedNoteHashes[noteHashIndex]; - if (siloedNoteHashFromTxEffect.equals(Fr.ZERO)) { + const uniqueNoteHashFromTxEffect = uniqueNoteHashes[noteHashIndex]; + if (uniqueNoteHashFromTxEffect.equals(Fr.ZERO)) { break; } const expectedNonce = computeNoteHashNonce(firstNullifier, noteHashIndex); - ({ noteHash, siloedNoteHash, innerNullifier } = await simulator.computeNoteHashAndOptionallyANullifier( + ({ noteHash, uniqueNoteHash, innerNullifier } = await simulator.computeNoteHashAndOptionallyANullifier( contractAddress, expectedNonce, storageSlot, @@ -68,7 +68,7 @@ export async function bruteForceNoteInfo( note, )); - if (siloedNoteHashFromTxEffect.equals(siloedNoteHash)) { + if (uniqueNoteHashFromTxEffect.equals(uniqueNoteHash)) { nonce = expectedNonce; break; } diff --git a/yarn-project/pxe/src/pxe_service/error_enriching.ts b/yarn-project/pxe/src/pxe_service/error_enriching.ts index cb71823fe13..2c18f72b1e2 100644 --- a/yarn-project/pxe/src/pxe_service/error_enriching.ts +++ b/yarn-project/pxe/src/pxe_service/error_enriching.ts @@ -39,7 +39,7 @@ export async function enrichSimulationError(err: SimulationError, db: PxeDatabas ); } else { logger.warn( - `Could not function artifact in contract ${contract.name} for function '${fnName}' when enriching error callstack`, + `Could not find function artifact in contract ${contract.name} for function '${fnName}' when enriching error callstack`, ); } }); diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index 92f3e449062..ec8c0226d61 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -52,18 +52,16 @@ import { type ContractArtifact, EventSelector, FunctionSelector, + FunctionType, encodeArguments, } from '@aztec/foundation/abi'; import { Fr, type Point } from '@aztec/foundation/fields'; import { type Logger, createLogger } from '@aztec/foundation/log'; -import { SerialQueue } from '@aztec/foundation/queue'; +import { Timer } from '@aztec/foundation/timer'; import { type KeyStore } from '@aztec/key-store'; import { type L2TipsStore } from '@aztec/kv-store/stores'; -import { - ProtocolContractAddress, - getCanonicalProtocolContract, - protocolContractNames, -} from '@aztec/protocol-contracts'; +import { ProtocolContractAddress, protocolContractNames } from '@aztec/protocol-contracts'; +import { getCanonicalProtocolContract } from '@aztec/protocol-contracts/bundle'; import { type AcirSimulator } from '@aztec/simulator/client'; import { inspect } from 'util'; @@ -89,9 +87,6 @@ export class PXEService implements PXE { private simulator: AcirSimulator; private log: Logger; private packageVersion: string; - // serialize synchronizer and calls to proveTx. - // ensures that state is not changed while simulating - private jobQueue = new SerialQueue(); constructor( private keyStore: KeyStore, @@ -107,8 +102,6 @@ export class PXEService implements PXE { this.contractDataOracle = new ContractDataOracle(db); this.simulator = getAcirSimulator(db, node, keyStore, this.contractDataOracle); this.packageVersion = getPackageInfo().version; - - this.jobQueue.start(); } /** @@ -116,27 +109,12 @@ export class PXEService implements PXE { * * @returns A promise that resolves when the server has started successfully. */ - public async start() { - await this.synchronizer.start(); + public async init() { await this.#registerProtocolContracts(); const info = await this.getNodeInfo(); this.log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.protocolVersion}`); } - /** - * Stops the PXE Service, halting processing of new transactions and shutting down the synchronizer. - * This function ensures that all ongoing tasks are completed before stopping the server. - * It is useful for gracefully shutting down the server during maintenance or restarts. - * - * @returns A Promise resolving once the server has been stopped successfully. - */ - public async stop() { - await this.jobQueue.cancel(); - this.log.info('Cancelled Job Queue'); - await this.synchronizer.stop(); - this.log.info('Stopped Synchronizer'); - } - isL1ToL2MessageSynced(l1ToL2Message: Fr): Promise { return this.node.isL1ToL2MessageSynced(l1ToL2Message); } @@ -263,8 +241,14 @@ export class PXEService implements PXE { await this.db.addContractArtifact(contractClassId, artifact); - // TODO: PXE may not want to broadcast the artifact to the network - await this.node.addContractArtifact(instance.address, artifact); + const functionNames: Record = {}; + for (const fn of artifact.functions) { + if (fn.functionType === FunctionType.PUBLIC) { + functionNames[FunctionSelector.fromNameAndParameters(fn.name, fn.parameters).toString()] = fn.name; + } + } + + await this.node.registerContractFunctionNames(instance.address, functionNames); // TODO(#10007): Node should get public contract class from the registration event, not from PXE registration await this.node.addContractClass({ ...contractClass, privateFunctions: [], unconstrainedFunctions: [] }); @@ -340,7 +324,7 @@ export class PXEService implements PXE { } for (const nonce of nonces) { - const { noteHash, siloedNoteHash, innerNullifier } = await this.simulator.computeNoteHashAndOptionallyANullifier( + const { noteHash, uniqueNoteHash, innerNullifier } = await this.simulator.computeNoteHashAndOptionallyANullifier( note.contractAddress, nonce, note.storageSlot, @@ -349,7 +333,7 @@ export class PXEService implements PXE { note.note, ); - const [index] = await this.node.findLeavesIndexes('latest', MerkleTreeId.NOTE_HASH_TREE, [siloedNoteHash]); + const [index] = await this.node.findLeavesIndexes('latest', MerkleTreeId.NOTE_HASH_TREE, [uniqueNoteHash]); if (index === undefined) { throw new Error('Note does not exist.'); } @@ -389,7 +373,7 @@ export class PXEService implements PXE { } for (const nonce of nonces) { - const { noteHash, siloedNoteHash, innerNullifier } = await this.simulator.computeNoteHashAndOptionallyANullifier( + const { noteHash, uniqueNoteHash, innerNullifier } = await this.simulator.computeNoteHashAndOptionallyANullifier( note.contractAddress, nonce, note.storageSlot, @@ -402,7 +386,7 @@ export class PXEService implements PXE { throw new Error('Unexpectedly received non-zero nullifier.'); } - const [index] = await this.node.findLeavesIndexes('latest', MerkleTreeId.NOTE_HASH_TREE, [siloedNoteHash]); + const [index] = await this.node.findLeavesIndexes('latest', MerkleTreeId.NOTE_HASH_TREE, [uniqueNoteHash]); if (index === undefined) { throw new Error('Note does not exist.'); } @@ -448,7 +432,7 @@ export class PXEService implements PXE { } const nonce = computeNoteHashNonce(firstNullifier, i); - const { siloedNoteHash } = await this.simulator.computeNoteHashAndOptionallyANullifier( + const { uniqueNoteHash } = await this.simulator.computeNoteHashAndOptionallyANullifier( note.contractAddress, nonce, note.storageSlot, @@ -456,7 +440,7 @@ export class PXEService implements PXE { false, note.note, ); - if (hash.equals(siloedNoteHash)) { + if (hash.equals(uniqueNoteHash)) { nonces.push(nonce); } } @@ -484,22 +468,16 @@ export class PXEService implements PXE { return result.publicInputs; } - public proveTx( + public async proveTx( txRequest: TxExecutionRequest, privateExecutionResult: PrivateExecutionResult, ): Promise { - return this.jobQueue - .put(async () => { - const { publicInputs, clientIvcProof } = await this.#prove( - txRequest, - this.proofCreator, - privateExecutionResult, - ); - return new TxProvingResult(privateExecutionResult, publicInputs, clientIvcProof!); - }) - .catch(err => { - throw this.contextualizeError(err, inspect(txRequest), inspect(privateExecutionResult)); - }); + try { + const { publicInputs, clientIvcProof } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult); + return new TxProvingResult(privateExecutionResult, publicInputs, clientIvcProof!); + } catch (err: any) { + throw this.contextualizeError(err, inspect(txRequest), inspect(privateExecutionResult)); + } } // TODO(#7456) Prevent msgSender being defined here for the first call @@ -511,78 +489,78 @@ export class PXEService implements PXE { profile: boolean = false, scopes?: AztecAddress[], ): Promise { - return await this.jobQueue - .put(async () => { - const txInfo = { - origin: txRequest.origin, - functionSelector: txRequest.functionSelector, - simulatePublic, - msgSender, - chainId: txRequest.txContext.chainId, - version: txRequest.txContext.version, - authWitnesses: txRequest.authWitnesses.map(w => w.requestHash), - }; - this.log.verbose( - `Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, - txInfo, - ); - const privateExecutionResult = await this.#executePrivate(txRequest, msgSender, scopes); - - let publicInputs: PrivateKernelTailCircuitPublicInputs; - let profileResult; - if (profile) { - ({ publicInputs, profileResult } = await this.#profileKernelProver( - txRequest, - this.proofCreator, - privateExecutionResult, - )); - } else { - publicInputs = await this.#simulateKernels(txRequest, privateExecutionResult); - } + try { + const txInfo = { + origin: txRequest.origin, + functionSelector: txRequest.functionSelector, + simulatePublic, + msgSender, + chainId: txRequest.txContext.chainId, + version: txRequest.txContext.version, + authWitnesses: txRequest.authWitnesses.map(w => w.requestHash), + }; + this.log.info( + `Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, + txInfo, + ); + const timer = new Timer(); + await this.synchronizer.sync(); + const privateExecutionResult = await this.#executePrivate(txRequest, msgSender, scopes); + + let publicInputs: PrivateKernelTailCircuitPublicInputs; + let profileResult; + if (profile) { + ({ publicInputs, profileResult } = await this.#profileKernelProver( + txRequest, + this.proofCreator, + privateExecutionResult, + )); + } else { + publicInputs = await this.#simulateKernels(txRequest, privateExecutionResult); + } - const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs); - const simulatedTx = privateSimulationResult.toSimulatedTx(); - let publicOutput: PublicSimulationOutput | undefined; - if (simulatePublic) { - publicOutput = await this.#simulatePublicCalls(simulatedTx); - } + const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs); + const simulatedTx = privateSimulationResult.toSimulatedTx(); + let publicOutput: PublicSimulationOutput | undefined; + if (simulatePublic) { + publicOutput = await this.#simulatePublicCalls(simulatedTx); + } - if (!skipTxValidation) { - if (!(await this.node.isValidTx(simulatedTx, true))) { - throw new Error('The simulated transaction is unable to be added to state and is invalid.'); - } + if (!skipTxValidation) { + if (!(await this.node.isValidTx(simulatedTx, true))) { + throw new Error('The simulated transaction is unable to be added to state and is invalid.'); } + } - this.log.info(`Simulation completed for ${simulatedTx.tryGetTxHash()}`, { - txHash: simulatedTx.tryGetTxHash(), - ...txInfo, - ...(profileResult ? { gateCounts: profileResult.gateCounts } : {}), - ...(publicOutput - ? { - gasUsed: publicOutput.gasUsed, - revertCode: publicOutput.txEffect.revertCode.getCode(), - revertReason: publicOutput.revertReason, - } - : {}), - }); - - return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput( - privateSimulationResult, - publicOutput, - profileResult, - ); - }) - .catch(err => { - throw this.contextualizeError( - err, - inspect(txRequest), - `simulatePublic=${simulatePublic}`, - `msgSender=${msgSender?.toString() ?? 'undefined'}`, - `skipTxValidation=${skipTxValidation}`, - `profile=${profile}`, - `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`, - ); + this.log.info(`Simulation completed for ${simulatedTx.tryGetTxHash()} in ${timer.ms()}ms`, { + txHash: simulatedTx.tryGetTxHash(), + ...txInfo, + ...(profileResult ? { gateCounts: profileResult.gateCounts } : {}), + ...(publicOutput + ? { + gasUsed: publicOutput.gasUsed, + revertCode: publicOutput.txEffect.revertCode.getCode(), + revertReason: publicOutput.revertReason, + } + : {}), }); + + return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput( + privateSimulationResult, + publicOutput, + profileResult, + ); + } catch (err: any) { + throw this.contextualizeError( + err, + inspect(txRequest), + `simulatePublic=${simulatePublic}`, + `msgSender=${msgSender?.toString() ?? 'undefined'}`, + `skipTxValidation=${skipTxValidation}`, + `profile=${profile}`, + `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`, + ); + } } public async sendTx(tx: Tx): Promise { @@ -605,24 +583,22 @@ export class PXEService implements PXE { _from?: AztecAddress, scopes?: AztecAddress[], ): Promise { - // all simulations must be serialized w.r.t. the synchronizer - return await this.jobQueue - .put(async () => { - // TODO - Should check if `from` has the permission to call the view function. - const functionCall = await this.#getFunctionCall(functionName, args, to); - const executionResult = await this.#simulateUnconstrained(functionCall, scopes); - - // TODO - Return typed result based on the function artifact. - return executionResult; - }) - .catch(err => { - const stringifiedArgs = args.map(arg => arg.toString()).join(', '); - throw this.contextualizeError( - err, - `simulateUnconstrained ${to}:${functionName}(${stringifiedArgs})`, - `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`, - ); - }); + try { + await this.synchronizer.sync(); + // TODO - Should check if `from` has the permission to call the view function. + const functionCall = await this.#getFunctionCall(functionName, args, to); + const executionResult = await this.#simulateUnconstrained(functionCall, scopes); + + // TODO - Return typed result based on the function artifact. + return executionResult; + } catch (err: any) { + const stringifiedArgs = args.map(arg => arg.toString()).join(', '); + throw this.contextualizeError( + err, + `simulateUnconstrained ${to}:${functionName}(${stringifiedArgs})`, + `scopes=${scopes?.map(s => s.toString()).join(', ') ?? 'undefined'}`, + ); + } } public getTxReceipt(txHash: TxHash): Promise { @@ -726,7 +702,7 @@ export class PXEService implements PXE { await this.db.addContractInstance(instance); registered[name] = address.toString(); } - this.log.info(`Registered protocol contracts in pxe`, registered); + this.log.verbose(`Registered protocol contracts in pxe`, registered); } /** @@ -840,19 +816,14 @@ export class PXEService implements PXE { } /** - * Simulate a transaction, generate a kernel proof, and create a private transaction object. - * The function takes in a transaction request, simulates it, and then generates a kernel proof - * using the simulation result. Finally, it creates a private - * transaction object with the generated proof and public inputs. If a new contract address is provided, - * the function will also include the new contract's public functions in the transaction object. + * Generate a kernel proof, and create a private kernel output. + * The function takes in a transaction execution request, and the result of private execution + * and then generates a kernel proof. * * @param txExecutionRequest - The transaction request to be simulated and proved. * @param proofCreator - The proof creator to use for proving the execution. - * @param msgSender - (Optional) The message sender to use for the simulation. - * @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all. - * @returns An object that contains: - * A private transaction object containing the proof, public inputs, and encrypted logs. - * The return values of the private execution + * @param privateExecutionResult - The result of the private execution + * @returns An object that contains the output of the kernel execution, including the ClientIvcProof if proving is enabled. */ async #prove( txExecutionRequest: TxExecutionRequest, @@ -867,14 +838,6 @@ export class PXEService implements PXE { return await kernelProver.prove(txExecutionRequest.toTxRequest(), privateExecutionResult); } - public async isGlobalStateSynchronized() { - return await this.synchronizer.isGlobalStateSynchronized(); - } - - public getSyncStatus() { - return Promise.resolve(this.synchronizer.getSyncStatus()); - } - public async isContractClassPubliclyRegistered(id: Fr): Promise { return !!(await this.node.getContractClass(id)); } diff --git a/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts b/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts index 678f6c4bb76..d0dc0103bbf 100644 --- a/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts +++ b/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts @@ -22,7 +22,6 @@ async function createPXEService(): Promise { const db = await KVPxeDatabase.create(kvStore); const tips = new L2TipsStore(kvStore, 'pxe'); const config: PXEServiceConfig = { - l2BlockPollingIntervalMS: 100, l2StartingBlock: INITIAL_L2_BLOCK_NUM, dataDirectory: undefined, dataStoreMapSizeKB: 1024 * 1024, @@ -67,7 +66,6 @@ describe('PXEService', () => { tips = new L2TipsStore(kvStore, 'pxe'); db = await KVPxeDatabase.create(kvStore); config = { - l2BlockPollingIntervalMS: 100, l2StartingBlock: INITIAL_L2_BLOCK_NUM, proverEnabled: false, dataDirectory: undefined, diff --git a/yarn-project/pxe/src/pxe_service/test/pxe_test_suite.ts b/yarn-project/pxe/src/pxe_service/test/pxe_test_suite.ts index c5fc6219e01..686c5b9f9a1 100644 --- a/yarn-project/pxe/src/pxe_service/test/pxe_test_suite.ts +++ b/yarn-project/pxe/src/pxe_service/test/pxe_test_suite.ts @@ -115,8 +115,5 @@ export const pxeTestSuite = (testName: string, pxeSetup: () => Promise) => expect(typeof nodeInfo.l1ChainId).toEqual('number'); expect(nodeInfo.l1ContractAddresses.rollupAddress.toString()).toMatch(/0x[a-fA-F0-9]+/); }); - - // Note: Not testing `isGlobalStateSynchronized`, `isAccountStateSynchronized` and `getSyncStatus` as these methods - // only call synchronizer. }); }; diff --git a/yarn-project/pxe/src/simulator_oracle/index.ts b/yarn-project/pxe/src/simulator_oracle/index.ts index b6866e9a28c..bb3885695a4 100644 --- a/yarn-project/pxe/src/simulator_oracle/index.ts +++ b/yarn-project/pxe/src/simulator_oracle/index.ts @@ -24,7 +24,7 @@ import { type L1_TO_L2_MSG_TREE_HEIGHT, PrivateLog, computeAddressSecret, - computeTaggingSecret, + computeTaggingSecretPoint, } from '@aztec/circuits.js'; import { type FunctionArtifact, getFunctionArtifact } from '@aztec/foundation/abi'; import { poseidon2Hash } from '@aztec/foundation/crypto'; @@ -38,6 +38,7 @@ import { type IncomingNoteDao } from '../database/incoming_note_dao.js'; import { type PxeDatabase } from '../database/index.js'; import { produceNoteDaos } from '../note_decryption_utils/produce_note_daos.js'; import { getAcirSimulator } from '../simulator/index.js'; +import { WINDOW_HALF_SIZE, getIndexedTaggingSecretsForTheWindow, getInitialIndexesMap } from './tagging_utils.js'; /** * A data oracle that provides information needed for simulating a transaction. @@ -231,7 +232,7 @@ export class SimulatorOracle implements DBOracle { * @returns A Promise that resolves to a BlockHeader object. */ getBlockHeader(): Promise { - return Promise.resolve(this.db.getBlockHeader()); + return this.db.getBlockHeader(); } /** @@ -257,28 +258,28 @@ export class SimulatorOracle implements DBOracle { } /** - * Returns the tagging secret for a given sender and recipient pair. For this to work, the ivpsk_m of the sender must be known. + * Returns the tagging secret for a given sender and recipient pair. For this to work, the ivsk_m of the sender must be known. * Includes the next index to be used used for tagging with this secret. * @param contractAddress - The contract address to silo the secret for * @param sender - The address sending the note * @param recipient - The address receiving the note - * @returns A siloed tagging secret that can be used to tag notes. + * @returns An indexed tagging secret that can be used to tag notes. */ - public async getAppTaggingSecretAsSender( + public async getIndexedTaggingSecretAsSender( contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress, ): Promise { await this.syncTaggedLogsAsSender(contractAddress, sender, recipient); - const secret = await this.#calculateTaggingSecret(contractAddress, sender, recipient); - const [index] = await this.db.getTaggingSecretsIndexesAsSender([secret]); + const appTaggingSecret = await this.#calculateAppTaggingSecret(contractAddress, sender, recipient); + const [index] = await this.db.getTaggingSecretsIndexesAsSender([appTaggingSecret]); - return new IndexedTaggingSecret(secret, index); + return new IndexedTaggingSecret(appTaggingSecret, index); } /** - * Increments the tagging secret for a given sender and recipient pair. For this to work, the ivpsk_m of the sender must be known. + * Increments the tagging secret for a given sender and recipient pair. For this to work, the ivsk_m of the sender must be known. * @param contractAddress - The contract address to silo the secret for * @param sender - The address sending the note * @param recipient - The address receiving the note @@ -288,7 +289,7 @@ export class SimulatorOracle implements DBOracle { sender: AztecAddress, recipient: AztecAddress, ): Promise { - const secret = await this.#calculateTaggingSecret(contractAddress, sender, recipient); + const secret = await this.#calculateAppTaggingSecret(contractAddress, sender, recipient); const contractName = await this.contractDataOracle.getDebugContractName(contractAddress); this.log.debug(`Incrementing app tagging secret at ${contractName}(${contractAddress})`, { secret, @@ -302,25 +303,25 @@ export class SimulatorOracle implements DBOracle { await this.db.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(secret, index + 1)]); } - async #calculateTaggingSecret(contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress) { + async #calculateAppTaggingSecret(contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress) { const senderCompleteAddress = await this.getCompleteAddress(sender); const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender); - const sharedSecret = computeTaggingSecret(senderCompleteAddress, senderIvsk, recipient); - // Silo the secret to the app so it can't be used to track other app's notes - const siloedSecret = poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]); - return siloedSecret; + const secretPoint = computeTaggingSecretPoint(senderCompleteAddress, senderIvsk, recipient); + // Silo the secret so it can't be used to track other app's notes + const appSecret = poseidon2Hash([secretPoint.x, secretPoint.y, contractAddress]); + return appSecret; } /** - * Returns the siloed tagging secrets for a given recipient and all the senders in the address book + * Returns the indexed tagging secrets for a given recipient and all the senders in the address book * This method should be exposed as an oracle call to allow aztec.nr to perform the orchestration * of the syncTaggedLogs and processTaggedLogs methods. However, it is not possible to do so at the moment, * so we're keeping it private for now. * @param contractAddress - The contract address to silo the secret for * @param recipient - The address receiving the notes - * @returns A list of siloed tagging secrets + * @returns A list of indexed tagging secrets */ - async #getAppTaggingSecretsForContacts( + async #getIndexedTaggingSecretsForContacts( contractAddress: AztecAddress, recipient: AztecAddress, ): Promise { @@ -332,7 +333,7 @@ export class SimulatorOracle implements DBOracle { (address, index, self) => index === self.findIndex(otherAddress => otherAddress.equals(address)), ); const appTaggingSecrets = contacts.map(contact => { - const sharedSecret = computeTaggingSecret(recipientCompleteAddress, recipientIvsk, contact); + const sharedSecret = computeTaggingSecretPoint(recipientCompleteAddress, recipientIvsk, contact); return poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]); }); const indexes = await this.db.getTaggingSecretsIndexesAsRecipient(appTaggingSecrets); @@ -351,65 +352,63 @@ export class SimulatorOracle implements DBOracle { sender: AztecAddress, recipient: AztecAddress, ): Promise { - const appTaggingSecret = await this.#calculateTaggingSecret(contractAddress, sender, recipient); - let [currentIndex] = await this.db.getTaggingSecretsIndexesAsSender([appTaggingSecret]); - - const INDEX_OFFSET = 10; - - let previousEmptyBack = 0; - let currentEmptyBack = 0; - let currentEmptyFront: number; - - // The below code is trying to find the index of the start of the first window in which for all elements of window, we do not see logs. - // We take our window size, and fetch the node for these logs. We store both the amount of empty consecutive slots from the front and the back. - // We use our current empty consecutive slots from the front, as well as the previous consecutive empty slots from the back to see if we ever hit a time where there - // is a window in which we see the combination of them to be greater than the window's size. If true, we rewind current index to the start of said window and use it. - // Assuming two windows of 5: - // [0, 1, 0, 1, 0], [0, 0, 0, 0, 0] - // We can see that when processing the second window, the previous amount of empty slots from the back of the window (1), added with the empty elements from the front of the window (5) - // is greater than 5 (6) and therefore we have found a window to use. - // We simply need to take the number of elements (10) - the size of the window (5) - the number of consecutive empty elements from the back of the last window (1) = 4; - // This is the first index of our desired window. - // Note that if we ever see a situation like so: - // [0, 1, 0, 1, 0], [0, 0, 0, 0, 1] - // This also returns the correct index (4), but this is indicative of a problem / desync. i.e. we should never have a window that has a log that exists after the window. - + const appTaggingSecret = await this.#calculateAppTaggingSecret(contractAddress, sender, recipient); + const [oldIndex] = await this.db.getTaggingSecretsIndexesAsSender([appTaggingSecret]); + + // This algorithm works such that: + // 1. If we find minimum consecutive empty logs in a window of logs we set the index to the index of the last log + // we found and quit. + // 2. If we don't find minimum consecutive empty logs in a window of logs we slide the window to latest log index + // and repeat the process. + const MIN_CONSECUTIVE_EMPTY_LOGS = 10; + const WINDOW_SIZE = MIN_CONSECUTIVE_EMPTY_LOGS * 2; + + let [numConsecutiveEmptyLogs, currentIndex] = [0, oldIndex]; do { - const currentTags = [...new Array(INDEX_OFFSET)].map((_, i) => { + // We compute the tags for the current window of indexes + const currentTags = [...new Array(WINDOW_SIZE)].map((_, i) => { const indexedAppTaggingSecret = new IndexedTaggingSecret(appTaggingSecret, currentIndex + i); return indexedAppTaggingSecret.computeSiloedTag(recipient, contractAddress); }); - previousEmptyBack = currentEmptyBack; + // We fetch the logs for the tags const possibleLogs = await this.aztecNode.getLogsByTags(currentTags); - const indexOfFirstLog = possibleLogs.findIndex(possibleLog => possibleLog.length !== 0); - currentEmptyFront = indexOfFirstLog === -1 ? INDEX_OFFSET : indexOfFirstLog; - + // We find the index of the last log in the window that is not empty const indexOfLastLog = possibleLogs.findLastIndex(possibleLog => possibleLog.length !== 0); - currentEmptyBack = indexOfLastLog === -1 ? INDEX_OFFSET : INDEX_OFFSET - 1 - indexOfLastLog; - currentIndex += INDEX_OFFSET; - } while (currentEmptyFront + previousEmptyBack < INDEX_OFFSET); + if (indexOfLastLog === -1) { + // We haven't found any logs in the current window so we stop looking + break; + } - // We unwind the entire current window and the amount of consecutive empty slots from the previous window - const newIndex = currentIndex - (INDEX_OFFSET + previousEmptyBack); + // We move the current index to that of the last log we found + currentIndex += indexOfLastLog + 1; - await this.db.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(appTaggingSecret, newIndex)]); + // We compute the number of consecutive empty logs we found and repeat the process if we haven't found enough. + numConsecutiveEmptyLogs = WINDOW_SIZE - indexOfLastLog - 1; + } while (numConsecutiveEmptyLogs < MIN_CONSECUTIVE_EMPTY_LOGS); const contractName = await this.contractDataOracle.getDebugContractName(contractAddress); - this.log.debug(`Syncing logs for sender ${sender} at contract ${contractName}(${contractAddress})`, { - sender, - secret: appTaggingSecret, - index: currentIndex, - contractName, - contractAddress, - }); + if (currentIndex !== oldIndex) { + await this.db.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(appTaggingSecret, currentIndex)]); + + this.log.debug(`Syncing logs for sender ${sender} at contract ${contractName}(${contractAddress})`, { + sender, + secret: appTaggingSecret, + index: currentIndex, + contractName, + contractAddress, + }); + } else { + this.log.debug(`No new logs found for sender ${sender} at contract ${contractName}(${contractAddress})`); + } } /** * Synchronizes the logs tagged with scoped addresses and all the senders in the address book. - * Returns the unsynched logs and updates the indexes of the secrets used to tag them until there are no more logs to sync. + * Returns the unsynched logs and updates the indexes of the secrets used to tag them until there are no more logs + * to sync. * @param contractAddress - The address of the contract that the logs are tagged for * @param recipient - The address of the recipient * @returns A list of encrypted logs tagged with the recipient's address @@ -419,125 +418,137 @@ export class SimulatorOracle implements DBOracle { maxBlockNumber: number, scopes?: AztecAddress[], ): Promise> { + // Ideally this algorithm would be implemented in noir, exposing its building blocks as oracles. + // However it is impossible at the moment due to the language not supporting nested slices. + // This nesting is necessary because for a given set of tags we don't + // know how many logs we will get back. Furthermore, these logs are of undetermined + // length, since we don't really know the note they correspond to until we decrypt them. + const recipients = scopes ? scopes : await this.keyStore.getAccounts(); - const result = new Map(); + // A map of logs going from recipient address to logs. Note that the logs might have been processed before + // due to us having a sliding window that "looks back" for logs as well. (We look back as there is no guarantee + // that a logs will be received ordered by a given tax index and that the tags won't be reused). + const logsMap = new Map(); const contractName = await this.contractDataOracle.getDebugContractName(contractAddress); for (const recipient of recipients) { - const logs: TxScopedL2Log[] = []; - // Ideally this algorithm would be implemented in noir, exposing its building blocks as oracles. - // However it is impossible at the moment due to the language not supporting nested slices. - // This nesting is necessary because for a given set of tags we don't - // know how many logs we will get back. Furthermore, these logs are of undetermined - // length, since we don't really know the note they correspond to until we decrypt them. - - // 1. Get all the secrets for the recipient and sender pairs (#9365) - const appTaggingSecrets = await this.#getAppTaggingSecretsForContacts(contractAddress, recipient); - - // 1.1 Set up a sliding window with an offset. Chances are the sender might have messed up - // and inadvertently incremented their index without use getting any logs (for example, in case - // of a revert). If we stopped looking for logs the first time - // we receive 0 for a tag, we might never receive anything from that sender again. - // Also there's a possibility that we have advanced our index, but the sender has reused it, so - // we might have missed some logs. For these reasons, we have to look both back and ahead of the - // stored index - const INDEX_OFFSET = 10; - type SearchState = { - currentTagggingSecrets: IndexedTaggingSecret[]; - maxIndexesToCheck: { [k: string]: number }; - initialSecretIndexes: { [k: string]: number }; - secretsToIncrement: { [k: string]: number }; - }; - const searchState = appTaggingSecrets.reduce( - (acc, appTaggingSecret) => ({ - // Start looking for logs before the stored index - currentTagggingSecrets: acc.currentTagggingSecrets.concat([ - new IndexedTaggingSecret(appTaggingSecret.secret, Math.max(0, appTaggingSecret.index - INDEX_OFFSET)), - ]), - // Keep looking for logs beyond the stored index - maxIndexesToCheck: { - ...acc.maxIndexesToCheck, - ...{ [appTaggingSecret.secret.toString()]: appTaggingSecret.index + INDEX_OFFSET }, - }, - // Keeps track of the secrets we have to increment in the database - secretsToIncrement: {}, - // Store the initial set of indexes for the secrets - initialSecretIndexes: { - ...acc.initialSecretIndexes, - ...{ [appTaggingSecret.secret.toString()]: appTaggingSecret.index }, - }, - }), - { currentTagggingSecrets: [], maxIndexesToCheck: {}, secretsToIncrement: {}, initialSecretIndexes: {} }, - ); + const logsForRecipient: TxScopedL2Log[] = []; + + // Get all the secrets for the recipient and sender pairs (#9365) + const secrets = await this.#getIndexedTaggingSecretsForContacts(contractAddress, recipient); + + // We fetch logs for a window of indexes in a range: + // . + // + // We use this window approach because it could happen that a sender might have messed up and inadvertently + // incremented their index without us getting any logs (for example, in case of a revert). If we stopped looking + // for logs the first time we don't receive any logs for a tag, we might never receive anything from that sender again. + // Also there's a possibility that we have advanced our index, but the sender has reused it, so we might have missed + // some logs. For these reasons, we have to look both back and ahead of the stored index. + let secretsAndWindows = secrets.map(secret => { + return { + appTaggingSecret: secret.appTaggingSecret, + leftMostIndex: Math.max(0, secret.index - WINDOW_HALF_SIZE), + rightMostIndex: secret.index + WINDOW_HALF_SIZE, + }; + }); - let { currentTagggingSecrets } = searchState; - const { maxIndexesToCheck, secretsToIncrement, initialSecretIndexes } = searchState; + // As we iterate we store the largest index we have seen for a given secret to later on store it in the db. + const newLargestIndexMapToStore: { [k: string]: number } = {}; - while (currentTagggingSecrets.length > 0) { - // 2. Compute tags using the secrets, recipient and index. Obtain logs for each tag (#9380) - const currentTags = currentTagggingSecrets.map(taggingSecret => - taggingSecret.computeSiloedTag(recipient, contractAddress), + // The initial/unmodified indexes of the secrets stored in a key-value map where key is the app tagging secret. + const initialIndexesMap = getInitialIndexesMap(secrets); + + while (secretsAndWindows.length > 0) { + const secretsForTheWholeWindow = getIndexedTaggingSecretsForTheWindow(secretsAndWindows); + const tagsForTheWholeWindow = secretsForTheWholeWindow.map(secret => + secret.computeSiloedTag(recipient, contractAddress), ); - const logsByTags = await this.aztecNode.getLogsByTags(currentTags); - const newTaggingSecrets: IndexedTaggingSecret[] = []; + + // We store the new largest indexes we find in the iteration in the following map to later on construct + // a new set of secrets and windows to fetch logs for. + const newLargestIndexMapForIteration: { [k: string]: number } = {}; + + // Fetch the logs for the tags and iterate over them + const logsByTags = await this.aztecNode.getLogsByTags(tagsForTheWholeWindow); + logsByTags.forEach((logsByTag, logIndex) => { - const { secret: currentSecret, index: currentIndex } = currentTagggingSecrets[logIndex]; - const currentSecretAsStr = currentSecret.toString(); - this.log.debug(`Syncing logs for recipient ${recipient} at contract ${contractName}(${contractAddress})`, { - recipient, - secret: currentSecret, - index: currentIndex, - contractName, - contractAddress, - }); - // 3.1. Append logs to the list and increment the index for the tags that have logs (#9380) if (logsByTag.length > 0) { - const newIndex = currentIndex + 1; - this.log.debug( - `Found ${logsByTag.length} logs as recipient ${recipient}. Incrementing index to ${newIndex} at contract ${contractName}(${contractAddress})`, - { - recipient, - secret: currentSecret, - newIndex, - contractName, - contractAddress, - }, - ); - logs.push(...logsByTag); - - if (currentIndex >= initialSecretIndexes[currentSecretAsStr]) { - // 3.2. Increment the index for the tags that have logs, provided they're higher than the one - // we have stored in the db (#9380) - secretsToIncrement[currentSecretAsStr] = newIndex; - // 3.3. Slide the window forwards if we have found logs beyond the initial index - maxIndexesToCheck[currentSecretAsStr] = currentIndex + INDEX_OFFSET; + // The logs for the given tag exist so we store them for later processing + logsForRecipient.push(...logsByTag); + + // We retrieve the indexed tagging secret corresponding to the log as I need that to evaluate whether + // a new largest index have been found. + const secretCorrespondingToLog = secretsForTheWholeWindow[logIndex]; + const initialIndex = initialIndexesMap[secretCorrespondingToLog.appTaggingSecret.toString()]; + + this.log.debug(`Found ${logsByTag.length} logs as recipient ${recipient}`, { + recipient, + secret: secretCorrespondingToLog.appTaggingSecret, + contractName, + contractAddress, + }); + + if ( + secretCorrespondingToLog.index >= initialIndex && + (newLargestIndexMapForIteration[secretCorrespondingToLog.appTaggingSecret.toString()] === undefined || + secretCorrespondingToLog.index >= + newLargestIndexMapForIteration[secretCorrespondingToLog.appTaggingSecret.toString()]) + ) { + // We have found a new largest index so we store it for later processing (storing it in the db + fetching + // the difference of the window sets of current and the next iteration) + newLargestIndexMapForIteration[secretCorrespondingToLog.appTaggingSecret.toString()] = + secretCorrespondingToLog.index + 1; + + this.log.debug( + `Incrementing index to ${ + secretCorrespondingToLog.index + 1 + } at contract ${contractName}(${contractAddress})`, + ); } } - // 3.4 Keep increasing the index (inside the window) temporarily for the tags that have no logs - // There's a chance the sender missed some and we want to catch up - if (currentIndex < maxIndexesToCheck[currentSecretAsStr]) { - const newTaggingSecret = new IndexedTaggingSecret(currentSecret, currentIndex + 1); - newTaggingSecrets.push(newTaggingSecret); - } }); - await this.db.setTaggingSecretsIndexesAsRecipient( - Object.keys(secretsToIncrement).map( - secret => new IndexedTaggingSecret(Fr.fromString(secret), secretsToIncrement[secret]), - ), - ); - currentTagggingSecrets = newTaggingSecrets; + + // Now based on the new largest indexes we found, we will construct a new secrets and windows set to fetch logs + // for. Note that it's very unlikely that a new log from the current window would appear between the iterations + // so we fetch the logs only for the difference of the window sets. + const newSecretsAndWindows = []; + for (const [appTaggingSecret, newIndex] of Object.entries(newLargestIndexMapForIteration)) { + const secret = secrets.find(secret => secret.appTaggingSecret.toString() === appTaggingSecret); + if (secret) { + newSecretsAndWindows.push({ + appTaggingSecret: secret.appTaggingSecret, + // We set the left most index to the new index to avoid fetching the same logs again + leftMostIndex: newIndex, + rightMostIndex: newIndex + WINDOW_HALF_SIZE, + }); + + // We store the new largest index in the map to later store it in the db. + newLargestIndexMapToStore[appTaggingSecret] = newIndex; + } else { + throw new Error( + `Secret not found for appTaggingSecret ${appTaggingSecret}. This is a bug as it should never happen!`, + ); + } + } + + // Now we set the new secrets and windows and proceed to the next iteration. + secretsAndWindows = newSecretsAndWindows; } - result.set( + // We filter the logs by block number and store them in the map. + logsMap.set( recipient.toString(), - // Remove logs with a block number higher than the max block number - // Duplicates are likely to happen due to the sliding window, so we also filter them out - logs.filter( - (log, index, self) => - log.blockNumber <= maxBlockNumber && index === self.findIndex(otherLog => otherLog.equals(log)), + logsForRecipient.filter(log => log.blockNumber <= maxBlockNumber), + ); + + // At this point we have processed all the logs for the recipient so we store the new largest indexes in the db. + await this.db.setTaggingSecretsIndexesAsRecipient( + Object.entries(newLargestIndexMapToStore).map( + ([appTaggingSecret, index]) => new IndexedTaggingSecret(Fr.fromHexString(appTaggingSecret), index), ), ); } - return result; + return logsMap; } /** @@ -628,27 +639,30 @@ export class SimulatorOracle implements DBOracle { }); }); } - const nullifiedNotes: IncomingNoteDao[] = []; - const currentNotesForRecipient = await this.db.getIncomingNotes({ owner: recipient }); - const nullifiersToCheck = currentNotesForRecipient.map(note => note.siloedNullifier); - const currentBlockNumber = await this.getBlockNumber(); - const nullifierIndexes = await this.aztecNode.findNullifiersIndexesWithBlock(currentBlockNumber, nullifiersToCheck); - - const foundNullifiers = nullifiersToCheck - .map((nullifier, i) => { - if (nullifierIndexes[i] !== undefined) { - return { ...nullifierIndexes[i], ...{ data: nullifier } } as InBlock; - } - }) - .filter(nullifier => nullifier !== undefined) as InBlock[]; - - await this.db.removeNullifiedNotes(foundNullifiers, recipient.toAddressPoint()); - nullifiedNotes.forEach(noteDao => { - this.log.verbose(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`, { - contract: noteDao.contractAddress, - slot: noteDao.storageSlot, - nullifier: noteDao.siloedNullifier.toString(), + } + + public async removeNullifiedNotes(contractAddress: AztecAddress) { + for (const recipient of await this.keyStore.getAccounts()) { + const currentNotesForRecipient = await this.db.getIncomingNotes({ contractAddress, owner: recipient }); + const nullifiersToCheck = currentNotesForRecipient.map(note => note.siloedNullifier); + const nullifierIndexes = await this.aztecNode.findNullifiersIndexesWithBlock('latest', nullifiersToCheck); + + const foundNullifiers = nullifiersToCheck + .map((nullifier, i) => { + if (nullifierIndexes[i] !== undefined) { + return { ...nullifierIndexes[i], ...{ data: nullifier } } as InBlock; + } + }) + .filter(nullifier => nullifier !== undefined) as InBlock[]; + + const nullifiedNotes = await this.db.removeNullifiedNotes(foundNullifiers, recipient.toAddressPoint()); + nullifiedNotes.forEach(noteDao => { + this.log.verbose(`Removed note for contract ${noteDao.contractAddress} at slot ${noteDao.storageSlot}`, { + contract: noteDao.contractAddress, + slot: noteDao.storageSlot, + nullifier: noteDao.siloedNullifier.toString(), + }); }); - }); + } } } diff --git a/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts b/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts index 363da40fdf6..0db352f96a6 100644 --- a/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts +++ b/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts @@ -2,11 +2,13 @@ import { type AztecNode, EncryptedLogPayload, L1NotePayload, + L2Block, Note, type TxEffect, TxHash, TxScopedL2Log, randomInBlock, + wrapInBlock, } from '@aztec/circuit-types'; import { AztecAddress, @@ -18,7 +20,7 @@ import { IndexedTaggingSecret, MAX_NOTE_HASHES_PER_TX, computeAddress, - computeTaggingSecret, + computeTaggingSecretPoint, deriveKeys, } from '@aztec/circuits.js'; import { pedersenHash, poseidon2Hash } from '@aztec/foundation/crypto'; @@ -35,6 +37,7 @@ import { type PxeDatabase } from '../database/index.js'; import { KVPxeDatabase } from '../database/kv_pxe_database.js'; import { ContractDataOracle } from '../index.js'; import { SimulatorOracle } from './index.js'; +import { WINDOW_HALF_SIZE } from './tagging_utils.js'; const TXS_PER_BLOCK = 4; const NUM_NOTE_HASHES_PER_BLOCK = TXS_PER_BLOCK * MAX_NOTE_HASHES_PER_TX; @@ -103,9 +106,9 @@ function computeSiloedTagForIndex( contractAddress: AztecAddress, index: number, ) { - const sharedSecret = computeTaggingSecret(sender.completeAddress, sender.ivsk, recipient); - const siloedSecret = poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]); - const tag = poseidon2Hash([siloedSecret, recipient, index]); + const secretPoint = computeTaggingSecretPoint(sender.completeAddress, sender.ivsk, recipient); + const appSecret = poseidon2Hash([secretPoint.x, secretPoint.y, contractAddress]); + const tag = poseidon2Hash([appSecret, recipient, index]); return poseidon2Hash([contractAddress, tag]); } @@ -136,16 +139,15 @@ describe('Simulator oracle', () => { describe('sync tagged logs', () => { const NUM_SENDERS = 10; - const SENDER_OFFSET_WINDOW_SIZE = 10; let senders: { completeAddress: CompleteAddress; ivsk: Fq; secretKey: Fr }[]; - function generateMockLogs(senderOffset: number) { + function generateMockLogs(tagIndex: number) { const logs: { [k: string]: TxScopedL2Log[] } = {}; - // Add a random note from every address in the address book for our account with index senderOffset + // Add a random note from every address in the address book for our account with index tagIndex // Compute the tag as sender (knowledge of preaddress and ivsk) for (const sender of senders) { - const tag = computeSiloedTagForIndex(sender, recipient.address, contractAddress, senderOffset); + const tag = computeSiloedTagForIndex(sender, recipient.address, contractAddress, tagIndex); const blockNumber = 1; const randomNote = new MockNoteRequest( getRandomNoteLogPayload(tag, contractAddress), @@ -162,18 +164,18 @@ describe('Simulator oracle', () => { // Add a random note from the first sender in the address book, repeating the tag // Compute the tag as sender (knowledge of preaddress and ivsk) const firstSender = senders[0]; - const tag = computeSiloedTagForIndex(firstSender, recipient.address, contractAddress, senderOffset); + const tag = computeSiloedTagForIndex(firstSender, recipient.address, contractAddress, tagIndex); const payload = getRandomNoteLogPayload(tag, contractAddress); const logData = payload.generatePayload(GrumpkinScalar.random(), recipient.address).toBuffer(); const log = new TxScopedL2Log(TxHash.random(), 1, 0, false, logData); logs[tag.toString()].push(log); // Accumulated logs intended for recipient: NUM_SENDERS + 1 - // Add a random note from half the address book for our account with index senderOffset + 1 + // Add a random note from half the address book for our account with index tagIndex + 1 // Compute the tag as sender (knowledge of preaddress and ivsk) for (let i = NUM_SENDERS / 2; i < NUM_SENDERS; i++) { const sender = senders[i]; - const tag = computeSiloedTagForIndex(sender, recipient.address, contractAddress, senderOffset + 1); + const tag = computeSiloedTagForIndex(sender, recipient.address, contractAddress, tagIndex + 1); const blockNumber = 2; const randomNote = new MockNoteRequest( getRandomNoteLogPayload(tag, contractAddress), @@ -187,13 +189,13 @@ describe('Simulator oracle', () => { } // Accumulated logs intended for recipient: NUM_SENDERS + 1 + NUM_SENDERS / 2 - // Add a random note from every address in the address book for a random recipient with index senderOffset + // Add a random note from every address in the address book for a random recipient with index tagIndex // Compute the tag as sender (knowledge of preaddress and ivsk) for (const sender of senders) { const keys = deriveKeys(Fr.random()); const partialAddress = Fr.random(); const randomRecipient = computeAddress(keys.publicKeys, partialAddress); - const tag = computeSiloedTagForIndex(sender, randomRecipient, contractAddress, senderOffset); + const tag = computeSiloedTagForIndex(sender, randomRecipient, contractAddress, tagIndex); const blockNumber = 3; const randomNote = new MockNoteRequest( getRandomNoteLogPayload(tag, contractAddress), @@ -230,31 +232,32 @@ describe('Simulator oracle', () => { }); it('should sync tagged logs', async () => { - const senderOffset = 0; - generateMockLogs(senderOffset); + const tagIndex = 0; + generateMockLogs(tagIndex); const syncedLogs = await simulatorOracle.syncTaggedLogs(contractAddress, 3); - // We expect to have all logs intended for the recipient, one per sender + 1 with a duplicated tag for the first one + half of the logs for the second index + // We expect to have all logs intended for the recipient, one per sender + 1 with a duplicated tag for the first + // one + half of the logs for the second index expect(syncedLogs.get(recipient.address.toString())).toHaveLength(NUM_SENDERS + 1 + NUM_SENDERS / 2); // Recompute the secrets (as recipient) to ensure indexes are updated const ivsk = await keyStore.getMasterIncomingViewingSecretKey(recipient.address); const secrets = senders.map(sender => { - const firstSenderSharedSecret = computeTaggingSecret(recipient, ivsk, sender.completeAddress.address); - return poseidon2Hash([firstSenderSharedSecret.x, firstSenderSharedSecret.y, contractAddress]); + const firstSenderSecretPoint = computeTaggingSecretPoint(recipient, ivsk, sender.completeAddress.address); + return poseidon2Hash([firstSenderSecretPoint.x, firstSenderSecretPoint.y, contractAddress]); }); // First sender should have 2 logs, but keep index 1 since they were built using the same tag - // Next 4 senders hould also have index 1 = offset + 1 + // Next 4 senders should also have index 1 = offset + 1 // Last 5 senders should have index 2 = offset + 2 const indexes = await database.getTaggingSecretsIndexesAsRecipient(secrets); expect(indexes).toHaveLength(NUM_SENDERS); expect(indexes).toEqual([1, 1, 1, 1, 1, 2, 2, 2, 2, 2]); - // We should have called the node 12 times: - // 2 times with logs (sliding the window) + 10 times with no results (window size) - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2 + SENDER_OFFSET_WINDOW_SIZE); + // We should have called the node 2 times: + // 2 times: first time during initial request, second time after pushing the edge of the window once + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2); }); it('should sync tagged logs as senders', async () => { @@ -263,14 +266,14 @@ describe('Simulator oracle', () => { await keyStore.addAccount(sender.secretKey, sender.completeAddress.partialAddress); } - let senderOffset = 0; - generateMockLogs(senderOffset); + let tagIndex = 0; + generateMockLogs(tagIndex); // Recompute the secrets (as recipient) to ensure indexes are updated const ivsk = await keyStore.getMasterIncomingViewingSecretKey(recipient.address); const secrets = senders.map(sender => { - const firstSenderSharedSecret = computeTaggingSecret(recipient, ivsk, sender.completeAddress.address); - return poseidon2Hash([firstSenderSharedSecret.x, firstSenderSharedSecret.y, contractAddress]); + const firstSenderSecretPoint = computeTaggingSecretPoint(recipient, ivsk, sender.completeAddress.address); + return poseidon2Hash([firstSenderSecretPoint.x, firstSenderSecretPoint.y, contractAddress]); }); const indexesAsSender = await database.getTaggingSecretsIndexesAsSender(secrets); @@ -289,13 +292,14 @@ describe('Simulator oracle', () => { let indexesAsSenderAfterSync = await database.getTaggingSecretsIndexesAsSender(secrets); expect(indexesAsSenderAfterSync).toStrictEqual([1, 1, 1, 1, 1, 2, 2, 2, 2, 2]); - // Two windows are fetch for each sender - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(NUM_SENDERS * 2); + // Only 1 window is obtained for each sender + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(NUM_SENDERS); aztecNode.getLogsByTags.mockReset(); - // We add more logs at the end of the window to make sure we only detect them and bump the indexes if it lies within our window - senderOffset = 10; - generateMockLogs(senderOffset); + // We add more logs to the second half of the window to test that a second iteration in `syncTaggedLogsAsSender` + // is handled correctly. + tagIndex = 11; + generateMockLogs(tagIndex); for (let i = 0; i < senders.length; i++) { await simulatorOracle.syncTaggedLogsAsSender( contractAddress, @@ -305,14 +309,14 @@ describe('Simulator oracle', () => { } indexesAsSenderAfterSync = await database.getTaggingSecretsIndexesAsSender(secrets); - expect(indexesAsSenderAfterSync).toStrictEqual([11, 11, 11, 11, 11, 12, 12, 12, 12, 12]); + expect(indexesAsSenderAfterSync).toStrictEqual([12, 12, 12, 12, 12, 13, 13, 13, 13, 13]); expect(aztecNode.getLogsByTags.mock.calls.length).toBe(NUM_SENDERS * 2); }); it('should sync tagged logs with a sender index offset', async () => { - const senderOffset = 5; - generateMockLogs(senderOffset); + const tagIndex = 5; + generateMockLogs(tagIndex); const syncedLogs = await simulatorOracle.syncTaggedLogs(contractAddress, 3); // We expect to have all logs intended for the recipient, one per sender + 1 with a duplicated tag for the first one + half of the logs for the second index expect(syncedLogs.get(recipient.address.toString())).toHaveLength(NUM_SENDERS + 1 + NUM_SENDERS / 2); @@ -320,32 +324,32 @@ describe('Simulator oracle', () => { // Recompute the secrets (as recipient) to ensure indexes are updated const ivsk = await keyStore.getMasterIncomingViewingSecretKey(recipient.address); const secrets = senders.map(sender => { - const firstSenderSharedSecret = computeTaggingSecret(recipient, ivsk, sender.completeAddress.address); - return poseidon2Hash([firstSenderSharedSecret.x, firstSenderSharedSecret.y, contractAddress]); + const firstSenderSecretPoint = computeTaggingSecretPoint(recipient, ivsk, sender.completeAddress.address); + return poseidon2Hash([firstSenderSecretPoint.x, firstSenderSecretPoint.y, contractAddress]); }); // First sender should have 2 logs, but keep index 1 since they were built using the same tag - // Next 4 senders hould also have index 6 = offset + 1 + // Next 4 senders should also have index 6 = offset + 1 // Last 5 senders should have index 7 = offset + 2 const indexes = await database.getTaggingSecretsIndexesAsRecipient(secrets); expect(indexes).toHaveLength(NUM_SENDERS); expect(indexes).toEqual([6, 6, 6, 6, 6, 7, 7, 7, 7, 7]); - // We should have called the node 17 times: - // 5 times with no results (sender offset) + 2 times with logs (sliding the window) + 10 times with no results (window size) - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(5 + 2 + SENDER_OFFSET_WINDOW_SIZE); + // We should have called the node 2 times: + // 2 times: first time during initial request, second time after pushing the edge of the window once + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2); }); it("should sync tagged logs for which indexes are not updated if they're inside the window", async () => { - const senderOffset = 1; - generateMockLogs(senderOffset); + const tagIndex = 1; + generateMockLogs(tagIndex); // Recompute the secrets (as recipient) to update indexes const ivsk = await keyStore.getMasterIncomingViewingSecretKey(recipient.address); const secrets = senders.map(sender => { - const firstSenderSharedSecret = computeTaggingSecret(recipient, ivsk, sender.completeAddress.address); - return poseidon2Hash([firstSenderSharedSecret.x, firstSenderSharedSecret.y, contractAddress]); + const firstSenderSecretPoint = computeTaggingSecretPoint(recipient, ivsk, sender.completeAddress.address); + return poseidon2Hash([firstSenderSecretPoint.x, firstSenderSecretPoint.y, contractAddress]); }); // Increase our indexes to 2 @@ -358,31 +362,33 @@ describe('Simulator oracle', () => { expect(syncedLogs.get(recipient.address.toString())).toHaveLength(NUM_SENDERS + 1 + NUM_SENDERS / 2); // First sender should have 2 logs, but keep index 2 since they were built using the same tag - // Next 4 senders hould also have index 2 = offset + 1 - // Last 5 senders should have index 3 = offset + 2 + // Next 4 senders should also have index 2 = tagIndex + 1 + // Last 5 senders should have index 3 = tagIndex + 2 const indexes = await database.getTaggingSecretsIndexesAsRecipient(secrets); expect(indexes).toHaveLength(NUM_SENDERS); expect(indexes).toEqual([2, 2, 2, 2, 2, 3, 3, 3, 3, 3]); - // We should have called the node 13 times: - // 1 time without logs + 2 times with logs (sliding the window) + 10 times with no results (window size) - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(3 + SENDER_OFFSET_WINDOW_SIZE); + // We should have called the node 2 times: + // first time during initial request, second time after pushing the edge of the window once + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2); }); it("should not sync tagged logs for which indexes are not updated if they're outside the window", async () => { - const senderOffset = 0; - generateMockLogs(senderOffset); + const tagIndex = 0; + generateMockLogs(tagIndex); // Recompute the secrets (as recipient) to update indexes const ivsk = await keyStore.getMasterIncomingViewingSecretKey(recipient.address); const secrets = senders.map(sender => { - const firstSenderSharedSecret = computeTaggingSecret(recipient, ivsk, sender.completeAddress.address); - return poseidon2Hash([firstSenderSharedSecret.x, firstSenderSharedSecret.y, contractAddress]); + const firstSenderSecretPoint = computeTaggingSecretPoint(recipient, ivsk, sender.completeAddress.address); + return poseidon2Hash([firstSenderSecretPoint.x, firstSenderSecretPoint.y, contractAddress]); }); + // We set the indexes to WINDOW_HALF_SIZE + 1 so that it's outside the window and for this reason no updates + // should be triggered. await database.setTaggingSecretsIndexesAsRecipient( - secrets.map(secret => new IndexedTaggingSecret(secret, SENDER_OFFSET_WINDOW_SIZE + 1)), + secrets.map(secret => new IndexedTaggingSecret(secret, WINDOW_HALF_SIZE + 1)), ); const syncedLogs = await simulatorOracle.syncTaggedLogs(contractAddress, 3); @@ -396,32 +402,32 @@ describe('Simulator oracle', () => { expect(indexes).toHaveLength(NUM_SENDERS); expect(indexes).toEqual([11, 11, 11, 11, 11, 11, 11, 11, 11, 11]); - // We should have called the node SENDER_OFFSET_WINDOW_SIZE + 1 (with logs) + SENDER_OFFSET_WINDOW_SIZE: - // Once for index 1 (NUM_SENDERS/2 logs) + 2 times the sliding window (no logs each time) - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(1 + 2 * SENDER_OFFSET_WINDOW_SIZE); + // We should have called the node once and that is only for the first window + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(1); }); it('should sync tagged logs from scratch after a DB wipe', async () => { - const senderOffset = 0; - generateMockLogs(senderOffset); + const tagIndex = 0; + generateMockLogs(tagIndex); // Recompute the secrets (as recipient) to update indexes const ivsk = await keyStore.getMasterIncomingViewingSecretKey(recipient.address); const secrets = senders.map(sender => { - const firstSenderSharedSecret = computeTaggingSecret(recipient, ivsk, sender.completeAddress.address); - return poseidon2Hash([firstSenderSharedSecret.x, firstSenderSharedSecret.y, contractAddress]); + const firstSenderSecretPoint = computeTaggingSecretPoint(recipient, ivsk, sender.completeAddress.address); + return poseidon2Hash([firstSenderSecretPoint.x, firstSenderSecretPoint.y, contractAddress]); }); await database.setTaggingSecretsIndexesAsRecipient( - secrets.map(secret => new IndexedTaggingSecret(secret, SENDER_OFFSET_WINDOW_SIZE + 2)), + secrets.map(secret => new IndexedTaggingSecret(secret, WINDOW_HALF_SIZE + 2)), ); let syncedLogs = await simulatorOracle.syncTaggedLogs(contractAddress, 3); // No logs should be synced since we start from index 2 = 12 - window_size expect(syncedLogs.get(recipient.address.toString())).toHaveLength(0); - // We should have called the node 21 times (window size + current_index + window size) - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2 * SENDER_OFFSET_WINDOW_SIZE + 1); + // Since no logs were synced, window edge hash not been pushed and for this reason we should have called + // the node only once for the initial window + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(1); aztecNode.getLogsByTags.mockClear(); @@ -431,21 +437,21 @@ describe('Simulator oracle', () => { syncedLogs = await simulatorOracle.syncTaggedLogs(contractAddress, 3); // First sender should have 2 logs, but keep index 1 since they were built using the same tag - // Next 4 senders hould also have index 1 = offset + 1 + // Next 4 senders should also have index 1 = offset + 1 // Last 5 senders should have index 2 = offset + 2 const indexes = await database.getTaggingSecretsIndexesAsRecipient(secrets); expect(indexes).toHaveLength(NUM_SENDERS); expect(indexes).toEqual([1, 1, 1, 1, 1, 2, 2, 2, 2, 2]); - // We should have called the node 12 times: - // 2 times with logs (sliding the window) + 10 times with no results (window size) - expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2 + SENDER_OFFSET_WINDOW_SIZE); + // We should have called the node 2 times: + // first time during initial request, second time after pushing the edge of the window once + expect(aztecNode.getLogsByTags.mock.calls.length).toBe(2); }); it('should not sync tagged logs with a blockNumber > maxBlockNumber', async () => { - const senderOffset = 0; - generateMockLogs(senderOffset); + const tagIndex = 0; + generateMockLogs(tagIndex); const syncedLogs = await simulatorOracle.syncTaggedLogs(contractAddress, 1); // Only NUM_SENDERS + 1 logs should be synched, since the rest have blockNumber > 1 @@ -468,8 +474,8 @@ describe('Simulator oracle', () => { simulator.computeNoteHashAndOptionallyANullifier.mockImplementation((...args: any) => Promise.resolve({ noteHash: Fr.random(), - uniqueNoteHash: Fr.random(), - siloedNoteHash: pedersenHash(args[5].items), // args[5] is note + uniqueNoteHash: pedersenHash(args[5].items), // args[5] is note + siloedNoteHash: Fr.random(), innerNullifier: Fr.random(), }), ); @@ -654,40 +660,27 @@ describe('Simulator oracle', () => { } }); - it('should not store nullified notes', async () => { + it('should remove nullified notes', async () => { const requests = [ new MockNoteRequest(getRandomNoteLogPayload(Fr.random(), contractAddress), 1, 1, 1, recipient.address), new MockNoteRequest(getRandomNoteLogPayload(Fr.random(), contractAddress), 6, 3, 2, recipient.address), new MockNoteRequest(getRandomNoteLogPayload(Fr.random(), contractAddress), 12, 3, 2, recipient.address), ]; - const taggedLogs = mockTaggedLogs(requests, 2); - - getIncomingNotesSpy.mockResolvedValueOnce(Promise.resolve(requests.map(request => request.snippetOfNoteDao))); - - await simulatorOracle.processTaggedLogs(taggedLogs, recipient.address, simulator); - - expect(addNotesSpy).toHaveBeenCalledTimes(1); - expect(addNotesSpy).toHaveBeenCalledWith( - // Incoming should contain notes from requests 0, 1, 2 because in those requests we set owner address point. - [ - expect.objectContaining({ - ...requests[0].snippetOfNoteDao, - index: requests[0].indexWithinNoteHashTree, - }), - expect.objectContaining({ - ...requests[1].snippetOfNoteDao, - index: requests[1].indexWithinNoteHashTree, - }), - expect.objectContaining({ - ...requests[2].snippetOfNoteDao, - index: requests[2].indexWithinNoteHashTree, - }), - ], - recipient.address, + getIncomingNotesSpy.mockResolvedValueOnce( + Promise.resolve(requests.map(request => ({ siloedNullifier: Fr.random(), ...request.snippetOfNoteDao }))), ); + let requestedNullifier; + aztecNode.findNullifiersIndexesWithBlock.mockImplementationOnce((_blockNumber, nullifiers) => { + const block = L2Block.random(2); + requestedNullifier = wrapInBlock(nullifiers[0], block); + return Promise.resolve([wrapInBlock(1n, L2Block.random(2)), undefined, undefined]); + }); + + await simulatorOracle.removeNullifiedNotes(contractAddress); expect(removeNullifiedNotesSpy).toHaveBeenCalledTimes(1); + expect(removeNullifiedNotesSpy).toHaveBeenCalledWith([requestedNullifier], recipient.address.toAddressPoint()); }, 30_000); }); }); diff --git a/yarn-project/pxe/src/simulator_oracle/tagging_utils.ts b/yarn-project/pxe/src/simulator_oracle/tagging_utils.ts new file mode 100644 index 00000000000..6cf121bcd7b --- /dev/null +++ b/yarn-project/pxe/src/simulator_oracle/tagging_utils.ts @@ -0,0 +1,31 @@ +import { type Fr, IndexedTaggingSecret } from '@aztec/circuits.js'; + +// Half the size of the window we slide over the tagging secret indexes. +export const WINDOW_HALF_SIZE = 10; + +export function getIndexedTaggingSecretsForTheWindow( + secretsAndWindows: { appTaggingSecret: Fr; leftMostIndex: number; rightMostIndex: number }[], +): IndexedTaggingSecret[] { + const secrets: IndexedTaggingSecret[] = []; + for (const secretAndWindow of secretsAndWindows) { + for (let i = secretAndWindow.leftMostIndex; i <= secretAndWindow.rightMostIndex; i++) { + secrets.push(new IndexedTaggingSecret(secretAndWindow.appTaggingSecret, i)); + } + } + return secrets; +} + +/** + * Creates a map from app tagging secret to initial index. + * @param indexedTaggingSecrets - The indexed tagging secrets to get the initial indexes from. + * @returns The map from app tagging secret to initial index. + */ +export function getInitialIndexesMap(indexedTaggingSecrets: IndexedTaggingSecret[]): { [k: string]: number } { + const initialIndexes: { [k: string]: number } = {}; + + for (const indexedTaggingSecret of indexedTaggingSecrets) { + initialIndexes[indexedTaggingSecret.appTaggingSecret.toString()] = indexedTaggingSecret.index; + } + + return initialIndexes; +} diff --git a/yarn-project/pxe/src/synchronizer/synchronizer.ts b/yarn-project/pxe/src/synchronizer/synchronizer.ts index a4f13e1d019..225787866df 100644 --- a/yarn-project/pxe/src/synchronizer/synchronizer.ts +++ b/yarn-project/pxe/src/synchronizer/synchronizer.ts @@ -12,14 +12,12 @@ import { type PXEConfig } from '../config/index.js'; import { type PxeDatabase } from '../database/index.js'; /** - * The Synchronizer class manages the synchronization of note processors and interacts with the Aztec node - * to obtain encrypted logs, blocks, and other necessary information for the accounts. - * It provides methods to start or stop the synchronization process, add new accounts, retrieve account - * details, and fetch transactions by hash. The Synchronizer ensures that it maintains the note processors - * in sync with the blockchain while handling retries and errors gracefully. + * The Synchronizer class manages the synchronization with the aztec node, allowing PXE to retrieve the + * latest block header and handle reorgs. + * It provides methods to trigger a sync and get the block number we are syncec to + * details, and fetch transactions by hash. */ export class Synchronizer implements L2BlockStreamEventHandler { - private running = false; private initialSyncBlockNumber = INITIAL_L2_BLOCK_NUM - 1; private log: Logger; protected readonly blockStream: L2BlockStream; @@ -28,16 +26,15 @@ export class Synchronizer implements L2BlockStreamEventHandler { private node: AztecNode, private db: PxeDatabase, private l2TipsStore: L2TipsStore, - config: Partial> = {}, + config: Partial> = {}, logSuffix?: string, ) { this.log = createLogger(logSuffix ? `pxe:synchronizer:${logSuffix}` : 'pxe:synchronizer'); this.blockStream = this.createBlockStream(config); } - protected createBlockStream(config: Partial>) { + protected createBlockStream(config: Partial>) { return new L2BlockStream(this.node, this.l2TipsStore, this, createLogger('pxe:block_stream'), { - pollIntervalMS: config.l2BlockPollingIntervalMS, startingBlock: config.l2StartingBlock, }); } @@ -73,19 +70,10 @@ export class Synchronizer implements L2BlockStreamEventHandler { } /** - * Starts the synchronization process by fetching encrypted logs and blocks from a specified position. - * Continuously processes the fetched data for all note processors until stopped. If there is no data - * available, it retries after a specified interval. - * - * @param limit - The maximum number of encrypted, unencrypted logs and blocks to fetch in each iteration. - * @param retryInterval - The time interval (in ms) to wait before retrying if no data is available. + * Syncs PXE and the node by dowloading the metadata of the latest blocks, allowing simulations to use + * recent data (e.g. notes), and handling any reorgs that might have occurred. */ - public async start() { - if (this.running) { - return; - } - this.running = true; - + public async sync() { let currentHeader; try { @@ -97,54 +85,10 @@ export class Synchronizer implements L2BlockStreamEventHandler { // REFACTOR: We should know the header of the genesis block without having to request it from the node. await this.db.setHeader(await this.node.getBlockHeader(0)); } - - await this.trigger(); - this.log.info('Initial sync complete'); - this.blockStream.start(); - this.log.debug('Started loop'); - } - - /** - * Stops the synchronizer gracefully, interrupting any ongoing sleep and waiting for the current - * iteration to complete before setting the running state to false. Once stopped, the synchronizer - * will no longer process blocks or encrypted logs and must be restarted using the start method. - * - * @returns A promise that resolves when the synchronizer has successfully stopped. - */ - public async stop() { - this.running = false; - await this.blockStream.stop(); - this.log.info('Stopped'); - } - - /** Triggers a single run. */ - public async trigger() { await this.blockStream.sync(); } - private async getSynchedBlockNumber() { + public async getSynchedBlockNumber() { return (await this.db.getBlockNumber()) ?? this.initialSyncBlockNumber; } - - /** - * Checks whether all the blocks were processed (tree roots updated, txs updated with block info, etc.). - * @returns True if there are no outstanding blocks to be synched. - * @remarks This indicates that blocks and transactions are synched even if notes are not. - * @remarks Compares local block number with the block number from aztec node. - */ - public async isGlobalStateSynchronized() { - const latest = await this.node.getBlockNumber(); - return latest <= (await this.getSynchedBlockNumber()); - } - - /** - * Returns the latest block that has been synchronized by the synchronizer and each account. - * @returns The latest block synchronized for blocks, and the latest block synched for notes for each public key being tracked. - */ - public async getSyncStatus() { - const lastBlockNumber = await this.getSynchedBlockNumber(); - return { - blocks: lastBlockNumber, - }; - } } diff --git a/yarn-project/pxe/src/pxe_service/create_pxe_service.ts b/yarn-project/pxe/src/utils/create_pxe_service.ts similarity index 79% rename from yarn-project/pxe/src/pxe_service/create_pxe_service.ts rename to yarn-project/pxe/src/utils/create_pxe_service.ts index bd168463788..18783887ffb 100644 --- a/yarn-project/pxe/src/pxe_service/create_pxe_service.ts +++ b/yarn-project/pxe/src/utils/create_pxe_service.ts @@ -1,4 +1,5 @@ import { BBNativePrivateKernelProver } from '@aztec/bb-prover'; +import { BBWasmPrivateKernelProver } from '@aztec/bb-prover/wasm'; import { type AztecNode, type PrivateKernelProver } from '@aztec/circuit-types'; import { randomBytes } from '@aztec/foundation/crypto'; import { createLogger } from '@aztec/foundation/log'; @@ -9,7 +10,7 @@ import { L2TipsStore } from '@aztec/kv-store/stores'; import { type PXEServiceConfig } from '../config/index.js'; import { KVPxeDatabase } from '../database/kv_pxe_database.js'; import { TestPrivateKernelProver } from '../kernel_prover/test/test_circuit_prover.js'; -import { PXEService } from './pxe_service.js'; +import { PXEService } from '../pxe_service/pxe_service.js'; /** * Create and start an PXEService instance with the given AztecNode. @@ -47,9 +48,9 @@ export async function createPXEService( const tips = new L2TipsStore(store, 'pxe'); const prover = proofCreator ?? (await createProver(config, logSuffix)); - const server = new PXEService(keyStore, aztecNode, db, tips, prover, config, logSuffix); - await server.start(); - return server; + const pxe = new PXEService(keyStore, aztecNode, db, tips, prover, config, logSuffix); + await pxe.init(); + return pxe; } function createProver(config: PXEServiceConfig, logSuffix?: string) { @@ -59,9 +60,11 @@ function createProver(config: PXEServiceConfig, logSuffix?: string) { // (@PhilWindle) Temporary validation until WASM is implemented if (!config.bbBinaryPath || !config.bbWorkingDirectory) { - throw new Error(`Prover must be configured with binary path and working directory`); + return new BBWasmPrivateKernelProver(16); + } else { + const bbConfig = config as Required> & + PXEServiceConfig; + const log = createLogger('pxe:bb-native-prover' + (logSuffix ? `:${logSuffix}` : '')); + return BBNativePrivateKernelProver.new({ bbSkipCleanup: false, ...bbConfig }, log); } - const bbConfig = config as Required> & PXEServiceConfig; - const log = createLogger('pxe:bb-native-prover' + (logSuffix ? `:${logSuffix}` : '')); - return BBNativePrivateKernelProver.new({ bbSkipCleanup: false, ...bbConfig }, log); } diff --git a/yarn-project/pxe/src/utils/index.ts b/yarn-project/pxe/src/utils/index.ts deleted file mode 100644 index f971258aca0..00000000000 --- a/yarn-project/pxe/src/utils/index.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { BBNativePrivateKernelProver } from '@aztec/bb-prover'; -import { type AztecNode, type PrivateKernelProver } from '@aztec/circuit-types'; -import { randomBytes } from '@aztec/foundation/crypto'; -import { createLogger } from '@aztec/foundation/log'; -import { KeyStore } from '@aztec/key-store'; -import { createStore } from '@aztec/kv-store/lmdb'; -import { L2TipsStore } from '@aztec/kv-store/stores'; - -import { type PXEServiceConfig } from '../config/index.js'; -import { KVPxeDatabase } from '../database/kv_pxe_database.js'; -import { TestPrivateKernelProver } from '../kernel_prover/test/test_circuit_prover.js'; -import { PXEService } from '../pxe_service/pxe_service.js'; - -/** - * Create and start an PXEService instance with the given AztecNode. - * If no keyStore or database is provided, it will use KeyStore and MemoryDB as default values. - * Returns a Promise that resolves to the started PXEService instance. - * - * @param aztecNode - The AztecNode instance to be used by the server. - * @param config - The PXE Service Config to use - * @param options - (Optional) Optional information for creating an PXEService. - * @param proofCreator - An optional proof creator to use in place of any other configuration - * @returns A Promise that resolves to the started PXEService instance. - */ -export async function createPXEService( - aztecNode: AztecNode, - config: PXEServiceConfig, - useLogSuffix: string | boolean | undefined = undefined, - proofCreator?: PrivateKernelProver, -) { - const logSuffix = - typeof useLogSuffix === 'boolean' ? (useLogSuffix ? randomBytes(3).toString('hex') : undefined) : useLogSuffix; - - const l1Contracts = await aztecNode.getL1ContractAddresses(); - const configWithContracts = { - ...config, - l1Contracts, - } as PXEServiceConfig; - - const keyStore = new KeyStore( - await createStore('pxe_key_store', configWithContracts, createLogger('pxe:keystore:lmdb')), - ); - - const store = await createStore('pxe_data', configWithContracts, createLogger('pxe:data:lmdb')); - - const db = await KVPxeDatabase.create(store); - const tips = new L2TipsStore(store, 'pxe'); - - const prover = proofCreator ?? (await createProver(config, logSuffix)); - const server = new PXEService(keyStore, aztecNode, db, tips, prover, config, logSuffix); - await server.start(); - return server; -} - -function createProver(config: PXEServiceConfig, logSuffix?: string) { - if (!config.proverEnabled) { - return new TestPrivateKernelProver(); - } - - // (@PhilWindle) Temporary validation until WASM is implemented - if (!config.bbBinaryPath || !config.bbWorkingDirectory) { - throw new Error(`Prover must be configured with binary path and working directory`); - } - const bbConfig = config as Required> & PXEServiceConfig; - const log = createLogger('pxe:bb-native-prover' + (logSuffix ? `:${logSuffix}` : '')); - return BBNativePrivateKernelProver.new({ bbSkipCleanup: false, ...bbConfig }, log); -} diff --git a/yarn-project/sequencer-client/package.json b/yarn-project/sequencer-client/package.json index 33437775006..d373ef337b5 100644 --- a/yarn-project/sequencer-client/package.json +++ b/yarn-project/sequencer-client/package.json @@ -2,7 +2,10 @@ "name": "@aztec/sequencer-client", "version": "0.1.0", "type": "module", - "exports": "./dest/index.js", + "exports": { + ".": "./dest/index.js", + "./config": "./dest/config.js" + }, "typedocOptions": { "entryPoints": [ "./src/index.ts" diff --git a/yarn-project/sequencer-client/src/config.ts b/yarn-project/sequencer-client/src/config.ts index 76130083211..795b8f4b564 100644 --- a/yarn-project/sequencer-client/src/config.ts +++ b/yarn-project/sequencer-client/src/config.ts @@ -1,5 +1,5 @@ -import { type AllowedElement } from '@aztec/circuit-types'; -import { AztecAddress, Fr, FunctionSelector, getContractClassFromArtifact } from '@aztec/circuits.js'; +import { type AllowedElement, type SequencerConfig } from '@aztec/circuit-types/config'; +import { AztecAddress, Fr, FunctionSelector } from '@aztec/circuits.js'; import { type L1ContractsConfig, type L1ReaderConfig, @@ -14,9 +14,6 @@ import { } from '@aztec/foundation/config'; import { pickConfigMappings } from '@aztec/foundation/config'; import { EthAddress } from '@aztec/foundation/eth-address'; -import { FPCContract } from '@aztec/noir-contracts.js/FPC'; -import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; -import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { type PublisherConfig, @@ -24,7 +21,9 @@ import { getPublisherConfigMappings, getTxSenderConfigMappings, } from './publisher/config.js'; -import { type SequencerConfig } from './sequencer/config.js'; + +export * from './publisher/config.js'; +export { SequencerConfig }; /** Chain configuration. */ type ChainConfig = { @@ -60,17 +59,6 @@ export const sequencerConfigMappings: ConfigMappingsType = { description: 'The minimum number of txs to include in a block.', ...numberConfigHelper(1), }, - minSecondsBetweenBlocks: { - env: 'SEQ_MIN_SECONDS_BETWEEN_BLOCKS', - description: 'The minimum number of seconds in-between consecutive blocks.', - ...numberConfigHelper(0), - }, - maxSecondsBetweenBlocks: { - env: 'SEQ_MAX_SECONDS_BETWEEN_BLOCKS', - description: - 'The maximum number of seconds in-between consecutive blocks. Sequencer will produce a block with less than minTxsPerBlock once this threshold is reached.', - ...numberConfigHelper(0), - }, coinbase: { env: 'COINBASE', parseEnv: (val: string) => EthAddress.fromString(val), @@ -92,18 +80,10 @@ export const sequencerConfigMappings: ConfigMappingsType = { allowedInSetup: { env: 'SEQ_ALLOWED_SETUP_FN', parseEnv: (val: string) => parseSequencerAllowList(val), - defaultValue: getDefaultAllowedSetupFunctions(), description: 'The list of functions calls allowed to run in setup', printDefault: () => 'AuthRegistry, FeeJuice.increase_public_balance, Token.increase_public_balance, FPC.prepare_fee', }, - allowedInTeardown: { - env: 'SEQ_ALLOWED_TEARDOWN_FN', - parseEnv: (val: string) => parseSequencerAllowList(val), - defaultValue: getDefaultAllowedTeardownFunctions(), - description: 'The list of functions calls allowed to run teardown', - printDefault: () => 'FPC.pay_refund', - }, maxBlockSizeInBytes: { env: 'SEQ_MAX_BLOCK_SIZE_IN_BYTES', description: 'Max block size', @@ -189,12 +169,12 @@ export function parseSequencerAllowList(value: string): AllowedElement[] { } else if (typeString === 'C') { if (selector) { entries.push({ - classId: Fr.fromString(identifierString), + classId: Fr.fromHexString(identifierString), selector, }); } else { entries.push({ - classId: Fr.fromString(identifierString), + classId: Fr.fromHexString(identifierString), }); } } @@ -202,38 +182,3 @@ export function parseSequencerAllowList(value: string): AllowedElement[] { return entries; } - -function getDefaultAllowedSetupFunctions(): AllowedElement[] { - return [ - // needed for authwit support - { - address: ProtocolContractAddress.AuthRegistry, - }, - // needed for claiming on the same tx as a spend - { - address: ProtocolContractAddress.FeeJuice, - // We can't restrict the selector because public functions get routed via dispatch. - // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'), - }, - // needed for private transfers via FPC - { - classId: getContractClassFromArtifact(TokenContractArtifact).id, - // We can't restrict the selector because public functions get routed via dispatch. - // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'), - }, - { - classId: getContractClassFromArtifact(FPCContract.artifact).id, - // We can't restrict the selector because public functions get routed via dispatch. - // selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'), - }, - ]; -} - -function getDefaultAllowedTeardownFunctions(): AllowedElement[] { - return [ - { - classId: getContractClassFromArtifact(FPCContract.artifact).id, - selector: FunctionSelector.fromSignature('pay_refund((Field),Field,(Field))'), - }, - ]; -} diff --git a/yarn-project/sequencer-client/src/index.ts b/yarn-project/sequencer-client/src/index.ts index 1718ed0a3a6..cb826f2c545 100644 --- a/yarn-project/sequencer-client/src/index.ts +++ b/yarn-project/sequencer-client/src/index.ts @@ -1,7 +1,6 @@ export * from './client/index.js'; export * from './config.js'; export * from './publisher/index.js'; -export * from './sequencer/index.js'; // Used by the node to simulate public parts of transactions. Should these be moved to a shared library? // ISSUE(#9832) diff --git a/yarn-project/sequencer-client/src/publisher/index.ts b/yarn-project/sequencer-client/src/publisher/index.ts index 5590025020a..f0a2f3b5092 100644 --- a/yarn-project/sequencer-client/src/publisher/index.ts +++ b/yarn-project/sequencer-client/src/publisher/index.ts @@ -1,3 +1,2 @@ export { L1Publisher, L1SubmitEpochProofArgs } from './l1-publisher.js'; export * from './test-l1-publisher.js'; -export * from './config.js'; diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts index 29d8bb4b527..b33c857a529 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher-metrics.ts @@ -38,9 +38,6 @@ export class L1PublisherMetrics { description: 'The duration of transaction processing', unit: 'ms', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: [10, 50, 100, 200, 500, 1000, 2000, 5000, 10000], - }, }); this.txGas = meter.createHistogram(Metrics.L1_PUBLISHER_TX_GAS, { @@ -51,11 +48,8 @@ export class L1PublisherMetrics { this.txCalldataSize = meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_SIZE, { description: 'The size of the calldata in transactions', - unit: 'bytes', + unit: 'By', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: [0, 100, 200, 500, 1000, 2000, 5000, 10000], - }, }); this.txCalldataGas = meter.createHistogram(Metrics.L1_PUBLISHER_TX_CALLDATA_GAS, { diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher.test.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher.test.ts index cedbfbe0d7d..64ac88119d5 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher.test.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher.test.ts @@ -7,6 +7,7 @@ import { defaultL1TxUtilsConfig, getL1ContractsConfigEnvVars, } from '@aztec/ethereum'; +import { Blob } from '@aztec/foundation/blob'; import { type ViemSignature } from '@aztec/foundation/eth-signature'; import { sleep } from '@aztec/foundation/sleep'; import { RollupAbi } from '@aztec/l1-artifacts'; @@ -145,6 +146,12 @@ describe('L1Publisher', () => { expect(result).toEqual(true); + const kzg = Blob.getViemKzgInstance(); + + const blobs = Blob.getBlobs(l2Block.body.toBlobFields()); + + const blobInput = Blob.getEthBlobEvaluationInputs(blobs); + const args = [ { header: `0x${header.toString('hex')}`, @@ -158,6 +165,7 @@ describe('L1Publisher', () => { }, [], `0x${body.toString('hex')}`, + blobInput, ] as const; expect(l1TxUtils.sendAndMonitorTransaction).toHaveBeenCalledWith( { @@ -165,6 +173,7 @@ describe('L1Publisher', () => { data: encodeFunctionData({ abi: rollupContract.abi, functionName: 'propose', args }), }, { fixedGas: GAS_GUESS + L1Publisher.PROPOSE_GAS_GUESS }, + { blobs: blobs.map(b => b.data), kzg, maxFeePerBlobGas: 10000000000n }, ); }); diff --git a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts index fe417eee1cb..f2580de6a6f 100644 --- a/yarn-project/sequencer-client/src/publisher/l1-publisher.ts +++ b/yarn-project/sequencer-client/src/publisher/l1-publisher.ts @@ -25,6 +25,8 @@ import { createEthereumChain, } from '@aztec/ethereum'; import { makeTuple } from '@aztec/foundation/array'; +import { toHex } from '@aztec/foundation/bigint-buffer'; +import { Blob } from '@aztec/foundation/blob'; import { areArraysEqual, compactArray, times } from '@aztec/foundation/collection'; import { type Signature } from '@aztec/foundation/eth-signature'; import { Fr } from '@aztec/foundation/fields'; @@ -32,7 +34,7 @@ import { createLogger } from '@aztec/foundation/log'; import { type Tuple, serializeToBuffer } from '@aztec/foundation/serialize'; import { InterruptibleSleep } from '@aztec/foundation/sleep'; import { Timer } from '@aztec/foundation/timer'; -import { GovernanceProposerAbi, RollupAbi } from '@aztec/l1-artifacts'; +import { ExtRollupLibAbi, GovernanceProposerAbi, LeonidasLibAbi, RollupAbi } from '@aztec/l1-artifacts'; import { type TelemetryClient } from '@aztec/telemetry-client'; import pick from 'lodash.pick'; @@ -41,7 +43,7 @@ import { type BaseError, type Chain, type Client, - type ContractFunctionExecutionError, + ContractFunctionExecutionError, ContractFunctionRevertedError, type GetContractReturnType, type Hex, @@ -60,6 +62,7 @@ import { getAbiItem, getAddress, getContract, + getContractError, hexToBytes, http, publicActions, @@ -110,8 +113,10 @@ type L1ProcessArgs = { archive: Buffer; /** The L2 block's leaf in the archive tree. */ blockHash: Buffer; - /** L2 block body. */ + /** L2 block body. TODO(#9101): Remove block body once we can extract blobs. */ body: Buffer; + /** L2 block blobs containing all tx effects. */ + blobs: Blob[]; /** L2 block tx hashes */ txHashes: TxHash[]; /** Attestations */ @@ -166,6 +171,9 @@ export class L1Publisher { protected account: PrivateKeyAccount; protected ethereumSlotDuration: bigint; + // @note - with blobs, the below estimate seems too large. + // Total used for full block from int_l1_pub e2e test: 1m (of which 86k is 1x blob) + // Total used for emptier block from above test: 429k (of which 84k is 1x blob) public static PROPOSE_GAS_GUESS: bigint = 12_000_000n; public static PROPOSE_AND_CLAIM_GAS_GUESS: bigint = this.PROPOSE_GAS_GUESS + 100_000n; @@ -342,7 +350,10 @@ export class L1Publisher { try { await this.rollupContract.read.validateEpochProofRightClaimAtTime(args, { account: this.account }); } catch (err) { - const errorName = tryGetCustomErrorName(err); + let errorName = tryGetCustomErrorName(err); + if (!errorName) { + errorName = tryGetCustomErrorNameContractFunction(err as ContractFunctionExecutionError); + } this.log.warn(`Proof quote validation failed: ${errorName}`, quote); return undefined; } @@ -375,7 +386,7 @@ export class L1Publisher { formattedSignatures, `0x${attestationData.digest.toString('hex')}`, ts, - `0x${header.contentCommitment.txsEffectsHash.toString('hex')}`, + `0x${header.contentCommitment.blobsHash.toString('hex')}`, flags, ] as const; @@ -386,6 +397,36 @@ export class L1Publisher { if (error instanceof ContractFunctionRevertedError) { const err = error as ContractFunctionRevertedError; this.log.debug(`Validation failed: ${err.message}`, err.data); + } else if (error instanceof ContractFunctionExecutionError) { + let err = error as ContractFunctionRevertedError; + if (!tryGetCustomErrorName(err)) { + // If we get here, it's because the custom error no longer exists in Rollup.sol, + // but in another lib. The below reconstructs the error message. + try { + await this.publicClient.estimateGas({ + data: encodeFunctionData({ + abi: this.rollupContract.abi, + functionName: 'validateHeader', + args, + }), + account: this.account, + to: this.rollupContract.address, + }); + } catch (estGasErr: unknown) { + const possibleAbis = [ExtRollupLibAbi, LeonidasLibAbi]; + possibleAbis.forEach(abi => { + const possibleErr = getContractError(estGasErr as BaseError, { + args: [], + abi: abi, + functionName: 'validateHeader', + address: this.rollupContract.address, + sender: this.account.address, + }); + err = tryGetCustomErrorName(possibleErr) ? possibleErr : err; + }); + } + throw err; + } } else { this.log.debug(`Unexpected error during validation: ${error}`); } @@ -501,10 +542,10 @@ export class L1Publisher { archive: block.archive.root.toBuffer(), blockHash: block.header.hash().toBuffer(), body: block.body.toBuffer(), + blobs: Blob.getBlobs(block.body.toBlobFields()), attestations, txHashes: txHashes ?? [], }; - // Publish body and propose block (if not already published) if (this.interrupted) { this.log.verbose('L2 block data syncing interrupted while processing blocks.', ctx); @@ -532,7 +573,7 @@ export class L1Publisher { return false; } - const { receipt, args, functionName } = result; + const { receipt, args, functionName, data } = result; // Tx was mined successfully if (receipt.status === 'success') { @@ -551,14 +592,21 @@ export class L1Publisher { } this.metrics.recordFailedTx('process'); - - const errorMsg = await this.tryGetErrorFromRevertedTx({ - args, - functionName, - abi: RollupAbi, - address: this.rollupContract.address, - blockNumber: receipt.blockNumber, - }); + const kzg = Blob.getViemKzgInstance(); + const errorMsg = await this.tryGetErrorFromRevertedTx( + data, + { + args, + functionName, + abi: RollupAbi, + address: this.rollupContract.address, + }, + { + blobs: proposeTxArgs.blobs.map(b => b.data), + kzg, + maxFeePerBlobGas: 10000000000n, + }, + ); this.log.error(`Rollup process tx reverted. ${errorMsg}`, undefined, { ...ctx, txHash: receipt.transactionHash, @@ -567,25 +615,69 @@ export class L1Publisher { return false; } - private async tryGetErrorFromRevertedTx(args: { - args: any[]; - functionName: string; - abi: any; - address: Hex; - blockNumber: bigint | undefined; - }) { + private async tryGetErrorFromRevertedTx( + data: Hex, + args: { + args: any[]; + functionName: string; + abi: any; + address: Hex; + }, + _blobInputs?: { + blobs: Uint8Array[]; + kzg: any; + maxFeePerBlobGas: bigint; + }, + ) { + const blobInputs = _blobInputs || {}; try { - await this.publicClient.simulateContract({ ...args, account: this.walletClient.account }); + // NB: If this fn starts unexpectedly giving incorrect blob hash errors, it may be because the checkBlob + // bool is no longer at the slot below. To find the slot, run: forge inspect src/core/Rollup.sol:Rollup storage + const checkBlobSlot = 9n; + await this.publicClient.simulateContract({ + ...args, + account: this.walletClient.account, + stateOverride: [ + { + address: args.address, + stateDiff: [ + { + slot: toHex(checkBlobSlot, true), + value: toHex(0n, true), + }, + ], + }, + ], + }); + // If the above passes, we have a blob error. We cannot simulate blob txs, and failed txs no longer throw errors, + // and viem provides no way to get the revert reason from a given tx. + // Strangely, the only way to throw the revert reason as an error and provide blobs is prepareTransactionRequest. + // See: https://github.com/wevm/viem/issues/2075 + // This throws a EstimateGasExecutionError with the custom error information: + await this.walletClient.prepareTransactionRequest({ + account: this.walletClient.account, + to: this.rollupContract.address, + data, + ...blobInputs, + }); return undefined; - } catch (err: any) { - if (err.name === 'ContractFunctionExecutionError') { - const execErr = err as ContractFunctionExecutionError; - return compactArray([ - execErr.shortMessage, - ...(execErr.metaMessages ?? []).slice(0, 2).map(s => s.trim()), - ]).join(' '); + } catch (simulationErr: any) { + // If we don't have a ContractFunctionExecutionError, we have a blob related error => use ExtRollupLibAbi to get the error msg. + const contractErr = + simulationErr.name === 'ContractFunctionExecutionError' + ? simulationErr + : getContractError(simulationErr as BaseError, { + args: [], + abi: ExtRollupLibAbi, + functionName: args.functionName, + address: args.address, + sender: this.account.address, + }); + if (contractErr.name === 'ContractFunctionExecutionError') { + const execErr = contractErr as ContractFunctionExecutionError; + return tryGetCustomErrorNameContractFunction(execErr); } - this.log.error(`Error getting error from simulation`, err); + this.log.error(`Error getting error from simulation`, simulationErr); } } @@ -687,7 +779,7 @@ export class L1Publisher { : proof.extractAggregationObject(); const argsPublicInputs = [...publicInputs.toFields(), ...aggregationObject]; - if (!areArraysEqual(rollupPublicInputs.map(Fr.fromString), argsPublicInputs, (a, b) => a.equals(b))) { + if (!areArraysEqual(rollupPublicInputs.map(Fr.fromHexString), argsPublicInputs, (a, b) => a.equals(b))) { const fmt = (inputs: Fr[] | readonly string[]) => inputs.map(x => x.toString()).join(', '); throw new Error( `Root rollup public inputs mismatch:\nRollup: ${fmt(rollupPublicInputs)}\nComputed:${fmt(argsPublicInputs)}`, @@ -726,7 +818,8 @@ export class L1Publisher { epochSize: argsArray[0], args: argsArray[1], fees: argsArray[2], - aggregationObject: argsArray[3], + blobPublicInputs: argsArray[3], + aggregationObject: argsArray[4], proof: proofHex, }, ] as const; @@ -750,22 +843,31 @@ export class L1Publisher { } private async prepareProposeTx(encodedData: L1ProcessArgs) { - const computeTxsEffectsHashGas = await this.l1TxUtils.estimateGas(this.account, { - to: this.rollupContract.address, - data: encodeFunctionData({ - abi: this.rollupContract.abi, - functionName: 'computeTxsEffectsHash', - args: [`0x${encodedData.body.toString('hex')}`], - }), - }); + const kzg = Blob.getViemKzgInstance(); + const blobEvaluationGas = await this.l1TxUtils.estimateGas( + this.account, + { + to: this.rollupContract.address, + data: encodeFunctionData({ + abi: this.rollupContract.abi, + functionName: 'validateBlobs', + args: [Blob.getEthBlobEvaluationInputs(encodedData.blobs)], + }), + }, + {}, + { + blobs: encodedData.blobs.map(b => b.data), + kzg, + maxFeePerBlobGas: 10000000000n, //This is 10 gwei, taken from DEFAULT_MAX_FEE_PER_GAS + }, + ); // @note We perform this guesstimate instead of the usual `gasEstimate` since // viem will use the current state to simulate against, which means that // we will fail estimation in the case where we are simulating for the // first ethereum block within our slot (as current time is not in the // slot yet). - const gasGuesstimate = computeTxsEffectsHashGas + L1Publisher.PROPOSE_GAS_GUESS; - + const gasGuesstimate = blobEvaluationGas + L1Publisher.PROPOSE_GAS_GUESS; const attestations = encodedData.attestations ? encodedData.attestations.map(attest => attest.toViemSignature()) : []; @@ -783,7 +885,9 @@ export class L1Publisher { txHashes, }, attestations, + // TODO(#9101): Extract blobs from beacon chain => calldata will only contain what's needed to verify blob and body input can be removed `0x${encodedData.body.toString('hex')}`, + Blob.getEthBlobEvaluationInputs(encodedData.blobs), ] as const; return { args, gas: gasGuesstimate }; @@ -811,35 +915,47 @@ export class L1Publisher { ? args.publicInputs.fees[i / 2].recipient.toField().toString() : args.publicInputs.fees[(i - 1) / 2].value.toString(), ), + `0x${args.publicInputs.blobPublicInputs + .filter((_, i) => i < args.toBlock - args.fromBlock + 1) + .map(b => b.toString()) + .join(``)}`, `0x${serializeToBuffer(args.proof.extractAggregationObject()).toString('hex')}`, ] as const; } private async sendProposeTx( encodedData: L1ProcessArgs, - ): Promise<{ receipt: TransactionReceipt; args: any; functionName: string } | undefined> { + ): Promise<{ receipt: TransactionReceipt | undefined; args: any; functionName: string; data: Hex } | undefined> { if (this.interrupted) { return undefined; } try { + const kzg = Blob.getViemKzgInstance(); const { args, gas } = await this.prepareProposeTx(encodedData); + const data = encodeFunctionData({ + abi: this.rollupContract.abi, + functionName: 'propose', + args, + }); const receipt = await this.l1TxUtils.sendAndMonitorTransaction( { to: this.rollupContract.address, - data: encodeFunctionData({ - abi: this.rollupContract.abi, - functionName: 'propose', - args, - }), + data, }, { fixedGas: gas, }, + { + blobs: encodedData.blobs.map(b => b.data), + kzg, + maxFeePerBlobGas: 10000000000n, //This is 10 gwei, taken from DEFAULT_MAX_FEE_PER_GAS + }, ); return { receipt, args, functionName: 'propose', + data, }; } catch (err) { prettyLogViemError(err, this.log); @@ -851,7 +967,7 @@ export class L1Publisher { private async sendProposeAndClaimTx( encodedData: L1ProcessArgs, quote: EpochProofQuote, - ): Promise<{ receipt: TransactionReceipt; args: any; functionName: string } | undefined> { + ): Promise<{ receipt: TransactionReceipt | undefined; args: any; functionName: string; data: Hex } | undefined> { if (this.interrupted) { return undefined; } @@ -859,23 +975,31 @@ export class L1Publisher { this.log.info(`ProposeAndClaim`); this.log.info(inspect(quote.payload)); + const kzg = Blob.getViemKzgInstance(); const { args, gas } = await this.prepareProposeTx(encodedData); + const data = encodeFunctionData({ + abi: this.rollupContract.abi, + functionName: 'proposeAndClaim', + args: [...args, quote.toViemArgs()], + }); const receipt = await this.l1TxUtils.sendAndMonitorTransaction( { to: this.rollupContract.address, - data: encodeFunctionData({ - abi: this.rollupContract.abi, - functionName: 'proposeAndClaim', - args: [...args, quote.toViemArgs()], - }), + data, }, { fixedGas: gas }, + { + blobs: encodedData.blobs.map(b => b.data), + kzg, + maxFeePerBlobGas: 10000000000n, //This is 10 gwei, taken from DEFAULT_MAX_FEE_PER_GAS + }, ); return { receipt, - args, + args: [...args, quote.toViemArgs()], functionName: 'proposeAndClaim', + data, }; } catch (err) { prettyLogViemError(err, this.log); @@ -935,6 +1059,10 @@ function getCalldataGasUsage(data: Uint8Array) { return data.filter(byte => byte === 0).length * 4 + data.filter(byte => byte !== 0).length * 16; } +function tryGetCustomErrorNameContractFunction(err: ContractFunctionExecutionError) { + return compactArray([err.shortMessage, ...(err.metaMessages ?? []).slice(0, 2).map(s => s.trim())]).join(' '); +} + function tryGetCustomErrorName(err: any) { try { // See https://viem.sh/docs/contract/simulateContract#handling-custom-errors diff --git a/yarn-project/sequencer-client/src/sequencer/allowed.ts b/yarn-project/sequencer-client/src/sequencer/allowed.ts new file mode 100644 index 00000000000..164a2a948b7 --- /dev/null +++ b/yarn-project/sequencer-client/src/sequencer/allowed.ts @@ -0,0 +1,36 @@ +import { type AllowedElement } from '@aztec/circuit-types'; +import { getContractClassFromArtifact } from '@aztec/circuits.js'; +import { FPCContract } from '@aztec/noir-contracts.js/FPC'; +import { TokenContractArtifact } from '@aztec/noir-contracts.js/Token'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; + +let defaultAllowedSetupFunctions: AllowedElement[] | undefined = undefined; + +export function getDefaultAllowedSetupFunctions(): AllowedElement[] { + if (defaultAllowedSetupFunctions === undefined) { + defaultAllowedSetupFunctions = [ + // needed for authwit support + { + address: ProtocolContractAddress.AuthRegistry, + }, + // needed for claiming on the same tx as a spend + { + address: ProtocolContractAddress.FeeJuice, + // We can't restrict the selector because public functions get routed via dispatch. + // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'), + }, + // needed for private transfers via FPC + { + classId: getContractClassFromArtifact(TokenContractArtifact).id, + // We can't restrict the selector because public functions get routed via dispatch. + // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'), + }, + { + classId: getContractClassFromArtifact(FPCContract.artifact).id, + // We can't restrict the selector because public functions get routed via dispatch. + // selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'), + }, + ]; + } + return defaultAllowedSetupFunctions; +} diff --git a/yarn-project/sequencer-client/src/sequencer/config.ts b/yarn-project/sequencer-client/src/sequencer/config.ts index 22278911935..5bdc2772a99 100644 --- a/yarn-project/sequencer-client/src/sequencer/config.ts +++ b/yarn-project/sequencer-client/src/sequencer/config.ts @@ -1 +1 @@ -export { SequencerConfig } from '@aztec/circuit-types'; +export { type SequencerConfig } from '@aztec/circuit-types/config'; diff --git a/yarn-project/sequencer-client/src/sequencer/metrics.ts b/yarn-project/sequencer-client/src/sequencer/metrics.ts index ea0d14bb6dd..55cd5b1b145 100644 --- a/yarn-project/sequencer-client/src/sequencer/metrics.ts +++ b/yarn-project/sequencer-client/src/sequencer/metrics.ts @@ -7,7 +7,6 @@ import { type Tracer, type UpDownCounter, ValueType, - millisecondBuckets, } from '@aztec/telemetry-client'; import { type SequencerState, type SequencerStateCallback, sequencerStateToNumber } from './utils.js'; @@ -32,18 +31,12 @@ export class SequencerMetrics { unit: 'ms', description: 'Duration to build a block', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(2), - }, }); this.stateTransitionBufferDuration = meter.createHistogram(Metrics.SEQUENCER_STATE_TRANSITION_BUFFER_DURATION, { unit: 'ms', description: 'The time difference between when the sequencer needed to transition to a new state and when it actually did.', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: millisecondBuckets(2), - }, }); const currentState = meter.createObservableGauge(Metrics.SEQUENCER_CURRENT_STATE, { diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts index aeb73d79725..72498b7e86c 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.test.ts @@ -26,6 +26,7 @@ import { EthAddress, Fr, GasFees, + type GasSettings, GlobalVariables, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, } from '@aztec/circuits.js'; @@ -127,6 +128,10 @@ describe('sequencer', () => { merkleTreeOps = mock(); blockBuilder = mock(); + merkleTreeOps.findLeafIndices.mockImplementation((_treeId: MerkleTreeId, _value: any[]) => { + return Promise.resolve([undefined]); + }); + p2p = mock({ getStatus: mockFn().mockResolvedValue({ state: P2PClientState.IDLE, @@ -217,7 +222,6 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); @@ -290,7 +294,6 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); @@ -315,16 +318,15 @@ describe('sequencer', () => { // We make a nullifier from tx1 a part of the nullifier tree, so it gets rejected as double spend const doubleSpendNullifier = doubleSpendTx.data.forRollup!.end.nullifiers[0].toBuffer(); - merkleTreeOps.findLeafIndex.mockImplementation((treeId: MerkleTreeId, value: any) => { + merkleTreeOps.findLeafIndices.mockImplementation((treeId: MerkleTreeId, value: any[]) => { return Promise.resolve( - treeId === MerkleTreeId.NULLIFIER_TREE && value.equals(doubleSpendNullifier) ? 1n : undefined, + treeId === MerkleTreeId.NULLIFIER_TREE && value[0].equals(doubleSpendNullifier) ? [1n] : [undefined], ); }); await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); @@ -353,7 +355,6 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); @@ -384,13 +385,53 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes, undefined); }); + it('builds a block out of several txs skipping the ones not providing enough fee per gas', async () => { + const gasFees = new GasFees(10, 20); + mockedGlobalVariables.gasFees = gasFees; + + const txs = Array(5) + .fill(0) + .map((_, i) => mockTxForRollup(0x10000 * i)); + + const skippedTxIndexes = [1, 2]; + const validTxHashes: TxHash[] = []; + txs.forEach((tx, i) => { + tx.data.constants.txContext.chainId = chainId; + const maxFeesPerGas: Writeable = gasFees.clone(); + const feeToAdjust = i % 2 ? 'feePerDaGas' : 'feePerL2Gas'; + if (skippedTxIndexes.includes(i)) { + // maxFeesPerGas is less than gasFees. + maxFeesPerGas[feeToAdjust] = maxFeesPerGas[feeToAdjust].sub(new Fr(i + 1)); + } else { + // maxFeesPerGas is greater than or equal to gasFees. + maxFeesPerGas[feeToAdjust] = maxFeesPerGas[feeToAdjust].add(new Fr(i)); + validTxHashes.push(tx.getTxHash()); + } + (tx.data.constants.txContext.gasSettings as Writeable).maxFeesPerGas = maxFeesPerGas; + }); + + p2p.getPendingTxs.mockResolvedValueOnce(txs); + blockBuilder.setBlockCompleted.mockResolvedValue(block); + publisher.proposeL2Block.mockResolvedValueOnce(true); + globalVariableBuilder.buildGlobalVariables.mockResolvedValueOnce(mockedGlobalVariables); + + await sequencer.doRealWork(); + + expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( + mockedGlobalVariables, + Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), + ); + expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), validTxHashes, undefined); + // The txs are not included. But they are not dropped from the pool either. + expect(p2p.deleteTxs).not.toHaveBeenCalled(); + }); + it('builds a block once it reaches the minimum number of transactions', async () => { const txs = times(8, i => { const tx = mockTxForRollup(i * 0x10000); @@ -424,7 +465,6 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 4, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); @@ -465,10 +505,10 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(1); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 2, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); + expect(blockBuilder.addTxs).toHaveBeenCalledWith([]); expect(publisher.proposeL2Block).toHaveBeenCalledTimes(1); expect(publisher.proposeL2Block).toHaveBeenCalledWith(block, getSignatures(), [], undefined); }); @@ -508,7 +548,6 @@ describe('sequencer', () => { await sequencer.doRealWork(); expect(blockBuilder.startNewBlock).toHaveBeenCalledTimes(1); expect(blockBuilder.startNewBlock).toHaveBeenCalledWith( - 3, mockedGlobalVariables, Array(NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP).fill(new Fr(0n)), ); diff --git a/yarn-project/sequencer-client/src/sequencer/sequencer.ts b/yarn-project/sequencer-client/src/sequencer/sequencer.ts index d13515124d3..6116485c849 100644 --- a/yarn-project/sequencer-client/src/sequencer/sequencer.ts +++ b/yarn-project/sequencer-client/src/sequencer/sequencer.ts @@ -38,6 +38,7 @@ import { type GlobalVariableBuilder } from '../global_variable_builder/global_bu import { type L1Publisher } from '../publisher/l1-publisher.js'; import { prettyLogViemErrorMsg } from '../publisher/utils.js'; import { type TxValidatorFactory } from '../tx_validator/tx_validator_factory.js'; +import { getDefaultAllowedSetupFunctions } from './allowed.js'; import { type SequencerConfig } from './config.js'; import { SequencerMetrics } from './metrics.js'; import { SequencerState, getSecondsIntoSlot, orderAttestations } from './utils.js'; @@ -76,13 +77,11 @@ export class Sequencer { private pollingIntervalMs: number = 1000; private maxTxsPerBlock = 32; private minTxsPerBLock = 1; - private minSecondsBetweenBlocks = 0; - private maxSecondsBetweenBlocks = 0; // TODO: zero values should not be allowed for the following 2 values in PROD private _coinbase = EthAddress.ZERO; private _feeRecipient = AztecAddress.ZERO; private state = SequencerState.STOPPED; - private allowedInSetup: AllowedElement[] = []; + private allowedInSetup: AllowedElement[] = getDefaultAllowedSetupFunctions(); private maxBlockSizeInBytes: number = 1024 * 1024; private metrics: SequencerMetrics; private isFlushing: boolean = false; @@ -127,10 +126,7 @@ export class Sequencer { * @param config - New parameters. */ public updateConfig(config: SequencerConfig) { - this.log.info( - `Sequencer config set`, - omit(pickFromSchema(this.config, SequencerConfigSchema), 'allowedInSetup', 'allowedInTeardown'), - ); + this.log.info(`Sequencer config set`, omit(pickFromSchema(config, SequencerConfigSchema), 'allowedInSetup')); if (config.transactionPollingIntervalMS !== undefined) { this.pollingIntervalMs = config.transactionPollingIntervalMS; @@ -141,12 +137,6 @@ export class Sequencer { if (config.minTxsPerBlock !== undefined) { this.minTxsPerBLock = config.minTxsPerBlock; } - if (config.minSecondsBetweenBlocks !== undefined) { - this.minSecondsBetweenBlocks = config.minSecondsBetweenBlocks; - } - if (config.maxSecondsBetweenBlocks !== undefined) { - this.maxSecondsBetweenBlocks = config.maxSecondsBetweenBlocks; - } if (config.coinbase) { this._coinbase = config.coinbase; } @@ -192,7 +182,7 @@ export class Sequencer { * Starts the sequencer and moves to IDLE state. */ public start() { - this.runningPromise = new RunningPromise(this.work.bind(this), this.pollingIntervalMs); + this.runningPromise = new RunningPromise(this.work.bind(this), this.log, this.pollingIntervalMs); this.setState(SequencerState.IDLE, 0n, true /** force */); this.runningPromise.start(); this.log.info(`Sequencer started with address ${this.publisher.getSenderAddress().toString()}`); @@ -339,6 +329,7 @@ export class Sequencer { this.setState(SequencerState.IDLE, 0n); } + @trackSpan('Sequencer.work') protected async work() { try { await this.doRealWork(); @@ -354,15 +345,6 @@ export class Sequencer { } } - /** Whether to skip the check of min txs per block if more than maxSecondsBetweenBlocks has passed since the previous block. */ - private skipMinTxsPerBlockCheck(historicalHeader: BlockHeader | undefined): boolean { - const lastBlockTime = historicalHeader?.globalVariables.timestamp.toNumber() || 0; - const currentTime = Math.floor(Date.now() / 1000); - const elapsed = currentTime - lastBlockTime; - - return this.maxSecondsBetweenBlocks > 0 && elapsed >= this.maxSecondsBetweenBlocks; - } - async mayProposeBlock(tipArchive: Buffer, proposalBlockNumber: bigint): Promise { // This checks that we can propose, and gives us the slot that we are to propose for try { @@ -445,53 +427,29 @@ export class Sequencer { `Last block mined at ${lastBlockTime} current time is ${currentTime} (elapsed ${elapsedSinceLastBlock})`, ); - // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs. - // Do not go forward with new block if not enough time has passed since last block - if (this.minSecondsBetweenBlocks > 0 && elapsedSinceLastBlock < this.minSecondsBetweenBlocks) { + // We need to have at least minTxsPerBLock txs. + if (args.pendingTxsCount != undefined && args.pendingTxsCount < this.minTxsPerBLock) { this.log.verbose( - `Not creating block because not enough time ${this.minSecondsBetweenBlocks} has passed since last block`, + `Not creating block because not enough txs in the pool (got ${args.pendingTxsCount} min ${this.minTxsPerBLock})`, ); return false; } - const skipCheck = this.skipMinTxsPerBlockCheck(historicalHeader); - - // If we haven't hit the maxSecondsBetweenBlocks, we need to have at least minTxsPerBLock txs. - if (args.pendingTxsCount != undefined) { - if (args.pendingTxsCount < this.minTxsPerBLock) { - if (skipCheck) { - this.log.debug( - `Creating block with only ${args.pendingTxsCount} txs as more than ${this.maxSecondsBetweenBlocks}s have passed since last block`, - ); - } else { - this.log.verbose( - `Not creating block because not enough txs in the pool (got ${args.pendingTxsCount} min ${this.minTxsPerBLock})`, - ); - return false; - } - } - } - // Bail if we don't have enough valid txs - if (args.validTxsCount != undefined) { - // Bail if we don't have enough valid txs - if (!skipCheck && args.validTxsCount < this.minTxsPerBLock) { - this.log.verbose( - `Not creating block because not enough valid txs loaded from the pool (got ${args.validTxsCount} min ${this.minTxsPerBLock})`, - ); - return false; - } + if (args.validTxsCount != undefined && args.validTxsCount < this.minTxsPerBLock) { + this.log.verbose( + `Not creating block because not enough valid txs loaded from the pool (got ${args.validTxsCount} min ${this.minTxsPerBLock})`, + ); + return false; } // TODO: This check should be processedTxs.length < this.minTxsPerBLock, so we don't publish a block with // less txs than the minimum. But that'd cause the entire block to be aborted and retried. Instead, we should // go back to the p2p pool and load more txs until we hit our minTxsPerBLock target. Only if there are no txs // we should bail. - if (args.processedTxsCount != undefined) { - if (args.processedTxsCount === 0 && !skipCheck && this.minTxsPerBLock > 0) { - this.log.verbose('No txs processed correctly to build block.'); - return false; - } + if (args.processedTxsCount === 0 && this.minTxsPerBLock > 0) { + this.log.verbose('No txs processed correctly to build block.'); + return false; } return true; @@ -544,21 +502,17 @@ export class Sequencer { const processor = this.publicProcessorFactory.create(publicProcessorFork, historicalHeader, newGlobalVariables); const blockBuildingTimer = new Timer(); const blockBuilder = this.blockBuilderFactory.create(orchestratorFork); - await blockBuilder.startNewBlock(blockSize, newGlobalVariables, l1ToL2Messages); + await blockBuilder.startNewBlock(newGlobalVariables, l1ToL2Messages); const [publicProcessorDuration, [processedTxs, failedTxs]] = await elapsed(() => - processor.process( - validTxs, - blockSize, - blockBuilder, - this.txValidatorFactory.validatorForProcessedTxs(publicProcessorFork), - ), + processor.process(validTxs, blockSize, this.txValidatorFactory.validatorForProcessedTxs(publicProcessorFork)), ); if (failedTxs.length > 0) { const failedTxData = failedTxs.map(fail => fail.tx); this.log.verbose(`Dropping failed txs ${Tx.getHashes(failedTxData).join(', ')}`); await this.p2pClient.deleteTxs(Tx.getHashes(failedTxData)); } + await blockBuilder.addTxs(processedTxs); await interrupt?.(processedTxs); @@ -649,7 +603,6 @@ export class Sequencer { const blockHash = block.hash(); const txHashes = validTxs.map(tx => tx.getTxHash()); this.log.info(`Built block ${block.number} with hash ${blockHash}`, { - txEffectsHash: block.header.contentCommitment.txsEffectsHash.toString('hex'), blockHash, globalVariables: block.header.globalVariables.toInspect(), txHashes, diff --git a/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts b/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts index 95210a1b69a..68a7c4f8427 100644 --- a/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts +++ b/yarn-project/sequencer-client/src/tx_validator/gas_validator.test.ts @@ -1,7 +1,8 @@ import { type Tx, mockTx } from '@aztec/circuit-types'; import { AztecAddress, Fr, FunctionSelector, GasFees, GasSettings, PUBLIC_DISPATCH_SELECTOR } from '@aztec/circuits.js'; import { poseidon2Hash } from '@aztec/foundation/crypto'; -import { FeeJuiceContract } from '@aztec/noir-contracts.js'; +import { type Writeable } from '@aztec/foundation/types'; +import { FeeJuiceContract } from '@aztec/noir-contracts.js/FeeJuice'; import { ProtocolContractAddress } from '@aztec/protocol-contracts'; import { type MockProxy, mock, mockFn } from 'jest-mock-extended'; @@ -10,28 +11,28 @@ import { GasTxValidator, type PublicStateSource } from './gas_validator.js'; import { patchNonRevertibleFn, patchRevertibleFn } from './test_utils.js'; describe('GasTxValidator', () => { - let validator: GasTxValidator; + // Vars for validator. let publicStateSource: MockProxy; let feeJuiceAddress: AztecAddress; - - beforeEach(() => { - feeJuiceAddress = ProtocolContractAddress.FeeJuice; - publicStateSource = mock({ - storageRead: mockFn().mockImplementation((_address: AztecAddress, _slot: Fr) => Fr.ZERO), - }); - - validator = new GasTxValidator(publicStateSource, feeJuiceAddress, false); - }); - + let enforceFees: boolean; + let gasFees: Writeable; + // Vars for tx. let tx: Tx; let payer: AztecAddress; let expectedBalanceSlot: Fr; let feeLimit: bigint; beforeEach(() => { + publicStateSource = mock({ + storageRead: mockFn().mockImplementation((_address: AztecAddress, _slot: Fr) => Fr.ZERO), + }); + feeJuiceAddress = ProtocolContractAddress.FeeJuice; + enforceFees = false; + gasFees = new GasFees(11, 22); + tx = mockTx(1, { numberOfNonRevertiblePublicCallRequests: 2 }); tx.data.feePayer = AztecAddress.random(); - tx.data.constants.txContext.gasSettings = GasSettings.default({ maxFeesPerGas: new GasFees(10, 10) }); + tx.data.constants.txContext.gasSettings = GasSettings.default({ maxFeesPerGas: gasFees.clone() }); payer = tx.data.feePayer; expectedBalanceSlot = poseidon2Hash([FeeJuiceContract.storage.balances.slot, payer]); feeLimit = tx.data.constants.txContext.gasSettings.getFeeLimit().toBigInt(); @@ -43,21 +44,29 @@ describe('GasTxValidator', () => { ); }; - const expectValidateSuccess = async (tx: Tx) => { - const result = await validator.validateTxs([tx]); - expect(result[0].length).toEqual(1); - expect(result).toEqual([[tx], []]); + const validateTx = async (tx: Tx) => { + const validator = new GasTxValidator(publicStateSource, feeJuiceAddress, enforceFees, gasFees); + return await validator.validateTxs([tx]); }; - const expectValidateFail = async (tx: Tx) => { - const result = await validator.validateTxs([tx]); - expect(result[1].length).toEqual(1); - expect(result).toEqual([[], [tx]]); + const expectValid = async (tx: Tx) => { + const result = await validateTx(tx); + expect(result).toEqual([[tx], [], []]); + }; + + const expectInvalid = async (tx: Tx) => { + const result = await validateTx(tx); + expect(result).toEqual([[], [tx], []]); + }; + + const expectSkipped = async (tx: Tx) => { + const result = await validateTx(tx); + expect(result).toEqual([[], [], [tx]]); }; it('allows fee paying txs if fee payer has enough balance', async () => { mockBalance(feeLimit); - await expectValidateSuccess(tx); + await expectValid(tx); }); it('allows fee paying txs if fee payer claims enough balance during setup', async () => { @@ -69,16 +78,16 @@ describe('GasTxValidator', () => { args: [selector.toField(), payer.toField(), new Fr(1n)], msgSender: ProtocolContractAddress.FeeJuice, }); - await expectValidateSuccess(tx); + await expectValid(tx); }); it('rejects txs if fee payer has not enough balance', async () => { mockBalance(feeLimit - 1n); - await expectValidateFail(tx); + await expectInvalid(tx); }); it('rejects txs if fee payer has zero balance', async () => { - await expectValidateFail(tx); + await expectInvalid(tx); }); it('rejects txs if fee payer claims balance outside setup', async () => { @@ -87,17 +96,27 @@ describe('GasTxValidator', () => { selector: FunctionSelector.fromSignature('_increase_public_balance((Field),Field)'), args: [payer.toField(), new Fr(1n)], }); - await expectValidateFail(tx); + await expectInvalid(tx); }); it('allows txs with no fee payer if fees are not enforced', async () => { tx.data.feePayer = AztecAddress.ZERO; - await expectValidateSuccess(tx); + await expectValid(tx); }); it('rejects txs with no fee payer if fees are enforced', async () => { - validator.enforceFees = true; + enforceFees = true; tx.data.feePayer = AztecAddress.ZERO; - await expectValidateFail(tx); + await expectInvalid(tx); + }); + + it('skips txs with not enough fee per da gas', async () => { + gasFees.feePerDaGas = gasFees.feePerDaGas.add(new Fr(1)); + await expectSkipped(tx); + }); + + it('skips txs with not enough fee per l2 gas', async () => { + gasFees.feePerL2Gas = gasFees.feePerL2Gas.add(new Fr(1)); + await expectSkipped(tx); }); }); diff --git a/yarn-project/sequencer-client/src/tx_validator/gas_validator.ts b/yarn-project/sequencer-client/src/tx_validator/gas_validator.ts index 19ba9c2a79e..8b4167543c9 100644 --- a/yarn-project/sequencer-client/src/tx_validator/gas_validator.ts +++ b/yarn-project/sequencer-client/src/tx_validator/gas_validator.ts @@ -1,5 +1,5 @@ import { type Tx, TxExecutionPhase, type TxValidator } from '@aztec/circuit-types'; -import { type AztecAddress, type Fr, FunctionSelector } from '@aztec/circuits.js'; +import { type AztecAddress, type Fr, FunctionSelector, type GasFees } from '@aztec/circuits.js'; import { createLogger } from '@aztec/foundation/log'; import { computeFeePayerBalanceStorageSlot, getExecutionRequestsByPhase } from '@aztec/simulator'; @@ -12,36 +12,62 @@ export class GasTxValidator implements TxValidator { #log = createLogger('sequencer:tx_validator:tx_gas'); #publicDataSource: PublicStateSource; #feeJuiceAddress: AztecAddress; + #enforceFees: boolean; + #gasFees: GasFees; - constructor(publicDataSource: PublicStateSource, feeJuiceAddress: AztecAddress, public enforceFees: boolean) { + constructor( + publicDataSource: PublicStateSource, + feeJuiceAddress: AztecAddress, + enforceFees: boolean, + gasFees: GasFees, + ) { this.#publicDataSource = publicDataSource; this.#feeJuiceAddress = feeJuiceAddress; + this.#enforceFees = enforceFees; + this.#gasFees = gasFees; } - async validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[]]> { + async validateTxs(txs: Tx[]): Promise<[validTxs: Tx[], invalidTxs: Tx[], skippedTxs: Tx[]]> { const validTxs: Tx[] = []; const invalidTxs: Tx[] = []; + const skippedTxs: Tx[] = []; for (const tx of txs) { - if (await this.#validateTxFee(tx)) { + if (this.#shouldSkip(tx)) { + skippedTxs.push(tx); + } else if (await this.#validateTxFee(tx)) { validTxs.push(tx); } else { invalidTxs.push(tx); } } - return [validTxs, invalidTxs]; + return [validTxs, invalidTxs, skippedTxs]; } validateTx(tx: Tx): Promise { return this.#validateTxFee(tx); } + #shouldSkip(tx: Tx): boolean { + const gasSettings = tx.data.constants.txContext.gasSettings; + + // Skip the tx if its max fees are not enough for the current block's gas fees. + const maxFeesPerGas = gasSettings.maxFeesPerGas; + const notEnoughMaxFees = + maxFeesPerGas.feePerDaGas.lt(this.#gasFees.feePerDaGas) || + maxFeesPerGas.feePerL2Gas.lt(this.#gasFees.feePerL2Gas); + if (notEnoughMaxFees) { + this.#log.warn(`Skipping transaction ${tx.getTxHash()} due to insufficient fee per gas`); + } + return notEnoughMaxFees; + } + async #validateTxFee(tx: Tx): Promise { const feePayer = tx.data.feePayer; // TODO(@spalladino) Eventually remove the is_zero condition as we should always charge fees to every tx if (feePayer.isZero()) { - if (this.enforceFees) { + if (this.#enforceFees) { this.#log.warn(`Rejecting transaction ${tx.getTxHash()} due to missing fee payer`); } else { return true; diff --git a/yarn-project/sequencer-client/src/tx_validator/tx_validator_factory.ts b/yarn-project/sequencer-client/src/tx_validator/tx_validator_factory.ts index d0bab6af43e..59b6baab1cf 100644 --- a/yarn-project/sequencer-client/src/tx_validator/tx_validator_factory.ts +++ b/yarn-project/sequencer-client/src/tx_validator/tx_validator_factory.ts @@ -29,7 +29,10 @@ export class TxValidatorFactory { private enforceFees: boolean, ) { this.nullifierSource = { - getNullifierIndex: nullifier => this.committedDb.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()), + getNullifierIndices: nullifiers => + this.committedDb + .findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers) + .then(x => x.filter(index => index !== undefined) as bigint[]), }; this.publicStateSource = { @@ -45,13 +48,18 @@ export class TxValidatorFactory { new MetadataTxValidator(globalVariables.chainId, globalVariables.blockNumber), new DoubleSpendTxValidator(this.nullifierSource), new PhasesTxValidator(this.contractDataSource, setupAllowList), - new GasTxValidator(this.publicStateSource, ProtocolContractAddress.FeeJuice, this.enforceFees), + new GasTxValidator( + this.publicStateSource, + ProtocolContractAddress.FeeJuice, + this.enforceFees, + globalVariables.gasFees, + ), ); } validatorForProcessedTxs(fork: MerkleTreeReadOperations): TxValidator { return new DoubleSpendTxValidator({ - getNullifierIndex: nullifier => fork.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()), + getNullifierIndices: nullifiers => fork.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, nullifiers), }); } } diff --git a/yarn-project/simulator/src/acvm/oracle/oracle.ts b/yarn-project/simulator/src/acvm/oracle/oracle.ts index 99d5d5f29f2..254b91fb3ab 100644 --- a/yarn-project/simulator/src/acvm/oracle/oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/oracle.ts @@ -375,8 +375,8 @@ export class Oracle { this.typedOracle.notifySetMinRevertibleSideEffectCounter(frToNumber(fromACVMField(minRevertibleSideEffectCounter))); } - async getAppTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise { - const taggingSecret = await this.typedOracle.getAppTaggingSecretAsSender( + async getIndexedTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise { + const taggingSecret = await this.typedOracle.getIndexedTaggingSecretAsSender( AztecAddress.fromString(sender), AztecAddress.fromString(recipient), ); diff --git a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts index 2505a0478b0..d5c461bd3c2 100644 --- a/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts +++ b/yarn-project/simulator/src/acvm/oracle/typed_oracle.ts @@ -237,8 +237,8 @@ export abstract class TypedOracle { throw new OracleMethodNotAvailableError('debugLog'); } - getAppTaggingSecretAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise { - throw new OracleMethodNotAvailableError('getAppTaggingSecretAsSender'); + getIndexedTaggingSecretAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise { + throw new OracleMethodNotAvailableError('getIndexedTaggingSecretAsSender'); } incrementAppTaggingSecretIndexAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise { diff --git a/yarn-project/simulator/src/acvm/serialize.ts b/yarn-project/simulator/src/acvm/serialize.ts index 4e84ccac128..0ae28ed6ce5 100644 --- a/yarn-project/simulator/src/acvm/serialize.ts +++ b/yarn-project/simulator/src/acvm/serialize.ts @@ -32,7 +32,7 @@ export function toACVMField( } else if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'bigint') { buffer = new Fr(value).toBuffer(); } else if (typeof value === 'string') { - buffer = Fr.fromString(value).toBuffer(); + buffer = Fr.fromHexString(value).toBuffer(); } else { buffer = value.toBuffer(); } diff --git a/yarn-project/simulator/src/avm/avm_memory_types.test.ts b/yarn-project/simulator/src/avm/avm_memory_types.test.ts index 18c3651a2ed..8d1146d1021 100644 --- a/yarn-project/simulator/src/avm/avm_memory_types.test.ts +++ b/yarn-project/simulator/src/avm/avm_memory_types.test.ts @@ -1,3 +1,5 @@ +import { AssertionError } from 'assert'; + import { Field, MeteredTaggedMemory, @@ -28,13 +30,13 @@ describe('TaggedMemory', () => { expect(mem.get(10)).toStrictEqual(new Field(5)); }); - it(`Should fail getSlice on unset elements`, () => { + it(`Slice should get Field(0) on unset elements`, () => { const mem = new TaggedMemory(); mem.set(10, new Field(10)); mem.set(12, new Field(12)); - expect(() => mem.getSlice(10, /*size=*/ 4)).toThrow(/size/); + expect(mem.getSlice(10, /*size=*/ 4)).toStrictEqual([new Field(10), new Field(0), new Field(12), new Field(0)]); }); it(`Should set and get slices`, () => { @@ -45,6 +47,24 @@ describe('TaggedMemory', () => { expect(mem.getSlice(10, /*size=*/ 2)).toStrictEqual(val); }); + + it(`Should access and write in last index of memory`, () => { + const last = TaggedMemory.MAX_MEMORY_SIZE - 1; + const mem = new TaggedMemory(); + const val = new Uint64(42); + mem.set(last, val); + expect(mem.get(last)).toStrictEqual(val); + }); + + it(`Should not access beyond memory last index`, () => { + const mem = new TaggedMemory(); + + expect(() => mem.set(TaggedMemory.MAX_MEMORY_SIZE, new Field(1))).toThrow(AssertionError); + expect(() => mem.get(TaggedMemory.MAX_MEMORY_SIZE)).toThrow(AssertionError); + + expect(() => mem.set(TaggedMemory.MAX_MEMORY_SIZE + 15, new Field(1))).toThrow(AssertionError); + expect(() => mem.get(TaggedMemory.MAX_MEMORY_SIZE + 7)).toThrow(AssertionError); + }); }); describe('MeteredTaggedMemory', () => { diff --git a/yarn-project/simulator/src/avm/avm_memory_types.ts b/yarn-project/simulator/src/avm/avm_memory_types.ts index bc9aa66e468..444af4376a2 100644 --- a/yarn-project/simulator/src/avm/avm_memory_types.ts +++ b/yarn-project/simulator/src/avm/avm_memory_types.ts @@ -232,13 +232,14 @@ export class TaggedMemory implements TaggedMemoryInterface { // Whether to track and validate memory accesses for each instruction. static readonly TRACK_MEMORY_ACCESSES = process.env.NODE_ENV === 'test'; - // FIXME: memory should be 2^32, but TS max array size is: 2^32 - 1 - static readonly MAX_MEMORY_SIZE = Number((1n << 32n) - 1n); - private _mem: MemoryValue[]; + // Memory is modelled by a map with key type being number. + // We however restrict the keys to be non-negative integers smaller than + // MAX_MEMORY_SIZE. + static readonly MAX_MEMORY_SIZE = Number(1n << 32n); + private _mem: Map; constructor() { - // We do not initialize memory size here because otherwise tests blow up when diffing. - this._mem = []; + this._mem = new Map(); } public getMaxMemorySize(): number { @@ -257,8 +258,9 @@ export class TaggedMemory implements TaggedMemoryInterface { } public getAs(offset: number): T { + assert(Number.isInteger(offset)); assert(offset < TaggedMemory.MAX_MEMORY_SIZE); - const word = this._mem[offset]; + const word = this._mem.get(offset); TaggedMemory.log.trace(`get(${offset}) = ${word}`); if (word === undefined) { TaggedMemory.log.debug(`WARNING: Memory at offset ${offset} is undefined!`); @@ -268,46 +270,46 @@ export class TaggedMemory implements TaggedMemoryInterface { } public getSlice(offset: number, size: number): MemoryValue[] { + assert(Number.isInteger(offset) && Number.isInteger(size)); assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE); - const value = this._mem.slice(offset, offset + size); - TaggedMemory.log.trace(`getSlice(${offset}, ${size}) = ${value}`); - for (let i = 0; i < value.length; i++) { - if (value[i] === undefined) { - value[i] = new Field(0); - } + const slice = new Array(size); + + for (let i = 0; i < size; i++) { + slice[i] = this._mem.get(offset + i) ?? new Field(0); } - assert(value.length === size, `Expected slice of size ${size}, got ${value.length}.`); - return value; + + TaggedMemory.log.trace(`getSlice(${offset}, ${size}) = ${slice}`); + return slice; } public getSliceAs(offset: number, size: number): T[] { - assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE); return this.getSlice(offset, size) as T[]; } public getSliceTags(offset: number, size: number): TypeTag[] { - assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE); - return this._mem.slice(offset, offset + size).map(TaggedMemory.getTag); + return this.getSlice(offset, size).map(TaggedMemory.getTag); } public set(offset: number, v: MemoryValue) { + assert(Number.isInteger(offset)); assert(offset < TaggedMemory.MAX_MEMORY_SIZE); - this._mem[offset] = v; + this._mem.set(offset, v); TaggedMemory.log.trace(`set(${offset}, ${v})`); } - public setSlice(offset: number, vs: MemoryValue[]) { - assert(offset + vs.length <= TaggedMemory.MAX_MEMORY_SIZE); - // We may need to extend the memory size, otherwise splice doesn't insert. - if (offset + vs.length > this._mem.length) { - this._mem.length = offset + vs.length; - } - this._mem.splice(offset, vs.length, ...vs); - TaggedMemory.log.trace(`setSlice(${offset}, ${vs})`); + public setSlice(offset: number, slice: MemoryValue[]) { + assert(Number.isInteger(offset)); + assert(offset + slice.length <= TaggedMemory.MAX_MEMORY_SIZE); + slice.forEach((element, idx) => { + this._mem.set(offset + idx, element); + }); + TaggedMemory.log.trace(`setSlice(${offset}, ${slice})`); } public getTag(offset: number): TypeTag { - return TaggedMemory.getTag(this._mem[offset]); + assert(Number.isInteger(offset)); + assert(offset < TaggedMemory.MAX_MEMORY_SIZE); + return TaggedMemory.getTag(this._mem.get(offset)); } /** diff --git a/yarn-project/simulator/src/avm/avm_simulator.test.ts b/yarn-project/simulator/src/avm/avm_simulator.test.ts index e35b4d2519f..8ce5ae1cffb 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.test.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.test.ts @@ -8,7 +8,14 @@ import { SerializableContractInstance, } from '@aztec/circuits.js'; import { Grumpkin } from '@aztec/circuits.js/barretenberg'; -import { computePublicDataTreeLeafSlot, computeVarArgsHash, siloNullifier } from '@aztec/circuits.js/hash'; +import { + computeNoteHashNonce, + computePublicDataTreeLeafSlot, + computeUniqueNoteHash, + computeVarArgsHash, + siloNoteHash, + siloNullifier, +} from '@aztec/circuits.js/hash'; import { makeContractClassPublic, makeContractInstanceFromClassId } from '@aztec/circuits.js/testing'; import { FunctionSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; @@ -49,6 +56,7 @@ import { type AvmPersistableStateManager } from './journal/journal.js'; import { Add, CalldataCopy, + Div, EmitNoteHash, EmitNullifier, EmitUnencryptedLog, @@ -66,6 +74,7 @@ import { mockGetContractClass, mockGetContractInstance, mockL1ToL2MessageExists, + mockNoteHashCount, mockNoteHashExists, mockNullifierExists, mockStorageRead, @@ -119,8 +128,23 @@ describe('AVM simulator: injected bytecode', () => { expect(results.reverted).toBe(true); expect(results.output).toEqual([]); expect(results.revertReason?.message).toEqual('Not enough L2GAS gas left'); - expect(context.machineState.l2GasLeft).toEqual(0); - expect(context.machineState.daGasLeft).toEqual(0); + expect(results.gasLeft.l2Gas).toEqual(0); + expect(results.gasLeft.daGas).toEqual(0); + }); + + it('An exceptional halt should consume all allocated gas', async () => { + const context = initContext(); + + // should halt with tag mismatch + const badBytecode = encodeToBytecode([ + new Div(/*indirect=*/ 0, /*aOffset=*/ 0, /*bOffset=*/ 0, /*dstOffset=*/ 0).as(Opcode.DIV_8, Div.wireFormat8), + ]); + const results = await new AvmSimulator(context).executeBytecode(markBytecodeAsAvm(badBytecode)); + expect(results.reverted).toBe(true); + expect(results.output).toEqual([]); + expect(results.revertReason?.message).toMatch(/Tag mismatch/); + expect(results.gasLeft.l2Gas).toEqual(0); + expect(results.gasLeft.daGas).toEqual(0); }); }); @@ -155,6 +179,7 @@ describe('AVM simulator: transpiled Noir contracts', () => { const trace = mock(); const nestedTrace = mock(); + mockNoteHashCount(trace, 0); mockTraceFork(trace, nestedTrace); const ephemeralTrees = await AvmEphemeralForest.create(worldStateDB.getMerkleInterface()); const persistableState = initPersistableStateManager({ worldStateDB, trace, merkleTrees: ephemeralTrees }); @@ -621,13 +646,17 @@ describe('AVM simulator: transpiled Noir contracts', () => { const calldata = [value0]; const context = createContext(calldata); const bytecode = getAvmTestContractBytecode('new_note_hash'); + mockNoteHashCount(trace, 0); const results = await new AvmSimulator(context).executeBytecode(bytecode); expect(results.reverted).toBe(false); expect(results.output).toEqual([]); expect(trace.traceNewNoteHash).toHaveBeenCalledTimes(1); - expect(trace.traceNewNoteHash).toHaveBeenCalledWith(expect.objectContaining(address), /*noteHash=*/ value0); + const siloedNotehash = siloNoteHash(address, value0); + const nonce = computeNoteHashNonce(Fr.fromBuffer(context.persistableState.txHash.toBuffer()), 0); + const uniqueNoteHash = computeUniqueNoteHash(nonce, siloedNotehash); + expect(trace.traceNewNoteHash).toHaveBeenCalledWith(uniqueNoteHash); }); it('Should append a new nullifier correctly', async () => { diff --git a/yarn-project/simulator/src/avm/avm_simulator.ts b/yarn-project/simulator/src/avm/avm_simulator.ts index 4e5a963019c..1ff7cf60d61 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.ts @@ -114,7 +114,7 @@ export class AvmSimulator { return new AvmContractCallResult( /*reverted=*/ true, /*output=*/ [], - /*gasLeft=*/ { l2Gas: 0, daGas: 0 }, + /*gasLeft=*/ { l2Gas: 0, daGas: 0 }, // consumes all allocated gas revertReason, ); } @@ -195,8 +195,10 @@ export class AvmSimulator { } const revertReason = await revertReasonFromExceptionalHalt(err, this.context); + // Exceptional halts consume all allocated gas + const noGasLeft = { l2Gas: 0, daGas: 0 }; // Note: "exceptional halts" cannot return data, hence []. - const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], machineState.gasLeft, revertReason); + const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], noGasLeft, revertReason); this.log.debug(`Context execution results: ${results.toString()}`); this.tallyPrintFunction(); diff --git a/yarn-project/simulator/src/avm/avm_tree.ts b/yarn-project/simulator/src/avm/avm_tree.ts index 5ac80dd87fd..6ab21815c44 100644 --- a/yarn-project/simulator/src/avm/avm_tree.ts +++ b/yarn-project/simulator/src/avm/avm_tree.ts @@ -1,5 +1,5 @@ import { type IndexedTreeId, MerkleTreeId, type MerkleTreeReadOperations, getTreeHeight } from '@aztec/circuit-types'; -import { NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/circuits.js'; +import { AppendOnlyTreeSnapshot, NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/circuits.js'; import { poseidon2Hash } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { type IndexedTreeLeafPreimage, type TreeLeafPreimage } from '@aztec/foundation/trees'; @@ -550,6 +550,11 @@ export class AvmEphemeralForest { const input = preimage.toHashInputs().map(x => Fr.fromBuffer(x)); return poseidon2Hash(input); } + + getTreeSnapshot(id: MerkleTreeId): AppendOnlyTreeSnapshot { + const tree = this.treeMap.get(id)!; + return new AppendOnlyTreeSnapshot(tree.getRoot(), Number(tree.leafCount)); + } } /****************************************************/ diff --git a/yarn-project/simulator/src/avm/fixtures/index.ts b/yarn-project/simulator/src/avm/fixtures/index.ts index ac84ef7d702..fce5fb7eff4 100644 --- a/yarn-project/simulator/src/avm/fixtures/index.ts +++ b/yarn-project/simulator/src/avm/fixtures/index.ts @@ -1,10 +1,10 @@ -import { isNoirCallStackUnresolved } from '@aztec/circuit-types'; +import { TxHash, isNoirCallStackUnresolved } from '@aztec/circuit-types'; import { GasFees, GlobalVariables, MAX_L2_GAS_PER_TX_PUBLIC_PORTION } from '@aztec/circuits.js'; import { type FunctionArtifact, FunctionSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; -import { AvmTestContractArtifact } from '@aztec/noir-contracts.js'; +import { AvmTestContractArtifact } from '@aztec/noir-contracts.js/AvmTest'; import { strict as assert } from 'assert'; import { mock } from 'jest-mock-extended'; @@ -45,6 +45,7 @@ export function initPersistableStateManager(overrides?: { nullifiers?: NullifierManager; doMerkleOperations?: boolean; merkleTrees?: AvmEphemeralForest; + txHash?: TxHash; }): AvmPersistableStateManager { const worldStateDB = overrides?.worldStateDB || mock(); return new AvmPersistableStateManager( @@ -54,6 +55,7 @@ export function initPersistableStateManager(overrides?: { overrides?.nullifiers || new NullifierManager(worldStateDB), overrides?.doMerkleOperations || false, overrides?.merkleTrees || mock(), + overrides?.txHash || new TxHash(new Fr(27).toBuffer()), ); } diff --git a/yarn-project/simulator/src/avm/journal/journal.test.ts b/yarn-project/simulator/src/avm/journal/journal.test.ts index dd50228ab55..9aae7f88889 100644 --- a/yarn-project/simulator/src/avm/journal/journal.test.ts +++ b/yarn-project/simulator/src/avm/journal/journal.test.ts @@ -1,5 +1,5 @@ import { AztecAddress, SerializableContractInstance, computePublicBytecodeCommitment } from '@aztec/circuits.js'; -import { siloNullifier } from '@aztec/circuits.js/hash'; +import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash'; import { makeContractClassPublic } from '@aztec/circuits.js/testing'; import { Fr } from '@aztec/foundation/fields'; @@ -13,6 +13,7 @@ import { mockGetContractClass, mockGetContractInstance, mockL1ToL2MessageExists, + mockNoteHashCount, mockNoteHashExists, mockNullifierExists, mockStorageRead, @@ -80,9 +81,13 @@ describe('journal', () => { }); it('writeNoteHash works', () => { + mockNoteHashCount(trace, 1); persistableState.writeNoteHash(address, utxo); expect(trace.traceNewNoteHash).toHaveBeenCalledTimes(1); - expect(trace.traceNewNoteHash).toHaveBeenCalledWith(expect.objectContaining(address), /*noteHash=*/ utxo); + const siloedNotehash = siloNoteHash(address, utxo); + const nonce = computeNoteHashNonce(Fr.fromBuffer(persistableState.txHash.toBuffer()), 1); + const uniqueNoteHash = computeUniqueNoteHash(nonce, siloedNotehash); + expect(trace.traceNewNoteHash).toHaveBeenCalledWith(uniqueNoteHash); }); it('checkNullifierExists works for missing nullifiers', async () => { diff --git a/yarn-project/simulator/src/avm/journal/journal.ts b/yarn-project/simulator/src/avm/journal/journal.ts index 2d0ab2f7a5f..35d349add3b 100644 --- a/yarn-project/simulator/src/avm/journal/journal.ts +++ b/yarn-project/simulator/src/avm/journal/journal.ts @@ -1,4 +1,4 @@ -import { MerkleTreeId } from '@aztec/circuit-types'; +import { MerkleTreeId, type TxHash } from '@aztec/circuit-types'; import { AztecAddress, CANONICAL_AUTH_REGISTRY_ADDRESS, @@ -12,7 +12,13 @@ import { ROUTER_ADDRESS, SerializableContractInstance, } from '@aztec/circuits.js'; -import { computePublicDataTreeLeafSlot, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash'; +import { + computeNoteHashNonce, + computePublicDataTreeLeafSlot, + computeUniqueNoteHash, + siloNoteHash, + siloNullifier, +} from '@aztec/circuits.js/hash'; import { Fr } from '@aztec/foundation/fields'; import { jsonStringify } from '@aztec/foundation/json-rpc'; import { createLogger } from '@aztec/foundation/log'; @@ -55,6 +61,7 @@ export class AvmPersistableStateManager { private readonly doMerkleOperations: boolean = false, /** Ephmeral forest for merkle tree operations */ public merkleTrees: AvmEphemeralForest, + public readonly txHash: TxHash, ) {} /** @@ -65,6 +72,7 @@ export class AvmPersistableStateManager { trace: PublicSideEffectTraceInterface, pendingSiloedNullifiers: Fr[], doMerkleOperations: boolean = false, + txHash: TxHash, ) { const parentNullifiers = NullifierManager.newWithPendingSiloedNullifiers(worldStateDB, pendingSiloedNullifiers); const ephemeralForest = await AvmEphemeralForest.create(worldStateDB.getMerkleInterface()); @@ -75,6 +83,7 @@ export class AvmPersistableStateManager { /*nullifiers=*/ parentNullifiers.fork(), doMerkleOperations, ephemeralForest, + txHash, ); } @@ -85,6 +94,7 @@ export class AvmPersistableStateManager { worldStateDB: WorldStateDB, trace: PublicSideEffectTraceInterface, doMerkleOperations: boolean = false, + txHash: TxHash, ) { const ephemeralForest = await AvmEphemeralForest.create(worldStateDB.getMerkleInterface()); return new AvmPersistableStateManager( @@ -94,6 +104,7 @@ export class AvmPersistableStateManager { /*nullifiers=*/ new NullifierManager(worldStateDB), /*doMerkleOperations=*/ doMerkleOperations, ephemeralForest, + txHash, ); } @@ -108,6 +119,7 @@ export class AvmPersistableStateManager { this.nullifiers.fork(), this.doMerkleOperations, this.merkleTrees.fork(), + this.txHash, ); } @@ -290,20 +302,41 @@ export class AvmPersistableStateManager { } /** - * Write a note hash, trace the write. + * Write a raw note hash, silo it and make it unique, then trace the write. * @param noteHash - the unsiloed note hash to write */ public writeNoteHash(contractAddress: AztecAddress, noteHash: Fr): void { - this.log.debug(`noteHashes(${contractAddress}) += @${noteHash}.`); + const siloedNoteHash = siloNoteHash(contractAddress, noteHash); + + this.writeSiloedNoteHash(siloedNoteHash); + } + + /** + * Write a note hash, make it unique, trace the write. + * @param noteHash - the non unique note hash to write + */ + public writeSiloedNoteHash(noteHash: Fr): void { + const txHash = Fr.fromBuffer(this.txHash.toBuffer()); + const nonce = computeNoteHashNonce(txHash, this.trace.getNoteHashCount()); + const uniqueNoteHash = computeUniqueNoteHash(nonce, noteHash); + + this.writeUniqueNoteHash(uniqueNoteHash); + } + + /** + * Write a note hash, trace the write. + * @param noteHash - the siloed unique hash to write + */ + public writeUniqueNoteHash(noteHash: Fr): void { + this.log.debug(`noteHashes += @${noteHash}.`); if (this.doMerkleOperations) { // Should write a helper for this const leafIndex = new Fr(this.merkleTrees.treeMap.get(MerkleTreeId.NOTE_HASH_TREE)!.leafCount); - const siloedNoteHash = siloNoteHash(contractAddress, noteHash); - const insertionPath = this.merkleTrees.appendNoteHash(siloedNoteHash); - this.trace.traceNewNoteHash(contractAddress, noteHash, leafIndex, insertionPath); + const insertionPath = this.merkleTrees.appendNoteHash(noteHash); + this.trace.traceNewNoteHash(noteHash, leafIndex, insertionPath); } else { - this.trace.traceNewNoteHash(contractAddress, noteHash); + this.trace.traceNewNoteHash(noteHash); } } diff --git a/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts b/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts index f38a335ebd5..af4fd095786 100644 --- a/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts +++ b/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts @@ -1,5 +1,5 @@ import { AztecAddress, Fr } from '@aztec/circuits.js'; -import { siloNullifier } from '@aztec/circuits.js/hash'; +import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash'; import { mock } from 'jest-mock-extended'; @@ -10,7 +10,7 @@ import { Field, Uint8, Uint32 } from '../avm_memory_types.js'; import { InstructionExecutionError, StaticCallAlterationError } from '../errors.js'; import { initContext, initExecutionEnvironment, initPersistableStateManager } from '../fixtures/index.js'; import { type AvmPersistableStateManager } from '../journal/journal.js'; -import { mockL1ToL2MessageExists, mockNoteHashExists, mockNullifierExists } from '../test_utils.js'; +import { mockL1ToL2MessageExists, mockNoteHashCount, mockNoteHashExists, mockNullifierExists } from '../test_utils.js'; import { EmitNoteHash, EmitNullifier, @@ -120,10 +120,14 @@ describe('Accrued Substate', () => { }); it('Should append a new note hash correctly', async () => { + mockNoteHashCount(trace, 0); context.machineState.memory.set(value0Offset, new Field(value0)); await new EmitNoteHash(/*indirect=*/ 0, /*offset=*/ value0Offset).execute(context); expect(trace.traceNewNoteHash).toHaveBeenCalledTimes(1); - expect(trace.traceNewNoteHash).toHaveBeenCalledWith(expect.objectContaining(address), /*noteHash=*/ value0); + const siloedNotehash = siloNoteHash(address, value0); + const nonce = computeNoteHashNonce(Fr.fromBuffer(context.persistableState.txHash.toBuffer()), 0); + const uniqueNoteHash = computeUniqueNoteHash(nonce, siloedNotehash); + expect(trace.traceNewNoteHash).toHaveBeenCalledWith(uniqueNoteHash); }); }); diff --git a/yarn-project/simulator/src/avm/opcodes/conversion.test.ts b/yarn-project/simulator/src/avm/opcodes/conversion.test.ts index 8db134f6d09..873ab29db5b 100644 --- a/yarn-project/simulator/src/avm/opcodes/conversion.test.ts +++ b/yarn-project/simulator/src/avm/opcodes/conversion.test.ts @@ -1,5 +1,5 @@ import { type AvmContext } from '../avm_context.js'; -import { Field, type Uint1, type Uint8, Uint32 } from '../avm_memory_types.js'; +import { Field, Uint1, type Uint8, Uint32 } from '../avm_memory_types.js'; import { initContext } from '../fixtures/index.js'; import { Addressing, AddressingMode } from './addressing_mode.js'; import { ToRadixBE } from './conversion.js'; @@ -15,20 +15,20 @@ describe('Conversion Opcodes', () => { it('Should (de)serialize correctly', () => { const buf = Buffer.from([ ToRadixBE.opcode, // opcode - 1, // indirect + ...Buffer.from('0001', 'hex'), // indirect ...Buffer.from('1234', 'hex'), // inputStateOffset - ...Buffer.from('2345', 'hex'), // outputStateOffset - ...Buffer.from('3456', 'hex'), // radixOffset - ...Buffer.from('0100', 'hex'), // numLimbs - ...Buffer.from('01', 'hex'), // outputBits + ...Buffer.from('2345', 'hex'), // radixOffset + ...Buffer.from('3456', 'hex'), // numLimbsOffset + ...Buffer.from('4567', 'hex'), // outputBitsOffset + ...Buffer.from('5678', 'hex'), // outputStateOffset ]); const inst = new ToRadixBE( - /*indirect=*/ 1, + /*indirect=*/ 0x0001, /*srcOffset=*/ 0x1234, - /*dstOffset=*/ 0x2345, - /*radixOffset=*/ 0x3456, - /*numLimbs=*/ 256, - /*outputBits=*/ 1, + /*radixOffset=*/ 0x2345, + /*numLimbsOffset=*/ 0x3456, + /*outputBitsOffset=*/ 0x4567, + /*dstOffset=*/ 0x5678, ); expect(ToRadixBE.deserialize(buf)).toEqual(inst); @@ -42,21 +42,27 @@ describe('Conversion Opcodes', () => { const srcOffset = 0; const dstOffset = 20; const radixOffset = 1; - const numLimbs = 10; // only the first 10 bits - const outputBits = 0; // false, output as bytes + const numLimbs = new Uint32(10); // only the first 10 bits + const numLimbsOffset = 100; + const outputBits = new Uint1(0); // false, output as bytes + const outputBitsOffset = 200; context.machineState.memory.set(srcOffset, arg); context.machineState.memory.set(radixOffset, radix); + context.machineState.memory.set(numLimbsOffset, numLimbs); + context.machineState.memory.set(outputBitsOffset, outputBits); - await new ToRadixBE(indirect, srcOffset, dstOffset, radixOffset, numLimbs, outputBits).execute(context); + await new ToRadixBE(indirect, srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset).execute( + context, + ); const resultBuffer: Buffer = Buffer.concat( - context.machineState.memory.getSliceAs(dstOffset, numLimbs).map(byte => byte.toBuffer()), + context.machineState.memory.getSliceAs(dstOffset, numLimbs.toNumber()).map(byte => byte.toBuffer()), ); // The expected result is the first 10 bits of the input // Reverse before slice because still only care about the first `numLimb` bytes. // Then reverse back since we want big endian (as the original string is). - const expectedResults = '1011101010100'.split('').reverse().slice(0, numLimbs).reverse().map(Number); - for (let i = 0; i < numLimbs; i++) { + const expectedResults = '1011101010100'.split('').reverse().slice(0, numLimbs.toNumber()).reverse().map(Number); + for (let i = 0; i < numLimbs.toNumber(); i++) { expect(resultBuffer.readUInt8(i)).toEqual(expectedResults[i]); } }); @@ -68,21 +74,27 @@ describe('Conversion Opcodes', () => { const srcOffset = 0; const dstOffset = 20; const radixOffset = 1; - const numLimbs = 10; // only the first 10 bits - const outputBits = 1; // true, output as bits + const numLimbs = new Uint32(10); // only the first 10 bits + const numLimbsOffset = 100; + const outputBits = new Uint1(1); // true, output as bits + const outputBitsOffset = 200; context.machineState.memory.set(srcOffset, arg); context.machineState.memory.set(radixOffset, radix); + context.machineState.memory.set(numLimbsOffset, numLimbs); + context.machineState.memory.set(outputBitsOffset, outputBits); - await new ToRadixBE(indirect, srcOffset, dstOffset, radixOffset, numLimbs, outputBits).execute(context); + await new ToRadixBE(indirect, srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset).execute( + context, + ); const resultBuffer: Buffer = Buffer.concat( - context.machineState.memory.getSliceAs(dstOffset, numLimbs).map(byte => byte.toBuffer()), + context.machineState.memory.getSliceAs(dstOffset, numLimbs.toNumber()).map(byte => byte.toBuffer()), ); // The expected result is the first 10 bits of the input // Reverse before slice because still only care about the first `numLimb` bytes. // Then reverse back since we want big endian (as the original string is). - const expectedResults = '1011101010100'.split('').reverse().slice(0, numLimbs).reverse().map(Number); - for (let i = 0; i < numLimbs; i++) { + const expectedResults = '1011101010100'.split('').reverse().slice(0, numLimbs.toNumber()).reverse().map(Number); + for (let i = 0; i < numLimbs.toNumber(); i++) { expect(resultBuffer.readUInt8(i)).toEqual(expectedResults[i]); } }); @@ -91,29 +103,41 @@ describe('Conversion Opcodes', () => { const arg = new Field(Buffer.from('1234567890abcdef', 'hex')); const indirect = new Addressing([ /*srcOffset=*/ AddressingMode.INDIRECT, - /*dstOffset*/ AddressingMode.INDIRECT, /*radixOffset*/ AddressingMode.INDIRECT, + /*numLimbsOffset*/ AddressingMode.INDIRECT, + /*outputBitsOffset*/ AddressingMode.INDIRECT, + /*dstOffset*/ AddressingMode.INDIRECT, ]).toWire(); const srcOffset = 0; - const srcOffsetReal = 10; + const srcOffsetReal = 1000; const dstOffset = 2; - const dstOffsetReal = 30; + const dstOffsetReal = 2000; const radixOffset = 3; const radix = new Uint32(1 << 8); // Byte decomposition - const radixOffsetReal = 50; + const radixOffsetReal = 3000; + const numLimbsOffset = 4; + const numLimbsOffsetReal = 4000; + const numLimbs = new Uint32(32); // 256-bit decomposition + const outputBitsOffset = 5; + const outputBitsOffsetReal = 5000; + const outputBits = new Uint1(0); // false, output as bytes context.machineState.memory.set(srcOffset, new Uint32(srcOffsetReal)); context.machineState.memory.set(dstOffset, new Uint32(dstOffsetReal)); context.machineState.memory.set(radixOffset, new Uint32(radixOffsetReal)); + context.machineState.memory.set(numLimbsOffset, new Uint32(numLimbsOffsetReal)); + context.machineState.memory.set(outputBitsOffset, new Uint32(outputBitsOffsetReal)); context.machineState.memory.set(srcOffsetReal, arg); context.machineState.memory.set(radixOffsetReal, radix); + context.machineState.memory.set(numLimbsOffsetReal, numLimbs); + context.machineState.memory.set(outputBitsOffsetReal, outputBits); - const numLimbs = 32; // 256-bit decomposition - const outputBits = 0; // false, output as bytes - await new ToRadixBE(indirect, srcOffset, dstOffset, radixOffset, numLimbs, outputBits).execute(context); + await new ToRadixBE(indirect, srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset).execute( + context, + ); const resultBuffer: Buffer = Buffer.concat( - context.machineState.memory.getSliceAs(dstOffsetReal, numLimbs).map(byte => byte.toBuffer()), + context.machineState.memory.getSliceAs(dstOffsetReal, numLimbs.toNumber()).map(byte => byte.toBuffer()), ); // The expected result is the input (padded to 256 bits) const expectedResults = '1234567890abcdef' @@ -121,7 +145,7 @@ describe('Conversion Opcodes', () => { .split('') .map(a => parseInt(a, 16)); // Checking the value in each byte of the buffer is correct - for (let i = 0; i < numLimbs; i++) { + for (let i = 0; i < numLimbs.toNumber(); i++) { // Compute the expected byte's numerical value from its two hex digits expect(resultBuffer.readUInt8(i)).toEqual(expectedResults[2 * i] * 16 + expectedResults[2 * i + 1]); } diff --git a/yarn-project/simulator/src/avm/opcodes/conversion.ts b/yarn-project/simulator/src/avm/opcodes/conversion.ts index f7a954d5e6c..3699c6f75b1 100644 --- a/yarn-project/simulator/src/avm/opcodes/conversion.ts +++ b/yarn-project/simulator/src/avm/opcodes/conversion.ts @@ -12,57 +12,62 @@ export class ToRadixBE extends Instruction { // Informs (de)serialization. See Instruction.deserialize. static readonly wireFormat: OperandType[] = [ OperandType.UINT8, // Opcode - OperandType.UINT8, // Indirect + OperandType.UINT16, // Indirect OperandType.UINT16, // src memory address - OperandType.UINT16, // dst memory address OperandType.UINT16, // radix memory address - OperandType.UINT16, // number of limbs (Immediate) - OperandType.UINT8, // output is in "bits" mode (Immediate - Uint1 still takes up a whole byte) + OperandType.UINT16, // number of limbs address + OperandType.UINT16, // output is in "bits" mode memory address (boolean/Uint1 is stored) + OperandType.UINT16, // dst memory address ]; constructor( private indirect: number, private srcOffset: number, - private dstOffset: number, private radixOffset: number, - private numLimbs: number, - private outputBits: number, // effectively a bool + private numLimbsOffset: number, + private outputBitsOffset: number, + private dstOffset: number, ) { super(); } public async execute(context: AvmContext): Promise { const memory = context.machineState.memory.track(this.type); - const operands = [this.srcOffset, this.dstOffset, this.radixOffset]; + const operands = [this.srcOffset, this.radixOffset, this.numLimbsOffset, this.outputBitsOffset, this.dstOffset]; const addressing = Addressing.fromWire(this.indirect, operands.length); - const [srcOffset, dstOffset, radixOffset] = addressing.resolve(operands, memory); - context.machineState.consumeGas(this.gasCost(this.numLimbs)); + const [srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset] = addressing.resolve(operands, memory); // The radix gadget only takes in a Field memory.checkTag(TypeTag.FIELD, srcOffset); memory.checkTag(TypeTag.UINT32, radixOffset); + memory.checkTag(TypeTag.UINT32, numLimbsOffset); + memory.checkTag(TypeTag.UINT1, outputBitsOffset); + + const numLimbs = memory.get(numLimbsOffset).toNumber(); + context.machineState.consumeGas(this.gasCost(numLimbs)); + const outputBits = memory.get(outputBitsOffset).toNumber(); let value: bigint = memory.get(srcOffset).toBigInt(); const radix: bigint = memory.get(radixOffset).toBigInt(); - if (this.numLimbs < 1) { - throw new InstructionExecutionError(`ToRadixBE instruction's numLimbs should be > 0 (was ${this.numLimbs})`); + if (numLimbs < 1) { + throw new InstructionExecutionError(`ToRadixBE instruction's numLimbs should be > 0 (was ${numLimbs})`); } if (radix > 256) { throw new InstructionExecutionError(`ToRadixBE instruction's radix should be <= 256 (was ${radix})`); } const radixBN: bigint = BigInt(radix); - const limbArray = new Array(this.numLimbs); + const limbArray = new Array(numLimbs); - for (let i = this.numLimbs - 1; i >= 0; i--) { + for (let i = numLimbs - 1; i >= 0; i--) { const limb = value % radixBN; limbArray[i] = limb; value /= radixBN; } - const outputType = this.outputBits != 0 ? Uint1 : Uint8; + const outputType = outputBits != 0 ? Uint1 : Uint8; const res = limbArray.map(byte => new outputType(byte)); memory.setSlice(dstOffset, res); - memory.assert({ reads: 2, writes: this.numLimbs, addressing }); + memory.assert({ reads: 4, writes: numLimbs, addressing }); } } diff --git a/yarn-project/simulator/src/avm/test_utils.ts b/yarn-project/simulator/src/avm/test_utils.ts index 48afe3c9e32..27785930567 100644 --- a/yarn-project/simulator/src/avm/test_utils.ts +++ b/yarn-project/simulator/src/avm/test_utils.ts @@ -28,6 +28,10 @@ export function mockStorageRead(worldStateDB: WorldStateDB, value: Fr) { (worldStateDB as jest.Mocked).storageRead.mockResolvedValue(value); } +export function mockNoteHashCount(mockedTrace: PublicSideEffectTraceInterface, count: number) { + (mockedTrace as jest.Mocked).getNoteHashCount.mockReturnValue(count); +} + export function mockStorageReadWithMap(worldStateDB: WorldStateDB, mockedStorage: Map) { (worldStateDB as jest.Mocked).storageRead.mockImplementation((_address, slot) => Promise.resolve(mockedStorage.get(slot.toBigInt()) ?? Fr.ZERO), diff --git a/yarn-project/simulator/src/client/client_execution_context.ts b/yarn-project/simulator/src/client/client_execution_context.ts index da0eadb0f6a..12e8c814a2a 100644 --- a/yarn-project/simulator/src/client/client_execution_context.ts +++ b/yarn-project/simulator/src/client/client_execution_context.ts @@ -247,9 +247,10 @@ export class ClientExecutionContext extends ViewDataOracle { notes.forEach(n => { if (n.index !== undefined) { - const uniqueNoteHash = computeUniqueNoteHash(n.nonce, n.noteHash); - const siloedNoteHash = siloNoteHash(n.contractAddress, uniqueNoteHash); - this.noteHashLeafIndexMap.set(siloedNoteHash.toBigInt(), n.index); + const siloedNoteHash = siloNoteHash(n.contractAddress, n.noteHash); + const uniqueNoteHash = computeUniqueNoteHash(n.nonce, siloedNoteHash); + + this.noteHashLeafIndexMap.set(uniqueNoteHash.toBigInt(), n.index); } }); @@ -564,5 +565,7 @@ export class ClientExecutionContext extends ViewDataOracle { for (const [recipient, taggedLogs] of taggedLogsByRecipient.entries()) { await this.db.processTaggedLogs(taggedLogs, AztecAddress.fromString(recipient)); } + + await this.db.removeNullifiedNotes(this.contractAddress); } } diff --git a/yarn-project/simulator/src/client/db_oracle.ts b/yarn-project/simulator/src/client/db_oracle.ts index 6702810c86a..d53022e49e2 100644 --- a/yarn-project/simulator/src/client/db_oracle.ts +++ b/yarn-project/simulator/src/client/db_oracle.ts @@ -198,21 +198,21 @@ export interface DBOracle extends CommitmentsDB { getBlockNumber(): Promise; /** - * Returns the tagging secret for a given sender and recipient pair. For this to work, the ivpsk_m of the sender must be known. + * Returns the tagging secret for a given sender and recipient pair. For this to work, the ivsk_m of the sender must be known. * Includes the next index to be used used for tagging with this secret. * @param contractAddress - The contract address to silo the secret for * @param sender - The address sending the note * @param recipient - The address receiving the note * @returns A tagging secret that can be used to tag notes. */ - getAppTaggingSecretAsSender( + getIndexedTaggingSecretAsSender( contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress, ): Promise; /** - * Increments the tagging secret for a given sender and recipient pair. For this to work, the ivpsk_m of the sender must be known. + * Increments the tagging secret for a given sender and recipient pair. For this to work, the ivsk_m of the sender must be known. * @param contractAddress - The contract address to silo the secret for * @param sender - The address sending the note * @param recipient - The address receiving the note @@ -242,4 +242,9 @@ export interface DBOracle extends CommitmentsDB { * @param recipient - The recipient of the logs. */ processTaggedLogs(logs: TxScopedL2Log[], recipient: AztecAddress): Promise; + + /** + * Removes all of a contract's notes that have been nullified from the note database. + */ + removeNullifiedNotes(contractAddress: AztecAddress): Promise; } diff --git a/yarn-project/simulator/src/client/execution_note_cache.ts b/yarn-project/simulator/src/client/execution_note_cache.ts index d48f53672c5..b29c4a6cc58 100644 --- a/yarn-project/simulator/src/client/execution_note_cache.ts +++ b/yarn-project/simulator/src/client/execution_note_cache.ts @@ -51,11 +51,11 @@ export class ExecutionNoteCache { // The nonces will be used to create the "complete" nullifier. const updatedNotes = this.notes.map(({ note, counter }, i) => { const nonce = computeNoteHashNonce(this.txHash, i); - const uniqueNoteHash = computeUniqueNoteHash(nonce, note.noteHash); + const uniqueNoteHash = computeUniqueNoteHash(nonce, siloNoteHash(note.contractAddress, note.noteHash)); return { counter, note: { ...note, nonce }, - noteHashForConsumption: siloNoteHash(note.contractAddress, uniqueNoteHash), + noteHashForConsumption: uniqueNoteHash, }; }); // Rebuild the data. diff --git a/yarn-project/simulator/src/client/index.ts b/yarn-project/simulator/src/client/index.ts index 123138b079f..3bff1cb6ec7 100644 --- a/yarn-project/simulator/src/client/index.ts +++ b/yarn-project/simulator/src/client/index.ts @@ -3,3 +3,4 @@ export * from './db_oracle.js'; export * from './pick_notes.js'; export * from './execution_note_cache.js'; export { extractPrivateCircuitPublicInputs } from './private_execution.js'; +export { WASMSimulator } from '../providers/acvm_wasm.js'; diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index 6fac99ea714..cc38e3ad1fa 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -55,14 +55,12 @@ import { type Logger, createLogger } from '@aztec/foundation/log'; import { type FieldsOf } from '@aztec/foundation/types'; import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type AppendOnlyTree, Poseidon, StandardTree, newTree } from '@aztec/merkle-tree'; -import { - ChildContractArtifact, - ImportTestContractArtifact, - ParentContractArtifact, - PendingNoteHashesContractArtifact, - StatefulTestContractArtifact, - TestContractArtifact, -} from '@aztec/noir-contracts.js'; +import { ChildContractArtifact } from '@aztec/noir-contracts.js/Child'; +import { ImportTestContractArtifact } from '@aztec/noir-contracts.js/ImportTest'; +import { ParentContractArtifact } from '@aztec/noir-contracts.js/Parent'; +import { PendingNoteHashesContractArtifact } from '@aztec/noir-contracts.js/PendingNoteHashes'; +import { StatefulTestContractArtifact } from '@aztec/noir-contracts.js/StatefulTest'; +import { TestContractArtifact } from '@aztec/noir-contracts.js/Test'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -85,8 +83,8 @@ describe('Private Execution test suite', () => { let logger: Logger; const defaultContractAddress = AztecAddress.random(); - const ownerSk = Fr.fromString('2dcc5485a58316776299be08c78fa3788a1a7961ae30dc747fb1be17692a8d32'); - const recipientSk = Fr.fromString('0c9ed344548e8f9ba8aa3c9f8651eaa2853130f6c1e9c050ccf198f7ea18a7ec'); + const ownerSk = Fr.fromHexString('2dcc5485a58316776299be08c78fa3788a1a7961ae30dc747fb1be17692a8d32'); + const recipientSk = Fr.fromHexString('0c9ed344548e8f9ba8aa3c9f8651eaa2853130f6c1e9c050ccf198f7ea18a7ec'); let owner: AztecAddress; let recipient: AztecAddress; let ownerCompleteAddress: CompleteAddress; @@ -233,7 +231,7 @@ describe('Private Execution test suite', () => { throw new Error(`Unknown address: ${address}. Recipient: ${recipient}, Owner: ${owner}`); }); - oracle.getAppTaggingSecretAsSender.mockImplementation( + oracle.getIndexedTaggingSecretAsSender.mockImplementation( (_contractAddress: AztecAddress, _sender: AztecAddress, _recipient: AztecAddress) => { const secret = Fr.random(); return Promise.resolve(new IndexedTaggingSecret(secret, 0)); @@ -378,7 +376,7 @@ describe('Private Execution test suite', () => { note, ), ); - await insertLeaves(consumedNotes.map(n => n.siloedNoteHash)); + await insertLeaves(consumedNotes.map(n => n.uniqueNoteHash)); const args = [recipient, amountToTransfer]; const result = await runSimulator({ args, artifact, msgSender: owner }); @@ -436,7 +434,7 @@ describe('Private Execution test suite', () => { note, ), ); - await insertLeaves(consumedNotes.map(n => n.siloedNoteHash)); + await insertLeaves(consumedNotes.map(n => n.uniqueNoteHash)); const args = [recipient, amountToTransfer]; const result = await runSimulator({ args, artifact, msgSender: owner }); diff --git a/yarn-project/simulator/src/client/simulator.test.ts b/yarn-project/simulator/src/client/simulator.test.ts index 951899e10a3..bf67b300f06 100644 --- a/yarn-project/simulator/src/client/simulator.test.ts +++ b/yarn-project/simulator/src/client/simulator.test.ts @@ -3,7 +3,7 @@ import { KeyValidationRequest, computeAppNullifierSecretKey, deriveKeys } from ' import { type FunctionArtifact, getFunctionArtifact } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, type Point } from '@aztec/foundation/fields'; -import { TokenBlacklistContractArtifact } from '@aztec/noir-contracts.js'; +import { TokenBlacklistContractArtifact } from '@aztec/noir-contracts.js/TokenBlacklist'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -20,7 +20,7 @@ describe('Simulator', () => { let appNullifierSecretKey: Fr; beforeEach(() => { - const ownerSk = Fr.fromString('2dcc5485a58316776299be08c78fa3788a1a7961ae30dc747fb1be17692a8d32'); + const ownerSk = Fr.fromHexString('2dcc5485a58316776299be08c78fa3788a1a7961ae30dc747fb1be17692a8d32'); const allOwnerKeys = deriveKeys(ownerSk); ownerMasterNullifierPublicKey = allOwnerKeys.publicKeys.masterNullifierPublicKey; diff --git a/yarn-project/simulator/src/client/unconstrained_execution.test.ts b/yarn-project/simulator/src/client/unconstrained_execution.test.ts index c285da49d9a..498ac7cd886 100644 --- a/yarn-project/simulator/src/client/unconstrained_execution.test.ts +++ b/yarn-project/simulator/src/client/unconstrained_execution.test.ts @@ -27,7 +27,7 @@ describe('Unconstrained Execution test suite', () => { }); describe('private token contract', () => { - const ownerSecretKey = Fr.fromString('2dcc5485a58316776299be08c78fa3788a1a7961ae30dc747fb1be17692a8d32'); + const ownerSecretKey = Fr.fromHexString('2dcc5485a58316776299be08c78fa3788a1a7961ae30dc747fb1be17692a8d32'); let owner: AztecAddress; diff --git a/yarn-project/simulator/src/client/view_data_oracle.ts b/yarn-project/simulator/src/client/view_data_oracle.ts index 358a3271186..d80b2d91182 100644 --- a/yarn-project/simulator/src/client/view_data_oracle.ts +++ b/yarn-project/simulator/src/client/view_data_oracle.ts @@ -296,16 +296,16 @@ export class ViewDataOracle extends TypedOracle { /** * Returns the tagging secret for a given sender and recipient pair, siloed to the current contract address. * Includes the next index to be used used for tagging with this secret. - * For this to work, the ivpsk_m of the sender must be known. + * For this to work, the ivsk_m of the sender must be known. * @param sender - The address sending the note * @param recipient - The address receiving the note * @returns A tagging secret that can be used to tag notes. */ - public override async getAppTaggingSecretAsSender( + public override async getIndexedTaggingSecretAsSender( sender: AztecAddress, recipient: AztecAddress, ): Promise { - return await this.db.getAppTaggingSecretAsSender(this.contractAddress, sender, recipient); + return await this.db.getIndexedTaggingSecretAsSender(this.contractAddress, sender, recipient); } public override async syncNotes() { @@ -314,8 +314,11 @@ export class ViewDataOracle extends TypedOracle { await this.aztecNode.getBlockNumber(), this.scopes, ); + for (const [recipient, taggedLogs] of taggedLogsByRecipient.entries()) { await this.db.processTaggedLogs(taggedLogs, AztecAddress.fromString(recipient)); } + + await this.db.removeNullifiedNotes(this.contractAddress); } } diff --git a/yarn-project/simulator/src/providers/acvm_wasm.ts b/yarn-project/simulator/src/providers/acvm_wasm.ts index 102da71a40a..bed021be5be 100644 --- a/yarn-project/simulator/src/providers/acvm_wasm.ts +++ b/yarn-project/simulator/src/providers/acvm_wasm.ts @@ -1,4 +1,4 @@ -import { foreignCallHandler } from '@aztec/noir-protocol-circuits-types'; +import { foreignCallHandler } from '@aztec/noir-protocol-circuits-types/client'; import { type NoirCompiledCircuit } from '@aztec/types/noir'; import { executeCircuit } from '@noir-lang/acvm_js'; @@ -17,7 +17,7 @@ export class WASMSimulator implements SimulationProvider { const _witnessMap = await executeCircuit( decodedBytecode, input, - foreignCallHandler, // handle calls to debug_log + foreignCallHandler, // handle calls to debug_log and evaluate_blobs mock ); return _witnessMap; diff --git a/yarn-project/simulator/src/providers/index.ts b/yarn-project/simulator/src/providers/index.ts index 15902dc2b65..634f163865d 100644 --- a/yarn-project/simulator/src/providers/index.ts +++ b/yarn-project/simulator/src/providers/index.ts @@ -1,4 +1,3 @@ export * from './acvm_native.js'; -export * from './acvm_wasm.js'; export * from './simulation_provider.js'; export * from './factory.js'; diff --git a/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.test.ts b/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.test.ts index 7ede684befe..a6b34e58e13 100644 --- a/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.test.ts +++ b/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.test.ts @@ -99,10 +99,10 @@ describe('Enqueued-call Side Effect Trace', () => { }); it('Should trace note hashes', () => { - trace.traceNewNoteHash(address, utxo, leafIndex, siblingPath); + trace.traceNewNoteHash(utxo, leafIndex, siblingPath); expect(trace.getCounter()).toBe(startCounterPlus1); - const expected = [new NoteHash(utxo, startCounter).scope(address)]; + const expected = [new NoteHash(utxo, startCounter)]; expect(trace.getSideEffects().noteHashes).toEqual(expected); const expectedHint = new AvmAppendTreeHint(leafIndex, utxo, siblingPath); @@ -285,11 +285,9 @@ describe('Enqueued-call Side Effect Trace', () => { it('Should enforce maximum number of new note hashes', () => { for (let i = 0; i < MAX_NOTE_HASHES_PER_TX; i++) { - trace.traceNewNoteHash(AztecAddress.fromNumber(i), new Fr(i), Fr.ZERO, []); + trace.traceNewNoteHash(new Fr(i), Fr.ZERO, []); } - expect(() => trace.traceNewNoteHash(AztecAddress.fromNumber(42), new Fr(42), Fr.ZERO, [])).toThrow( - SideEffectLimitReachedError, - ); + expect(() => trace.traceNewNoteHash(new Fr(42), Fr.ZERO, [])).toThrow(SideEffectLimitReachedError); }); it('Should enforce maximum number of new nullifiers', () => { @@ -339,9 +337,7 @@ describe('Enqueued-call Side Effect Trace', () => { expect(() => trace.tracePublicStorageWrite(AztecAddress.fromNumber(42), new Fr(42), new Fr(42), true)).toThrow( SideEffectLimitReachedError, ); - expect(() => trace.traceNewNoteHash(AztecAddress.fromNumber(42), new Fr(42), new Fr(42))).toThrow( - SideEffectLimitReachedError, - ); + expect(() => trace.traceNewNoteHash(new Fr(42), new Fr(42))).toThrow(SideEffectLimitReachedError); expect(() => trace.traceNewNullifier(new Fr(42))).toThrow(SideEffectLimitReachedError); expect(() => trace.traceNewL2ToL1Message(AztecAddress.fromNumber(42), new Fr(42), new Fr(42))).toThrow( SideEffectLimitReachedError, @@ -366,7 +362,7 @@ describe('Enqueued-call Side Effect Trace', () => { testCounter++; nestedTrace.traceNoteHashCheck(address, utxo, leafIndex, existsDefault, []); // counter does not increment for note hash checks - nestedTrace.traceNewNoteHash(address, utxo, Fr.ZERO, []); + nestedTrace.traceNewNoteHash(utxo, Fr.ZERO, []); testCounter++; nestedTrace.traceNullifierCheck(utxo, true, lowLeafPreimage, Fr.ZERO, []); testCounter++; diff --git a/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.ts b/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.ts index 5ff5e7427c1..040ebbaaa66 100644 --- a/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.ts +++ b/yarn-project/simulator/src/public/enqueued_call_side_effect_trace.ts @@ -42,7 +42,6 @@ import { PublicDataWrite, ScopedL2ToL1Message, ScopedLogHash, - type ScopedNoteHash, SerializableContractInstance, type TreeSnapshots, } from '@aztec/circuits.js'; @@ -74,7 +73,7 @@ export type SideEffects = { enqueuedCalls: PublicCallRequest[]; publicDataWrites: PublicDataUpdateRequest[]; - noteHashes: ScopedNoteHash[]; + noteHashes: NoteHash[]; nullifiers: Nullifier[]; l2ToL1Msgs: ScopedL2ToL1Message[]; @@ -111,7 +110,7 @@ export class PublicEnqueuedCallSideEffectTrace implements PublicSideEffectTraceI private publicDataWrites: PublicDataUpdateRequest[] = []; private protocolPublicDataWritesLength: number = 0; private userPublicDataWritesLength: number = 0; - private noteHashes: ScopedNoteHash[] = []; + private noteHashes: NoteHash[] = []; private nullifiers: Nullifier[] = []; private l2ToL1Messages: ScopedL2ToL1Message[] = []; private unencryptedLogs: UnencryptedL2Log[] = []; @@ -194,6 +193,10 @@ export class PublicEnqueuedCallSideEffectTrace implements PublicSideEffectTraceI this.sideEffectCounter++; } + public getNoteHashCount() { + return this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length; + } + public tracePublicStorageRead( contractAddress: AztecAddress, slot: Fr, @@ -272,19 +275,12 @@ export class PublicEnqueuedCallSideEffectTrace implements PublicSideEffectTraceI // NOTE: counter does not increment for note hash checks (because it doesn't rely on pending note hashes) } - public traceNewNoteHash( - contractAddress: AztecAddress, - noteHash: Fr, - leafIndex: Fr = Fr.zero(), - path: Fr[] = emptyNoteHashPath(), - ) { + public traceNewNoteHash(noteHash: Fr, leafIndex: Fr = Fr.zero(), path: Fr[] = emptyNoteHashPath()) { if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) { throw new SideEffectLimitReachedError('note hash', MAX_NOTE_HASHES_PER_TX); } - // TODO(dbanks12): make unique and silo instead of scoping - //const siloedNoteHash = siloNoteHash(contractAddress, noteHash); - this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter).scope(contractAddress)); + this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter)); this.log.debug(`NEW_NOTE_HASH cnt: ${this.sideEffectCounter}`); this.avmCircuitHints.noteHashWrites.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path)); this.incrementSideEffectCounter(); diff --git a/yarn-project/simulator/src/public/execution.ts b/yarn-project/simulator/src/public/execution.ts index e6fe8c17457..cf9832201a2 100644 --- a/yarn-project/simulator/src/public/execution.ts +++ b/yarn-project/simulator/src/public/execution.ts @@ -20,7 +20,6 @@ import { RevertCode, type ScopedL2ToL1Message, type ScopedLogHash, - type ScopedNoteHash, type TreeLeafReadRequest, } from '@aztec/circuits.js'; import { computeVarArgsHash } from '@aztec/circuits.js/hash'; @@ -29,7 +28,7 @@ export interface PublicSideEffects { /** The contract storage update requests performed. */ publicDataWrites: PublicDataUpdateRequest[]; /** The new note hashes to be inserted into the note hashes tree. */ - noteHashes: ScopedNoteHash[]; + noteHashes: NoteHash[]; /** The new nullifiers to be inserted into the nullifier tree. */ nullifiers: Nullifier[]; /** The new l2 to l1 messages generated to be inserted into the messages tree. */ diff --git a/yarn-project/simulator/src/public/executor_metrics.ts b/yarn-project/simulator/src/public/executor_metrics.ts index 17267f58b90..621a3c09498 100644 --- a/yarn-project/simulator/src/public/executor_metrics.ts +++ b/yarn-project/simulator/src/public/executor_metrics.ts @@ -6,7 +6,6 @@ import { type Tracer, type UpDownCounter, ValueType, - linearBuckets, } from '@aztec/telemetry-client'; export class ExecutorMetrics { @@ -33,9 +32,6 @@ export class ExecutorMetrics { description: 'Mana used per second', unit: 'mana/s', valueType: ValueType.INT, - advice: { - explicitBucketBoundaries: linearBuckets(0, 10_000_000, 10), - }, }); } diff --git a/yarn-project/simulator/src/public/fee_payment.ts b/yarn-project/simulator/src/public/fee_payment.ts index 43cf1836afd..e8879ffae47 100644 --- a/yarn-project/simulator/src/public/fee_payment.ts +++ b/yarn-project/simulator/src/public/fee_payment.ts @@ -1,13 +1,14 @@ import { computePublicDataTreeLeafSlot, deriveStorageSlotInMap } from '@aztec/circuits.js/hash'; import { type AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr } from '@aztec/foundation/fields'; -import { ProtocolContractAddress, ProtocolContractArtifact } from '@aztec/protocol-contracts'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; +import { FeeJuiceArtifact } from '@aztec/protocol-contracts/fee-juice'; /** * Computes the storage slot within the Fee Juice contract for the balance of the fee payer. */ export function computeFeePayerBalanceStorageSlot(feePayer: AztecAddress) { - return deriveStorageSlotInMap(ProtocolContractArtifact.FeeJuice.storageLayout.balances.slot, feePayer); + return deriveStorageSlotInMap(FeeJuiceArtifact.storageLayout.balances.slot, feePayer); } /** diff --git a/yarn-project/simulator/src/public/fixtures/index.ts b/yarn-project/simulator/src/public/fixtures/index.ts index bf4940feb8e..36c126c0ef3 100644 --- a/yarn-project/simulator/src/public/fixtures/index.ts +++ b/yarn-project/simulator/src/public/fixtures/index.ts @@ -4,6 +4,7 @@ import { BlockHeader, CallContext, type ContractClassPublic, + type ContractDataSource, type ContractInstanceWithAddress, DEFAULT_GAS_LIMIT, DEPLOYER_CONTRACT_ADDRESS, @@ -29,7 +30,7 @@ import { type ContractArtifact, type FunctionArtifact } from '@aztec/foundation/ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, Point } from '@aztec/foundation/fields'; import { openTmpStore } from '@aztec/kv-store/lmdb'; -import { AvmTestContractArtifact } from '@aztec/noir-contracts.js'; +import { AvmTestContractArtifact } from '@aztec/noir-contracts.js/AvmTest'; import { PublicTxSimulator, WorldStateDB } from '@aztec/simulator'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { MerkleTrees } from '@aztec/world-state'; @@ -125,7 +126,7 @@ export function createTxForPublicCall( } const teardownGasLimits = isTeardown ? gasLimits : Gas.empty(); - const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty()); + const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty()); const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings); const constantData = new TxConstantData(BlockHeader.empty(), txContext, Fr.zero(), Fr.zero()); @@ -144,7 +145,7 @@ export function createTxForPublicCall( return tx; } -export class MockedAvmTestContractDataSource { +export class MockedAvmTestContractDataSource implements ContractDataSource { private fnName = 'public_dispatch'; private bytecode: Buffer; public fnSelector: FunctionSelector; @@ -218,7 +219,7 @@ export class MockedAvmTestContractDataSource { return Promise.resolve(this.fnName); } - addContractArtifact(_address: AztecAddress, _contract: ContractArtifact): Promise { + registerContractFunctionNames(_address: AztecAddress, _names: Record): Promise { return Promise.resolve(); } } diff --git a/yarn-project/simulator/src/public/public_db_sources.ts b/yarn-project/simulator/src/public/public_db_sources.ts index ab9add3a40b..f9c64fe38f7 100644 --- a/yarn-project/simulator/src/public/public_db_sources.ts +++ b/yarn-project/simulator/src/public/public_db_sources.ts @@ -22,7 +22,8 @@ import { import { computeL1ToL2MessageNullifier, computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; import { createLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; -import { ContractClassRegisteredEvent, ContractInstanceDeployedEvent } from '@aztec/protocol-contracts'; +import { ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer'; +import { ContractInstanceDeployedEvent } from '@aztec/protocol-contracts/instance-deployer'; import { type CommitmentsDB, MessageLoadOracleInputs, @@ -207,7 +208,7 @@ export class WorldStateDB extends ContractsDataSourcePublicDB implements PublicS nullifier: Fr, ): Promise { const timer = new Timer(); - const index = await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); + const index = (await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0]; if (!index) { return undefined; } @@ -240,7 +241,7 @@ export class WorldStateDB extends ContractsDataSourcePublicDB implements PublicS ): Promise> { const timer = new Timer(); - const messageIndex = await this.db.findLeafIndex(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, messageHash); + const messageIndex = (await this.db.findLeafIndices(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [messageHash]))[0]; if (messageIndex === undefined) { throw new Error(`No L1 to L2 message found for message hash ${messageHash.toString()}`); } @@ -279,7 +280,7 @@ export class WorldStateDB extends ContractsDataSourcePublicDB implements PublicS public async getCommitmentIndex(commitment: Fr): Promise { const timer = new Timer(); - const index = await this.db.findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, commitment); + const index = (await this.db.findLeafIndices(MerkleTreeId.NOTE_HASH_TREE, [commitment]))[0]; this.logger.debug(`[DB] Fetched commitment index`, { eventName: 'public-db-access', duration: timer.ms(), @@ -301,7 +302,7 @@ export class WorldStateDB extends ContractsDataSourcePublicDB implements PublicS public async getNullifierIndex(nullifier: Fr): Promise { const timer = new Timer(); - const index = await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); + const index = (await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0]; this.logger.debug(`[DB] Fetched nullifier index`, { eventName: 'public-db-access', duration: timer.ms(), diff --git a/yarn-project/simulator/src/public/public_processor.test.ts b/yarn-project/simulator/src/public/public_processor.test.ts index 7fbbfe59928..51a816e46cf 100644 --- a/yarn-project/simulator/src/public/public_processor.test.ts +++ b/yarn-project/simulator/src/public/public_processor.test.ts @@ -1,7 +1,6 @@ import { type MerkleTreeWriteOperations, type ProcessedTx, - type ProcessedTxHandler, ProvingRequestType, SimulationError, type TreeInfo, @@ -33,7 +32,6 @@ describe('public_processor', () => { let db: MockProxy; let worldStateDB: MockProxy; let publicTxProcessor: MockProxy; - let handler: MockProxy; let root: Buffer; let mockedEnqueuedCallsResult: PublicTxResult; @@ -53,7 +51,6 @@ describe('public_processor', () => { db = mock(); worldStateDB = mock(); publicTxProcessor = mock(); - handler = mock(); root = Buffer.alloc(32, 5); @@ -93,20 +90,18 @@ describe('public_processor', () => { it('process private-only txs', async function () { const tx = mockPrivateOnlyTx(); - const [processed, failed] = await processor.process([tx], 1, handler); + const [processed, failed] = await processor.process([tx], 1); expect(processed.length).toBe(1); expect(processed[0].hash).toEqual(tx.getTxHash()); expect(processed[0].data).toEqual(tx.data); expect(failed).toEqual([]); - - expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('runs a tx with enqueued public calls', async function () { const tx = mockTxWithPublicCalls(); - const [processed, failed] = await processor.process([tx], 1, handler); + const [processed, failed] = await processor.process([tx], 1); expect(processed.length).toBe(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -122,7 +117,7 @@ describe('public_processor', () => { mockedEnqueuedCallsResult.revertCode = RevertCode.APP_LOGIC_REVERTED; mockedEnqueuedCallsResult.revertReason = new SimulationError(`Failed`, []); - const [processed, failed] = await processor.process([tx], 1, handler); + const [processed, failed] = await processor.process([tx], 1); expect(processed.length).toBe(1); expect(processed[0].hash).toEqual(tx.getTxHash()); @@ -135,7 +130,7 @@ describe('public_processor', () => { publicTxProcessor.simulate.mockRejectedValue(new SimulationError(`Failed`, [])); const tx = mockTxWithPublicCalls(); - const [processed, failed] = await processor.process([tx], 1, handler); + const [processed, failed] = await processor.process([tx], 1); expect(processed).toEqual([]); expect(failed.length).toBe(1); @@ -143,14 +138,13 @@ describe('public_processor', () => { expect(failed[0].error).toEqual(new SimulationError(`Failed`, [])); expect(worldStateDB.commit).toHaveBeenCalledTimes(0); - expect(handler.addNewTx).toHaveBeenCalledTimes(0); }); it('does not attempt to overfill a block', async function () { const txs = Array.from([1, 2, 3], seed => mockPrivateOnlyTx({ seed })); // We are passing 3 txs but only 2 can fit in the block - const [processed, failed] = await processor.process(txs, 2, handler); + const [processed, failed] = await processor.process(txs, 2); expect(processed.length).toBe(2); expect(processed[0].hash).toEqual(txs[0].getTxHash()); @@ -158,9 +152,6 @@ describe('public_processor', () => { expect(failed).toEqual([]); expect(worldStateDB.commit).toHaveBeenCalledTimes(2); - - expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); - expect(handler.addNewTx).toHaveBeenCalledWith(processed[1]); }); it('does not send a transaction to the prover if validation fails', async function () { @@ -169,13 +160,11 @@ describe('public_processor', () => { const txValidator: MockProxy> = mock(); txValidator.validateTxs.mockRejectedValue([[], [tx]]); - const [processed, failed] = await processor.process([tx], 1, handler, txValidator); + const [processed, failed] = await processor.process([tx], 1, txValidator); expect(processed).toEqual([]); expect(failed.length).toBe(1); expect(failed[0].tx).toEqual(tx); - - expect(handler.addNewTx).toHaveBeenCalledTimes(0); }); }); @@ -201,7 +190,7 @@ describe('public_processor', () => { const txFee = privateGasUsed.computeFee(globalVariables.gasFees); - const [processed, failed] = await processor.process([tx], 1, handler); + const [processed, failed] = await processor.process([tx], 1); expect(processed).toHaveLength(1); expect(processed[0].data.feePayer).toEqual(feePayer); @@ -212,8 +201,6 @@ describe('public_processor', () => { expect(worldStateDB.commit).toHaveBeenCalledTimes(1); expect(worldStateDB.storageWrite).toHaveBeenCalledTimes(1); - - expect(handler.addNewTx).toHaveBeenCalledWith(processed[0]); }); it('rejects tx if fee payer has not enough balance', async function () { @@ -227,7 +214,7 @@ describe('public_processor', () => { } tx.data.gasUsed = privateGasUsed; - const [processed, failed] = await processor.process([tx], 1, handler); + const [processed, failed] = await processor.process([tx], 1); expect(processed).toEqual([]); expect(failed).toHaveLength(1); diff --git a/yarn-project/simulator/src/public/public_processor.ts b/yarn-project/simulator/src/public/public_processor.ts index eb817b121fc..bfc52e17219 100644 --- a/yarn-project/simulator/src/public/public_processor.ts +++ b/yarn-project/simulator/src/public/public_processor.ts @@ -4,7 +4,6 @@ import { type MerkleTreeWriteOperations, NestedProcessReturnValues, type ProcessedTx, - type ProcessedTxHandler, Tx, TxExecutionPhase, type TxValidator, @@ -25,8 +24,9 @@ import { import { padArrayEnd } from '@aztec/foundation/collection'; import { createLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; -import { ContractClassRegisteredEvent, ProtocolContractAddress } from '@aztec/protocol-contracts'; -import { Attributes, type TelemetryClient, type Tracer, trackSpan } from '@aztec/telemetry-client'; +import { ProtocolContractAddress } from '@aztec/protocol-contracts'; +import { ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer'; +import { Attributes, type TelemetryClient, type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from './fee_payment.js'; import { WorldStateDB } from './public_db_sources.js'; @@ -76,7 +76,7 @@ export class PublicProcessorFactory { * Converts Txs lifted from the P2P module into ProcessedTx objects by executing * any public function calls in them. Txs with private calls only are unaffected. */ -export class PublicProcessor { +export class PublicProcessor implements Traceable { private metrics: PublicProcessorMetrics; constructor( protected db: MerkleTreeWriteOperations, @@ -103,7 +103,6 @@ export class PublicProcessor { public async process( txs: Tx[], maxTransactions = txs.length, - processedTxHandler?: ProcessedTxHandler, txValidator?: TxValidator, ): Promise<[ProcessedTx[], FailedTx[], NestedProcessReturnValues[]]> { // The processor modifies the tx objects in place, so we need to clone them. @@ -118,80 +117,9 @@ export class PublicProcessor { break; } try { - const [processedTx, returnValues] = !tx.hasPublicCalls() - ? await this.processPrivateOnlyTx(tx) - : await this.processTxWithPublicCalls(tx); - - this.log.verbose( - !tx.hasPublicCalls() - ? `Processed tx ${processedTx.hash} with no public calls` - : `Processed tx ${processedTx.hash} with ${tx.enqueuedPublicFunctionCalls.length} public calls`, - { - txHash: processedTx.hash, - txFee: processedTx.txEffect.transactionFee.toBigInt(), - revertCode: processedTx.txEffect.revertCode.getCode(), - revertReason: processedTx.revertReason, - gasUsed: processedTx.gasUsed, - publicDataWriteCount: processedTx.txEffect.publicDataWrites.length, - nullifierCount: processedTx.txEffect.nullifiers.length, - noteHashCount: processedTx.txEffect.noteHashes.length, - contractClassLogCount: processedTx.txEffect.contractClassLogs.getTotalLogCount(), - unencryptedLogCount: processedTx.txEffect.unencryptedLogs.getTotalLogCount(), - privateLogCount: processedTx.txEffect.privateLogs.length, - l2ToL1MessageCount: processedTx.txEffect.l2ToL1Msgs.length, - }, - ); - - // Commit the state updates from this transaction - await this.worldStateDB.commit(); - - // Re-validate the transaction - if (txValidator) { - // Only accept processed transactions that are not double-spends, - // public functions emitting nullifiers would pass earlier check but fail here. - // Note that we're checking all nullifiers generated in the private execution twice, - // we could store the ones already checked and skip them here as an optimization. - const [_, invalid] = await txValidator.validateTxs([processedTx]); - if (invalid.length) { - throw new Error(`Transaction ${invalid[0].hash} invalid after processing public functions`); - } - } - // if we were given a handler then send the transaction to it for block building or proving - if (processedTxHandler) { - await processedTxHandler.addNewTx(processedTx); - } - // Update the state so that the next tx in the loop has the correct .startState - // NB: before this change, all .startStates were actually incorrect, but the issue was never caught because we either: - // a) had only 1 tx with public calls per block, so this loop had len 1 - // b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop - // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts - // The below is taken from buildBaseRollupHints: - await this.db.appendLeaves( - MerkleTreeId.NOTE_HASH_TREE, - padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX), - ); - try { - await this.db.batchInsert( - MerkleTreeId.NULLIFIER_TREE, - padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map(n => n.toBuffer()), - NULLIFIER_SUBTREE_HEIGHT, - ); - } catch (error) { - if (txValidator) { - // Ideally the validator has already caught this above, but just in case: - throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`); - } else { - // We have no validator and assume this call should blindly process txs with duplicates being caught later - this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`); - } - } - - await this.db.sequentialInsert( - MerkleTreeId.PUBLIC_DATA_TREE, - processedTx.txEffect.publicDataWrites.map(x => x.toBuffer()), - ); + const [processedTx, returnValues] = await this.processTx(tx, txValidator); result.push(processedTx); - returns = returns.concat(returnValues ?? []); + returns = returns.concat(returnValues); } catch (err: any) { const errorMessage = err instanceof Error ? err.message : 'Unknown error'; this.log.warn(`Failed to process tx ${tx.getTxHash()}: ${errorMessage} ${err?.stack}`); @@ -207,6 +135,83 @@ export class PublicProcessor { return [result, failed, returns]; } + @trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.tryGetTxHash()?.toString() })) + private async processTx( + tx: Tx, + txValidator?: TxValidator, + ): Promise<[ProcessedTx, NestedProcessReturnValues[]]> { + const [processedTx, returnValues] = !tx.hasPublicCalls() + ? await this.processPrivateOnlyTx(tx) + : await this.processTxWithPublicCalls(tx); + + this.log.verbose( + !tx.hasPublicCalls() + ? `Processed tx ${processedTx.hash} with no public calls` + : `Processed tx ${processedTx.hash} with ${tx.enqueuedPublicFunctionCalls.length} public calls`, + { + txHash: processedTx.hash, + txFee: processedTx.txEffect.transactionFee.toBigInt(), + revertCode: processedTx.txEffect.revertCode.getCode(), + revertReason: processedTx.revertReason, + gasUsed: processedTx.gasUsed, + publicDataWriteCount: processedTx.txEffect.publicDataWrites.length, + nullifierCount: processedTx.txEffect.nullifiers.length, + noteHashCount: processedTx.txEffect.noteHashes.length, + contractClassLogCount: processedTx.txEffect.contractClassLogs.getTotalLogCount(), + unencryptedLogCount: processedTx.txEffect.unencryptedLogs.getTotalLogCount(), + privateLogCount: processedTx.txEffect.privateLogs.length, + l2ToL1MessageCount: processedTx.txEffect.l2ToL1Msgs.length, + }, + ); + + // Commit the state updates from this transaction + await this.worldStateDB.commit(); + + // Re-validate the transaction + if (txValidator) { + // Only accept processed transactions that are not double-spends, + // public functions emitting nullifiers would pass earlier check but fail here. + // Note that we're checking all nullifiers generated in the private execution twice, + // we could store the ones already checked and skip them here as an optimization. + const [_, invalid] = await txValidator.validateTxs([processedTx]); + if (invalid.length) { + throw new Error(`Transaction ${invalid[0].hash} invalid after processing public functions`); + } + } + // Update the state so that the next tx in the loop has the correct .startState + // NB: before this change, all .startStates were actually incorrect, but the issue was never caught because we either: + // a) had only 1 tx with public calls per block, so this loop had len 1 + // b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop + // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts + // The below is taken from buildBaseRollupHints: + await this.db.appendLeaves( + MerkleTreeId.NOTE_HASH_TREE, + padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX), + ); + try { + await this.db.batchInsert( + MerkleTreeId.NULLIFIER_TREE, + padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map(n => n.toBuffer()), + NULLIFIER_SUBTREE_HEIGHT, + ); + } catch (error) { + if (txValidator) { + // Ideally the validator has already caught this above, but just in case: + throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`); + } else { + // We have no validator and assume this call should blindly process txs with duplicates being caught later + this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`); + } + } + + await this.db.sequentialInsert( + MerkleTreeId.PUBLIC_DATA_TREE, + processedTx.txEffect.publicDataWrites.map(x => x.toBuffer()), + ); + + return [processedTx, returnValues ?? []]; + } + /** * Creates the public data write for paying the tx fee. * This is used in private only txs, since for txs with public calls @@ -253,6 +258,13 @@ export class PublicProcessor { feePaymentPublicDataWrite, this.globalVariables, ); + + this.metrics.recordClassRegistration( + ...tx.contractClassLogs + .unrollLogs() + .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)) + .map(log => ContractClassRegisteredEvent.fromLog(log.data)), + ); return [processedTx]; } diff --git a/yarn-project/simulator/src/public/public_processor_metrics.ts b/yarn-project/simulator/src/public/public_processor_metrics.ts index ccc1ee9daad..84d9b52cbde 100644 --- a/yarn-project/simulator/src/public/public_processor_metrics.ts +++ b/yarn-project/simulator/src/public/public_processor_metrics.ts @@ -1,5 +1,5 @@ import { type TxExecutionPhase } from '@aztec/circuit-types'; -import { type ContractClassRegisteredEvent } from '@aztec/protocol-contracts'; +import { type ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer'; import { Attributes, type Histogram, diff --git a/yarn-project/simulator/src/public/public_tx_context.ts b/yarn-project/simulator/src/public/public_tx_context.ts index dc4807dcb2f..ec7aaa93316 100644 --- a/yarn-project/simulator/src/public/public_tx_context.ts +++ b/yarn-project/simulator/src/public/public_tx_context.ts @@ -10,7 +10,6 @@ import { TxHash, } from '@aztec/circuit-types'; import { - AppendOnlyTreeSnapshot, AvmCircuitInputs, type AvmCircuitPublicInputs, type AztecAddress, @@ -19,12 +18,15 @@ import { type GasSettings, type GlobalVariables, MAX_L2_GAS_PER_TX_PUBLIC_PORTION, + MAX_NOTE_HASHES_PER_TX, + MAX_NULLIFIERS_PER_TX, type PrivateToPublicAccumulatedData, type PublicCallRequest, PublicCircuitPublicInputs, RevertCode, type StateReference, TreeSnapshots, + computeTransactionFee, countAccumulatedItems, } from '@aztec/circuits.js'; import { type Logger, createLogger } from '@aztec/foundation/log'; @@ -91,7 +93,7 @@ export class PublicTxContext { const previousAccumulatedDataArrayLengths = new SideEffectArrayLengths( /*publicDataWrites*/ 0, /*protocolPublicDataWrites*/ 0, - countAccumulatedItems(nonRevertibleAccumulatedDataFromPrivate.noteHashes), + /*noteHashes*/ 0, /*nullifiers=*/ 0, countAccumulatedItems(nonRevertibleAccumulatedDataFromPrivate.l2ToL1Msgs), /*unencryptedLogsHashes*/ 0, @@ -102,7 +104,12 @@ export class PublicTxContext { ); // Transaction level state manager that will be forked for revertible phases. - const txStateManager = await AvmPersistableStateManager.create(worldStateDB, enqueuedCallTrace, doMerkleOperations); + const txStateManager = await AvmPersistableStateManager.create( + worldStateDB, + enqueuedCallTrace, + doMerkleOperations, + fetchTxHash(nonRevertibleAccumulatedDataFromPrivate), + ); const gasSettings = tx.data.constants.txContext.gasSettings; const gasUsedByPrivate = tx.data.gasUsed; @@ -186,12 +193,7 @@ export class PublicTxContext { * @returns The transaction's hash. */ getTxHash(): TxHash { - // Private kernel functions are executed client side and for this reason tx hash is already set as first nullifier - const firstNullifier = this.nonRevertibleAccumulatedDataFromPrivate.nullifiers[0]; - if (!firstNullifier || firstNullifier.isZero()) { - throw new Error(`Cannot get tx hash since first nullifier is missing`); - } - return new TxHash(firstNullifier.toBuffer()); + return fetchTxHash(this.nonRevertibleAccumulatedDataFromPrivate); } /** @@ -297,12 +299,15 @@ export class PublicTxContext { * Should only be called during or after teardown. */ private getTransactionFeeUnsafe(): Fr { - const txFee = this.getTotalGasUsed().computeFee(this.globalVariables.gasFees); + const gasUsed = this.getTotalGasUsed(); + const txFee = computeTransactionFee(this.globalVariables.gasFees, this.gasSettings, gasUsed); + this.log.debug(`Computed tx fee`, { txFee, - gasUsed: inspect(this.getTotalGasUsed()), + gasUsed: inspect(gasUsed), gasFees: inspect(this.globalVariables.gasFees), }); + return txFee; } @@ -311,16 +316,29 @@ export class PublicTxContext { */ private generateAvmCircuitPublicInputs(endStateReference: StateReference): AvmCircuitPublicInputs { assert(this.halted, 'Can only get AvmCircuitPublicInputs after tx execution ends'); - const ephemeralTrees = this.state.getActiveStateManager().merkleTrees.treeMap; - - const getAppendSnaphot = (id: MerkleTreeId) => { - const tree = ephemeralTrees.get(id)!; - return new AppendOnlyTreeSnapshot(tree.getRoot(), Number(tree.leafCount)); - }; - - const noteHashTree = getAppendSnaphot(MerkleTreeId.NOTE_HASH_TREE); - const nullifierTree = getAppendSnaphot(MerkleTreeId.NULLIFIER_TREE); - const publicDataTree = getAppendSnaphot(MerkleTreeId.PUBLIC_DATA_TREE); + const ephemeralTrees = this.state.getActiveStateManager().merkleTrees; + + const noteHashTree = ephemeralTrees.getTreeSnapshot(MerkleTreeId.NOTE_HASH_TREE); + const nullifierTree = ephemeralTrees.getTreeSnapshot(MerkleTreeId.NULLIFIER_TREE); + const publicDataTree = ephemeralTrees.getTreeSnapshot(MerkleTreeId.PUBLIC_DATA_TREE); + // Pad the note hash and nullifier trees + const paddedNoteHashTreeSize = + this.startStateReference.partial.noteHashTree.nextAvailableLeafIndex + MAX_NOTE_HASHES_PER_TX; + if (noteHashTree.nextAvailableLeafIndex > paddedNoteHashTreeSize) { + throw new Error( + `Inserted too many leaves in note hash tree: ${noteHashTree.nextAvailableLeafIndex} > ${paddedNoteHashTreeSize}`, + ); + } + noteHashTree.nextAvailableLeafIndex = paddedNoteHashTreeSize; + + const paddedNullifierTreeSize = + this.startStateReference.partial.nullifierTree.nextAvailableLeafIndex + MAX_NULLIFIERS_PER_TX; + if (nullifierTree.nextAvailableLeafIndex > paddedNullifierTreeSize) { + throw new Error( + `Inserted too many leaves in nullifier tree: ${nullifierTree.nextAvailableLeafIndex} > ${paddedNullifierTreeSize}`, + ); + } + nullifierTree.nextAvailableLeafIndex = paddedNullifierTreeSize; const endTreeSnapshots = new TreeSnapshots( endStateReference.l1ToL2MessageTree, @@ -425,3 +443,12 @@ function applyMaxToAvailableGas(availableGas: Gas) { /*l2Gas=*/ Math.min(availableGas.l2Gas, MAX_L2_GAS_PER_TX_PUBLIC_PORTION), ); } + +function fetchTxHash(nonRevertibleAccumulatedData: PrivateToPublicAccumulatedData): TxHash { + // Private kernel functions are executed client side and for this reason tx hash is already set as first nullifier + const firstNullifier = nonRevertibleAccumulatedData.nullifiers[0]; + if (!firstNullifier || firstNullifier.isZero()) { + throw new Error(`Cannot get tx hash since first nullifier is missing`); + } + return new TxHash(firstNullifier.toBuffer()); +} diff --git a/yarn-project/simulator/src/public/public_tx_simulator.test.ts b/yarn-project/simulator/src/public/public_tx_simulator.test.ts index 4eca8f04d7e..2a9d1d62936 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator.test.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator.test.ts @@ -42,13 +42,14 @@ describe('public_tx_simulator', () => { // Nullifier must be >=128 since tree starts with 128 entries pre-filled const MIN_NULLIFIER = 128; // Gas settings. - const gasFees = GasFees.from({ feePerDaGas: new Fr(2), feePerL2Gas: new Fr(3) }); - const gasLimits = Gas.from({ daGas: 100, l2Gas: 150 }); - const teardownGasLimits = Gas.from({ daGas: 20, l2Gas: 30 }); - const maxFeesPerGas = gasFees; + const gasLimits = new Gas(100, 150); + const teardownGasLimits = new Gas(20, 30); + const gasFees = new GasFees(2, 3); + let maxFeesPerGas = gasFees; + let maxPriorityFeesPerGas = GasFees.empty(); // gasUsed for the tx after private execution, minus the teardownGasLimits. - const privateGasUsed = Gas.from({ daGas: 13, l2Gas: 17 }); + const privateGasUsed = new Gas(13, 17); // gasUsed for each enqueued call. const enqueuedCallGasUsed = new Gas(12, 34); @@ -86,7 +87,12 @@ describe('public_tx_simulator', () => { numberOfRevertiblePublicCallRequests: numberOfAppLogicCalls, hasPublicTeardownCallRequest: hasPublicTeardownCall, }); - tx.data.constants.txContext.gasSettings = GasSettings.from({ gasLimits, teardownGasLimits, maxFeesPerGas }); + tx.data.constants.txContext.gasSettings = GasSettings.from({ + gasLimits, + teardownGasLimits, + maxFeesPerGas, + maxPriorityFeesPerGas, + }); tx.data.forPublic!.nonRevertibleAccumulatedData.nullifiers[0] = new Fr(7777); tx.data.forPublic!.nonRevertibleAccumulatedData.nullifiers[1] = new Fr(8888); @@ -746,4 +752,37 @@ describe('public_tx_simulator', () => { await checkNullifierRoot(txResult); }); + + it('runs a tx with non-empty priority fees', async () => { + // gasFees = new GasFees(2, 3); + maxPriorityFeesPerGas = new GasFees(5, 7); + // The max fee is gasFee + priorityFee + 1. + maxFeesPerGas = new GasFees(2 + 5 + 1, 3 + 7 + 1); + + const tx = mockTxWithPublicCalls({ + numberOfSetupCalls: 1, + numberOfAppLogicCalls: 1, + hasPublicTeardownCall: true, + }); + + const txResult = await simulator.simulate(tx); + expect(txResult.revertCode).toEqual(RevertCode.OK); + + const expectedPublicGasUsed = enqueuedCallGasUsed.mul(2); // 1 for setup and 1 for app logic. + const expectedTeardownGasUsed = enqueuedCallGasUsed; + const expectedTotalGas = privateGasUsed.add(expectedPublicGasUsed).add(expectedTeardownGasUsed); + expect(txResult.gasUsed).toEqual({ + totalGas: expectedTotalGas, + teardownGas: expectedTeardownGasUsed, + }); + + const output = txResult.avmProvingRequest!.inputs.output; + + const expectedGasUsedForFee = expectedTotalGas.sub(expectedTeardownGasUsed).add(teardownGasLimits); + expect(output.endGasUsed).toEqual(expectedGasUsedForFee); + + const totalFees = new GasFees(2 + 5, 3 + 7); + const expectedTxFee = expectedGasUsedForFee.computeFee(totalFees); + expect(output.transactionFee).toEqual(expectedTxFee); + }); }); diff --git a/yarn-project/simulator/src/public/public_tx_simulator.ts b/yarn-project/simulator/src/public/public_tx_simulator.ts index 37921773c48..24bc8089bdc 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator.ts @@ -378,6 +378,11 @@ export class PublicTxSimulator { ); } } + for (const noteHash of context.nonRevertibleAccumulatedDataFromPrivate.noteHashes) { + if (!noteHash.isEmpty()) { + stateManager.writeUniqueNoteHash(noteHash); + } + } } /** @@ -397,6 +402,12 @@ export class PublicTxSimulator { ); } } + for (const noteHash of context.revertibleAccumulatedDataFromPrivate.noteHashes) { + if (!noteHash.isEmpty()) { + // Revertible note hashes from private are not hashed with nonce, since private can't know their final position, only we can. + stateManager.writeSiloedNoteHash(noteHash); + } + } } private async payFee(context: PublicTxContext) { diff --git a/yarn-project/simulator/src/public/side_effect_trace_interface.ts b/yarn-project/simulator/src/public/side_effect_trace_interface.ts index d422f5fdb82..a08aa391d13 100644 --- a/yarn-project/simulator/src/public/side_effect_trace_interface.ts +++ b/yarn-project/simulator/src/public/side_effect_trace_interface.ts @@ -39,7 +39,8 @@ export interface PublicSideEffectTraceInterface { insertionPath?: Fr[], ): void; traceNoteHashCheck(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr, exists: boolean, path?: Fr[]): void; - traceNewNoteHash(contractAddress: AztecAddress, noteHash: Fr, leafIndex?: Fr, path?: Fr[]): void; + traceNewNoteHash(uniqueNoteHash: Fr, leafIndex?: Fr, path?: Fr[]): void; + getNoteHashCount(): number; traceNullifierCheck( siloedNullifier: Fr, exists: boolean, diff --git a/yarn-project/simulator/src/public/transitional_adapters.ts b/yarn-project/simulator/src/public/transitional_adapters.ts index cdf0c0ab48c..d6fcfea0c66 100644 --- a/yarn-project/simulator/src/public/transitional_adapters.ts +++ b/yarn-project/simulator/src/public/transitional_adapters.ts @@ -6,7 +6,6 @@ import { type GasSettings, type GlobalVariables, MAX_L2_TO_L1_MSGS_PER_TX, - MAX_NOTE_HASHES_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, @@ -19,7 +18,6 @@ import { countAccumulatedItems, mergeAccumulatedData, } from '@aztec/circuits.js'; -import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash } from '@aztec/circuits.js/hash'; import { padArrayEnd } from '@aztec/foundation/collection'; import { assertLength } from '@aztec/foundation/serialize'; @@ -86,33 +84,6 @@ export function generateAvmCircuitPublicInputs( revertibleAccumulatedDataFromPrivate, ); - // merge all revertible & non-revertible side effects into output accumulated data - const noteHashesFromPrivate = revertCode.isOK() - ? mergeAccumulatedData( - avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.noteHashes, - avmCircuitPublicInputs.previousRevertibleAccumulatedData.noteHashes, - ) - : avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.noteHashes; - avmCircuitPublicInputs.accumulatedData.noteHashes = assertLength( - mergeAccumulatedData(noteHashesFromPrivate, avmCircuitPublicInputs.accumulatedData.noteHashes), - MAX_NOTE_HASHES_PER_TX, - ); - - const txHash = avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.nullifiers[0]; - - const scopedNoteHashesFromPublic = trace.getSideEffects().noteHashes; - for (let i = 0; i < scopedNoteHashesFromPublic.length; i++) { - const scopedNoteHash = scopedNoteHashesFromPublic[i]; - const noteHash = scopedNoteHash.value; - if (!noteHash.isZero()) { - const noteHashIndexInTx = i + countAccumulatedItems(noteHashesFromPrivate); - const nonce = computeNoteHashNonce(txHash, noteHashIndexInTx); - const uniqueNoteHash = computeUniqueNoteHash(nonce, noteHash); - const siloedNoteHash = siloNoteHash(scopedNoteHash.contractAddress, uniqueNoteHash); - avmCircuitPublicInputs.accumulatedData.noteHashes[noteHashIndexInTx] = siloedNoteHash; - } - } - const msgsFromPrivate = revertCode.isOK() ? mergeAccumulatedData( avmCircuitPublicInputs.previousNonRevertibleAccumulatedData.l2ToL1Msgs, diff --git a/yarn-project/telemetry-client/package.json b/yarn-project/telemetry-client/package.json index 15ef986d543..fccd13f4fa3 100644 --- a/yarn-project/telemetry-client/package.json +++ b/yarn-project/telemetry-client/package.json @@ -27,6 +27,7 @@ "!*.test.*" ], "dependencies": { + "@aztec/circuit-types": "workspace:^", "@aztec/foundation": "workspace:^", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.55.0", diff --git a/yarn-project/telemetry-client/src/attributes.ts b/yarn-project/telemetry-client/src/attributes.ts index 1fcfdbcf926..364b96d8b24 100644 --- a/yarn-project/telemetry-client/src/attributes.ts +++ b/yarn-project/telemetry-client/src/attributes.ts @@ -50,7 +50,7 @@ export const BLOCK_PARENT = 'aztec.block.parent'; export const BLOCK_CANDIDATE_TXS_COUNT = 'aztec.block.candidate_txs_count'; /** How many actual txs were included in this block */ export const BLOCK_TXS_COUNT = 'aztec.block.txs_count'; -/** The block size (power of 2) */ +/** The block size */ export const BLOCK_SIZE = 'aztec.block.size'; /** How many blocks are included in this epoch */ export const EPOCH_SIZE = 'aztec.epoch.size'; @@ -72,6 +72,8 @@ export const L1_SENDER = 'aztec.l1.sender'; export const TX_PHASE_NAME = 'aztec.tx.phase_name'; /** The proving job type */ export const PROVING_JOB_TYPE = 'aztec.proving.job_type'; +/** The proving job id */ +export const PROVING_JOB_ID = 'aztec.proving.job_id'; export const MERKLE_TREE_NAME = 'aztec.merkle_tree.name'; /** The prover-id in a root rollup proof. */ @@ -89,6 +91,9 @@ export const TARGET_ADDRESS = 'aztec.address.target'; export const SENDER_ADDRESS = 'aztec.address.sender'; export const MANA_USED = 'aztec.mana.used'; +/** Whether a sync process is the initial run, which is usually slower than iterative ones. */ +export const INITIAL_SYNC = 'aztec.initial_sync'; + /** Identifier for the tables in a world state DB */ export const WS_DB_DATA_TYPE = 'aztec.world_state.db_type'; diff --git a/yarn-project/telemetry-client/src/histogram_utils.test.ts b/yarn-project/telemetry-client/src/histogram_utils.test.ts index f23482f995b..6281420819d 100644 --- a/yarn-project/telemetry-client/src/histogram_utils.test.ts +++ b/yarn-project/telemetry-client/src/histogram_utils.test.ts @@ -1,4 +1,4 @@ -import { exponentialBuckets, linearBuckets, millisecondBuckets } from './histogram_utils.js'; +import { exponentialBuckets, linearBuckets } from './histogram_utils.js'; describe('linearBuckets', () => { it.each([[10, 1_000, 5, [10, 208, 406, 604, 802, 1000]]] as const)( @@ -17,31 +17,3 @@ describe('exponentialBuckets', () => { }, ); }); - -describe('millisecondBuckets', () => { - it('should throw an error if significantFractionalDigits is less than 1', () => { - expect(() => millisecondBuckets(0)).toThrow(); - }); - - it('should return the expected buckets for milliseconds', () => { - expect(millisecondBuckets(1, 16)).toEqual([ - 10, // 2^0 * 10 - 12, - 14, - 17, - 20, // 2^1 * 10 - 24, - 28, - 34, - 40, // 2^2 * 10 - 48, - 57, - 67, - 80, // 2^3 * 10 - 95, - 113, - 135, - 160, // 2^4 * 10 - ]); - }); -}); diff --git a/yarn-project/telemetry-client/src/histogram_utils.ts b/yarn-project/telemetry-client/src/histogram_utils.ts index 0296bac486a..35167b8c3af 100644 --- a/yarn-project/telemetry-client/src/histogram_utils.ts +++ b/yarn-project/telemetry-client/src/histogram_utils.ts @@ -6,10 +6,10 @@ * @returns - An array of bucket boundaries */ export function linearBuckets(start: number, end: number, count: number): number[] { - const buckets = []; + const buckets: number[] = []; const step = (end - start) / count; for (let i = 0; i <= count; i++) { - buckets.push(start + i * step); + buckets.push(Math.floor(start + i * step)); } return buckets; } @@ -48,19 +48,3 @@ export function exponentialBuckets(scale: number, count: number): number[] { } return buckets; } - -/** - * Creates an array of exponential buckets optimized for milliseconds - * @param significantFractionalDigits - The number of significant digits to round to - * @param count - The number of buckets. Defaults to 60 - * @returns - An array of bucket boundaries - */ -export function millisecondBuckets(significantFractionalDigits: number, count = 60): number[] { - if (significantFractionalDigits < 1) { - // if significant digits is 1 then we end up having duplicate buckets - throw new Error('significantFractionalDigits must be >= 1'); - } - - const scale = 10 ** significantFractionalDigits; - return exponentialBuckets(2, count).map(x => Math.round(x * scale)); -} diff --git a/yarn-project/telemetry-client/src/index.ts b/yarn-project/telemetry-client/src/index.ts index ce7d17939bf..acd6b5363b4 100644 --- a/yarn-project/telemetry-client/src/index.ts +++ b/yarn-project/telemetry-client/src/index.ts @@ -3,3 +3,4 @@ export * from './histogram_utils.js'; export * from './with_tracer.js'; export * from './prom_otel_adapter.js'; export * from './lmdb_metrics.js'; +export * from './wrappers/index.js'; diff --git a/yarn-project/telemetry-client/src/otel.ts b/yarn-project/telemetry-client/src/otel.ts index 5ba3f5bcec9..14d28f9fe6f 100644 --- a/yarn-project/telemetry-client/src/otel.ts +++ b/yarn-project/telemetry-client/src/otel.ts @@ -16,11 +16,18 @@ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'; import { HostMetrics } from '@opentelemetry/host-metrics'; import { type IResource } from '@opentelemetry/resources'; import { type LoggerProvider } from '@opentelemetry/sdk-logs'; -import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics'; +import { + ExplicitBucketHistogramAggregation, + InstrumentType, + MeterProvider, + PeriodicExportingMetricReader, + View, +} from '@opentelemetry/sdk-metrics'; import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions'; import { type TelemetryClientConfig } from './config.js'; +import { linearBuckets } from './histogram_utils.js'; import { registerOtelLoggerProvider } from './otel_logger_provider.js'; import { getOtelResource } from './otel_resource.js'; import { type Gauge, type TelemetryClient } from './telemetry.js'; @@ -140,6 +147,43 @@ export class OpenTelemetryClient implements TelemetryClient { exportTimeoutMillis: config.otelExportTimeoutMs, }), ], + views: [ + // Every histogram matching the selector (type + unit) gets these custom buckets assigned + new View({ + instrumentType: InstrumentType.HISTOGRAM, + instrumentUnit: 'ms', + aggregation: new ExplicitBucketHistogramAggregation( + // 181 buckets between 5ms and 1hr + [ + ...linearBuckets(5, 100, 20), // 20 buckets between 5 and 100ms + ...linearBuckets(100, 1_000, 20).slice(1), // another 20 buckets between 100ms and 1s. slice(1) to remove duplicate 100 + ...linearBuckets(1_000, 10_000, 20).slice(1), + ...linearBuckets(10_000, 60_000, 20).slice(1), + ...linearBuckets(60_000, 300_000, 20).slice(1), + ...linearBuckets(300_000, 600_000, 20).slice(1), + ...linearBuckets(600_000, 1_200_000, 20).slice(1), + ...linearBuckets(1_200_000, 1_800_000, 20).slice(1), + ...linearBuckets(1_800_000, 3_600_000, 20).slice(1), // 1hr + ], + true, + ), + }), + new View({ + instrumentType: InstrumentType.HISTOGRAM, + instrumentUnit: 'By', + aggregation: new ExplicitBucketHistogramAggregation( + // 143 buckets between 32 bytes and 2MB + [ + ...linearBuckets(2 ** 5, 2 ** 10, 31), // 32 bytes to 1KB at a resolution of 32 bytes + ...linearBuckets(2 ** 10, 2 ** 15, 31).slice(1), // 1KB to 32KB at a resolution of 1KB + ...linearBuckets(2 ** 15, 2 ** 18, 32).slice(1), // 32KB to 256KB at a resolution of 7KB + ...linearBuckets(2 ** 18, 2 ** 20, 32).slice(1), // 256KB to 1MB at a resolution of 24KB + ...linearBuckets(2 ** 20, 2 ** 21, 16).slice(1), // 1MB to 2MB at a resolution of 64KB + ], + true, + ), + }), + ], }); const loggerProvider = await registerOtelLoggerProvider(resource, config.logsCollectorUrl); diff --git a/yarn-project/telemetry-client/src/wrappers/index.ts b/yarn-project/telemetry-client/src/wrappers/index.ts new file mode 100644 index 00000000000..3a6efb1f42e --- /dev/null +++ b/yarn-project/telemetry-client/src/wrappers/index.ts @@ -0,0 +1 @@ +export * from './l2_block_stream.js'; diff --git a/yarn-project/telemetry-client/src/wrappers/l2_block_stream.ts b/yarn-project/telemetry-client/src/wrappers/l2_block_stream.ts new file mode 100644 index 00000000000..e09cce9df36 --- /dev/null +++ b/yarn-project/telemetry-client/src/wrappers/l2_block_stream.ts @@ -0,0 +1,37 @@ +import { + type L2BlockSource, + L2BlockStream, + type L2BlockStreamEventHandler, + type L2BlockStreamLocalDataProvider, +} from '@aztec/circuit-types'; +import { createLogger } from '@aztec/foundation/log'; +import { type Traceable, type Tracer, trackSpan } from '@aztec/telemetry-client'; + +/** Extends an L2BlockStream with a tracer to create a new trace per iteration. */ +export class TraceableL2BlockStream extends L2BlockStream implements Traceable { + constructor( + l2BlockSource: Pick, + localData: L2BlockStreamLocalDataProvider, + handler: L2BlockStreamEventHandler, + public readonly tracer: Tracer, + private readonly name: string = 'L2BlockStream', + log = createLogger('types:block_stream'), + opts: { + proven?: boolean; + pollIntervalMS?: number; + batchSize?: number; + startingBlock?: number; + } = {}, + ) { + super(l2BlockSource, localData, handler, log, opts); + } + + // We need to use a non-arrow function to be able to access `this` + // See https://www.typescriptlang.org/docs/handbook/2/functions.html#declaring-this-in-a-function + @trackSpan(function () { + return `${this!.name}.work`; + }) + override work() { + return super.work(); + } +} diff --git a/yarn-project/telemetry-client/tsconfig.json b/yarn-project/telemetry-client/tsconfig.json index 63f8ab3e9f7..904b812a155 100644 --- a/yarn-project/telemetry-client/tsconfig.json +++ b/yarn-project/telemetry-client/tsconfig.json @@ -6,6 +6,9 @@ "tsBuildInfoFile": ".tsbuildinfo" }, "references": [ + { + "path": "../circuit-types" + }, { "path": "../foundation" } diff --git a/yarn-project/txe/src/node/txe_node.ts b/yarn-project/txe/src/node/txe_node.ts index 35aa9266548..c798e9a9ae0 100644 --- a/yarn-project/txe/src/node/txe_node.ts +++ b/yarn-project/txe/src/node/txe_node.ts @@ -1,4 +1,4 @@ -import { type ContractArtifact, createLogger } from '@aztec/aztec.js'; +import { createLogger } from '@aztec/aztec.js'; import { type AztecNode, type EpochProofQuote, @@ -450,7 +450,7 @@ export class TXENode implements AztecNode { * @param aztecAddress * @param artifact */ - addContractArtifact(_address: AztecAddress, _artifact: ContractArtifact): Promise { + registerContractFunctionNames(_address: AztecAddress, _names: Record): Promise { throw new Error('TXE Node method addContractArtifact not implemented'); } diff --git a/yarn-project/txe/src/oracle/txe_oracle.ts b/yarn-project/txe/src/oracle/txe_oracle.ts index 35340639972..ec4c7818525 100644 --- a/yarn-project/txe/src/oracle/txe_oracle.ts +++ b/yarn-project/txe/src/oracle/txe_oracle.ts @@ -36,7 +36,7 @@ import { type PublicDataTreeLeafPreimage, type PublicDataWrite, computeContractClassId, - computeTaggingSecret, + computeTaggingSecretPoint, deriveKeys, getContractClassFromArtifact, } from '@aztec/circuits.js'; @@ -106,8 +106,9 @@ export class TXE implements TypedOracle { private version: Fr = Fr.ONE; private chainId: Fr = Fr.ONE; - private siloedNoteHashesFromPublic: Fr[] = []; + private uniqueNoteHashesFromPublic: Fr[] = []; private siloedNullifiersFromPublic: Fr[] = []; + private siloedNullifiersFromPrivate: Set = new Set(); private privateLogs: PrivateLog[] = []; private publicLogs: UnencryptedL2Log[] = []; @@ -259,6 +260,22 @@ export class TXE implements TypedOracle { ); } + async addNullifiersFromPrivate(contractAddress: AztecAddress, nullifiers: Fr[]) { + const siloedNullifiers = nullifiers.map(nullifier => siloNullifier(contractAddress, nullifier)); + const db = await this.trees.getLatest(); + const nullifierIndexesInTree = await db.findLeafIndices( + MerkleTreeId.NULLIFIER_TREE, + siloedNullifiers.map(n => n.toBuffer()), + ); + const notInTree = nullifierIndexesInTree.every(index => index === undefined); + const notInCache = siloedNullifiers.every(n => !this.siloedNullifiersFromPrivate.has(n.toString())); + if (notInTree && notInCache) { + siloedNullifiers.forEach(n => this.siloedNullifiersFromPrivate.add(n.toString())); + } else { + throw new Error(`Rejecting tx for emitting duplicate nullifiers`); + } + } + async addSiloedNullifiersFromPublic(siloedNullifiers: Fr[]) { this.siloedNullifiersFromPublic.push(...siloedNullifiers); @@ -270,20 +287,20 @@ export class TXE implements TypedOracle { await this.addSiloedNullifiers(siloedNullifiers); } - async addSiloedNoteHashes(siloedNoteHashes: Fr[]) { + async addUniqueNoteHashes(siloedNoteHashes: Fr[]) { const db = await this.trees.getLatest(); await db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, siloedNoteHashes); } - async addSiloedNoteHashesFromPublic(siloedNoteHashes: Fr[]) { - this.siloedNoteHashesFromPublic.push(...siloedNoteHashes); - await this.addSiloedNoteHashes(siloedNoteHashes); + async addUniqueNoteHashesFromPublic(siloedNoteHashes: Fr[]) { + this.uniqueNoteHashesFromPublic.push(...siloedNoteHashes); + await this.addUniqueNoteHashes(siloedNoteHashes); } async addNoteHashes(contractAddress: AztecAddress, noteHashes: Fr[]) { const siloedNoteHashes = noteHashes.map(noteHash => siloNoteHash(contractAddress, noteHash)); - await this.addSiloedNoteHashes(siloedNoteHashes); + await this.addUniqueNoteHashes(siloedNoteHashes); } addPrivateLogs(contractAddress: AztecAddress, privateLogs: PrivateLog[]) { @@ -369,8 +386,7 @@ export class TXE implements TypedOracle { async getMembershipWitness(blockNumber: number, treeId: MerkleTreeId, leafValue: Fr): Promise { const db = await this.#getTreesAt(blockNumber); - - const index = await db.findLeafIndex(treeId, leafValue.toBuffer()); + const index = (await db.findLeafIndices(treeId, [leafValue.toBuffer()]))[0]; if (index === undefined) { throw new Error(`Leaf value: ${leafValue} not found in ${MerkleTreeId[treeId]} at block ${blockNumber}`); } @@ -390,7 +406,7 @@ export class TXE implements TypedOracle { nullifier: Fr, ): Promise { const db = await this.#getTreesAt(blockNumber); - const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); + const index = (await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0]; if (!index) { return undefined; } @@ -484,14 +500,16 @@ export class TXE implements TypedOracle { sortOrder: number[], limit: number, offset: number, - _status: NoteStatus, + status: NoteStatus, ) { - const syncedNotes = await this.simulatorOracle.getNotes(this.contractAddress, storageSlot, _status); + // Nullified pending notes are already removed from the list. const pendingNotes = this.noteCache.getNotes(this.contractAddress, storageSlot); - const notesToFilter = [...pendingNotes, ...syncedNotes]; + const pendingNullifiers = this.noteCache.getNullifiers(this.contractAddress); + const dbNotes = await this.simulatorOracle.getNotes(this.contractAddress, storageSlot, status); + const dbNotesFiltered = dbNotes.filter(n => !pendingNullifiers.has((n.siloedNullifier as Fr).value)); - const notes = pickNotes(notesToFilter, { + const notes = pickNotes([...dbNotesFiltered, ...pendingNotes], { selects: selectByIndexes.slice(0, numSelects).map((index, i) => ({ selector: { index, offset: selectByOffsets[i], length: selectByLengths[i] }, value: selectValues[i], @@ -531,7 +549,8 @@ export class TXE implements TypedOracle { return Promise.resolve(); } - notifyNullifiedNote(innerNullifier: Fr, noteHash: Fr, counter: number) { + async notifyNullifiedNote(innerNullifier: Fr, noteHash: Fr, counter: number) { + await this.addNullifiersFromPrivate(this.contractAddress, [innerNullifier]); this.noteCache.nullifyNote(this.contractAddress, innerNullifier, noteHash); this.sideEffectCounter = counter + 1; return Promise.resolve(); @@ -540,7 +559,7 @@ export class TXE implements TypedOracle { async checkNullifierExists(innerNullifier: Fr): Promise { const nullifier = siloNullifier(this.contractAddress, innerNullifier!); const db = await this.trees.getLatest(); - const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); + const index = (await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0]; return index !== undefined; } @@ -611,17 +630,17 @@ export class TXE implements TypedOracle { ...this.noteCache .getAllNotes() .map(pendingNote => - siloNoteHash( - pendingNote.note.contractAddress, - computeUniqueNoteHash( - computeNoteHashNonce(new Fr(this.blockNumber + 6969), i++), - pendingNote.noteHashForConsumption, - ), + computeUniqueNoteHash( + computeNoteHashNonce(new Fr(this.blockNumber + 6969), i++), + siloNoteHash(pendingNote.note.contractAddress, pendingNote.noteHashForConsumption), ), ), - ...this.siloedNoteHashesFromPublic, + ...this.uniqueNoteHashesFromPublic, + ]; + txEffect.nullifiers = [ + new Fr(blockNumber + 6969), + ...Array.from(this.siloedNullifiersFromPrivate).map(n => Fr.fromString(n)), ]; - txEffect.nullifiers = [new Fr(blockNumber + 6969), ...this.noteCache.getAllNullifiers()]; // Using block number itself, (without adding 6969) gets killed at 1 as it says the slot is already used, // it seems like we commit a 1 there to the trees before ? To see what I mean, uncomment these lines below @@ -635,12 +654,13 @@ export class TXE implements TypedOracle { this.node.addNoteLogsByTags(this.blockNumber, this.privateLogs); this.node.addPublicLogsByTags(this.blockNumber, this.publicLogs); - await this.addSiloedNoteHashes(txEffect.noteHashes); + await this.addUniqueNoteHashes(txEffect.noteHashes); await this.addSiloedNullifiers(txEffect.nullifiers); this.privateLogs = []; this.publicLogs = []; - this.siloedNoteHashesFromPublic = []; + this.siloedNullifiersFromPrivate = new Set(); + this.uniqueNoteHashesFromPublic = []; this.siloedNullifiersFromPublic = []; this.noteCache = new ExecutionNoteCache(new Fr(1)); } @@ -714,6 +734,24 @@ export class TXE implements TypedOracle { publicInputs.privateLogs.filter(privateLog => !privateLog.isEmpty()).map(privateLog => privateLog.log), ); + const executionNullifiers = publicInputs.nullifiers + .filter(nullifier => !nullifier.isEmpty()) + .map(nullifier => nullifier.value); + // We inject nullifiers into siloedNullifiersFromPrivate from notifyNullifiedNote, + // so top level calls to destroyNote work as expected. As such, we are certain + // that we would insert duplicates if we just took the nullifiers from the public inputs and + // blindly inserted them into siloedNullifiersFromPrivate. To avoid this, we extract the first + // (and only the first!) duplicated nullifier from the public inputs, so we can just push + // the ones that were not created by deleting a note + const firstDuplicateIndexes = executionNullifiers + .map((nullifier, index) => { + const siloedNullifier = siloNullifier(targetContractAddress, nullifier); + return this.siloedNullifiersFromPrivate.has(siloedNullifier.toString()) ? index : -1; + }) + .filter(index => index !== -1); + const nonNoteNullifiers = executionNullifiers.filter((_, index) => !firstDuplicateIndexes.includes(index)); + await this.addNullifiersFromPrivate(targetContractAddress, nonNoteNullifiers); + this.setContractAddress(currentContractAddress); this.setMsgSender(currentMessageSender); this.setFunctionSelector(currentFunctionSelector); @@ -856,7 +894,7 @@ export class TXE implements TypedOracle { const noteHashes = sideEffects.noteHashes.filter(s => !s.isEmpty()); const nullifiers = sideEffects.nullifiers.filter(s => !s.isEmpty()); await this.addPublicDataWrites(publicDataWrites); - await this.addSiloedNoteHashesFromPublic(noteHashes); + await this.addUniqueNoteHashesFromPublic(noteHashes); await this.addSiloedNullifiers(nullifiers); this.setContractAddress(currentContractAddress); @@ -894,24 +932,24 @@ export class TXE implements TypedOracle { } async incrementAppTaggingSecretIndexAsSender(sender: AztecAddress, recipient: AztecAddress): Promise { - const appSecret = await this.#calculateTaggingSecret(this.contractAddress, sender, recipient); + const appSecret = await this.#calculateAppTaggingSecret(this.contractAddress, sender, recipient); const [index] = await this.txeDatabase.getTaggingSecretsIndexesAsSender([appSecret]); await this.txeDatabase.setTaggingSecretsIndexesAsSender([new IndexedTaggingSecret(appSecret, index + 1)]); } - async getAppTaggingSecretAsSender(sender: AztecAddress, recipient: AztecAddress): Promise { - const secret = await this.#calculateTaggingSecret(this.contractAddress, sender, recipient); + async getIndexedTaggingSecretAsSender(sender: AztecAddress, recipient: AztecAddress): Promise { + const secret = await this.#calculateAppTaggingSecret(this.contractAddress, sender, recipient); const [index] = await this.txeDatabase.getTaggingSecretsIndexesAsSender([secret]); return new IndexedTaggingSecret(secret, index); } - async #calculateTaggingSecret(contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress) { + async #calculateAppTaggingSecret(contractAddress: AztecAddress, sender: AztecAddress, recipient: AztecAddress) { const senderCompleteAddress = await this.getCompleteAddress(sender); const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender); - const sharedSecret = computeTaggingSecret(senderCompleteAddress, senderIvsk, recipient); + const secretPoint = computeTaggingSecretPoint(senderCompleteAddress, senderIvsk, recipient); // Silo the secret to the app so it can't be used to track other app's notes - const siloedSecret = poseidon2Hash([sharedSecret.x, sharedSecret.y, contractAddress]); - return siloedSecret; + const appSecret = poseidon2Hash([secretPoint.x, secretPoint.y, contractAddress]); + return appSecret; } async syncNotes() { @@ -925,6 +963,8 @@ export class TXE implements TypedOracle { await this.simulatorOracle.processTaggedLogs(taggedLogs, AztecAddress.fromString(recipient)); } + await this.simulatorOracle.removeNullifiedNotes(this.contractAddress); + return Promise.resolve(); } @@ -955,7 +995,7 @@ export class TXE implements TypedOracle { const noteHashes = sideEffects.noteHashes.filter(s => !s.isEmpty()); const nullifiers = sideEffects.nullifiers.filter(s => !s.isEmpty()); await this.addPublicDataWrites(publicDataWrites); - await this.addSiloedNoteHashes(noteHashes); + await this.addUniqueNoteHashes(noteHashes); await this.addSiloedNullifiers(nullifiers); } @@ -976,7 +1016,7 @@ export class TXE implements TypedOracle { async avmOpcodeNullifierExists(innerNullifier: Fr, targetAddress: AztecAddress): Promise { const nullifier = siloNullifier(targetAddress, innerNullifier!); const db = await this.trees.getLatest(); - const index = await db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer()); + const index = (await db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [nullifier.toBuffer()]))[0]; return index !== undefined; } diff --git a/yarn-project/txe/src/txe_service/txe_service.ts b/yarn-project/txe/src/txe_service/txe_service.ts index de5c041d1c1..f372c0ac5ec 100644 --- a/yarn-project/txe/src/txe_service/txe_service.ts +++ b/yarn-project/txe/src/txe_service/txe_service.ts @@ -15,7 +15,8 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { type Logger } from '@aztec/foundation/log'; import { KeyStore } from '@aztec/key-store'; import { openTmpStore } from '@aztec/kv-store/lmdb'; -import { getCanonicalProtocolContract, protocolContractNames } from '@aztec/protocol-contracts'; +import { protocolContractNames } from '@aztec/protocol-contracts'; +import { getCanonicalProtocolContract } from '@aztec/protocol-contracts/bundle'; import { enrichPublicSimulationError } from '@aztec/pxe'; import { ExecutionNoteCache, PackedValuesCache, type TypedOracle } from '@aztec/simulator'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; @@ -584,8 +585,8 @@ export class TXEService { return toForeignCallResult([toArray(witness.toFields())]); } - async getAppTaggingSecretAsSender(sender: ForeignCallSingle, recipient: ForeignCallSingle) { - const secret = await this.typedOracle.getAppTaggingSecretAsSender( + async getIndexedTaggingSecretAsSender(sender: ForeignCallSingle, recipient: ForeignCallSingle) { + const secret = await this.typedOracle.getIndexedTaggingSecretAsSender( AztecAddress.fromField(fromSingle(sender)), AztecAddress.fromField(fromSingle(recipient)), ); diff --git a/yarn-project/txe/src/util/txe_public_contract_data_source.ts b/yarn-project/txe/src/util/txe_public_contract_data_source.ts index a56aeb40d8b..7d15b9d8d48 100644 --- a/yarn-project/txe/src/util/txe_public_contract_data_source.ts +++ b/yarn-project/txe/src/util/txe_public_contract_data_source.ts @@ -85,8 +85,8 @@ export class TXEPublicContractDataSource implements ContractDataSource { return Promise.resolve(func?.name); } - addContractArtifact(address: AztecAddress, contract: ContractArtifact): Promise { - return this.txeOracle.addContractArtifact(contract); + registerContractFunctionNames(_address: AztecAddress, _names: Record): Promise { + return Promise.resolve(); } // TODO(#10007): Remove this method. diff --git a/yarn-project/validator-client/package.json b/yarn-project/validator-client/package.json index 637cbb5a31e..b760d9aedb6 100644 --- a/yarn-project/validator-client/package.json +++ b/yarn-project/validator-client/package.json @@ -3,7 +3,10 @@ "version": "0.1.0", "main": "dest/index.js", "type": "module", - "exports": "./dest/index.js", + "exports": { + ".": "./dest/index.js", + "./config": "./dest/config.js" + }, "bin": "./dest/bin/index.js", "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/validator-client/src/factory.ts b/yarn-project/validator-client/src/factory.ts index 7ea8b09e8d6..3382163f408 100644 --- a/yarn-project/validator-client/src/factory.ts +++ b/yarn-project/validator-client/src/factory.ts @@ -1,5 +1,6 @@ import { EpochCache, type EpochCacheConfig } from '@aztec/epoch-cache'; import { type EthAddress } from '@aztec/foundation/eth-address'; +import { type DateProvider } from '@aztec/foundation/timer'; import { type P2P } from '@aztec/p2p'; import { type TelemetryClient } from '@aztec/telemetry-client'; @@ -11,8 +12,11 @@ import { ValidatorClient } from './validator.js'; export async function createValidatorClient( config: ValidatorClientConfig & EpochCacheConfig, rollupAddress: EthAddress, - p2pClient: P2P, - telemetry: TelemetryClient, + deps: { + p2pClient: P2P; + telemetry: TelemetryClient; + dateProvider: DateProvider; + }, ) { if (config.disableValidator) { return undefined; @@ -22,7 +26,7 @@ export async function createValidatorClient( } // Create the epoch cache - const epochCache = await EpochCache.create(rollupAddress, /*l1TimestampSource,*/ config); + const epochCache = await EpochCache.create(rollupAddress, config, deps); - return ValidatorClient.new(config, epochCache, p2pClient, telemetry); + return ValidatorClient.new(config, epochCache, deps.p2pClient, deps.telemetry); } diff --git a/yarn-project/validator-client/src/validator.ts b/yarn-project/validator-client/src/validator.ts index 6e2890334f8..42e673058b9 100644 --- a/yarn-project/validator-client/src/validator.ts +++ b/yarn-project/validator-client/src/validator.ts @@ -86,9 +86,15 @@ export class ValidatorClient extends WithTracer implements Validator { this.validationService = new ValidationService(keyStore); // Refresh epoch cache every second to trigger commiteeChanged event - this.epochCacheUpdateLoop = new RunningPromise(async () => { - await this.epochCache.getCommittee().catch(err => log.error('Error updating validator committee', err)); - }, 1000); + this.epochCacheUpdateLoop = new RunningPromise( + () => + this.epochCache + .getCommittee() + .then(() => {}) + .catch(err => log.error('Error updating validator committee', err)), + log, + 1000, + ); // Listen to commiteeChanged event to alert operator when their validator has entered the committee this.epochCache.on('committeeChanged', (newCommittee, epochNumber) => { diff --git a/yarn-project/world-state/package.json b/yarn-project/world-state/package.json index 4da25512fd1..ec920a94cfc 100644 --- a/yarn-project/world-state/package.json +++ b/yarn-project/world-state/package.json @@ -4,7 +4,8 @@ "type": "module", "exports": { ".": "./dest/index.js", - "./native": "./dest/native/index.js" + "./native": "./dest/native/index.js", + "./config": "./dest/synchronizer/config.js" }, "typedocOptions": { "entryPoints": [ diff --git a/yarn-project/world-state/src/native/merkle_trees_facade.ts b/yarn-project/world-state/src/native/merkle_trees_facade.ts index 6d3ea76d7fd..28e5886de1d 100644 --- a/yarn-project/world-state/src/native/merkle_trees_facade.ts +++ b/yarn-project/world-state/src/native/merkle_trees_facade.ts @@ -45,27 +45,29 @@ export class MerkleTreesFacade implements MerkleTreeReadOperations { return this.initialHeader; } - findLeafIndex(treeId: MerkleTreeId, value: MerkleTreeLeafType): Promise { - return this.findLeafIndexAfter(treeId, value, 0n); + findLeafIndices(treeId: MerkleTreeId, values: MerkleTreeLeafType[]): Promise<(bigint | undefined)[]> { + return this.findLeafIndicesAfter(treeId, values, 0n); } - async findLeafIndexAfter( + async findLeafIndicesAfter( treeId: MerkleTreeId, - leaf: MerkleTreeLeafType, + leaves: MerkleTreeLeafType[], startIndex: bigint, - ): Promise { - const index = await this.instance.call(WorldStateMessageType.FIND_LEAF_INDEX, { - leaf: serializeLeaf(hydrateLeaf(treeId, leaf)), + ): Promise<(bigint | undefined)[]> { + const response = await this.instance.call(WorldStateMessageType.FIND_LEAF_INDICES, { + leaves: leaves.map(leaf => serializeLeaf(hydrateLeaf(treeId, leaf))), revision: this.revision, treeId, startIndex, }); - if (typeof index === 'number' || typeof index === 'bigint') { - return BigInt(index); - } else { - return undefined; - } + return response.indices.map(index => { + if (typeof index === 'number' || typeof index === 'bigint') { + return BigInt(index); + } else { + return undefined; + } + }); } async getLeafPreimage(treeId: IndexedTreeId, leafIndex: bigint): Promise { diff --git a/yarn-project/world-state/src/native/message.ts b/yarn-project/world-state/src/native/message.ts index 6f95755ce7c..6cd4b4f751a 100644 --- a/yarn-project/world-state/src/native/message.ts +++ b/yarn-project/world-state/src/native/message.ts @@ -56,7 +56,7 @@ export enum WorldStateMessageType { GET_SIBLING_PATH, GET_BLOCK_NUMBERS_FOR_LEAF_INDICES, - FIND_LEAF_INDEX, + FIND_LEAF_INDICES, FIND_LOW_LEAF, APPEND_LEAVES, @@ -329,8 +329,8 @@ export type SerializedIndexedLeaf = { nextValue: Buffer; // Fr }; -interface WithLeafValue { - leaf: SerializedLeafValue; +interface WithLeafValues { + leaves: SerializedLeafValue[]; } interface BlockShiftRequest { @@ -371,10 +371,12 @@ type GetLeafResponse = SerializedLeafValue | undefined; interface GetLeafPreImageRequest extends WithTreeId, WithLeafIndex, WithWorldStateRevision {} type GetLeafPreImageResponse = SerializedIndexedLeaf | undefined; -interface FindLeafIndexRequest extends WithTreeId, WithLeafValue, WithWorldStateRevision { +interface FindLeafIndicesRequest extends WithTreeId, WithLeafValues, WithWorldStateRevision { startIndex: bigint; } -type FindLeafIndexResponse = bigint | null; +interface FindLeafIndicesResponse { + indices: bigint[]; +} interface FindLowLeafRequest extends WithTreeId, WithWorldStateRevision { key: Fr; @@ -461,7 +463,7 @@ export type WorldStateRequest = { [WorldStateMessageType.GET_SIBLING_PATH]: GetSiblingPathRequest; [WorldStateMessageType.GET_BLOCK_NUMBERS_FOR_LEAF_INDICES]: GetBlockNumbersForLeafIndicesRequest; - [WorldStateMessageType.FIND_LEAF_INDEX]: FindLeafIndexRequest; + [WorldStateMessageType.FIND_LEAF_INDICES]: FindLeafIndicesRequest; [WorldStateMessageType.FIND_LOW_LEAF]: FindLowLeafRequest; [WorldStateMessageType.APPEND_LEAVES]: AppendLeavesRequest; @@ -497,7 +499,7 @@ export type WorldStateResponse = { [WorldStateMessageType.GET_SIBLING_PATH]: GetSiblingPathResponse; [WorldStateMessageType.GET_BLOCK_NUMBERS_FOR_LEAF_INDICES]: GetBlockNumbersForLeafIndicesResponse; - [WorldStateMessageType.FIND_LEAF_INDEX]: FindLeafIndexResponse; + [WorldStateMessageType.FIND_LEAF_INDICES]: FindLeafIndicesResponse; [WorldStateMessageType.FIND_LOW_LEAF]: FindLowLeafResponse; [WorldStateMessageType.APPEND_LEAVES]: void; diff --git a/yarn-project/world-state/src/native/native_world_state.test.ts b/yarn-project/world-state/src/native/native_world_state.test.ts index ff2767e5971..0fc564db7a1 100644 --- a/yarn-project/world-state/src/native/native_world_state.test.ts +++ b/yarn-project/world-state/src/native/native_world_state.test.ts @@ -47,6 +47,14 @@ describe('NativeWorldState', () => { let block: L2Block; let messages: Fr[]; + const findLeafIndex = async (leaf: Fr, ws: NativeWorldStateService) => { + const indices = await ws.getCommitted().findLeafIndices(MerkleTreeId.NOTE_HASH_TREE, [leaf]); + if (indices.length === 0) { + return undefined; + } + return indices[0]; + }; + beforeAll(async () => { const ws = await NativeWorldStateService.new(rollupAddress, dataDir, defaultDBMapSize); const fork = await ws.fork(); @@ -59,9 +67,7 @@ describe('NativeWorldState', () => { it('correctly restores committed state', async () => { const ws = await NativeWorldStateService.new(rollupAddress, dataDir, defaultDBMapSize); - await expect( - ws.getCommitted().findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, block.body.txEffects[0].noteHashes[0]), - ).resolves.toBeDefined(); + await expect(findLeafIndex(block.body.txEffects[0].noteHashes[0], ws)).resolves.toBeDefined(); const status = await ws.getStatusSummary(); expect(status.unfinalisedBlockNumber).toBe(1n); await ws.close(); @@ -71,18 +77,14 @@ describe('NativeWorldState', () => { // open ws against the same data dir but a different rollup let ws = await NativeWorldStateService.new(EthAddress.random(), dataDir, defaultDBMapSize); // db should be empty - await expect( - ws.getCommitted().findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, block.body.txEffects[0].noteHashes[0]), - ).resolves.toBeUndefined(); + await expect(findLeafIndex(block.body.txEffects[0].noteHashes[0], ws)).resolves.toBeUndefined(); await ws.close(); // later on, open ws against the original rollup and same data dir // db should be empty because we wiped all its files earlier ws = await NativeWorldStateService.new(rollupAddress, dataDir, defaultDBMapSize); - await expect( - ws.getCommitted().findLeafIndex(MerkleTreeId.NOTE_HASH_TREE, block.body.txEffects[0].noteHashes[0]), - ).resolves.toBeUndefined(); + await expect(findLeafIndex(block.body.txEffects[0].noteHashes[0], ws)).resolves.toBeUndefined(); const status = await ws.getStatusSummary(); expect(status.unfinalisedBlockNumber).toBe(0n); await ws.close(); @@ -490,6 +492,43 @@ describe('NativeWorldState', () => { }); }); + describe('finding leaves', () => { + let block: L2Block; + let messages: Fr[]; + + it('retrieves leaf indices', async () => { + const ws = await NativeWorldStateService.new(rollupAddress, dataDir, defaultDBMapSize); + const numBlocks = 2; + const txsPerBlock = 2; + const noteHashes: Fr[] = []; + for (let i = 0; i < numBlocks; i++) { + const fork = await ws.fork(); + ({ block, messages } = await mockBlock(1, txsPerBlock, fork)); + noteHashes.push(...block.body.txEffects.flatMap(x => x.noteHashes.flatMap(x => x))); + await fork.close(); + await ws.handleL2BlockAndMessages(block, messages); + } + + const leavesToRequest: Fr[] = [ + noteHashes[0], + Fr.random(), + noteHashes[45], + noteHashes[89], + Fr.random(), + noteHashes[102], + ]; + const expectedIndices = [0n, undefined, 45n, 89n, undefined, 102n]; + const indices = await ws.getCommitted().findLeafIndices(MerkleTreeId.NOTE_HASH_TREE, leavesToRequest); + expect(indices).toEqual(expectedIndices); + + const expectedIndicesAfter = [undefined, undefined, undefined, 89n, undefined, 102n]; + const indicesAfter = await ws + .getCommitted() + .findLeafIndicesAfter(MerkleTreeId.NOTE_HASH_TREE, leavesToRequest, 89n); + expect(indicesAfter).toEqual(expectedIndicesAfter); + }); + }); + describe('block numbers for indices', () => { let block: L2Block; let messages: Fr[]; diff --git a/yarn-project/world-state/src/native/native_world_state.ts b/yarn-project/world-state/src/native/native_world_state.ts index b7a996470e3..332a22008be 100644 --- a/yarn-project/world-state/src/native/native_world_state.ts +++ b/yarn-project/world-state/src/native/native_world_state.ts @@ -136,7 +136,8 @@ export class NativeWorldStateService implements MerkleTreeDatabase { // the initial header _must_ be the first element in the archive tree // if this assertion fails, check that the hashing done in Header in yarn-project matches the initial header hash done in world_state.cpp - const initialHeaderIndex = await committed.findLeafIndex(MerkleTreeId.ARCHIVE, this.initialHeader.hash()); + const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [this.initialHeader.hash()]); + const initialHeaderIndex = indices[0]; assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state'); } diff --git a/yarn-project/world-state/src/native/native_world_state_instance.ts b/yarn-project/world-state/src/native/native_world_state_instance.ts index d36c39740c7..4c91b95664a 100644 --- a/yarn-project/world-state/src/native/native_world_state_instance.ts +++ b/yarn-project/world-state/src/native/native_world_state_instance.ts @@ -180,17 +180,6 @@ export class NativeWorldState implements NativeWorldStateInstance { data['blockHeaderHash'] = '0x' + body.blockHeaderHash.toString('hex'); } - if ('leaf' in body) { - if (Buffer.isBuffer(body.leaf)) { - data['leaf'] = '0x' + body.leaf.toString('hex'); - } else if ('slot' in body.leaf) { - data['slot'] = '0x' + body.leaf.slot.toString('hex'); - data['value'] = '0x' + body.leaf.value.toString('hex'); - } else { - data['nullifier'] = '0x' + body.leaf.value.toString('hex'); - } - } - if ('leaves' in body) { data['leavesCount'] = body.leaves.length; } diff --git a/yarn-project/world-state/src/synchronizer/instrumentation.ts b/yarn-project/world-state/src/synchronizer/instrumentation.ts index 93fc76823ce..a57ae79fe86 100644 --- a/yarn-project/world-state/src/synchronizer/instrumentation.ts +++ b/yarn-project/world-state/src/synchronizer/instrumentation.ts @@ -15,7 +15,7 @@ export class WorldStateInstrumentation { private dbNumItems: Gauge; private dbUsedSize: Gauge; - constructor(telemetry: TelemetryClient, private log = createLogger('world-state:instrumentation')) { + constructor(public readonly telemetry: TelemetryClient, private log = createLogger('world-state:instrumentation')) { const meter = telemetry.getMeter('World State'); this.dbMapSize = meter.createGauge(`aztec.world_state.db_map_size`, { description: `The current configured map size for each merkle tree`, diff --git a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts index 901dcb96229..c43ce6e8bde 100644 --- a/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts +++ b/yarn-project/world-state/src/synchronizer/server_world_state_synchronizer.ts @@ -3,7 +3,7 @@ import { type L2Block, type L2BlockId, type L2BlockSource, - L2BlockStream, + type L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler, type L2BlockStreamLocalDataProvider, @@ -23,7 +23,7 @@ import { createLogger } from '@aztec/foundation/log'; import { promiseWithResolvers } from '@aztec/foundation/promise'; import { elapsed } from '@aztec/foundation/timer'; import { SHA256Trunc } from '@aztec/merkle-tree'; -import { type TelemetryClient } from '@aztec/telemetry-client'; +import { type TelemetryClient, TraceableL2BlockStream } from '@aztec/telemetry-client'; import { type WorldStateStatusFull } from '../native/message.js'; import { type MerkleTreeAdminDatabase } from '../world-state-db/merkle_tree_db.js'; @@ -110,8 +110,10 @@ export class ServerWorldStateSynchronizer return this.syncPromise.promise; } - protected createBlockStream() { - return new L2BlockStream(this.l2BlockSource, this, this, createLogger('world_state:block_stream'), { + protected createBlockStream(): L2BlockStream { + const tracer = this.instrumentation.telemetry.getTracer('WorldStateL2BlockStream'); + const logger = createLogger('world-state:block_stream'); + return new TraceableL2BlockStream(this.l2BlockSource, this, this, tracer, 'WorldStateL2BlockStream', logger, { proven: this.config.worldStateProvenBlocksOnly, pollIntervalMS: this.config.worldStateBlockCheckIntervalMS, batchSize: this.config.worldStateBlockRequestBatchSize, diff --git a/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts b/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts index 69f01189aef..c4900241a62 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_tree_operations_facade.ts @@ -110,8 +110,11 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations * @param value - The leaf value to look for. * @returns The index of the first leaf found with a given value (undefined if not found). */ - findLeafIndex(treeId: ID, value: MerkleTreeLeafType): Promise { - return this.trees.findLeafIndex(treeId, value, this.includeUncommitted); + findLeafIndices( + treeId: ID, + values: MerkleTreeLeafType[], + ): Promise<(bigint | undefined)[]> { + return Promise.all(values.map(leaf => this.trees.findLeafIndex(treeId, leaf, this.includeUncommitted))); } /** @@ -120,12 +123,14 @@ export class MerkleTreeReadOperationsFacade implements MerkleTreeWriteOperations * @param value - The value to search for in the tree. * @param startIndex - The index to start searching from (used when skipping nullified messages) */ - findLeafIndexAfter( + findLeafIndicesAfter( treeId: ID, - value: MerkleTreeLeafType, + values: MerkleTreeLeafType[], startIndex: bigint, - ): Promise { - return this.trees.findLeafIndexAfter(treeId, value, startIndex, this.includeUncommitted); + ): Promise<(bigint | undefined)[]> { + return Promise.all( + values.map(leaf => this.trees.findLeafIndexAfter(treeId, leaf, startIndex, this.includeUncommitted)), + ); } /** diff --git a/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts b/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts index 5e703e9c313..498375a64ea 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_tree_snapshot_operations_facade.ts @@ -40,20 +40,23 @@ export class MerkleTreeSnapshotOperationsFacade implements MerkleTreeReadOperati return this.#treeSnapshots[treeId]!; } - async findLeafIndex(treeId: ID, value: MerkleTreeLeafType): Promise { + async findLeafIndices( + treeId: ID, + values: MerkleTreeLeafType[], + ): Promise<(bigint | undefined)[]> { const tree = await this.#getTreeSnapshot(treeId); // TODO #5448 fix "as any" - return tree.findLeafIndex(value as any); + return values.map(leaf => tree.findLeafIndex(leaf as any)); } - async findLeafIndexAfter( + async findLeafIndicesAfter( treeId: MerkleTreeId, - value: MerkleTreeLeafType, + values: MerkleTreeLeafType[], startIndex: bigint, - ): Promise { + ): Promise<(bigint | undefined)[]> { const tree = await this.#getTreeSnapshot(treeId); // TODO #5448 fix "as any" - return tree.findLeafIndexAfter(value as any, startIndex); + return values.map(leaf => tree.findLeafIndexAfter(leaf as any, startIndex)); } async getLeafPreimage( diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 2a4d38a760d..3bc9084e506 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -285,6 +285,7 @@ __metadata: version: 0.0.0-use.local resolution: "@aztec/bb-prover@workspace:bb-prover" dependencies: + "@aztec/bb.js": "portal:../../barretenberg/ts" "@aztec/circuit-types": "workspace:^" "@aztec/circuits.js": "workspace:^" "@aztec/ethereum": "workspace:^" @@ -306,6 +307,7 @@ __metadata: commander: ^12.1.0 jest: ^29.5.0 jest-mock-extended: ^3.0.3 + pako: ^2.1.0 source-map-support: ^0.5.21 ts-node: ^10.9.1 tslib: ^2.4.0 @@ -321,7 +323,7 @@ __metadata: resolution: "@aztec/bb.js@portal:../barretenberg/ts::locator=%40aztec%2Faztec3-packages%40workspace%3A." dependencies: comlink: ^4.4.1 - commander: ^10.0.1 + commander: ^12.1.0 debug: ^4.3.4 fflate: ^0.8.0 pako: ^2.1.0 @@ -343,6 +345,7 @@ __metadata: "@aztec/foundation": "workspace:^" "@aztec/noir-contracts.js": "workspace:^" "@aztec/protocol-contracts": "workspace:^" + "@aztec/telemetry-client": "workspace:^" "@aztec/types": "workspace:^" "@jest/globals": ^29.5.0 "@types/jest": ^29.5.0 @@ -550,7 +553,6 @@ __metadata: "@aztec/world-state": "workspace:^" "@jest/globals": ^29.5.0 "@noble/curves": ^1.0.0 - "@sinonjs/fake-timers": ^13.0.5 "@swc/core": ^1.4.11 "@swc/jest": ^0.2.36 "@types/fs-extra": ^11.0.2 @@ -691,6 +693,7 @@ __metadata: "@typescript-eslint/eslint-plugin": ^6.2.1 "@typescript-eslint/parser": ^6.2.1 bn.js: ^5.2.1 + c-kzg: 4.0.0-alpha.1 colorette: ^2.0.20 comlink: ^4.4.1 debug: ^4.3.4 @@ -876,6 +879,7 @@ __metadata: "@aztec/kv-store": "workspace:^" "@aztec/merkle-tree": "workspace:^" "@aztec/types": "workspace:^" + "@iarna/toml": ^2.2.5 "@jest/globals": ^29.5.0 "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js" "@noir-lang/noir_codegen": "portal:../../noir/packages/noir_codegen" @@ -1236,6 +1240,7 @@ __metadata: version: 0.0.0-use.local resolution: "@aztec/telemetry-client@workspace:telemetry-client" dependencies: + "@aztec/circuit-types": "workspace:^" "@aztec/foundation": "workspace:^" "@jest/globals": ^29.5.0 "@opentelemetry/api": ^1.9.0 @@ -4251,24 +4256,6 @@ __metadata: languageName: node linkType: hard -"@puppeteer/browsers@npm:2.2.3": - version: 2.2.3 - resolution: "@puppeteer/browsers@npm:2.2.3" - dependencies: - debug: 4.3.4 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.4.0 - semver: 7.6.0 - tar-fs: 3.0.5 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - bin: - browsers: lib/cjs/main-cli.js - checksum: 44d496e2c4d717e472b40473fd916b1aa3b1a6024b9e4f571ca1521172ae38d090b5f331ccc6694593f41eb0b667865d72e4c9bc29d6a705a369ade53dacbd5c - languageName: node - linkType: hard - "@puppeteer/browsers@npm:2.3.0": version: 2.3.0 resolution: "@puppeteer/browsers@npm:2.3.0" @@ -4287,9 +4274,9 @@ __metadata: languageName: node linkType: hard -"@puppeteer/browsers@npm:2.4.1": - version: 2.4.1 - resolution: "@puppeteer/browsers@npm:2.4.1" +"@puppeteer/browsers@npm:2.5.0": + version: 2.5.0 + resolution: "@puppeteer/browsers@npm:2.5.0" dependencies: debug: ^4.3.7 extract-zip: ^2.0.1 @@ -4301,7 +4288,7 @@ __metadata: yargs: ^17.7.2 bin: browsers: lib/cjs/main-cli.js - checksum: 1e8193ae4ad84cf5a4f1ad59abe92f77a8ba4a902670f8a54002b9b772bf4df081de9e2ccb47efc465c31a0c6a649cbf7b7be8318f9fd3a6af466836b6835327 + checksum: 3974f11389638cf2b10748a12741ad572a1e8c9a7f3a6af8eb6b2356251a0a613595f8154e30b328eea65ec3b243b980f4d7cb43c643e413075edffc38478397 languageName: node linkType: hard @@ -4535,7 +4522,7 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^3.0.0, @sinonjs/commons@npm:^3.0.1": +"@sinonjs/commons@npm:^3.0.0": version: 3.0.1 resolution: "@sinonjs/commons@npm:3.0.1" dependencies: @@ -4553,15 +4540,6 @@ __metadata: languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^13.0.5": - version: 13.0.5 - resolution: "@sinonjs/fake-timers@npm:13.0.5" - dependencies: - "@sinonjs/commons": ^3.0.1 - checksum: b1c6ba87fadb7666d3aa126c9e8b4ac32b2d9e84c9e5fd074aa24cab3c8342fd655459de014b08e603be1e6c24c9f9716d76d6d2a36c50f59bb0091be61601dd - languageName: node - linkType: hard - "@swc/core-darwin-arm64@npm:1.5.5": version: 1.5.5 resolution: "@swc/core-darwin-arm64@npm:1.5.5" @@ -7699,6 +7677,17 @@ __metadata: languageName: node linkType: hard +"c-kzg@npm:4.0.0-alpha.1": + version: 4.0.0-alpha.1 + resolution: "c-kzg@npm:4.0.0-alpha.1" + dependencies: + bindings: ^1.5.0 + node-addon-api: ^5.0.0 + node-gyp: latest + checksum: abb07eb3e253ea10aef4ce3a04090f9940de4f3ffa8ef19de9bff8cae1d6bc0aa80d716d998b72d46365f6565445d89592e303fd0951f8ebe8a4d233912dd66f + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.3 resolution: "cacache@npm:18.0.3" @@ -7994,19 +7983,6 @@ __metadata: languageName: node linkType: hard -"chromium-bidi@npm:0.5.19": - version: 0.5.19 - resolution: "chromium-bidi@npm:0.5.19" - dependencies: - mitt: 3.0.1 - urlpattern-polyfill: 10.0.0 - zod: 3.22.4 - peerDependencies: - devtools-protocol: "*" - checksum: aec876416dc856150c2fe4af1eb0328497c6859af8f9e5be0e0275435d7c0996654bfff68ea1fcd6125bf605957f16ad431c1961f47897542f0cb927ceb93e31 - languageName: node - linkType: hard - "chromium-bidi@npm:0.6.3": version: 0.6.3 resolution: "chromium-bidi@npm:0.6.3" @@ -8642,7 +8618,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: @@ -9037,7 +9013,7 @@ __metadata: 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": +"debug@npm: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" dependencies: @@ -9554,13 +9530,6 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.1273771": - version: 0.0.1273771 - resolution: "devtools-protocol@npm:0.0.1273771" - checksum: 2a88694ec0f2f167f826cea8c3d6030ede911c2db79d2a62d76d1be450bcb395e8283ca03f225fa308710ab06182dced47eed8cece56b377d1946403a321b64f - languageName: node - linkType: hard - "devtools-protocol@npm:0.0.1312386": version: 0.0.1312386 resolution: "devtools-protocol@npm:0.0.1312386" @@ -10737,7 +10706,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: @@ -14200,15 +14169,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - "lru-cache@npm:^7.14.1": version: 7.18.3 resolution: "lru-cache@npm:7.18.3" @@ -15152,6 +15112,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: latest + checksum: 2508bd2d2981945406243a7bd31362fc7af8b70b8b4d65f869c61731800058fb818cc2fd36c8eac714ddd0e568cc85becf5e165cebbdf7b5024d5151bbc75ea1 + languageName: node + linkType: hard + "node-addon-api@npm:^6.1.0": version: 6.1.0 resolution: "node-addon-api@npm:6.1.0" @@ -16326,7 +16295,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 @@ -16404,7 +16373,7 @@ __metadata: languageName: node linkType: hard -"proxy-agent@npm:6.4.0, proxy-agent@npm:^6.4.0": +"proxy-agent@npm:^6.4.0": version: 6.4.0 resolution: "proxy-agent@npm:6.4.0" dependencies: @@ -16500,48 +16469,21 @@ __metadata: languageName: node linkType: hard -"puppeteer-core@npm:22.8.0": - version: 22.8.0 - resolution: "puppeteer-core@npm:22.8.0" - dependencies: - "@puppeteer/browsers": 2.2.3 - chromium-bidi: 0.5.19 - debug: 4.3.4 - devtools-protocol: 0.0.1273771 - ws: 8.17.0 - checksum: f4250c87c09eb9c73d737ccf08e548babd57e749c9bfc241a7251f2e5e5f3ef2bf3dcb99b7b606763db3a914c866c97cc6714961900566280414b0fad5a330a8 - languageName: node - linkType: hard - "puppeteer-core@npm:^23.2.0": - version: 23.9.0 - resolution: "puppeteer-core@npm:23.9.0" + version: 23.10.1 + resolution: "puppeteer-core@npm:23.10.1" dependencies: - "@puppeteer/browsers": 2.4.1 + "@puppeteer/browsers": 2.5.0 chromium-bidi: 0.8.0 debug: ^4.3.7 devtools-protocol: 0.0.1367902 typed-query-selector: ^2.12.0 ws: ^8.18.0 - checksum: 0195e3422eee84d0645e8b5f2bcd33a304cb54378bf6a5c9f2a020a59c1435e502987fdbe2766864b7cddb1732d8a27524023c75fbba83c8d2ed9b5209bb931b + checksum: 03630c94a91e3f35810a5eeafc18e44616e49e9d01ca298c60c51f7904ae2d44a44060507848734a2a2cd720b84c01c1b922537a224ac306ca39d6ca4704911b languageName: node linkType: hard -"puppeteer@npm:^22.2": - version: 22.8.0 - resolution: "puppeteer@npm:22.8.0" - dependencies: - "@puppeteer/browsers": 2.2.3 - cosmiconfig: 9.0.0 - devtools-protocol: 0.0.1273771 - puppeteer-core: 22.8.0 - bin: - puppeteer: lib/esm/puppeteer/node/cli.js - checksum: da4855a71b6355e96196b9838fc255fa39f6bdd09cb0b9a6d3cfc377ba839eecef01e40ad7bbff48ef17a5784266bfac5dbf94e1b298f447ce8983f72ff90185 - languageName: node - linkType: hard - -"puppeteer@npm:^22.4.1": +"puppeteer@npm:^22.2, puppeteer@npm:^22.4.1": version: 22.15.0 resolution: "puppeteer@npm:22.15.0" dependencies: @@ -17356,17 +17298,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.0": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c - languageName: node - linkType: hard - "semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -18432,23 +18363,6 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:3.0.5": - version: 3.0.5 - resolution: "tar-fs@npm:3.0.5" - 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: e31c7e3e525fec0afecdec1cac58071809e396187725f2eba442f08a4c5649c8cd6b7ce25982f9a91bb0f055628df47c08177dd2ea4f5dafd3c22f42f8da8f00 - languageName: node - linkType: hard - "tar-fs@npm:^3.0.6": version: 3.0.6 resolution: "tar-fs@npm:3.0.6" @@ -19256,7 +19170,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: @@ -20044,33 +19958,33 @@ __metadata: languageName: node linkType: hard -"ws@npm:8.17.0, ws@npm:^8.13.0": - version: 8.17.0 - resolution: "ws@npm:8.17.0" +"ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: ^5.0.2 peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 147ef9eab0251364e1d2c55338ad0efb15e6913923ccbfdf20f7a8a6cb8f88432bcd7f4d8f66977135bfad35575644f9983201c1a361019594a4e53977bf6d4e + checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb languageName: node linkType: hard -"ws@npm:^7.5.10": - version: 7.5.10 - resolution: "ws@npm:7.5.10" +"ws@npm:^8.13.0": + version: 8.17.0 + resolution: "ws@npm:8.17.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb + checksum: 147ef9eab0251364e1d2c55338ad0efb15e6913923ccbfdf20f7a8a6cb8f88432bcd7f4d8f66977135bfad35575644f9983201c1a361019594a4e53977bf6d4e languageName: node linkType: hard @@ -20169,33 +20083,33 @@ __metadata: languageName: node linkType: hard -"yargs@npm:17.7.2, yargs@npm:^17.3.1, yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" dependencies: - cliui: ^8.0.1 + cliui: ^7.0.2 escalade: ^3.1.1 get-caller-file: ^2.0.5 require-directory: ^2.1.1 - string-width: ^4.2.3 + string-width: ^4.2.0 y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a + yargs-parser: ^20.2.2 + checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 languageName: node linkType: hard -"yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" +"yargs@npm:^17.3.1, yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: - cliui: ^7.0.2 + cliui: ^8.0.1 escalade: ^3.1.1 get-caller-file: ^2.0.5 require-directory: ^2.1.1 - string-width: ^4.2.0 + string-width: ^4.2.3 y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a languageName: node linkType: hard @@ -20237,13 +20151,6 @@ __metadata: languageName: node linkType: hard -"zod@npm:3.22.4": - version: 3.22.4 - resolution: "zod@npm:3.22.4" - checksum: 80bfd7f8039b24fddeb0718a2ec7c02aa9856e4838d6aa4864335a047b6b37a3273b191ef335bf0b2002e5c514ef261ffcda5a589fb084a48c336ffc4cdbab7f - languageName: node - linkType: hard - "zod@npm:3.23.8, zod@npm:^3.23.8": version: 3.23.8 resolution: "zod@npm:3.23.8"