diff --git a/agent/flow-trace/00_INDEX.md b/agent/flow-trace/00_INDEX.md index 2f140a9d2..55f32699b 100644 --- a/agent/flow-trace/00_INDEX.md +++ b/agent/flow-trace/00_INDEX.md @@ -187,6 +187,14 @@ _Found during source-code cross-referencing of these trace documents._ | 9 | `_validateNodeEligibility` calls `bondingRegistry.getTicketBalanceAtBlock()` (not `ticketToken.getPastVotes()` directly). | CiphernodeRegistryOwnable.sol:668 | 03_E3_REQUEST | | 10 | Lane A slashing uses **attestation-based** verification (committee quorum votes), not direct ZK proof re-verification on-chain. `proposeSlash()` decodes voter addresses, agrees, data hashes, and ECDSA signatures — not ZK proofs. | SlashingManager.sol | 05_FAILURE | +### Circuit Audit Remediations + +| Finding | Status | Implemented behavior | +| ----------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **IF-001 — unconstrained U64 modular division** | Fixed | `ModU64::div_mod` verifies the hinted quotient satisfies `result * divisor == dividend (mod modulus)`; the Noir suite includes a non-invertible-divisor regression test. | +| **IF-002 — conditional C7 decoding equality** | Fixed | C7 compares every decoded coefficient with the claimed message, including zero coefficients; a focused regression test rejects a nonzero decoded value claimed as zero. | +| **IF-003 — decryption proof phase and party binding** | Fixed | `decryption_aggregator` requires 1-indexed, strictly increasing party IDs, while `BfvDecryptionVerifier` checks the surfaced SK/ESM commitments against the E3's registry-backed DKG anchors. | + ### Protocol Design Concerns | # | Concern | Severity | Detail | @@ -224,4 +232,4 @@ _Found during source-code cross-referencing of these trace documents._ | 31 | **Fault-attributed, token-aware failure settlement (AUD H-01)** | Resolved | `FailureReason` is exhaustively classified as requester-side or supplier/ciphernode-side. Requester/DP/CP failures pay completed work from the request-time fee allocation. Supplier/ciphernode failures return 100% of fee escrow with no protocol cut; honest nodes are compensated only from actual ticket slashes. Slash assets retain their ERC-20 denomination in independent pull claims, so no oracle conversion or relabeling occurs. Failure-triggering slash policies must expel the faulty operator before honest recipients are resolved. | | 32 | **Proof-disabled publication bypass (AUD C-02)** | Fixed | E3 requests no longer carry a proof-aggregation switch and both final verifier calls are mandatory. Only binaries compiled with the `test-only-skip-proof-aggregation` Cargo feature can honor the ciphernode `skip_proof_aggregation` test/CI setting; production builds reject it. Feature-gated test nodes use non-empty C5/C7 placeholders accepted by mock deployments, while production verifiers reject those placeholders. | | 33 | **Client public-key commitment binding (AUD C-01)** | Resolved | Serialized public-key event bytes are treated as an untrusted transport hint. Rust indexers decode the key and store it only when its recomputed circuit commitment equals the on-chain value; the TypeScript SDK exposes the event commitment and a semantic validator, which the default app runs before encryption. Calldata substitution therefore cannot become a different first-party client encryption key. The commitment itself is C5-proven by the mandatory final DKG proof. | -| 34 | **Cross-E3 decryption-proof replay (AUD C-03)** | Resolved | Every secret-bearing C6 proof commits to a domain over `(chainId, Interfold address, e3Id, committeeHash, ciphertextOutputHash, committeePublicKey)`. C6 folding requires one common domain, the final DecryptionAggregator proof exposes it, and the BFV wrapper rejects any domain that differs from the value recomputed by `Interfold`. This prevents cross-chain, cross-deployment, cross-E3, cross-committee, cross-ciphertext, and cross-key replay without a global consumed-proof storage ledger. | +| 34 | **Cross-E3 decryption-proof replay (AUD C-03)** | Resolved | Every secret-bearing C6 proof commits to a domain over `(chainId, Interfold address, e3Id, committeeHash, ciphertextOutputHash, committeePublicKey)`. C6 folding requires one common domain, the final DecryptionAggregator proof exposes it, and the BFV wrapper rejects any domain that differs from the value recomputed by `Interfold`. The wrapper also receives `e3Id` separately and checks each proof party's SK/ESM commitments against the registry's stored DKG anchors. This prevents cross-chain, cross-deployment, cross-E3, cross-committee, cross-ciphertext, and cross-key replay without a global consumed-proof storage ledger. | diff --git a/agent/flow-trace/04_DKG_AND_COMPUTATION.md b/agent/flow-trace/04_DKG_AND_COMPUTATION.md index e05d56ae4..2e177c3f7 100644 --- a/agent/flow-trace/04_DKG_AND_COMPUTATION.md +++ b/agent/flow-trace/04_DKG_AND_COMPUTATION.md @@ -414,7 +414,8 @@ ShareVerificationActor receives ShareVerificationDispatched(kind=ShareProofs) │ │ │ C4a→C6 (SameParty): C4a's commitment == C6's expected_sk_commitment │ │ │ C4b→C6 (SameParty): C4b's commitment == C6's expected_e_sm_commitment │ │ │ C6→C7 (CrossParty): C6's d_commitment matches C7's expected_d_commitment -│ │ │ (on-chain / E3 state) C3 `ct_commitment` output and C6 `ct_commitment` input bind to the same ciphertext as user_data_encryption (not a CommitmentLink row) +│ │ │ (on-chain / E3 state) C3/C6 ciphertext commitments are checked against their ciphertext witnesses off-chain; +│ │ │ the final EVM proof does not yet expose a ciphertext commitment for comparison with `keccak256(e3.ciphertextOutput)` │ │ │ │ │ ├─ On mismatch: publishes CommitmentConsistencyViolation │ │ │ → AccusationManager initiates accusation quorum (see Part 5) @@ -702,6 +703,15 @@ on-chain; the explicit test/CI skip mode works only with mock verifiers that tru > zero/EOA circuit-verifier addresses and zero recursive VK hashes. Production deployment tooling > additionally compares the immutable VK hashes with the version-controlled circuit artifacts. +The decryption wrapper exposes +`verify(e3Id, decryptionDomain, plaintextOutputHash, committeeHash, proof)`. `Interfold` recomputes +`decryptionDomain` over +`(chainId, Interfold address, e3Id, committeeHash, ciphertextOutputHash, committeePublicKey)`. The +wrapper checks the domain limbs in the final proof, then uses the separate `e3Id` to resolve the +registry's stored DKG anchors and compares every surfaced party ID, secret-key commitment, and +smudging-noise commitment. The party IDs are circuit-side 1-indexed Shamir coordinates and are +translated to the registry's 0-indexed committee slots for this comparison. + --- ## Phase 3: Encrypted Computation @@ -896,6 +906,8 @@ InterfoldSolReader decodes CiphertextOutputPublished event │ │ │ inside `DecryptionAggregator` │ │ ├─ `DecryptionAggregator` exposes that C6-authenticated domain as two public │ │ │ 128-bit limbs in the final EVM proof +│ │ ├─ `DecryptionAggregator` requires 1-indexed, strictly increasing party IDs; +│ │ │ zero, out-of-range, and duplicate reconstruction slots are rejected │ │ ├─ Tracks the in-flight correlation id │ │ ├─ ComputeRequestError, missing C6 inner proofs, or C7/decryption-aggregator proof-count │ │ │ mismatches now emit @@ -927,12 +939,14 @@ InterfoldSolReader decodes CiphertextOutputPublished event │ │ committeeHash, ciphertextOutput, │ │ │ committeePublicKey │ │ │ )), then call decryptionVerifier.verify( │ - │ │ decryptionDomain, keccak256(output), │ + │ │ e3Id, decryptionDomain, keccak256(output), │ │ │ committeeHash, proof │ │ │ ) │ │ │ → C-03: final proof domain must match the │ │ │ domain already committed by every C6 leaf. │ - │ │ → M-34: c6Fold / C7 VK hashes are immutable. │ + │ │ → IF-003: e3Id resolves stored DKG anchors; │ + │ │ │ proof party IDs and SK/ESM commitments match.│ + │ │ → M-34: c6Fold / C7 VK hashes are immutable. │ │ │ → M-35: revert path only (no `bool false`). │ │ │ 4. stage = Complete │ │ │ 5. _distributeRewards(e3Id) │ diff --git a/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md b/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md index 8ab1a5eaa..6e7b8411d 100644 --- a/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md +++ b/agent/flow-trace/06_DEACTIVATION_AND_COMPLETION.md @@ -504,12 +504,12 @@ GOVERNANCE lifts ban: ## Cluster 6 Audit Addendum (deregistration & bans) -- **Collateral exit is blocked while a slash is open** (H-05, AUD H-03). - `BondingRegistry` checks `hasOpenSlashProposal(operator)` on every authorized current or retained - historical manager and reverts `OperatorUnderSlash()` from ticket withdrawal, license unbonding, - deregistration, and exit claims. Execution, an upheld appeal, or permissionless appeal expiry - unwinds the counter. After manager rotation, governance must retain the old manager until every - E3 and proposal that depends on it is terminal, then explicitly revoke it. +- **Collateral exit is blocked while a slash is open** (H-05, AUD H-03). `BondingRegistry` checks + `hasOpenSlashProposal(operator)` on every authorized current or retained historical manager and + reverts `OperatorUnderSlash()` from ticket withdrawal, license unbonding, deregistration, and exit + claims. Execution, an upheld appeal, or permissionless appeal expiry unwinds the counter. After + manager rotation, governance must retain the old manager until every E3 and proposal that depends + on it is terminal, then explicitly revoke it. - **Two-step ban** (M-14, M-15): bans now require `proposeBan` → `confirmBan` from a **distinct** signer holding `GOVERNANCE_ROLE`. `cancelBan` rescinds an unconfirmed proposal. Legacy direct-set diff --git a/circuits/benchmarks/results_insecure_minimum/crisp_verify_gas.json b/circuits/benchmarks/results_insecure_minimum/crisp_verify_gas.json index 677e7aa88..6f0d86e50 100644 --- a/circuits/benchmarks/results_insecure_minimum/crisp_verify_gas.json +++ b/circuits/benchmarks/results_insecure_minimum/crisp_verify_gas.json @@ -1,8 +1,8 @@ { "verify_gas": { - "dkg": 3119529, - "user": 2973001, - "dec": 3641094 + "dkg": 3119505, + "user": null, + "dec": 3672202 }, "source": "folded_proof_export_plus_crisp_verify_test", "artifact_sizes_bytes": { @@ -12,19 +12,19 @@ }, "dec": { "proof": 10944, - "public_inputs": 3552 + "public_inputs": 3616 } }, "calldata_gas": { "dkg": { - "proof": 170052, + "proof": 170028, "public_inputs": 4992, - "total": 175044 + "total": 175020 }, "dec": { - "proof": 170064, - "public_inputs": 17304, - "total": 187368 + "proof": 169944, + "public_inputs": 17956, + "total": 187900 } }, "integration_summary": { @@ -47,61 +47,61 @@ "dkg_fold_attestation_verifier": "0x7969c5eD335650692Bc04293B07F5BF2e7A673C0", "multithread": { "rayon_threads": 13, "max_simultaneous_rayon_tasks": 13, "cores_available": 14 }, "operation_timings": [ - { "name": "CalculateDecryptionKey", "avg_seconds": 0.003846458, "runs": 3, "total_seconds": 0.011539375 }, - { "name": "CalculateDecryptionShare", "avg_seconds": 0.021596236, "runs": 3, "total_seconds": 0.064788708 }, - { "name": "CalculateThresholdDecryption", "avg_seconds": 0.021793167, "runs": 1, "total_seconds": 0.021793167 }, - { "name": "GenEsiSss", "avg_seconds": 0.006900819, "runs": 3, "total_seconds": 0.020702458 }, - { "name": "GenPkShareAndSkSss", "avg_seconds": 0.01082625, "runs": 3, "total_seconds": 0.03247875 }, - { "name": "NodeDkgFold/c2ab_fold", "avg_seconds": 18.129162805, "runs": 3, "total_seconds": 54.387488416 }, - { "name": "NodeDkgFold/c3a_fold", "avg_seconds": 71.186463291, "runs": 3, "total_seconds": 213.559389875 }, - { "name": "NodeDkgFold/c3ab_fold", "avg_seconds": 7.876658916, "runs": 3, "total_seconds": 23.62997675 }, - { "name": "NodeDkgFold/c3b_fold", "avg_seconds": 70.951759472, "runs": 3, "total_seconds": 212.855278417 }, - { "name": "NodeDkgFold/c4ab_fold", "avg_seconds": 7.872269472, "runs": 3, "total_seconds": 23.616808416 }, - { "name": "NodeDkgFold/node_fold", "avg_seconds": 18.285537124, "runs": 3, "total_seconds": 54.856611374 }, - { "name": "ZkDecryptedSharesAggregation", "avg_seconds": 1.53384025, "runs": 1, "total_seconds": 1.53384025 }, - { "name": "ZkDecryptionAggregation", "avg_seconds": 46.886299625, "runs": 1, "total_seconds": 46.886299625 }, - { "name": "ZkDkgAggregation", "avg_seconds": 5.350731209, "runs": 1, "total_seconds": 5.350731209 }, - { "name": "ZkDkgShareDecryption", "avg_seconds": 1.001284562, "runs": 6, "total_seconds": 6.007707375 }, - { "name": "ZkNodeDkgFold", "avg_seconds": 105.400482805, "runs": 3, "total_seconds": 316.201448416 }, - { "name": "ZkNodesFoldStep", "avg_seconds": 5.041216854, "runs": 2, "total_seconds": 10.082433708 }, - { "name": "ZkPkAggregation", "avg_seconds": 0.408154917, "runs": 1, "total_seconds": 0.408154917 }, - { "name": "ZkPkBfv", "avg_seconds": 0.217929541, "runs": 3, "total_seconds": 0.653788625 }, - { "name": "ZkPkGeneration", "avg_seconds": 2.247310694, "runs": 3, "total_seconds": 6.741932083 }, - { "name": "ZkShareComputation", "avg_seconds": 2.368657458, "runs": 6, "total_seconds": 14.211944749 }, - { "name": "ZkShareEncryption", "avg_seconds": 4.003050597, "runs": 24, "total_seconds": 96.073214335 }, - { "name": "ZkThresholdShareDecryption", "avg_seconds": 3.246631902, "runs": 3, "total_seconds": 9.739895708 }, - { "name": "ZkVerifyShareDecryptionProofs", "avg_seconds": 0.082421444, "runs": 3, "total_seconds": 0.247264333 }, - { "name": "ZkVerifyShareProofs", "avg_seconds": 0.253021858, "runs": 5, "total_seconds": 1.265109292 } + { "name": "CalculateDecryptionKey", "avg_seconds": 0.004326667, "runs": 3, "total_seconds": 0.012980001 }, + { "name": "CalculateDecryptionShare", "avg_seconds": 0.022016291, "runs": 3, "total_seconds": 0.066048875 }, + { "name": "CalculateThresholdDecryption", "avg_seconds": 0.020120625, "runs": 1, "total_seconds": 0.020120625 }, + { "name": "GenEsiSss", "avg_seconds": 0.007776041, "runs": 3, "total_seconds": 0.023328125 }, + { "name": "GenPkShareAndSkSss", "avg_seconds": 0.011192708, "runs": 3, "total_seconds": 0.033578125 }, + { "name": "NodeDkgFold/c2ab_fold", "avg_seconds": 18.821508069, "runs": 3, "total_seconds": 56.464524208 }, + { "name": "NodeDkgFold/c3a_fold", "avg_seconds": 73.488805041, "runs": 3, "total_seconds": 220.466415124 }, + { "name": "NodeDkgFold/c3ab_fold", "avg_seconds": 7.851751111, "runs": 3, "total_seconds": 23.555253334 }, + { "name": "NodeDkgFold/c3b_fold", "avg_seconds": 73.173327319, "runs": 3, "total_seconds": 219.519981959 }, + { "name": "NodeDkgFold/c4ab_fold", "avg_seconds": 8.281481527, "runs": 3, "total_seconds": 24.844444583 }, + { "name": "NodeDkgFold/node_fold", "avg_seconds": 18.939945583, "runs": 3, "total_seconds": 56.81983675 }, + { "name": "ZkDecryptedSharesAggregation", "avg_seconds": 1.593031959, "runs": 1, "total_seconds": 1.593031959 }, + { "name": "ZkDecryptionAggregation", "avg_seconds": 49.684318333, "runs": 1, "total_seconds": 49.684318333 }, + { "name": "ZkDkgAggregation", "avg_seconds": 5.735565959, "runs": 1, "total_seconds": 5.735565959 }, + { "name": "ZkDkgShareDecryption", "avg_seconds": 0.948800333, "runs": 6, "total_seconds": 5.692802 }, + { "name": "ZkNodeDkgFold", "avg_seconds": 108.814322347, "runs": 3, "total_seconds": 326.442967043 }, + { "name": "ZkNodesFoldStep", "avg_seconds": 5.313063916, "runs": 2, "total_seconds": 10.626127833 }, + { "name": "ZkPkAggregation", "avg_seconds": 0.29689275, "runs": 1, "total_seconds": 0.29689275 }, + { "name": "ZkPkBfv", "avg_seconds": 0.229513319, "runs": 3, "total_seconds": 0.688539958 }, + { "name": "ZkPkGeneration", "avg_seconds": 3.607771166, "runs": 3, "total_seconds": 10.823313499 }, + { "name": "ZkShareComputation", "avg_seconds": 2.617024506, "runs": 6, "total_seconds": 15.702147041 }, + { "name": "ZkShareEncryption", "avg_seconds": 3.672300166, "runs": 24, "total_seconds": 88.135204 }, + { "name": "ZkThresholdShareDecryption", "avg_seconds": 3.494414028, "runs": 3, "total_seconds": 10.483242084 }, + { "name": "ZkVerifyShareDecryptionProofs", "avg_seconds": 0.082335722, "runs": 3, "total_seconds": 0.247007167 }, + { "name": "ZkVerifyShareProofs", "avg_seconds": 0.244133875, "runs": 5, "total_seconds": 1.220669376 } ], - "operation_timings_total_seconds": 1098.460620331, + "operation_timings_total_seconds": 1129.198340711, "operation_timings_metric": "tracked_job_wall", "phase_timings": [ { "label": "Starting trbfv actor test", "seconds": 0e-9, "metric": "wall_clock" }, - { "label": "Setup completed", "seconds": 0.9476265, "metric": "wall_clock" }, - { "label": "Committee Setup Completed", "seconds": 7.02067775, "metric": "wall_clock" }, - { "label": "Committee Finalization Complete", "seconds": 0.003086, "metric": "wall_clock" }, - { "label": "Aggregator P2: PkAggregation pending -> PublicKeyAggregated (wall)", "seconds": 120.643449, "metric": "wall_clock" }, - { "label": "ThresholdShares -> PublicKeyAggregated", "seconds": 132.69507875, "metric": "wall_clock" }, - { "label": "E3Request -> PublicKeyAggregated", "seconds": 133.201828291, "metric": "wall_clock" }, - { "label": "Application CT Gen", "seconds": 0.009273208, "metric": "wall_clock" }, - { "label": "Running FHE Application", "seconds": 0.000058375, "metric": "wall_clock" }, - { "label": "Aggregator P4: Aggregation pending -> PlaintextAggregated (wall)", "seconds": 48.434143, "metric": "wall_clock" }, - { "label": "Ciphertext published -> PlaintextAggregated", "seconds": 51.995006459, "metric": "wall_clock" }, - { "label": "Entire Test", "seconds": 193.176080792, "metric": "wall_clock" } + { "label": "Setup completed", "seconds": 1.017932541, "metric": "wall_clock" }, + { "label": "Committee Setup Completed", "seconds": 7.022026041, "metric": "wall_clock" }, + { "label": "Committee Finalization Complete", "seconds": 0.001739292, "metric": "wall_clock" }, + { "label": "Aggregator P2: PkAggregation pending -> PublicKeyAggregated (wall)", "seconds": 125.46852, "metric": "wall_clock" }, + { "label": "ThresholdShares -> PublicKeyAggregated", "seconds": 137.630169125, "metric": "wall_clock" }, + { "label": "E3Request -> PublicKeyAggregated", "seconds": 138.13360025, "metric": "wall_clock" }, + { "label": "Application CT Gen", "seconds": 0.009520666, "metric": "wall_clock" }, + { "label": "Running FHE Application", "seconds": 0.000055291, "metric": "wall_clock" }, + { "label": "Aggregator P4: Aggregation pending -> PlaintextAggregated (wall)", "seconds": 51.290023, "metric": "wall_clock" }, + { "label": "Ciphertext published -> PlaintextAggregated", "seconds": 55.067765875, "metric": "wall_clock" }, + { "label": "Entire Test", "seconds": 201.252351625, "metric": "wall_clock" } ], "folded_artifacts": { "dkg_aggregator": { - "proof_hex": "0x000000000000000000000000000000000000000000000001e75e6e6bf316ec7900000000000000000000000000000000000000000000000e5e66538093519ec700000000000000000000000000000000000000000000000ea1d99185bf57a67100000000000000000000000000000000000000000000000000027a81f6b520c100000000000000000000000000000000000000000000000300a975ba6f13dbee000000000000000000000000000000000000000000000004a477a61f80a9e6d100000000000000000000000000000000000000000000000fd219fd84fb4defd70000000000000000000000000000000000000000000000000002fef0aaa80f5700000000000000000000000000000000000000000000000587f4bf0b7f2c5edb00000000000000000000000000000000000000000000000e89f1f317a49cf14f00000000000000000000000000000000000000000000000176869939c2c359c0000000000000000000000000000000000000000000000000000129747f04f15f000000000000000000000000000000000000000000000002d178d9b11de53f8f0000000000000000000000000000000000000000000000009044587fc21f92c1000000000000000000000000000000000000000000000009fdf61347211a781000000000000000000000000000000000000000000000000000008cdfd42e77de1980c43e1a2bdb19cf0131ff4fad06d6f11d7fd3279bd66410f2388c088f70a31e30bb64c3895db6a3301e9be27e79c07a3027013b0e68eb9f15025acf14e1972ecf23db1d3f80e4db8d3a8ce5e61a085775421a4ef5a8e770f626dc0fce3db71d0f0ff62f59bef95993de4ff0fc655fba80d47d6dd49ac6a99222e6b74f833800c35d744198e39965e71b95e55f6b34b670494a4279fb653f46cdce9e7d9e910a06fdd4d860032388619541f32f14d021660e8fa5497b849a703d63a58e930a195f63db46d4043c35c1fc90f21d2251f27e90874b191252eea17c8946d69d060959a597a665f3f225822e7cd537ed3be57beb9ea1ca04fc1baf6135541631ab1500bf70062fecf66545666e5f092e35c6655aa6eaf8d8bf20727575f7fc6c2c26c51b65b1a2161c60550ff91579866608e5f84a22bd9d525db9c3c0910d5a9d257d8b9fb3278bf7e3983384d4569ef101962e973fdc50af677e61249f7659180a6357f6d55ff9c3d0c3ded3bbcb37b1c49d08a76bba3d8ade40e097310dc2d2162b769f4d49f4a18af470a46bbe04ee29c054b4d644f034bed1b330b7f8624916ab19c29d424d52039e2f724aece13e882b30e012c588d515212a73f8539ef1167250177895980aea7471392e3ba028ec0715fae1cf2539f351dcf30b5d48790b4c6789f819bad95e55d1789e239dbd28d7cdcc56ad0bc1359ba6868a569d5d0bee03d62aec658dfd96444f35a5254fb150e5273acc5c643f0c6232b71c27d7109e197faa332c23d8b7c3f590a4a9972c5dc7f072121d62db7e63389c59c03726436b338944ea9825f719c9763ef1c8633e4ba2ee18556f162d735ae3c56d9e09e8ac442f6d947881166eef26a7b6fa538cbd84f3eebe8dbb6853e7399ec4520677fd7801b63bd7fa27430251fa14ea07fc97371a20021362a971be8ff709462c2e2be304a8baf3c6f57cecfb7e2dcb804656a16b3533262110bfd6bb8983cb16f23b3025152a5a67b3ba9d5f073fde73e67ff05ee11a29924d74412cf1555709498cba2023bf4d40d0fdbc85670c51082e006b173761c4183d75815fb12cda2b696fad8923295ae21e8958d220435e0a1b7bed0da50cee047f64c599848aab17beebb6cc9e802e65596603823a70658891f4d5da2d768e5acba89a796f3b8b3034f1a2c01add7ccb7fed20cc7068b76c2738cdc9f4c0cb7b752dba7393173a28f16aafb2f8423dc1c661fe8bfb5339cc45482f1df073b995b7e97f2a6c2a5824adc1dc1cfcdfeb2a64daef86e37da39bc9c8197716f12be4903f3228fbaab02bd7959a5ef295739062e15917703d8fd32f6a2a7c7667561282eb80fdb3fb6b2b123ef2586fd658281d49dca1b320e2b10851631c9b11f42550bf7a0bf737c3005918962545897986fb73a7cfacd6960fdef24f2a08d0d9909425f1b401e0572f6c2d7f7f1b16621e22948e190ffada5611905e724e14031cf80a38fd2431500edd1c857e0d04bfe118ba0e6620899d7e77a2d87d2a74adcca704a1b2c0186526acfe031abc4da8b5acfa7d50b2c69790ebf6c47f70cc3f43c6984704592a4e28316ef07835a8b598db038d52417ec5f81bf7f1b3697f5f1bc45e95a34112300f0b77c2213b2a827c30939cfd9282d84dcaa386c25bee8d7da7ca98b02968b31e1c714facf0d484cf017398d694cc979513571261b7df8c6b2c32a28820004f27df14770753cc82ad82fc23820185c486444867a8080bb57075d9c3cf32e23d1d643fda915e0ad53332c302f5e2804bdc2581874b0104eedc116923256237f41adb04fe2fb7c053b4716f2bbfada9b87cc1b4c22af9b77248e0a26bb622c3521f0e4244c66a7af714d4f840273335d1aa8d2e3159cddfd166e3d567c9268b472dc2d46705f03557130da85c7d69b53de20961e3850b6e8fb8591beaa86d0fd10b765c64e3a18d3a3171538b4a236aa5a0598d8e0678617a8cb90c62c8f941010680b196b8fefd31a1948ffda6faa57093c0e5bdb15ab793644f278ceb0ff43f12090bdafbc4674113de9a445ce1aaa725587a8e3d5aaa1ba49ff4930ec7447e0dbc9bfbdceafd180cfa38214128df7f02b436865f4ab2e5dc449557d5386c301affca4aeac69ec4f8167d8db4ad57d0e4ea4b4e60ac2f62187edfef5efbc7b2009d2829cf84a14526960e56b022d48ede9b144f6440242904da9cacb7f8db180bbed0140d8a53ef6cebbf37bb856bf73bd8fa5317e59044f72aa111b65483550994ca20ca1b0b1236fc724c0863806e5f7382ad322d66b21a8e1756f01ad84504a8c28f257e89a6369320f29a2369a69ea93a8a5afc6781483cbf31c33091a400513cca8308b55905d0cbdb38a453c8db8833cdba8c6ae2ff057fcd60e43a561ddfc683a046f7584dc4e2861eb9fcce302bf211e9693589c6e77a11cccedefb2dd16cf71ac62163775ddb1c3832a7b7ec669461968961ceccb928d387ee35e10a040c3f1cb63e84e1d359e36fe76052c8c44d4c7448e50cdd148dccfd5868a009d8b8e6fb0ca9f7e41ff668cde4ebe82df366177918e950849d8107e9a338c822b015efb43ba64949f8bcb267a544cd2e2485d66cc1525ee4e54f0d3dd0b3221e77b6ca1ad4a95d905c06145fd1a9d2821708e1ae3000e868b4f4707f38af1404d399bb89c3f4d4c4a5730271048b5d96072f147d106ac16cc13f20367e67b8142a20c858c21ee4e5e081ea05813323e4b76020518dd83c4e3eb040aac1ba862a4870e2f07eb53071ef39daa2cd981381a6adc2fe595944b16b8f3f487a870f2dfb23a1114ebbd6a5de16cc1f0fb09af8d174afba1902c520a90117ecb45afc04f60d3d3105d013af7696668a02aa56e31ac9cc3670265bb8a0d2103cfc3d072cc2af914aa524cdbf165a4f3190afc28b5810774e6c6b77669f24c3b35fc3f4119e0006c49411d8ae9918d6c3ff4207bea8185e836c24ba66c4f6c6caea6d341386396dde428fe86014248ef438f5ab688a18dbb82b516e360a706f83e414f119573fe6cc28a0d6d52ec6c133bdfcecfd4e547d43816e6fa064b6d7e93f532825ab2a81e8db45f8efb64ae9972a7cca6a163df9f2033de5a2b79240304f782d2dd93fa04491da05424e25dc8c6cbefcbffae80b6c8e792c0e5f43edc39dd7df23f9d0f14541bafae611a59f5c8aa26e03380b723934162c19a459608d98b347299086598038e2a91c73b7e0782ce39331f6d8512fbe07a7fc7b08c9b98f35082cbe354c1fb739964ac30f61d4b1f71d08a8b6a196574934238a87028427dfec27fc4436566de283beb42dbdc55e87188162e72844fcba35e452d654f06d80840a0f19ab6ecb4bab013f2e50d3069b47664158b0c63fe98f22dda6ce21cc87ad039f328fbc56d4394b0c8d0c42d6acd596912931ed363a6054458ae54789198e2d3bbc4b536f974d0b8bd865e9909e2e5bd297d45b64da2dfd9ae5c9a3a687c208e2a4ff1134488d967ddbc64b3107a9b23e7b7ca83402be13743a67d66c9a5e18418af5a327d3d8ddcd5e15421465c4b889bfa0e31c1126a743aa2f515d3c8b2a2f5598ad35c7bde623ae2bd70be128018bab38332186f3c8ea5b0ed790046421e604996d3d77c0257ce4598a66ffa6c39c755cc330dd0f827298ff230a11502223b2d5017042fb406f1cd386e642521d9f761c3c6d99b16cd03b8253982d331303a9d35dd122d9f49cc010e33c00eb51cf199abdcaf56f8648edea566a574d2e69611d85210c46ad4702245353f3616f899c74847da4456bd3fc09b84d396e234d15ca8b10caf34411fa4d9b16c44c0ae469bdeef548b7ad3a26c772810cf225a4af0997e2f4c9145a0b0e91ab7a1cc519dd271a6c3b58f2bc45c24a790bcb0bebca54fbef6125eb192cb92b1fa3c6bcb0a61c73d1efbd57d138b402953e5100ae1c1e7d107647636bee7a9309e1b1eb66e1cc1faf8ab5e8f77ddc06121a3f0244f4f4304b06453fdc75fa41db3e1b15bc1b04256ae0896b00f3268f67ff511f363f7632cadbbbac7997eb2722ddfc9d59e21c8d842b5251c4d3d76aed8fc50042272b8de59329dff728a309ff3d13bccc8913f2a664e2ba6fd8bdc0d0cbf42d453ece719b816784dc9aebe3e3e9053b6c22d14aabbec84bd9fd670e1ccbe7055be7145f3995da1a2187f9f16cbcd1b3d757624bedbf93346352a131c1840f187b4964ab692aad4d6107b75b2d22cdf9efeb5536c24a0ce84b4a57d30b42262d404e0f3178cbc291d51a96ba7ee2f7e14025059d8ff407aac7d03758f4c4260114dda8a818c704dfd406e98d804128cab1c04f35bb681799ee4a30b656ec202fb62bccc933a1416ad7b85aad49eb3180167ca52842b89ba82ac83b8d6554950ac7cf180f14c8bf1fb3b4362be359524d47bfac31b78affb5dc5c6d3d3026ef181ea0ec299ebdf35bf046ad6e9c45b6f18a4010de317e26295723ba5743fd700d3ad9a07c060be8eaf1c903412063aece07c05331fd2dfa95ef1060d2f601fd08bf69a7b0a6f2a4527320ca4f4969abce4099492c007166abe37419d20826cc1f0a166adb3e36c8f5a8e072a4aff8ca9bec1181beaa2b87e9a0f70f1c18c2db10c751f37041d1362319dcfb04fc5793083903e75cb4b510b777e81fc4ae7e3d27d853dc7a2f500f08e29ec406bd29da17b3c2477fc65aa413c13ae19d66f9b120edca4a240d2c8848d9fe4e33f695538043af26e4f6f3f19fed0f13f01ec1f103eb9cd40eafecb1d2fa1baab9e43ae7d150426827416f64a93865dc1f97b0610eb497f1d8364fdf8cb9a23478d77d66aa4a120752fa843f0c7dd4b37ed3d3d8117864f2c913d928bee9f700024ce3e597abd468289f4ba5acf754817f751a831e80aa16566b4f413037a9b7fd9fdd21400a23091807b764e3010226586b9ab929c21f256d595a95444a4e09cc4e7a5ff59d047ea54260df1d4a7a603a3a18a108984ca89e76f6ffc7369eb3215e572e865e2c05ca1c108dd3e592371a7f7bb626a0dc75a6b3d61c907c9d3f35895b219ba5d50f573e739942737cacfcaef3f70fea9682b9104dae31342cfafc5832621000bc409403687fef64c904c7d4e9a3249c19a2b07c46eb1d0667837580a380a5bf8d4501792b51fdbd8e215e44e307251e8b962cc1c1cbe05e792db1e0d4870bceacd545709283af3a9b5c3e917c690e4cff620d02eda82401c1349026a6a9809c49f899d86499d1c7900523454b7623569eeca508db51e54938b1ff954bd5abfd4b2ab5c7f67e7a11adb60119a07f0bfdb09da284b1450ba5b230fff60c7f4be779eb8d3cde7c0580fb5205f4802e0b8d987dfa249b777f42cd3d213f5945759a31c79211426f0bae9a138c9b90892c8f6912ac582724062ee8b6192acb157553f51f6317fd6ebb50af0e51419e6f25c2fbeb3e2814a21016c8489f37fe016d82b563409565692bedab6449f7095c24e77e51ee36c1d4daf80c9ef363a2f9b3673a0b3da7ae46993667adfabb47d80d6d7a3d15e84d0c42cffbdf6a2e75dc2815f6d5e0a1f64aa7d3dd22a838b11f1f6293522395fc29b60109bbadcf3de1d3a461d75131580ed56675b7648064e12626c930ca131799f18d1a050b8f2bf5e84366b8ae90d4dc77f15e98a84a3a290b13dde5201fa4ba401b2959be9d60793da5cafc8c11cf3e891aea323b5bf15d0e24a049c82597ac0781bab9dd41edfb58268a690625911be4f01c7cb94d934c1b25176d969dfe9b34d6fed67f9ae47d57d833d9af528dbaaf91285ddc45eaf9122dbe16539cf24a0c3dacc44ec98f8d88ab7adcb74bfee1a543c88f4e2e62d022541213eaeef891e4debbe5ea26f90f3474e55099d4b7f5ee86eef7772989fe1d1c25d9420a2e0d332e755af7b835a05e47a493edbd291f92126cf8f1855f5c1a244c568838828c4d494aaf5b88e13acbd8c3d7c4be49b0b3fd8b7ab4c9fb630e8afa9e4bf719bf5632d8910b7fb79b4cbba77f5810c1e6fe7401b5b41b91c61f9a5940657a8bcbafcf34afc0e9a434569a4f1919307a325dd86c8c10e1aa2a133fd94a58aac7c3be622a6f994261eac893484f9aea9826feaf71c375f073520cc58a69a35ceb6dbb2c1c65df95947118cd406728a12eb3854ee662074247b417b5a11b5daf6791ed17986906542a20f94515f08f218a8ab502e1b11e0aac770081d293b47933c806076012139832a8e64423c19a1074e9e0de79531196f2ea0bfcc8bc150670f2be8274e8ae922f2bbfad37eebc9077f98aa4ee75a28f4d7905a64017a72c409e12e9cf6ada08ac13b2dba318d32bd083c672a6c614d0bf9822bf7306835cc4c6de854e0d688c9f9cbb2e1232afd03be44541fa60eaac5c8a1f63971da1ccfa9936179c5019c8ff81a58b59edf5999d04508ed13c89645c6613ab155d18e2619002fd0a72004b09d224cb4148f271591cb2a4426ed904fb2d2212ad06ad516d91c6bf5327f0eb369bce8c8b21e7565d02cea64b2d7f3c34c91a5a0c816b61884489c8b3276e5561350da01cb1a119a6731003f2b17e86c1b30bdc6dc3b26d9151f5431e081c634ea1a9b614d7ae882a25d795af76b912eb841c150e88557ca4b44af991b82f7de755d4194ffd7451cdce97a08e72519e2bda060743c8fdba876bba64d622d3a327b26d7b2afa91a01a50d1d01d185360b8ae0170c51968c9f474009653bd419140cad4617e717a1bfa931648040b94e327da062e27394520550f3306ef2e382620771b6f8fbeee6cd62843a3250439de314019c4b41cc44de9007f07a2e5080ab05ac265f887744c70327792f6049a1fcccb27da87d4ab427b9b4c85af0927600f93fdc236d2289da94542315d39b7bdb768060b03b1d14a9cdc60b1557c6fd8b6bac4542231bca105e635f3281e7c62cc2b1f48c7159380fd0d6216d9554aba836c201b849f2a605040e9121314be4b866d1a2fae8c523bbdff12f569e21fce88ffa46cb9ced93c840921992dea2efd19460757f5c2f64cd24c7715a82de62612724ae70c8ca5d3cc85b63cc9c7fc299ce7233846d0922dcc43f9add1a83bbef63484e773b158ee55a5d30f4578266b1dfa2373becaaff6cf6b7170b4c2085fc791eff1de8917f17c9431bf4cc8ee95f61713c630086899abd3d7f20e0e8268815fd7983d5f3537e1c3c468c2c230cd39f0139087845c94cb7b81f812f650f9380f4cb21477b3a38b803134e9a22c24f67d29dfa788f5121f5f0d9eb5525984578f241189170113154c11b2254cab4bc5341007ddf7059c3331775cfb74f91f6191831e9cb87307dd294081121ffada8aaa073cc372846273c03b391c56748ddf263f87d4a60fc4b995ae8cb2b20221305b1aa0cc91d7da4aab51b807dde0675cc29c484c3c02c3456307b7eeb667a831d523c695ef210c609ba4cba27c99da6e51dd302b8fdae82d6d9f6a9aa396a6c3e30795648859df738869d97752561a1d88841995749366464fdfcbd661586ceadb144bb1217b3c7c2f44ecbe837472b2664dc8332fef90f9510cc2487d88b5927c2433456419d301db11a097d3a25997a3d2eeefbef2a7a8db4f2c7245b8485e932c50919631c4ce6b5ce255fb3a5cc858c3e3544c506117a619f707bc19c3efba1d95b287af15f587081deebabcdfb4c4f908b3b8c8693691b096df4f6dc52a41305543367023d60fd114cc4bf0affd9b5d9ffa07ae31d8c7f25cc412930046350c203cf0ae151b4ca11593001a15458bbce8485d4482fce3d2cc3403c04c77aa2f20209eaf549ebd9cc1a981171ababf3ec2ba1ed8e65ca6551c7788d52d515a0b089e0b1524de80ab0fd091d1214e4d5bdba3565a7b0efcc62d8e0fa9f404dd21f4dec3ff782e6ab2b5ae3ee011ee9d11a0d1a78b1e210366fd5b3f8edc769c2db8fe731d318984acb0ac6f4623ee3da9efdc6f9ff6ff3ba48567db397df4ea289db1c6510d93632c53679ff55101b789440208421573fd0c444df98007f3492ae39f895998fbf498f649ed257cda5f907d6ed197e2fff53a5419db41ac81a50d483775cecb08ae4c0bf98c73fced128605c54cdc366204ea89b06d2334a7ac22c92bd95e7c976ce697aa0c4f2dd1c14f78a292df8a922e8fef5e70f3a71e6e12a3ecba8a005ff5b5f0907cde6addd618f87dc3af2282c7fd224c4b81489e5c21e04a303f14fd115821b8d2c9c0c87ddef37c2f8b75a38706ace5b753a14cd404d0070d8090b5b1a0c558531a7626b40b0793f8ba8222bf81c038a3873d56881446ccea637d62a1649fb1ef247d0a342eb4a80b80e50d9b3bde954cb36da862292fc562e6ea29b4e4540670f6091f8e208f3654dc8775fe7cb2d0396c9098912f3841a820514ab2888d1336989d54d731f343bc117e3e5ea9c44273500bdf4c1ade9f6df986799bdea8d7f971c6914e70d406ca623d827a38c06e8b3824e9792853e50587a4b6d3dd71d34debc7e16ca04ca6b341b156b7393f409ded9f6f2c15cdf3390434653ccc1001e4122760cedec3a26aef2447d1ea5ee1af1035e28e1c6bdfeb3b32736479f04b19a4a1145dc0c458661d5b7d1318bb173d15385635180271dc91dd237698a29c921bd0894c593b7baa8ae6a7acd3611b5d0f4412852d476bb32f265ad24625d3e0682a8287d30a28e80d927243ebd4d31f233fc390176f79482c591fb0dc511b571e2c5f3542d52f32262ce0dd0226d4a0289de5c40550e19c3a7ae98cb29bc08cf3b6839097693797d5ca83fe66d684f44f9e9044232f95842896713cf8d85fadad0cd8292644b1a544e5a1313668f27af4f17cd600b28b913f5decc071740c52d7743edc53cda78277d9aff4e5ee8155c0854b4f135d1f7ac80785ddf791093fd7f722f19b2adcfd954f7aa838f2fe64c22214ce19c24064dc86e1c55333c3c32439bc8e8a71e8124af4078a7e9e50762bd0f4331327baf15995e2559ba95f44067b3e51a2038379b66ca898763030856451c29b2ea529401bcaf41b1b223ef9984d1c50793dfbb0744b871ac7385b1bed63140508a63c8806d470c88868cd900442157edcab4575b1a4a4841dc59e05610a17881163a53193b4f46038ec16d3a2acbfb22a828e1a66624123169cb5a837c2b2011ad3085e87c50e9c2090861347696909b69c5e58b7815ddcd0643ba8878b1e8f036cee3022f1da9114688c17a2ebf421eaafd7361287c4c521181d54cba83b3817308c53918ee0943f330dbbc80cf4cc32b9ba6b6a4c062a8f43b4376f1d14b52559c7ad92155bd042d3c5eebfb3507f296f6d43c94c22498614015eff3695f70e0ff18ee349bdf38f952f695bf514c1df01bf656937c556ac772dd985c440922409ee81e639296fdc8c12260c32447264782affadcc5bf4a79dd22811caab34269b381426ce376540fc588cf3619c022e7eadc42b5922677c22c2ff713ca3cf107db447a08cf0613c5bc706a050c83c06471958fa6469a56d77e3f45e8d3c331a535823cee65ac7c8c4afdb19949f24181d7c7f21e1aa4799980622831538c8151cc5566f52a7b13833b80415eac513ec1c379d80deb19bd856e201a18dfebc2eee4f168918883e7340b94437016cfa000c73edfdcb415138dd4f2e7d1f1b5500564a9eac0cf699202924402233d3cf17fb0cc71c2d36a5756e6c9a66a4d0e82e54d53a42d0f6c6e68b4fc6201138af40afdafdb86dd19c3743f5c1bd756b3a0129e5d2912421adc8599fd2153517102b90b3e61e6057536869bc28db874754062177ae022f1f1b0d740d39449cd7180f6e9e5a1ae0f570ab236b4296d4306c1a3fd3f59866db6bb3853c890f8993b31fadd42ad1c44c9c054f18a41db4facf2a7a8a5a2fc146bd14040dcd9dee96424fcff3a3d942093bb298b8a23f9721ee12abfb3f889e0bf1fdb61379cf4b45319e071b6e2a6d6c37be28099addceef0a0b65e63b0f17706ad47fb2cc73a40de4dfe018a4e3fa93c7b873a2456c35610a1272f488091e34387fd1db5b9e5b3fa673dd169652af9eafd7070bd4e353ce961b0b0f58259760aba424f2216f090ca085bfcce32299bce70cf9b1c4167f08ec2842f0022eeb47eccd16484a32e08299e9f7f6688c3d21d74780c284d98af5d22077f2b2d8792de1960e21ed61e1af6df5948ffb2f92d82cd8d00efae054c6730f75d06e2287eba7416dcefe8bddc2fc68b222de614f5642a8a1787b4bf652411071c6e00b058da7aedceb2923578667f49be6451e2f68336c6a63a3f1c8dbbf2126794ee71fd02d449d1b0febcdfd42713447a8023cd91866df9eb83cb0c84b2ea1de622cb3cf144613d6f7a002d159653c9f96d02de3d21bc23192c9f78f911f2c41152c4066d401b95984d314f961f38b6743f440a3f04550d4d4e150b7110d1b91be8944aa03a26fa598db4a5a0f69e75b533a2207c46bc39c351c9ba7f223fda2324aea7101eafad809321f8415dbab2aff593cb49291b7e8945641d8f425cb352ec3a15786cdc3597cd032670839a4c551ab6574edb82c6e76dcba9333268c043a2982fa0d4317237502c90a1200ee11e53feb3637ec36f551f122e1e50083ae2b39be1cd219b0d78c6958e6b5cfd88996fd748a14e99a6d2fc2962bc114690032e6d81fa9d2ac6aed38b94d92af501ff32c9b3ab5aee0b0e76d84d5cd235088e4efd4d536a88ce0b512f98777f9b0198e44e865876669cd498d3a55ab0dd10534d18582c409a543c9c9f87a00a79e62382382765eba9bef2b1c5e91be0031fd9f3b1fb2d76b661d1d0f7b9a0cd08ad31881809c625913a6eb18fe23f50f119e9782aecc36fee9ac6f56a3b3fe0c5240297a01afc7cb0f0675af297a790755a4ccbcd4f1866e1f561b5f03e8a9448e57528caf7148b9725cac6831ca982740bc1864a832bf1c7df354412f5e31780a951386ff364ea1f01ce880fc974c176e1209efff827a6e99ff93a5626451cbf51c4bc89b2f14e5aa376ad61e9fc22f7fd42b0f4378cd0326b21031805568ac8fd7d64ccf4e872e7cdff021f48f7d162205911801d4a6ac2cd45882dc7e02c465034d976c358a781079831f87a889242de0921ca6e9ec53f785ec9b695b3cd0bb080a6109a2d5158e9d9573bf42ab2c6f3fb93baeb4cb45d84d16ff83ebcf879cacef6a2c47f6eddd47f08cb9649b0b1ab3c4334de9a157252c42ed94d64ce65ab4666fdd06e256489ccef93a9fe5041380b0aba4610c03a7cad4f8d205c8c7477cf65e79edf520e85f0752dc4f9427bc42b9359c1a8498f935dc47fbc843d4fff6eaa3d0eb3a361edfe1e31a10502f073561801dae02a117682fcbd044310886caf0f756bee1388d1c260d1e0dd320cc47a959354d31a31e6f8aa49c74a388f2e6515dfb55b712cfc9e54397d24918b47a2576194194a6efcdc203bb3e67524336a62e288fb251ba07d348954ef92fea075d7e50785d56376bcff1157cc85e2670076c58a9d2ce39cb1be88abbc00413d4ccd164c11e57b2f8c0e122cebd75ad03376dc7da3355b0ccb87dc125a31c3176bfdd507b2fe2eab4a020b0bb85a2e75a40b46f7e25b4b7df5dd0a92ccd01bb041eb5abfce247954c34fa5a4b5cbec62d0cd0860db0f1a6cbf9d5f106e202c3c76759bd8ed2d8b45dee6b1470428729ea03d0dac9a65e9da2048c7f99ce04c3329559fa0290eac1a9a42e1bae853424cfd3fada637d50067aa58d1d4d943015b03c2309ccaca5a209459c4bf2c301e4274b1e3045453a918d8a2e214db618dff718f0e8287927480d5a3ae118be697a50cff71b45211e65eacf0357d8d8084a5a7663313d67403bd7ecb9140c76fbaf2387e480f89302b47bcc31d1e6d7005b0b9e5c5d626e9a6619c4ce5587637b45c44a486f7c62e075adc727eb01cb2213bcb92edf2e81be9f2a49ad512fea35fd981727f3140cc114f24f28e9ce950f6e1d41030ca825b20c02bafa07da5283d31726260659ea0575a470e9f3862612594ae7da751efe342fbf919a5ac503522de63fd4cdb644d7560d435f237f7c22eabffdcda551aacaa33bfbfd7b264b0de538421e87c5b6112d4c10fa837a670872ab3fd883ca6be74ec4a41888ea76efccbda23a48f3876c20007bb5e8fd6608bcf1f22036ccf763f19291926e1ae21061c1381f42bb82af11bc3bb8f34f1d25c566966289b286af824e626be44fa609fb9f8e5c280b11ab25da9eae47547d1134ba4a20c37fa9f9c9119b3f0946765dc30ae229db3828469d37c4af2a3d43255889f4da75691e9009aed63ec762f684754cc16909e6f55c5269ff4ed7626917c8a264883124b54e4c661f42400179867e83256dd6c8b5c70a6eecf33f69fd2e3c04920a72f5f2249b63e1e08881e8273da02e502582e13dbe9d0b5d79b1b226a8698609fc8716a362b03401118b9ffd1a8d4151e25d3aab6864751a3f82db0affa91866f5748099a7a04ecf6c582401622c3aee7b56e9926ed231141c26f1034408199b216c95816741706ac3a241e10725fb30888123fbcd7609ae4cc233041e412d88d21b96c2c899f9d3464d3be3ada75bfa0a939522cb1222f6fd2d201250460ce0f1a7fb9074a0f6fa3b172e262e1724003855416d8485c2d780f07f1195cae1b14cd3e8b70a23cf4667c9913433b4f2ca4488685c0d83f58f24902023ce9091da8bd491e977134e6d24ba3e0d62afba9b9f0c9596ce5e207a75f02e05a488621b6b1b2f82eab998582f6da1b507d69d16de20539f5ea50ca1e89bf3043c3d2bb158ea3be35187e000b92298549448cd4d5b896af4c10ff7c292a9b6234888e4059dd68e03f9d2f6ba50284c55a63594c727efccb615a7dc0336d3641caec9c366f569ff0f2cecb46452264a800c5963aafcc862f4ef840e4839dc1c25c64913bb18e4943f1bca953e7bc4ca7238ffb61f87ccb9b4f411cca65172d82a9b37ff2faf9238ab9a8cd548f01a5c06a2f0c852b173ed8bb2f16e4e49e7491a0841bc464caab75ddb9afac16a3c4c9979a16067072e41ec38ac45384fc7db175ce8432e258234b709460386d667b25e97f32010e41cec2cab1c959c68d23b09d014d1421ec2b3fecd14fa25e9c288f5e508fa5606c89a8678bf87d7b7c938002486328b9b29b627d0f6ebf8a77cb2e8a8038986c07da3a8b718c3fb80602705be98a904bb2f54859cc16434cde0b7e8a6de36b5ec8a6ea22f10f227be5b060f1dcb994fad2f44350307e50d5481ce1a3cde7147806383acb56cf1cb59bd25244acc1d62e14a82954b17b519a1cb03b5d4103beb62feb96e13350c9c7fa5bb07bd3a2c8ea44417d8a935a9e6099406c7b36215c35285a0614326bf40fccab901a9a0fcb2319ffbade7f8d15ced7f3f51f979809c892ac9f6bfd4c9a2a1a5aa04a128248d3cb749415d418a4384da9bebaeca135d0f28ba169e4947a16ca1f52b82b51b5263c99d50552714a9a2fea1a5d0bd680d2fe441f8abe121960053680300e3f56615a750fc1d8e8bbdc1a74feb42de4f686920a55b33c9d37364c1261f9637c6e7ca508cd210914189000700c7299658e9f007bacaa37980f64bd6cb249cc42f44e8f86a0afca5ea0f982453b72208aa9fbb69df5b2d91e1cbcefebc21027e3be6e9bafc8efa9000169e7fdc38fe27e534e786e5b363fd2fb3c706ca24bb1c43e8e4d331239503d6c0820a75a673526b2b4c8e33d810f0cd432caeac2961cae418d33d3f5fc24a83452e897af28d3d2cb3e94d177fd1eccfd030ebc1186974863f6fbeed1d5b16ff8eb4fff18629f25349caeda0f588bee9bf6342c42f5b264f5b6c882fa61c8e9d80c4fd68019c6220c9c04a4fb50fda44c1294f0417e5c37beb768112252becc0cb87f4f7b3668e7acf882e119b83517186944b6402d290f7c84aca9901c8c2e39bf76cdc6e6dc58affb9a31cc2eda3b04ffb86700a2cffaa7330da0604b73af6be18bb8c028958709e814773086372e6f300e1a31df307488514ba7a83b1776aadac1d20c306b12776e8050edc6d21e3cd6e23910a90de67c3d41d621aa294394bfad19c0cade227c268ab93bd9c69fea9d554c4253a34614ea3eb7565f89a7b76c6294edc4359819409b436da27f11206bd097b26c2e4d4e0b551afde56514b47c71407c1b1faf7470958c3cd29ddc98d4d57782f6fafc9c9b673e30ba8387fc5d09b2d6af4fb50260aad9cd5efbc5232f9c79b30612b7f03f037f16a8a5b587aa1556ceacd8c1e3cb7a936a7dc132341ecb5d0067578f8637ba3fdb938deedfe74d89f87891021566578a7f2c238794d73d0571a77b344f2989ebe251e7e1ff9029bd686e1608af6d7c5b275671f67d2083830134ab23a331c5f5d8208748b39f75da694aa518406fcb20273227668c7e598121a8f82dfb5d84f876fba9a258d1a1817968395ee75da396f59abbd3bc8d3143a11a434282eeac18c25ed67af3b2733e69375ecc8b0e604e168f2f6bdf41a4c9f0ba4b7b622754e332144a32a7678575beeffc8cd293964509b5d9bc054a0792e2d967ff97e72a34fcde286456d9a94e248963c6fd50338647d8996d23f27298118e03f44699f28d7ff31f31c5cc651b47df9ec3b9b869ac0bc4f66bef4e5b14c0e186b0227bba2e618527749c1c041b9e4b5c39abb3a77e9328fcbc0cb025d4225f3bb62ce3504f467d07fc5ece3b1ba8a5ad7682a503bc7a6502f37f4f0fe13106355c8bda71d12797aaca34008c3a006fdd066b64da246671b4d0f37152bd4", - "public_inputs_hex": "0x25832c071d6d99ad42c7b885e48b10100726dc0de03c0a779b282c519ccf538a25fc312a5f0009edd084811b739bcbd529987df1cea36f5a24515386662573960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000c946233fabee579beb961008103a4c8d00000000000000000000000000000000026a297ba8fb72294cced25b49dae7c92208484402633db0cfcb2af11d3b66ff07cd7b6b12c3a35e9581183e399d53f72b942ad53baa7c6e1a7616e4f0aa2eedf7d67eacc63696345525988225847479273fc58215abae6a73503410e8209a542c92bbea2ba8e6fb129c971def4ca8452ddcd2c1e0b08c268d942b52a49e7597873ccad9df1b02ea1ab854e7111eb2dd188f793a89424a83a3e746a72d4cdfd5702a7944deb0fa2ee04f84489f4af3c22f5ffac9352fe35d950a4ce548798309f5d896dd11f304f93d83cdfe284b37a6" + "proof_hex": "0x00000000000000000000000000000000000000000000000893e2589fc7272df300000000000000000000000000000000000000000000000f9cacd727086112c2000000000000000000000000000000000000000000000001087d088d5e0eb68400000000000000000000000000000000000000000000000000012265e9d423bc00000000000000000000000000000000000000000000000848d741a33c08ace2000000000000000000000000000000000000000000000008900eb4f01074c33d00000000000000000000000000000000000000000000000bb603d265d0e8c3f300000000000000000000000000000000000000000000000000008a6c01ce44080000000000000000000000000000000000000000000000056a1f3c8c8cd10298000000000000000000000000000000000000000000000000f4913d1f1efea4390000000000000000000000000000000000000000000000055187776dfc7e27c200000000000000000000000000000000000000000000000000020e60b75114b80000000000000000000000000000000000000000000000037252d99ba4b6b4e600000000000000000000000000000000000000000000000774c7a54897b11a9500000000000000000000000000000000000000000000000fdd40227ec51bf31f00000000000000000000000000000000000000000000000000019c9203decfb90e15854237f5c72c41d9082a4545b24694b629e686c58d51412f7fd32e13d5cc131b256d0eae84688fba4f2c0c00f84a33ccf9eff8eaf9f96b18557d2a7019f3034e1dcf5038db8476b5ce28e0eb6d0b588a3d92abeccb8acadcf67559752b4820a6ae16edfdf62f6c4ff6f5dac318c159ed8b8a98adb2c907a21b91bb74450924ad1b7b0beae123ea31c74f103bd2f0d7838483cf5960db17d47b987b8eb9f41868dcc4c2d77185ff80d4213515aa90244fec519f8b4a3b94b789e212393534132732aa313e4296df8b5f17497adfb0e14abd79fd3d54f953825f194baa0bfa1b5875c2c1b1876a47dbde1ed563a4d0dedc8c3686bf29a39fcabb4f4d138a4305b305e25ea240ee1a7676ee159c5c0cee9881d575d82a8436a3047e0b16bd4d040372200291485daa1ef88b8e351a3aaff641c72510b642515345321f0aacdc2f1138db62d6540fd8f07939380763a72892091168fcae86a010b455afa401db031ecd41783b303eb5655e67ceec7775594faf23d9531c1e438fbb2a504a956e1b7bf6f6a9a1199f84d5430aad0d3d92f6f4040ef2b13539270b3a40d7505f931eca2310d783a3021e50216a221b41b08ac834737f354d673289128fd36786d6136e38d2f4d0b07b8cc1bb220bc7b8e57024195931350e83657d029a83dc34b7193c7c10e5f817db7d9edeb2e56536938360ba7662c40955cdb42cfba3ffe3471db3b457f7abc3da3b5c6cc1235d1443340fcc130ea8c7a1a27bd327b204b8bb1444f7df9b30ec99fb363c05cd8a95c8911703089acebf0e5374476e5b04ccac0ba4bae2950a693e469306142da1c9a6803cc03aa6751a5ede2660b6456d7ff50a22b46ecb26c32f8483b832badb3bd261b76147946ccf32ccc7df80755c970323abfd79e860344af0a77ef4158a686473f2ee44b9463c55a5fbba510f61820608315d582ea7ff959f9e0e0ece8f579c13bc173a81802641c6d59db9ccd02fb8222df1d855fb1a085663adbff7682626e7364c355592466ad27289f4e763e4150e11f707808d36e43f0942b2bce4623a17f32342e6159406377ddfc6a610497d064214c534db9af22e91fc4790d334549474cb3808889a7b233902313e8c9c1a078389b9a6bc5837f2c323f9c93da198c6f7ffc7e8506c22b6ea42e0bc92a9691e98e4a0334ff82dc0c51dbedecf9540cec8d166f3abb7acec918dd96d10159f277c4473b121ba1b35f5a6af679116f5bc600f42b77326cc2369b623347572731e3e5c676b3c710d4d76049409b96139a19caa6f489579243903a78bb5cc6d8d26546bd4ab3e7cf4e832a8158c91ba19a9e56101f466aadd4a5f6bfb7f8825d72c83d4e8965ba1468c1e93822666884990221c364cc3d56baf7b47217699b7af230b7d3b3d622b2ed8763f89c57955223d99ca2203786ae090d3a65884abcc6b117cd2bd54d1df58312861771bf6a290452d4c980ad6d8d77ef4455012bc47911e89bf3e709ae1bfb2731c4aa674fde1de69a4801e10c4923c4de7f339f85d5b2f00e7fe872d692fe397164968df3140ba2a3e8758c9a0e530903b569bc20ac6186844791c107f85970ed03a94a4120914c716a0f0606f6f66bdefb596ea706821ecbc8bd8932e21da71ded29557eb4172d7c4545a93a547fdf16e2768e3ec322d0658c1aa5b422e4fa9772c6222e1018db983236a2fe4afbc28e3a7d49aae3d0ab553e9239d3502e082ec865748cc118e8c4940a2096666785cbe269d84a3140ad922d438f9351ee68dcced4be0cc1be0096a717b090898c7a4b42c709cb2321d461e8c48dc9abfef867f2605097e9cafceaaa1c13117593bf3e4a47c350aea0f9fafad053548201fb07ac10455f6921da3e042a0af83797c1f518766fd5d9b1eee4e50d2912eb8059b9828ca6e9abcf7fbc8ca9fd31040dcf1a854b7ddce1823db49a85ae8c738472c347d5d332b51435ff82b2f9be8299e4c25ec3cdad2cf2372f312ed18b598f946ca078925c6511a63fcf014e95611009c314dbe8251d12ae84067c4f60fa43342708a96c72c8384fd3dd8510180f6b49dcbb0d6b0facc1431f6c045348ce0bd87ef9a7236126248b2cccc0697081632bc406775d2a81908d720f4faf784847862ee70967996516e8b1e6c36ce347628104e81f7537c972c8e4ab9c91a6f1f77edc7342c14fab39f3a89e3c77f02d08d5a46f3e07b31cf0f6fdeeceeba4efec088c521ff006ff8c62dcb71f444d65a28749a9192cf0a5c285a1f5ff79e8b76c3d4b15ba348b53041aa272efae3b2e1229e5b848a53180f2dfcdbfca0b368a59895ad8ef89c2db406b321ef980a673d66af38309bd1f8c02f01c5dc5bc307f642fa10ea809a214a256ac01aadafaec2fc8afb7e9a9060002c308f5e70b3ddc778f6aaa93630cbd17812cb210d316ea765117de0d6a975d52be3b032ae5b4f7f8efd0c387d042777cc46081a21b01929a0e851439ebcf53206053531bb680c462e2d8384ab322ff49426713b8a51aa30799d442c3772e7d72e53de315a6be54e85a3cc8b085e2837708d04206ef9ed7c075e54a3a1afd1ba122d34c298db267bf0de8979d3ea39981d8b826674c14bfcc73e1a40363a6a8d29858aa7a71cf3b41962433b4d4c38e6551698c82f67f33d41e13280121e551306c57d9e157f35ea90947e3e0eca751dfebb4528f409f8b7afa242345596fbb005cc617209a7bc2349235d7a01cbada55d7e457da18c3dd779f95a045a29187a18f7c25c8cfa61c702da793c22ba1ce87f369d82e49eaed8d7d99942de1e71cd05211c1a0da9dceb8776cba9c9de442336c572ea4d9deccc148b68b634693f0c2e17a10268df741e380d585ff3ea618b550537330b5b4c046c79c1419c7b494b02096cf7ab81dfae1a38d3e1956558869d84bb362b3fecdfc06c0dce58493bba2eb27fc58a2bdc4ed36c00bf922c5c1db5de02a4c432050a51ded9b099b41cbc061cc328788be07e4ccafd40b6bcd297b04797b97014eb32d258ee1ee2db13720122e99e0da54f6fb50245e680a31f64f621db6d92742171234e7586eb47891506f63d0daa7f8830c7f1367784020113578b8aa8b5dd4afc9fc9cd33172555c01eae152d42a6ac71c10bd1bb6480b7e40f8c3e2479d6c13e6b170811614e30c10797e04f4a794b23ad86dce7b68cb182d3d85328272e204224e373c5e5d7b41d29f8ec5570fad365770fa970af609eefc121da6206dc0d7f9391279e1948767c2eba3e936dbdc0cf22b8c0c670eb33a91a751d1580e32024a2a348e43c54a1f524c5c7dee7bf08b6407a4131bb7930d20fb78abc761d045841181c23b71807742e66ddd71bceaad5da2812d15f6bd7bf4b7abc39a746237b0ba166a1eff6a6361dce8dd8adb27ab557342db41bb92bb4dc1cee964d945cb4498628d373105d6a13ac28ffd7e9d74791f69bea43c9a30cc3d94d596f9680c3f04eda944c3eacab279565526a000489a00586d9867741b8c2bca52d99f56569164586ef339b1d0928cf8a27507b425f09889e3356238dcbdfe0d82ea0b25bf9fc7dd421156102771050857c3d200468629be6b8d50cb2f8ba886aa273d990d7253872a176ecfe2b2447b44957ad7a69fa0fba44fd137cf23203058c369401d2a8968b310b41600a1a8cca2c4f7eb5c10fabfb3912f6b4508b1499b61689286c92e2e10253fc62050db4c54731b5dd71fd020918713df81f373894c9e02ac407850911f7c65385a52ed9beb9b040e0f864d586e70ef47a84ab8009b1c26a482c661cc055921580f222932759de0b675fc5798bbcb1c97100d0e1178c3a9fdd87016ad164dc955b140721c4a127104109b1c4341dea673452c92a61455d7428e3fb33661a9cc6e805090b9f3af1250dc3692e5059ebf26b55ed24a1d17aac0b68cf098f87e87ca7cf0ee33d642a56905b9fa1ef08da3c79561b196b80e60928ed00339f73fb46fa1414a894a6a398d2881b92cb79476d91e9f05b709bd710e917802dc6cd31b342070d5aa5d7c38d8cc4e50461596b5d7240aac423856b44ac1d7695422ef9d190410a475b3de9d662aa4db4bfa5ff7f48cf9134f88de6e3824fed4fa82b8ea0eb7c0841152da5d56674987df02cb6d40314192857fdbf1e72ee745126823d350b1b2755e28a5733de1c902e753dfeb0345c45374985a8230c4719ce19642a6b39c001e40f6a1550dc098de688f2e5c20ffeff195bea4e58d45266c19d09ac4dd1c919f7d04b1c9017f95e5d6cece41b7f51fa6a767a74629c3fbf7f8a8c53b87e14172b8536b1752f50f587b3e87d1d32fc1aaf8f5c8097788a181144d396004ea52c248fc06ca0532f69b66a94287f5465e274cdf660854ef5812e9bd7d202cd361a6c9ab24c0d08eaeb17234f7b649849b17a82d2b4628e601165cbfa735b4a970d74e6fbfdeaacc9d23d2b7552f3e2e7f9cf36f245d72b9b0562233134fbfef13017c428b5d653681f822febb94d0d5787caa2fdf62a065b3cbd9cf7411fce960208555c6f62f6d0a9753d603c45b0ff2c26f61463fca3e9cc701ae605828152173319e1ba545079e1622b6313a693e3c91a61280b07b454303170ae71ed3fbf10221f39c22c89c3dc16ee2a8d3ab33f3e044bbcafceb519c20a6da079f6e3d818ce53aaa8f48a1cab2e844af148fa69cb3352af974d9161b8e46e514a39aafc211918caa8dbaa52c6d92b19a3c0e7aa2e5315f646464aba9c170dc165f088d92d3eb20cb4e9b6df442a4581f7bd621f7359e7107aaf2d6a96c8fa679b61d5ea263408751bca74056732ca92490d524dd393dd1920ad5d73bf36978c69c5a91413eeb815b94283fc18604a92c7d581223a897972e1d11f5d5fb18ea39d2c7c082c2f92b900e56c6e89559a144646c92f7172428ed7dad04833905b40d9fe3d02175c54ec7dd5eec77a2f83459dad2c7ea0afbfd3990e2af01d3adc3bbd2d4bdb2cd9e668a481f993b20b52d6695d4cab937d3388872e7f5292a2be8f19e912c51cfa1edf49b1f17a32fe84c10339ef67123b970a0ee9c32c498275c4069d665010942d89642d918d1608275e3683a6965334ec106a0f33fe20bb6e2cc35d65020c2abc37ef27b01b8baf7861ff6e75a6c878ec9ae8518d3193d7ba6211cf17610dbf3da6d82edfbd998175540b07c81b9b82554e8595e48c14f31e6fd979fd120b504192bbb4041af130e3443a95d694f484a388ffbc15a9f5cbe69ec8df85971e971559580e062fec279baec48c4c980a5b3ee9d9468135b28e6456c38722b024717827fd83ed7c07213e618ab3fc32e8a7afb39c5c295edd906eff182638a527576cde3d29dc6ee178378731bde6dc6b6d3f86eb97ead0f38894d9ccddbfc7009cafa51d2cab27496ad63f1e8dd6fba1d0f8d2ed6472d4d1b0fd0bd84185161bc89f8431adc4ae1c564fd79f0cdf3d331699e02813f944dded4444da20694722d06a7a3b2f66252781c0702e08d8d6eac0cac41111e1f19cee0b32ed5e4de626ab830809f85471c97ee8d18f0e49a9f59e23e2ddf20651ec29cd4b358c6c061cdb615bf651f6007a2074e4f5679dda0f83be4de87b9649ad16fbdd7e951c2d10afe06e9a07edbe7d7ac216cb7210f5d829c8e094aec84046bc73b3ddc8eb0d1a70e728e336cdad54f8c03670cc53a4efb8ccb1c64bd687395eb426c63fc3701284e98f30c881e829a47207642ad663d6fcf23733f0703a62f76b9d612c642910524dfbc4ad584ecc9aba8883766d6ff71b5bdf87de0301b7ac966efc5cfea32df53aa6133c431afc06ffe5fd7f230dabb3791045aa1b06df3031c9af4007ff16ecba9d8d3dcf9bc228867fb0d0cb6f7cbbb301bbea190b19d53dea570589ad22f0a4c22f7c143798bddbb1db1ec81e892ee35b7bc566412706f6ba39db47222c5b24ceaa70b934f696b3042014f4d71242f3465fd6bbba7fc2aeb209da45d8168749bf202b7d7751a2c7a6738b0dff17d8ed462a2a4d03940f089083b3e07113931a991816788c975e884ed4fabe62624354c7d7cbbb444f09226f28bf4c88180f64406dd0a9d860333e34601b154a0f617b129b91b798f2d6642b1b3f6f4d048d5f4ccab3a704884851c7dac301d61e83eb8650b4101bd0b5b2d97ec88c5022f0f15f227881968414436094841db6d1ba966046c9f9896f897c62811da7f10c2bb7650d2a76e618119fcf7be78384e4802def8df8e81700da1295a32a138e2020174ac7aa7bd8b333d9ce80f19d89cde515e77c87894c45bd66435f5603240a0656a475363a01ad7fc570af47536e52d70592ce4e9a8b45480aa2dcbfa1da14c96f85e04ec5c925b1fe7a72e20ad432f905dad4c272b7cb948147daecbda602fc461ce29574a5feab8a23c9f5c9530f4de936aaf119781321b8eb04fd221123971631c97621631d403795d5d9908aeb33310de43fea8007077a7acd121ce220cc548aec560ee0fb11777ee0fb6034800a009353c47fd8d9f59fdf1812f0e6165cd6906e559d0639f2b89305ed45e9de8ab19564a549b7d128fa38685eba0618a16438b5e899b824ab31a49706b90bcb5c838d18b9e70376a54ac54cd871a60c49d283b19468ee15da356cb55ac7aa8ee6a356dfb951dbb8fb928d79cb39791ff85032801bc21e98725d3fd417d948194e8f93d330586082493206aeee5f672b47cbef3d769fd4c06e2adcc54b93df406d84ef63f6e8142746767963f1e4031a9e7ff72c05e1551d2626d1472dafcf890c11f1baaaab1bdcff02968609f6f4154a817867460ffa14261ad963b2976cd6d9944338acdb4a91c2a15a421d577b1f0cd6eafde870d2d1fcd8b3d03873bb113f133f2165785cbb4ec4b99137a4dc2db3313338c4bf136ac9c39b4053ab91a5017676f447a5ca720db1c5f33ba2e0203d82562b9dbfdd0b5464cf411a4ec39ff798b2abd5479d68a18480641310eb05c1fca5bf8c5132330c5c54bc23c7913e2b315d9a8271db1b621b500612a25e23482623e037b0b6773980a4275e42c137330ebfbf721a39196f153b0328130c0b2aca7467cfef01cc4dbbf9a8a0926c340a58883e4b0b59b9afe62a8c62d08d18562a4fd95a6a3d70dfd90fa1a15d6952d83a85dcb3ab079a91ba67cbff6775082abd4ab25e8feb4e83857e5eab021ae8a4505dbe7a3dde2d36aa0ebc508cae1b49c818f5c7165e7ff39a473235a75a9b2333e588211d0ef5e7129d3986e9e0213d2de49dbfb62daf700bffebc1727aa70907b77e8cb713c6ba8cad1f0d0c800864d208c935343fdd3740cfb370faac2a80961a0f3b8b35d0447005fc0e82022d949031d5062d4f8aa744cc623c4d6d671768c62cc023a0a2461b3988214b8f215ce83ad729227f4a3400be99c58bfabafab8ad4af06c17e28a10ec8f8af06626e1454f2963138e56c19a4f6ac189a552f48179a0605425fcdfe1ca7a403cf2297e9a7392ef35241d75085a64983b8d68eafc54dac726b6d84a94e16874e0860c6f472b3b0981400901922b07f2fcf01a54c30cf6825b20dbbe1146991b852c1a9a6878a7f1f43af6a26a880f0798ede86d0430bde95fa493eb91880e91285f2230058a0cd7f392a407d2058b56af8f3dca57b484ec6ca4526ee5e1ae36f79401ac6be0ec199215cbbb9342f6fa48ee5fc2079c21a44fe98d901c0c437ded112b20f9e1d14722d0a1a6f8e3c5ae5542b664e996bbac6184959b6007b43d9c960561005f6d238f5d3bc6ce60731faa20b64e59ac0cd270533f6c44cc6e9d5bdc057500afdd58bd889de4b82459f36be31db8afb91574243c8e1acdb67828f1e9183add21c8cbffd759306175151d5c4fa4f472b2b75c86e3e25480cf56c48ce4141595fca7a27e81a3c41d623170d54577eef77228a740c5f72b306348fb220d2e48fdd3a7d964de9ba0cf246c99d67200ee6e340a0c8367579e674a4a5f33512944c67f47c50e3570a3b47ae1929539f12c92075d326900f390b576aeebe9e6094000860a65184372332c28dfd700c53451f69568ea99c67309a4f07fe9965e12ef213d1b038709b1befd318e147d81e508fb2bdef04cd29f9a67fb0d4a1ee312e3f5792c46144ddb8352c4f042e61ed5a9a3850fd9850c9c7f1cf0630b3a6a1ec33bf3df6527fe4b12da199a1e9f94e31021debbb6ffedd6f10b71a1cdabf91e082b655ae4cc1d2e1b60ab79a92a5885e534006c0bbc303120f2d6824a10f10bb91d471511c9c24acf37c1061aa87aec6cf9f3660ba178576a0f482364dfbd15bde29fcfe07eb227db46d853af20da62ac6469a7e96e1e1d423177fc3309ad15ac488adaa1731baec815d86b4dfe6804690606a8822238f26b3c16b105dac12757991e46ac2def906b4a5ce65aea1d35ff0eabeb4f0845f583899205f33925087b24680062abf2bfacce5706551a5db92655b0311e8956ee3bc0d8a34b4a83244d664d1f71d3f4f807e7530c496f3504363d1e2462f35204e1b5fd4b7592e318ed8d0ba6c6cf82eea8fe98f6a3bbbcd3ee9c6c7672b4cba6773d47df0686b3051385b0d91358f0e9c73f6e71a93c15342fc46a0aaabf3379116dd12f95a2e30f7168937816ce74020682f78f0f15a4eca7870bdc17d4f0b36fb6db0eba34a517d878fcfe8f2160a608e9872198e628d47f55301e95e72184f9232b641a9f7a061c56f08d53de42e7f013c1112f76d21023a517b7d31548c2eab75c92c8d8311df000ef658c3423d9a2689069ce94d84a3d4f0d22781c03580962692d7776b4189c2722e1d652a5c109bae7de3860a66cc7b24d72860e3f43e9d0525bd21c9925e3b3e4130a73259fe1f10e44eef6a44da0dbe5f23dd48f8487f0bb7944f6280a507cab9587d26c812f6157deb1f312c53454e855a178d8282c34d93f20f06f1ab53520ad6cca61d9526c18ff7a37c60c431994b63d90fa5a7a16e4d34a1ddc0440c54904a6a94980e95c17224c4729862a9d26e7148fcdd79479f431732ed609664b7264eeacdb27c0400293f46c5e78edc80fd0d329cebbd45774ec88a46404c02b85d4ea7fd4ad0af626ef8268dc528e42d88c78c30757b285f07d2391fc0a6b4b8a4594c528d07833f1799e521fbf56aededc873143d5e7f027602e3cf308e4696ba7074107e534a1a545a613362eab5fdcf4a7e24ed0131349f0a138ad2d06b11d96c5b243992d1043952d17c7c4e294863c4a935fdd19dafe178bdc722ab0484766b0df419faf509b15a221d03428158513c3976eb5fe8d608ad3cf2b288fd1cbb13ef5861622006944f60a12f6bbf6bea0716f0814994dcba71de0f002b63902f9a23d06619abe4bb5eb4765dd8a51dbf12f94deaea567e45397211818ab423556e04576e23da8465df309f46b735955dae455c92dd8e9a1108a41d50e8efe970196f109d249c781077ad9f6454fdefb125ac4018a77e78ff1dff9c106f125c8952b7af0c9cc3e31879428adbc797c0da2d0a15caebaa50e95d965d80f9e7ccab0c03042033c2324b455283f43230e429523ee4f5959abbf2c434df007b5f1d715595f140e0c8f40b7ea9e7421d20fea459089b89dfaf43f0c88551b27a3e65b3945e380221082caa460e084b04aa109b767292d056c9ee9f33d5cb10b1b1f59a0279318cfde05d94c06b3fdc481219467bb3bec6bda69c67d53ed402be155f263eee937cb54155b12136a89a46e1734f4deccdb583e7540c400dea115a04cd09b2f88dbf70ee025cb3683b16c9e4243eda18272a727ef90ac558262191c9cb273d4f774631c1bc62857719ca60acdc1b962c2c94e43fd2a7fa99d5f0ecd0b58485875e38d85a12f1ff83a20691b7990b0fdfb562835c47435700ab01f5cd6728582866d6417bdad24896d682f57327f3f357f92e231d7445a88e8d62a31657804bda891fbff40aebfa7f1998e0238556c88b06cad3e4649fb8ae0561742e4f0a5470ff1d960765815806655e27dc35a481884aef885816125ddc6eb204e45cc9e3a72bf6baa8b8c842c5fa47837fb7f939bcd87abde3aabd1e81a732bd2dcf1d6945a33155ae5040e039f4873ac6d10baf1a9e43eb12078833541b2076327aa6d55a090b541f4810fa7b8884ea88c34ee43cbff40d44adb4fdbef702bb488a88099a373799583c0cb80dd2d248b42ee1b654fff03b3806ee493b2720c9b3aadc29bf471698a900bac7456c00b3f89e208250d841ca24424ef4c6e3b07ae9aa5a00ed1f766b7a929a6de5e3a70dbab9c142a3510bbcf84f88c347400197ff4a9f7da8346713e664a231959802d7a6cf75c2a173c2db344e6d4a5d56f14ac840a76697737e218df841fbb7a8f3f08513b3c542e52cc31b94ebdc443d1078b4decdf9a75e95e8aba608d33431ec59b57febae0f555880e116c692c2e9f1a9a65de6bc2837c768c3eb51683d2847d094b175a879ed511e66165f1de8abd1dcd23cac7c1ec82d9a52e308e963a77cf65dca0f0db111d46ea30706015beb00ec729304e0794895cf4c9ffee381b9dc4db3fc4d44181e018a6ee8000b868ef0f6160804464b254d14be3559d4caf9678b5de7b7b1a7a9070d0cf44ffd032e70fcc92e5bbd5cf184b555b97e34c458f87a09abe6de3908048bcc6f5507a73b2223ecf3d9c29f17f00bdf6d61e208cb9005a768db218320e7e978fc959b55e7302ac695dc17885a23246b49bfd619e57d49863161c31abfeaf8f8cdf8833eca414424e4e8845f127a575087d5913b89395ef2aa55d3cf8b3b483f396b713c65a0ba185653e2986e5115071a047fcaf0ae1fa19ae7b04081b1310982d392383bb222ebfa5ba52744e12a72513e438cf6d03af216476c26994891acb28f59838741142ef12497861ec13abc8acbb2466268e8caec8284202d03fcaded555ed974b17d41c330f848d0e2f1b5a9108855768efac063c9920ac12b6a879a08948d0f9200ef3f75da5f41b2f543761bf7d0d86e56cc989297922460db73a03ce84ccc4030fa70397fb5ebc5cbc8f6cf421f23c44bc6189df836d6ed6a0fc78038a5a8608036e674999c34a70fb35b8465c0d6758728acb8d73eabb3ac644d6758c0c73296083f3954c9432d9ed6c71996b021695e7d65b5375b2895a334009edfc2a6919cfc3eec78ad4b9287987f1299da8bedbec20a505cfdbb44723d4bc3cd2d1fe12f00b19849d6f72a610abe23dcbffc8ade7ec3bd0317af222b65c7ff5b5495220fc13e5cda3fa09da3f95fe2d8d76d6e5445d3dc1643b9c66b9c7c8107ed50a0a29b31e66402fea924c509767ad063dfffa4ad6d54d7f58544f1bc2358feb112f8ea19d97c6eb91cb5f369ad9b4107d899d1cae3e5c724bffa48b87ca17f35306d3812384215d1abf008a7b907ad0858d50c125139dcffeaba4361b7f953f6a03f074cca6df53e91ff16c78827e83f0ee880f4f5195310028394fa5c5f3ba09186284bc29f4b6e8416a138505cf499953a2c6c8ccf9a564873d76e865c9910a20d228283e2cd33fc3f56c013a8d7d07716f9d818dd161199b436dd88262394d1a87a38a541a85f8b7eb998dd13fe030b3724d081dea153fce02a84f5558de530c44755f6a9881fdf2e0ace74e8717b9ac72bd9eaaff7885cc06859aa9aebddf0ef40c17f2d1a683b99702ad953a8ca9a51ec84692e1aa88ceea09f4bf605ce20b8cdeda1e3a28db51fbc731c8849bf745eb4e8d856bd9693e77980f418550012794cc6d95b22716d9afe4d185781264b1192ad706040d0e15d4821e30e08f34048456ffd93f3155194cbd076c24c1f5684354f0739143b8211d2991f08e454427e459b107a71f3e0b5f0606c9daa4b4dd3fa76c853bc858ee103e50e7faaeb02a3421bd55fa8a9e287bd2e05ee9a2084aef08260f837b4c3013fe8e3f6cf9420fe4d218ce62b4da5abae4361e0e5e97561c9d68188229a44b345cf28257cf8f053e9f953d6e47e881c8cddc7c1bbfdc923ea870e8c241ef5e7902e730fcf0292ce2643a1ee75a36fd97025cc20e150b3080d378d6046ad87a77ee7263472719181de493b6074cf5a8c4582b691c75bd21d7affa7719d90ef574240bfb654be3072740670a8f778713f5e79fa0343d7c94951d4e1dda38945c1f1c4c79b0f46b1794adf40742c52f886c76405a4e43249a6cd0ad084b03e2523c8631e348666d2f48aa9e998b93e0e25dceab0e1a7ef1a55f7c65f19211cee7cc13f85450317d0b12dbed6276515724929d660a69001e89c88430b48d4aa0c27214317d9ae2931b35e51fc52919c6c6587d109f3ee90e3e0d362188a26ae5ce80ddd83b702b7424ea9db01b49731ecc57445d651091b4bbe3d1bc220b3e5185a8d49a1fe80a831ea7e2fe521e3e04fb11b42c2e4a609ad6015bedee86f0189457819e71f14c3627b9f45f6ecc3447684d160ea4ac997c73642271ce1e6a46ecb8bde88038c39d123f4959a78f0c8007855cab251e8d3da4d630000ecd9126e6833d63328a24c422fc59d9359e12dfcf27d0c5f0199b4821e3cd1de1ff163fc49a9df289a9974503df73519f1552e44e1a98569af102affe855d8f39d6a34742ab7064c82c88bf08e8a01352a500a36f795cdc0b4037aac666c88bd9871982bb6ff04dc88a5245039e2ab2ad19240ea285951e6177b10884632b34fad1217a07b38d550559090520a9e1b863b056838b479879f1895435aa98220a8f9a6d76db3473a6d3847f65040f7ba4d761ee389d4da5f3413232a7046c0abf5070c8b99d88e641b201f5da1c9afdc9edff2bcdc2f470f991089f05dd50150db240ef0f642d811eee33b99129b73f096d8cdddcd5859c0d2e197a96707b15cb6b3702c6682907c8688922ee114ddd36d9907ceb5259cd5bba0084a436ecd1642d23b7f66c6ce0c64185c7d8258c977a52178a57b60b41ab9ece7b84aae11bb5950bbff2dacda0d64240fcb40409ed7a53e69477d230f149529d3fe6428682453d6251fd921c8688547eedd51b5c68844880751a48612aed8826a37576d2bdd8005f765ac392551ff70cde90073d7f0b5512a16dd2034c1376a4080032dc0abe900746558ce59dd2c4d231a706d2665067273dde3df674cfa4ccbadb598f42e13e846fc4a22035f9b854af3c2500eb992c01097039140dd976c37dd9fb5be240f8f89ffeb634aeea48d28b8c04660eceb21c793218ca51e92982bf6e6f26922df5298239c4a89714e8a751cd02a659df9529860a1514f1a38629a5873ddd9b6090e6a39a042002ede0e9cbc9296ccb230a9bae17171ba4ef5cd6001157c8984f129d7b7a851066bd1fbfd5d40418eb076677587b8ad3f0d30aee8b11a1b309a2a4aa67cb340ffd2c851a80ad034548f1cdd55bceb68bc6d92b9b9d2a6e0fe0df3fd0bb95a18ef580e85c6b74262443a276a822babfcf27aae1c1c34816f3ebc80506330c8a1061dab2f6ac40053a62579fbadd88d3554c4ce5b6831fee23a3a531d1ba63e53bca00bb43fc391d63f59a67199feda087c1165c1d5995d0720990e89c48cef7b25de004fdc9190a298c67c460d776b1841fb80ea780f7df5acf91dc80087a3ab194c2a97729c024e42668964e26f5375a7fbe24c1520643ad2f349fcaf537c48bf433f5b9a45b012ebda2247a0f0bbe48f1b1d0e846714989b47d6f92f0d88f5c8739a31bf4133023e14fa286411665dc848f4d58d344698847724fc929854caf1cde8ea0d09c07b9f92374962f73f2d1f40e3902cb7d56b15e7d0eefcb961882c0dde1878b362784afc69cb0794f0fd51b61c1b9d03a02fc47ae558dd9f4deabc27b59977f492e1614d7e474614fd8dbee719e0f69a2f0ce128a6f34032ccb3c35f82d313e590947f4f99ea483df92e7639d67d072741304e8e0bc74dbd0b23f3cb45d85a3bb26374a4396eb3b6a4c00355fb8cc775aaf6703f201ff59b1b4f27a182df262d7089677abe9ae5698d33b15fb7d4dd4ca5c3d907daf4b549e07f51ae0b484c99614a72ed2a0e63935ddee0ba964ae607aba417e84221123ab810580d225047f4929582b6a546e716b2b9c090d4b9ef3ee96ae81e494a5e9adaf4e9643b9612c332e3cc93d565710a48f6e2090808a46e14fd79075d0a72f700e01ecfc85af725a14440a5a40c1004d11b0332ca006e574f5b101aae2b380d39a2a74073f9506bf2e0a6db9e9d44f3c0b34d8f4691cefaddac68fe1f4b9217b8da1ad1c6832af7516ff283f1c24162d5c9d43c6535af3b663c8f6b317999b5a467360cdbc798b621d6450be808681e1ef26c3b9b41b45b8f6ed4a6a3595a19a15eda260e91cf4bd27cc6c4a9a88936d82713001dfb2cad647702a2bc220ae6081bbbc13c83d4d4e062801150d72d7e5118df025a8358f40f4210d7ccd0c64a724bfe36e0a125e3f2f7a19d5762c83f155a224598217f7bb4e7888d0aa934e3093280e049c77787906ec5f65b531dd8523c41c007152ee734bb9f3b41c5ac053e08c2a114b7cc8570dd2060156591ffa67b27471a6d3670e9084e2723e81f98deedafabecd6903aa119e5a8e848c7516df9aa6642fe93d368010ecca14808cbf3b997b04f3bede532447812f18f9dff221fbe5c04e44c2a574bdd76c15b1f60c84093c165abd36b325478cec46b35db110fec226147ac00e55ebc8c2d694c9c5a5a94fdcc3ae9bf905c8a7aaea5c51011c79bf922985e92c6e34eb378a308336dfb376803039ce0e234d2d8a3a1a0ee6b3ccfed7b2e36176bdf444da598ba702c752e2fcfd2e98a4", + "public_inputs_hex": "0x25832c071d6d99ad42c7b885e48b10100726dc0de03c0a779b282c519ccf538a25fc312a5f0009edd084811b739bcbd529987df1cea36f5a2451538666257396000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000097e089d738cbdfe4aabdacf499858d5d00000000000000000000000000000000bea27e9a0462c1bbcfe5d7d11e69ab7c2208484402633db0cfcb2af11d3b66ff07cd7b6b12c3a35e9581183e399d53f710ade7d9aa4cfe74bb36dd9a0e12531b1126fa2403608e2b7d175414fcb9e2f31dd5a66f5ca90ea104b52c48f4a3e630f174014acc8270d5f4dc613a06eb6a3619654bcbcf5e533790d9be255bc5ca90c779d6375fc717d27349065da5753954032f128b9e186d3fd9cd5460214fd5cc67db90c397056d90b3fa1e1e93174c9904fcf7f4ac91f0dc986701c89901fb7d914b8da5dcd57d430d860c3979baf98a" }, "decryption_aggregator": { - "proof_hex": "0x0000000000000000000000000000000000000000000000046462eded1bbde4bf000000000000000000000000000000000000000000000009f2fdc2ae91c95310000000000000000000000000000000000000000000000000b2ea26392102492c00000000000000000000000000000000000000000000000000004afc85764e79000000000000000000000000000000000000000000000004c469c087756779e800000000000000000000000000000000000000000000000d3dc12dc70ceba4e500000000000000000000000000000000000000000000000d09dfd159e66bd2360000000000000000000000000000000000000000000000000001d0742afdbf00000000000000000000000000000000000000000000000009104c8f5d91fa2bf500000000000000000000000000000000000000000000000836b1660e0992fc3c0000000000000000000000000000000000000000000000031380efa2b7ff3ce80000000000000000000000000000000000000000000000000001d837d5ff0a5500000000000000000000000000000000000000000000000db4b2385e73fbe68b00000000000000000000000000000000000000000000000e4f7388c73406d61700000000000000000000000000000000000000000000000e8623e231e09b7f3a000000000000000000000000000000000000000000000000000132c5f9251f0e1f3f0033a84e44de526080bdfdef3d2c4e9be76761bf24b2d0e31ac487ab12b12f3b1b559ce6d9ce7c97b5f31aae0e6529acf2d329858733b8c0215b3e3314c51eb174b690f7d4f832df6574dd9e4bfdd41cc47539b0301c66a88984cc0347a312b53b6e93390fa5cff0fbb34c9a55b3bfa61ab7841f31779fec5644f07e5f9c17d0eb1194403db98035cef3a0d47e70ddedfbfb47bd33c44fc0f7f4921d50180f10ba9e083af9917dde07ffbe45a53e65983092dc0f35e1c84f92b7189595390810dddf63209c3f94b856eae91571feb451a665cd1a1035b990c887ecc43cba2433686433d56359e92f6bacf0501d6d7662ce00d33aebf14dbe64164c036caf16519af50842a2f1478375a011705e1b6e3cc8d1427b463a370002e3a70896ad27996d20e8ff12e70916e72471a5dbaef7f378d7232905aba8cecc91e8c077c72a272b8af0c6bc297b6b8563e218a17a1d510b271bf12dd8d3aa90e56d6519a32d29635466a7bd4dfdf51438ccceb51d486058596bd2e201d320c9b63fe239251273008b48d56b8a01c916ad52aace95cfaaae3232df4a22af016a830f00b2280dc4090249ebc6c4f4977b3d2f3e92603ca1e86d0c65fb91f757747e5b3c64f229c98b47e1adbdae651e8c93d1b5e22b26a27a4004b26a4cc6dece078c1e1f420e928f4810f467c371466a5ad780e27de4b7cc7d34c4bcf9bc4d1a8d69382b5c26a661451205b6074193728e248ef7585707509e09eae306e78710f1fb3288251b20d0edf70c5a978f32b92a869fe73975d955f5281b23392981a6f19a2f0f58271d29171ed9a120fb70186dd4f920f56f767149d663c103ad123bb86de7d5ab1678aaa63cc7e6039049df417f336220a6115e3e860bf85aa96a44d22587562527980f69c45463860ee9df44482e0f52c5a10107aa1bd1fa8a3ffa215868740307471504d1532b017118223f73cec88bdb2514519f0eb31f1c14aa42fccc0d541f5b3ea28bd0f5a00d90defbeeb8e25bdb73835f623fa6bfee1e5ea3032e649608c59db0e1d6d963d552f4b4633c5767b0e8bddd6f350c179ed032448ecb129c15f26bb9e1ca1f3529eef918c8ff9788b597b6befad98ef7b67aa0eb9134d5b4210870b8989b0adbbeabe3dfebe6ea30bd7d60659f4e39e266184b8243691b2e0552aae18e9cd627f7c5ec8693c5fa0d609eded0c8d047ec9ea6c224418278250112560148af7398eef1f9dd48561fa9c0441801dbdd69c8bd46e5c4af99ffe4109f7ed54f9cb7f83e617e6b2f93b922bce7e1c07151e676a7ece630dd747bcc142aeccbc157a93950eed8401606e1b16e66571b7f8ef663ccf4e93fb82995212bc9e169ea1c0594356b171e607e54fc02180a1059edf5acb8983064734fd9f8209e394bb72f81f207edcfaf9f2ed0b8c0689b85c47181abcfc8d36e08b0c5ae05832a231dcb4f6da7f1ff2ac341a08b210acdf2bf48f315d5920175f3d5cec908b4961c1e62cb178fd865c31734ac843d19fe58175f36c3bd84dd20e8069f6b0a624f48a0e47210130d1e6697959e2fc351c28cdc4228fe9fe37fd5abaa897e269391d032b12bcccdfe6c5b4157526f2325f20b13b8a81f8ee1492e0008cc770dc6aa7a1be35998418d9d54e3eeb7bc87d1ae47d20d47645c4973519428a79b15d9121c942e03cc0ccd93c2158ec1e33c2b59bb09173e7b7c9662f2baba474b01d7183e0570580d82094361ca63a614ebb95d875ff403af22cabd79cc4e8f400424df7b0904cb8d32decc3e907e6a0b511bec4ce2fe9331afdf13b26b4b010b0b3f755f1a444cc372cbbb860872fa0493f8c492a7f23867ff93dda7b637a2e90efee7b19c99a3476e8f399e1c68944d4bac5b988ae883dac4f406ec18abb7ac0c45dca453ba41f5b9c28dcca7905816fc9600d2298b31a000bda8fd06731f6f26b119a02a7fc2a4ae33307e9f2798f2502ba08f0cba86fa82624386a8a7cf1a1bcc4583eb73ca4ac0b5285cef38d0a4a6302218e5ff0184f9c9908eca82c01a26e711272a4d2dc6c57ad49857ecb1b4adab7807061cb4f5edfdde5930058ee71e8bc31fedd59323de5af8e5713c7ceb21d48c3f73611979e7e2712684589c4711f24d5a2b83af9233bea1cf2268234eac399129feda79cc48c5cd77735d9b000d2d0a40be4f80ee8003228f36bd9602fff33d890bec95c8c23e00e7cae127c41075162afa6c2b18a81f299e7eae0f590c18989adf321dfd19a846924be23a7918c08a3dd27cd71b39d3e3562973ca37074ec000f69aa3824710bc344bd5ea292ae856b14a9a14635879ccbf87f082eddf2dbd240b9fa4702f5fc5d88ee72b2a096808a9862cbf8ae30240058d22dd69272b346467520339fda95a07f6a8403325be8b2eb1744fef4514ad7158c52488019b3eafa4d8cf7df694c3bf47c3a59c1a1fc4a36060bc9af14ebf2eb79d07cfda2528c398b145317c2cc84de6137d44221226dbd233ab0c7c0263ddef6811487072f0e218b94a6c72fc7e39bc27141401b11d54d55aba111509422d31d6cb92dea31534ace379c0427c6c3a92d4f90f02251ec156fd36045aa90adf78403f49e8479b8ca9778326da1425427815fbd6274bf80015317e3ecdca8795d60e025b58a56dc77f5a4b9acb453d3e78deee5c14a5cd11d5d16c49fef05d37c81548bcc270ef9f21a79b449a30d540ee0b9a8307e991ea9b46f57eb69d7c1ebe87a8fdf4f8048b4f41d4808162f8e0f7cfb3e11a5c3cdec6eecb39b1351814f82418b9170740fff3f5681d48fce7310e527b6a03d5ae1282295d1a77b314268efd8cac07fc028290a1c8657e45227f4b6ee63a24de15adf0cd89fa38336b41277d5fbb3dd19e281b815b2c0d2e9c3e5511797e00e3f664895d68974f56c39c9889994ab59f8cab6b8a8ecb2d703646a2236aa91198ae08f77f02dfc879c800f7c84e398ed8a43f20f2aea496b004cc58fcf4780b4966b97a4be732ee4358cbdfa657c322cd78549ee3780e0350374ea4a3d8900f6418d683ec071a1273be730e362daf287de8c335727321143ba40ee0115c241f9ecad9f72e9925e3de109f1e566341752dd39b45d512d2388dacf23b281ce3108c6659ba45864d7bb6836042b9097f20f3f2a053046045dc613ef501a2eea81281834f5e8f9d7140f709b79d53fd264556d70139ed47d25666027aa69c58e42b34757fdfd0b9d122191696b4b4bf4eca578e24fd9b844b34d73c31ac3ddfa801ff012ca13ccd6b0f5e561e0e6430b4be2b0b2d374ea129e470491ed7c3b13b183e35a8ce4cd1853425fe864158971415c7a65f11dfe69d5074f950809a122a28063e5d27dab57ae4f0b3ae9fc361028adf438677dfb5dfb988f8b8b6ae57a3076e5ea1a0b2f974df0ffbfe0a060e3637c3127776fa81d9b01ea0d657dabda901d6807a490c87e46e4e394192ec98b42ed04f334b5a1c0f5057e4a4c557c01a1043c947cc968219522c1abe82b20d6a4db9c2b388a24b71cced988a4b883a481d25e3810be1b850a40508bc3fa632b2e5fcff0a7b1a49340915865bd52f501f1f78f68122727eb366d619ffc67d08d4d38cf0e91ea66920699c3a2dcd37656724c44f6274e12fa976dcaa3d6cb603e2b323f8dcacbcfda2d2371a78596fd7e42e52e2ba095e30b7021a480d05dad2f2838df1fbbaf38e0df2af304c8b1175b80cb447d4e3ba6d26637a624eec49a5617a8380020addb7879bc212fe1c600425147bf057f7596b5f2c938d61049a8cd1889ab5c40ab9386a13aa7022d00ad42d0e1b1338ff64fa766858440e350fa32f5fc613ccd8b46c95090843de78343271006a68bf23479c2223f60d11d64a98c2865fd34f92e687eb8c2b7a28deca830818a2208adc5a09a52dcfdc04f6e0e53bbc232b046d60528ffb794238b3e64b5417d6dfa423205c8a1ab17a90537a19ef9e5931c33a757771a62c7288865270fa1762f450463e4256850c78446525c13e0f55928414615620e1c41fc5f2a62bbe2ec7351b1d969bf8399ed677fcdd79a6689cb8c08682aa486ed19431e2fea30326c3b9cb74eb998fdd93bd366ca54253b2ac0e213d65275b7e15be6f55b87e5326ae1e2391bfc71e63cb96fe8badbb8eea59b1bfbbc89d9fa9c76214c968a9ef10f4697708d257e2caa80176fce9c9dd0bf7f08db787efff22e8c50a2b3d851c03bc1a26a9f96c6c7519fa1f9f69e89d21f3a846cfe8c7825b32cd3b1df30dba1d5dbd1e3883130ed44f9f1708164d7c037f7110fc42a2569005b099cd6c03561737abb36b4e6751c47f50a1749e53575fb2d60336dfb156eea527c39e6044fd0fa4c2d07af7ebb89646540fb42fce47fe70faaf75eeef6741a570a90a39e2212e25594c3141f72b1caabdbcdd33ae4e941fe07d0a9fd16698c6856b74619a810c0cfff04663e7bee110fefa623a4db43fad9bd5d72829e65d9a71427a0d5c2f0bc57df006430e7edbc07970858f1f006b42a6b8e510300fc604821abe5d9ed612879f61da683c655452ab2d76bf7345c63299b02b7ccaf83dcb03552c5048020354ed28001f40fb66a7fc55ff272aa8de1844409e56a6c2a3fcb89c94218f082674c00541fe4443178d227abef44644d4abfd5e9303fff2e68bf3e1d140235910cd28a2f0ac9cd54303522a68c80e618d937536c1d26897c8f85b4acf4aa1060c9d7cd154657431320a619ea0a603fd86a52edf39d34cbfd2327b95c4d02dac2df4af3fda5d0fb1411f7499e9228e69f7baba0aeed7b1e31f6d17aad11c2c4a1fda0b5b8b20f3f9963100e0dcd1ab2346b12f602bc30a2bb453e615a7c7df7a1e209bafa91194c0e3da621aea9637db24336c649d82aed522c6ebdc9e3079df264481411d0846d3f82043e90df085bb974d2ff8c5094b56b0721e622a3ece1e2c72afee9cce381b1ab0a042d7a2a0d32bfe34d76e43ae24cfa00802038ce3482e328423d2b01a87447801dd0fc1e2c33563bf35c6bf7ee27f8ea7808e26da630559777a16193d3cbaa060b686fdf5756e395ca3c942d5415ea321930d9bc4581da056043fe7c53176c8fcd66835b9ef69bd815564d1bc7fc71c1373bfc03d480b7aacb1b71a1d5cb97773bd8420ecedb4abeac3762884e73eb9701d5e192c1e2798ea30398aa7c6aa711720294d914419284a52a9794048ad73895e21c73f2e27ee0aeb6cbfc1ed89266847420a154aa825df70f24eb1b1f0b958c046771a911baa6453cba72219ac18b8e31e8b660828ed849b2cd1b642f2494e7430d440552ccde3ff0ea6860a58505c5d2c029cbb4f5fa598fe4ac011751790e0e606322c13d130dfeb16f00ef3a180f8e4886c9a3f367a36a4b2fa215a60511d77a4d1ab2e1d16ee35174f5333bacc3170eb79641811ab8d999ca78bd6aeb778c04bfe4b022405d81d43d828fa1363837759b1d688f9bc423f18067c1e63e7ddcae77b252d284dd9ebdebff77e6f0f9e799a7461a0f4899e54c7d34d148cb21cc3d29c76292c218095c7386baa2c5304e29fd4c70bd82e6062cf160ebb110230f444c2d71f3187f7f4932fda50d850dc56b3ef554e7745311c76955f8eb116e15d3f72d81a267864acfa25775724ef1f370daa11bc9983df1f6d897ed8f040899ecaad740b34dfb34c45c325bd21c38b8634103c639653053c1a72bf63e3a074b437a978169d1d7cf13831621c414bd3d03f307e7bf3c2bc654afdd857c43c0e1e47c4e726f6703cf414f9bef59c90a72eb596013447cc3cf7a8576cecd1674d8607f22e0cf5d470df13e216be6c2e9e8ea0ff0a179c00cac95375a14e02787cacb54a901fd68c2ae7eb0ee85c442aae3d8304039a8209c8090040c83dc3e287ce5187731d9b8e516f91b73a1475c4c4077544dbd325ee6ccfa3aabd1144352afdbd457c2f39054b92189663deb023ab48081a80b8e28841188838be3981e7e93840ac35199412daa396d472a6a2cd403a92a8a80995a1092e99f0dab79a2c024258bff1009161d190a6eff111d46fd2e4fb3528475d89ed0f4acbd2a83ed488cd0d14fb2864e012328fa9fa8234ef040bd7e64c94d8e5dd435f85564aed36b3c59bf50b0611681a82df36ab4b44b009b20fe02e8689ea64df791546cd3db0588d08074c241768008e3feedafd677164b7e19c9dfb2a1f5b4c91abe6b2716dda9027a8cc020340435acab05014bc0b5fba39be8a5dfe4751ec0cd65a54e3acaf559fc45310001c7116a956f02d2c919493c1972c2a8c37c5c7018371de046603f943861d069b44e45d5c59aa7b8e14620ef592b42e43dcd8022db7fd3d652bc292fdebed066f0db566282ce6fd05432d2bf063cc05c2372a442e4eb1ae95d943750660e129ab4a81c1e699cb974b471bb885af4c42f8be4be4a44f6c16cf33b22bfacc7122532e5f78e3da9ca7b8da40ad3651c7a3cde3c028a39f76ee378a5df8e7122d117b0ada3274420f4169996ff8ad7f0644294b964bd02e43b573e027e56c31f30281ded22c23f5318715d0f675c4c697a2c257f22112738f30ba3d9abfab6ffa1b183c5a511100513b515950e7995ccf0f082cb5b0d62b57269e2c7cf3e4c0eb0bffb7398d6bcbc8c3a742ce3bfb2975d365c391409d9590552733692a1a62b7138cea6bdb50758166ea8db309d0ad52dd680140c79d82fe429ceced64c6c214103a90d27fdc490bf99777ffd713275db4329c3cc42f5d631a29af86d0e449a5298a95d8f509c980f7b11abc90efb5b6ec019ba2abe05ff97971e3cc4494a8d11c320855d17be84acbdabcc29634e10451cc55f7b18e63385dee746c70927b271c9d654c07f30212ba3d0b34ab1c7d81484353e7303ba8739122ea0b4d054c5905b3b6fc0e3482c9d1f92261d1caf129228350cf179238a409ae49a4887645050da8ffcf50fa4ef02b22e5cd98fee5625348f8dd72c4806e6a6028da2514e05314cfd201047def07dbac92fc3f31197a0f94659a6264cd08c7b7b1b73f5cc19d074a8c82be071ccd4ad401a5907a3816735668a55c2c2254cc94d9fd42d2990419d4ce2b03bae535d55557127ecd66370f5a555fa5b3d3255b0e3e18040e7c9718c174a2ecd7916c33c950e946764b5a2490252a6c8b4e8a3f4e4200160e12472f73ca99a627089fc5affdb380da4506c458ac642d6a8f151f60b09261abddb2092edcbd085881db6d5b96013108dabdc80a3b38fa8d2e638be26c78465bbeaf2c06f7a360a2cc343d6d9dc2db8f6424302e9718b8884ec3d80e99407770f64a15777f2da7f4aab9408e3ae2f3414bbffd74a290cd14195ef7fff6b31d737bc22f2a1491ff76b75114b2105c8ced13258e504a7b36c5102321daa348581a551729aa4fd8e5c8a411c89f29eb17ccbbdb02141008bbdf46c7274a2c719595fb7a2f5854c0f6543b85ec7221d1e15b8e867c80848016f25e72617f27e537cd721c05b0e96a7801ee3fc43a534ff819962b1e8282ed7fe5437df8026f12931affc92a45a488eb039c2285d69ebb9cc721d0c0481ade8e27986cc2424bd63f09ea13281fa330a68c69d21ea8262d617a8784c5c3130f9fe2638a28d3cdda46fa9c3f110d509bb1dfefd5f72c7af0c2d6cf3036ea02de515f6876005bbac8d8c51d6300ac7fc8e451e423e4ba7c25eb016814dbbe5a9847c8d72a519dee86749635c52fc29948f9db22787989d3d2630dabd1b4a74528011a8a2df437b4fa220098850a3e4753fadb485e012a8cc00da2cd5919c51598f8ff98d82ff813d03bedaedf2fea1e5e0c489ac9b0400e0d949e92115373e6350c76f49c345b79f2ff56bcd001b956017661a2f6b6b167f5f12b4894a32157334c60f29d0521166d13d15de9302c9b0c0bb5c7880f6acbf2acb78d97a66d12e898b7ec0d8c7322bf62e51aec263770b749a733e1842af368cb129d636ca2c23890cd74c44f69a427e6dcd095119e080b300e82de5fc8b08396e97d027b8e781f0cbd63489c5d496949b3daee08a8d6b94c056c4b29bdbefdfb87f715725d48e2aa2c8ecb2e72e4a6329b861c11a1733f664320f80bb5e0624c847534380dd10bf3b9d7b0b3f3cbc00ed6d8d72ea19cc0831d47f5142d7699110a13d154190e29363598288d9e87582621ec8518aa844817a33cf7385a4867a624e6d35d19f08689cb4694d9eb4068a5a89cee14fe3cfd331d9edeba664f921f4e2af1b182eff2ffca37f65408d3d1b42eb324193f27aea86433f3a6aaa1f0ccc589243d364a6d284678652a5727709a417c212fda27231f6e20f52417f284a5641a6d80362cf3dd402b81e6dda971168329fc14aa355a2874208110adb7169be2c53ef263bdf59336ba78618087e36be1f3c9277257150ffe847f6d86895f1197dcaa651987c33d02f5ba5b482311f817d2752f96ec1b41838e338b2af7008a0d5949ff9f18dc7be79ef5739211659f266d621462e12c1be7bc4b4934fdb8699f993d2caf7b1c570cf25b802c98a25d69b994073b68b01ae79b6a69eb211a914afceb059e78d2a636d304a48f6b05bc32993f1eb3e3e642813c85af8b5f1de0888cb13c53fdc5d5d479c70ccbbe61744c1239002bf3e62cebcaeb5e7303b3e12a1f30fd0db795b804875570e7fed3230bd8052871b4aea05a90ad7b63f4113cef0be4dda60693a503b2378172a58c4624a2eb2d5737e779f841a33c28eb444b62d3d23520278eb740181fda57f544f3aee7e30252680255206ff7d0a4a519afb865069d8a05da1132d795895891fa94f8f29904f4324c26aceac3104c97d39759801a293e22e65a381aa86de3b50159ca9fca09cf8f2106c1ecba895d547e1dc71ed0d9e8db14b9db90888777e29ef793b337179e7d5a6852b64d326b7fff80c4434942d3585902b1c534450562c6ffd93e8c0d157d7f9386ead62dbe90615399b0c8fb87e5fca00721a2a3fb68d14d36819b09983dca3f3792b69abc99b3f3f5afd33d28cba0999b8968f72566f05de37d660436b2b1da3001d81f914ab0dc20eb913507e7e526d5f96f842dbc6d461b96df2c259d17a61cc499cc16d0ecb910225076caef6a3d6c2fa282b2bf34a1deb87129450563c1427f7e543ebbd7aa31c01a16f7f9ef377414182129f183ba1246f91048c125b304aec8c136a897807710b6a9a73cf827b2c53e733c2eb1df3fb2fb0210be8239b1631db74571a2e30ff1dc5e77a7be632890b5bed671bdaf6e2a960bdf75213571caa91dd52fab661a9e4fa96e23b6d814748fc4bd6a032ca1cbc71a6e2915cc8eb694d63a591eae3f5aec153656fb2311b4ba339a7e871ef872702461a3b251b88bd55cea092af0c1cf7ec9f96f35e46cd359223da833d8e518990775f13a8a47b5df373d0d46a9098a0b23c1dd6aa76b286f6708e7713811025a23a510820428c3768c4dfc8965fb9d34ed574ea7ca0d2eb426afe5f8fe0681ef02a7a0700344716e9466f589aaee49d2860b604052684091a9e0ea23dc12661a18dc0d314a36ae8c600e6a886d4343a2b42f3419ba19e793ede386baaa303a402f234bee6497b9e517ac24aaab0fb01afb0b1707423554a869d1bea6a5bf743f11f32baa913c5500c9df9db6f92f49d30b7adb7cda475c5cbcfbdab514f391b12c3e705687b7ca3381e1363090cbf57ff7a86d1fc0c9b110893d6537435e223b0966964c5e464aa76eb466b04c4d5c7037f19229aa437e7e490d1bf9b19eec700cee2eaf6b694fa0b6b912b86ac7bddd35f7270baf326abc5234e02798047f6100dd53510a41dc8fe6369350a1b458bf042e8204d4453a359a5d107ad266d8bd0a393b07ac21e86143568945dea47579f961da100dcd17c89e800299d1dac22413736f9bcfe75432de59c190fec427a659e0878ae078596ccfca7ce18070706a27da89553eba9079775003ae2cb47c214b82ea2eefefe40da9638e912cfe60822ae649c2057442471a471a9f952eff46a2babf1a83e19a4ddab3794cdac562db101a09b7a278b2dd6fb6e2a9d393579c92db556817f6dbdc7733599f140cb4382e6b319f574a62dbebd2af4cc151e0773ab2fec6239c69681263c76fd83cff19220271f850682cc592aaaa6eea28d6bc0cb73007fd4bd1bd995a099bd82c024f0a2f782d188ed96e6e3bf4087c26d3d237a2b12204a57053ad307c344ae34fa4213bd4ee4f056cb822fe91f44421f97b9553e372050526ddbec9a9810f0b77cd05e7dd08def408b601eea156f02988103cdc6af0fb020894d84e00680fc6cb690af351f694b00379f093c09cf78cb4261d49857bea4be6f8dd3f4a7b32f59a230e3189ede5dddf5124a8caf0482b511ba11705b8e97b0ae8daff89770da3fb7e20cb1d9be77cebb1509930887487b1599d90171d64bffc6e929ec317bf7e5aec2f7740dbe894189de87675d7e978196e17b528ac35b67d091c6b144dccebf6770a01a0077e8d2c021ad57fb50a34e3158e55e57f94290cb6db1438e73c26dd5f03367dc364867a8930faff385c5e3805b3f5d61b5fe90d04e51b1e14373054971a06811bbc967bd9eec33c892ae9c4ef7274d5e4351abbabd2bcb803a5f5c70f02860e11bdf399a1dfe38969bf66e7da76086fd1368b68e47963db7f9565b3130d69008e708fc5f8961db2d87f77fe3aa722795a6c711cdaa2d4da8f38eaef83196be74e4cf2a837a79259f60cff97b4901f7f48941807f07784fcbf4db57ba80c897759c9ca3474d1f1c03abf18050430fe347a17998ad5498c2afd48c8a98415b32a411758c283b4c28c1d5ca62fc3dc246c62fae1b7450b168c5854c3f6f81f25ec496179eca02a8934cceb7f9ab9fc81a0b5c0982e045b5742e3d21791562bf709a403a8ff7f4c3d3ed483bd94c60426e37242a53fb501d465f6771bdd1c01e4364a0bcd48a20d4fff5363f75c85d02ce552a1c66784f8c393df093885b02286068214029f61fe4946410855f18276aac139a43f0b328f281a40f607dc65006694ad288bedeb4d931e515e3d739eb1c0cc95d7c5284f3ae66f43286a98a92480eb742d842cf382e23e07211c6767bc86b65efcaf58199ad5bbcfaeb67b8116ab42ba4929e61ef40822b47b3b77e1411f2f8dbc72c1e930cd08e4eb38f37b0bea7c2020d7ee87ea54c1b3696fdbc146aa584a23042c69e6efe33f7556c1762b3e3ba8c773badbf5104256d6a599fd5b20145beefa188347e080716230875a1f23ad5fd8f118d14793db2a001b386410d01cae4501bde987126554aa1f943809b93a34284851e0092f0ddadd9d27066c2568c8ebf91bbd5e1554c3ebbc6eb509d2ea1544f9c6b1dce97cd8584418ced461121ffcdec9e3dd1fa14f95d2e4ea08cf6a13709220c27a0a49bb9334e11e182a621cde1bde5f384b1b0ad51d19833033a68bb8ad808d6c9c7b07ab154119abbcbb85ef10d40fb251969dc2108c90221aec3e7930b31580525bb5871112787777aea6ad16614536a5a667520debea18baad0cb9f041125b510f5f1fd48f41cd60268c6ec4149908e7f9c9a1c3fcf813a79c776a2eea726579809ef20c267d839f3a208120f8736779796e9dfa7bca253a82820d90f4f5f7fb4b94a870394dbb688fdcc0bb429e43546b8b88743f3f114951cfc8e34a21110a24cfb809985668ea681e55f068d8f260436dfcbaffc91c32edff5ee1777d2ff82c80ea797077225f691258424cf5f5d64b3c312d6f48257b1ca15daafc6d830d0d38e74669add7907e870f0f8e896837af7e0104b15d103b7ad3d25f8de54bcc7ba08a0b3bb9f30e238fe4e3321a523728c554b162110489739821241ca55e4ecbcc5f6f25bfb44763a32e19fe977940ce8800db666317bdcdf1f29834dc6b2f07c60f7076ea4f4c73881e89734d46a31a160380704e0e4d0b30a60fae2bd517e3c939cf57682a076d4f6f364126bb2975f940ee8fdd0976ffd75e34827735162044bff075b04735ee3468e51d80a7a09bed81b48942205981554c5a78f504f763531fdb93d2861ef929be2f873e59dcec85631807b70484a7f6ec144b234ea375bdd48188e15ada0eb56ad1b987d75ed356bb65d5e01bdf10e80176f7be41f9d31008b8274f1b0a8e37108cfd37fa80c5be57fdc6450207b4b4209e983e6aa97e26c81afb4d57059de74276ffde689f883d5ed67abd2ccd9fbc681e291fed67130e43f755601bae4c8849909e9030484cf3c71aea07227f95a36dffb88c8d0131284fba36b597c0607f0ab3b1bb6c215a19fd80cdc92c0ae72660453b0973ebfa890718c2939f1207e3ae5ae18bde7208392f708a9a093cbd866e4426034e015fa66d8b9379509021996d41841c44374f7e4ec77a8e0bcb2604e0783d0a7981f77addc0d9d00dcdba536950e38f1893b138696ca20828cc6f843d63ce7c068774807ac2f6a52bd2adc3649c130a35b854e2965dda9a2a39eab89126cc289a350e2bf0eda765a5bc5da8640047bf12423fd54224d0d6053505f8e689a403440ad11e799b653515ad5ebadac03c3c17a2e6a40ad8b829025a520eabe6104fefc0349b83a1292f1713d4e56131708398777532728fcd2b0b712b5802b896281422c1bc219dfd0d9df3be491a20443ed5119ae62c468d2a22adda3834369b2cefc68f1033b217baa21720c4e4813cd4b52388f3bce5eb3e21ea381f1ee6305814a07f4742b52311720f7aa836766eb57fc2504d89fa68be03b747454dcc12f3b4434342eab6d95eb64c2dccd735983c553b76a009c18e6e2e8e783a9067cda1f5109f7371fcaa2cc1658c50fc513effba99a62f84479ede1c2afee100f375462e12d611ca1e58b350f4713e43436f8d44ed129d36d741772485b57e2cde8766e19956bf15fe1a3f715f462ff70e3e66911ca8b0349ccac50d0c4d59a71edabc1844172fce54e10bcba6f74cbd36c2c6cb8cdf86b07fcf272bbeae03157930ff5bf215a8fbeae00610efde36e8803758c44b71611ad8b7530f77a243c70d35bcbdf3d390e0e1f358a53bb7b271748486ae81cecf1d3bd7b312e91ec7312eb62f7f4465e9f133c90b40b5aabadf897db276170982e3682959027d4f12eee5a6720a6863c259d5569d30604063277d5afa87a04ff1db7cbbd8048b5f6ba32e0972746c42fada98ecc8139f01726b225c661b7131c962a6af431c46da1b18603580e0eb36b1b3a78803784752e95178856a52cdf293be7d20ca28afd91216a390b4c5fa200d13796d66a09e67c0dcad2e5cc6ba969843f35de110a26385709f5eaa333c3dbc672805554507e4492dd88e4e1fb37d30f00b100b0b73ef0f2805b3dcee77ee3c518d4d2b5e10a6e74139d13ec437fb20caf21f6b14258b219d2d7c874ff865b46668c9a98a6f95f7513c4840eac1fcd8c0d5983f2fc417fa028662ef9622af0c8b9a8370044569515953bc3351e7879256a1682f1913c6f71242142890f49878f50a88254967744ee98fc8f39b077df24f896475138b353992d43a58ab679391c189def4abb585c95fc78f8560ed1578334a54ef06c4e242e99763949a6214d2f1e6b2e0084716b5acb458f0132451aca43dbe9002d447989ac471fc47f751e9ab748f01dba71e41478c7ba6cba186c59ab2b22e0ae2cd982005400350f2b1fd5804f85a943324dcd60e01aec98058ec872048fc2a3aa79499437917db1f087117dc5627fb97486c24adaf4cdea43ec70a5ecb1115482b3eccdfff6508c76655387abd8db57b01b170d5e1870faa1384ba4365e7054331d92e9f9f0b1ad97b7b530669a248a4c26ceaf174cf6479efbc7da6ea54099c32957b8e46d8efb77b50d25e3c705ec7679f33abae0b097fd615c45f9d461b03dc3ca49cfa79c813d003bc5fe4ec9cfa94a1acd523d23b88d35ebb5a6e9a2fea8939d0a2391f5ba2f337b17972354cbee48f9f4316611ca4747267fb899a2c3deec9cbe9907b63384af2f8949c18e82d0599a14c794393c329254a5497322b8f054ff0c0c835e7176bef90eebe63c9caf6838cf97942832984d19839ab9a15ff2ee3f4e15a05e49a92af53f986375f372836e8b0871f4c4ec28a690e5e631d2dd1341b55a31770bbeb958ca73627dcb539875b11846f8129714880e708ee260d85ed2385e58c520b25866ee5635882ab26c9019999d6fbf748f1e799852121d87673b8e00f15076cdc02771e293c1ca49972b74ab8790702fbc2d08d89be1c26e413b5ff7ff00f30fdc45ed794caecb4f8e943d341f7ec1f9cbe686e8408302d278a2da6ae5b6328b996f93480f99dcbf66ac56244f780859f9bc5e6d61413b5b5724c4eaff5aa4d5113e19f2072cc4486528b4f864c0b2fdd8dc12c07f70799dcb83bccdf08e82e1fb2354171bec979c58e2dc82f05fb9018859906ff3803fc845ea83bfb869fca929234cedf2c7ed172a4a857031bd37d4a65886916451a01d80e3d40970692f0ab31cc53c737a8ffd3408641dd18b12b59d00880a1a51bf1201219c156f4687c89b3bba7966515c263a6da337c70219b18cbd7e1a7ca07f77287b04f62adf3ba0a00f903a4de156b402aa92faec6737f1be36050a4810eb34741a55cfc86f22b7e734e338f600f09df00574221e9f861fe9b68b5f8501ec4c809a6c85ede1d9410633478be10ac32a14f2d77664f050a16f2b0a73b470a99616c27a96a7b747c365d9191b9a0a92f96eb10e8cfd399d35a186ab9ee7f1680f3102a604fc69d1b1e5058113ac9d917ec32e1cb339755b5536e4715758f", - "public_inputs_hex": "0x1a207628cc6936816ccb62a7b56fdbbf8e975293b677c988644e018fc402e4411dfdc7cb6265f100524012f038ee1f205bf8789b70b46c57463dedb4998f7ac800000000000000000000000000000000c946233fabee579beb961008103a4c8d00000000000000000000000000000000026a297ba8fb72294cced25b49dae7c91806572c19ee2f3532e970d617919b3aa8cdc582782dfad0699badc631f75128000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000022b942ad53baa7c6e1a7616e4f0aa2eedf7d67eacc63696345525988225847479273fc58215abae6a73503410e8209a542c92bbea2ba8e6fb129c971def4ca8452ddcd2c1e0b08c268d942b52a49e7597873ccad9df1b02ea1ab854e7111eb2dd188f793a89424a83a3e746a72d4cdfd5702a7944deb0fa2ee04f84489f4af3c2000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "proof_hex": "0x0000000000000000000000000000000000000000000000056cad7c4d4ab29b08000000000000000000000000000000000000000000000001c619e9b18c75b568000000000000000000000000000000000000000000000005d70fe88223230f090000000000000000000000000000000000000000000000000000f4d3fe76e6b400000000000000000000000000000000000000000000000f3b1e196b01bccf7500000000000000000000000000000000000000000000000b6a2a87540a20bf3600000000000000000000000000000000000000000000000daa621f0595b95f1a00000000000000000000000000000000000000000000000000008d5a8ba7f638000000000000000000000000000000000000000000000001accc4779895fcbaf000000000000000000000000000000000000000000000000668ea7d6e9d31a1f0000000000000000000000000000000000000000000000044b0fb30c4478834500000000000000000000000000000000000000000000000000006bfc6495aec80000000000000000000000000000000000000000000000004f4f3c14746f379b0000000000000000000000000000000000000000000000088dbe00e529eda58c00000000000000000000000000000000000000000000000f2605405f1946fd4000000000000000000000000000000000000000000000000000025b1f866541452ef1d421942cbeb1c5cfb5397da431759d5d9a9c317d36a930660d1bc170b4702ef125b0f2c11c7a4326be8bccade5618401aefc5255a1c696e6e85324f1050f268c15d9ee4f26e41b34cf4f0d5cfb130caf915adfd5ba31f1bcc79825f919471d415c3651ca431b5f3cd654858e981efe0855a21b2e38d123135b44710f1cab2c035e4105d4bdd3529bb5fe9188da07432c5a89e76b8f89a6fa18f3529cc0bd0cd2927992356821b6e43d1bc83f471bd00bc8f49254474a4f608093bfed179125ae77567866514f161a7684c7e6f6655e7b13e3372a7134f9af19d9f684fceb06f4c1e272c65fdd85029c7fb523f641d823a62439843c26aa5cacb8fcf0dfa10446d9cf70618a9814cb612660cb51726a62b6e43e543cfdddd4d001513e0d9529b98f6dfe08ba29b43c0328d7f11c2aaa68a41680f6c09512906652df9b07b81922552a60c62d7866bfc580eee4c7a39fd466127d0467fd96a77f978a90deff11f53d729bdcfdf44340633294c43751c8ed5297483960c58ab9f5e4313a5e58037cc3e1e0d78015e20d0d922b7dc641a5d1ea3ccdd01925140b4035dc0576c415198c1b75ba202af61715a9e087da1e48acf524606b9345ba54bc72b3447cbb24b16a9c8665ed01f422f4fc43ce9b9b4f3fd06dd1e170974b8f58d297c6998219adee798f050eb69bc48e574c8cc88e5f54a599078596ab2010dee8ad7fd671166a365ee47c4303fb7f3814118d649b5ca3d5f81e8532255ed0a010c6f264b0270b360e011a625807a323e92b639d9c82d3ab7fddb9c617a42b341b7da8cc8f2f3a68ea0915dcc62b8ac703522c1ebbe5530bc3f347537fef899406586e07d21d6e94d5208ecdf0a86971102ce7d61860e0bd1b5125ce717315f91e4d3bd4100f7b505fad6af8e3abbdd4f0759813aae3a05e90c23b4ba78c93b25b1711b9082145f3fd8aea81849b9eb991eae4d7047d7d03ddd13acca9a9777f25674154e60e060bb5c5c7be3c78c5b31e43a5c897e4caffa9f7a1784a3421260ea5aee2d02e6433c0b5662245c4120deabd578c95be23824fddcf69241423fff241f95fba244ad1484c09e631e1b800a5d1ddbc91300085db9bacef86ed1c4d3cb780781e1c9e02ad787c161b5797f8f0659efa8344be77edca236a9fd2bf7bf2de0aa7be073b7654a7dab5618a0ce0309e58b827ba0946e73ef577921924d315838740ff2f02dd4e38468fe93cf477bd8895f1dcc5cf8ad4183ca384bdfbe3d46e4bfdfc13fddd978b48eb5ae0468a16c16e3a40d52eb88c6698a26fe59aa829d3548cea01f8791499143a368cc10df96dd9383f216939090abd0f703ffb62811e52d2361b848b466597ff32c1b723f6160f5e2a142b2eb8e636375a1dd708b9593913d80d2443dbfdb9aa76ec2b2a38a38b13f6511248a7c672e7b2361228788754d4c622966be5bbb77049e05d240123925a9c1cfdb7abab0f41c94d1874090481f9110dcb0a7e51c334aa75119c70b570e358ebbe6a273ae63baf45a461b2508e220422a32a363f8a7c9a1b2b2d5d5477762295c405aaab172eeccf35f892a410c5d9098bd985c36b0c0e5027c47d43d38200babc0cc31af1b49741a4af672038927004aeba9f5a687164f44ce33aee7a5c026f2213eaaa2e1a637d9c946bae55bb171e53d2d5e5c60820d878b6e6a3eeda0199fa2608e90a08b0fbdcd80e5f445c6e0667b98efc1f4fd2b08b320aa8a56807767a8d607c28db5ea61a5ecf9976ce281908a1c40c1000f3038f9196f47dc0ffd1d74305a28ba020cd726f6896f7fe390225cd292aeac8305388b6b765ca96d911283e733663900abcdc06ef4fa7570b15b7c47708512ad8abeb9173b1e6871fbf4315c843b2ea3a91afe5b23b82139d12c032c998348c3f44ed226fe1afc990192fe8bbcaa51e4547def8bb76c8a866192b0dfb27ba2db74f99b66881b6b9259e30e7795eb7524f2b82a997ec646e53031ec3c5b8b34022c16181257ec59b0884c7b4fd20d4b9425e8bd1f375deeba525971ea65b4a5f4256dd47880339f6ee908843d7d2cef8dad1fbdb75c2ca6ada1415f83c7b02138f0602169c0f75725ccf52dfeac97bbe61f439738325607a9e255e82ea48ed8af7f60d3a6b9f4f7c15250688bce43dc311e4e382a8ab0c3dba06c7b8c5ede63770e92feeeb31591d9e35f0db391bbdd3602b73bf8a0f0e91892a7acdc0a53834569dc6b661f12588133c0782d14b3516d4a9b5fe5e9c9df5df0c89c531e0bae4e6050957ba7ef3bfb44bf0bfc1a8d9b5b3d72de063dba8772e0f21894b3966a410b2cc849d184369cbfc20a8d2e76494c73f6294745e969f521f0fd22cf1b3dead3888791fe3a073b7be51f92c285ebe305ebb9cc691bb38b02a7360b39a0cd4db80dce561d9e798ae3bef95013b7e9dd5e43c630b824ece8b023679d5122e7dc07c95c35f9e2ef131138a07bf9020d1b62c389fe33b90552304be90309b9169733745f5900911312d4684235470faca34ed59582d1e2d380f22090616478eaddb735390bf840de0e5751ad629e8413921c82423fe4626c0812b612cc2cd48365f7ad6bb8e932a405567f4cafa3e3fd446e2713f9c626c6ff925a4b25d6a356314bd347906144b57400a22f588169bf9d4f30e77b9c6126a7c26970872791915f48f15f1a6378a83f588850df74ad183e97a9c4ce006b3ac640d2a650b8f228902eed1d0c2786300bdafed28dc54498c78ea482dc2e893a60a017389725f4f281f267191e72df183a69e0902c10081a40fc3da3aed353f03222db1ac7af26d0bec38702928d402544f59e76e0bec359e880fa2843665a0beec29bca4e0d866154021b0e26dcd7fd75b17625bfd982e699790f08ac3a44f584a2923094ff82c4b714ff0dc3a3cd156e174bb08f35a56b7cb2c261a886dea21321c20cc2635ffa25ec21be53e93e63a8267a43e3bac1a43172cda46e031b297a72abd0445f4d8bb99f2554e6f539a71cf629a62cbc7d0c64a3b9dbe0d19f4b4620d83e8ad85e85da1a6a18a22d261a036180ac1c3378c125e4a0c03aab46378780672aa764d1267a28d7048f775faace9735fc5ee7afdc9e17fa5a9721e976f842f007d8690aa54a60c95bd9a013a80b59b6a22324bf2c90740967c080bcb48140eeb8246e3d623b8d388a455c9cf7f1c26b5e98226b396810015c7caa384cdaf07b549ad42aab158f69f3da72c1ea1a5c7cf00b7781f5e5b62ab04838c2f6586209c0cdf477aaa4ba459141775b67218e064b09af3be3f2a03854839a097e3a214f03e13ec21145ebb5ff5c81e1c84a8dfe3bcf4892c79d741144d2a996bd8422321999bc8e0395ff453438bbe7395e0695e49bba09ef3d8764948e1ea9cbccf2fe535c918810038418b8fd8f048d0db49bf6c1bfd553b0c394c8f043240a1a01d143cc3c50f981f3e7d6f6826ce7c2af850858753ae5454281ca9f929134e6805f200d4d7e2d7fea1b738f97037402dc6a3494b951274051f848c485d860c2812c2e371e5630f2ab4e56da8b2818468f4927c63699d3fb07611c88e0f2983b6294f3d21bd180cc64a5a2896d472e5b3383194141ee6003b2827513c89e48b0c235cfe5a962ffe156f1875f202fb14d1ef70eca3a0ea8877981010027167b2be0aed6b04ca467b3d9a477a1cf3f9759f2878e237c85a88ce01ee2f97fd97aa750f2c78111ff70bc2d8a535235222a617573f21dce2cf3dd25b70854b9ffd85350129a858ee033ad5f7fc66562f89d87afae6c544a8686499572a035e5995916e183df4a63d8feb24590f28621073a966a61699cd2377125be6043365010e08c61ed3b9c3d001d9c6cafdd4ea120e46860fbca37108a9a5b9a9f2cfaa8446a25b204c4f28ad5e52ab1695fe49da8663e90c2f797425ae367a7b4a42dcd5bd3fe926070c3ebcdba9804cd4a74722f73b0e5fef3e34743e1182ab54cd798228db6315c57f09394125bb7cba5c9d572ad6d255b4b632732cd4ec7063d63eedb4218e1f4f7caf1d3dd25167dd22623aaab18ca729628705911872313ffaf322ce01cc11c936d0dbb5b63c16ee60ad0a85b8964093eb18a940250ebda39766907bce66207f7dc441572f9677aef7a72d3e5fcec0c942e33315dc4ebbbab927bd09a2cd215d120ba8493452622c212d0aab531d9a7733ac743f52608390995cc2f752570304dad42f576fa8c181604c68f2cf87555228663a7c714e26eeb2c6e5035dc80ccb8b814f89a2383e642b8f829691753053f8140819204bd2180ef8c80e93c8230f81025fc3a42a1aa003c9b8eca00e0e3b850fd88c7e61e94d38b4eebb1c47059fd472bc0b8a3b70517698c7b74bb5e00def97185cd883247b4ddba10739fe06a3379164463d5854dd9a241327e5b419a2993704a75b513977b69b96b8fe8b0c7dd4726e5551284268a6c2e2667e0dbb3b28219223bb18f9e5af9d6709cff22b6a031590edb6b989b09732ed7a0a228a67856f391442545e2e1f737606bedc08f6e378d3ad8b0ba6db8d32942fef5e5378046832541b2d12a81ab902352efb246b2c10091c47689a425ec24e5b7f7bc59198f6f27189a2d7f42fa42b6205ac2e6aedf6cb543d0f606d543198e92acf412b5d884cf750f3b73f8897f702656901a19db1c90575af7dedd38bfb74229699003b67fbf938473413c61fb5e6c78b0878fb7a5db4a5b662313d0612e4c04a4464a176e06b478b5cf83921b18342452f324d99695dcf4ce33ff8efc3fd088f49d0747ff112006b954de65c9c8817af0ee60d9137093a9d4197437d2c57fe12ba577ea475d60906732c5746849cbc50162474e22b1c3c16e4d35f0e6a19c5ba983c4a1112f9281cb1f7bfc916a4caa92485487447bb3393167202c3696aaa302c00a8330093f3a1f3ff72baf44420392e5d2dadcad2bbf8303c926c7039c3c79c2041922c6b26504cc48eb5d12c2abd0a7515c373df38a8b44f793ee83bedffd35934f865ea07f10c96fe43e8857907000a4208a2703d320f159a24f346e3bf840260d052179f50919568d032a820df2b38066eba1ea7cffc02ce4c988b4787d58bdf85849317f0f8bd4f715314438f2237e14e38785e43212317697684d4a412ab17cfa0b6a64c8129424b6c7acb8d1cba0efa1a00b3e405602e7d00df2956376dccbae81d3faef40fca3ac6dcbf4f180f72866e5852fc2f0a5890da5d880214ebd2e79b04deda1742a1859f6f089b292e1c10696a966de1ee893258d934f9e851cdc77e848105dedf1f8337b074861e9774475e00815c94a84286c14d1e346f7da8d89ecc16a0c57e32813be3df9f2ac706f1fc284f222caf7608782ca6c7b7fd86c694a5ee6bfccf9eacdb748d332fb4ba7fb8df774b85b2d1f3adb3534985a4437db9ecfdcbbf9e0314a37b7c72205e241cccd78355ac99944501cfaf2c4ee0d0326ffcfe04e80b51d98b4f520e2e9e0f49718ba976711a22332e887c80194195721841e7490949f926bca49c0e2c5ac948fa21bb642670664aad40c4ce3f3ea70cf7902fff4b3debf9857dfc9c096ac7c71452d53f6a34686ff32984305fdcfed1fe0f995a35894efc50182965109605b2c39700a0ad4041c6541186a45e8d8218f4f4b3fe80b45ad08fdc4adf19f15e6beaaef77a30d12b3ca4303b4f55a4db68894cb4916a602f937439cb652f9b0798be3ed4da72c3fa8c0e1652baa9f88e53d45b7f1d762a91733b7b91a913790a477fe63688116c2b9f014462bf1b667c1e4f402a456bd1274c0f34236d06ed70c9b73a587e902443ce4853bad73c7ae5a937a1e5abb4a9bbf069b2ddb4214bb100536bbb39181927d13f2807691da20dfefa9459e9b0dd21bc3e8c33590686c366bcc30074314e6f086c6384de4ad088a49b786d4fe564b3e460fb97e00fd0cb2dcf6a4019d49fb759201a1509e305a20b0f87e49b3eae7218fca5f0b423824dc2d2ae4cab3aa343abe18d31c9e8a7ec65b6e8ef1e7365d2799b931a4c0b2afd800a183d8e0150007ffe345b3693f3acbb7ed7deaed961da6606e00b6f1b7a15f59ea2046f9375819019b86a5c67d16d94ed5b0d64295a6e9e9be90c853062c4bf2127f94e4398de65e83eec4f2e925f51ac77acd291fe3c4408f006040a91726760ea896b5c3dbb049108f42de5f968db4ca92e3341ecbfbbc8bd7968251f3fa3b07e2549cfe3232195b62b1b328895a777653358631d9ccdfa2f4b05199da8bd676437df062fdba92c8d9363bbbfd2cfa9b522c295983cceaf011e002198f97129a3e9981798ea7fd7049cd1514fb8163b0cb39dc8bdc58221cc19062ca8191c9b30ca4b8a7dcfa8066d6491e7e320a0b07c9b907d489911b05be0a726273667acb63e98cb324ca9064fe9a3e625634edd6683e695b5daf6c04ce97c198d7a2448ce0a0cb26b7ecff1ccbaa524dd91b62dbe5517a89643df21a01f1105aad045e0e4151c8ce7f781b40b424b1a071c214c86e28ea60d2489e594830d2a4bd978bf37e94f0f6824811131f99f95e4d63e6a0b13318639f9b78caa1cff2efa88000f5f654df97206a86ff10504529a5371babf812f2f9507b156639609268cc19ce52b7d8582cd9b3c2c12c2a152a085df6366ecab2be22b8620e077c30d95f6757d5f87a031d47d6497a2e59fa8bf4ac2cbbd7a58bb2f2aec7d8af2be0cb08139cc64f33d98e0c462602b4577ea1f0dc893671a4bee327c9b74b7db2d13ce138d323d1f035f1e3e4e0fd6eb69ecab1fe9ec5d2d3984318a0bb7e65c091c416fdf7cc647b1d3db7d46a8fb1e013a33a8f23ac33987832dd47178a51b2e0eec25fdade8e4794a3ee602f3a41f157191b3859a0b5f91f9dbf921cba24eef05f02af93c999a3d7e457d4a94a393daa7ee8dcdb9ee235cd52bbfb650aa70240cee561b03784a493a7109a40e337d51e55ae3de94bea91662a9dc7f3bf8e4d32f3d70587403d8280e55dc12f0afe0e6dafe9c19f2c0abebb0381546a5debccf264e53483931fb53449130f47d1407cd0c372637c0a644bdb8b25561bb28fa030f303a7d9bbbc6f0d2d80986a300cacba5276340a6f95f5a58dcb62d64218ba208aae2a01c8f4dfb42a5f93d44e870b78edd5bcf239888d6692eed1a118b799705f7b93c34b05ce3ae60f439c1742e22d456d35909b541df1efadd8e19eed68f1295e0e404fce2abb84fdb20c7fb59a1796b7db57ede655778fa81bdf6bddc000f06181a177c30403b7a3a75b0dd16518d63cd9e9168c7b891692816985882e40f1d0bce30a24709a075b64799d5b3e42f16d794f34eba8158f842a4b04e46cc1464e3d7f0282d9a85913fa90267ee8565d27fd10e28a2a1495b6ac494faeb9b0ba366816bdf54e694c63b753d9b66ede27540e3082b8a7172755882f56769130f0af577b8c3ede6e8eecc9425911787b62c5468a9ffea09e7257883b554d17704a23942749653ad9a87c8728fbfa56864e69bb8ae9607228bffd91643a828b31357a199ce3f2e4dc3fd57cb963d783242f9369e886376f57b9497504ebb04311eeec6e6c20c50d981fa9719fc9ed87480ddf9799ad62e7b1996293e2d57b0d92d05db41076cd3d90c81f793e57eda1191e5bdd40fc9d4831fccb2d33e8a569e009580985e29d40823ea35fbccb800afebdb2083a963ad2e72bfb0907cbb026e1224c0ce5f59107ac18b03307bf581f6ebcf3ce7800eb87b02a4d25c3c0780690a714e8aef53ad3e7ee56dc8760a1c6ac40b67dc97386716d8b7c8411f8e0fc10885b65982e9844784a2de0689a608bd2b3acb490d4a1a2a8902ffa562e20fea0b3ec2e1baf84eaa8955f757f304d164da3c8c1583567ee07a64bfa1e740f09427fa58b4185e625c869f6220eabe5b2f89ed573e76807d6834a6d93cf392b87e2911224dbd6ba3729d896600bf314e476e43c599de5b638ada7d19530fe557dd1401d2b9f08ce9d2c5fa7935c57f42fc83467dae1943d6c27882686e3f02cdaf1c23df9d61bd4f2b709fa7d2f488f999653318d8cfda4b40f774190c6ae7c68d04892a4456ad9ce39c61f7ccd63bae1f8735f269382ddab8f29590a03db7cc081f900b5fcfbc91245d4cf6e5d757439efc2b1606fbd5d2f98ee420a6b195a7322557b58063144c3b79efa8ca875cb186d97494f99c68ab9216d3a2e281d7d40f158b4dcce0f341a6ec3b566b77c8475f582af06b323c9dcc48fb8f6e4c24d8bd2b6ded7c6bafe9cb0d8dcca57887b1f03e43d8d38b7907ff65a37b78e7cf0648123971a67c2d9dd6a0138b2002ace0cc4839566f50d6095a9aa06a96083951752e8f860211deb7f9eab0bb30f442879145f272c019d2abc5206aae3924a75010275119d2ab7cef59e1636fad4e8bcad6589ba476e38ba5fc71e968541b1820b12ad654f7ebd9a2522d51d47dc5563ea7766799dd694bdba53b7bc2d2ee15f66e0e3fc5a203198545ca949fdff3dae7e730716d079ad70b35a4a3f49c32526592177f84da459ef90637dd637adbeac1f397ac1a8fa7da7d92e2057284b7afa34a03ec549f7e4965203ef4c0f6af45483907c7953bcf8c7c889f8540b93c48a746229d7a407e0b5589707b9bd26b0d13a7dbad9932aeeb8b7e532566cd92a882042b82821e5a9f5116c612818f9b586b639eba41e67d6c42528bca99a7189bbf2428231bf5a4a55bb5412bce1e75a98aae332ed95fcc476a9e18c5b2a90eac937a016a2a3d1ddc5fe9386871595a4c43ae2a5eea44746228ffb79ac2d9e4bb1d9e19cdf2ad6516c16897028def75fe6a78ff95e7062bfed70f2398582e004f7bcc030954895873d6342cbd903dbbe4b6f2f96b7d64579c9a8fca8996188fa3d9861501fe6f36e13a3c12589da13ee190064cdb3abc7143800a2098120cd0636aba23f08f43ddd021e098bfc75ed28215ba4459610ce3e6ee8194d76d83dc50cff7212d421e7d53f7a8dd7c2e1e37ffe54918f94f9aeba116460e76ac28e44f1c3b266386ba3d0083f22cf5e82672ff1bae279291e5eca52f58b928c5e2543af0e20fd256fbfe682dac42b71e11f695165cb77b9c7dab72d4021899aff8c9359ddc2d3310c8c8bcc83fd122e51bd5dea954f2970c5678b2b7e162a9d491a33e1a1b18a7c052d67d102b81301b710279d85f6ae7fb27eca6387bf45bfa08405fb9bb0449911ac0eb0b98c492b3675f3c8b17d8d4071115048d93ea92df10dd66c26523424c8b0d693ff682420404b198302eee8075c3ea7718467b0ea47e54768edc1e5bd11b2690c72032d1762d2bd386a76e7755b63a2d91f3c20a915289a334d82bed12ce87366262c75696163c36ff5b6533912e2416c90b6e307fa71935a5352a78296eb10928a01c2c4a651a4eb3d84093e27e6350fad6ead63ca737eff9ba04a9b5d17b1c78e1bed6711d5479d8d7590f3f050b7bdb7b15df86cba06af51c2a3341060130da96b435ca1e503c509f8e6efb90fd78840546f24a21472c757d0683c8408285b2c5268c325330e3e318ad6f968d606f1f6ba481531195bf905823fdec89b3dec12f3055bfb8f4e93c5756c65f5ba4fbb00e089e1780abcdd4260ad3487daa873a8913b4c45e3b7f68ceb9212a3672bf84f085d7efa6f261d7e42399de655fa523d772ab1c1977833438eff839b68adeb8fe5aa8e59d12c1d70c2ab4d524888f9758141a552238aa961345d98586a78b2ac3038c8db17f6df1d82d04959c242a3e53a402fd87da822dd33050d9629f63bc27f00a9d46cbadee3508dc65c0df4d1bc81f673be17aac5ae7f3f69fcf7a6b1cbbd3258a666c9886f229bc5e356436ac2d1f53b33a5edd19e1a77a12b2149b6a5adfc40ce4f4963a8f1a06ca726e4ac8dcb3631b1423719308baef7996d574b9bb675f8ffe769dba96276d992c218ea1f31ba038b6452bed51cdb97a78433976a53e90ae82249499dc21c8b280bd34f8521011e2f3bd49c88c90af6ec95104bf11178901157fdbc2f205c3f2f523575b57798ecb059e9c04d14156d2cb37bc8e01ad4d01ac1d8a3b2c1a85415be0a1c245d9caa40076146e69123ea7d79e8f66266677141acbb866f813be14adfd28d46f6c387185fe1ca5e7682b6e6349157ec34ac1d1c98c423c220dc47665532a35946c67453844da63cf704e5292f04b810d0e7fa57c3150759b17598d227e1b98cb744472c8235c725f62484f50516e8e3cabaf70e078e0e3a7116e076bb902491083e6e377440b879c0bcae990baaa3a8e9b75459ab5ce62d60fbe4f0a324270050f7aa5f71e5ba518faf8e7bece0338f44047bac43a5a464d1a5168f794f1a130f23dee9035b4aba6d81761a010944d8bc96679a812867312129fc418698487ba09bfe680bb002453bbef00fb05cb50134e0db7918dca367100aeea96655720ebaba10a03ab329a23cf9227874f3f68f4ff6aba63a1e31bf1048679a2ee2d3456d9682bd89129046a3bccda5e9b7e043c4b6e83a6dcf72fe40457fe3fef8d0acee37066ff15eeb9ca6f72fa59dcedd28085f02783709c00b619ac5cd22b0d57011c94a0878f8bb99e32889ee72cae1c797d2d4a885b32d1ce09b4c591d73bbbb7d4eaf5f2de94eaaa39d8ae46abd25c998d826cd3c2b24be42ae4a7c5ca9328b5da8d991067b46dd82b083afe37b7224d60d9c36c74db94ac15662c27062eb5ba2cb387020d7cd53d674b22fc4c48f1577cb2449b81886ba12eab4237ebdce8ccd34826707beddc50db68501788cedb56a75808aa6c7d4aa406a8374eb417615dc633ffc336066aa7437b69436610335e33beefabb58b09e3235ebfbc7043637c7e9c473e3297abfb2ab388fc82c067d9291e973fa7b641530370b330aa26dfecf195301ece3360465b33ad7c72e2906eae61a109da3b01a12b370cadd8bc59bca75c47f9dfb74bc9e505f82a5a421bc28a3878487f40eb18237cb2c22e928498f304584a9aaa187372271de84eeff56f4941103ca0aaaef40b3b0a7a5967383152a13470687b76ed9bf10b3c7bf3070588acc254d0c076b61d7c5d09d43f049275e66ed27775e66a695dabc5ec9a81efa1cfca62413e7c2715246a49e59a1975a1e8c5f581c16953b3238e7100df6d281fbdd12471022d211e9aa0a04c8c5e70bd1f826f3e21f03aec6849a2bd4278dd034fcab56000f1522b39c1bb9086f00b8c3ca230210495fa2eec66b9e4f1605d6dc58ca2464454e404b80261081908b90d9356638dd7b9240375955d9408ad152408cb84c9b3a4f803d4112f330f636ba8078fe23dbdf44f578540434812e91782f9c476a732cc501d8e7f8a273d121de7c3aa317a277c651fd752cf71d02e2fca19761aa849e2ee2d0aac369adbafb47aa9c60d463225df053213140ae24ab4616518ba9cbabcbe2826a8c47881114d6fc61bd001c4f9eae70bbbabcd40b7f46bf03e9247316e981e48219d24777d9e0dd124bf616f6934f8f03ec89abc05987b272f245882d0eb2da402dac09a7b9efa1ce83b590025507e87eb8a4530c77b478ce8b57332df3621a3363ff40d176d60230a289da7fc40d10b6f39be7dab90796d50bf1cd522021b7c8dad848ad2d32698805a7aaa0b7da3a07ce883c27a90f052b3f5c923c0b21051870d5512241f7bf97c74b83b88c648b7a93c2e18c0553ab6054b7d6652060af7808738a79ce157b6cf189d872c3985c4c25402b164ac64cfcec5e751adb3272894740a4a28c7f5c50e676720a3bb3330c596d1b51b40973744fab0f4066a2ef475f092e495adc50e181438b163624430e3289fa7e53bd79e8aedfd1a52141a59a4c51992a031afad71f74321b61e02102daf44c12787fb487e28f020045c2554b70eafaef11bd3b4473da7fa1171d61a148611b91e857db371a6021e02e5082465d45da6c5799563395c7cccc8dc061dc80d09f2a3834dc88ef7e61b45452aa2073ef7f495b56e50e1e7313a17ed454432a9ce4cae176b67b553badf02372fccd7a69af10c16f409533a7e7a7538d1e0604e93e978dbfbebecdfa78d812e11b390a2a02210f434d15b4a58cf4ef045d66d8c411af62d8578f68208aa70b827f8a69a1b792983f900cc2533a01089fd28ea6b83679cbff1fa567930b411b129c86a45349ea27d2850596c0bd0b9153caa96182ae15c2ec6985782b68cc0f12f2d147d2245c42323ec127108569230a4a6a796cc78f730d86bae5ba49997f111467f3da1fc7da088cf349a40e0d69d5d65df21492d82259acd9ca6f97079f7094cf842aa652186162248fc9f05e452c75f78f79f34b0ceda9d1b5bffbae06b08ace101deb3f05e5fbe700a98c259e1527e01be26cbb7aa3f2e7302489f67210225b03b9a82a5ff486478d3e248d9b0ef0c12e8c2a4a94df156b02e7175dcba0fdd5a9c960a8e915edb6bdd2596529c88f4a10ec7be746be2c056b7d9030aa31050256ea76a82ab8c18d53ba8848d8dbdf070cbab935ae371fc200aa8f858762f072ea8b58db1ee4ba00bf879153fdc81ab8fc745472a1ce17139221ab8ba3f24fae60f84f8815319eaeee9edc8dd43285aeaaca0dfa81d95923810e891d50e1f05570e981b9dbe1758bce636d067ed5d29c5c56c133e83e1545014bea6c55612c41bc021267dcc97203ebbae4be62e5f4f05c579ac4e0b550520668fb26a3e21bca88d9323106c35aabedffb98e83679d39c15bc618ca10e2b7c593b2b6e940bb54d775929f73d8e1d674564291b82a8292adef3495560185db0fb6ce8d479203547fe0a5d369e6253126731a156f003a388674cf6f1f1ffd04416edd62df101bf6fd3ac11e48a7bdee8c49d2775abcd563f4259e2bf92002ee822b6436a2e2c95cfbeb3a90669e505da14754dcff65e62d41f84657e33f15e8c3bf939faec2170671f1e6291e9c234edca69495daea06624af464327803b6369a6c536dd9e1faa338562348d3b8183999edfef72f3cc469dc65912ec86b31587856cddd7a60703129f723525803622560a1ca5491c1cab508b55b80caa329d932834aed32324943bd0827b144b4480c7403b30850fae68fd05be4bcfb4b2ce08d74afd147b2b5eb2b56bcd1fa9ad1657d3a6f3f5d0ad5a2a88d9ea287fde5b14f393355c7c218d23792a7020955fca0672dfd551994178df882d67d9b8833cc2763f390c572b2c2bcbcf6f73a56e126464cf60fe45c6b9b04474f05aee1b9e1573e12bad042deb273bacc444a207e11e8e4c047699014d99cc8c45be5db22815e9982bfe391d1968cfc83a1156a5f9211ba8e93d584d0e4a1de08fa3680546163b245bc8d20fb9ac25bcee5fc0f1b48589051ecb1856fd73f9979b1fbabf4dfb4858952d8d11114326a0fdf9729f2b4a305f5c5da2fd96789a25334ce9b29267314198d95e1569ece283d7b30452e9548c23b31c04019fbd1a7ec52097248c683ddaa69f800145cc51b9a45465d0d480a6914e57fc276596e67fa7a986507ffa4275e6c4d50970302cd091a4a8be2125afdb79384433025caefacfa08235f3f8863cd727d920d0aabc78030e70badd682205e4460eb96e24a8773c81fccd810548c7e2ea99292c5096aee3e1c3c96f0105b5e953e61fd2a139c311e53958af1e82411de02b18196bbb223f4f1f3c526ed3bda944ce929e99b8bddb999bd4d4a055a647b35a124bfe368aff68530d057103fc14b6343c9f6574971ebe03ba3a60c6cbc115c41095420da866b399218277a6a497dffd4f565ae24a2e961dada56b3fa30e4de600d30b82e9bce89cf1b8a67b9f9df4e19e98a203ad8ee0603c9b4d04ef96fea02ec5a3e0869195ac1fecf1aa7456f12a00fe30de4ca88255a5798292f8fd1ed12bd16d8770a1e938acd64621d25b319a09778ea95d5d62fa1087366893b689bc0a48b705c9c8e3c656a8cbad9b13ee4c32906f11e2e985127f5e6ee9298f8a5e1559fa1080bb2251b3433df3b369ff51198d29becad63a2662348404cae1dcf325e207fdeada5171927e9fb74abbb31fbf6f71b6ef4db87176bcf88895653a8528dbde3a3b7081f6e02199d067917d6d80c5cdfece94d3f8c8b39aaaa23e6c371173c2843e76b27011348dc6d9b1387a5ed4ddd05234fd7634c4d29c7a1aaf0c0892efbb8d90bdcb2a75ddd1610c1fb997136b361a72fa06e7dd10e0ff9deea60cf890ef3654011ec6bc245ea07272f1c76cf7da601bd9468ae7221b4c880ad5292921ae1e99b829ea974691ecab3aefc1320aebd275709b159a724c601749c52e1ccf6cfda239095cad645145801c9b4f9c2f9bf3dc5098602ba08f4c17add030395a4d37d68664d28214cb83addb4a361a0979108a8c12cf4f1024985554fb2dc77d514c86fdbdcfc0e136d2a050cd8ae5b7cb34e25f64080b100c7e75fa3c052900b6cf63b8be429867a37d8e13db462bd9a96a713bec5e8ad3c35722375b0db5b4daf2f9fb4f63cd4e8684b42582dc4df2b398e3ec51fc454c7647e4cdfe0061699e4d745a79b019b3b890652b297394d4783f44993c466ab44102f450450758052669d8a9b1b0e6e8185906a9168a75babaa95e15deaebf931c5361f21c180370c3effb062108883082b200a9eea74b5208949535ea97f57ed7fd69ab26167ab4df02686727474d80602348bfe16485e5d4999feb423380a52af2f101ea01e756031c45652577ab522390a7e364d6bf0868b58d4b5ab8b4507daa22b7c0068b7ca0af27f9610f9be95b1e8cfaf17225d5cdf6f7d4c5eead3942e9bf83ee", + "public_inputs_hex": "0x15c9b404c344691839abf638a132bd083b09e98c2fadb268923013737d217ad40488f1f8d24b90d2ff437809f7199eccdee54180e24fbab6e8d07e4dae7c77480000000000000000000000000000000097e089d738cbdfe4aabdacf499858d5d00000000000000000000000000000000bea27e9a0462c1bbcfe5d7d11e69ab7c000000000000000000000000000000005fe27b65c562e50b0f036ea754579e4b000000000000000000000000000000004d71b2b07473783912b25cf8dd9b9c9f0b7850853da4f6de0abb227f35ba4fc88c9701f647ee43a716dcd01fdd540f0a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000210ade7d9aa4cfe74bb36dd9a0e12531b1126fa2403608e2b7d175414fcb9e2f31dd5a66f5ca90ea104b52c48f4a3e630f174014acc8270d5f4dc613a06eb6a3619654bcbcf5e533790d9be255bc5ca90c779d6375fc717d27349065da5753954032f128b9e186d3fd9cd5460214fd5cc67db90c397056d90b3fa1e1e93174c99000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } } }, "test_exit_code": { - "crisp": 0, + "crisp": 1, "folded_export": 0, "interfold_contracts": 0 } diff --git a/circuits/benchmarks/results_insecure_minimum/integration_summary.json b/circuits/benchmarks/results_insecure_minimum/integration_summary.json index e8b8d17ab..77c5b4fcd 100644 --- a/circuits/benchmarks/results_insecure_minimum/integration_summary.json +++ b/circuits/benchmarks/results_insecure_minimum/integration_summary.json @@ -6,7 +6,7 @@ "bfv_preset": "InsecureThreshold512", "lambda": 2, "proof_aggregation_enabled": true, - "multithread_concurrent_jobs": 4, + "multithread_concurrent_jobs": 13, "committee_h": 2, "committee_n": 3, "committee_t": 1, @@ -17,61 +17,234 @@ "proof_aggregation_enabled": true, "dkg_fold_attestation_verifier": "0x7969c5eD335650692Bc04293B07F5BF2e7A673C0", "multithread": { - "rayon_threads": 4, - "max_simultaneous_rayon_tasks": 4, - "cores_available": 8 + "rayon_threads": 13, + "max_simultaneous_rayon_tasks": 13, + "cores_available": 14 }, "operation_timings": [ - {"name": "CalculateDecryptionKey", "avg_seconds": 0.002493002, "runs": 3, "total_seconds": 0.007479008}, - {"name": "CalculateDecryptionShare", "avg_seconds": 0.014546000, "runs": 3, "total_seconds": 0.043638000}, - {"name": "CalculateThresholdDecryption", "avg_seconds": 0.014658909, "runs": 1, "total_seconds": 0.014658909}, - {"name": "GenEsiSss", "avg_seconds": 0.003312954, "runs": 3, "total_seconds": 0.009938863}, - {"name": "GenPkShareAndSkSss", "avg_seconds": 0.006545443, "runs": 3, "total_seconds": 0.019636331}, - {"name": "NodeDkgFold/c2ab_fold", "avg_seconds": 15.542266178, "runs": 3, "total_seconds": 46.626798535}, - {"name": "NodeDkgFold/c3a_fold", "avg_seconds": 67.103157296, "runs": 3, "total_seconds": 201.309471890}, - {"name": "NodeDkgFold/c3ab_fold", "avg_seconds": 8.157004177, "runs": 3, "total_seconds": 24.471012532}, - {"name": "NodeDkgFold/c3b_fold", "avg_seconds": 66.292620289, "runs": 3, "total_seconds": 198.877860868}, - {"name": "NodeDkgFold/c4ab_fold", "avg_seconds": 8.877390382, "runs": 3, "total_seconds": 26.632171146}, - {"name": "NodeDkgFold/node_fold", "avg_seconds": 20.289683136, "runs": 3, "total_seconds": 60.869049409}, - {"name": "ZkDecryptedSharesAggregation", "avg_seconds": 1.746945975, "runs": 1, "total_seconds": 1.746945975}, - {"name": "ZkDecryptionAggregation", "avg_seconds": 77.416901137, "runs": 1, "total_seconds": 77.416901137}, - {"name": "ZkDkgAggregation", "avg_seconds": 8.409547509, "runs": 1, "total_seconds": 8.409547509}, - {"name": "ZkDkgShareDecryption", "avg_seconds": 0.927539390, "runs": 6, "total_seconds": 5.565236343}, - {"name": "ZkNodeDkgFold", "avg_seconds": 146.711601900, "runs": 3, "total_seconds": 440.134805700}, - {"name": "ZkNodesFoldStep", "avg_seconds": 8.132157674, "runs": 2, "total_seconds": 16.264315348}, - {"name": "ZkPkAggregation", "avg_seconds": 0.678950539, "runs": 1, "total_seconds": 0.678950539}, - {"name": "ZkPkBfv", "avg_seconds": 0.243462617, "runs": 3, "total_seconds": 0.730387852}, - {"name": "ZkPkGeneration", "avg_seconds": 1.639551785, "runs": 3, "total_seconds": 4.918655355}, - {"name": "ZkShareComputation", "avg_seconds": 1.182185354, "runs": 6, "total_seconds": 7.093112124}, - {"name": "ZkShareEncryption", "avg_seconds": 1.861872787, "runs": 24, "total_seconds": 44.684946896}, - {"name": "ZkThresholdShareDecryption", "avg_seconds": 4.559046281, "runs": 3, "total_seconds": 13.677138845}, - {"name": "ZkVerifyShareDecryptionProofs", "avg_seconds": 0.041032219, "runs": 3, "total_seconds": 0.123096659}, - {"name": "ZkVerifyShareProofs", "avg_seconds": 0.148539630, "runs": 5, "total_seconds": 0.742698153} + { + "name": "CalculateDecryptionKey", + "avg_seconds": 0.004326667, + "runs": 3, + "total_seconds": 0.012980001 + }, + { + "name": "CalculateDecryptionShare", + "avg_seconds": 0.022016291, + "runs": 3, + "total_seconds": 0.066048875 + }, + { + "name": "CalculateThresholdDecryption", + "avg_seconds": 0.020120625, + "runs": 1, + "total_seconds": 0.020120625 + }, + { + "name": "GenEsiSss", + "avg_seconds": 0.007776041, + "runs": 3, + "total_seconds": 0.023328125 + }, + { + "name": "GenPkShareAndSkSss", + "avg_seconds": 0.011192708, + "runs": 3, + "total_seconds": 0.033578125 + }, + { + "name": "NodeDkgFold/c2ab_fold", + "avg_seconds": 18.821508069, + "runs": 3, + "total_seconds": 56.464524208 + }, + { + "name": "NodeDkgFold/c3a_fold", + "avg_seconds": 73.488805041, + "runs": 3, + "total_seconds": 220.466415124 + }, + { + "name": "NodeDkgFold/c3ab_fold", + "avg_seconds": 7.851751111, + "runs": 3, + "total_seconds": 23.555253334 + }, + { + "name": "NodeDkgFold/c3b_fold", + "avg_seconds": 73.173327319, + "runs": 3, + "total_seconds": 219.519981959 + }, + { + "name": "NodeDkgFold/c4ab_fold", + "avg_seconds": 8.281481527, + "runs": 3, + "total_seconds": 24.844444583 + }, + { + "name": "NodeDkgFold/node_fold", + "avg_seconds": 18.939945583, + "runs": 3, + "total_seconds": 56.81983675 + }, + { + "name": "ZkDecryptedSharesAggregation", + "avg_seconds": 1.593031959, + "runs": 1, + "total_seconds": 1.593031959 + }, + { + "name": "ZkDecryptionAggregation", + "avg_seconds": 49.684318333, + "runs": 1, + "total_seconds": 49.684318333 + }, + { + "name": "ZkDkgAggregation", + "avg_seconds": 5.735565959, + "runs": 1, + "total_seconds": 5.735565959 + }, + { + "name": "ZkDkgShareDecryption", + "avg_seconds": 0.948800333, + "runs": 6, + "total_seconds": 5.692802 + }, + { + "name": "ZkNodeDkgFold", + "avg_seconds": 108.814322347, + "runs": 3, + "total_seconds": 326.442967043 + }, + { + "name": "ZkNodesFoldStep", + "avg_seconds": 5.313063916, + "runs": 2, + "total_seconds": 10.626127833 + }, + { + "name": "ZkPkAggregation", + "avg_seconds": 0.29689275, + "runs": 1, + "total_seconds": 0.29689275 + }, + { + "name": "ZkPkBfv", + "avg_seconds": 0.229513319, + "runs": 3, + "total_seconds": 0.688539958 + }, + { + "name": "ZkPkGeneration", + "avg_seconds": 3.607771166, + "runs": 3, + "total_seconds": 10.823313499 + }, + { + "name": "ZkShareComputation", + "avg_seconds": 2.617024506, + "runs": 6, + "total_seconds": 15.702147041 + }, + { + "name": "ZkShareEncryption", + "avg_seconds": 3.672300166, + "runs": 24, + "total_seconds": 88.135204 + }, + { + "name": "ZkThresholdShareDecryption", + "avg_seconds": 3.494414028, + "runs": 3, + "total_seconds": 10.483242084 + }, + { + "name": "ZkVerifyShareDecryptionProofs", + "avg_seconds": 0.082335722, + "runs": 3, + "total_seconds": 0.247007167 + }, + { + "name": "ZkVerifyShareProofs", + "avg_seconds": 0.244133875, + "runs": 5, + "total_seconds": 1.220669376 + } ], - "operation_timings_total_seconds": 1181.068453926, + "operation_timings_total_seconds": 1129.198340711, "operation_timings_metric": "tracked_job_wall", "phase_timings": [ - {"label": "Starting trbfv actor test", "seconds": 0.000000000, "metric": "wall_clock"}, - {"label": "Setup completed", "seconds": 0.800449549, "metric": "wall_clock"}, - {"label": "Committee Setup Completed", "seconds": 7.024013699, "metric": "wall_clock"}, - {"label": "Committee Finalization Complete", "seconds": 0.001819861, "metric": "wall_clock"}, - {"label": "Aggregator P2: PkAggregation pending -> PublicKeyAggregated (wall)", "seconds": 134.166717000, "metric": "wall_clock"}, - {"label": "ThresholdShares -> PublicKeyAggregated", "seconds": 241.734708588, "metric": "wall_clock"}, - {"label": "E3Request -> PublicKeyAggregated", "seconds": 242.237859363, "metric": "wall_clock"}, - {"label": "Application CT Gen", "seconds": 0.011831894, "metric": "wall_clock"}, - {"label": "Running FHE Application", "seconds": 0.000089208, "metric": "wall_clock"}, - {"label": "Aggregator P4: Aggregation pending -> PlaintextAggregated (wall)", "seconds": 77.109859000, "metric": "wall_clock"}, - {"label": "Ciphertext published -> PlaintextAggregated", "seconds": 83.937900581, "metric": "wall_clock"}, - {"label": "Entire Test", "seconds": 334.013529569, "metric": "wall_clock"} + { + "label": "Starting trbfv actor test", + "seconds": 0e-9, + "metric": "wall_clock" + }, + { + "label": "Setup completed", + "seconds": 1.017932541, + "metric": "wall_clock" + }, + { + "label": "Committee Setup Completed", + "seconds": 7.022026041, + "metric": "wall_clock" + }, + { + "label": "Committee Finalization Complete", + "seconds": 0.001739292, + "metric": "wall_clock" + }, + { + "label": "Aggregator P2: PkAggregation pending -> PublicKeyAggregated (wall)", + "seconds": 125.46852, + "metric": "wall_clock" + }, + { + "label": "ThresholdShares -> PublicKeyAggregated", + "seconds": 137.630169125, + "metric": "wall_clock" + }, + { + "label": "E3Request -> PublicKeyAggregated", + "seconds": 138.13360025, + "metric": "wall_clock" + }, + { + "label": "Application CT Gen", + "seconds": 0.009520666, + "metric": "wall_clock" + }, + { + "label": "Running FHE Application", + "seconds": 0.000055291, + "metric": "wall_clock" + }, + { + "label": "Aggregator P4: Aggregation pending -> PlaintextAggregated (wall)", + "seconds": 51.290023, + "metric": "wall_clock" + }, + { + "label": "Ciphertext published -> PlaintextAggregated", + "seconds": 55.067765875, + "metric": "wall_clock" + }, + { + "label": "Entire Test", + "seconds": 201.252351625, + "metric": "wall_clock" + } ], "folded_artifacts": { "dkg_aggregator": { - "proof_hex": "0x0000000000000000000000000000000000000000000000038e146b049f5a2ebc0000000000000000000000000000000000000000000000018fbadc502ad14036000000000000000000000000000000000000000000000008a2cf332394158a790000000000000000000000000000000000000000000000000001f710378be6e900000000000000000000000000000000000000000000000c08a0a49dcc1784f700000000000000000000000000000000000000000000000479a1f04a4849464900000000000000000000000000000000000000000000000ecdd4f70261b68b8e0000000000000000000000000000000000000000000000000002bdc67e780e270000000000000000000000000000000000000000000000068c088e96890e815e0000000000000000000000000000000000000000000000019927ec72a8a0dea300000000000000000000000000000000000000000000000bc30ab5296a7e92200000000000000000000000000000000000000000000000000001b1768dcaf05300000000000000000000000000000000000000000000000514324a6e0f591c0a000000000000000000000000000000000000000000000002e31090bcd0a36cca00000000000000000000000000000000000000000000000eee316dba6c9c144300000000000000000000000000000000000000000000000000000fea047711602896aebdb264dac06725b3966345b9e4ef9019cf6b810f3dcc51860c5764920f2014eca6c2f04e7cf3b91e2628946b6a3718640954ab71d723bde7bf502a9d1a2f34db5ecb0806f11af806f3bb030c60338ec88b64ffe73e839f5c5870542b041441320f7b67e34ad210322d2f5fb516ac74a4f27d68106a4b6bb8862f403fea0fde735d225bf57a92f107fcaf3280cbae16c9c7029987ff0a7f4ee7a20274e10bff5a51024341ee9a5663df40a9283f6b04fc17bae3b7bb5a1581785ff55d700c1e06cfb9c565754142bcaa7b5b4cbdfe8d1a68400b427ad5a3859a91572c9a07739d0572ceabbe0d52bd4b99c0f620ca8a5321b1b804a8a139818f04a251b12a1ddf209a0d7b853ec134beb579539c5f1c5c12272c86207ade7f36723a0c1808564b49f500341dc967a931ef95cdf14fe2d6e213f59a4c08241a0a630c0a20094d9edbb54cc50d8085bd1ae3f24c32b350465caa4ee2c1f3f0e98d99ef1f280d566dbffac05a37803f1edd0b55a4915e64dd5cc8040dfa02d698b48ed45c2b0512682837918095625fc2f6808d921af9f7809b5769a1d571d5ae35c1ecedd22eb10c42bf1697e343247de4678b4739d8468c15ff49d0789daad865c2a4dfd520a710c69acd71d2e39b1b66bca361a77383686b095267d483e9a65a7106fbc129b9018e43e5304f0560ef448d298fd8c68d0bbfa7f415422f83b3a7c0c1149d100a6294b4a17081217254d550f784ac02a667e1d23540040f976e34a6d2059b0ee597f3b9db445f113f30e5498a99ff0bbc642ec6ec2902fcf42cfc0dc9c8ce290fc0e267a0be0f576ff0af58e4a68a01ccc44047c891eff4f54421844362872cc5f85a0b7a4a2c5683e6927c0129ebf5aabd8df471e02ae39565e11f3ce0831c28465d49309ddf5bce3974f68fefaa445b99e5aec1d308991ef090362bc9611951db034f99dd86a24366d10c24747aa78338a374f51595dec1de2f4e35604f0fda9c6dc2f4a1d965603db25df75368cfdcaf4a4e5c8defa96b67e839008bf02d308407c26a577d97b478ea360252b08fae8d535c3c54649a262d2c9725450e1db0494dbc8db5b571cb6e856c23cbd330154826c02ce5ba29b4bb2720ae713e0e751541f9b404bc211cacc9691d3c0917a149cb51e4ac5ddd944b7d1bc9668d2bc5615a7d472255e69005a613c4f949a3bab81819ae67ec962bbcc2635ab94e1dce72569ae638d012c6ca6cf21634eb535f80177106ee176eea6d1a4c3c3f032e3839c2b0f5c9165b77e0af36691c7451341d88be0a519f7a87b72170406ea908f56f676ef12fdbd5cdd673d77a9fe1106d29f5be7ab396ef83fc3cdbbf70152b69c3d9cf3c2da2f6e32224297dfd0d86e41bcbd3a04343c5c05547f1fa94412933a7e458060e19ce1faf9db3c9ca6e069a30c1c4ee3368ea06f3f29022bfdb118c7245fc64000f57ffdb78ef63bc87ee99108ec5ae0f3b79c18eb49a5a87e8174a8fdb7cacc0af74eb2668d45b1d999a92c3ac7234b0c504b22981c0f44fce2d45cd8817e21eea6a471a53ceb7aad4e2f20efe82889e70284075c63df31f1802f49619073b093b611c5d89f0b69bbe6510cd5c0098862491d94c229b9fefeb301a1359c653d0d5a264cc62a8ae6c08b988e588ea96f11355bdf497f26207530a887415ad40f0da37e84607ef267fef2a4392874e3e035db64ed8b4e804a5bf27ca07f83779e8ae2cf14654363fe4f88f25093ed819e433a9510367bea91d9f2db1e26383a4c8a0df489007f12ea00f91d6d00a39eef342cfce4049cb1005331a81e08d651c53177fee573a87fb0652bf0f8b6ae2eabdab0cd53a222a97bb1f2599e409604b872622a24d9f0eda3e56a7cc78ec9780f28a329e531e56b416540277caf2f5367e0c6ab8463bb850496fb67960433bd6fbfdc0f384b3734ce64902f8aaa512adc680bf8b4ee6e8805006c28ac3fe58625d3eff6c55ed1418b2d80af9a08acd5b9cb6bc4dc70c131282f2aaa7b77da31a88736f45781f136f23841e512e5a081aa544a6d5b4b7da8fcfb871abc7c2aeffb7d5c5f36c3a47ef542d0a2f0e77853444ef1bd396138b4692c68bcbc71b49273d6b85c43bd3d636d8171f9b8f9e1a6cce6b155ca1b8941e29f9384fb8675df1b925fe9d049934b57d2e0344065e99856c0f58560c7b61969d8f8a1b22185d7cee49e155dc41eeddaf392055b9fbff12a248c53aa009b31d8d898fa411dc0ae2f8832e8286f7a2502af118c76caca54feb76a5660e2e925f0a2fc3e76a09df485fad25d6454f2078345d247e5986d23f8130dde014cc70ce4d6600102584d37d2ae1ee3339cca8ebaacd1b0bc9c2cfeba8bf0d26baf663766f1a41511b6643f268b8a4b18e72dfc133af07299dd37a8e816a3301dfeb7186b727fcf0d937e36aedf38061ec699e43aa9622ba36764425a1f2d8e63cf07b25d5eea48a81658ceafff1eb99284fd40ba0ea0e8070b0f18b508f8dc8b73ad007a52a97b95997da9c88e51d725fb0322dfcb52b15678857422cd69a0a38d0b739c4640cb3a65bb1387a18b9c597802a7008b307335192168f583e82957952e50c1bb0872a59617318249d8f63aa6db33db7d90fa9601322e78210e75087f0f74d98f6de55c577d149bb5323f10274cc323a571e1a58d0bd353b5cea492d943f2b9ce4a7c1c597290edf32132364b69af83381298d05687cd395bfa6845e299ba59cfc67314a07cc4347892ef618d0f36a3fb62442db09f8bd01600b9d4797b1a1855cdd9c2fcbe56ddcf7aa3c9a6f7808d7d602c5ecf4a2882da2d6b21cb057b030bf46f1c58e6177a97ba2aed6b67bdbf42715a3daede130d745cf8524e663319b106661a34762cedd498bc1f8670ea78a042158e87a0661db99505ee3a6aae62d8ca251044674fde2521bbe3dd236f6c35a2d7f3bed582584f5791362da4c8b52a5c85a7d9d698e0d2ca59ea2fc4aea21c2256ee0cbe2b992e43e977d082c1f7979c49189644d6e4f56a293347de835599703e0ada4a22af6d5fde5b44821ad479e26d73e1af7994d26d04794cbeb8ec61c05d6afa779be840e98bd1c3ed40836c5741c99fc55edb8f7203823f6a50dd44e19c061d28ad101a955c8358078cd5490855af88af9eb62704daeea6382ddc35400d11c2b43f4373b045010f285bd78c8912d74b74f7d294126ac5e72155dcea405e9031605c04becdb06f8b84e244e6baad4146c7dab4572f9d1d4ba038d452018a742401211aea375ff3f2b56acfdb64639a433002aca37cf20cebb3be5c60715ef324c76ea04192181fa5121703321e84713478c02f63a9192f50067ae13421931e93801854687d8e60ddd847100095fcd9bb2ede66d370e647fe4f0d7fc3a2f363c468eef65a3793cd4bfb3e56d79ab68a3b09be67ab2bc3c2da6cf38eb631310185da9dfb841b5467e8183bc21132f88582589c25856117e167d80dd692c076cbda0ce6d6d2d5dcfd89311658456916c62de398c5638e43a843366d817cc0ddc7d7de125fc1c474608004580282688063f5aca6f06690dfc491a8ae9c5c02ecb8837abd0b8af52d74854a8f15b57dad2ce4346c3a57b9f16e8708730a6cb064b6fe9fb0089a65dd35b6aa970b411c78f7b2aa5b9400d87fcc1acacb3e369171c47f3230a9f6a371d420d11eafa30fd4658145178f4dcf5c28c34bb19e1a123b681a4887939e0a351aaf8fe25680434596806ca11ea526051c082247bb87a209e2e9c586721be984a8f864c9d3be80c8c7523c21113e1b18b3b706aa7d8c21d657c054d8769747e011d716dddfbefdc0cc7fa8d471e1c58ca31cf89c1d196218dc8b201131c3a34389ce3fee2ec9ed61ff3959c451e5a0f020c8033efcdfb0b5bcf51236b0b6541029662b8a3c50376f053a85124291f173411ced41748f009c22127832ab9f36659c9c87f116365b90af9e2392f5e92086b801e6fe6376a2ac461be885eea8608ddbfa4db732feb4e936819e6446f9697249b38e1f716292348b3287168eb24314e2425373dd6756868bf66717995f106cd9c871a5a68572cee61ede06b11f37d231a609bea864675dec910763e710754c461b778f906bd095df757103c44f4bdebdbc1409647a6892f67ceadc6bad48589824e199226432fafb8eda60a1202f598713bcfcb94681048b4980b98760455343316b5b35a9b295941a67f7b4ac4f1a24c8b3ed045247feb50d3670a5a918355ad64e5cf7e302775f423dd2acf738d94430a22803d157ac60ae399707c08adcec7d41e03d118052a31d8a16b8a3aef7c9830df6815906f0440531b33a10571f1ed27d84cb75510495df8efcb714197c94f8c9fd53b198efe93334064d84b5c6c22c822c643d02c3a053da66d5c4cc774b5fd04740d89c3839be5157aa9ad2d2169bdecfb020c002199232930c8eb7fd2e59c70ca689f838a282b03d2372e35f3b52fb332d8e7118f60a499489c36626769c99700537dd8f5e80422d92dd0683b5efc3f21690e288089688a1421854d4653247bb20bed1dccd20b56c9dc4daa52cab2a984fa03024b5ad9af64d50703a4de10752bf3a82f835938640c7ab80e0a0190b0a2261d2ab6a42d129566586bf0db21334d4336c2754b368cd5ce3bce6196007c51a2b52cb2a7f29f13b502784ba00d49726cdd8f2315488c2511acb7f64acb5e86a6fd2506d1d03a141d4247fee5336d6210577a55cb80c60607c3ddf33d9e3ca1c46f0d62d50ce69948edfbb234bbf9216a1aff75647b311f859620385c0acaa4193f2e5f309fabc40436ac440f39da8db73698e0a85edafc0836ff33e234321278352394536d28d050f56da00b11fbb40fd5f8a4566c72be8e5ecfacaa7d38c2cf3e0f9e2384d56265c064dc420fdbc6a73f8c0e6e04b644e9cbc61df97d88e9c529145184b011f9eb91fc5096842a3aaec5b6caee0899dbc249e19b2d0a176d35b82cb08a43f16b3b82da140b313618120d6906492df6fe2f189703dcb70023b64c28fe97dc5ee19d42a34cc5e7abadd24ffd49c250e34a4741c8956e6616ec6efe20ae8c503e52ce778350c20b65b6f09a5051a7e95694565ea4bf3cf1f7a93dba00e28eaf5dbcae67ebfdba29b7068b913ea43126ce9a9a39170ce0e05aff43bc00119d5e9e43798de0b003442bbf4b3e07af206186e1a96eb324bb77eb0f8c242b4d00117d41cb40900378b7235ea285c4f1dd4cc09843501eb4e301e1a7fe7606f17485221a20da729dca07ec410db76f9c69f7b723e209e79a605b5fbfdc431f6420d8788a71c1af68e3f2d8a68768e632346dd1cd22d6a4a2c6268c6224810247c6cc0c8cd333a78b736a02f0d029e760f7f68589298a4919b407290a97dd2083d9af9cb142c55efde8b4c69193ac087c976a0dee9ee7b5f2630707a1632209af5ed7b86d5f08d8abcde1dc1ff387ad7a31e9388ca089e2f5f8340d54aeb0232f5ad00ce41cec1f6647b1edd63ccd207531485b06b8874ac25d769e17b22c1c8f6d4b1b5251c23e315c2f0a6b18b5521fe3ffb7fc36c156e935e34a3d918c2ab04f3bbdcb1307886b001258e4ca0efe37f22a80fbc035788ea7704d8681a4277cf318460ff17c8f2790f78a22a05264e33715a085c7429e7181944af22fb329334c5f59fed35528ec577f296de352adb6d95822e85dd1493d81be726aaef9165c3501ed7bc205db385083ad76207c9f586daae7f8c78b4ce4eb3de59338c426c7fb9191c9f897feec6174af661fd70b303f6f50a23266aa7cee73e15d320a0cad09345c02e98c86f16b6b80b94c18edf982583b4f96e047c1fbcc45c4205618b64c24cd8c14c082dc62b338b3c048a4293481ee0bef71dd3cdadd40fbd4f419a02b9f28c205241b18241d5e117306e89dd23a884a3fc54cb8079a924bebbe11deebc2e717ffce26862b8b7804bdd09db9704b0623a397c429054666741d2302640a3ab0551496af654bf68fd032082432e7e8596aefae1ed73ec7546b6fe41f13b641fdaa7396a87890b29dd70425b2c60daf38e4fac39375c7da128620a42cb6b472caa894b66488e4056e20adee4b5051750d58f3c8f9e21e5f69dcb03f0eac9e69b653a0485052211d6495de5aa9b499a123aad61eb126d430172d07e2090d8abf78ae916581c51b2e3abfa8c68740a7dd7f47dc90d8ea573a6460059a273621d0211dc09cf4274902a2c2681eb4d62fbb27ffdc5483473734e87e78621e05869d22c3adc90ced561fa5d5b023d494c41c392a690b001dedbda3dd7fdd20f479ce52973dba498a97f2358bb08cbd67c571c90d6cdc69a1fee0ad59de442bfb9bcdbd21e349693af3522519fb8c32f21a588e1f426b1d95683e4446ef340e9b664df02bf2b8ff0ad4148f50d517ff24acb4b9b33a01c3e9e0d13ebc789c0b4686f8844ffc6f638b7a90dc67bbe0a6b00d0174f3135d48eedab7fddaaf4c165a4460fca15426dde3b0718d64c4697d296912edc702e1f5258f0d26939ff4220fb00ff5792b4efb016789b009d6812f1c81d5a4dd82dbee54d9864a15068121598b4701b74147dce1853d2ce745710ef36f85432d5bee18b5fca0662be8bd0a622e484d95516e6a425a4919a4fc52c8764d106b4bcb6242dea3a8b3cb8b58306313fc37588ec9f6aa94c22ab4151908b675806ad6c9a95df02143ddc913ef054bf6e35f383708a2d5259d0a2336ddbc2a4ef93772e289a8a1710c78898caf0dc63980253765e3ec76174601394171065781698d149637a81dbf295fc6fb80020d85ea2aadf1f6b2d34f425aaf14d4a7b2d32afcd5eafa3013f9f76d12d0e70ca208763a96a78410d65d925326ac2a85f000eb77f77517672807b5b279bbba1914c7955fbdd9ba738021e16940413339f9fc19702af01758a8964a3648eb5f2b38cb8f8170de80e05194bae8de9fc3fc98e7d99456bf7ed4e9280dcd188a2909e5b07d0f283c47d1f7f9f0703a70c3d068d48040b976324abea0d70af38dad20fd871e487c34122fb7fbc2e808ce4923f17beea6b0c78baf481c0e7a7782e6301d886ffd464f271910ff70eae27784767ee6cad1b7c706568b8448f2ae1db00007db90b02058d7c9a26e29392545cc731e629682b34cc76007a0e2c672503c02b62b0a2861aa8b1541eafe096469fd0fc7671db638eac0d7a3c861af4e041b06358dd08a1d1fabf41e2caf56c93619dcaa1c152f84f123b433b5de6f526d652dfdbb3cf6ca3b495bf4e119d3192744aaa057e59b25c4dbcbcb1551531c925a1fed585cbba1e3e4832dbe93ef798ea3104aed3c15ebb35567a1b0fba49c080f1b259db8e480c19b86f74d3f12242ad8ddf276551b5579f889a925699391618b2fc3fb82abb5dabc4b164696a158efa88188d644926aa14601c5e62ef22038b12fe800ae4bbd980802c5321da39fa532fb6546a3996cd3d7c89e3a22e390bba90555e59695339ceeaa217f88e74826783c3a1efa8de6714f2275cd9067e427bd21bf502ff800c2cdef2d00ff1baab89b91b68c2c0541964433c87a099d90ddbe0a8798761cd55fee0f4d5ff34e9a58ba87decf37f3cf420687bf0371171ca8252f6e8b2f4617c0fa96b9c65542f0cb40662789e0f2e00b7f05db17c528cfe216108f9162d4eefd554a028a1db73813040a371fad8c790996a7084a20eaf0e67507873b7fa254aa0638156ce5e8b739179fc965a19dffd739a07b3a1a6a71bfb42c1b02e90a38270855f423d40e83bfa56b31993377625174ab859dd3a66a2c880c1aa42a078a47519c83c3718af991f3475f0951012ec4643a53495feb2f534715a02251c6da883227283e90750f5c68b6d14a712291ad78b16e8663ba0ada3d25809bd3d1c6bf98b92f28bc97921c7b6cf346f57797a2f7d8355f8247f29fcf1e70b2e59b61d4a90e90204e3e843a475f1525a80f27f2c139aa440bee68db3b1b272f57c8719c8d01e533e12e6d01c477823c46343278281d910d26a6c4f3c32f8a20f59a9785a883d74bfd8f621578d57a4b149b01eb7cfb4b6918dcb7b68f139b1ba1b7a052b79be15a40085bf9b91ec9937f78e54d385f2a09a747a7138f2e909b486a842c9943fac57c89900e32d4c0eccd701f3d439fe00aa9bf910d2827178724f0614e8084a6c472f74c0289623b10ba0edf264e88f45dc9d80079cb17ba5e3ece6e6c3c76f57b6b4459f8536cbb511054face7d1636809a52d7904d0bad02e0ef3e5992417d9c6c356646d4ae6f8ef5ca2f8b45d00d22e7f3f43a321d402a81c0794c86c6cbcc0b8f0af9cdf907836ecc4dcc159ac76e7e9b2d4ab90476fefeceb4acff387ae5e1eb6abe96c97be936ff5523f2b2767e3e3b1f0d4128ba97d019c749862c304731f9462a2d22583235f00df1f812f7fe18ba6afd24260768907290435becbac3106b72c5289bda8f55ac47bc0b45a0337cef3f77f51faac7cc16a64e8d42db7fe0de579a842761f013e5c1ac835ec7a7a4d5a1c50e061863ba5f8315e1d829c7c1f0c507a69075f5c5d39c659a49f0e766abbf080711f8623621c44771dc91147349f6208f5578b294a9ebb3fc3ed64da4c19c98982ef5d818424ad862d1f5dbd75d9200c40ae912792a93633ca6fbf0bb199000da10ca86481b98e624f81d5c0a4acb3bc1abc06c5d113683ec1c40e345ec9ac66607bb8da713163665fd11d4c11bc6ea47bf2647ba10234b4f4e7a20c32f8ced0d125d027030726358be036baa138cbef9ad966d57399ed14cce73aa45921d5254099bd00d5f347f292bae143b759c9448fcbcca7ea6cbee944f8a00fc8aeceae222362079175d66ee0c74e798127385d4e7ab0103a050e05e16345d82f4e3f98b1ac557f7a3dc1a6d7fda9a7b5ac1ed91ed23fbaa48afe8376e6b3c52e0c40bd10574bcd3a407a0a700420cf3ff6bf4e9d2c92603b0e3ba2fe76a86601f5b58b32b1d5c029f31a366f0a64a899988644c135db3aabe1188c1937e0e67d43784cb259c6df89d2678b2eda7d8f7c59d3742b405fc7dcbe70eb947e80cdabfe853cd0ab21de8f0cd93b0e975f77dfa85612421e01fb87848c26875a6423b34de9a820d6ca2314c7d276f56fa815f374af9a3c15ade27bfd6c74a94d8df257ec68dc401969ab545a44962b4480d7787827e9220791ccfab4ec5ed310f331ac84d41d620b975acd3d6d7244e0c9bb86cc0a45d5b86e6a8e0a8387020337602fb9664fa1f42a5e9bace6f4a0adf7a680459ac831e9148dd067aec1e6247b703bf3fd541262169439bbbced69403ebe737c5b1bf602ec254585f3533875af458d75f4b6b04904c93b04484c354815a73fa7a2f84c69b33822bd91db96ba88c06b4e7083f11ad2f5ee09720c05014344b0a80575011bfc838f5691b8401628a0bf8f137e10ad62be00adddc2e69fdc00dac0bba8a8dd99116dd8c0475879304f478e4d0b419780617665f19a173d472938bde6fc5443a221a8bb6ae4fce38148cb97e9a3c2faca00d80752a8daf6e02a7af2b014f0ad3d05f16ad4cb3155fc320b777805b1e7a4de59fd26fec3113ec4ff03fe8cace4e8a5c352032020155f6df973172802d4120638812c9ee71880c4e97cb48d2e1cddc2777d093912a2b6ee71de7d54e12e877b827611ca16f81f1dc67a480230e997c5b8437c9b4a99997b227bc034216731efbe60e9f9b3fc4a0f877a973aed8e2a29baf5de5b7a63406987c15e0670464c90090c236014d4b77d3455b4d09048f5123409f32d104cb7f6d59f3a2550f13d808471f826a1338c92e579bd02cc4f12e97833c52547dc31c1c207fb3f7024ca9687a18b57a64626be3d6c34563e9bf612404c60dff70ca16804759818329d8f0fae167bb6649e51caa8831278645f950c16888e24ececc5378976da9c82c894e200a8ef1fd2dc188d41e70e336ea373cf1ef81751147d768bf50c2aad418eb384eb68613754260e9d2bea84c850924d171bbda4c856a78b74f4bf9e5242bebf28c2c3c53437b81528c77b5e14145392417ac24b77b634ea8709293dffc03b4d4d57e67ce15a550d6d3003bc839d1beadcddd0abc5157f06c3542ecf35a030ef12b79dd6dbd1f86bafdef9613f63ad08a03cf7978dbcbcb9ee67aff50230c810be573ac148f794c0650424b0e7992692d96f482481aa5638d16c88e31812f60dcb63c920e69f88d14ff0d18d076f8fd0faa93c4b8c2bbc6f41fa2c0857f2a656284d2218612e128640002e4af05c6be31686edf9974791630d4ae3197b8211e31a04979b215d23a9834258fe87c12d45d77944db3606cdfbabdd010a05c0d3e23bc252d9cd18a0cdf2d9cc94865bfd0a803a4ec27de80a01ffa5dee9b9e0ca42cb9c506e92f339d0f1504199b9e624a71e581ea1e531e48659f75e7ed992c62e94ad931b28ae7495f5fec6b73eb59707c8cdf58149dc4ac231f7b2b770911fe287c9f702d993205d349896c2a4e491b9a6c5f923c6195ef8dd2d064cce0249c1753b3c38b42b2e67c8e75d0eba600108c3c400fbbbc2da699a5fb635a0707212d96fea2841bdb3a184a7bee263731ef6f4184fc903ae392c4012977f4e32b41f65e453c9892c2f685f43636eecf49d451735342f95e842551c9f2817dd104b05865b8c0e3fca15f8c9f236b8ac32287d9b79f1a2b2a978641c76bf86e1a280d8af6b20b402423863ffad8270c35656613c8eaa25d2bddf64ed473508f442a0ddcaf8fb65ff255b991762c99df15a0f3e406b47e367a5290e9a93502cda808f5003de148bdafa621f1056d271f7d5b3d9ed3b3564f7ca2321bcf5e9f728e15e13d7b117abfc92f42a4ab68c260e37f27187224246a90a2040d0e133ceb3b194a4dfe23338883d6cedf803623c9e7e319320fa414208a7e9e083e334e7a102ffaf3053c5ec4dbc1afc1fd0a1e2ec41fb236993d167299e4ac66fb39a6ff7b2dddf7de35183aa28dbd3e7f55085df1e85823b7a2a1415afa97ce1fba342d0c1b76ce8c291da4eab121b9bf1ed337fc3eaa48c0519f81beb378a21cf30de0211a36c491e17075f9d390f74af0c916b4b72a52cca839a8ec77453f5069a11ee606a0a221273d418f367330a250f685df6535c0f011535a661f5e0329507faba7086cb2591cb49bb2d7f9f36cb318bcb71b3a0c36a764de9159da2b359b42bfa40c2be677dbac3cbf3257f23add29381424b2c501161f347275a0eeaabfe55c84297b2d313b2aefea9bea73663caf91539278db07b06b54ade556bc5f863552870016e61cddec04e209f65b23a294dec5f51ada9a71877524071a6ea37e323abf10477b2c9ed66ea8cdd54cea94061109bb65d0c735cc408c908a3f03d4082a2208a7fc84c0a72caf1ffc0e6ed1e76508a1b12281c8c2c9c689539c18df34d9110b40a9a11243c885df0264afe639e088f4eb0b58e37f66646193e462e31328bb219dab1e270ed096487efaaeffea549d1155f6880c13af3e2cb5b0911d2a464a01415ef211740de758492628c66e9dd91e7f4e34764d67f6752df3b1d916f8d2145e0e5f0f89f34315af664917caa889c19aea42b0d33dc42316513ad09688731a9d0847762e6e23049166ec03a3806de98ca8f294bb1d5a048d4edcf28e099f109305e145b3d4eeb96745bbccf43a9539ee56cf4e98272ab0748490a629e802252bbfe3be8fe6b8385583cc012128fe518bcaa30542f39f988b9fb67442b0fb0e7504643c613e4d19af19ac28c4c5836e764648abd2e35ffa5686349d7809c70ce07a4620bc5fd09ebb0ceeab9325bab28cccbbef4dd184df360140a1d4615c202b344fe389b9dc87b319c09e0dbb55a2e43baeb87f1436120c1252986972141ba8ecc47065d5ec5f8cb112daf5090184e5feb2a314be75e75d274315c55af2213ffd564c562bc0cca937ecbdc9f30ff98354721e0dbf5cde8c067ce35cd6851ee308e251e86c55bba859435f09869c38758ea576ece6900fa2b8be2f89abd908ff57ade95004643698340099abbfd7e03c84b0318c007f4f05278d99644dd92a8c2dcc238e60a4dbf7d3d55c9944a71904123e26ffa3fb020ee020881ec78e002a17629d2c4c3964192849fda0e6adb70e34bc84f1467ebb9e22b1c565fe9e01bd5f58733c2da2eba1144d50afec878d11547b4b6c50bafd213a7dfea0081c28601df6765d0e4ee2c62ea450f53ce44526df86f32d1defd826168a72a6b920213190556ae50722f3880e4af3b1edd283ca0350c6a283fdf00ad92bdaa18bf2157c350f6ee718a1a3cde639733fc2349d24c78270fdc21200b686dad3608802168371758ded5ccc436d431141f79d62b38cef19f5a47555da701ed8ae18231825b7c906ce453bb755d3bc1676eec754c0dab65f27c40e59a55398dc0fba641a0892b81895428beefb7ed284886e138b82014911fb433cd864aa73aa714613402189ecfbeeb18f9b16b55c507adb769f2c4c5f835c7648df6b5262fb07fd0a2817fe3da73410af4651d7a63b68e23928fd166e3f267fce54cf78292a56ab39e20fb21d359fa63fb3e1ec851eca417207415d1a31c3d555e7f37ecf615cfc28880368029a43fb583cc9ec4a17a734ae0a8049756ee5ff77ff74f8111ec484ae801983d6932fb35c81a7b46486eba0913f01076f46d206f3a489a23d140886dd571cbda8df5b840b54f0a7d916fba3a2a113386c7dbe0f549148d3e707d9a9d6b6072a9b6033b5be4c53b68aa9f7b477c40091461f2e2f02e16d4415d7a2ecd09024f69b28b9794c45f96282ae002d52b4a8220df57fefd31e37c19c2fd036b7ff2cb77fa1ccfc2c67146766aa5f35a98f4dcd212d7279c899818285fbb9b83e6c259c7a955c3493e431b5bbde4227647df6a83c86e3769f1f0d9c89e2c5a480e91738e2dc7e605d15367ea67ce4c71cc11f99bc44eb2182437c564e6773e46a9a0d5a77619a1a6331ecf0ff39d75636169e1c0b4e38fcfd6ed67c848b93022faf1d8e51615c0774abeea8a79ffc4d2caec987768a90d93237d016e7713eb8118316c1bc2b8b9ccc7aa4faf4a50be342596ad7b4c8edc8ed7fe5a7ff5f5939591900df5a5284d15388b073a0af365eb1c24592b64b1c82d038ed563e553092e6d7048e132898602a07c0f960b2570b85d5fa2e1b4decabecfccdf1112b8b861bd626aa202c37ebec7772441b5f603bc932a664de98260e9d49ccb0755d9c7d822428b6d3ed257e5ac8ea166103154e36c20aa5f22c7939d0c03ddc9792cde75d4826794267b7ce2691bcf03f39f3d22b0880db9d479b70844c8a8a77fa1c60907e14d06a5afc5131c18866c61c265c54a18724f68c19c8b82709b1bf888b5c73292ba7cc7276f19d4202234cf42211e8469e760aa814e2c294e8c2382e7e99294b127ee3cc14a3c6cfe5134b9a6bade9114d816f61113f52b41198c21ff59a6c6820d1486a96ba8b765442a01b6038a1fd73d5ffaa332b3e550ee414c45e231d0e2d1423d06f425b2ce5df3a31e84885399841165521a56b4eeb752ff05e0c40310e9ce5f10b9e04a82d4b4a8ded7f583b45545e1f9d1c968ebf17db91821b9c873011955b2e280d34e3438df5326ad21c9f1ed98d6381eafec7d79a0080d0acab0b34e2d1daaf718033987daa5b33ac16ca645236f57a240a68b56bb18876f6592b1ed337f1e257d929a91f65e86638d0acab0b6888283c291fe9ef9e954ea08510e39719e12227711908eab00635ef7924f1faa04716e4a34d4c8807bedb8997256608e44ac98289e2fcd9b02c0b0ab0f8052577ff841ff5e5b79488f0b7fd432ca2ca5e920866c51eeaccec44e4058cb5117f0616d9d116aa4fc7022499ee1b10b9f5fc832077a33189c4aadd1556c83f06b77f925691ccc5686fb376c6c49a17937868fb780b8e3f922a603dcff6f04c6dcecb61c049f57ab204b26d9ede8e28d4ac29a8bb31d996cb32fa7ecc34188e070a5aabdd6cf44e901df3fe0324cd0b4d45d3abfe6f26bf5518fedaded225a1035af7ce5718cfcc45f680f1cdd5462201443bbb8b3c7a170e5a6c149204fc0aaf929c596dc73e0892cc48491a58cf1be03855cc91be6d8bf06a7fa80feddce1fd960863852ecfb7cdc46a7b286f0c29a51bf98b25b04881d1a0212e05e6969f39fa4b7952e2413bcbf31fcd2734362db6cd58cc76bf3b72c19014acff4c67ef4cdc24684f1320d63c269a189be80521208b163f2041974ed84a52863c756b994eaf8742f40c82c0cffffc9181184626865e3d548de611cb99f1a9b17e2b56f32db2f9191c07a9a604cbe44c3ad0182de47bd199a0fb45ee54a0822cd8e96d3557e8038a3d6e349979edd20261bfb92ff749ce13423317b1f5c5ea4098f22e55539d2ddb4aa1ba6629460f46976276157df52e4c2296fae7f02811a91b132aa57ebbbfcd9fefd8d553ed1a0214e0a21bf873377ecb470024fb9ecfed2e815120d5d428ca9f0b05de050081fe146e7d02a448638f8bcfea0900ff7c9f3708147674b69b2c7ca201efdf77cbb1318a2f1bde19219ba1ed0a9d8e938573fc5f080b86b7b9806980f26e202cde0805f99f2632811d2237127a1461fb0a2e7f96966c3217f6cef17878964d4858dcb3d8d40e779558453eee9fc19844fce26ad920446fbb4196dbf31525e5453e2dbf01a61cc54ed7971d0096ba4dd210313a41b3b826ddcec371851e8c1f65505a210e3e2c3916f5eafc1c6d84ee035d17bec092aca97468727448cb5af027e190a40a00", - "public_inputs_hex": "0x25832c071d6d99ad42c7b885e48b10100726dc0de03c0a779b282c519ccf538a25fc312a5f0009edd084811b739bcbd529987df1cea36f5a24515386662573960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000cb80a0dfbeaeb79af355a70d8f19855c00000000000000000000000000000000915681ec51465d5a3404f61907428b712208484402633db0cfcb2af11d3b66ff07cd7b6b12c3a35e9581183e399d53f714ae98e2b0527277d74d7898e5a1d76041a613ee74f2db890bd6db2fd3a76e9d30329528532c70174aa6a80f652ef9fb86217d722ac4e756dac8ec699873be87009de2f6efc0e2420bebb740d52be9795045be2c08d2f61c665fd8c2946f25a70037344482bad1ff4c46d1ed3887ee2f37d4bc2dd3a1c34c3c6a0b0d75d4fa63077e46b34c8c83b27e71c711f27ad90e03f985d92330211d3eb4c6c88abb18ae" + "proof_hex": "0x00000000000000000000000000000000000000000000000893e2589fc7272df300000000000000000000000000000000000000000000000f9cacd727086112c2000000000000000000000000000000000000000000000001087d088d5e0eb68400000000000000000000000000000000000000000000000000012265e9d423bc00000000000000000000000000000000000000000000000848d741a33c08ace2000000000000000000000000000000000000000000000008900eb4f01074c33d00000000000000000000000000000000000000000000000bb603d265d0e8c3f300000000000000000000000000000000000000000000000000008a6c01ce44080000000000000000000000000000000000000000000000056a1f3c8c8cd10298000000000000000000000000000000000000000000000000f4913d1f1efea4390000000000000000000000000000000000000000000000055187776dfc7e27c200000000000000000000000000000000000000000000000000020e60b75114b80000000000000000000000000000000000000000000000037252d99ba4b6b4e600000000000000000000000000000000000000000000000774c7a54897b11a9500000000000000000000000000000000000000000000000fdd40227ec51bf31f00000000000000000000000000000000000000000000000000019c9203decfb90e15854237f5c72c41d9082a4545b24694b629e686c58d51412f7fd32e13d5cc131b256d0eae84688fba4f2c0c00f84a33ccf9eff8eaf9f96b18557d2a7019f3034e1dcf5038db8476b5ce28e0eb6d0b588a3d92abeccb8acadcf67559752b4820a6ae16edfdf62f6c4ff6f5dac318c159ed8b8a98adb2c907a21b91bb74450924ad1b7b0beae123ea31c74f103bd2f0d7838483cf5960db17d47b987b8eb9f41868dcc4c2d77185ff80d4213515aa90244fec519f8b4a3b94b789e212393534132732aa313e4296df8b5f17497adfb0e14abd79fd3d54f953825f194baa0bfa1b5875c2c1b1876a47dbde1ed563a4d0dedc8c3686bf29a39fcabb4f4d138a4305b305e25ea240ee1a7676ee159c5c0cee9881d575d82a8436a3047e0b16bd4d040372200291485daa1ef88b8e351a3aaff641c72510b642515345321f0aacdc2f1138db62d6540fd8f07939380763a72892091168fcae86a010b455afa401db031ecd41783b303eb5655e67ceec7775594faf23d9531c1e438fbb2a504a956e1b7bf6f6a9a1199f84d5430aad0d3d92f6f4040ef2b13539270b3a40d7505f931eca2310d783a3021e50216a221b41b08ac834737f354d673289128fd36786d6136e38d2f4d0b07b8cc1bb220bc7b8e57024195931350e83657d029a83dc34b7193c7c10e5f817db7d9edeb2e56536938360ba7662c40955cdb42cfba3ffe3471db3b457f7abc3da3b5c6cc1235d1443340fcc130ea8c7a1a27bd327b204b8bb1444f7df9b30ec99fb363c05cd8a95c8911703089acebf0e5374476e5b04ccac0ba4bae2950a693e469306142da1c9a6803cc03aa6751a5ede2660b6456d7ff50a22b46ecb26c32f8483b832badb3bd261b76147946ccf32ccc7df80755c970323abfd79e860344af0a77ef4158a686473f2ee44b9463c55a5fbba510f61820608315d582ea7ff959f9e0e0ece8f579c13bc173a81802641c6d59db9ccd02fb8222df1d855fb1a085663adbff7682626e7364c355592466ad27289f4e763e4150e11f707808d36e43f0942b2bce4623a17f32342e6159406377ddfc6a610497d064214c534db9af22e91fc4790d334549474cb3808889a7b233902313e8c9c1a078389b9a6bc5837f2c323f9c93da198c6f7ffc7e8506c22b6ea42e0bc92a9691e98e4a0334ff82dc0c51dbedecf9540cec8d166f3abb7acec918dd96d10159f277c4473b121ba1b35f5a6af679116f5bc600f42b77326cc2369b623347572731e3e5c676b3c710d4d76049409b96139a19caa6f489579243903a78bb5cc6d8d26546bd4ab3e7cf4e832a8158c91ba19a9e56101f466aadd4a5f6bfb7f8825d72c83d4e8965ba1468c1e93822666884990221c364cc3d56baf7b47217699b7af230b7d3b3d622b2ed8763f89c57955223d99ca2203786ae090d3a65884abcc6b117cd2bd54d1df58312861771bf6a290452d4c980ad6d8d77ef4455012bc47911e89bf3e709ae1bfb2731c4aa674fde1de69a4801e10c4923c4de7f339f85d5b2f00e7fe872d692fe397164968df3140ba2a3e8758c9a0e530903b569bc20ac6186844791c107f85970ed03a94a4120914c716a0f0606f6f66bdefb596ea706821ecbc8bd8932e21da71ded29557eb4172d7c4545a93a547fdf16e2768e3ec322d0658c1aa5b422e4fa9772c6222e1018db983236a2fe4afbc28e3a7d49aae3d0ab553e9239d3502e082ec865748cc118e8c4940a2096666785cbe269d84a3140ad922d438f9351ee68dcced4be0cc1be0096a717b090898c7a4b42c709cb2321d461e8c48dc9abfef867f2605097e9cafceaaa1c13117593bf3e4a47c350aea0f9fafad053548201fb07ac10455f6921da3e042a0af83797c1f518766fd5d9b1eee4e50d2912eb8059b9828ca6e9abcf7fbc8ca9fd31040dcf1a854b7ddce1823db49a85ae8c738472c347d5d332b51435ff82b2f9be8299e4c25ec3cdad2cf2372f312ed18b598f946ca078925c6511a63fcf014e95611009c314dbe8251d12ae84067c4f60fa43342708a96c72c8384fd3dd8510180f6b49dcbb0d6b0facc1431f6c045348ce0bd87ef9a7236126248b2cccc0697081632bc406775d2a81908d720f4faf784847862ee70967996516e8b1e6c36ce347628104e81f7537c972c8e4ab9c91a6f1f77edc7342c14fab39f3a89e3c77f02d08d5a46f3e07b31cf0f6fdeeceeba4efec088c521ff006ff8c62dcb71f444d65a28749a9192cf0a5c285a1f5ff79e8b76c3d4b15ba348b53041aa272efae3b2e1229e5b848a53180f2dfcdbfca0b368a59895ad8ef89c2db406b321ef980a673d66af38309bd1f8c02f01c5dc5bc307f642fa10ea809a214a256ac01aadafaec2fc8afb7e9a9060002c308f5e70b3ddc778f6aaa93630cbd17812cb210d316ea765117de0d6a975d52be3b032ae5b4f7f8efd0c387d042777cc46081a21b01929a0e851439ebcf53206053531bb680c462e2d8384ab322ff49426713b8a51aa30799d442c3772e7d72e53de315a6be54e85a3cc8b085e2837708d04206ef9ed7c075e54a3a1afd1ba122d34c298db267bf0de8979d3ea39981d8b826674c14bfcc73e1a40363a6a8d29858aa7a71cf3b41962433b4d4c38e6551698c82f67f33d41e13280121e551306c57d9e157f35ea90947e3e0eca751dfebb4528f409f8b7afa242345596fbb005cc617209a7bc2349235d7a01cbada55d7e457da18c3dd779f95a045a29187a18f7c25c8cfa61c702da793c22ba1ce87f369d82e49eaed8d7d99942de1e71cd05211c1a0da9dceb8776cba9c9de442336c572ea4d9deccc148b68b634693f0c2e17a10268df741e380d585ff3ea618b550537330b5b4c046c79c1419c7b494b02096cf7ab81dfae1a38d3e1956558869d84bb362b3fecdfc06c0dce58493bba2eb27fc58a2bdc4ed36c00bf922c5c1db5de02a4c432050a51ded9b099b41cbc061cc328788be07e4ccafd40b6bcd297b04797b97014eb32d258ee1ee2db13720122e99e0da54f6fb50245e680a31f64f621db6d92742171234e7586eb47891506f63d0daa7f8830c7f1367784020113578b8aa8b5dd4afc9fc9cd33172555c01eae152d42a6ac71c10bd1bb6480b7e40f8c3e2479d6c13e6b170811614e30c10797e04f4a794b23ad86dce7b68cb182d3d85328272e204224e373c5e5d7b41d29f8ec5570fad365770fa970af609eefc121da6206dc0d7f9391279e1948767c2eba3e936dbdc0cf22b8c0c670eb33a91a751d1580e32024a2a348e43c54a1f524c5c7dee7bf08b6407a4131bb7930d20fb78abc761d045841181c23b71807742e66ddd71bceaad5da2812d15f6bd7bf4b7abc39a746237b0ba166a1eff6a6361dce8dd8adb27ab557342db41bb92bb4dc1cee964d945cb4498628d373105d6a13ac28ffd7e9d74791f69bea43c9a30cc3d94d596f9680c3f04eda944c3eacab279565526a000489a00586d9867741b8c2bca52d99f56569164586ef339b1d0928cf8a27507b425f09889e3356238dcbdfe0d82ea0b25bf9fc7dd421156102771050857c3d200468629be6b8d50cb2f8ba886aa273d990d7253872a176ecfe2b2447b44957ad7a69fa0fba44fd137cf23203058c369401d2a8968b310b41600a1a8cca2c4f7eb5c10fabfb3912f6b4508b1499b61689286c92e2e10253fc62050db4c54731b5dd71fd020918713df81f373894c9e02ac407850911f7c65385a52ed9beb9b040e0f864d586e70ef47a84ab8009b1c26a482c661cc055921580f222932759de0b675fc5798bbcb1c97100d0e1178c3a9fdd87016ad164dc955b140721c4a127104109b1c4341dea673452c92a61455d7428e3fb33661a9cc6e805090b9f3af1250dc3692e5059ebf26b55ed24a1d17aac0b68cf098f87e87ca7cf0ee33d642a56905b9fa1ef08da3c79561b196b80e60928ed00339f73fb46fa1414a894a6a398d2881b92cb79476d91e9f05b709bd710e917802dc6cd31b342070d5aa5d7c38d8cc4e50461596b5d7240aac423856b44ac1d7695422ef9d190410a475b3de9d662aa4db4bfa5ff7f48cf9134f88de6e3824fed4fa82b8ea0eb7c0841152da5d56674987df02cb6d40314192857fdbf1e72ee745126823d350b1b2755e28a5733de1c902e753dfeb0345c45374985a8230c4719ce19642a6b39c001e40f6a1550dc098de688f2e5c20ffeff195bea4e58d45266c19d09ac4dd1c919f7d04b1c9017f95e5d6cece41b7f51fa6a767a74629c3fbf7f8a8c53b87e14172b8536b1752f50f587b3e87d1d32fc1aaf8f5c8097788a181144d396004ea52c248fc06ca0532f69b66a94287f5465e274cdf660854ef5812e9bd7d202cd361a6c9ab24c0d08eaeb17234f7b649849b17a82d2b4628e601165cbfa735b4a970d74e6fbfdeaacc9d23d2b7552f3e2e7f9cf36f245d72b9b0562233134fbfef13017c428b5d653681f822febb94d0d5787caa2fdf62a065b3cbd9cf7411fce960208555c6f62f6d0a9753d603c45b0ff2c26f61463fca3e9cc701ae605828152173319e1ba545079e1622b6313a693e3c91a61280b07b454303170ae71ed3fbf10221f39c22c89c3dc16ee2a8d3ab33f3e044bbcafceb519c20a6da079f6e3d818ce53aaa8f48a1cab2e844af148fa69cb3352af974d9161b8e46e514a39aafc211918caa8dbaa52c6d92b19a3c0e7aa2e5315f646464aba9c170dc165f088d92d3eb20cb4e9b6df442a4581f7bd621f7359e7107aaf2d6a96c8fa679b61d5ea263408751bca74056732ca92490d524dd393dd1920ad5d73bf36978c69c5a91413eeb815b94283fc18604a92c7d581223a897972e1d11f5d5fb18ea39d2c7c082c2f92b900e56c6e89559a144646c92f7172428ed7dad04833905b40d9fe3d02175c54ec7dd5eec77a2f83459dad2c7ea0afbfd3990e2af01d3adc3bbd2d4bdb2cd9e668a481f993b20b52d6695d4cab937d3388872e7f5292a2be8f19e912c51cfa1edf49b1f17a32fe84c10339ef67123b970a0ee9c32c498275c4069d665010942d89642d918d1608275e3683a6965334ec106a0f33fe20bb6e2cc35d65020c2abc37ef27b01b8baf7861ff6e75a6c878ec9ae8518d3193d7ba6211cf17610dbf3da6d82edfbd998175540b07c81b9b82554e8595e48c14f31e6fd979fd120b504192bbb4041af130e3443a95d694f484a388ffbc15a9f5cbe69ec8df85971e971559580e062fec279baec48c4c980a5b3ee9d9468135b28e6456c38722b024717827fd83ed7c07213e618ab3fc32e8a7afb39c5c295edd906eff182638a527576cde3d29dc6ee178378731bde6dc6b6d3f86eb97ead0f38894d9ccddbfc7009cafa51d2cab27496ad63f1e8dd6fba1d0f8d2ed6472d4d1b0fd0bd84185161bc89f8431adc4ae1c564fd79f0cdf3d331699e02813f944dded4444da20694722d06a7a3b2f66252781c0702e08d8d6eac0cac41111e1f19cee0b32ed5e4de626ab830809f85471c97ee8d18f0e49a9f59e23e2ddf20651ec29cd4b358c6c061cdb615bf651f6007a2074e4f5679dda0f83be4de87b9649ad16fbdd7e951c2d10afe06e9a07edbe7d7ac216cb7210f5d829c8e094aec84046bc73b3ddc8eb0d1a70e728e336cdad54f8c03670cc53a4efb8ccb1c64bd687395eb426c63fc3701284e98f30c881e829a47207642ad663d6fcf23733f0703a62f76b9d612c642910524dfbc4ad584ecc9aba8883766d6ff71b5bdf87de0301b7ac966efc5cfea32df53aa6133c431afc06ffe5fd7f230dabb3791045aa1b06df3031c9af4007ff16ecba9d8d3dcf9bc228867fb0d0cb6f7cbbb301bbea190b19d53dea570589ad22f0a4c22f7c143798bddbb1db1ec81e892ee35b7bc566412706f6ba39db47222c5b24ceaa70b934f696b3042014f4d71242f3465fd6bbba7fc2aeb209da45d8168749bf202b7d7751a2c7a6738b0dff17d8ed462a2a4d03940f089083b3e07113931a991816788c975e884ed4fabe62624354c7d7cbbb444f09226f28bf4c88180f64406dd0a9d860333e34601b154a0f617b129b91b798f2d6642b1b3f6f4d048d5f4ccab3a704884851c7dac301d61e83eb8650b4101bd0b5b2d97ec88c5022f0f15f227881968414436094841db6d1ba966046c9f9896f897c62811da7f10c2bb7650d2a76e618119fcf7be78384e4802def8df8e81700da1295a32a138e2020174ac7aa7bd8b333d9ce80f19d89cde515e77c87894c45bd66435f5603240a0656a475363a01ad7fc570af47536e52d70592ce4e9a8b45480aa2dcbfa1da14c96f85e04ec5c925b1fe7a72e20ad432f905dad4c272b7cb948147daecbda602fc461ce29574a5feab8a23c9f5c9530f4de936aaf119781321b8eb04fd221123971631c97621631d403795d5d9908aeb33310de43fea8007077a7acd121ce220cc548aec560ee0fb11777ee0fb6034800a009353c47fd8d9f59fdf1812f0e6165cd6906e559d0639f2b89305ed45e9de8ab19564a549b7d128fa38685eba0618a16438b5e899b824ab31a49706b90bcb5c838d18b9e70376a54ac54cd871a60c49d283b19468ee15da356cb55ac7aa8ee6a356dfb951dbb8fb928d79cb39791ff85032801bc21e98725d3fd417d948194e8f93d330586082493206aeee5f672b47cbef3d769fd4c06e2adcc54b93df406d84ef63f6e8142746767963f1e4031a9e7ff72c05e1551d2626d1472dafcf890c11f1baaaab1bdcff02968609f6f4154a817867460ffa14261ad963b2976cd6d9944338acdb4a91c2a15a421d577b1f0cd6eafde870d2d1fcd8b3d03873bb113f133f2165785cbb4ec4b99137a4dc2db3313338c4bf136ac9c39b4053ab91a5017676f447a5ca720db1c5f33ba2e0203d82562b9dbfdd0b5464cf411a4ec39ff798b2abd5479d68a18480641310eb05c1fca5bf8c5132330c5c54bc23c7913e2b315d9a8271db1b621b500612a25e23482623e037b0b6773980a4275e42c137330ebfbf721a39196f153b0328130c0b2aca7467cfef01cc4dbbf9a8a0926c340a58883e4b0b59b9afe62a8c62d08d18562a4fd95a6a3d70dfd90fa1a15d6952d83a85dcb3ab079a91ba67cbff6775082abd4ab25e8feb4e83857e5eab021ae8a4505dbe7a3dde2d36aa0ebc508cae1b49c818f5c7165e7ff39a473235a75a9b2333e588211d0ef5e7129d3986e9e0213d2de49dbfb62daf700bffebc1727aa70907b77e8cb713c6ba8cad1f0d0c800864d208c935343fdd3740cfb370faac2a80961a0f3b8b35d0447005fc0e82022d949031d5062d4f8aa744cc623c4d6d671768c62cc023a0a2461b3988214b8f215ce83ad729227f4a3400be99c58bfabafab8ad4af06c17e28a10ec8f8af06626e1454f2963138e56c19a4f6ac189a552f48179a0605425fcdfe1ca7a403cf2297e9a7392ef35241d75085a64983b8d68eafc54dac726b6d84a94e16874e0860c6f472b3b0981400901922b07f2fcf01a54c30cf6825b20dbbe1146991b852c1a9a6878a7f1f43af6a26a880f0798ede86d0430bde95fa493eb91880e91285f2230058a0cd7f392a407d2058b56af8f3dca57b484ec6ca4526ee5e1ae36f79401ac6be0ec199215cbbb9342f6fa48ee5fc2079c21a44fe98d901c0c437ded112b20f9e1d14722d0a1a6f8e3c5ae5542b664e996bbac6184959b6007b43d9c960561005f6d238f5d3bc6ce60731faa20b64e59ac0cd270533f6c44cc6e9d5bdc057500afdd58bd889de4b82459f36be31db8afb91574243c8e1acdb67828f1e9183add21c8cbffd759306175151d5c4fa4f472b2b75c86e3e25480cf56c48ce4141595fca7a27e81a3c41d623170d54577eef77228a740c5f72b306348fb220d2e48fdd3a7d964de9ba0cf246c99d67200ee6e340a0c8367579e674a4a5f33512944c67f47c50e3570a3b47ae1929539f12c92075d326900f390b576aeebe9e6094000860a65184372332c28dfd700c53451f69568ea99c67309a4f07fe9965e12ef213d1b038709b1befd318e147d81e508fb2bdef04cd29f9a67fb0d4a1ee312e3f5792c46144ddb8352c4f042e61ed5a9a3850fd9850c9c7f1cf0630b3a6a1ec33bf3df6527fe4b12da199a1e9f94e31021debbb6ffedd6f10b71a1cdabf91e082b655ae4cc1d2e1b60ab79a92a5885e534006c0bbc303120f2d6824a10f10bb91d471511c9c24acf37c1061aa87aec6cf9f3660ba178576a0f482364dfbd15bde29fcfe07eb227db46d853af20da62ac6469a7e96e1e1d423177fc3309ad15ac488adaa1731baec815d86b4dfe6804690606a8822238f26b3c16b105dac12757991e46ac2def906b4a5ce65aea1d35ff0eabeb4f0845f583899205f33925087b24680062abf2bfacce5706551a5db92655b0311e8956ee3bc0d8a34b4a83244d664d1f71d3f4f807e7530c496f3504363d1e2462f35204e1b5fd4b7592e318ed8d0ba6c6cf82eea8fe98f6a3bbbcd3ee9c6c7672b4cba6773d47df0686b3051385b0d91358f0e9c73f6e71a93c15342fc46a0aaabf3379116dd12f95a2e30f7168937816ce74020682f78f0f15a4eca7870bdc17d4f0b36fb6db0eba34a517d878fcfe8f2160a608e9872198e628d47f55301e95e72184f9232b641a9f7a061c56f08d53de42e7f013c1112f76d21023a517b7d31548c2eab75c92c8d8311df000ef658c3423d9a2689069ce94d84a3d4f0d22781c03580962692d7776b4189c2722e1d652a5c109bae7de3860a66cc7b24d72860e3f43e9d0525bd21c9925e3b3e4130a73259fe1f10e44eef6a44da0dbe5f23dd48f8487f0bb7944f6280a507cab9587d26c812f6157deb1f312c53454e855a178d8282c34d93f20f06f1ab53520ad6cca61d9526c18ff7a37c60c431994b63d90fa5a7a16e4d34a1ddc0440c54904a6a94980e95c17224c4729862a9d26e7148fcdd79479f431732ed609664b7264eeacdb27c0400293f46c5e78edc80fd0d329cebbd45774ec88a46404c02b85d4ea7fd4ad0af626ef8268dc528e42d88c78c30757b285f07d2391fc0a6b4b8a4594c528d07833f1799e521fbf56aededc873143d5e7f027602e3cf308e4696ba7074107e534a1a545a613362eab5fdcf4a7e24ed0131349f0a138ad2d06b11d96c5b243992d1043952d17c7c4e294863c4a935fdd19dafe178bdc722ab0484766b0df419faf509b15a221d03428158513c3976eb5fe8d608ad3cf2b288fd1cbb13ef5861622006944f60a12f6bbf6bea0716f0814994dcba71de0f002b63902f9a23d06619abe4bb5eb4765dd8a51dbf12f94deaea567e45397211818ab423556e04576e23da8465df309f46b735955dae455c92dd8e9a1108a41d50e8efe970196f109d249c781077ad9f6454fdefb125ac4018a77e78ff1dff9c106f125c8952b7af0c9cc3e31879428adbc797c0da2d0a15caebaa50e95d965d80f9e7ccab0c03042033c2324b455283f43230e429523ee4f5959abbf2c434df007b5f1d715595f140e0c8f40b7ea9e7421d20fea459089b89dfaf43f0c88551b27a3e65b3945e380221082caa460e084b04aa109b767292d056c9ee9f33d5cb10b1b1f59a0279318cfde05d94c06b3fdc481219467bb3bec6bda69c67d53ed402be155f263eee937cb54155b12136a89a46e1734f4deccdb583e7540c400dea115a04cd09b2f88dbf70ee025cb3683b16c9e4243eda18272a727ef90ac558262191c9cb273d4f774631c1bc62857719ca60acdc1b962c2c94e43fd2a7fa99d5f0ecd0b58485875e38d85a12f1ff83a20691b7990b0fdfb562835c47435700ab01f5cd6728582866d6417bdad24896d682f57327f3f357f92e231d7445a88e8d62a31657804bda891fbff40aebfa7f1998e0238556c88b06cad3e4649fb8ae0561742e4f0a5470ff1d960765815806655e27dc35a481884aef885816125ddc6eb204e45cc9e3a72bf6baa8b8c842c5fa47837fb7f939bcd87abde3aabd1e81a732bd2dcf1d6945a33155ae5040e039f4873ac6d10baf1a9e43eb12078833541b2076327aa6d55a090b541f4810fa7b8884ea88c34ee43cbff40d44adb4fdbef702bb488a88099a373799583c0cb80dd2d248b42ee1b654fff03b3806ee493b2720c9b3aadc29bf471698a900bac7456c00b3f89e208250d841ca24424ef4c6e3b07ae9aa5a00ed1f766b7a929a6de5e3a70dbab9c142a3510bbcf84f88c347400197ff4a9f7da8346713e664a231959802d7a6cf75c2a173c2db344e6d4a5d56f14ac840a76697737e218df841fbb7a8f3f08513b3c542e52cc31b94ebdc443d1078b4decdf9a75e95e8aba608d33431ec59b57febae0f555880e116c692c2e9f1a9a65de6bc2837c768c3eb51683d2847d094b175a879ed511e66165f1de8abd1dcd23cac7c1ec82d9a52e308e963a77cf65dca0f0db111d46ea30706015beb00ec729304e0794895cf4c9ffee381b9dc4db3fc4d44181e018a6ee8000b868ef0f6160804464b254d14be3559d4caf9678b5de7b7b1a7a9070d0cf44ffd032e70fcc92e5bbd5cf184b555b97e34c458f87a09abe6de3908048bcc6f5507a73b2223ecf3d9c29f17f00bdf6d61e208cb9005a768db218320e7e978fc959b55e7302ac695dc17885a23246b49bfd619e57d49863161c31abfeaf8f8cdf8833eca414424e4e8845f127a575087d5913b89395ef2aa55d3cf8b3b483f396b713c65a0ba185653e2986e5115071a047fcaf0ae1fa19ae7b04081b1310982d392383bb222ebfa5ba52744e12a72513e438cf6d03af216476c26994891acb28f59838741142ef12497861ec13abc8acbb2466268e8caec8284202d03fcaded555ed974b17d41c330f848d0e2f1b5a9108855768efac063c9920ac12b6a879a08948d0f9200ef3f75da5f41b2f543761bf7d0d86e56cc989297922460db73a03ce84ccc4030fa70397fb5ebc5cbc8f6cf421f23c44bc6189df836d6ed6a0fc78038a5a8608036e674999c34a70fb35b8465c0d6758728acb8d73eabb3ac644d6758c0c73296083f3954c9432d9ed6c71996b021695e7d65b5375b2895a334009edfc2a6919cfc3eec78ad4b9287987f1299da8bedbec20a505cfdbb44723d4bc3cd2d1fe12f00b19849d6f72a610abe23dcbffc8ade7ec3bd0317af222b65c7ff5b5495220fc13e5cda3fa09da3f95fe2d8d76d6e5445d3dc1643b9c66b9c7c8107ed50a0a29b31e66402fea924c509767ad063dfffa4ad6d54d7f58544f1bc2358feb112f8ea19d97c6eb91cb5f369ad9b4107d899d1cae3e5c724bffa48b87ca17f35306d3812384215d1abf008a7b907ad0858d50c125139dcffeaba4361b7f953f6a03f074cca6df53e91ff16c78827e83f0ee880f4f5195310028394fa5c5f3ba09186284bc29f4b6e8416a138505cf499953a2c6c8ccf9a564873d76e865c9910a20d228283e2cd33fc3f56c013a8d7d07716f9d818dd161199b436dd88262394d1a87a38a541a85f8b7eb998dd13fe030b3724d081dea153fce02a84f5558de530c44755f6a9881fdf2e0ace74e8717b9ac72bd9eaaff7885cc06859aa9aebddf0ef40c17f2d1a683b99702ad953a8ca9a51ec84692e1aa88ceea09f4bf605ce20b8cdeda1e3a28db51fbc731c8849bf745eb4e8d856bd9693e77980f418550012794cc6d95b22716d9afe4d185781264b1192ad706040d0e15d4821e30e08f34048456ffd93f3155194cbd076c24c1f5684354f0739143b8211d2991f08e454427e459b107a71f3e0b5f0606c9daa4b4dd3fa76c853bc858ee103e50e7faaeb02a3421bd55fa8a9e287bd2e05ee9a2084aef08260f837b4c3013fe8e3f6cf9420fe4d218ce62b4da5abae4361e0e5e97561c9d68188229a44b345cf28257cf8f053e9f953d6e47e881c8cddc7c1bbfdc923ea870e8c241ef5e7902e730fcf0292ce2643a1ee75a36fd97025cc20e150b3080d378d6046ad87a77ee7263472719181de493b6074cf5a8c4582b691c75bd21d7affa7719d90ef574240bfb654be3072740670a8f778713f5e79fa0343d7c94951d4e1dda38945c1f1c4c79b0f46b1794adf40742c52f886c76405a4e43249a6cd0ad084b03e2523c8631e348666d2f48aa9e998b93e0e25dceab0e1a7ef1a55f7c65f19211cee7cc13f85450317d0b12dbed6276515724929d660a69001e89c88430b48d4aa0c27214317d9ae2931b35e51fc52919c6c6587d109f3ee90e3e0d362188a26ae5ce80ddd83b702b7424ea9db01b49731ecc57445d651091b4bbe3d1bc220b3e5185a8d49a1fe80a831ea7e2fe521e3e04fb11b42c2e4a609ad6015bedee86f0189457819e71f14c3627b9f45f6ecc3447684d160ea4ac997c73642271ce1e6a46ecb8bde88038c39d123f4959a78f0c8007855cab251e8d3da4d630000ecd9126e6833d63328a24c422fc59d9359e12dfcf27d0c5f0199b4821e3cd1de1ff163fc49a9df289a9974503df73519f1552e44e1a98569af102affe855d8f39d6a34742ab7064c82c88bf08e8a01352a500a36f795cdc0b4037aac666c88bd9871982bb6ff04dc88a5245039e2ab2ad19240ea285951e6177b10884632b34fad1217a07b38d550559090520a9e1b863b056838b479879f1895435aa98220a8f9a6d76db3473a6d3847f65040f7ba4d761ee389d4da5f3413232a7046c0abf5070c8b99d88e641b201f5da1c9afdc9edff2bcdc2f470f991089f05dd50150db240ef0f642d811eee33b99129b73f096d8cdddcd5859c0d2e197a96707b15cb6b3702c6682907c8688922ee114ddd36d9907ceb5259cd5bba0084a436ecd1642d23b7f66c6ce0c64185c7d8258c977a52178a57b60b41ab9ece7b84aae11bb5950bbff2dacda0d64240fcb40409ed7a53e69477d230f149529d3fe6428682453d6251fd921c8688547eedd51b5c68844880751a48612aed8826a37576d2bdd8005f765ac392551ff70cde90073d7f0b5512a16dd2034c1376a4080032dc0abe900746558ce59dd2c4d231a706d2665067273dde3df674cfa4ccbadb598f42e13e846fc4a22035f9b854af3c2500eb992c01097039140dd976c37dd9fb5be240f8f89ffeb634aeea48d28b8c04660eceb21c793218ca51e92982bf6e6f26922df5298239c4a89714e8a751cd02a659df9529860a1514f1a38629a5873ddd9b6090e6a39a042002ede0e9cbc9296ccb230a9bae17171ba4ef5cd6001157c8984f129d7b7a851066bd1fbfd5d40418eb076677587b8ad3f0d30aee8b11a1b309a2a4aa67cb340ffd2c851a80ad034548f1cdd55bceb68bc6d92b9b9d2a6e0fe0df3fd0bb95a18ef580e85c6b74262443a276a822babfcf27aae1c1c34816f3ebc80506330c8a1061dab2f6ac40053a62579fbadd88d3554c4ce5b6831fee23a3a531d1ba63e53bca00bb43fc391d63f59a67199feda087c1165c1d5995d0720990e89c48cef7b25de004fdc9190a298c67c460d776b1841fb80ea780f7df5acf91dc80087a3ab194c2a97729c024e42668964e26f5375a7fbe24c1520643ad2f349fcaf537c48bf433f5b9a45b012ebda2247a0f0bbe48f1b1d0e846714989b47d6f92f0d88f5c8739a31bf4133023e14fa286411665dc848f4d58d344698847724fc929854caf1cde8ea0d09c07b9f92374962f73f2d1f40e3902cb7d56b15e7d0eefcb961882c0dde1878b362784afc69cb0794f0fd51b61c1b9d03a02fc47ae558dd9f4deabc27b59977f492e1614d7e474614fd8dbee719e0f69a2f0ce128a6f34032ccb3c35f82d313e590947f4f99ea483df92e7639d67d072741304e8e0bc74dbd0b23f3cb45d85a3bb26374a4396eb3b6a4c00355fb8cc775aaf6703f201ff59b1b4f27a182df262d7089677abe9ae5698d33b15fb7d4dd4ca5c3d907daf4b549e07f51ae0b484c99614a72ed2a0e63935ddee0ba964ae607aba417e84221123ab810580d225047f4929582b6a546e716b2b9c090d4b9ef3ee96ae81e494a5e9adaf4e9643b9612c332e3cc93d565710a48f6e2090808a46e14fd79075d0a72f700e01ecfc85af725a14440a5a40c1004d11b0332ca006e574f5b101aae2b380d39a2a74073f9506bf2e0a6db9e9d44f3c0b34d8f4691cefaddac68fe1f4b9217b8da1ad1c6832af7516ff283f1c24162d5c9d43c6535af3b663c8f6b317999b5a467360cdbc798b621d6450be808681e1ef26c3b9b41b45b8f6ed4a6a3595a19a15eda260e91cf4bd27cc6c4a9a88936d82713001dfb2cad647702a2bc220ae6081bbbc13c83d4d4e062801150d72d7e5118df025a8358f40f4210d7ccd0c64a724bfe36e0a125e3f2f7a19d5762c83f155a224598217f7bb4e7888d0aa934e3093280e049c77787906ec5f65b531dd8523c41c007152ee734bb9f3b41c5ac053e08c2a114b7cc8570dd2060156591ffa67b27471a6d3670e9084e2723e81f98deedafabecd6903aa119e5a8e848c7516df9aa6642fe93d368010ecca14808cbf3b997b04f3bede532447812f18f9dff221fbe5c04e44c2a574bdd76c15b1f60c84093c165abd36b325478cec46b35db110fec226147ac00e55ebc8c2d694c9c5a5a94fdcc3ae9bf905c8a7aaea5c51011c79bf922985e92c6e34eb378a308336dfb376803039ce0e234d2d8a3a1a0ee6b3ccfed7b2e36176bdf444da598ba702c752e2fcfd2e98a4", + "public_inputs_hex": "0x25832c071d6d99ad42c7b885e48b10100726dc0de03c0a779b282c519ccf538a25fc312a5f0009edd084811b739bcbd529987df1cea36f5a2451538666257396000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000097e089d738cbdfe4aabdacf499858d5d00000000000000000000000000000000bea27e9a0462c1bbcfe5d7d11e69ab7c2208484402633db0cfcb2af11d3b66ff07cd7b6b12c3a35e9581183e399d53f710ade7d9aa4cfe74bb36dd9a0e12531b1126fa2403608e2b7d175414fcb9e2f31dd5a66f5ca90ea104b52c48f4a3e630f174014acc8270d5f4dc613a06eb6a3619654bcbcf5e533790d9be255bc5ca90c779d6375fc717d27349065da5753954032f128b9e186d3fd9cd5460214fd5cc67db90c397056d90b3fa1e1e93174c9904fcf7f4ac91f0dc986701c89901fb7d914b8da5dcd57d430d860c3979baf98a" }, "decryption_aggregator": { - "proof_hex": "0x00000000000000000000000000000000000000000000000b848f7067da04597300000000000000000000000000000000000000000000000cfb8eacb33dc5026500000000000000000000000000000000000000000000000a140f61a0ae7da9830000000000000000000000000000000000000000000000000001b35adc769dec000000000000000000000000000000000000000000000005529748f6a3df43120000000000000000000000000000000000000000000000041e2b70da2e142a38000000000000000000000000000000000000000000000002489ca9f8182b061f000000000000000000000000000000000000000000000000000069af3676bfe700000000000000000000000000000000000000000000000bc2f7c98198f35216000000000000000000000000000000000000000000000001de57a498803e7aa800000000000000000000000000000000000000000000000e40fd6827d61103c1000000000000000000000000000000000000000000000000000084230bc9e5b600000000000000000000000000000000000000000000000c20745ecc0a9b617d0000000000000000000000000000000000000000000000098615242b257ddaf500000000000000000000000000000000000000000000000d98b13f67a2b6a5220000000000000000000000000000000000000000000000000000df689a73e63b1a953e2b375615edc3058e7d1ca5cc4bcc12d1207ee7045581b3b6d157383acb008447d2b42adf3a25787526050a2c464130614c700a9cf0b996d758e0ea3101207ba4219ef22ce8b381e24a97633135e5ae877a3905824a6b2117d2c52adb6121f18d2e4a72128ba85103c6084065a0a957c369df32907adc47c59f3457ae3524cfaf1eb600e22c8222d5c7f3d05b89dfb6a6252ed158a263b28cf1d704e00722d53425971fa3915cb5842157f175ef3b6c978bd686b6bb911469c0a0bb04e524323ec504346fc6d320aefb7c8a5aadf1728b7a7598f38ee2595296f4aa053a27c5f74b1cb2d97320928bf8e5004eaea31e7ec579c77a628c4d06c323adffc62948c40c873573a3a100f76bfd152510de33a30d61a10d2b6d1c93de13958e1c18776cc9836534e19b35a0f44676561fe123ab6651f2926973483bed88c85e5c1ed56dc8a8651f15acc31d6d6bcf2e97b303b160aff49148eaae0a509cf30cd9294fb69b8ae360bd1e988a8fd0b940a61d4811e0e8b18fb2e137aa4e76109a151c5d96eba7b16f7543505b2e217df4e672a962b340c011df2743b79be60e0b0c05a2155c315ad8038be74112c3c0a11a2ba8bb424fe02ff440851c431f3a0117298170f8e7b02639cab117e04b8477192bc4e2feb6dc7d675bd3a0e09017ee842e52ae8728ea51e4a18da1ff28088f42d38ff18e60317977213e9c0d60b20d2828872222cc0f34e17aa5c9267d627f4ac25bf6c7969cc08f69079cc5182cf58c183cfc115d5179470fd7395d888cfca34a1913a3ac918e490bb8231b59359ef909ab3830af8794f8ad241303954d3f8c794969cf24f7f171196fd1267895e1e42daea16482d70b755aeac34e0b1442d10765de80604fff4fb678bc7f0400f5db1065748acf1169718b09f0aa0f601350f0a894f8d32b81d408c6d02b1906426515448f4e0aae668ea694fbbc2a7280df188e758dcd850ad11c7fa74268dd35f910a27b4c1b260afcbcd7f6837d48fc77d4a6da0cb7b8500247d05df4e3154c3024c6488ba33e3fd241db9e47eadb5c7ecdd8246a0532a85ea5c12ad12077537a256a2e262e3ba7450fcb7709ad3b2b9857b7326ea74d55f5ceb973b149f8cf7e0a8ab8172a80b043633b24ae10967d6489570114fe7c5bcc2419711b7d4be07121e64aa42315eaadd92cad2c7dfaba18ac683b7ba27997eec1d15edee22fd752017f1e3ea133164724fb9730c4863fac6f3c79aac2204d17c154dfeaa11ad78e1c9c38a7affeb9d26b70487b79b739b2daa0d2b89b0a57de0138d35875d5fd23095e676dc7daa828b9c87b55c7a3518b138dda5947ad0dd1b14a160547a853850ac087cc19fc4ec1f18b50f448df96d3b691645c3f02ae58749b108889cc72921344c9da4fcc45375fc89d97646e8a7d8ac9fc1507cfcb38fe716ca264c886db2146a1ccd11f884504c374b7a78a3396c92c52412791af6611b89bec51c8ba232444938535ffa6ecb26f8768571cb60fcb4e413ce7ccf34fd796bee3fbe9753322b0fa40c4ece2d11c0a0fbe4caf01ee10217d9713e3da320a49d2e44fa046fa2d95725fde9404a03323ed83df779d69954a6159ad108a0cec3860d6790373240e33e2916f05c0e22bf7ef3e1e55026f54b16bac5918c42a031e3cd75368a3ea0911eacdce98241da2874f049bf64456301ae43029d846360fc0b7157f3ccf9c2a618b5f19970b3569e8e6c296cb17ded8d661167462409d035d33f8f410a1af1c9d7c94e3a65ea5bb07307f1472f9bf7d3a77d4d738bafefbbb37b11d76a8592e9c374b65d060a6e0432b1e507bc3121a282a9098f9b1c56d75ca6cca35104415bbbb52c70c65afa557e9a5bda404374ce6d4933c90b2bb75b3ad3579f19bfe2479c82140a0b2d0dc1c358799373f4b0054141fdc63e26b4d40735cb98b412e0a92db0db0d383f17d1a3c5b32c14c7e00ecce12114b2a14c522a007a951e5d02562699300507e2202c4ec98a17de017c2a98f9f696f74f012a63e0ddea2b4c40e88b9ea9eba8c6a614ee3d17688edd8bfd425e968efd6e41f18fa4212a02c471d1fe5f93f27bbc092530c4ac6f2ad3a6560773c63da42312ebe80209dbe7af5221fa153635f616561ac1701355d572dda9f76e1858ec211a1cddd0c571472cc1524e7a358c86623765427aff53132b5a43e43735b0724cf4f7888341d96c119180e1cfed86fd01c41ab9a7b9ed10c57679055a8590d57581a6d0249971f93e12e33f3c568d000fc1ed9f0f12a741a42ec1a40e365c1ef0da413aa7292fdb61c0e994f53d3698d0be3dafb87348b8de14bef041dc9e7928909858239b791c7981e35ba93a4550b707bde9024dae26188c586bd851e350ae151480f3b787fc3db0053c854ac64e45cfd0c7526783b1d9066c34520dad62fd5c2195a94f05dcd90289201e5ef356c1ef34c84a1f3908211af44c1a9e44f63c34bc1077872f831cf2d6227dc6d78093ae08420e2c0ee695b9b8876fcbe7a5e27f7167c33cdfb5d3315023c8573bd927cd69c7dd64f6725215180bc8ec72d43dbe87904c30e01fd9e1315d81e115af8bef91661176d0d43d12c5281e09189e4fa8da6ef31867c5e49229b5e9f1e762ad2820ad879257ae7d089e7c29665fe3350109b817b2ba1cff502fc48497b60a3fcf25520e674245d397e728388b0885fb2254724111ce886c3008b363f7fa3ee256c6d2b66b2ee8ee6706129c381a305f06e0bf6427cb59d072472eff3c40da57fa40bad15e9c5fe639305d72ea09049d2a4598b72aa20bbe11559f8a819c5bc7278828b036cbf3cdbad90b31710103fa95493a3e1d95f14311b48fe60856b93baa932b1264f8203a3c78d7c04f10295c5ee7acf6d430edc2028a04b182925feeca261c0d7721177163c92b273fdc65ea9e8dc8644588ea1090684ef3bb32cd09380e7e12c59b402bd772c4418952cc8a294ff4ff1e46364041d295cc8f55949a82ae31c2f69523f349d5a258bacccd74e56231e958f8fee981ff582ff63854b92917c9bba45cf614b18c5b4632989de011ed79138ab62362d26ef1fd5eebd2afa99b676fdf9ba3ca972fba10c25aa0cb6dab126aa1a390be51ea1f33fa64b2d28c185a7a108e7dab30c1b6294c066e945d9eb6fec0dfdb9691c8121fe3c63bf90063464f2d891bdd627ae213e03b80d381676e921583af3cd21a651eee9fed187b8e69df4575045e3917026bfd4bf22a9aa5c680ce3d5cc0e0637807164449acdb6f3b12ac057411106e158e043f2ae60fa35ef009d6037eb0a92bf7d3b84212cfbf3ec6bc236b7821f0b17152ef2f1dbd536790d8060aaf81de5ee880095e83cca416a8783a531b8b9affc26f14848e3ea28aa826521b91d20a4b663e9fd51696ad6dcfd0068afb00e91ff5a813da0d09e4e27ddd02d477c294acafe501df227625d3ec378c8ebce32a57811927421e2e173efe6c0222a7e111dce77d8ff4a253b43bb277027570fc74609252c0c480a91326a694214312e2f5cab400667c72202f583340647f2910a182c44d174422c75d287fbed54792a2d54d768ea9152152da70641eabc415a78251bf2cd430f248bd5e22089e8d574231c9823edd290fb508e77034dc2f163bdc0126715cc646beef40785e43a7a6c10fad4cc07ac70c73a86c05ab097eae1fa23091df78485e6c00c7e9ab187eb8e09177ebd746640f923894114b8a1c066370d18c21cd3f0779187e04600feb1150e3812fe80bee8cd54a1622028c75ca001bb037e569533f3d9c127b688309a0026ba070ab9931c737db933bff1d7feff03fde071d5d47462704098e3f37e18e509b1f0c3190850f84d9ce5bef54dd7fc2f3c3c578ee43c40ee92e6256f605ded019e527d4b2c3f5e4e29cc85841ff0e94697affc8a31cb61062bc94a0e39bb140656f880eae3933627a1239b9b85969b64e9bffd551162916a19cd0f363259ab1a90ab085bb36bace2486c4692d034964ac64b049d51febf49b19dcfa5f99c170b17bd9df0b4b930338d1ef2d5696406b529fbd7dc830fc8c14c6bd8c16f00f1253c1e478d7e88fd2978ba0bd327c11331425cf4b985fd58b14d879b9839e0620bf079427cc9eeb05626ce30880a78ce60ae4d6ac366b9102d69765aec3752b40bc86f3d0a057736d13e3c85e4713dca46a775894be6a86afc029e0f8a76cea40f2182cf1d36ca720da6d2b5b679660c5061add32b5fc152a820b782087ba66b0a07809344a0134d129ba7f4e19956cfd5c47b410b7302525494b9a3e397b51e3039ad1ef896965dec0bff9b358868014c10ca1fb842e3b901b0e510122498551f2e9d7794aad63d358a377b42b0c6d1d78415abe68f58df1e04dc5bf11769b1051f90bc0f3e131d24df2c55c2e7050e7d33d22ad39e5db73e9af8b1c00128081b8ce0ce2a9951c146ffeff3e1fcd55fa601217e3da2193448fb858c06be8d3c1f7e565a2e821cba698bc9a13112bdfe25250d3823deb0e7a8fb419d9e772a922eb38484d054315f4418bb9a05efd6b9bfc3e5ee052f6a7fde779216815dfc4f13478e9b3d87b0a82f217cd9b0e782f61a8697d5d6707d5e0e04ae039d32acb62cbb49c04501ac0643d2524d3709215390667fd7b63a2c0c85f63f7a392074fd094f6c07f5ef4742de0a6aba56f4b16d8ce2e6f7270e5906c9cac6bbd72e0440214dd6d3ec8f200878ca27d4d36ca018bd7d9092b0aa1b86e6ea37d637778c3808dd56099b383a37fe3b60526ab524475ac22dd37d44a10380cf05c26d795edf159e18b8e9e07abf492f5ad7031ab13106b34b66be1ecc8366bb6933be7233d02250b41b4fb8f028195bc6f56fb47efbaa729680c0a89e3bab9c2d109baaf5231fed54a986f8a867b839ba0b3394cab7b638f79fb5fd0003bbb4f17236d2178b244a32093464ef748333651ad7798fefe65c89e14efea7bf094f077db3dcaaa2153a977ffc12f1b060c3fc74f4cac4c8852b1b86683e693d11c4978c2879e757056e7665ae4ec522122f631b3e7be0e247c70e498be722e31864c30b9e131f00069729385ad3114bbf616f1ee7b0da8bcacb110bf9e27cb437bedf1e283c5261008c0347f73b653e6bf9ac59c203749cca809dd1c666d128eaa074865773063400f1a2f125d9711cbd61c211db9c22d974b11205d2af4aff9f8f5795a2aa02991bc661edf40dcd7704f835795a7eaaa5d2ffca5a355400fd8eb053cd2eb201b72cecc94ff7c922e1351c74bec7068a18db3043d9048ebd87ffccbadae1ec64fa2b05d1c7370963c3ce5976f94d3c3cf4337bc97e2862c5371d7de5fbf8b08cf00a469637d69d340a3acad48ee62a6da336abe55d5a82d1c88e1a4cc0d64019010879351b300c0d4f5c8ec7593bcc6a9afa75eb0b529fe079bd4e99238be11c171ced5a0a55a72439584a10a548ff26452e842426bd0572527c6bb2e48b5f9ecb117d9f4717426d96ddc8c4e5c2d3cf707a3a44a20e5d564401a54fcbb2bec9c81527aed8153ecda2dfe77976690a75f4ad60038a20a8287fba638619b1bd8acf09bb43d9e15613ca424fb0f4b15117d8bf4cc72ceeabc45b803d6a4657ac4acf0bfbd262fd8158150068a3e2e6e6b97148231ab66fedb12b089fbf9ac106e6d70aec7ed98cc0a00c75a21498193b1249a75d4a121c8de1da14e8f03d76530171172b24f9cf58ed5bb84c96a80bff5fb44d8276815de2b11f63280aaf0910c977015b57b509baedf1a0abb96552ded4ffec30c1aa214f478ffbad0332bf585026177219291f2a7a5d6a47eb312e333eebadb57634b2c6b7b42340883b9444a9cf0d756bc8ec5020031ab0255720813527bf9ea6fa107c276178962953db9abb091a6dfccc0ee73df060ed6671445cb8ab79645d36a4c81daf02949f2ccac2f2b50d8c680c18a8038e2e4fb9e4613caec509de7e672fea040c71ade0f84ddf82442060de941d416b6cda862fb8a064d0721b031c7579c9b917480ee6e05054b3b70b73cb22a12cbebf44319d890f99ae72567d4fea41d298a200676aed5c9c440d2c1da3167a37b4a6a2a8e3cab3ab003d0a9bd75c1f3565db7440a50840afa0d820ed8e1a347f5ed5f14306fa9d6580d65de70e3d9e6ff372855141bf3baab542143e686a3af2c0ad7eec32397fea1d8261d7ad9fd280a835cfa66015b1e27517225c5c595103ebf1dae43c83a1b20d5d48a99fdd13de8804b71a36e29bb9220d2eb9e83179fb7d6d036a24a977f063539add79293bc4b8a514db5b794b578e0719e14d05a12be872f6d6d6eac49bf338195d99a4a767b10a4ef31b8df5c8b2240e27dfa9b58ab84a85882f45235480b01b40a00c94a4f7030f0963ce2a4cd8b0263bbcac11527f42563962bd99da5db443d0b1e0033795ca9a8c7903f1f339f6255933c3493c3bf79745abbd70be31483d1cac03942d2168a4f1847170fc85d302fff1ab84401d0eab0359433eeaf7cd60090c9d81e6c8e5c07e205eb049b2f10c72d392a223087ab81ca2a4f0077e20706fab5f7f305bdde4d0a9153a4915de2000df2d1e2967f24ba50b979f116f205af7492a83adf7a55eaa247ee60a2c421e43b1b9e7b656041004affd6a20ea5bb0ef63b91c467780eb487c6070fab41811ce6b8ad866d10db953803612ed1bbf5988481c603f79276edf7e871459055802f3d0053b41b8792dfdd36153e6ed6258f93c1f8e0b8ac021b9b94f525408b202a84935cd7589deadc831c1c5605db0e200fad3e10317a51d3fec67451b252c292e7b1774e660407e5a15b34a8c9f4d61f0e733d8c85ca0963b9f22a8435baa12070dbd1df83e54b0b2a1acc4171d1caee9a39fd3c7923cc6871804cd6a45241522f4d78196ee7eaffc973e1267f5890b93c6d0653bcef6aa53b62ed9b61b841e8bab815b1ded0129cb1b38c56e9a754538a399e7800b170ca36571923260a12d6bb79a7fb8e6dc8e5b7f00ca46cab952bce4483ad5cd24ffbf0f717380323122c46ba422755404ae8510b406b2fd907d9aaeb3963a3c27ececec99a33edaa9101f93327e93488b4a619d33020e760bf00158724f273434655cbb6f8d1a975c132e4be33e35e0efc792875a03699d80227c2f4a82cc1c41779b595ec6b229ca1aeb4878e91d33f5c1f8e6f4fc6dc0272fc57bc3f5695d22c8d8c48d43c1bdc31d2da24ac5e9316f10b959e21550a2cfd755abaefd3f38123733ffcd44e99736179ac0bae52fe1f58c61775f68d32f624cd87d2feb6cb4dbdbf4373a9d66b80d12eb80cbbe95ba9303626558d899af8106ced7de5ee279a67156c0a3c331aec02e87e29957b9c0ac857cce8a96e3f1df0c20d5de2919263398f66b9d600a73211678262826d92f4bcb00a9d6eb2c2eb2a7ecc4938a4014ac4c51c552607b6dc10cd7a5bd4df68a63f60e99a4217feee85660182837c340fc514b1babb8999f22252b722718ed1b4cba7feeea9e62cf1f928561264ffccd96ba25a5b2d251034805640ec7a51cd89c8c15551954728e5c4a0fb51a2eb096f42476fa59c85cede303994fab2c2b79d77b62c0e603897a38e965fefa190cb8f5a56e41f3e5d982ec1d07f555fdc8fb2ad2f4ffe98295c150230780734aa03b45309488fd2833b8381d4757d04fa792cc07684c3779d6e7925b62e7a9c7e4a480bbcb4d6fedac1f18128d5eb739d4b69e8b21071a541c26179848912a0d4cc4ff0a781cb6b31f878f02974c4f50900ed33f113e0bb0f26468012cc533c2ca3992893bab98c90ffc870737d1e3dbd4fefb3f3cad23798bd53a8582110eaffd4d743e338d4d722f37ce1ebcc857a827e17f21b11559e1967b8d77375ab7496a26c4b0b074a869f4dba80ee390a805941102fcfd60ae53451ffdea972f2540da6e0158f526d3746ad4151bbfc38f1e51d61b972ba86463812c0757425438511fb52e822cfaf6de308b220969aa9f86e81ea726dd04aec3f9d5ac8a8f17b0f20f9d609076fc00b14bd3fe02345a027a720c6e69b4a63e5e36183dbfd0f8cc4e91bbe3c3068c619a1b1d3403aff3af1b56cc7b1739136e60067ae287c98d9e2ce149030a202ac73941a6ff0f94086685820732dd374210e88b9f4b63485d7aedd71fb847236dba844137ce0450b47164a5f527c08afd78e8f640c14d87643dd72e423cf6fbba79157dcc420566c93478dd666c41ffa31c2ecd7be1dbce9d9bdcf168d4ada263e0d0f430011c777c6b3b40b46080e53d4119b244eff42c6e69ed48279af0cf4770293edaf511a16c3963ec99669ac601b463cbf66e3fab9c15d3060e000fa88e3d05bc656a1ba70800b6c5741a4423df85e4054f05520df212d9281dc34f7fb9249ecf8c3c0f4d2c8f7acc0e83aee1d251a75f8b91adcb606c62d3ede2690a94ac2278b8bb19f63535ec4947928b83cb975772c1af82294fa24b19f01347a7152ac2c3ddc62079fcae6d7b3760bb8b4c789def8284a0c967e2a4952a1a004f5f0eacd2cc75056ccd1e5bb952dff6b0d686e0518547fa090b71c61135b66143c3902bb940381e174fb8cabadfc57cf2b221173a632bb2118164ee73e7551653239d0f26b0ab0251555276a22689f249497e1aa2fdb80c1ccb10f1c9251356172afcc8daff492210ecc2afbe7e22c86e233d33094753e2d99ebb44400299bfadba8f00742d9d1a3407043af6996354516cea8df2b32a4a812e495d44034010823b33d462803f0b1a6e0bbd39623cc963d33a0a091ca88a609129f5ca0aa07564b4ddf1cf3fda284e629a09f29850659d05d665d6239a15df892595a38396e55b60e15f582ba40f41fd33fc05b2dfdcd49d4d2c57699a0ed952941b8cad789dcf07e30b681da50407bed8c5b81c23c1b3b42c545d849a58c8a573234b62976474fcf2a8fcaeb807573f4628bc97825e7f54b1a3ad043bea287e4445e53f042c4c6a15464841ae11ff27679c65cd10dc23087e03e9e29be3c1f3a2e9cb0ae4fa6854e09b9d26f1063cbac8be17a250addbc6bd7abaae71d56e594050d5c1d7df6b7442966069fd243dd956498931f6cf7cb430a0cd69c77ff8e4607c1afe006c8d74c3f813f7b41f1087a949f426d578c92f78fae3702cc06f55f93ea35fe7b8d001c8f615ce1d1ffe8754bad06ea54d0a3112a3810bf1bc5b9ae3baa0d2ab3c099718bf98bf4820658f23fbdb337379fddaaff6303ce007a89157a5a9a8b2509cb6f2e0c72114244743184f8156393fe128396af8c48d5a74dc8946b61d66137aa6ee7d4930cf264a587fdbd7aa0c068804057b2215c264c3c77663dd4cb58f2bdc2de0b5ab112b104da9bac0d9db69a448412588863ea869d4f890eb8e4faab5827299a111b42ee9463654303cd9f4dcff5e58afe88724abcd3fe4cb3168aef9b6ceb7e9b1a6156679fd2085e6db996c6540ada72d5ea0cff41cdb9483648f9f2685347e7bc512a9d6e535978c5ed0ce38f4cd903a38b3b61ddc2d79e14080166c08fb5272b52644a0ee32396a63c02d3746844ceec71816272a612ce308778c70a75119f5b0140916fafdc97b1f9dcadb8fd0735e7c5e57c9da0c017770e01e20ea42b73f771522f9921eeb1daa7e293c702d0f61b4569b5b516fca3820d31f6dd4ceda2f9728c0cfef56256dfb1a8d61cd21a3f45f7eb98e3091e05328e13e50cdbc6843ce2d8f397f0050b564b3ebd0acbafc6510b3e86e22b2d2047f8ec5257c46db621209a2a078c9dec80cc74b327642819a2f99c7be4b2e1d2199e2f2beac3dc2e5022d6d91efdb7b76b09877ceed20947ac3cab1538083c437423814930ef96dea4c15090bc6cebea4517d208e2e824892c6e16377ee7929e61d65ad7237dd82598010f7abaf49e01ec9e6e08a82c4e853284210a8c4702df5bf12123f71a1f0f5160d6794f9c7a9279b930eea4d341380919281804a4e94872273e2e5cc539c76901209f99b730c355459134fe2c0f31cf6b4588b1d44d3ebac7719797d95bd035208afabe41e1975f751fc36aaa3407e07c6d57413529e35a7c1b38491422ef1291f6a30c0c6daf41e7058c2591f6b097d9b2edde98f1b20ce6fd5aece66bea7fa2915ce7d77023ae83c91694c5f0b737add3e40e4843a6c18f6d707c3d2c85df0299529419ac1919c5bc769faedd0f12b209ccb799f5dc915a985c0708c680aa11d7895f6e24a12d2bfd0a60807702e15814b1520e87f3409de46e5209973232d01db4272a97d90adb153e7cc27dd74f4185a29398200a656d1d9dfd683aaf39313946aea52c413519d6b3bc374cc173cff10809b8909baa02b1e5159edee8bb62eac59720ed6dcacfe763a0b7cfe322855ebf7bff78973198d6938e4ffd88c8b0d32ae740ef3e56931f09c0c29f96ab6c186380f5071cec86000f7a22df3a72d0b895de61a03eac7b5558fbe848e4f10ff02e3908077f41ad02d24fd4cd0bb6b26e7e931f92d07c7fb6398efe14d166d8636b74c50f36125536e8d4e54b8ef490f9613caac20bc9595db4415c3c2220cdde4da13c96c7fc5aec1fe4d3959b9f924f963f560c6b25f8fde46885119f57a6f7371258532c6993d273a15634e653f02b022ab922892ed90592aab7ecbc248ca426f6c781699f05b94fd9699d9193d1fac31588805eb9e9c2b0f6d07d672153267fa971b65d7919fc06fed449ec9f10cfa1765e6fe32511c5cd9964110fa2e8c31067d0aca0594a8e30930f7cad4df0852eeb8f4ee0118d291d2d6bc65e845de6259392a3a23f0ebb4b8044e9b033a0e02436c782b517fd3571f5e640fc633f9eaea7afb3e5e52d7fb7ae85002bd43280e9cb71ca103b038f5440f07ffb5c07022c63c71b7b13c5d02d95611745d5e163831b7d8405c891e99b0187be7e16ee91a4df4d51a1f1e7471a4df113b506b27d0bd739504efa54410a51805c7a0c3473591bc5e1fb407b88989972bc23efa2d26ee8732f82d458d22a48f6f87698fb230510278f71e6110d3c824c27b0ad00a8cfa8560bd7d8182893afe1d9fb2977cb50d6fa56f26d1517d2f71e0ccb42622faa7016742636fb83a916407f2d4efc89f9946cc1cd1e0d1cc3807759633cb0510e8ac665d0a45803f1c9568411eef994874bfcc7931df17395ff51241ff5c124400dfcdd47389cb656691a889fe095e97f339d36646df49e57b965d8b33e214b4f694f8f0925e03fd5f40981b9286d6e407f18f92ffc8c85f83ef8d07181312b7055d28e732a517a8521eaaaa90a3ca67de07dc28e701b85c5dbdacfd5a5008b34dfe53d6fc73f30cb18c00518041bfc57d9f64b64e8678cd4c1188676e530227175b1eef5ff44203e722278bb91f98fe8b911573c39b9f761e7f73dad7a92dbf76cec5be468770a1978606c24b0d3e522f5120b693eff54d38b1d10cd80f114153657e6e4376f300f59fecc5e7709e17b7e14fe4af20642b7ad7bfe91bb0300fd5d9db6bf4df35703fe05bff89f997c274d95ccf9bf07eb5ddb8c8b8fc9c2f48ece63e29a592ea41c2685c73cd1097a2134a4c484b2b53d6b4bb234739e22abdc8030545ac4df71a37aaefb9c7a704ce293764bbbd30c4baadbcf6c369eb0ec714758cb33b4e304652545922f487f96c6a267ffd7fc0d7c11a25d6e0429608c2f6df6ef67e6390eff059329d36ba9db3eac7bca7a8f2ca56840f6141305f2c116a3db192620c0a131bbaefac4da65c54529043350d609fcad09ade9a24402e8725b3338cfb990f458ae7a4c52ccaf53ce9ae282547a422a26827d1d3dce2274e9b51112988587a3ab714f0ef42a1d876dc39e3c112a79cae3896a33d9a13072177ee6d6fea94f01eb78f935f8c9de33b62221ba77b347b9229a334d417182e59c4a6cd9fa657cc2a8667b92f6bb818b472c5d7715b61bc5989755ee041240801037f656357e6c0fa53e6b42cee535390a6876123780b29ba90d7c558da9f12d9a37b69f6f5b3e924428e8b08fc14af078a468c81f4c3c6c1e06c277de2a620a0f69e36deb8c19cddcb73fa68c8301e1ebdf39a72ade861dc02e5ab7f8ab428cab45a4ff96e733274d6d87f1df3e42f219b2d613394a1755de67872ffbeed131a535a20e7c418741bd73ca355044fa144a7936e930279ed6e3ded182d8cc61d89de26952b776cf1d17ed04d61968d07370a8d3950445b4bd9642394f003ff14a6c73f993dc9ca33bfb497cfcb7f27a2f3f2452fead8ab31a0182e3d3b70632ed9d410f61054261e79d7a3ac90233c3b473a3576fff10fcfd468e95749cbdd2add7cff11960f67ed0ef73691934d54f99e0ee94202a349f03436c695b561a81e808338a7d39286e584ac61ee5d2d94c0c22bd24bec13e7e10ef3125e2ae98301659ef85444a286a35b4837e5a034f3f1e4acfa0ae181957571788a160dec670c479afbd10fc99caf3c58705fe8f1fa7cd599743838be1e46742adc2f33a8691dd72b5b0c3d6dc48a5d7fb4bfe2e7112ab91b325348739db3d804d56d207583091d5c455a120de60438a23ac79f773c4f3a7d3f6ba689cd73e78d8fcb11c34928e9f3e2950b59524e5c978460553925ee38e93f4a36ba9fc319a2cb9554530603f73f6d43197e47255602bdbfa9d0f42763a3d7c827fe7652119d280f8bfcb1291f0c1ef60919a98e8fd034a894a276ef544c3c726a4d7765486549002b0b6401c820c3ae13077142caa1a9cf4dfeb037b575379d09bbfdfad8e9a3a65b442a2eb998ee8036dc8ee44b19765f3ad89c68250136bdaebcd6f20a64a2a996a0ee2a2e15af6c67e71250d9fb7dc0c4f5396938174d1836f598c91312cc390edbac22082e3de6dc6c42bbfc782edb4735308a414b581425c46fa1899c43dffab7ad1470b789f3a376d8f05e382e4eef5ad2f730a4c6ca71b3dc181bfedc014a3d2b00dea01112567d0465b3e605cbca12e841543e9f39ecc126724ac802fbccaa8c0238a905a0a909ba0c4d302b30dc3b77073e601e426d5ecdcd9e991f8cb9a833291480283cb121f1bdc9f638f91033e3aa6b5c64dc4006f5aae7cfd5d5bbfac70ba40e9cb25808a0a689515f811e67e7d63cc307cc75654506f44405570f452418754d1712c04993196cab35c7ea1f2144ecc1543a2c4e1591f3b94ecd495fee1c1bb846112a5aae6cb6a19faf9fb27b33277f32daa6f82c824fbb3055507bc818f96b1ec9ef2de81da729dca128fdcda775a39fab77b88be963fb242a099ccc0ece6a91d0bf6d93df0e19f975ad7da6e9f10a546949ebd6b18180ed3825a77e1c6e15d81d01398ec10c8fd8724f52c696b34de7e26ac48375189ddd503e19ed293aa1cd6eae95bcf17f3add4b4dfa09c3433fd656e0c3dadf111b8f1143a7e22516d371c2a38e182f341290fbb5056ac9f1ea51058ee260825918bb89a393502df87d475d7fc3d36b0dc606bcf6c369c51a422d9b95752543704a8d9c2ac374271e2d61cd899fffba684b47845bda1683342d76d8ee853a801288cb933b889f1446f0ad542d89e6721fae1dcf14690775cf7b2bea19715f14e2ce869bfe48871f14cafb1ebc870c16ad964b0571772d77f785dc4d116ac3ec7dd3e6e33a316d292cf4826fc7534dd40a58496a31a6698165ed2d15d6b65f4cf65a083b233081182c75c5c7256093280baf3e6039b485c966a4adc93e968128151b789e493478216822e156940e5383997307d339c3cd0f6e6b797ed3c20efa02724897beb560224117481c8293bacccec8b5930f3debc7459fa6c8e71d9f3277b14c5fa01c4311b90c808a4fdf40dc95186163f4e28cc568c5e5acbd27b7618bd0e5c9bb7efe2219af0f6204b7497060c1d9601f9efc7f317f7c6f7081ab661059f573305d9e2fd2eb51c85ac7b45341c2cc132192bc506304df61661e833aa262d3fa75e21208e014fe42ce0846f8b16168a662a57a5b55d0d27af4237a165855fd27f122851019b4c04fb5d022c676fc313ffb296a03eef785638c893853cfc602561ad32b101fd6ad5ea0fea4d4d5a492017fcad531bc307455c1b7905de3408a9d8850ce25e8e3a1e6ed3c3306eb705fe3785cb93b49278b24fb6a96793798d2f0a057052df7591a5099f3fcbb2e0e7410709cc4bbbe1b05460812d481bb5f02b59603601e677bb528c3a003004de33da4925468554eac3cb3229f138b19a1278a83d7ab15e9be54c76e61c983702c43cffc2d2e9b91907bc8d7274aa2212996a91e1c880655f31c7e5235bd1859b5362ec0d4e1c591b9da7391a509c56d6f7a331e6e7e0e8bd781ec70faec75a6bfb9b6405e5ad2ffe2acf7ab915b986a456f16b61c3f0e1244ad90e3f92e0b892ee2608af2845ec819cb196bfb2cdbda39e30bc912d81b93a3d81947e6fddc6b4f3efb313fed09e5c0d9f6a27b1e97bb5a143474d3b51a0a41cc70485edfc31889587523d0da2943be33c2ef8f1298b0a6194efa03ac29ccc15bb12ba5b38d399585be59fb9ece3a9e74f5a92249c7da5ff28469859c0770a3a910361232dad8292a99fcd4f06d55ad29a3abb22aa9de47d58d9567572260eb019429970a087a1bc0f84db9d940b67051598e083885cf0a54dd7c7f41166e9923e928060b8c82bd127cdddeb969328bd242e5043220916323ddef3e8f09c3519aac68604cb8f6cc8a01aa514bbe678b3c2d57c6a5d69459f3c6adbcd0064007fa97d6dd95157d7281574bb25d82d45f1357627bd5426b55360c9e1c022d671d7c295d43f13f84d21247c8b1ae74a060e60e8aca8c6e9520e0b6defe58", - "public_inputs_hex": "0x15c9b404c344691839abf638a132bd083b09e98c2fadb268923013737d217ad41dfdc7cb6265f100524012f038ee1f205bf8789b70b46c57463dedb4998f7ac800000000000000000000000000000000cb80a0dfbeaeb79af355a70d8f19855c00000000000000000000000000000000915681ec51465d5a3404f61907428b7100000000000000000000000000000000666965e3fee8efc43146d3b5cc157df900000000000000000000000000000000b2039cf00b2cd6017d01a8e38e5d2d102b26ea14534f288a6affb3a0aa4953baf450f69fa48000890435a8ee45258a0a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000214ae98e2b0527277d74d7898e5a1d76041a613ee74f2db890bd6db2fd3a76e9d30329528532c70174aa6a80f652ef9fb86217d722ac4e756dac8ec699873be87009de2f6efc0e2420bebb740d52be9795045be2c08d2f61c665fd8c2946f25a70037344482bad1ff4c46d1ed3887ee2f37d4bc2dd3a1c34c3c6a0b0d75d4fa630000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "proof_hex": "0x0000000000000000000000000000000000000000000000056cad7c4d4ab29b08000000000000000000000000000000000000000000000001c619e9b18c75b568000000000000000000000000000000000000000000000005d70fe88223230f090000000000000000000000000000000000000000000000000000f4d3fe76e6b400000000000000000000000000000000000000000000000f3b1e196b01bccf7500000000000000000000000000000000000000000000000b6a2a87540a20bf3600000000000000000000000000000000000000000000000daa621f0595b95f1a00000000000000000000000000000000000000000000000000008d5a8ba7f638000000000000000000000000000000000000000000000001accc4779895fcbaf000000000000000000000000000000000000000000000000668ea7d6e9d31a1f0000000000000000000000000000000000000000000000044b0fb30c4478834500000000000000000000000000000000000000000000000000006bfc6495aec80000000000000000000000000000000000000000000000004f4f3c14746f379b0000000000000000000000000000000000000000000000088dbe00e529eda58c00000000000000000000000000000000000000000000000f2605405f1946fd4000000000000000000000000000000000000000000000000000025b1f866541452ef1d421942cbeb1c5cfb5397da431759d5d9a9c317d36a930660d1bc170b4702ef125b0f2c11c7a4326be8bccade5618401aefc5255a1c696e6e85324f1050f268c15d9ee4f26e41b34cf4f0d5cfb130caf915adfd5ba31f1bcc79825f919471d415c3651ca431b5f3cd654858e981efe0855a21b2e38d123135b44710f1cab2c035e4105d4bdd3529bb5fe9188da07432c5a89e76b8f89a6fa18f3529cc0bd0cd2927992356821b6e43d1bc83f471bd00bc8f49254474a4f608093bfed179125ae77567866514f161a7684c7e6f6655e7b13e3372a7134f9af19d9f684fceb06f4c1e272c65fdd85029c7fb523f641d823a62439843c26aa5cacb8fcf0dfa10446d9cf70618a9814cb612660cb51726a62b6e43e543cfdddd4d001513e0d9529b98f6dfe08ba29b43c0328d7f11c2aaa68a41680f6c09512906652df9b07b81922552a60c62d7866bfc580eee4c7a39fd466127d0467fd96a77f978a90deff11f53d729bdcfdf44340633294c43751c8ed5297483960c58ab9f5e4313a5e58037cc3e1e0d78015e20d0d922b7dc641a5d1ea3ccdd01925140b4035dc0576c415198c1b75ba202af61715a9e087da1e48acf524606b9345ba54bc72b3447cbb24b16a9c8665ed01f422f4fc43ce9b9b4f3fd06dd1e170974b8f58d297c6998219adee798f050eb69bc48e574c8cc88e5f54a599078596ab2010dee8ad7fd671166a365ee47c4303fb7f3814118d649b5ca3d5f81e8532255ed0a010c6f264b0270b360e011a625807a323e92b639d9c82d3ab7fddb9c617a42b341b7da8cc8f2f3a68ea0915dcc62b8ac703522c1ebbe5530bc3f347537fef899406586e07d21d6e94d5208ecdf0a86971102ce7d61860e0bd1b5125ce717315f91e4d3bd4100f7b505fad6af8e3abbdd4f0759813aae3a05e90c23b4ba78c93b25b1711b9082145f3fd8aea81849b9eb991eae4d7047d7d03ddd13acca9a9777f25674154e60e060bb5c5c7be3c78c5b31e43a5c897e4caffa9f7a1784a3421260ea5aee2d02e6433c0b5662245c4120deabd578c95be23824fddcf69241423fff241f95fba244ad1484c09e631e1b800a5d1ddbc91300085db9bacef86ed1c4d3cb780781e1c9e02ad787c161b5797f8f0659efa8344be77edca236a9fd2bf7bf2de0aa7be073b7654a7dab5618a0ce0309e58b827ba0946e73ef577921924d315838740ff2f02dd4e38468fe93cf477bd8895f1dcc5cf8ad4183ca384bdfbe3d46e4bfdfc13fddd978b48eb5ae0468a16c16e3a40d52eb88c6698a26fe59aa829d3548cea01f8791499143a368cc10df96dd9383f216939090abd0f703ffb62811e52d2361b848b466597ff32c1b723f6160f5e2a142b2eb8e636375a1dd708b9593913d80d2443dbfdb9aa76ec2b2a38a38b13f6511248a7c672e7b2361228788754d4c622966be5bbb77049e05d240123925a9c1cfdb7abab0f41c94d1874090481f9110dcb0a7e51c334aa75119c70b570e358ebbe6a273ae63baf45a461b2508e220422a32a363f8a7c9a1b2b2d5d5477762295c405aaab172eeccf35f892a410c5d9098bd985c36b0c0e5027c47d43d38200babc0cc31af1b49741a4af672038927004aeba9f5a687164f44ce33aee7a5c026f2213eaaa2e1a637d9c946bae55bb171e53d2d5e5c60820d878b6e6a3eeda0199fa2608e90a08b0fbdcd80e5f445c6e0667b98efc1f4fd2b08b320aa8a56807767a8d607c28db5ea61a5ecf9976ce281908a1c40c1000f3038f9196f47dc0ffd1d74305a28ba020cd726f6896f7fe390225cd292aeac8305388b6b765ca96d911283e733663900abcdc06ef4fa7570b15b7c47708512ad8abeb9173b1e6871fbf4315c843b2ea3a91afe5b23b82139d12c032c998348c3f44ed226fe1afc990192fe8bbcaa51e4547def8bb76c8a866192b0dfb27ba2db74f99b66881b6b9259e30e7795eb7524f2b82a997ec646e53031ec3c5b8b34022c16181257ec59b0884c7b4fd20d4b9425e8bd1f375deeba525971ea65b4a5f4256dd47880339f6ee908843d7d2cef8dad1fbdb75c2ca6ada1415f83c7b02138f0602169c0f75725ccf52dfeac97bbe61f439738325607a9e255e82ea48ed8af7f60d3a6b9f4f7c15250688bce43dc311e4e382a8ab0c3dba06c7b8c5ede63770e92feeeb31591d9e35f0db391bbdd3602b73bf8a0f0e91892a7acdc0a53834569dc6b661f12588133c0782d14b3516d4a9b5fe5e9c9df5df0c89c531e0bae4e6050957ba7ef3bfb44bf0bfc1a8d9b5b3d72de063dba8772e0f21894b3966a410b2cc849d184369cbfc20a8d2e76494c73f6294745e969f521f0fd22cf1b3dead3888791fe3a073b7be51f92c285ebe305ebb9cc691bb38b02a7360b39a0cd4db80dce561d9e798ae3bef95013b7e9dd5e43c630b824ece8b023679d5122e7dc07c95c35f9e2ef131138a07bf9020d1b62c389fe33b90552304be90309b9169733745f5900911312d4684235470faca34ed59582d1e2d380f22090616478eaddb735390bf840de0e5751ad629e8413921c82423fe4626c0812b612cc2cd48365f7ad6bb8e932a405567f4cafa3e3fd446e2713f9c626c6ff925a4b25d6a356314bd347906144b57400a22f588169bf9d4f30e77b9c6126a7c26970872791915f48f15f1a6378a83f588850df74ad183e97a9c4ce006b3ac640d2a650b8f228902eed1d0c2786300bdafed28dc54498c78ea482dc2e893a60a017389725f4f281f267191e72df183a69e0902c10081a40fc3da3aed353f03222db1ac7af26d0bec38702928d402544f59e76e0bec359e880fa2843665a0beec29bca4e0d866154021b0e26dcd7fd75b17625bfd982e699790f08ac3a44f584a2923094ff82c4b714ff0dc3a3cd156e174bb08f35a56b7cb2c261a886dea21321c20cc2635ffa25ec21be53e93e63a8267a43e3bac1a43172cda46e031b297a72abd0445f4d8bb99f2554e6f539a71cf629a62cbc7d0c64a3b9dbe0d19f4b4620d83e8ad85e85da1a6a18a22d261a036180ac1c3378c125e4a0c03aab46378780672aa764d1267a28d7048f775faace9735fc5ee7afdc9e17fa5a9721e976f842f007d8690aa54a60c95bd9a013a80b59b6a22324bf2c90740967c080bcb48140eeb8246e3d623b8d388a455c9cf7f1c26b5e98226b396810015c7caa384cdaf07b549ad42aab158f69f3da72c1ea1a5c7cf00b7781f5e5b62ab04838c2f6586209c0cdf477aaa4ba459141775b67218e064b09af3be3f2a03854839a097e3a214f03e13ec21145ebb5ff5c81e1c84a8dfe3bcf4892c79d741144d2a996bd8422321999bc8e0395ff453438bbe7395e0695e49bba09ef3d8764948e1ea9cbccf2fe535c918810038418b8fd8f048d0db49bf6c1bfd553b0c394c8f043240a1a01d143cc3c50f981f3e7d6f6826ce7c2af850858753ae5454281ca9f929134e6805f200d4d7e2d7fea1b738f97037402dc6a3494b951274051f848c485d860c2812c2e371e5630f2ab4e56da8b2818468f4927c63699d3fb07611c88e0f2983b6294f3d21bd180cc64a5a2896d472e5b3383194141ee6003b2827513c89e48b0c235cfe5a962ffe156f1875f202fb14d1ef70eca3a0ea8877981010027167b2be0aed6b04ca467b3d9a477a1cf3f9759f2878e237c85a88ce01ee2f97fd97aa750f2c78111ff70bc2d8a535235222a617573f21dce2cf3dd25b70854b9ffd85350129a858ee033ad5f7fc66562f89d87afae6c544a8686499572a035e5995916e183df4a63d8feb24590f28621073a966a61699cd2377125be6043365010e08c61ed3b9c3d001d9c6cafdd4ea120e46860fbca37108a9a5b9a9f2cfaa8446a25b204c4f28ad5e52ab1695fe49da8663e90c2f797425ae367a7b4a42dcd5bd3fe926070c3ebcdba9804cd4a74722f73b0e5fef3e34743e1182ab54cd798228db6315c57f09394125bb7cba5c9d572ad6d255b4b632732cd4ec7063d63eedb4218e1f4f7caf1d3dd25167dd22623aaab18ca729628705911872313ffaf322ce01cc11c936d0dbb5b63c16ee60ad0a85b8964093eb18a940250ebda39766907bce66207f7dc441572f9677aef7a72d3e5fcec0c942e33315dc4ebbbab927bd09a2cd215d120ba8493452622c212d0aab531d9a7733ac743f52608390995cc2f752570304dad42f576fa8c181604c68f2cf87555228663a7c714e26eeb2c6e5035dc80ccb8b814f89a2383e642b8f829691753053f8140819204bd2180ef8c80e93c8230f81025fc3a42a1aa003c9b8eca00e0e3b850fd88c7e61e94d38b4eebb1c47059fd472bc0b8a3b70517698c7b74bb5e00def97185cd883247b4ddba10739fe06a3379164463d5854dd9a241327e5b419a2993704a75b513977b69b96b8fe8b0c7dd4726e5551284268a6c2e2667e0dbb3b28219223bb18f9e5af9d6709cff22b6a031590edb6b989b09732ed7a0a228a67856f391442545e2e1f737606bedc08f6e378d3ad8b0ba6db8d32942fef5e5378046832541b2d12a81ab902352efb246b2c10091c47689a425ec24e5b7f7bc59198f6f27189a2d7f42fa42b6205ac2e6aedf6cb543d0f606d543198e92acf412b5d884cf750f3b73f8897f702656901a19db1c90575af7dedd38bfb74229699003b67fbf938473413c61fb5e6c78b0878fb7a5db4a5b662313d0612e4c04a4464a176e06b478b5cf83921b18342452f324d99695dcf4ce33ff8efc3fd088f49d0747ff112006b954de65c9c8817af0ee60d9137093a9d4197437d2c57fe12ba577ea475d60906732c5746849cbc50162474e22b1c3c16e4d35f0e6a19c5ba983c4a1112f9281cb1f7bfc916a4caa92485487447bb3393167202c3696aaa302c00a8330093f3a1f3ff72baf44420392e5d2dadcad2bbf8303c926c7039c3c79c2041922c6b26504cc48eb5d12c2abd0a7515c373df38a8b44f793ee83bedffd35934f865ea07f10c96fe43e8857907000a4208a2703d320f159a24f346e3bf840260d052179f50919568d032a820df2b38066eba1ea7cffc02ce4c988b4787d58bdf85849317f0f8bd4f715314438f2237e14e38785e43212317697684d4a412ab17cfa0b6a64c8129424b6c7acb8d1cba0efa1a00b3e405602e7d00df2956376dccbae81d3faef40fca3ac6dcbf4f180f72866e5852fc2f0a5890da5d880214ebd2e79b04deda1742a1859f6f089b292e1c10696a966de1ee893258d934f9e851cdc77e848105dedf1f8337b074861e9774475e00815c94a84286c14d1e346f7da8d89ecc16a0c57e32813be3df9f2ac706f1fc284f222caf7608782ca6c7b7fd86c694a5ee6bfccf9eacdb748d332fb4ba7fb8df774b85b2d1f3adb3534985a4437db9ecfdcbbf9e0314a37b7c72205e241cccd78355ac99944501cfaf2c4ee0d0326ffcfe04e80b51d98b4f520e2e9e0f49718ba976711a22332e887c80194195721841e7490949f926bca49c0e2c5ac948fa21bb642670664aad40c4ce3f3ea70cf7902fff4b3debf9857dfc9c096ac7c71452d53f6a34686ff32984305fdcfed1fe0f995a35894efc50182965109605b2c39700a0ad4041c6541186a45e8d8218f4f4b3fe80b45ad08fdc4adf19f15e6beaaef77a30d12b3ca4303b4f55a4db68894cb4916a602f937439cb652f9b0798be3ed4da72c3fa8c0e1652baa9f88e53d45b7f1d762a91733b7b91a913790a477fe63688116c2b9f014462bf1b667c1e4f402a456bd1274c0f34236d06ed70c9b73a587e902443ce4853bad73c7ae5a937a1e5abb4a9bbf069b2ddb4214bb100536bbb39181927d13f2807691da20dfefa9459e9b0dd21bc3e8c33590686c366bcc30074314e6f086c6384de4ad088a49b786d4fe564b3e460fb97e00fd0cb2dcf6a4019d49fb759201a1509e305a20b0f87e49b3eae7218fca5f0b423824dc2d2ae4cab3aa343abe18d31c9e8a7ec65b6e8ef1e7365d2799b931a4c0b2afd800a183d8e0150007ffe345b3693f3acbb7ed7deaed961da6606e00b6f1b7a15f59ea2046f9375819019b86a5c67d16d94ed5b0d64295a6e9e9be90c853062c4bf2127f94e4398de65e83eec4f2e925f51ac77acd291fe3c4408f006040a91726760ea896b5c3dbb049108f42de5f968db4ca92e3341ecbfbbc8bd7968251f3fa3b07e2549cfe3232195b62b1b328895a777653358631d9ccdfa2f4b05199da8bd676437df062fdba92c8d9363bbbfd2cfa9b522c295983cceaf011e002198f97129a3e9981798ea7fd7049cd1514fb8163b0cb39dc8bdc58221cc19062ca8191c9b30ca4b8a7dcfa8066d6491e7e320a0b07c9b907d489911b05be0a726273667acb63e98cb324ca9064fe9a3e625634edd6683e695b5daf6c04ce97c198d7a2448ce0a0cb26b7ecff1ccbaa524dd91b62dbe5517a89643df21a01f1105aad045e0e4151c8ce7f781b40b424b1a071c214c86e28ea60d2489e594830d2a4bd978bf37e94f0f6824811131f99f95e4d63e6a0b13318639f9b78caa1cff2efa88000f5f654df97206a86ff10504529a5371babf812f2f9507b156639609268cc19ce52b7d8582cd9b3c2c12c2a152a085df6366ecab2be22b8620e077c30d95f6757d5f87a031d47d6497a2e59fa8bf4ac2cbbd7a58bb2f2aec7d8af2be0cb08139cc64f33d98e0c462602b4577ea1f0dc893671a4bee327c9b74b7db2d13ce138d323d1f035f1e3e4e0fd6eb69ecab1fe9ec5d2d3984318a0bb7e65c091c416fdf7cc647b1d3db7d46a8fb1e013a33a8f23ac33987832dd47178a51b2e0eec25fdade8e4794a3ee602f3a41f157191b3859a0b5f91f9dbf921cba24eef05f02af93c999a3d7e457d4a94a393daa7ee8dcdb9ee235cd52bbfb650aa70240cee561b03784a493a7109a40e337d51e55ae3de94bea91662a9dc7f3bf8e4d32f3d70587403d8280e55dc12f0afe0e6dafe9c19f2c0abebb0381546a5debccf264e53483931fb53449130f47d1407cd0c372637c0a644bdb8b25561bb28fa030f303a7d9bbbc6f0d2d80986a300cacba5276340a6f95f5a58dcb62d64218ba208aae2a01c8f4dfb42a5f93d44e870b78edd5bcf239888d6692eed1a118b799705f7b93c34b05ce3ae60f439c1742e22d456d35909b541df1efadd8e19eed68f1295e0e404fce2abb84fdb20c7fb59a1796b7db57ede655778fa81bdf6bddc000f06181a177c30403b7a3a75b0dd16518d63cd9e9168c7b891692816985882e40f1d0bce30a24709a075b64799d5b3e42f16d794f34eba8158f842a4b04e46cc1464e3d7f0282d9a85913fa90267ee8565d27fd10e28a2a1495b6ac494faeb9b0ba366816bdf54e694c63b753d9b66ede27540e3082b8a7172755882f56769130f0af577b8c3ede6e8eecc9425911787b62c5468a9ffea09e7257883b554d17704a23942749653ad9a87c8728fbfa56864e69bb8ae9607228bffd91643a828b31357a199ce3f2e4dc3fd57cb963d783242f9369e886376f57b9497504ebb04311eeec6e6c20c50d981fa9719fc9ed87480ddf9799ad62e7b1996293e2d57b0d92d05db41076cd3d90c81f793e57eda1191e5bdd40fc9d4831fccb2d33e8a569e009580985e29d40823ea35fbccb800afebdb2083a963ad2e72bfb0907cbb026e1224c0ce5f59107ac18b03307bf581f6ebcf3ce7800eb87b02a4d25c3c0780690a714e8aef53ad3e7ee56dc8760a1c6ac40b67dc97386716d8b7c8411f8e0fc10885b65982e9844784a2de0689a608bd2b3acb490d4a1a2a8902ffa562e20fea0b3ec2e1baf84eaa8955f757f304d164da3c8c1583567ee07a64bfa1e740f09427fa58b4185e625c869f6220eabe5b2f89ed573e76807d6834a6d93cf392b87e2911224dbd6ba3729d896600bf314e476e43c599de5b638ada7d19530fe557dd1401d2b9f08ce9d2c5fa7935c57f42fc83467dae1943d6c27882686e3f02cdaf1c23df9d61bd4f2b709fa7d2f488f999653318d8cfda4b40f774190c6ae7c68d04892a4456ad9ce39c61f7ccd63bae1f8735f269382ddab8f29590a03db7cc081f900b5fcfbc91245d4cf6e5d757439efc2b1606fbd5d2f98ee420a6b195a7322557b58063144c3b79efa8ca875cb186d97494f99c68ab9216d3a2e281d7d40f158b4dcce0f341a6ec3b566b77c8475f582af06b323c9dcc48fb8f6e4c24d8bd2b6ded7c6bafe9cb0d8dcca57887b1f03e43d8d38b7907ff65a37b78e7cf0648123971a67c2d9dd6a0138b2002ace0cc4839566f50d6095a9aa06a96083951752e8f860211deb7f9eab0bb30f442879145f272c019d2abc5206aae3924a75010275119d2ab7cef59e1636fad4e8bcad6589ba476e38ba5fc71e968541b1820b12ad654f7ebd9a2522d51d47dc5563ea7766799dd694bdba53b7bc2d2ee15f66e0e3fc5a203198545ca949fdff3dae7e730716d079ad70b35a4a3f49c32526592177f84da459ef90637dd637adbeac1f397ac1a8fa7da7d92e2057284b7afa34a03ec549f7e4965203ef4c0f6af45483907c7953bcf8c7c889f8540b93c48a746229d7a407e0b5589707b9bd26b0d13a7dbad9932aeeb8b7e532566cd92a882042b82821e5a9f5116c612818f9b586b639eba41e67d6c42528bca99a7189bbf2428231bf5a4a55bb5412bce1e75a98aae332ed95fcc476a9e18c5b2a90eac937a016a2a3d1ddc5fe9386871595a4c43ae2a5eea44746228ffb79ac2d9e4bb1d9e19cdf2ad6516c16897028def75fe6a78ff95e7062bfed70f2398582e004f7bcc030954895873d6342cbd903dbbe4b6f2f96b7d64579c9a8fca8996188fa3d9861501fe6f36e13a3c12589da13ee190064cdb3abc7143800a2098120cd0636aba23f08f43ddd021e098bfc75ed28215ba4459610ce3e6ee8194d76d83dc50cff7212d421e7d53f7a8dd7c2e1e37ffe54918f94f9aeba116460e76ac28e44f1c3b266386ba3d0083f22cf5e82672ff1bae279291e5eca52f58b928c5e2543af0e20fd256fbfe682dac42b71e11f695165cb77b9c7dab72d4021899aff8c9359ddc2d3310c8c8bcc83fd122e51bd5dea954f2970c5678b2b7e162a9d491a33e1a1b18a7c052d67d102b81301b710279d85f6ae7fb27eca6387bf45bfa08405fb9bb0449911ac0eb0b98c492b3675f3c8b17d8d4071115048d93ea92df10dd66c26523424c8b0d693ff682420404b198302eee8075c3ea7718467b0ea47e54768edc1e5bd11b2690c72032d1762d2bd386a76e7755b63a2d91f3c20a915289a334d82bed12ce87366262c75696163c36ff5b6533912e2416c90b6e307fa71935a5352a78296eb10928a01c2c4a651a4eb3d84093e27e6350fad6ead63ca737eff9ba04a9b5d17b1c78e1bed6711d5479d8d7590f3f050b7bdb7b15df86cba06af51c2a3341060130da96b435ca1e503c509f8e6efb90fd78840546f24a21472c757d0683c8408285b2c5268c325330e3e318ad6f968d606f1f6ba481531195bf905823fdec89b3dec12f3055bfb8f4e93c5756c65f5ba4fbb00e089e1780abcdd4260ad3487daa873a8913b4c45e3b7f68ceb9212a3672bf84f085d7efa6f261d7e42399de655fa523d772ab1c1977833438eff839b68adeb8fe5aa8e59d12c1d70c2ab4d524888f9758141a552238aa961345d98586a78b2ac3038c8db17f6df1d82d04959c242a3e53a402fd87da822dd33050d9629f63bc27f00a9d46cbadee3508dc65c0df4d1bc81f673be17aac5ae7f3f69fcf7a6b1cbbd3258a666c9886f229bc5e356436ac2d1f53b33a5edd19e1a77a12b2149b6a5adfc40ce4f4963a8f1a06ca726e4ac8dcb3631b1423719308baef7996d574b9bb675f8ffe769dba96276d992c218ea1f31ba038b6452bed51cdb97a78433976a53e90ae82249499dc21c8b280bd34f8521011e2f3bd49c88c90af6ec95104bf11178901157fdbc2f205c3f2f523575b57798ecb059e9c04d14156d2cb37bc8e01ad4d01ac1d8a3b2c1a85415be0a1c245d9caa40076146e69123ea7d79e8f66266677141acbb866f813be14adfd28d46f6c387185fe1ca5e7682b6e6349157ec34ac1d1c98c423c220dc47665532a35946c67453844da63cf704e5292f04b810d0e7fa57c3150759b17598d227e1b98cb744472c8235c725f62484f50516e8e3cabaf70e078e0e3a7116e076bb902491083e6e377440b879c0bcae990baaa3a8e9b75459ab5ce62d60fbe4f0a324270050f7aa5f71e5ba518faf8e7bece0338f44047bac43a5a464d1a5168f794f1a130f23dee9035b4aba6d81761a010944d8bc96679a812867312129fc418698487ba09bfe680bb002453bbef00fb05cb50134e0db7918dca367100aeea96655720ebaba10a03ab329a23cf9227874f3f68f4ff6aba63a1e31bf1048679a2ee2d3456d9682bd89129046a3bccda5e9b7e043c4b6e83a6dcf72fe40457fe3fef8d0acee37066ff15eeb9ca6f72fa59dcedd28085f02783709c00b619ac5cd22b0d57011c94a0878f8bb99e32889ee72cae1c797d2d4a885b32d1ce09b4c591d73bbbb7d4eaf5f2de94eaaa39d8ae46abd25c998d826cd3c2b24be42ae4a7c5ca9328b5da8d991067b46dd82b083afe37b7224d60d9c36c74db94ac15662c27062eb5ba2cb387020d7cd53d674b22fc4c48f1577cb2449b81886ba12eab4237ebdce8ccd34826707beddc50db68501788cedb56a75808aa6c7d4aa406a8374eb417615dc633ffc336066aa7437b69436610335e33beefabb58b09e3235ebfbc7043637c7e9c473e3297abfb2ab388fc82c067d9291e973fa7b641530370b330aa26dfecf195301ece3360465b33ad7c72e2906eae61a109da3b01a12b370cadd8bc59bca75c47f9dfb74bc9e505f82a5a421bc28a3878487f40eb18237cb2c22e928498f304584a9aaa187372271de84eeff56f4941103ca0aaaef40b3b0a7a5967383152a13470687b76ed9bf10b3c7bf3070588acc254d0c076b61d7c5d09d43f049275e66ed27775e66a695dabc5ec9a81efa1cfca62413e7c2715246a49e59a1975a1e8c5f581c16953b3238e7100df6d281fbdd12471022d211e9aa0a04c8c5e70bd1f826f3e21f03aec6849a2bd4278dd034fcab56000f1522b39c1bb9086f00b8c3ca230210495fa2eec66b9e4f1605d6dc58ca2464454e404b80261081908b90d9356638dd7b9240375955d9408ad152408cb84c9b3a4f803d4112f330f636ba8078fe23dbdf44f578540434812e91782f9c476a732cc501d8e7f8a273d121de7c3aa317a277c651fd752cf71d02e2fca19761aa849e2ee2d0aac369adbafb47aa9c60d463225df053213140ae24ab4616518ba9cbabcbe2826a8c47881114d6fc61bd001c4f9eae70bbbabcd40b7f46bf03e9247316e981e48219d24777d9e0dd124bf616f6934f8f03ec89abc05987b272f245882d0eb2da402dac09a7b9efa1ce83b590025507e87eb8a4530c77b478ce8b57332df3621a3363ff40d176d60230a289da7fc40d10b6f39be7dab90796d50bf1cd522021b7c8dad848ad2d32698805a7aaa0b7da3a07ce883c27a90f052b3f5c923c0b21051870d5512241f7bf97c74b83b88c648b7a93c2e18c0553ab6054b7d6652060af7808738a79ce157b6cf189d872c3985c4c25402b164ac64cfcec5e751adb3272894740a4a28c7f5c50e676720a3bb3330c596d1b51b40973744fab0f4066a2ef475f092e495adc50e181438b163624430e3289fa7e53bd79e8aedfd1a52141a59a4c51992a031afad71f74321b61e02102daf44c12787fb487e28f020045c2554b70eafaef11bd3b4473da7fa1171d61a148611b91e857db371a6021e02e5082465d45da6c5799563395c7cccc8dc061dc80d09f2a3834dc88ef7e61b45452aa2073ef7f495b56e50e1e7313a17ed454432a9ce4cae176b67b553badf02372fccd7a69af10c16f409533a7e7a7538d1e0604e93e978dbfbebecdfa78d812e11b390a2a02210f434d15b4a58cf4ef045d66d8c411af62d8578f68208aa70b827f8a69a1b792983f900cc2533a01089fd28ea6b83679cbff1fa567930b411b129c86a45349ea27d2850596c0bd0b9153caa96182ae15c2ec6985782b68cc0f12f2d147d2245c42323ec127108569230a4a6a796cc78f730d86bae5ba49997f111467f3da1fc7da088cf349a40e0d69d5d65df21492d82259acd9ca6f97079f7094cf842aa652186162248fc9f05e452c75f78f79f34b0ceda9d1b5bffbae06b08ace101deb3f05e5fbe700a98c259e1527e01be26cbb7aa3f2e7302489f67210225b03b9a82a5ff486478d3e248d9b0ef0c12e8c2a4a94df156b02e7175dcba0fdd5a9c960a8e915edb6bdd2596529c88f4a10ec7be746be2c056b7d9030aa31050256ea76a82ab8c18d53ba8848d8dbdf070cbab935ae371fc200aa8f858762f072ea8b58db1ee4ba00bf879153fdc81ab8fc745472a1ce17139221ab8ba3f24fae60f84f8815319eaeee9edc8dd43285aeaaca0dfa81d95923810e891d50e1f05570e981b9dbe1758bce636d067ed5d29c5c56c133e83e1545014bea6c55612c41bc021267dcc97203ebbae4be62e5f4f05c579ac4e0b550520668fb26a3e21bca88d9323106c35aabedffb98e83679d39c15bc618ca10e2b7c593b2b6e940bb54d775929f73d8e1d674564291b82a8292adef3495560185db0fb6ce8d479203547fe0a5d369e6253126731a156f003a388674cf6f1f1ffd04416edd62df101bf6fd3ac11e48a7bdee8c49d2775abcd563f4259e2bf92002ee822b6436a2e2c95cfbeb3a90669e505da14754dcff65e62d41f84657e33f15e8c3bf939faec2170671f1e6291e9c234edca69495daea06624af464327803b6369a6c536dd9e1faa338562348d3b8183999edfef72f3cc469dc65912ec86b31587856cddd7a60703129f723525803622560a1ca5491c1cab508b55b80caa329d932834aed32324943bd0827b144b4480c7403b30850fae68fd05be4bcfb4b2ce08d74afd147b2b5eb2b56bcd1fa9ad1657d3a6f3f5d0ad5a2a88d9ea287fde5b14f393355c7c218d23792a7020955fca0672dfd551994178df882d67d9b8833cc2763f390c572b2c2bcbcf6f73a56e126464cf60fe45c6b9b04474f05aee1b9e1573e12bad042deb273bacc444a207e11e8e4c047699014d99cc8c45be5db22815e9982bfe391d1968cfc83a1156a5f9211ba8e93d584d0e4a1de08fa3680546163b245bc8d20fb9ac25bcee5fc0f1b48589051ecb1856fd73f9979b1fbabf4dfb4858952d8d11114326a0fdf9729f2b4a305f5c5da2fd96789a25334ce9b29267314198d95e1569ece283d7b30452e9548c23b31c04019fbd1a7ec52097248c683ddaa69f800145cc51b9a45465d0d480a6914e57fc276596e67fa7a986507ffa4275e6c4d50970302cd091a4a8be2125afdb79384433025caefacfa08235f3f8863cd727d920d0aabc78030e70badd682205e4460eb96e24a8773c81fccd810548c7e2ea99292c5096aee3e1c3c96f0105b5e953e61fd2a139c311e53958af1e82411de02b18196bbb223f4f1f3c526ed3bda944ce929e99b8bddb999bd4d4a055a647b35a124bfe368aff68530d057103fc14b6343c9f6574971ebe03ba3a60c6cbc115c41095420da866b399218277a6a497dffd4f565ae24a2e961dada56b3fa30e4de600d30b82e9bce89cf1b8a67b9f9df4e19e98a203ad8ee0603c9b4d04ef96fea02ec5a3e0869195ac1fecf1aa7456f12a00fe30de4ca88255a5798292f8fd1ed12bd16d8770a1e938acd64621d25b319a09778ea95d5d62fa1087366893b689bc0a48b705c9c8e3c656a8cbad9b13ee4c32906f11e2e985127f5e6ee9298f8a5e1559fa1080bb2251b3433df3b369ff51198d29becad63a2662348404cae1dcf325e207fdeada5171927e9fb74abbb31fbf6f71b6ef4db87176bcf88895653a8528dbde3a3b7081f6e02199d067917d6d80c5cdfece94d3f8c8b39aaaa23e6c371173c2843e76b27011348dc6d9b1387a5ed4ddd05234fd7634c4d29c7a1aaf0c0892efbb8d90bdcb2a75ddd1610c1fb997136b361a72fa06e7dd10e0ff9deea60cf890ef3654011ec6bc245ea07272f1c76cf7da601bd9468ae7221b4c880ad5292921ae1e99b829ea974691ecab3aefc1320aebd275709b159a724c601749c52e1ccf6cfda239095cad645145801c9b4f9c2f9bf3dc5098602ba08f4c17add030395a4d37d68664d28214cb83addb4a361a0979108a8c12cf4f1024985554fb2dc77d514c86fdbdcfc0e136d2a050cd8ae5b7cb34e25f64080b100c7e75fa3c052900b6cf63b8be429867a37d8e13db462bd9a96a713bec5e8ad3c35722375b0db5b4daf2f9fb4f63cd4e8684b42582dc4df2b398e3ec51fc454c7647e4cdfe0061699e4d745a79b019b3b890652b297394d4783f44993c466ab44102f450450758052669d8a9b1b0e6e8185906a9168a75babaa95e15deaebf931c5361f21c180370c3effb062108883082b200a9eea74b5208949535ea97f57ed7fd69ab26167ab4df02686727474d80602348bfe16485e5d4999feb423380a52af2f101ea01e756031c45652577ab522390a7e364d6bf0868b58d4b5ab8b4507daa22b7c0068b7ca0af27f9610f9be95b1e8cfaf17225d5cdf6f7d4c5eead3942e9bf83ee", + "public_inputs_hex": "0x15c9b404c344691839abf638a132bd083b09e98c2fadb268923013737d217ad40488f1f8d24b90d2ff437809f7199eccdee54180e24fbab6e8d07e4dae7c77480000000000000000000000000000000097e089d738cbdfe4aabdacf499858d5d00000000000000000000000000000000bea27e9a0462c1bbcfe5d7d11e69ab7c000000000000000000000000000000005fe27b65c562e50b0f036ea754579e4b000000000000000000000000000000004d71b2b07473783912b25cf8dd9b9c9f0b7850853da4f6de0abb227f35ba4fc88c9701f647ee43a716dcd01fdd540f0a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000210ade7d9aa4cfe74bb36dd9a0e12531b1126fa2403608e2b7d175414fcb9e2f31dd5a66f5ca90ea104b52c48f4a3e630f174014acc8270d5f4dc613a06eb6a3619654bcbcf5e533790d9be255bc5ca90c779d6375fc717d27349065da5753954032f128b9e186d3fd9cd5460214fd5cc67db90c397056d90b3fa1e1e93174c99000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } } } diff --git a/circuits/benchmarks/results_insecure_minimum/report.md b/circuits/benchmarks/results_insecure_minimum/report.md index 8f6fccadf..4e2ae6fdf 100644 --- a/circuits/benchmarks/results_insecure_minimum/report.md +++ b/circuits/benchmarks/results_insecure_minimum/report.md @@ -1,9 +1,9 @@ # Interfold ZK Circuit Benchmarks -**Generated:** 2026-06-13 10:29:25 UTC +**Generated:** 2026-07-18 21:04:24 UTC -**Git Branch:** `lock/fhers` -**Git Commit:** `c2dfd37d36d9e85b45b03db03bc7267964a4a6da` +**Git Branch:** `circuits-audits` +**Git Commit:** `135c1344a6c160a49d0086c9cf9574e66e6df8aa` **Committee Size:** `H=2`, `N=3`, `T=1` @@ -45,7 +45,9 @@ Settings for this benchmark run (integration test + Nargo circuit benches on the ## Audit status -On-chain verify gas: **complete** (CRISP Π_user + Interfold Π_DKG / Π_dec replay). +> **Incomplete on-chain verify gas:** 1 of 3 artifact verify-gas values are **N/A**. Re-run +> `./run_benchmarks.sh` and ensure `extract_crisp_verify_gas.sh` completes (CRISP test + +> `test_trbfv_actor` + EVM replay). Calldata gas alone is not sufficient for audit sign-off. --- @@ -72,39 +74,39 @@ Single-circuit `bb prove` on the benchmark oracle witness (not the integration a | Circuit | Constraints | Prove (s) | Verify (ms) | Proof (KB) | | -------------------- | ----------- | --------- | ----------- | ---------- | -| C0 | 6847 | 0.12 | 24.41 | 15.88 | -| C1 | 53485 | 0.32 | 24.38 | 15.88 | -| C2a | 41244 | 0.30 | 24.71 | 15.88 | -| C2b | 79591 | 0.47 | 25.55 | 15.88 | -| C3a | 120114 | 0.55 | 24.84 | 15.88 | -| C3b | 120114 | 0.55 | 24.84 | 15.88 | -| C4a | 62750 | 0.32 | 24.77 | 15.88 | -| C4b | 62750 | 0.32 | 24.77 | 15.88 | -| C5 | 21501 | 0.21 | 24.81 | 15.88 | -| user_data_encryption | 53732 | 0.33 | 24.44 | 15.88 | -| C6 | 86927 | 0.51 | 24.10 | 15.88 | -| C7 | 90841 | 0.46 | 24.55 | 15.88 | +| C0 | 6847 | 0.12 | 24.33 | 15.88 | +| C1 | 53485 | 0.32 | 24.60 | 15.88 | +| C2a | 41244 | 0.30 | 24.55 | 15.88 | +| C2b | 79591 | 0.51 | 25.52 | 15.88 | +| C3a | 120114 | 0.57 | 25.36 | 15.88 | +| C3b | 120114 | 0.57 | 25.36 | 15.88 | +| C4a | 62750 | 0.34 | 24.95 | 15.88 | +| C4b | 62750 | 0.34 | 24.95 | 15.88 | +| C5 | 21501 | 0.21 | 24.75 | 15.88 | +| user_data_encryption | 53732 | 0.33 | 25.75 | 15.88 | +| C6 | 86929 | 0.52 | 24.61 | 15.88 | +| C7 | 90889 | 0.47 | 25.52 | 15.88 | ### Artifacts | Artifact | Proof size | Public input size | Verify gas | Calldata gas | Total gas | | -------- | ---------- | ----------------- | ---------- | ------------ | --------- | -| Π_DKG | 10.69 KB | 0.38 KB | 3119529 | 175044 | 3294573 | -| Π_user | 15.88 KB | 0.12 KB | 2973001 | 170404 | 3143405 | -| Π_dec | 10.69 KB | 3.47 KB | 3641094 | 187368 | 3828462 | +| Π_DKG | 10.69 KB | 0.38 KB | 3119505 | 175020 | 3294525 | +| Π_user | 15.88 KB | 0.12 KB | N/A | 170260 | N/A | +| Π_dec | 10.69 KB | 3.53 KB | 3672202 | 187900 | 3860102 | ### Role / Phase / Activity | Role | Phase | Activity | Metric | Duration | Proof size | Bandwidth | | --------------- | ----- | ----------------------------------------- | -------------- | -------- | ---------- | --------- | -| Each ciphernode | P1 | one-time DKG participation (test harness) | wall_clock | 132.70 s | 127.00 KB | 128.06 KB | -| Aggregator | P2 | C5 + Π_DKG fold (aggregator span) | wall_clock | 120.64 s | 10.69 KB | 11.06 KB | -| User | P3 | per user input | isolated_nargo | 0.64 s | 15.88 KB | 16.00 KB | -| Each ciphernode | P4 | per computation output (C6) | isolated_nargo | 0.51 s | 15.88 KB | 16.00 KB | -| Aggregator | P4 | C7 + Π_dec fold (full publish→aggregate) | wall_clock | 52.00 s | 10.69 KB | 14.16 KB | -| Aggregator | P4 | C7 + fold only (pending→plaintext span) | wall_clock | 48.43 s | 10.69 KB | 14.16 KB | - -_P2 **tracked_job_wall** sum (ZkDkgAggregation + ZkPkAggregation, parallelizable): **5.76 s** — not +| Each ciphernode | P1 | one-time DKG participation (test harness) | wall_clock | 137.63 s | 127.00 KB | 128.06 KB | +| Aggregator | P2 | C5 + Π_DKG fold (aggregator span) | wall_clock | 125.47 s | 10.69 KB | 11.06 KB | +| User | P3 | per user input | isolated_nargo | 0.65 s | 15.88 KB | 16.00 KB | +| Each ciphernode | P4 | per computation output (C6) | isolated_nargo | 0.52 s | 15.88 KB | 16.06 KB | +| Aggregator | P4 | C7 + Π_dec fold (full publish→aggregate) | wall_clock | 55.07 s | 10.69 KB | 14.22 KB | +| Aggregator | P4 | C7 + fold only (pending→plaintext span) | wall_clock | 51.29 s | 10.69 KB | 14.22 KB | + +_P2 **tracked_job_wall** sum (ZkDkgAggregation + ZkPkAggregation, parallelizable): **6.03 s** — not comparable to P2 wall_clock row above._ ## Integration test (`test_trbfv_actor`) @@ -114,80 +116,80 @@ comparable to P2 wall_clock row above._ | Phase | Metric | Duration (s) | | ------------------------------------------------------------------ | ------------ | ------------ | | Starting trbfv actor test | `wall_clock` | 0.00 | -| Setup completed | `wall_clock` | 0.95 | +| Setup completed | `wall_clock` | 1.02 | | Committee Setup Completed | `wall_clock` | 7.02 | | Committee Finalization Complete | `wall_clock` | 0.00 | -| Aggregator P2: PkAggregation pending -> PublicKeyAggregated (wall) | `wall_clock` | 120.64 | -| ThresholdShares -> PublicKeyAggregated | `wall_clock` | 132.70 | -| E3Request -> PublicKeyAggregated | `wall_clock` | 133.20 | +| Aggregator P2: PkAggregation pending -> PublicKeyAggregated (wall) | `wall_clock` | 125.47 | +| ThresholdShares -> PublicKeyAggregated | `wall_clock` | 137.63 | +| E3Request -> PublicKeyAggregated | `wall_clock` | 138.13 | | Application CT Gen | `wall_clock` | 0.01 | | Running FHE Application | `wall_clock` | 0.00 | -| Aggregator P4: Aggregation pending -> PlaintextAggregated (wall) | `wall_clock` | 48.43 | -| Ciphertext published -> PlaintextAggregated | `wall_clock` | 52.00 | -| Entire Test | `wall_clock` | 193.18 | +| Aggregator P4: Aggregation pending -> PlaintextAggregated (wall) | `wall_clock` | 51.29 | +| Ciphertext published -> PlaintextAggregated | `wall_clock` | 55.07 | +| Entire Test | `wall_clock` | 201.25 | ### Multithread job timings (`tracked_job_wall`) | Name | Avg (s) | Runs | Total (s) | | ----------------------------- | ------- | ---- | --------- | | CalculateDecryptionKey | 0.00 | 3 | 0.01 | -| CalculateDecryptionShare | 0.02 | 3 | 0.06 | +| CalculateDecryptionShare | 0.02 | 3 | 0.07 | | CalculateThresholdDecryption | 0.02 | 1 | 0.02 | | GenEsiSss | 0.01 | 3 | 0.02 | | GenPkShareAndSkSss | 0.01 | 3 | 0.03 | -| NodeDkgFold/c2ab_fold | 18.13 | 3 | 54.39 | -| NodeDkgFold/c3a_fold | 71.19 | 3 | 213.56 | -| NodeDkgFold/c3ab_fold | 7.88 | 3 | 23.63 | -| NodeDkgFold/c3b_fold | 70.95 | 3 | 212.86 | -| NodeDkgFold/c4ab_fold | 7.87 | 3 | 23.62 | -| NodeDkgFold/node_fold | 18.29 | 3 | 54.86 | -| ZkDecryptedSharesAggregation | 1.53 | 1 | 1.53 | -| ZkDecryptionAggregation | 46.89 | 1 | 46.89 | -| ZkDkgAggregation | 5.35 | 1 | 5.35 | -| ZkDkgShareDecryption | 1.00 | 6 | 6.01 | -| ZkNodeDkgFold | 105.40 | 3 | 316.20 | -| ZkNodesFoldStep | 5.04 | 2 | 10.08 | -| ZkPkAggregation | 0.41 | 1 | 0.41 | -| ZkPkBfv | 0.22 | 3 | 0.65 | -| ZkPkGeneration | 2.25 | 3 | 6.74 | -| ZkShareComputation | 2.37 | 6 | 14.21 | -| ZkShareEncryption | 4.00 | 24 | 96.07 | -| ZkThresholdShareDecryption | 3.25 | 3 | 9.74 | +| NodeDkgFold/c2ab_fold | 18.82 | 3 | 56.46 | +| NodeDkgFold/c3a_fold | 73.49 | 3 | 220.47 | +| NodeDkgFold/c3ab_fold | 7.85 | 3 | 23.56 | +| NodeDkgFold/c3b_fold | 73.17 | 3 | 219.52 | +| NodeDkgFold/c4ab_fold | 8.28 | 3 | 24.84 | +| NodeDkgFold/node_fold | 18.94 | 3 | 56.82 | +| ZkDecryptedSharesAggregation | 1.59 | 1 | 1.59 | +| ZkDecryptionAggregation | 49.68 | 1 | 49.68 | +| ZkDkgAggregation | 5.74 | 1 | 5.74 | +| ZkDkgShareDecryption | 0.95 | 6 | 5.69 | +| ZkNodeDkgFold | 108.81 | 3 | 326.44 | +| ZkNodesFoldStep | 5.31 | 2 | 10.63 | +| ZkPkAggregation | 0.30 | 1 | 0.30 | +| ZkPkBfv | 0.23 | 3 | 0.69 | +| ZkPkGeneration | 3.61 | 3 | 10.82 | +| ZkShareComputation | 2.62 | 6 | 15.70 | +| ZkShareEncryption | 3.67 | 24 | 88.14 | +| ZkThresholdShareDecryption | 3.49 | 3 | 10.48 | | ZkVerifyShareDecryptionProofs | 0.08 | 3 | 0.25 | -| ZkVerifyShareProofs | 0.25 | 5 | 1.27 | +| ZkVerifyShareProofs | 0.24 | 5 | 1.22 | -Sum of tracked job wall time: **1098.46 s** — **not** end-to-end latency (jobs run in parallel up to +Sum of tracked job wall time: **1129.20 s** — **not** end-to-end latency (jobs run in parallel up to `BENCHMARK_MULTITHREAD_JOBS`). ### NodeDkgFold sub-steps (`tracked_job_wall`, per fold prove) | Step | Avg (s) | Runs | Total (s) | | --------- | ------- | ---- | --------- | -| c2ab_fold | 18.13 | 3 | 54.39 | -| c3a_fold | 71.19 | 3 | 213.56 | -| c3ab_fold | 7.88 | 3 | 23.63 | -| c3b_fold | 70.95 | 3 | 212.86 | -| c4ab_fold | 7.87 | 3 | 23.62 | -| node_fold | 18.29 | 3 | 54.86 | +| c2ab_fold | 18.82 | 3 | 56.46 | +| c3a_fold | 73.49 | 3 | 220.47 | +| c3ab_fold | 7.85 | 3 | 23.56 | +| c3b_fold | 73.17 | 3 | 219.52 | +| c4ab_fold | 8.28 | 3 | 24.84 | +| node_fold | 18.94 | 3 | 56.82 | ### Aggregation jobs (`tracked_job_wall`) | Operation | Avg (s) | Runs | Total (s) | | ---------------------------- | ------- | ---- | --------- | -| ZkDecryptedSharesAggregation | 1.53 | 1 | 1.53 | -| ZkDecryptionAggregation | 46.89 | 1 | 46.89 | -| ZkDkgAggregation | 5.35 | 1 | 5.35 | -| ZkNodeDkgFold | 105.40 | 3 | 316.20 | -| ZkPkAggregation | 0.41 | 1 | 0.41 | +| ZkDecryptedSharesAggregation | 1.59 | 1 | 1.59 | +| ZkDecryptionAggregation | 49.68 | 1 | 49.68 | +| ZkDkgAggregation | 5.74 | 1 | 5.74 | +| ZkNodeDkgFold | 108.81 | 3 | 326.44 | +| ZkPkAggregation | 0.30 | 1 | 0.30 | -Sum of aggregation job tracked time: **370.38 s** (parallel CPU work; not P1/P2 wall clock). +Sum of aggregation job tracked time: **383.75 s** (parallel CPU work; not P1/P2 wall clock). ### Folded on-chain artifacts (exported for Π_DKG / Π_dec gas) | Artifact | Proof (bytes) | Public inputs (bytes) | | --------------------- | ------------- | --------------------- | | dkg_aggregator | 10944 | 384 | -| decryption_aggregator | 10944 | 3552 | +| decryption_aggregator | 10944 | 3616 | ## Raw circuit benchmark JSON (Nargo) diff --git a/circuits/bin/recursive_aggregation/decryption_aggregator/src/main.nr b/circuits/bin/recursive_aggregation/decryption_aggregator/src/main.nr index fce82e7d1..0bdede323 100644 --- a/circuits/bin/recursive_aggregation/decryption_aggregator/src/main.nr +++ b/circuits/bin/recursive_aggregation/decryption_aggregator/src/main.nr @@ -42,6 +42,28 @@ pub global C7_MESSAGE_OFFSET: u32 = 2 * (T + 1); pub global C7_PUBLIC_LEN: u32 = (2 * (T + 1)) + MAX_MSG_NON_ZERO_COEFFS; +/// Validates a single circuit-side `party_id`: must be a 1-indexed Shamir x-coordinate +/// in `[1, N_PARTIES]`. `x=0` is reserved for the secret itself (see DKG +/// `share_computation.nr`'s `y[...][party_idx + 1]`) and must never be accepted as a +/// participating share. Returns the `u32` cast for reuse by the caller (e.g. the +/// strictly-increasing check below), avoiding a second `Field -> u32` cast. +fn assert_valid_party_id(id: Field) -> u32 { + let id_u32 = id as u32; + assert(id_u32 >= 1); + assert(id_u32 <= N_PARTIES); + id_u32 +} + +/// Asserts `curr > prev`. Used to force the `T + 1` reconstructing `party_ids` to be +/// strictly increasing, which (a) implies distinctness -- no party's share can occupy +/// two reconstruction slots, which would let a single real share masquerade as T+1 +/// independent contributions and silently defeat the T+1 honest-party threshold -- and +/// (b) matches the ordering `decrypted_shares_aggregation.nr`'s own Lagrange +/// sign-computation already assumes but never enforced. +fn assert_strictly_increasing(prev: u32, curr: u32) { + assert(curr > prev); +} + fn main( c6_fold_vk: UltraHonkVerificationKey, c6_fold_proof: UltraHonkProof, @@ -86,16 +108,21 @@ fn main( let mut party_ids: [Field; T + 1] = [0; T + 1]; let mut expected_sk: [Field; T + 1] = [0; T + 1]; let mut expected_esm: [Field; T + 1] = [0; T + 1]; + let mut prev_party_id: u32 = 0; for i in 0..(T + 1) { party_ids[i] = c7_public[C7_PARTY_ID_OFFSET + i]; expected_sk[i] = c6_fold_public[C6_FOLD_PREFIX_LEN + C6_FOLD_SK_COL_OFFSET + i]; expected_esm[i] = c6_fold_public[C6_FOLD_PREFIX_LEN + C6_FOLD_ESM_COL_OFFSET + i]; - // Range-check each participating `party_ids[i]` against the full committee size - // `N_PARTIES`, so `committee_members[party_ids[i]]` is a well-defined committee slot. - // Structural pre-condition for future per-party signer/identity constraints. - let id = party_ids[i] as u32; - assert(id < N_PARTIES); + // `committee_members` and `topNodes` are 0-indexed; a future per-party + // signer/identity check must index them with `committee_members[party_ids[i] - 1]`, + // not `party_ids[i]` (which is a 1-indexed Shamir x-coordinate -- see + // `assert_valid_party_id`). + let id_u32 = assert_valid_party_id(party_ids[i]); + if i > 0 { + assert_strictly_increasing(prev_party_id, id_u32); + } + prev_party_id = id_u32; } let mut message: [Field; MAX_MSG_NON_ZERO_COEFFS] = [0; MAX_MSG_NON_ZERO_COEFFS]; @@ -105,3 +132,44 @@ fn main( (key_hash, party_ids, expected_sk, expected_esm, message) } + +// ------------------------------ TESTS ------------------------------ + +#[test] +fn test_party_id_min_valid() { + let _ = assert_valid_party_id(1); +} + +#[test] +fn test_party_id_max_valid() { + let _ = assert_valid_party_id(N_PARTIES as Field); +} + +#[test(should_fail)] +fn test_party_id_zero_rejected() { + // x=0 is the secret's own evaluation point, never a valid share -- this is the + // exact value the old `id < N_PARTIES` bound wrongly admitted. + let _ = assert_valid_party_id(0); +} + +#[test(should_fail)] +fn test_party_id_above_n_parties_rejected() { + let _ = assert_valid_party_id((N_PARTIES + 1) as Field); +} + +#[test] +fn test_strictly_increasing_accepts_ascending_pair() { + assert_strictly_increasing(1, 2); +} + +#[test(should_fail)] +fn test_strictly_increasing_rejects_duplicate() { + // The exact attack this closes: the same party's share occupying two + // reconstruction slots, letting one real share masquerade as two. + assert_strictly_increasing(3, 3); +} + +#[test(should_fail)] +fn test_strictly_increasing_rejects_descending_pair() { + assert_strictly_increasing(5, 2); +} diff --git a/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr b/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr index 66e9fe7c6..df34aabb1 100644 --- a/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr +++ b/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr @@ -159,14 +159,18 @@ impl( qis: [Field; L], @@ -297,3 +301,14 @@ pub fn verify_crt_reconstruction( } } } + +#[test] +fn test_decoded_zero_coefficient_must_match() { + assert_decoded_coefficient(0, 0); +} + +#[test(should_fail)] +fn test_nonzero_decoded_coefficient_cannot_be_claimed_as_zero() { + // Regression test for IF-002: the old conditional check skipped this case. + assert_decoded_coefficient(1, 0); +} diff --git a/circuits/lib/src/math/modulo/U64.nr b/circuits/lib/src/math/modulo/U64.nr index 59c707f63..10bee2c4e 100644 --- a/circuits/lib/src/math/modulo/U64.nr +++ b/circuits/lib/src/math/modulo/U64.nr @@ -100,9 +100,14 @@ impl ModU64 { /// (a / b) mod m: multiplies a by b^(-1) mod m. pub fn div_mod(self, a: Field, b: Field) -> Field { - // Safety: __inv_mod_u64 uses Fermat's Little Theorem; verified via mul_mod below. + // Safety: __inv_mod_u64 uses Fermat's Little Theorem; verified below by result*b == a mod m. let b_inv = unsafe { __inv_mod_u64(b, self.m) }; - self.mul_mod(a, b_inv as Field) + let result = self.mul_mod(a, b_inv as Field); + assert( + self.mul_mod(result, b) == self.reduce_mod(a), + "Division verification failed: result * b != a (mod m)", + ); + result } /// (-val) mod m. @@ -351,3 +356,14 @@ fn test_u64_division_multiplication_inverse() { let quotient = m.div_mod(a, b); assert(m.mul_mod(quotient, b) == m.reduce_mod(a)); } + +#[test(should_fail_with = "Division verification failed: result * b != a (mod m)")] +fn test_u64_div_mod_rejects_non_invertible_divisor() { + // m = 100 is composite and b = 10 shares a factor with it, so b has no true + // modular inverse. The Fermat's-Little-Theorem-based unconstrained hint + // (`__inv_mod_u64`, which assumes a prime modulus) silently returns 0 here, + // which previously let `div_mod` return an unconstrained/bogus result. This + // regression-tests IF-001: the verification assert must now catch it. + let m = ModU64::new(100); + let _ = m.div_mod(7, 10); +} diff --git a/docs/pages/cryptography.mdx b/docs/pages/cryptography.mdx index 3529f0baa..9d29e6354 100644 --- a/docs/pages/cryptography.mdx +++ b/docs/pages/cryptography.mdx @@ -477,16 +477,18 @@ collects at least **T+1** such shares, applies Lagrange weights, reconstructs ac decodes modulo **t**; it runs once at the aggregator after enough valid **C6** proofs are available. **C6** proves a partial decryption share **d** built from the output ciphertext, the node’s Shamir -shares of the threshold secret and smudging noise (from **C4**), and reduction -quotients—schematically per CRT limb (see `verify_decryption_share_computation` in -`share_decryption.nr`): +shares of the threshold secret and smudging noise (from **C4**), and reduction quotients. Each C6 +proof also carries the common E3 decryption-domain limbs that are preserved through folding and +checked by the on-chain wrapper—schematically per CRT limb (see +`verify_decryption_share_computation` in `share_decryption.nr`): ```math d^{[\ell]}(\gamma) = \mathrm{ct}_0^{[\ell]}(\gamma) + \mathrm{ct}_1^{[\ell]}(\gamma)\,\mathrm{sk}^{[\ell]}(\gamma) + e_{\mathrm{sm}}^{[\ell]}(\gamma) + r_2^{[\ell]}(\gamma)(\gamma^N+1) + r_1^{[\ell]}(\gamma)\,q_\ell ``` **C7** first recombines partials with Lagrange coefficients at zero for the participating party -indices **x_i**, then stitches limbs and decodes to the plaintext ring. In short: +indices **x_i**. The decryption aggregator requires these Shamir coordinates to be 1-indexed, +strictly increasing, and unique. It then stitches limbs and decodes to the plaintext ring. In short: ```math \begin{aligned} @@ -501,7 +503,8 @@ product–quotient form and explicit sign handling; **u**[\ell] is then formed c CRT reconstruction checks **u**[\ell] + **r**[\ell] **q_ℓ** = `u_global` coefficient-wise, then decoding uses the map in `verify_decoding` (BigNum mod **Q**, plaintext modulus **t**, and -`q_inverse_mod_t` as in `Configs`). +`q_inverse_mod_t` as in `Configs`). Every decoded coefficient is compared with the claimed plaintext +coefficient, including zero. ## Footnotes diff --git a/docs/pages/internals/dkg.mdx b/docs/pages/internals/dkg.mdx index 730281e78..3045fc740 100644 --- a/docs/pages/internals/dkg.mdx +++ b/docs/pages/internals/dkg.mdx @@ -322,8 +322,9 @@ steps: and t is the plaintext modulus. The decoding handles centered representation so coefficients are correctly recovered within `[0, t)` -C7 proves all three steps were done correctly. The output is the final plaintext — the result of the -encrypted computation, publicly verifiable by anyone. This circuit runs once, executed by the +C7 proves all three steps were done correctly. The equality check applies to every decoded +coefficient, including coefficients claimed as zero. The output is the final plaintext — the result +of the encrypted computation, publicly verifiable by anyone. This circuit runs once, executed by the aggregator. --- @@ -517,11 +518,13 @@ for the full contract. ### Decryption recursive proof The decryption recursive proof (`BfvDecryptionVerifier`) follows the same shape: a recursive Honk -proof aggregates **C6** from at least **T+1** parties plus **C7**, surfaces `expected_sk_commits[]` -and `expected_esm_commits[]` per party, and binds to the on-chain committee hash. The registry -compares the surfaced commitments against the anchors stored at `publishCommittee` — if any anchor -differs the proof is rejected — and the plaintext is decoded from the proof's last 100 public inputs -(one `uint64` coefficient each, packed into bytes). +proof aggregates **C6** from at least **T+1** parties plus **C7**, carries a domain over the chain, +deployment, E3, committee, ciphertext, and committee-key context, and surfaces the party IDs plus +`expected_sk_commits[]` and `expected_esm_commits[]` per party. The wrapper receives `e3Id` +separately so it can compare those surfaced commitments against the anchors stored at +`publishCommittee`; if any anchor differs, or if the E3 domain differs, the proof is rejected. The +plaintext is decoded from the proof's last 100 public inputs (one `uint64` coefficient each, packed +into bytes). ### Slashing-evidence binding diff --git a/packages/interfold-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json b/packages/interfold-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json index d17ca01a7..4f6ffaf51 100644 --- a/packages/interfold-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +++ b/packages/interfold-contracts/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json @@ -1338,5 +1338,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IBondingRegistry.sol", - "buildInfoId": "solc-0_8_28-b08e2b9fb42fa5cb0f49eb46a9e6e77e295b46b0" + "buildInfoId": "solc-0_8_28-2d3d2b6b440530e2d0cda7f925e842c7cd652fec" } \ No newline at end of file diff --git a/packages/interfold-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json b/packages/interfold-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json index 05db5169d..e0fac11e9 100644 --- a/packages/interfold-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +++ b/packages/interfold-contracts/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json @@ -1345,5 +1345,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ICiphernodeRegistry.sol", - "buildInfoId": "solc-0_8_28-b08e2b9fb42fa5cb0f49eb46a9e6e77e295b46b0" + "buildInfoId": "solc-0_8_28-2d3d2b6b440530e2d0cda7f925e842c7cd652fec" } \ No newline at end of file diff --git a/packages/interfold-contracts/artifacts/contracts/interfaces/IInterfold.sol/IInterfold.json b/packages/interfold-contracts/artifacts/contracts/interfaces/IInterfold.sol/IInterfold.json index 84e5fc500..cb19928dd 100644 --- a/packages/interfold-contracts/artifacts/contracts/interfaces/IInterfold.sol/IInterfold.json +++ b/packages/interfold-contracts/artifacts/contracts/interfaces/IInterfold.sol/IInterfold.json @@ -2376,5 +2376,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/IInterfold.sol", - "buildInfoId": "solc-0_8_28-cba8eb9c8c72239d405341adafff7527f0fb462b" + "buildInfoId": "solc-0_8_28-2d3d2b6b440530e2d0cda7f925e842c7cd652fec" } \ No newline at end of file diff --git a/packages/interfold-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json b/packages/interfold-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json index 2c825db95..9ec078df5 100644 --- a/packages/interfold-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json +++ b/packages/interfold-contracts/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json @@ -1432,5 +1432,5 @@ "deployedLinkReferences": {}, "immutableReferences": {}, "inputSourceName": "project/contracts/interfaces/ISlashingManager.sol", - "buildInfoId": "solc-0_8_28-a061e0a52134a96e9721aff61615698a1eae6886" + "buildInfoId": "solc-0_8_28-2d3d2b6b440530e2d0cda7f925e842c7cd652fec" } \ No newline at end of file diff --git a/packages/interfold-contracts/contracts/interfaces/IDecryptionVerifier.sol b/packages/interfold-contracts/contracts/interfaces/IDecryptionVerifier.sol index 2588b5dc2..b7550f1e1 100644 --- a/packages/interfold-contracts/contracts/interfaces/IDecryptionVerifier.sol +++ b/packages/interfold-contracts/contracts/interfaces/IDecryptionVerifier.sol @@ -36,9 +36,17 @@ interface IDecryptionVerifier { /// @notice The domain-binding public-input slot does not equal the value /// recomputed on-chain from the call context. error DomainBindingMismatch(); + /// @notice A `party_id` returned by the proof is not present in the + /// registry's stored DKG anchors for this E3. + error DkgAnchorNotFound(); + /// @notice The proof's `expected_sk`/`expected_esm` commitment for a + /// party does not match the registry's stored DKG anchor. + error DkgAnchorMismatch(); /// @notice Verify a DecryptionAggregator EVM proof and bind it to the E3 - /// domain recomputed by Interfold. + /// domain recomputed by Interfold and the DKG anchors stored for it. + /// @param e3Id Identifier used to resolve the stored DKG anchors. It is + /// passed separately because it cannot be recovered from the domain hash. /// @param decryptionDomain `keccak256(abi.encode(chainId, interfold, e3Id, /// committeeHash, ciphertextOutputHash, committeePublicKey))`. /// @param plaintextOutputHash `keccak256(plaintextOutput)` expected by the Interfold. @@ -46,6 +54,7 @@ interface IDecryptionVerifier { /// @param proof ABI-encoded `(bytes rawProof, bytes32[] publicInputs)`. /// @return success Always `true` on success; the wrapper reverts on any failure. function verify( + uint256 e3Id, bytes32 decryptionDomain, bytes32 plaintextOutputHash, bytes32 committeeHash, diff --git a/packages/interfold-contracts/contracts/lib/InterfoldPricing.sol b/packages/interfold-contracts/contracts/lib/InterfoldPricing.sol index e72ebd868..699dcfdc9 100644 --- a/packages/interfold-contracts/contracts/lib/InterfoldPricing.sol +++ b/packages/interfold-contracts/contracts/lib/InterfoldPricing.sol @@ -95,6 +95,7 @@ library InterfoldPricing { ) ); IDecryptionVerifier(verifierAddress).verify( + e3Id, decryptionDomain, plaintextHash, committeeHash, diff --git a/packages/interfold-contracts/contracts/test/MockDecryptionVerifier.sol b/packages/interfold-contracts/contracts/test/MockDecryptionVerifier.sol index 8b5b21314..87b088d32 100644 --- a/packages/interfold-contracts/contracts/test/MockDecryptionVerifier.sol +++ b/packages/interfold-contracts/contracts/test/MockDecryptionVerifier.sol @@ -14,6 +14,7 @@ contract MockDecryptionVerifier is IDecryptionVerifier { bytes4 private constant _FAIL_MAGIC = 0xdeadbeef; function verify( + uint256, bytes32, bytes32, bytes32, diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol index 77c9305ba..1a330fdbb 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/BfvDecryptionVerifier.sol @@ -7,6 +7,7 @@ pragma solidity 0.8.28; import { IDecryptionVerifier } from "../../interfaces/IDecryptionVerifier.sol"; import { ICircuitVerifier } from "../../interfaces/ICircuitVerifier.sol"; +import { ICiphernodeRegistry } from "../../interfaces/ICiphernodeRegistry.sol"; import { CommitteeHashLib } from "../../lib/CommitteeHashLib.sol"; /** @@ -25,7 +26,8 @@ import { CommitteeHashLib } from "../../lib/CommitteeHashLib.sol"; * [3] = committee_hash_lo * [4] = decryption_domain_hi * [5] = decryption_domain_lo - * [6 .. 6+1+(3*(T+1))) = circuit-internal (sk, esm, ct columns) + * [6] = aggregate recursive VK key hash + * [7 .. 7+3*(T+1)) = party_ids, expected_sk, expected_esm columns * [last 100] = plaintext message coefficients (100 u64 LE) * Total: expectedPublicInputsLen = 6 + 1 + 3*(T+1) + 100. * @@ -33,9 +35,20 @@ import { CommitteeHashLib } from "../../lib/CommitteeHashLib.sol"; * construction; this anchors the recursive aggregation trust and * prevents a malicious aggregator from substituting a forged sub-VK. * + * The `party_ids`/`expected_sk`/`expected_esm` columns are cross-checked + * against `ciphernodeRegistry.getDkgAnchors(e3Id)` (`_verifyDkgAnchors`): + * the circuit only proves a decryption share is internally consistent + * with some self-declared commitment, so this binds that commitment to + * the address-signed DKG output actually recorded for this E3. + * * Each secret-bearing C6 proof commits to the same domain limbs. C6Fold * preserves them, and DecryptionAggregator exposes them here, so an * aggregator cannot re-label an existing proof for another E3. + * + * The domain prevents cross-context replay, while the DKG anchors bind + * the proof's secret-bearing commitments to the authenticated DKG output. + * The circuit still does not expose a ciphertext commitment that can be + * compared with the on-chain ciphertext hash. */ contract BfvDecryptionVerifier is IDecryptionVerifier { error InvalidCircuitVerifier(address verifier); @@ -47,7 +60,9 @@ contract BfvDecryptionVerifier is IDecryptionVerifier { /// @dev `decryption_aggregator` return tail: `1 + 3*(T+1) + MESSAGE_COEFFS_COUNT` fields. uint256 internal constant DEC_RETURN_PREFIX_LEN = 1; - /// @dev `decryption_aggregator` return columns after the leading key hash (sk, esm, ct). + /// @dev `decryption_aggregator` return columns after the leading key hash + /// (party_ids, expected_sk, expected_esm). There is no ciphertext + /// column here because the circuit does not expose one in its return tuple. uint256 internal constant DEC_RETURN_COLUMN_COUNT = 3; /// @dev `publicInputs` index for `committee_hash_hi` (after sub-circuit key hashes). @@ -66,9 +81,26 @@ contract BfvDecryptionVerifier is IDecryptionVerifier { /// @dev `6 + DEC_RETURN_PREFIX_LEN + DEC_RETURN_COLUMN_COUNT*(T+1) + MESSAGE_COEFFS_COUNT`. uint256 internal immutable expectedPublicInputsLen; + /// @dev `publicInputs` start index of the `party_ids[T+1]` column. + /// Circuit-side `party_ids` are 1-indexed Shamir x-coordinates + /// (1..N_PARTIES); the registry's `dkgPartyIds` are 0-indexed + /// sortition slots, so comparisons subtract 1 (see `_verifyDkgAnchors`). + uint256 internal immutable partyIdColOffset; + + /// @dev `publicInputs` start index of the `expected_sk[T+1]` column. + uint256 internal immutable skColOffset; + + /// @dev `publicInputs` start index of the `expected_esm[T+1]` column. + uint256 internal immutable esmColOffset; + /// @notice Underlying Honk verifier for the DecryptionAggregator circuit. ICircuitVerifier public immutable circuitVerifier; + /// @notice Registry holding the per-E3 DKG anchors (`dkgPartyIds`, + /// `dkgSkAggCommits`, `dkgEsmAggCommits`) that the proof's + /// `party_ids`/`expected_sk`/`expected_esm` outputs must match. + ICiphernodeRegistry public immutable ciphernodeRegistry; + /// @notice keccak256 commitment to the C6-fold recursive VK; expected at /// `publicInputs[0]`. Provenance: `bb verify_key -b /// circuits/bin/recursive_aggregation/c6_fold/target/...` -- pinned @@ -81,6 +113,7 @@ contract BfvDecryptionVerifier is IDecryptionVerifier { constructor( address _circuitVerifier, + address _ciphernodeRegistry, bytes32 _expectedC6FoldKeyHash, bytes32 _expectedC7KeyHash, uint256 _threshold @@ -100,13 +133,19 @@ contract BfvDecryptionVerifier is IDecryptionVerifier { (DEC_RETURN_COLUMN_COUNT * (_threshold + 1)) + MESSAGE_COEFFS_COUNT; + partyIdColOffset = 6 + DEC_RETURN_PREFIX_LEN; + skColOffset = partyIdColOffset + (_threshold + 1); + esmColOffset = skColOffset + (_threshold + 1); + circuitVerifier = ICircuitVerifier(_circuitVerifier); + ciphernodeRegistry = ICiphernodeRegistry(_ciphernodeRegistry); expectedC6FoldKeyHash = _expectedC6FoldKeyHash; expectedC7KeyHash = _expectedC7KeyHash; } /// @inheritdoc IDecryptionVerifier function verify( + uint256 e3Id, bytes32 decryptionDomain, bytes32 plaintextOutputHash, bytes32 committeeHash, @@ -160,6 +199,10 @@ contract BfvDecryptionVerifier is IDecryptionVerifier { revert PlaintextHashMismatch(); } + // Cross-phase binding: the proof's per-party sk/esm commitments must match + // the DKG anchors this registry recorded (address-signed) for this E3. + _verifyDkgAnchors(e3Id, publicInputs); + // Bubble up as a revert instead of a silent `false`. if (!circuitVerifier.verify(rawProof, publicInputs)) { revert InvalidProof(); @@ -181,4 +224,49 @@ contract BfvDecryptionVerifier is IDecryptionVerifier { } return keccak256(plaintext) == expected; } + + /// @dev Binds the proof's `party_ids`/`expected_sk`/`expected_esm` outputs to the + /// registry's stored DKG anchors for this E3, closing the gap where the circuit + /// only proves internal self-consistency ("I know a share matching some claimed + /// commitment") without tying that commitment to the address-signed DKG output. + /// + /// Index note: circuit `party_ids` are 1-indexed Shamir x-coordinates + /// (1..N_PARTIES); `getDkgAnchors` returns the registry's 0-indexed sortition + /// `party_id` (matching `topNodes`/`canonicalCommitteeNodeAt`). Subtract 1 + /// before comparing. + function _verifyDkgAnchors( + uint256 e3Id, + bytes32[] memory publicInputs + ) internal view { + ( + uint256[] memory dkgPartyIds, + bytes32[] memory dkgSkAggCommits, + bytes32[] memory dkgEsmAggCommits + ) = ciphernodeRegistry.getDkgAnchors(e3Id); + + for (uint256 i = 0; i < threshold + 1; i++) { + uint256 circuitPartyId = uint256( + publicInputs[partyIdColOffset + i] + ); + uint256 registryPartyId = circuitPartyId - 1; + + uint256 matchedIdx = type(uint256).max; + for (uint256 j = 0; j < dkgPartyIds.length; j++) { + if (dkgPartyIds[j] == registryPartyId) { + matchedIdx = j; + break; + } + } + if (matchedIdx == type(uint256).max) { + revert DkgAnchorNotFound(); + } + + if ( + publicInputs[skColOffset + i] != dkgSkAggCommits[matchedIdx] || + publicInputs[esmColOffset + i] != dkgEsmAggCommits[matchedIdx] + ) { + revert DkgAnchorMismatch(); + } + } + } } diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/DecryptionAggregatorVerifier.sol index 02b055088..ca26559b0 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/DecryptionAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/DecryptionAggregatorVerifier.sol @@ -8,7 +8,7 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; uint256 constant NUMBER_OF_PUBLIC_INPUTS = 129; -uint256 constant VK_HASH = 0x194ab481ffef18a45daf58632a2a4f33c0a18e1aa9f86c6c36a4110060062ccc; +uint256 constant VK_HASH = 0x3007c7ee30e1eab6a52c0fec9560fc4096b081a8c86e1b47ec1512c5280fa98b; library HonkVerificationKey { function loadVerificationKey() internal @@ -21,50 +21,50 @@ library HonkVerificationKey { publicInputsSize: uint256(129), ql: Honk.G1Point({ x: uint256( - 0x010521afb34a08599b6050718fc9b8c87a4d2c07eb2dd5bb601b0a5f1c7e184a + 0x26c761c1db2e0a6312b45b9583d8d57321c54d4cdafaa353a30803de1ea257b9 ), y: uint256( - 0x2d2da06c4f068f98957930d8e3e6620ec8c4ac6b2efd070e453ea994503eeacb + 0x13d3ee606ac490c68044940773f562f362b7a6e9c98f53702e200950b430f225 ) }), qr: Honk.G1Point({ x: uint256( - 0x1152e6db8ad8a05dbb30c8168db63ca5d9f3949ab9bf441afe3ff7e242d7157f + 0x1633bd1e83fb45390712d99c698528639af4dc97d74918c5e030a433cdaa3134 ), y: uint256( - 0x18ef95f1bcaf881852b1c3a393cf4d1d1f306cc9cb6837a3e35a251f903e982c + 0x2a7e087f47cf6ff97021c1b3a8d7ec2fe7d95b4c1bd9e38ddf8249e4ee291ec4 ) }), qo: Honk.G1Point({ x: uint256( - 0x110388762f39683a2464c340dfb43812e108e539c39b112196cbf77e5a48bf8b + 0x039a9ae4a599b9663982c1366d9e85c3d8ac639f8425d2daa4b0246559b7d5b6 ), y: uint256( - 0x1477d531425197458cee05db775238ccbf8146c6e1cc5aabdcafe6dae4b790c1 + 0x0abc441a852ed7c936752b0a62297690e4f2296aeba34b553c499dde634b2188 ) }), q4: Honk.G1Point({ x: uint256( - 0x1882a8a60fd8e59740e19b600c5459a4b642c7e9b089f8926b88b5a66cb3e904 + 0x00ac508ffc59f81de2305f7b340433fd6f3037ae87e9f16971e5a803cc7d76b3 ), y: uint256( - 0x20c2cea5d12751d28f53d5be4854f392d68c8ca45c74c3fc4f5d1aa6ee01688a + 0x2efb6903b5bf3c77403d2fac605c8034ee70e7185f3a225f11ec82f101975a03 ) }), qm: Honk.G1Point({ x: uint256( - 0x23adba2e6e3307f724078a2ecffb74fd97b3f4c728d09ef210dd4206bdff8a4b + 0x215efd61a94f7aa1702ef4617c153052137606b70d77054e252322d5d5e64ac7 ), y: uint256( - 0x05b21af164d64b64d280ed384c88a8c3934ed2667164579ed8708f4877d3830f + 0x0c2eb9cf44c602ab2e40cfa8a9b87fac584eecaf592b67b5f6651c5d19a4badb ) }), qc: Honk.G1Point({ x: uint256( - 0x0162dc5fec3fbc821088520d018a189bfba2d0694703a50e2ff68e1746d4ddfa + 0x0a1a529e0e1ef341c69d05dbfca65a5860ecaa5be6e14bd3a0fedb729fb22bc7 ), y: uint256( - 0x0d3bf9f887cc9f913494d7b19fc9d2f584956209134f92cfcc492d251fcb495f + 0x2626c476fc9e32a4fd44e43d5dadb7ddd1250c63564044561452702c6c281a4e ) }), qLookup: Honk.G1Point({ @@ -77,90 +77,90 @@ library HonkVerificationKey { }), qArith: Honk.G1Point({ x: uint256( - 0x22a366917320f410156b25de971a1e9d15251295e2cc326cb5b8c7f1801a2ce1 + 0x02f72baa01ed565d9e6b7dcf87e97314f15f40270dee972816d363051071e340 ), y: uint256( - 0x18b3f08d795debf73da2daa73f1d567f7d38e94e3aa40f637a365fb0e5a76821 + 0x1492abb616878d8dce325ca76eef28973d8fc5bb636c51c5214cc8dfddb14bd7 ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x194e200afec2b4572c3206296df1b4c1122b2634aebf9a1ec5369d39035482ba + 0x2027e34e97f08e318e02c16e9d22a8c5c07afa7e7710d4ab5011ac929acaec37 ), y: uint256( - 0x06a89d0def7080d25a384a7a4af8930b5c0f8796439b8eeab6a1d1bc6f44f5fe + 0x255eacab70d19db0a35919f197feba1cdc4b213f6768153ad38b9e6581cf39aa ) }), qElliptic: Honk.G1Point({ x: uint256( - 0x1cb1882e6203b03ff642b4b149440c663a805f7cab669675dd3956891fa7996c + 0x10406869a07dda6bf2a575195b0032897355adea655f89baef21bd698f6be7ef ), y: uint256( - 0x301b524d91f9ef744a9120228b2434d6fcf625ea55aa95e2f4521adbef1c9a11 + 0x2150dea61781cbe337ac831a74f43af0f0986824fc7104761554e79cd2c32e9e ) }), qMemory: Honk.G1Point({ x: uint256( - 0x234f73f3382bba3e07b886671eacdbb5cd23d3edecadccd5ae41e644543e0bc3 + 0x217c623bb5ed45b66577bd5777ab2af3f3e070d4a98c664675342e96886007a5 ), y: uint256( - 0x041c69a96e8c443ef178f6dda788f59d4577eced661436c793d46ec99b6ff316 + 0x04c5f52d35c5ed18a466b1efd8acc4fbf04c25f860080d06d170a7fbe473520e ) }), qNnf: Honk.G1Point({ x: uint256( - 0x0e47e62e6db09aa6cbdefbc3136d417c81bdc3993795fb6081760bbc1bf9ebd7 + 0x2fa39132d2953cc30adda59cfec619aa9d2b70752295df0ca628845d904f28f4 ), y: uint256( - 0x287df15d22e3ed8af0a13608fa903f9cf2ae3e93d47368189f36d1df673fec2e + 0x2651aa28d13ee5492a29bd64f4ad4832140dc788e4e1c00f324b1cccbc937494 ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x1c85b9febc61f29919ebeffd0e83fd1af35c73c7612123d55047696f768920e1 + 0x079dd8624c03b30721db34a8872655db057f57c0933f7caf0fc4544964989bc2 ), y: uint256( - 0x2e180d1bcd14356e561423bf126837d55f33666c3525d15c4a38ec65c50e1348 + 0x0e875b3d698d43802d1fe32a30d34c7c43bc1d9eb0a6b9b9c2fa667b31ea04eb ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x07b50c401476d1319de4be38bb5ac8712e4df5f889c4f332e8e0f1f0b2afb2e5 + 0x219a73defcdde90b92d8965858524cac51b08d7a652e4f94b04ec1b57ced064b ), y: uint256( - 0x0895e445eb250bcb0753bb742ab19332740313526bb5734e0397fc89726323e4 + 0x0b4bfaa8972071cf51c62a4b98ecce85a6103091dcecdef51b4f7fa48d0f5a10 ) }), s1: Honk.G1Point({ x: uint256( - 0x22c639fd089056e756d0dd5f49b1f4bc6dc774ec4b1ed8d7546479af37c7a3f4 + 0x26a59aded238e61be9880c77ac3a7940d7e9720b104397e76e67b225cba9b80b ), y: uint256( - 0x0aa616c5cb54e9d85733de81170d6384579ba7e72a375e69ff2722ca3af4cac2 + 0x12ddf734e74b37da608c991b0cc2dfc9e113e3af59b5ac0af35386f5b4ec3d9a ) }), s2: Honk.G1Point({ x: uint256( - 0x07e8fe3a63ece67d929f1ae2e111188d86ef3485e5755cccf7069a09e8f5392c + 0x1881314a3796e27e431515e33df350add1397051a4db244ce7a5cac11faed51b ), y: uint256( - 0x1283fc4212300f568be4d9bf1df7e10eba2c0a522a460afd8610a271df3c21d4 + 0x16761ef2ac648cf92f1568015ca7640a2fb58c3dbf0de0eeb702a20062ce271b ) }), s3: Honk.G1Point({ x: uint256( - 0x18a7cd98bdfa528a77c6cd37da0efe90bd61368e8d26c4fed7e8669e461529e9 + 0x3015cfab2f817be579c9ec2fb7de656b09e04c095d46fb9c572ac45470ffcc6f ), y: uint256( - 0x2313045014b131da2894b943835443bab338f9da58eea9b00f1f508b351c4ba2 + 0x09c9e677811bb52a9b51699304524b04165ee39fb5c8571e2600c6e3a65b5fe4 ) }), s4: Honk.G1Point({ x: uint256( - 0x0d90d96b1aaf3b28a8a4a478450f36dc0543f181e6aad3c5bb1f6d49de24000c + 0x21c4ebc93b81a0d4b48fe6768aac01e0da0db363ad5ed2b12d8a834b7f1fdffe ), y: uint256( - 0x020f9e28c5643771079a8c2cee87806e122bca98e2db61c540ce6e5621da1435 + 0x1c78387f50e554c5d663e4162d9904cfe53037a126fba4d08ee8f643c9450ec2 ) }), t1: Honk.G1Point({ @@ -197,34 +197,34 @@ library HonkVerificationKey { }), id1: Honk.G1Point({ x: uint256( - 0x1d2c7ad198ae54fb6a7fc6fc40f17c013d4fdfaf7443766f69c9d2327c01d30f + 0x1b4e63e074dea29db92b812d9e6d2a4859a60635f458e1e5029ee0aed26c702e ), y: uint256( - 0x156a0ae17a38cc19f98d28ba414ae4e6b6a5bddd07e960a9064b779e6c3d0cf3 + 0x2d5fa9ba6ddb54ee0c0d31b1bcd3f449f0805d9a66801c945f012aa29119a4df ) }), id2: Honk.G1Point({ x: uint256( - 0x1e00feff267b2444858036a89fc5d53c6a3fcfb6094eb652d46edf6796874d11 + 0x194c7c12ecb7cd44a614bd0080e2808e7785992904d11117dbc05e46a8fb127b ), y: uint256( - 0x3045db4643b53c1783fc74d6c8bfa440fd28d010c3069f843375ad65fc3a4811 + 0x12879b5e899f7fbea4177df2a56ab2c9af92e281d75e11dc463b07623bdf7db4 ) }), id3: Honk.G1Point({ x: uint256( - 0x09fc12b4fa13d47337ccab21e46377db14ff27de07660f77ff9eecccd5e1f113 + 0x27c9e91567b2c65396669dd2bacf1bd390e2d45f86d00a7ac95914144da382bc ), y: uint256( - 0x02cd05f2f8779395bb30f6efe75c0cfacd0c54daa0c93d6e6fddf72e9591503e + 0x1f5a7bb257b7912f6da48167ec70be3cf6fd1ffb020c80e63c9a4e9ff82ff4bb ) }), id4: Honk.G1Point({ x: uint256( - 0x1c4df7145e8eb4fe3b49165e87646fbfad9afef3f5980c08712fad3bb9fe8ff5 + 0x1a6a30cc88ff3654113a4bb42bb0793ee741c025d6444b1f91d8ee1fcbdc8247 ), y: uint256( - 0x0dc75037ff2094d4a3fa0e7f689905ec8b6ef1cf087a47d36daceca7564c9912 + 0x23025936d2e066c8a1b8007230566c730afb42dea751e960a8d48485ddbbed69 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x162e289cadfb8e38f36041f2d12ef29d09757e625ed43ee4211cfd4d54a3efea + 0x23448f8b72ce67791d3051dcc2e73fe2210514cc6a95582066f9796ab7ef2002 ), y: uint256( - 0x2d6edc8136af3ddcb87da500d93e149310d086b3af87031bb6e34ff231bfa101 + 0x242ccb90a0c69b71476139b7087b4f7bb37248c17f31dc514c4944e1c879cce9 ) }) }); diff --git a/packages/interfold-contracts/ignition/modules/bfvDecryptionVerifier.ts b/packages/interfold-contracts/ignition/modules/bfvDecryptionVerifier.ts index b528c741d..0985e0ff3 100644 --- a/packages/interfold-contracts/ignition/modules/bfvDecryptionVerifier.ts +++ b/packages/interfold-contracts/ignition/modules/bfvDecryptionVerifier.ts @@ -13,6 +13,7 @@ import { import decryptionAggregatorVerifierModule from "./decryptionAggregatorVerifier"; export default buildModule("BfvDecryptionVerifier", (m) => { + const registry = m.getParameter("registry"); const { decryptionAggregatorVerifier } = m.useModule( decryptionAggregatorVerifierModule, ); @@ -26,6 +27,7 @@ export default buildModule("BfvDecryptionVerifier", (m) => { const bfvDecryptionVerifier = m.contract("BfvDecryptionVerifier", [ decryptionAggregatorVerifier, + registry, c6FoldKeyHash, c7KeyHash, BFV_THRESHOLD_T, diff --git a/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts b/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts index 2a1fdeaeb..47930fb97 100644 --- a/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts +++ b/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts @@ -12,6 +12,8 @@ import { BFV_DKG_H, BFV_THRESHOLD_T, bfvDecCommitteeHashIndices, + bfvDecDomainIndices, + bfvDecPartyColOffsets, bfvDkgCommitteeHashIndices, committeeHashFromLimbs, getBfvDecryptionSubCircuitVkHashPaths, @@ -159,6 +161,7 @@ function findRawJson(rawDir: string, fragment: string): any { const MIN_VK_HASH_PUBLIC_INPUTS = 2; const DKG_COMMITTEE_HASH_IDX = bfvDkgCommitteeHashIndices(BFV_DKG_H); const DEC_COMMITTEE_HASH_IDX = bfvDecCommitteeHashIndices(); +const DEC_DOMAIN_IDX = bfvDecDomainIndices(); function requirePublicInputLen( label: string, @@ -216,16 +219,14 @@ async function main() { const { ethers } = await network.connect(); const [benchmarkSigner] = await ethers.getSigners(); - // e3Id / committeeRoot / sortedNodes are forward-compat params; wrappers do not - // bind them yet (see BfvPkVerifier / BfvDecryptionVerifier). Any fixed values - // yield representative verify gas for the Honk + wrapper path. + // The DKG verifier still receives the committee context directly. The + // decryption verifier receives the E3 ID for DKG-anchor lookup plus the + // domain limbs carried by the folded proof. const benchmarkE3Id = 1n; const benchmarkCommitteeRoot = BigInt( ethers.id("benchmark-gas-committee-root"), ); const benchmarkSortedNodes = [benchmarkSigner.address]; - const benchmarkCiphertextHash = ethers.ZeroHash; - const benchmarkCommitteePublicKey = ethers.ZeroHash; let dkgProofHex: string | undefined; let dkgPublicHex: string | undefined; @@ -392,16 +393,40 @@ async function main() { dkgEncodedProof, ); + const registry = await ( + await ethers.getContractFactory("MockCiphernodeRegistry") + ).deploy(); + await registry.waitForDeployment(); + const bfvDec = await ( await ethers.getContractFactory("BfvDecryptionVerifier") ).deploy( decAggAddress, + await registry.getAddress(), expectedC6FoldKeyHash, expectedC7KeyHash, BFV_THRESHOLD_T, ); await bfvDec.waitForDeployment(); + const partyOffsets = bfvDecPartyColOffsets(BFV_THRESHOLD_T); + const registryPartyIds: bigint[] = []; + const skCommits: string[] = []; + const esmCommits: string[] = []; + for (let i = 0; i < BFV_THRESHOLD_T + 1; i++) { + registryPartyIds.push( + BigInt(decPublicInputs[partyOffsets.partyId + i]) - 1n, + ); + skCommits.push(decPublicInputs[partyOffsets.sk + i]); + esmCommits.push(decPublicInputs[partyOffsets.esm + i]); + } + await registry.setDkgAnchors( + benchmarkE3Id, + registryPartyIds, + skCommits, + esmCommits, + ); + const decEncodedProof = abiCoder.encode( ["bytes", "bytes32[]"], [decProofHex, decPublicInputs], @@ -416,12 +441,13 @@ async function main() { decPublicInputs[DEC_COMMITTEE_HASH_IDX.hi], decPublicInputs[DEC_COMMITTEE_HASH_IDX.lo], ); + const decDomain = committeeHashFromLimbs( + decPublicInputs[DEC_DOMAIN_IDX.hi], + decPublicInputs[DEC_DOMAIN_IDX.lo], + ); const decOk = await bfvDec.verify.staticCall( benchmarkE3Id, - benchmarkCommitteeRoot, - benchmarkSortedNodes, - benchmarkCiphertextHash, - benchmarkCommitteePublicKey, + decDomain, plaintextHash, decCommitteeHash, decEncodedProof, @@ -433,10 +459,7 @@ async function main() { } const decGas = await bfvDec.verify.estimateGas( benchmarkE3Id, - benchmarkCommitteeRoot, - benchmarkSortedNodes, - benchmarkCiphertextHash, - benchmarkCommitteePublicKey, + decDomain, plaintextHash, decCommitteeHash, decEncodedProof, diff --git a/packages/interfold-contracts/scripts/deployAndSave/bfvDecryptionVerifier.ts b/packages/interfold-contracts/scripts/deployAndSave/bfvDecryptionVerifier.ts index 80f5a22b5..b7d3504bd 100644 --- a/packages/interfold-contracts/scripts/deployAndSave/bfvDecryptionVerifier.ts +++ b/packages/interfold-contracts/scripts/deployAndSave/bfvDecryptionVerifier.ts @@ -20,6 +20,7 @@ import { export const deployAndSaveBfvDecryptionVerifier = async ( hre: HardhatRuntimeEnvironment, + ciphernodeRegistryAddress: string, ): Promise<{ bfvDecryptionVerifier: BfvDecryptionVerifier; }> => { @@ -66,6 +67,7 @@ export const deployAndSaveBfvDecryptionVerifier = async ( ); const bfvDecryptionVerifier = await bfvDecryptionVerifierFactory.deploy( circuitVerifierArgs.address, + ciphernodeRegistryAddress, expectedC6FoldKeyHash, expectedC7KeyHash, BFV_THRESHOLD_T, diff --git a/packages/interfold-contracts/scripts/deployInterfold.ts b/packages/interfold-contracts/scripts/deployInterfold.ts index 5aac39576..a8e6d252d 100644 --- a/packages/interfold-contracts/scripts/deployInterfold.ts +++ b/packages/interfold-contracts/scripts/deployInterfold.ts @@ -553,8 +553,10 @@ export const deployInterfold = async ( if (shouldHaveZKVerification) { console.log("Deploying BfvDecryptionVerifier and registering for prod..."); - const { bfvDecryptionVerifier } = - await deployAndSaveBfvDecryptionVerifier(hre); + const { bfvDecryptionVerifier } = await deployAndSaveBfvDecryptionVerifier( + hre, + ciphernodeRegistryAddress, + ); const bfvDecryptionVerifierAddress = await bfvDecryptionVerifier.getAddress(); const deployedDecryptionVerifier = diff --git a/packages/interfold-contracts/scripts/utils.ts b/packages/interfold-contracts/scripts/utils.ts index 8506c4070..d13dc21ab 100644 --- a/packages/interfold-contracts/scripts/utils.ts +++ b/packages/interfold-contracts/scripts/utils.ts @@ -118,6 +118,22 @@ export function bfvDecCommitteeHashIndices(): { hi: number; lo: number } { return { hi: 2, lo: 3 }; } +/** + * `publicInputs` start indices for the `party_ids`/`expected_sk`/`expected_esm` + * columns (each `threshold + 1` wide), matching `BfvDecryptionVerifier`'s + * `partyIdColOffset`/`skColOffset`/`esmColOffset`. + */ +export function bfvDecPartyColOffsets(threshold: number): { + partyId: number; + sk: number; + esm: number; +} { + const partyId = 7; // 6 domain/VK/committee inputs + DEC_RETURN_PREFIX_LEN + const sk = partyId + (threshold + 1); + const esm = sk + (threshold + 1); + return { partyId, sk, esm }; +} + /** `publicInputs` indices for decryption-aggregator E3 domain limbs. */ export function bfvDecDomainIndices(): { hi: number; lo: number } { return { hi: 4, lo: 5 }; diff --git a/packages/interfold-contracts/test/BfvDecryptionVerifier.spec.ts b/packages/interfold-contracts/test/BfvDecryptionVerifier.spec.ts index 6ce53e998..b60fada61 100644 --- a/packages/interfold-contracts/test/BfvDecryptionVerifier.spec.ts +++ b/packages/interfold-contracts/test/BfvDecryptionVerifier.spec.ts @@ -6,13 +6,16 @@ import { expect } from "chai"; import { network } from "hardhat"; +import MockCiphernodeRegistryModule from "../ignition/modules/mockCiphernodeRegistry"; import MockCircuitVerifierModule from "../ignition/modules/mockSlashingVerifier"; import { BFV_THRESHOLD_T, bfvDecExpectedPublicInputsLen, + bfvDecPartyColOffsets, } from "../scripts/utils"; import { BfvDecryptionVerifier__factory as BfvDecryptionVerifierFactory, + MockCiphernodeRegistry__factory as MockCiphernodeRegistryFactory, MockCircuitVerifier__factory as MockCircuitVerifierFactory, } from "../types"; @@ -39,6 +42,31 @@ const COMMITTEE_HASH_LO_IDX = 3; const DECRYPTION_DOMAIN_HI_IDX = 4; const DECRYPTION_DOMAIN_LO_IDX = 5; +/** `party_ids`/`expected_sk`/`expected_esm` column start indices for `THRESHOLD`. */ +const { + partyId: PARTY_ID_COL_OFFSET, + sk: SK_COL_OFFSET, + esm: ESM_COL_OFFSET, +} = bfvDecPartyColOffsets(THRESHOLD); + +/** + * Default DKG anchors for `THRESHOLD + 1` reconstructing parties, consistent across + * circuit-side (1-indexed) and registry-side (0-indexed) party id conventions. + */ +const DEFAULT_REGISTRY_PARTY_IDS = Array.from( + { length: THRESHOLD + 1 }, + (_, i) => i, +); // 0-indexed, matches `dkgPartyIds`/`topNodes` +const DEFAULT_CIRCUIT_PARTY_IDS = DEFAULT_REGISTRY_PARTY_IDS.map( + (id) => id + 1, +); // 1-indexed Shamir x-coordinates, as emitted by `decryption_aggregator` +const DEFAULT_SK_COMMITS = DEFAULT_REGISTRY_PARTY_IDS.map((id) => + ethers.id(`sk-${id}`), +); +const DEFAULT_ESM_COMMITS = DEFAULT_REGISTRY_PARTY_IDS.map((id) => + ethers.id(`esm-${id}`), +); + function committeeHashHi(committeeHash: string): string { const v = BigInt(committeeHash); return "0x" + (v >> 128n).toString(16).padStart(64, "0"); @@ -58,6 +86,12 @@ function buildPublicInputsWithMessage( EXPECTED_C7_KEY_HASH, ], committeeHash = ethers.ZeroHash, + // Circuit-side (1-indexed) party_ids and their sk/esm commitments. Defaults + // match `DEFAULT_REGISTRY_PARTY_IDS`'s anchors as configured by `deployWithMockCircuit`, + // so tests unrelated to DKG-anchor binding pass that check transparently. + partyIds: bigint[] = DEFAULT_CIRCUIT_PARTY_IDS.map(BigInt), + skCommits: string[] = DEFAULT_SK_COMMITS, + esmCommits: string[] = DEFAULT_ESM_COMMITS, decryptionDomain = DECRYPTION_DOMAIN, ): string[] { const arr: string[] = new Array(totalInputs); @@ -68,6 +102,16 @@ function buildPublicInputsWithMessage( } arr[COMMITTEE_HASH_HI_IDX] = committeeHashHi(committeeHash); arr[COMMITTEE_HASH_LO_IDX] = committeeHashLo(committeeHash); + for (let i = 0; i < partyIds.length; i++) { + arr[PARTY_ID_COL_OFFSET + i] = + "0x" + partyIds[i].toString(16).padStart(64, "0"); + } + for (let i = 0; i < skCommits.length; i++) { + arr[SK_COL_OFFSET + i] = skCommits[i]; + } + for (let i = 0; i < esmCommits.length; i++) { + arr[ESM_COL_OFFSET + i] = esmCommits[i]; + } arr[DECRYPTION_DOMAIN_HI_IDX] = committeeHashHi(decryptionDomain); arr[DECRYPTION_DOMAIN_LO_IDX] = committeeHashLo(decryptionDomain); const offset = totalInputs - MESSAGE_COEFFS_COUNT; @@ -103,6 +147,8 @@ function encodeProof(rawProof: string, publicInputs: string[]): string { } describe("BfvDecryptionVerifier", function () { + const E3_ID = 7n; + const deployWithMockCircuit = async () => { const [owner] = await ethers.getSigners(); const { mockCircuitVerifier } = await ignition.deploy( @@ -110,10 +156,23 @@ describe("BfvDecryptionVerifier", function () { ); const mockAddr = await mockCircuitVerifier.getAddress(); + const { mockCiphernodeRegistry } = await ignition.deploy( + MockCiphernodeRegistryModule, + ); + const registryAddr = await mockCiphernodeRegistry.getAddress(); + const registry = MockCiphernodeRegistryFactory.connect(registryAddr, owner); + await registry.setDkgAnchors( + E3_ID, + DEFAULT_REGISTRY_PARTY_IDS, + DEFAULT_SK_COMMITS, + DEFAULT_ESM_COMMITS, + ); + const bfvDecryptionVerifier = await ( await ethers.getContractFactory("BfvDecryptionVerifier") ).deploy( mockAddr, + registryAddr, EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH, THRESHOLD, @@ -125,21 +184,30 @@ describe("BfvDecryptionVerifier", function () { owner, ); const mc = MockCircuitVerifierFactory.connect(mockAddr, owner); - return { bfvDecryptionVerifier: dv, mockCircuit: mc }; + return { + bfvDecryptionVerifier: dv, + mockCircuit: mc, + mockCiphernodeRegistry: registry, + }; }; /** Domain supplied by Interfold after hashing the full E3 context. */ const ctx = () => { - return { decryptionDomain: DECRYPTION_DOMAIN }; + return { e3Id: E3_ID, decryptionDomain: DECRYPTION_DOMAIN }; }; describe("reverts", function () { it("rejects zero, EOA, and zero-hash trust anchors at deployment", async function () { const factory = await ethers.getContractFactory("BfvDecryptionVerifier"); + const { mockCiphernodeRegistry } = await loadFixture( + deployWithMockCircuit, + ); + const registryAddress = await mockCiphernodeRegistry.getAddress(); await expect( factory.deploy( ethers.ZeroAddress, + registryAddress, EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH, THRESHOLD, @@ -150,6 +218,7 @@ describe("BfvDecryptionVerifier", function () { await expect( factory.deploy( testSigner.address, + registryAddress, EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH, THRESHOLD, @@ -162,6 +231,7 @@ describe("BfvDecryptionVerifier", function () { await expect( factory.deploy( await mockCircuit.getAddress(), + registryAddress, ethers.ZeroHash, EXPECTED_C7_KEY_HASH, THRESHOLD, @@ -170,6 +240,7 @@ describe("BfvDecryptionVerifier", function () { await expect( factory.deploy( await mockCircuit.getAddress(), + registryAddress, EXPECTED_C6_FOLD_KEY_HASH, ethers.ZeroHash, THRESHOLD, @@ -186,6 +257,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -211,6 +283,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -239,6 +312,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -268,6 +342,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -294,6 +369,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -325,6 +401,7 @@ describe("BfvDecryptionVerifier", function () { // pass wrong committeeHash to verify — hi/lo check should fail await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, wrongCommitteeHash, @@ -349,6 +426,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, ethers.id("different-e3-domain"), plaintextHash, ethers.ZeroHash, @@ -374,6 +452,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, wrongHash, ethers.ZeroHash, @@ -399,6 +478,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -408,15 +488,19 @@ describe("BfvDecryptionVerifier", function () { }); it("reverts VkHashMismatch when constructor expected hashes do not match proof", async function () { - const { mockCircuit } = await loadFixture(deployWithMockCircuit); + const { mockCircuit, mockCiphernodeRegistry } = await loadFixture( + deployWithMockCircuit, + ); await mockCircuit.setReturnValue(true); const mockAddr = await mockCircuit.getAddress(); + const registryAddr = await mockCiphernodeRegistry.getAddress(); const { decryptionDomain } = ctx(); const bfvDecryptionVerifier = await ( await ethers.getContractFactory("BfvDecryptionVerifier") ).deploy( mockAddr, + registryAddr, ethers.id("wrong-c6"), ethers.id("wrong-c7"), THRESHOLD, @@ -430,6 +514,7 @@ describe("BfvDecryptionVerifier", function () { await expect( bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -437,6 +522,179 @@ describe("BfvDecryptionVerifier", function () { ), ).to.be.revertedWithCustomError(bfvDecryptionVerifier, "VkHashMismatch"); }); + + it("reverts DkgAnchorMismatch when a party's sk commitment doesn't match the stored DKG anchor", async function () { + const { bfvDecryptionVerifier, mockCircuit } = await loadFixture( + deployWithMockCircuit, + ); + await mockCircuit.setReturnValue(true); + const { e3Id, decryptionDomain } = ctx(); + + const messageCoeffs = [1n, 2n, 3n]; + const forgedSkCommits = [ethers.id("forged-sk-0"), DEFAULT_SK_COMMITS[1]]; + const publicInputs = buildPublicInputsWithMessage( + messageCoeffs, + EXPECTED_PUBLIC_INPUTS_LEN, + [EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH], + ethers.ZeroHash, + DEFAULT_CIRCUIT_PARTY_IDS.map(BigInt), + forgedSkCommits, + DEFAULT_ESM_COMMITS, + ); + const plaintextHash = plaintextToHash(messageCoeffs); + const proof = encodeProof("0x01", publicInputs); + + await expect( + bfvDecryptionVerifier.verify.staticCall( + e3Id, + decryptionDomain, + plaintextHash, + ethers.ZeroHash, + proof, + ), + ).to.be.revertedWithCustomError( + bfvDecryptionVerifier, + "DkgAnchorMismatch", + ); + }); + + it("reverts DkgAnchorMismatch when a party's esm commitment doesn't match the stored DKG anchor", async function () { + const { bfvDecryptionVerifier, mockCircuit } = await loadFixture( + deployWithMockCircuit, + ); + await mockCircuit.setReturnValue(true); + const { e3Id, decryptionDomain } = ctx(); + + const messageCoeffs = [1n, 2n, 3n]; + const forgedEsmCommits = [ + DEFAULT_ESM_COMMITS[0], + ethers.id("forged-esm-1"), + ]; + const publicInputs = buildPublicInputsWithMessage( + messageCoeffs, + EXPECTED_PUBLIC_INPUTS_LEN, + [EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH], + ethers.ZeroHash, + DEFAULT_CIRCUIT_PARTY_IDS.map(BigInt), + DEFAULT_SK_COMMITS, + forgedEsmCommits, + ); + const plaintextHash = plaintextToHash(messageCoeffs); + const proof = encodeProof("0x01", publicInputs); + + await expect( + bfvDecryptionVerifier.verify.staticCall( + e3Id, + decryptionDomain, + plaintextHash, + ethers.ZeroHash, + proof, + ), + ).to.be.revertedWithCustomError( + bfvDecryptionVerifier, + "DkgAnchorMismatch", + ); + }); + + it("reverts DkgAnchorNotFound when a party_id is not present in the stored DKG anchors", async function () { + const { bfvDecryptionVerifier, mockCircuit } = await loadFixture( + deployWithMockCircuit, + ); + await mockCircuit.setReturnValue(true); + const { e3Id, decryptionDomain } = ctx(); + + // Registry only has anchors for 0-indexed party ids [0, 1] (circuit-side [1, 2]). + // Circuit-side id 99 has no corresponding registry entry at any offset. + const messageCoeffs = [1n, 2n, 3n]; + const unknownPartyIds = [ + 99n, + ...DEFAULT_CIRCUIT_PARTY_IDS.slice(1).map(BigInt), + ]; + const publicInputs = buildPublicInputsWithMessage( + messageCoeffs, + EXPECTED_PUBLIC_INPUTS_LEN, + [EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH], + ethers.ZeroHash, + unknownPartyIds, + DEFAULT_SK_COMMITS, + DEFAULT_ESM_COMMITS, + ); + const plaintextHash = plaintextToHash(messageCoeffs); + const proof = encodeProof("0x01", publicInputs); + + await expect( + bfvDecryptionVerifier.verify.staticCall( + e3Id, + decryptionDomain, + plaintextHash, + ethers.ZeroHash, + proof, + ), + ).to.be.revertedWithCustomError( + bfvDecryptionVerifier, + "DkgAnchorNotFound", + ); + }); + + it("does not reuse DKG anchors from another E3", async function () { + const { bfvDecryptionVerifier, mockCircuit } = await loadFixture( + deployWithMockCircuit, + ); + await mockCircuit.setReturnValue(true); + + const messageCoeffs = [1n, 2n, 3n]; + const publicInputs = buildPublicInputsWithMessage(messageCoeffs); + const plaintextHash = plaintextToHash(messageCoeffs); + const proof = encodeProof("0x01", publicInputs); + + await expect( + bfvDecryptionVerifier.verify.staticCall( + E3_ID + 1n, + DECRYPTION_DOMAIN, + plaintextHash, + ethers.ZeroHash, + proof, + ), + ).to.be.revertedWithCustomError( + bfvDecryptionVerifier, + "DkgAnchorNotFound", + ); + }); + + it("reverts (arithmetic underflow) when circuit party_id is 0 -- x=0 is the secret's own point, never a valid share", async function () { + const { bfvDecryptionVerifier, mockCircuit } = await loadFixture( + deployWithMockCircuit, + ); + await mockCircuit.setReturnValue(true); + const { e3Id, decryptionDomain } = ctx(); + + const messageCoeffs = [1n, 2n, 3n]; + const zeroPartyIds = [ + 0n, + ...DEFAULT_CIRCUIT_PARTY_IDS.slice(1).map(BigInt), + ]; + const publicInputs = buildPublicInputsWithMessage( + messageCoeffs, + EXPECTED_PUBLIC_INPUTS_LEN, + [EXPECTED_C6_FOLD_KEY_HASH, EXPECTED_C7_KEY_HASH], + ethers.ZeroHash, + zeroPartyIds, + DEFAULT_SK_COMMITS, + DEFAULT_ESM_COMMITS, + ); + const plaintextHash = plaintextToHash(messageCoeffs); + const proof = encodeProof("0x01", publicInputs); + + await expect( + bfvDecryptionVerifier.verify.staticCall( + e3Id, + decryptionDomain, + plaintextHash, + ethers.ZeroHash, + proof, + ), + ).to.be.revert(ethers); + }); }); describe("success", function () { @@ -453,6 +711,7 @@ describe("BfvDecryptionVerifier", function () { const proof = encodeProof("0x0102", publicInputs); const result = await bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -477,6 +736,7 @@ describe("BfvDecryptionVerifier", function () { const proof = encodeProof("0x01", publicInputs); const result = await bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -504,6 +764,7 @@ describe("BfvDecryptionVerifier", function () { const proof = encodeProof("0x01", publicInputs); const result = await bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, committeeHash, @@ -525,6 +786,7 @@ describe("BfvDecryptionVerifier", function () { const proof = encodeProof("0x01", publicInputs); const result = await bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -549,6 +811,7 @@ describe("BfvDecryptionVerifier", function () { const proof = encodeProof("0x01", publicInputs); const result = await bfvDecryptionVerifier.verify.staticCall( + E3_ID, decryptionDomain, plaintextHash, ethers.ZeroHash, @@ -583,5 +846,13 @@ describe("BfvDecryptionVerifier", function () { EXPECTED_C7_KEY_HASH, ); }); + + it("exposes correct ciphernodeRegistry", async function () { + const { bfvDecryptionVerifier, mockCiphernodeRegistry } = + await loadFixture(deployWithMockCircuit); + expect(await bfvDecryptionVerifier.ciphernodeRegistry()).to.equal( + await mockCiphernodeRegistry.getAddress(), + ); + }); }); }); diff --git a/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts b/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts index 98c49c855..b0884fd00 100644 --- a/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts +++ b/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts @@ -9,6 +9,7 @@ import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; +import MockCiphernodeRegistryModule from "../ignition/modules/mockCiphernodeRegistry"; import { BFV_DKG_H, BFV_THRESHOLD_T, @@ -17,6 +18,7 @@ import { bfvDecCommitteeHashIndices, bfvDecDomainIndices, bfvDecExpectedPublicInputsLen, + bfvDecPartyColOffsets, bfvDkgCommitteeHashIndices, bfvPkExpectedPublicInputsLen, committeeHashFromLimbs, @@ -24,9 +26,13 @@ import { getBfvPkSubCircuitVkHashPaths, readVkRecursiveHash, } from "../scripts/utils"; -import type { BfvDecryptionVerifier, BfvPkVerifier } from "../types"; +import type { + BfvDecryptionVerifier, + BfvPkVerifier, + MockCiphernodeRegistry, +} from "../types"; -const { ethers, networkHelpers } = await network.connect(); +const { ethers, ignition, networkHelpers } = await network.connect(); const { loadFixture } = networkHelpers; const testDir = path.dirname(fileURLToPath(import.meta.url)); @@ -140,6 +146,11 @@ function plaintextHashFromPublicInputs(publicInputs: string[]): string { describe("BfvVkBindingIntegration", function () { const deployHonkAndBfv = async () => { + const { mockCiphernodeRegistry } = await ignition.deploy( + MockCiphernodeRegistryModule, + ); + const registryAddr = await mockCiphernodeRegistry.getAddress(); + const libFactory = await ethers.getContractFactory( "contracts/verifiers/bfv/honk/DkgAggregatorVerifier.sol:ZKTranscriptLib", ); @@ -198,6 +209,7 @@ describe("BfvVkBindingIntegration", function () { await ethers.getContractFactory("BfvDecryptionVerifier") ).deploy( await decAgg.getAddress(), + registryAddr, expectedC6FoldKeyHash, expectedC7KeyHash, BFV_THRESHOLD_T, @@ -207,6 +219,8 @@ describe("BfvVkBindingIntegration", function () { return { bfvPk: bfvPk as unknown as BfvPkVerifier, bfvDec: bfvDec as unknown as BfvDecryptionVerifier, + mockCiphernodeRegistry: + mockCiphernodeRegistry as unknown as MockCiphernodeRegistry, }; }; @@ -242,6 +256,7 @@ describe("BfvVkBindingIntegration", function () { await ethers.getContractFactory("BfvDecryptionVerifier") ).deploy( await bfvDec.circuitVerifier(), + await bfvDec.ciphernodeRegistry(), ethers.id("stale-c6"), ethers.id("stale-c7"), BFV_THRESHOLD_T, @@ -332,13 +347,37 @@ describe("BfvVkBindingIntegration", function () { await networkHelpers.setBlockGasLimit(HONK_VERIFY_GAS_LIMIT); - const { bfvPk, bfvDec } = await deployHonkAndBfv(); + const { bfvPk, bfvDec, mockCiphernodeRegistry } = + await deployHonkAndBfv(); const [testSigner] = await ethers.getSigners(); const testE3Id = 1n; const testRoot = BigInt(ethers.id("test-root")); const abiCoder = ethers.AbiCoder.defaultAbiCoder(); const verifyOverrides = { gasLimit: HONK_VERIFY_GAS_LIMIT }; + // Derive DKG anchors straight from the real folded proof's own public inputs + // (circuit-side party_ids are 1-indexed; registry-side are 0-indexed) so the + // new cross-phase sk/esm binding check passes for this genuine proof. + const { + partyId: partyIdOffset, + sk: skOffset, + esm: esmOffset, + } = bfvDecPartyColOffsets(BFV_THRESHOLD_T); + const registryPartyIds: bigint[] = []; + const skCommits: string[] = []; + const esmCommits: string[] = []; + for (let i = 0; i < BFV_THRESHOLD_T + 1; i++) { + registryPartyIds.push(BigInt(decPublicInputs[partyIdOffset + i]) - 1n); + skCommits.push(decPublicInputs[skOffset + i]); + esmCommits.push(decPublicInputs[esmOffset + i]); + } + await mockCiphernodeRegistry.setDkgAnchors( + testE3Id, + registryPartyIds, + skCommits, + esmCommits, + ); + const dkgEncoded = abiCoder.encode( ["bytes", "bytes32[]"], [folded.dkg_aggregator.proof_hex, dkgPublicInputs], @@ -363,6 +402,7 @@ describe("BfvVkBindingIntegration", function () { const plaintextHash = plaintextHashFromPublicInputs(decPublicInputs); expect( await bfvDec.verify.staticCall( + testE3Id, decDomain, plaintextHash, decCommitteeHash, @@ -370,6 +410,17 @@ describe("BfvVkBindingIntegration", function () { verifyOverrides, ), ).to.equal(true); + + await expect( + bfvDec.verify.staticCall( + testE3Id, + ethers.id("different-e3-domain"), + plaintextHash, + decCommitteeHash, + decEncoded, + verifyOverrides, + ), + ).to.be.revertedWithCustomError(bfvDec, "DomainBindingMismatch"); }, ); diff --git a/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json b/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json index 5e42acfb2..057ffc738 100644 --- a/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json +++ b/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json @@ -1,10 +1,10 @@ { "dkg_aggregator": { - "proof_hex": "0x0000000000000000000000000000000000000000000000038e146b049f5a2ebc0000000000000000000000000000000000000000000000018fbadc502ad14036000000000000000000000000000000000000000000000008a2cf332394158a790000000000000000000000000000000000000000000000000001f710378be6e900000000000000000000000000000000000000000000000c08a0a49dcc1784f700000000000000000000000000000000000000000000000479a1f04a4849464900000000000000000000000000000000000000000000000ecdd4f70261b68b8e0000000000000000000000000000000000000000000000000002bdc67e780e270000000000000000000000000000000000000000000000068c088e96890e815e0000000000000000000000000000000000000000000000019927ec72a8a0dea300000000000000000000000000000000000000000000000bc30ab5296a7e92200000000000000000000000000000000000000000000000000001b1768dcaf05300000000000000000000000000000000000000000000000514324a6e0f591c0a000000000000000000000000000000000000000000000002e31090bcd0a36cca00000000000000000000000000000000000000000000000eee316dba6c9c144300000000000000000000000000000000000000000000000000000fea047711602896aebdb264dac06725b3966345b9e4ef9019cf6b810f3dcc51860c5764920f2014eca6c2f04e7cf3b91e2628946b6a3718640954ab71d723bde7bf502a9d1a2f34db5ecb0806f11af806f3bb030c60338ec88b64ffe73e839f5c5870542b041441320f7b67e34ad210322d2f5fb516ac74a4f27d68106a4b6bb8862f403fea0fde735d225bf57a92f107fcaf3280cbae16c9c7029987ff0a7f4ee7a20274e10bff5a51024341ee9a5663df40a9283f6b04fc17bae3b7bb5a1581785ff55d700c1e06cfb9c565754142bcaa7b5b4cbdfe8d1a68400b427ad5a3859a91572c9a07739d0572ceabbe0d52bd4b99c0f620ca8a5321b1b804a8a139818f04a251b12a1ddf209a0d7b853ec134beb579539c5f1c5c12272c86207ade7f36723a0c1808564b49f500341dc967a931ef95cdf14fe2d6e213f59a4c08241a0a630c0a20094d9edbb54cc50d8085bd1ae3f24c32b350465caa4ee2c1f3f0e98d99ef1f280d566dbffac05a37803f1edd0b55a4915e64dd5cc8040dfa02d698b48ed45c2b0512682837918095625fc2f6808d921af9f7809b5769a1d571d5ae35c1ecedd22eb10c42bf1697e343247de4678b4739d8468c15ff49d0789daad865c2a4dfd520a710c69acd71d2e39b1b66bca361a77383686b095267d483e9a65a7106fbc129b9018e43e5304f0560ef448d298fd8c68d0bbfa7f415422f83b3a7c0c1149d100a6294b4a17081217254d550f784ac02a667e1d23540040f976e34a6d2059b0ee597f3b9db445f113f30e5498a99ff0bbc642ec6ec2902fcf42cfc0dc9c8ce290fc0e267a0be0f576ff0af58e4a68a01ccc44047c891eff4f54421844362872cc5f85a0b7a4a2c5683e6927c0129ebf5aabd8df471e02ae39565e11f3ce0831c28465d49309ddf5bce3974f68fefaa445b99e5aec1d308991ef090362bc9611951db034f99dd86a24366d10c24747aa78338a374f51595dec1de2f4e35604f0fda9c6dc2f4a1d965603db25df75368cfdcaf4a4e5c8defa96b67e839008bf02d308407c26a577d97b478ea360252b08fae8d535c3c54649a262d2c9725450e1db0494dbc8db5b571cb6e856c23cbd330154826c02ce5ba29b4bb2720ae713e0e751541f9b404bc211cacc9691d3c0917a149cb51e4ac5ddd944b7d1bc9668d2bc5615a7d472255e69005a613c4f949a3bab81819ae67ec962bbcc2635ab94e1dce72569ae638d012c6ca6cf21634eb535f80177106ee176eea6d1a4c3c3f032e3839c2b0f5c9165b77e0af36691c7451341d88be0a519f7a87b72170406ea908f56f676ef12fdbd5cdd673d77a9fe1106d29f5be7ab396ef83fc3cdbbf70152b69c3d9cf3c2da2f6e32224297dfd0d86e41bcbd3a04343c5c05547f1fa94412933a7e458060e19ce1faf9db3c9ca6e069a30c1c4ee3368ea06f3f29022bfdb118c7245fc64000f57ffdb78ef63bc87ee99108ec5ae0f3b79c18eb49a5a87e8174a8fdb7cacc0af74eb2668d45b1d999a92c3ac7234b0c504b22981c0f44fce2d45cd8817e21eea6a471a53ceb7aad4e2f20efe82889e70284075c63df31f1802f49619073b093b611c5d89f0b69bbe6510cd5c0098862491d94c229b9fefeb301a1359c653d0d5a264cc62a8ae6c08b988e588ea96f11355bdf497f26207530a887415ad40f0da37e84607ef267fef2a4392874e3e035db64ed8b4e804a5bf27ca07f83779e8ae2cf14654363fe4f88f25093ed819e433a9510367bea91d9f2db1e26383a4c8a0df489007f12ea00f91d6d00a39eef342cfce4049cb1005331a81e08d651c53177fee573a87fb0652bf0f8b6ae2eabdab0cd53a222a97bb1f2599e409604b872622a24d9f0eda3e56a7cc78ec9780f28a329e531e56b416540277caf2f5367e0c6ab8463bb850496fb67960433bd6fbfdc0f384b3734ce64902f8aaa512adc680bf8b4ee6e8805006c28ac3fe58625d3eff6c55ed1418b2d80af9a08acd5b9cb6bc4dc70c131282f2aaa7b77da31a88736f45781f136f23841e512e5a081aa544a6d5b4b7da8fcfb871abc7c2aeffb7d5c5f36c3a47ef542d0a2f0e77853444ef1bd396138b4692c68bcbc71b49273d6b85c43bd3d636d8171f9b8f9e1a6cce6b155ca1b8941e29f9384fb8675df1b925fe9d049934b57d2e0344065e99856c0f58560c7b61969d8f8a1b22185d7cee49e155dc41eeddaf392055b9fbff12a248c53aa009b31d8d898fa411dc0ae2f8832e8286f7a2502af118c76caca54feb76a5660e2e925f0a2fc3e76a09df485fad25d6454f2078345d247e5986d23f8130dde014cc70ce4d6600102584d37d2ae1ee3339cca8ebaacd1b0bc9c2cfeba8bf0d26baf663766f1a41511b6643f268b8a4b18e72dfc133af07299dd37a8e816a3301dfeb7186b727fcf0d937e36aedf38061ec699e43aa9622ba36764425a1f2d8e63cf07b25d5eea48a81658ceafff1eb99284fd40ba0ea0e8070b0f18b508f8dc8b73ad007a52a97b95997da9c88e51d725fb0322dfcb52b15678857422cd69a0a38d0b739c4640cb3a65bb1387a18b9c597802a7008b307335192168f583e82957952e50c1bb0872a59617318249d8f63aa6db33db7d90fa9601322e78210e75087f0f74d98f6de55c577d149bb5323f10274cc323a571e1a58d0bd353b5cea492d943f2b9ce4a7c1c597290edf32132364b69af83381298d05687cd395bfa6845e299ba59cfc67314a07cc4347892ef618d0f36a3fb62442db09f8bd01600b9d4797b1a1855cdd9c2fcbe56ddcf7aa3c9a6f7808d7d602c5ecf4a2882da2d6b21cb057b030bf46f1c58e6177a97ba2aed6b67bdbf42715a3daede130d745cf8524e663319b106661a34762cedd498bc1f8670ea78a042158e87a0661db99505ee3a6aae62d8ca251044674fde2521bbe3dd236f6c35a2d7f3bed582584f5791362da4c8b52a5c85a7d9d698e0d2ca59ea2fc4aea21c2256ee0cbe2b992e43e977d082c1f7979c49189644d6e4f56a293347de835599703e0ada4a22af6d5fde5b44821ad479e26d73e1af7994d26d04794cbeb8ec61c05d6afa779be840e98bd1c3ed40836c5741c99fc55edb8f7203823f6a50dd44e19c061d28ad101a955c8358078cd5490855af88af9eb62704daeea6382ddc35400d11c2b43f4373b045010f285bd78c8912d74b74f7d294126ac5e72155dcea405e9031605c04becdb06f8b84e244e6baad4146c7dab4572f9d1d4ba038d452018a742401211aea375ff3f2b56acfdb64639a433002aca37cf20cebb3be5c60715ef324c76ea04192181fa5121703321e84713478c02f63a9192f50067ae13421931e93801854687d8e60ddd847100095fcd9bb2ede66d370e647fe4f0d7fc3a2f363c468eef65a3793cd4bfb3e56d79ab68a3b09be67ab2bc3c2da6cf38eb631310185da9dfb841b5467e8183bc21132f88582589c25856117e167d80dd692c076cbda0ce6d6d2d5dcfd89311658456916c62de398c5638e43a843366d817cc0ddc7d7de125fc1c474608004580282688063f5aca6f06690dfc491a8ae9c5c02ecb8837abd0b8af52d74854a8f15b57dad2ce4346c3a57b9f16e8708730a6cb064b6fe9fb0089a65dd35b6aa970b411c78f7b2aa5b9400d87fcc1acacb3e369171c47f3230a9f6a371d420d11eafa30fd4658145178f4dcf5c28c34bb19e1a123b681a4887939e0a351aaf8fe25680434596806ca11ea526051c082247bb87a209e2e9c586721be984a8f864c9d3be80c8c7523c21113e1b18b3b706aa7d8c21d657c054d8769747e011d716dddfbefdc0cc7fa8d471e1c58ca31cf89c1d196218dc8b201131c3a34389ce3fee2ec9ed61ff3959c451e5a0f020c8033efcdfb0b5bcf51236b0b6541029662b8a3c50376f053a85124291f173411ced41748f009c22127832ab9f36659c9c87f116365b90af9e2392f5e92086b801e6fe6376a2ac461be885eea8608ddbfa4db732feb4e936819e6446f9697249b38e1f716292348b3287168eb24314e2425373dd6756868bf66717995f106cd9c871a5a68572cee61ede06b11f37d231a609bea864675dec910763e710754c461b778f906bd095df757103c44f4bdebdbc1409647a6892f67ceadc6bad48589824e199226432fafb8eda60a1202f598713bcfcb94681048b4980b98760455343316b5b35a9b295941a67f7b4ac4f1a24c8b3ed045247feb50d3670a5a918355ad64e5cf7e302775f423dd2acf738d94430a22803d157ac60ae399707c08adcec7d41e03d118052a31d8a16b8a3aef7c9830df6815906f0440531b33a10571f1ed27d84cb75510495df8efcb714197c94f8c9fd53b198efe93334064d84b5c6c22c822c643d02c3a053da66d5c4cc774b5fd04740d89c3839be5157aa9ad2d2169bdecfb020c002199232930c8eb7fd2e59c70ca689f838a282b03d2372e35f3b52fb332d8e7118f60a499489c36626769c99700537dd8f5e80422d92dd0683b5efc3f21690e288089688a1421854d4653247bb20bed1dccd20b56c9dc4daa52cab2a984fa03024b5ad9af64d50703a4de10752bf3a82f835938640c7ab80e0a0190b0a2261d2ab6a42d129566586bf0db21334d4336c2754b368cd5ce3bce6196007c51a2b52cb2a7f29f13b502784ba00d49726cdd8f2315488c2511acb7f64acb5e86a6fd2506d1d03a141d4247fee5336d6210577a55cb80c60607c3ddf33d9e3ca1c46f0d62d50ce69948edfbb234bbf9216a1aff75647b311f859620385c0acaa4193f2e5f309fabc40436ac440f39da8db73698e0a85edafc0836ff33e234321278352394536d28d050f56da00b11fbb40fd5f8a4566c72be8e5ecfacaa7d38c2cf3e0f9e2384d56265c064dc420fdbc6a73f8c0e6e04b644e9cbc61df97d88e9c529145184b011f9eb91fc5096842a3aaec5b6caee0899dbc249e19b2d0a176d35b82cb08a43f16b3b82da140b313618120d6906492df6fe2f189703dcb70023b64c28fe97dc5ee19d42a34cc5e7abadd24ffd49c250e34a4741c8956e6616ec6efe20ae8c503e52ce778350c20b65b6f09a5051a7e95694565ea4bf3cf1f7a93dba00e28eaf5dbcae67ebfdba29b7068b913ea43126ce9a9a39170ce0e05aff43bc00119d5e9e43798de0b003442bbf4b3e07af206186e1a96eb324bb77eb0f8c242b4d00117d41cb40900378b7235ea285c4f1dd4cc09843501eb4e301e1a7fe7606f17485221a20da729dca07ec410db76f9c69f7b723e209e79a605b5fbfdc431f6420d8788a71c1af68e3f2d8a68768e632346dd1cd22d6a4a2c6268c6224810247c6cc0c8cd333a78b736a02f0d029e760f7f68589298a4919b407290a97dd2083d9af9cb142c55efde8b4c69193ac087c976a0dee9ee7b5f2630707a1632209af5ed7b86d5f08d8abcde1dc1ff387ad7a31e9388ca089e2f5f8340d54aeb0232f5ad00ce41cec1f6647b1edd63ccd207531485b06b8874ac25d769e17b22c1c8f6d4b1b5251c23e315c2f0a6b18b5521fe3ffb7fc36c156e935e34a3d918c2ab04f3bbdcb1307886b001258e4ca0efe37f22a80fbc035788ea7704d8681a4277cf318460ff17c8f2790f78a22a05264e33715a085c7429e7181944af22fb329334c5f59fed35528ec577f296de352adb6d95822e85dd1493d81be726aaef9165c3501ed7bc205db385083ad76207c9f586daae7f8c78b4ce4eb3de59338c426c7fb9191c9f897feec6174af661fd70b303f6f50a23266aa7cee73e15d320a0cad09345c02e98c86f16b6b80b94c18edf982583b4f96e047c1fbcc45c4205618b64c24cd8c14c082dc62b338b3c048a4293481ee0bef71dd3cdadd40fbd4f419a02b9f28c205241b18241d5e117306e89dd23a884a3fc54cb8079a924bebbe11deebc2e717ffce26862b8b7804bdd09db9704b0623a397c429054666741d2302640a3ab0551496af654bf68fd032082432e7e8596aefae1ed73ec7546b6fe41f13b641fdaa7396a87890b29dd70425b2c60daf38e4fac39375c7da128620a42cb6b472caa894b66488e4056e20adee4b5051750d58f3c8f9e21e5f69dcb03f0eac9e69b653a0485052211d6495de5aa9b499a123aad61eb126d430172d07e2090d8abf78ae916581c51b2e3abfa8c68740a7dd7f47dc90d8ea573a6460059a273621d0211dc09cf4274902a2c2681eb4d62fbb27ffdc5483473734e87e78621e05869d22c3adc90ced561fa5d5b023d494c41c392a690b001dedbda3dd7fdd20f479ce52973dba498a97f2358bb08cbd67c571c90d6cdc69a1fee0ad59de442bfb9bcdbd21e349693af3522519fb8c32f21a588e1f426b1d95683e4446ef340e9b664df02bf2b8ff0ad4148f50d517ff24acb4b9b33a01c3e9e0d13ebc789c0b4686f8844ffc6f638b7a90dc67bbe0a6b00d0174f3135d48eedab7fddaaf4c165a4460fca15426dde3b0718d64c4697d296912edc702e1f5258f0d26939ff4220fb00ff5792b4efb016789b009d6812f1c81d5a4dd82dbee54d9864a15068121598b4701b74147dce1853d2ce745710ef36f85432d5bee18b5fca0662be8bd0a622e484d95516e6a425a4919a4fc52c8764d106b4bcb6242dea3a8b3cb8b58306313fc37588ec9f6aa94c22ab4151908b675806ad6c9a95df02143ddc913ef054bf6e35f383708a2d5259d0a2336ddbc2a4ef93772e289a8a1710c78898caf0dc63980253765e3ec76174601394171065781698d149637a81dbf295fc6fb80020d85ea2aadf1f6b2d34f425aaf14d4a7b2d32afcd5eafa3013f9f76d12d0e70ca208763a96a78410d65d925326ac2a85f000eb77f77517672807b5b279bbba1914c7955fbdd9ba738021e16940413339f9fc19702af01758a8964a3648eb5f2b38cb8f8170de80e05194bae8de9fc3fc98e7d99456bf7ed4e9280dcd188a2909e5b07d0f283c47d1f7f9f0703a70c3d068d48040b976324abea0d70af38dad20fd871e487c34122fb7fbc2e808ce4923f17beea6b0c78baf481c0e7a7782e6301d886ffd464f271910ff70eae27784767ee6cad1b7c706568b8448f2ae1db00007db90b02058d7c9a26e29392545cc731e629682b34cc76007a0e2c672503c02b62b0a2861aa8b1541eafe096469fd0fc7671db638eac0d7a3c861af4e041b06358dd08a1d1fabf41e2caf56c93619dcaa1c152f84f123b433b5de6f526d652dfdbb3cf6ca3b495bf4e119d3192744aaa057e59b25c4dbcbcb1551531c925a1fed585cbba1e3e4832dbe93ef798ea3104aed3c15ebb35567a1b0fba49c080f1b259db8e480c19b86f74d3f12242ad8ddf276551b5579f889a925699391618b2fc3fb82abb5dabc4b164696a158efa88188d644926aa14601c5e62ef22038b12fe800ae4bbd980802c5321da39fa532fb6546a3996cd3d7c89e3a22e390bba90555e59695339ceeaa217f88e74826783c3a1efa8de6714f2275cd9067e427bd21bf502ff800c2cdef2d00ff1baab89b91b68c2c0541964433c87a099d90ddbe0a8798761cd55fee0f4d5ff34e9a58ba87decf37f3cf420687bf0371171ca8252f6e8b2f4617c0fa96b9c65542f0cb40662789e0f2e00b7f05db17c528cfe216108f9162d4eefd554a028a1db73813040a371fad8c790996a7084a20eaf0e67507873b7fa254aa0638156ce5e8b739179fc965a19dffd739a07b3a1a6a71bfb42c1b02e90a38270855f423d40e83bfa56b31993377625174ab859dd3a66a2c880c1aa42a078a47519c83c3718af991f3475f0951012ec4643a53495feb2f534715a02251c6da883227283e90750f5c68b6d14a712291ad78b16e8663ba0ada3d25809bd3d1c6bf98b92f28bc97921c7b6cf346f57797a2f7d8355f8247f29fcf1e70b2e59b61d4a90e90204e3e843a475f1525a80f27f2c139aa440bee68db3b1b272f57c8719c8d01e533e12e6d01c477823c46343278281d910d26a6c4f3c32f8a20f59a9785a883d74bfd8f621578d57a4b149b01eb7cfb4b6918dcb7b68f139b1ba1b7a052b79be15a40085bf9b91ec9937f78e54d385f2a09a747a7138f2e909b486a842c9943fac57c89900e32d4c0eccd701f3d439fe00aa9bf910d2827178724f0614e8084a6c472f74c0289623b10ba0edf264e88f45dc9d80079cb17ba5e3ece6e6c3c76f57b6b4459f8536cbb511054face7d1636809a52d7904d0bad02e0ef3e5992417d9c6c356646d4ae6f8ef5ca2f8b45d00d22e7f3f43a321d402a81c0794c86c6cbcc0b8f0af9cdf907836ecc4dcc159ac76e7e9b2d4ab90476fefeceb4acff387ae5e1eb6abe96c97be936ff5523f2b2767e3e3b1f0d4128ba97d019c749862c304731f9462a2d22583235f00df1f812f7fe18ba6afd24260768907290435becbac3106b72c5289bda8f55ac47bc0b45a0337cef3f77f51faac7cc16a64e8d42db7fe0de579a842761f013e5c1ac835ec7a7a4d5a1c50e061863ba5f8315e1d829c7c1f0c507a69075f5c5d39c659a49f0e766abbf080711f8623621c44771dc91147349f6208f5578b294a9ebb3fc3ed64da4c19c98982ef5d818424ad862d1f5dbd75d9200c40ae912792a93633ca6fbf0bb199000da10ca86481b98e624f81d5c0a4acb3bc1abc06c5d113683ec1c40e345ec9ac66607bb8da713163665fd11d4c11bc6ea47bf2647ba10234b4f4e7a20c32f8ced0d125d027030726358be036baa138cbef9ad966d57399ed14cce73aa45921d5254099bd00d5f347f292bae143b759c9448fcbcca7ea6cbee944f8a00fc8aeceae222362079175d66ee0c74e798127385d4e7ab0103a050e05e16345d82f4e3f98b1ac557f7a3dc1a6d7fda9a7b5ac1ed91ed23fbaa48afe8376e6b3c52e0c40bd10574bcd3a407a0a700420cf3ff6bf4e9d2c92603b0e3ba2fe76a86601f5b58b32b1d5c029f31a366f0a64a899988644c135db3aabe1188c1937e0e67d43784cb259c6df89d2678b2eda7d8f7c59d3742b405fc7dcbe70eb947e80cdabfe853cd0ab21de8f0cd93b0e975f77dfa85612421e01fb87848c26875a6423b34de9a820d6ca2314c7d276f56fa815f374af9a3c15ade27bfd6c74a94d8df257ec68dc401969ab545a44962b4480d7787827e9220791ccfab4ec5ed310f331ac84d41d620b975acd3d6d7244e0c9bb86cc0a45d5b86e6a8e0a8387020337602fb9664fa1f42a5e9bace6f4a0adf7a680459ac831e9148dd067aec1e6247b703bf3fd541262169439bbbced69403ebe737c5b1bf602ec254585f3533875af458d75f4b6b04904c93b04484c354815a73fa7a2f84c69b33822bd91db96ba88c06b4e7083f11ad2f5ee09720c05014344b0a80575011bfc838f5691b8401628a0bf8f137e10ad62be00adddc2e69fdc00dac0bba8a8dd99116dd8c0475879304f478e4d0b419780617665f19a173d472938bde6fc5443a221a8bb6ae4fce38148cb97e9a3c2faca00d80752a8daf6e02a7af2b014f0ad3d05f16ad4cb3155fc320b777805b1e7a4de59fd26fec3113ec4ff03fe8cace4e8a5c352032020155f6df973172802d4120638812c9ee71880c4e97cb48d2e1cddc2777d093912a2b6ee71de7d54e12e877b827611ca16f81f1dc67a480230e997c5b8437c9b4a99997b227bc034216731efbe60e9f9b3fc4a0f877a973aed8e2a29baf5de5b7a63406987c15e0670464c90090c236014d4b77d3455b4d09048f5123409f32d104cb7f6d59f3a2550f13d808471f826a1338c92e579bd02cc4f12e97833c52547dc31c1c207fb3f7024ca9687a18b57a64626be3d6c34563e9bf612404c60dff70ca16804759818329d8f0fae167bb6649e51caa8831278645f950c16888e24ececc5378976da9c82c894e200a8ef1fd2dc188d41e70e336ea373cf1ef81751147d768bf50c2aad418eb384eb68613754260e9d2bea84c850924d171bbda4c856a78b74f4bf9e5242bebf28c2c3c53437b81528c77b5e14145392417ac24b77b634ea8709293dffc03b4d4d57e67ce15a550d6d3003bc839d1beadcddd0abc5157f06c3542ecf35a030ef12b79dd6dbd1f86bafdef9613f63ad08a03cf7978dbcbcb9ee67aff50230c810be573ac148f794c0650424b0e7992692d96f482481aa5638d16c88e31812f60dcb63c920e69f88d14ff0d18d076f8fd0faa93c4b8c2bbc6f41fa2c0857f2a656284d2218612e128640002e4af05c6be31686edf9974791630d4ae3197b8211e31a04979b215d23a9834258fe87c12d45d77944db3606cdfbabdd010a05c0d3e23bc252d9cd18a0cdf2d9cc94865bfd0a803a4ec27de80a01ffa5dee9b9e0ca42cb9c506e92f339d0f1504199b9e624a71e581ea1e531e48659f75e7ed992c62e94ad931b28ae7495f5fec6b73eb59707c8cdf58149dc4ac231f7b2b770911fe287c9f702d993205d349896c2a4e491b9a6c5f923c6195ef8dd2d064cce0249c1753b3c38b42b2e67c8e75d0eba600108c3c400fbbbc2da699a5fb635a0707212d96fea2841bdb3a184a7bee263731ef6f4184fc903ae392c4012977f4e32b41f65e453c9892c2f685f43636eecf49d451735342f95e842551c9f2817dd104b05865b8c0e3fca15f8c9f236b8ac32287d9b79f1a2b2a978641c76bf86e1a280d8af6b20b402423863ffad8270c35656613c8eaa25d2bddf64ed473508f442a0ddcaf8fb65ff255b991762c99df15a0f3e406b47e367a5290e9a93502cda808f5003de148bdafa621f1056d271f7d5b3d9ed3b3564f7ca2321bcf5e9f728e15e13d7b117abfc92f42a4ab68c260e37f27187224246a90a2040d0e133ceb3b194a4dfe23338883d6cedf803623c9e7e319320fa414208a7e9e083e334e7a102ffaf3053c5ec4dbc1afc1fd0a1e2ec41fb236993d167299e4ac66fb39a6ff7b2dddf7de35183aa28dbd3e7f55085df1e85823b7a2a1415afa97ce1fba342d0c1b76ce8c291da4eab121b9bf1ed337fc3eaa48c0519f81beb378a21cf30de0211a36c491e17075f9d390f74af0c916b4b72a52cca839a8ec77453f5069a11ee606a0a221273d418f367330a250f685df6535c0f011535a661f5e0329507faba7086cb2591cb49bb2d7f9f36cb318bcb71b3a0c36a764de9159da2b359b42bfa40c2be677dbac3cbf3257f23add29381424b2c501161f347275a0eeaabfe55c84297b2d313b2aefea9bea73663caf91539278db07b06b54ade556bc5f863552870016e61cddec04e209f65b23a294dec5f51ada9a71877524071a6ea37e323abf10477b2c9ed66ea8cdd54cea94061109bb65d0c735cc408c908a3f03d4082a2208a7fc84c0a72caf1ffc0e6ed1e76508a1b12281c8c2c9c689539c18df34d9110b40a9a11243c885df0264afe639e088f4eb0b58e37f66646193e462e31328bb219dab1e270ed096487efaaeffea549d1155f6880c13af3e2cb5b0911d2a464a01415ef211740de758492628c66e9dd91e7f4e34764d67f6752df3b1d916f8d2145e0e5f0f89f34315af664917caa889c19aea42b0d33dc42316513ad09688731a9d0847762e6e23049166ec03a3806de98ca8f294bb1d5a048d4edcf28e099f109305e145b3d4eeb96745bbccf43a9539ee56cf4e98272ab0748490a629e802252bbfe3be8fe6b8385583cc012128fe518bcaa30542f39f988b9fb67442b0fb0e7504643c613e4d19af19ac28c4c5836e764648abd2e35ffa5686349d7809c70ce07a4620bc5fd09ebb0ceeab9325bab28cccbbef4dd184df360140a1d4615c202b344fe389b9dc87b319c09e0dbb55a2e43baeb87f1436120c1252986972141ba8ecc47065d5ec5f8cb112daf5090184e5feb2a314be75e75d274315c55af2213ffd564c562bc0cca937ecbdc9f30ff98354721e0dbf5cde8c067ce35cd6851ee308e251e86c55bba859435f09869c38758ea576ece6900fa2b8be2f89abd908ff57ade95004643698340099abbfd7e03c84b0318c007f4f05278d99644dd92a8c2dcc238e60a4dbf7d3d55c9944a71904123e26ffa3fb020ee020881ec78e002a17629d2c4c3964192849fda0e6adb70e34bc84f1467ebb9e22b1c565fe9e01bd5f58733c2da2eba1144d50afec878d11547b4b6c50bafd213a7dfea0081c28601df6765d0e4ee2c62ea450f53ce44526df86f32d1defd826168a72a6b920213190556ae50722f3880e4af3b1edd283ca0350c6a283fdf00ad92bdaa18bf2157c350f6ee718a1a3cde639733fc2349d24c78270fdc21200b686dad3608802168371758ded5ccc436d431141f79d62b38cef19f5a47555da701ed8ae18231825b7c906ce453bb755d3bc1676eec754c0dab65f27c40e59a55398dc0fba641a0892b81895428beefb7ed284886e138b82014911fb433cd864aa73aa714613402189ecfbeeb18f9b16b55c507adb769f2c4c5f835c7648df6b5262fb07fd0a2817fe3da73410af4651d7a63b68e23928fd166e3f267fce54cf78292a56ab39e20fb21d359fa63fb3e1ec851eca417207415d1a31c3d555e7f37ecf615cfc28880368029a43fb583cc9ec4a17a734ae0a8049756ee5ff77ff74f8111ec484ae801983d6932fb35c81a7b46486eba0913f01076f46d206f3a489a23d140886dd571cbda8df5b840b54f0a7d916fba3a2a113386c7dbe0f549148d3e707d9a9d6b6072a9b6033b5be4c53b68aa9f7b477c40091461f2e2f02e16d4415d7a2ecd09024f69b28b9794c45f96282ae002d52b4a8220df57fefd31e37c19c2fd036b7ff2cb77fa1ccfc2c67146766aa5f35a98f4dcd212d7279c899818285fbb9b83e6c259c7a955c3493e431b5bbde4227647df6a83c86e3769f1f0d9c89e2c5a480e91738e2dc7e605d15367ea67ce4c71cc11f99bc44eb2182437c564e6773e46a9a0d5a77619a1a6331ecf0ff39d75636169e1c0b4e38fcfd6ed67c848b93022faf1d8e51615c0774abeea8a79ffc4d2caec987768a90d93237d016e7713eb8118316c1bc2b8b9ccc7aa4faf4a50be342596ad7b4c8edc8ed7fe5a7ff5f5939591900df5a5284d15388b073a0af365eb1c24592b64b1c82d038ed563e553092e6d7048e132898602a07c0f960b2570b85d5fa2e1b4decabecfccdf1112b8b861bd626aa202c37ebec7772441b5f603bc932a664de98260e9d49ccb0755d9c7d822428b6d3ed257e5ac8ea166103154e36c20aa5f22c7939d0c03ddc9792cde75d4826794267b7ce2691bcf03f39f3d22b0880db9d479b70844c8a8a77fa1c60907e14d06a5afc5131c18866c61c265c54a18724f68c19c8b82709b1bf888b5c73292ba7cc7276f19d4202234cf42211e8469e760aa814e2c294e8c2382e7e99294b127ee3cc14a3c6cfe5134b9a6bade9114d816f61113f52b41198c21ff59a6c6820d1486a96ba8b765442a01b6038a1fd73d5ffaa332b3e550ee414c45e231d0e2d1423d06f425b2ce5df3a31e84885399841165521a56b4eeb752ff05e0c40310e9ce5f10b9e04a82d4b4a8ded7f583b45545e1f9d1c968ebf17db91821b9c873011955b2e280d34e3438df5326ad21c9f1ed98d6381eafec7d79a0080d0acab0b34e2d1daaf718033987daa5b33ac16ca645236f57a240a68b56bb18876f6592b1ed337f1e257d929a91f65e86638d0acab0b6888283c291fe9ef9e954ea08510e39719e12227711908eab00635ef7924f1faa04716e4a34d4c8807bedb8997256608e44ac98289e2fcd9b02c0b0ab0f8052577ff841ff5e5b79488f0b7fd432ca2ca5e920866c51eeaccec44e4058cb5117f0616d9d116aa4fc7022499ee1b10b9f5fc832077a33189c4aadd1556c83f06b77f925691ccc5686fb376c6c49a17937868fb780b8e3f922a603dcff6f04c6dcecb61c049f57ab204b26d9ede8e28d4ac29a8bb31d996cb32fa7ecc34188e070a5aabdd6cf44e901df3fe0324cd0b4d45d3abfe6f26bf5518fedaded225a1035af7ce5718cfcc45f680f1cdd5462201443bbb8b3c7a170e5a6c149204fc0aaf929c596dc73e0892cc48491a58cf1be03855cc91be6d8bf06a7fa80feddce1fd960863852ecfb7cdc46a7b286f0c29a51bf98b25b04881d1a0212e05e6969f39fa4b7952e2413bcbf31fcd2734362db6cd58cc76bf3b72c19014acff4c67ef4cdc24684f1320d63c269a189be80521208b163f2041974ed84a52863c756b994eaf8742f40c82c0cffffc9181184626865e3d548de611cb99f1a9b17e2b56f32db2f9191c07a9a604cbe44c3ad0182de47bd199a0fb45ee54a0822cd8e96d3557e8038a3d6e349979edd20261bfb92ff749ce13423317b1f5c5ea4098f22e55539d2ddb4aa1ba6629460f46976276157df52e4c2296fae7f02811a91b132aa57ebbbfcd9fefd8d553ed1a0214e0a21bf873377ecb470024fb9ecfed2e815120d5d428ca9f0b05de050081fe146e7d02a448638f8bcfea0900ff7c9f3708147674b69b2c7ca201efdf77cbb1318a2f1bde19219ba1ed0a9d8e938573fc5f080b86b7b9806980f26e202cde0805f99f2632811d2237127a1461fb0a2e7f96966c3217f6cef17878964d4858dcb3d8d40e779558453eee9fc19844fce26ad920446fbb4196dbf31525e5453e2dbf01a61cc54ed7971d0096ba4dd210313a41b3b826ddcec371851e8c1f65505a210e3e2c3916f5eafc1c6d84ee035d17bec092aca97468727448cb5af027e190a40a00", - "public_inputs_hex": "0x25832c071d6d99ad42c7b885e48b10100726dc0de03c0a779b282c519ccf538a25fc312a5f0009edd084811b739bcbd529987df1cea36f5a24515386662573960000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000cb80a0dfbeaeb79af355a70d8f19855c00000000000000000000000000000000915681ec51465d5a3404f61907428b712208484402633db0cfcb2af11d3b66ff07cd7b6b12c3a35e9581183e399d53f714ae98e2b0527277d74d7898e5a1d76041a613ee74f2db890bd6db2fd3a76e9d30329528532c70174aa6a80f652ef9fb86217d722ac4e756dac8ec699873be87009de2f6efc0e2420bebb740d52be9795045be2c08d2f61c665fd8c2946f25a70037344482bad1ff4c46d1ed3887ee2f37d4bc2dd3a1c34c3c6a0b0d75d4fa63077e46b34c8c83b27e71c711f27ad90e03f985d92330211d3eb4c6c88abb18ae" + "proof_hex": "0x00000000000000000000000000000000000000000000000893e2589fc7272df300000000000000000000000000000000000000000000000f9cacd727086112c2000000000000000000000000000000000000000000000001087d088d5e0eb68400000000000000000000000000000000000000000000000000012265e9d423bc00000000000000000000000000000000000000000000000848d741a33c08ace2000000000000000000000000000000000000000000000008900eb4f01074c33d00000000000000000000000000000000000000000000000bb603d265d0e8c3f300000000000000000000000000000000000000000000000000008a6c01ce44080000000000000000000000000000000000000000000000056a1f3c8c8cd10298000000000000000000000000000000000000000000000000f4913d1f1efea4390000000000000000000000000000000000000000000000055187776dfc7e27c200000000000000000000000000000000000000000000000000020e60b75114b80000000000000000000000000000000000000000000000037252d99ba4b6b4e600000000000000000000000000000000000000000000000774c7a54897b11a9500000000000000000000000000000000000000000000000fdd40227ec51bf31f00000000000000000000000000000000000000000000000000019c9203decfb90e15854237f5c72c41d9082a4545b24694b629e686c58d51412f7fd32e13d5cc131b256d0eae84688fba4f2c0c00f84a33ccf9eff8eaf9f96b18557d2a7019f3034e1dcf5038db8476b5ce28e0eb6d0b588a3d92abeccb8acadcf67559752b4820a6ae16edfdf62f6c4ff6f5dac318c159ed8b8a98adb2c907a21b91bb74450924ad1b7b0beae123ea31c74f103bd2f0d7838483cf5960db17d47b987b8eb9f41868dcc4c2d77185ff80d4213515aa90244fec519f8b4a3b94b789e212393534132732aa313e4296df8b5f17497adfb0e14abd79fd3d54f953825f194baa0bfa1b5875c2c1b1876a47dbde1ed563a4d0dedc8c3686bf29a39fcabb4f4d138a4305b305e25ea240ee1a7676ee159c5c0cee9881d575d82a8436a3047e0b16bd4d040372200291485daa1ef88b8e351a3aaff641c72510b642515345321f0aacdc2f1138db62d6540fd8f07939380763a72892091168fcae86a010b455afa401db031ecd41783b303eb5655e67ceec7775594faf23d9531c1e438fbb2a504a956e1b7bf6f6a9a1199f84d5430aad0d3d92f6f4040ef2b13539270b3a40d7505f931eca2310d783a3021e50216a221b41b08ac834737f354d673289128fd36786d6136e38d2f4d0b07b8cc1bb220bc7b8e57024195931350e83657d029a83dc34b7193c7c10e5f817db7d9edeb2e56536938360ba7662c40955cdb42cfba3ffe3471db3b457f7abc3da3b5c6cc1235d1443340fcc130ea8c7a1a27bd327b204b8bb1444f7df9b30ec99fb363c05cd8a95c8911703089acebf0e5374476e5b04ccac0ba4bae2950a693e469306142da1c9a6803cc03aa6751a5ede2660b6456d7ff50a22b46ecb26c32f8483b832badb3bd261b76147946ccf32ccc7df80755c970323abfd79e860344af0a77ef4158a686473f2ee44b9463c55a5fbba510f61820608315d582ea7ff959f9e0e0ece8f579c13bc173a81802641c6d59db9ccd02fb8222df1d855fb1a085663adbff7682626e7364c355592466ad27289f4e763e4150e11f707808d36e43f0942b2bce4623a17f32342e6159406377ddfc6a610497d064214c534db9af22e91fc4790d334549474cb3808889a7b233902313e8c9c1a078389b9a6bc5837f2c323f9c93da198c6f7ffc7e8506c22b6ea42e0bc92a9691e98e4a0334ff82dc0c51dbedecf9540cec8d166f3abb7acec918dd96d10159f277c4473b121ba1b35f5a6af679116f5bc600f42b77326cc2369b623347572731e3e5c676b3c710d4d76049409b96139a19caa6f489579243903a78bb5cc6d8d26546bd4ab3e7cf4e832a8158c91ba19a9e56101f466aadd4a5f6bfb7f8825d72c83d4e8965ba1468c1e93822666884990221c364cc3d56baf7b47217699b7af230b7d3b3d622b2ed8763f89c57955223d99ca2203786ae090d3a65884abcc6b117cd2bd54d1df58312861771bf6a290452d4c980ad6d8d77ef4455012bc47911e89bf3e709ae1bfb2731c4aa674fde1de69a4801e10c4923c4de7f339f85d5b2f00e7fe872d692fe397164968df3140ba2a3e8758c9a0e530903b569bc20ac6186844791c107f85970ed03a94a4120914c716a0f0606f6f66bdefb596ea706821ecbc8bd8932e21da71ded29557eb4172d7c4545a93a547fdf16e2768e3ec322d0658c1aa5b422e4fa9772c6222e1018db983236a2fe4afbc28e3a7d49aae3d0ab553e9239d3502e082ec865748cc118e8c4940a2096666785cbe269d84a3140ad922d438f9351ee68dcced4be0cc1be0096a717b090898c7a4b42c709cb2321d461e8c48dc9abfef867f2605097e9cafceaaa1c13117593bf3e4a47c350aea0f9fafad053548201fb07ac10455f6921da3e042a0af83797c1f518766fd5d9b1eee4e50d2912eb8059b9828ca6e9abcf7fbc8ca9fd31040dcf1a854b7ddce1823db49a85ae8c738472c347d5d332b51435ff82b2f9be8299e4c25ec3cdad2cf2372f312ed18b598f946ca078925c6511a63fcf014e95611009c314dbe8251d12ae84067c4f60fa43342708a96c72c8384fd3dd8510180f6b49dcbb0d6b0facc1431f6c045348ce0bd87ef9a7236126248b2cccc0697081632bc406775d2a81908d720f4faf784847862ee70967996516e8b1e6c36ce347628104e81f7537c972c8e4ab9c91a6f1f77edc7342c14fab39f3a89e3c77f02d08d5a46f3e07b31cf0f6fdeeceeba4efec088c521ff006ff8c62dcb71f444d65a28749a9192cf0a5c285a1f5ff79e8b76c3d4b15ba348b53041aa272efae3b2e1229e5b848a53180f2dfcdbfca0b368a59895ad8ef89c2db406b321ef980a673d66af38309bd1f8c02f01c5dc5bc307f642fa10ea809a214a256ac01aadafaec2fc8afb7e9a9060002c308f5e70b3ddc778f6aaa93630cbd17812cb210d316ea765117de0d6a975d52be3b032ae5b4f7f8efd0c387d042777cc46081a21b01929a0e851439ebcf53206053531bb680c462e2d8384ab322ff49426713b8a51aa30799d442c3772e7d72e53de315a6be54e85a3cc8b085e2837708d04206ef9ed7c075e54a3a1afd1ba122d34c298db267bf0de8979d3ea39981d8b826674c14bfcc73e1a40363a6a8d29858aa7a71cf3b41962433b4d4c38e6551698c82f67f33d41e13280121e551306c57d9e157f35ea90947e3e0eca751dfebb4528f409f8b7afa242345596fbb005cc617209a7bc2349235d7a01cbada55d7e457da18c3dd779f95a045a29187a18f7c25c8cfa61c702da793c22ba1ce87f369d82e49eaed8d7d99942de1e71cd05211c1a0da9dceb8776cba9c9de442336c572ea4d9deccc148b68b634693f0c2e17a10268df741e380d585ff3ea618b550537330b5b4c046c79c1419c7b494b02096cf7ab81dfae1a38d3e1956558869d84bb362b3fecdfc06c0dce58493bba2eb27fc58a2bdc4ed36c00bf922c5c1db5de02a4c432050a51ded9b099b41cbc061cc328788be07e4ccafd40b6bcd297b04797b97014eb32d258ee1ee2db13720122e99e0da54f6fb50245e680a31f64f621db6d92742171234e7586eb47891506f63d0daa7f8830c7f1367784020113578b8aa8b5dd4afc9fc9cd33172555c01eae152d42a6ac71c10bd1bb6480b7e40f8c3e2479d6c13e6b170811614e30c10797e04f4a794b23ad86dce7b68cb182d3d85328272e204224e373c5e5d7b41d29f8ec5570fad365770fa970af609eefc121da6206dc0d7f9391279e1948767c2eba3e936dbdc0cf22b8c0c670eb33a91a751d1580e32024a2a348e43c54a1f524c5c7dee7bf08b6407a4131bb7930d20fb78abc761d045841181c23b71807742e66ddd71bceaad5da2812d15f6bd7bf4b7abc39a746237b0ba166a1eff6a6361dce8dd8adb27ab557342db41bb92bb4dc1cee964d945cb4498628d373105d6a13ac28ffd7e9d74791f69bea43c9a30cc3d94d596f9680c3f04eda944c3eacab279565526a000489a00586d9867741b8c2bca52d99f56569164586ef339b1d0928cf8a27507b425f09889e3356238dcbdfe0d82ea0b25bf9fc7dd421156102771050857c3d200468629be6b8d50cb2f8ba886aa273d990d7253872a176ecfe2b2447b44957ad7a69fa0fba44fd137cf23203058c369401d2a8968b310b41600a1a8cca2c4f7eb5c10fabfb3912f6b4508b1499b61689286c92e2e10253fc62050db4c54731b5dd71fd020918713df81f373894c9e02ac407850911f7c65385a52ed9beb9b040e0f864d586e70ef47a84ab8009b1c26a482c661cc055921580f222932759de0b675fc5798bbcb1c97100d0e1178c3a9fdd87016ad164dc955b140721c4a127104109b1c4341dea673452c92a61455d7428e3fb33661a9cc6e805090b9f3af1250dc3692e5059ebf26b55ed24a1d17aac0b68cf098f87e87ca7cf0ee33d642a56905b9fa1ef08da3c79561b196b80e60928ed00339f73fb46fa1414a894a6a398d2881b92cb79476d91e9f05b709bd710e917802dc6cd31b342070d5aa5d7c38d8cc4e50461596b5d7240aac423856b44ac1d7695422ef9d190410a475b3de9d662aa4db4bfa5ff7f48cf9134f88de6e3824fed4fa82b8ea0eb7c0841152da5d56674987df02cb6d40314192857fdbf1e72ee745126823d350b1b2755e28a5733de1c902e753dfeb0345c45374985a8230c4719ce19642a6b39c001e40f6a1550dc098de688f2e5c20ffeff195bea4e58d45266c19d09ac4dd1c919f7d04b1c9017f95e5d6cece41b7f51fa6a767a74629c3fbf7f8a8c53b87e14172b8536b1752f50f587b3e87d1d32fc1aaf8f5c8097788a181144d396004ea52c248fc06ca0532f69b66a94287f5465e274cdf660854ef5812e9bd7d202cd361a6c9ab24c0d08eaeb17234f7b649849b17a82d2b4628e601165cbfa735b4a970d74e6fbfdeaacc9d23d2b7552f3e2e7f9cf36f245d72b9b0562233134fbfef13017c428b5d653681f822febb94d0d5787caa2fdf62a065b3cbd9cf7411fce960208555c6f62f6d0a9753d603c45b0ff2c26f61463fca3e9cc701ae605828152173319e1ba545079e1622b6313a693e3c91a61280b07b454303170ae71ed3fbf10221f39c22c89c3dc16ee2a8d3ab33f3e044bbcafceb519c20a6da079f6e3d818ce53aaa8f48a1cab2e844af148fa69cb3352af974d9161b8e46e514a39aafc211918caa8dbaa52c6d92b19a3c0e7aa2e5315f646464aba9c170dc165f088d92d3eb20cb4e9b6df442a4581f7bd621f7359e7107aaf2d6a96c8fa679b61d5ea263408751bca74056732ca92490d524dd393dd1920ad5d73bf36978c69c5a91413eeb815b94283fc18604a92c7d581223a897972e1d11f5d5fb18ea39d2c7c082c2f92b900e56c6e89559a144646c92f7172428ed7dad04833905b40d9fe3d02175c54ec7dd5eec77a2f83459dad2c7ea0afbfd3990e2af01d3adc3bbd2d4bdb2cd9e668a481f993b20b52d6695d4cab937d3388872e7f5292a2be8f19e912c51cfa1edf49b1f17a32fe84c10339ef67123b970a0ee9c32c498275c4069d665010942d89642d918d1608275e3683a6965334ec106a0f33fe20bb6e2cc35d65020c2abc37ef27b01b8baf7861ff6e75a6c878ec9ae8518d3193d7ba6211cf17610dbf3da6d82edfbd998175540b07c81b9b82554e8595e48c14f31e6fd979fd120b504192bbb4041af130e3443a95d694f484a388ffbc15a9f5cbe69ec8df85971e971559580e062fec279baec48c4c980a5b3ee9d9468135b28e6456c38722b024717827fd83ed7c07213e618ab3fc32e8a7afb39c5c295edd906eff182638a527576cde3d29dc6ee178378731bde6dc6b6d3f86eb97ead0f38894d9ccddbfc7009cafa51d2cab27496ad63f1e8dd6fba1d0f8d2ed6472d4d1b0fd0bd84185161bc89f8431adc4ae1c564fd79f0cdf3d331699e02813f944dded4444da20694722d06a7a3b2f66252781c0702e08d8d6eac0cac41111e1f19cee0b32ed5e4de626ab830809f85471c97ee8d18f0e49a9f59e23e2ddf20651ec29cd4b358c6c061cdb615bf651f6007a2074e4f5679dda0f83be4de87b9649ad16fbdd7e951c2d10afe06e9a07edbe7d7ac216cb7210f5d829c8e094aec84046bc73b3ddc8eb0d1a70e728e336cdad54f8c03670cc53a4efb8ccb1c64bd687395eb426c63fc3701284e98f30c881e829a47207642ad663d6fcf23733f0703a62f76b9d612c642910524dfbc4ad584ecc9aba8883766d6ff71b5bdf87de0301b7ac966efc5cfea32df53aa6133c431afc06ffe5fd7f230dabb3791045aa1b06df3031c9af4007ff16ecba9d8d3dcf9bc228867fb0d0cb6f7cbbb301bbea190b19d53dea570589ad22f0a4c22f7c143798bddbb1db1ec81e892ee35b7bc566412706f6ba39db47222c5b24ceaa70b934f696b3042014f4d71242f3465fd6bbba7fc2aeb209da45d8168749bf202b7d7751a2c7a6738b0dff17d8ed462a2a4d03940f089083b3e07113931a991816788c975e884ed4fabe62624354c7d7cbbb444f09226f28bf4c88180f64406dd0a9d860333e34601b154a0f617b129b91b798f2d6642b1b3f6f4d048d5f4ccab3a704884851c7dac301d61e83eb8650b4101bd0b5b2d97ec88c5022f0f15f227881968414436094841db6d1ba966046c9f9896f897c62811da7f10c2bb7650d2a76e618119fcf7be78384e4802def8df8e81700da1295a32a138e2020174ac7aa7bd8b333d9ce80f19d89cde515e77c87894c45bd66435f5603240a0656a475363a01ad7fc570af47536e52d70592ce4e9a8b45480aa2dcbfa1da14c96f85e04ec5c925b1fe7a72e20ad432f905dad4c272b7cb948147daecbda602fc461ce29574a5feab8a23c9f5c9530f4de936aaf119781321b8eb04fd221123971631c97621631d403795d5d9908aeb33310de43fea8007077a7acd121ce220cc548aec560ee0fb11777ee0fb6034800a009353c47fd8d9f59fdf1812f0e6165cd6906e559d0639f2b89305ed45e9de8ab19564a549b7d128fa38685eba0618a16438b5e899b824ab31a49706b90bcb5c838d18b9e70376a54ac54cd871a60c49d283b19468ee15da356cb55ac7aa8ee6a356dfb951dbb8fb928d79cb39791ff85032801bc21e98725d3fd417d948194e8f93d330586082493206aeee5f672b47cbef3d769fd4c06e2adcc54b93df406d84ef63f6e8142746767963f1e4031a9e7ff72c05e1551d2626d1472dafcf890c11f1baaaab1bdcff02968609f6f4154a817867460ffa14261ad963b2976cd6d9944338acdb4a91c2a15a421d577b1f0cd6eafde870d2d1fcd8b3d03873bb113f133f2165785cbb4ec4b99137a4dc2db3313338c4bf136ac9c39b4053ab91a5017676f447a5ca720db1c5f33ba2e0203d82562b9dbfdd0b5464cf411a4ec39ff798b2abd5479d68a18480641310eb05c1fca5bf8c5132330c5c54bc23c7913e2b315d9a8271db1b621b500612a25e23482623e037b0b6773980a4275e42c137330ebfbf721a39196f153b0328130c0b2aca7467cfef01cc4dbbf9a8a0926c340a58883e4b0b59b9afe62a8c62d08d18562a4fd95a6a3d70dfd90fa1a15d6952d83a85dcb3ab079a91ba67cbff6775082abd4ab25e8feb4e83857e5eab021ae8a4505dbe7a3dde2d36aa0ebc508cae1b49c818f5c7165e7ff39a473235a75a9b2333e588211d0ef5e7129d3986e9e0213d2de49dbfb62daf700bffebc1727aa70907b77e8cb713c6ba8cad1f0d0c800864d208c935343fdd3740cfb370faac2a80961a0f3b8b35d0447005fc0e82022d949031d5062d4f8aa744cc623c4d6d671768c62cc023a0a2461b3988214b8f215ce83ad729227f4a3400be99c58bfabafab8ad4af06c17e28a10ec8f8af06626e1454f2963138e56c19a4f6ac189a552f48179a0605425fcdfe1ca7a403cf2297e9a7392ef35241d75085a64983b8d68eafc54dac726b6d84a94e16874e0860c6f472b3b0981400901922b07f2fcf01a54c30cf6825b20dbbe1146991b852c1a9a6878a7f1f43af6a26a880f0798ede86d0430bde95fa493eb91880e91285f2230058a0cd7f392a407d2058b56af8f3dca57b484ec6ca4526ee5e1ae36f79401ac6be0ec199215cbbb9342f6fa48ee5fc2079c21a44fe98d901c0c437ded112b20f9e1d14722d0a1a6f8e3c5ae5542b664e996bbac6184959b6007b43d9c960561005f6d238f5d3bc6ce60731faa20b64e59ac0cd270533f6c44cc6e9d5bdc057500afdd58bd889de4b82459f36be31db8afb91574243c8e1acdb67828f1e9183add21c8cbffd759306175151d5c4fa4f472b2b75c86e3e25480cf56c48ce4141595fca7a27e81a3c41d623170d54577eef77228a740c5f72b306348fb220d2e48fdd3a7d964de9ba0cf246c99d67200ee6e340a0c8367579e674a4a5f33512944c67f47c50e3570a3b47ae1929539f12c92075d326900f390b576aeebe9e6094000860a65184372332c28dfd700c53451f69568ea99c67309a4f07fe9965e12ef213d1b038709b1befd318e147d81e508fb2bdef04cd29f9a67fb0d4a1ee312e3f5792c46144ddb8352c4f042e61ed5a9a3850fd9850c9c7f1cf0630b3a6a1ec33bf3df6527fe4b12da199a1e9f94e31021debbb6ffedd6f10b71a1cdabf91e082b655ae4cc1d2e1b60ab79a92a5885e534006c0bbc303120f2d6824a10f10bb91d471511c9c24acf37c1061aa87aec6cf9f3660ba178576a0f482364dfbd15bde29fcfe07eb227db46d853af20da62ac6469a7e96e1e1d423177fc3309ad15ac488adaa1731baec815d86b4dfe6804690606a8822238f26b3c16b105dac12757991e46ac2def906b4a5ce65aea1d35ff0eabeb4f0845f583899205f33925087b24680062abf2bfacce5706551a5db92655b0311e8956ee3bc0d8a34b4a83244d664d1f71d3f4f807e7530c496f3504363d1e2462f35204e1b5fd4b7592e318ed8d0ba6c6cf82eea8fe98f6a3bbbcd3ee9c6c7672b4cba6773d47df0686b3051385b0d91358f0e9c73f6e71a93c15342fc46a0aaabf3379116dd12f95a2e30f7168937816ce74020682f78f0f15a4eca7870bdc17d4f0b36fb6db0eba34a517d878fcfe8f2160a608e9872198e628d47f55301e95e72184f9232b641a9f7a061c56f08d53de42e7f013c1112f76d21023a517b7d31548c2eab75c92c8d8311df000ef658c3423d9a2689069ce94d84a3d4f0d22781c03580962692d7776b4189c2722e1d652a5c109bae7de3860a66cc7b24d72860e3f43e9d0525bd21c9925e3b3e4130a73259fe1f10e44eef6a44da0dbe5f23dd48f8487f0bb7944f6280a507cab9587d26c812f6157deb1f312c53454e855a178d8282c34d93f20f06f1ab53520ad6cca61d9526c18ff7a37c60c431994b63d90fa5a7a16e4d34a1ddc0440c54904a6a94980e95c17224c4729862a9d26e7148fcdd79479f431732ed609664b7264eeacdb27c0400293f46c5e78edc80fd0d329cebbd45774ec88a46404c02b85d4ea7fd4ad0af626ef8268dc528e42d88c78c30757b285f07d2391fc0a6b4b8a4594c528d07833f1799e521fbf56aededc873143d5e7f027602e3cf308e4696ba7074107e534a1a545a613362eab5fdcf4a7e24ed0131349f0a138ad2d06b11d96c5b243992d1043952d17c7c4e294863c4a935fdd19dafe178bdc722ab0484766b0df419faf509b15a221d03428158513c3976eb5fe8d608ad3cf2b288fd1cbb13ef5861622006944f60a12f6bbf6bea0716f0814994dcba71de0f002b63902f9a23d06619abe4bb5eb4765dd8a51dbf12f94deaea567e45397211818ab423556e04576e23da8465df309f46b735955dae455c92dd8e9a1108a41d50e8efe970196f109d249c781077ad9f6454fdefb125ac4018a77e78ff1dff9c106f125c8952b7af0c9cc3e31879428adbc797c0da2d0a15caebaa50e95d965d80f9e7ccab0c03042033c2324b455283f43230e429523ee4f5959abbf2c434df007b5f1d715595f140e0c8f40b7ea9e7421d20fea459089b89dfaf43f0c88551b27a3e65b3945e380221082caa460e084b04aa109b767292d056c9ee9f33d5cb10b1b1f59a0279318cfde05d94c06b3fdc481219467bb3bec6bda69c67d53ed402be155f263eee937cb54155b12136a89a46e1734f4deccdb583e7540c400dea115a04cd09b2f88dbf70ee025cb3683b16c9e4243eda18272a727ef90ac558262191c9cb273d4f774631c1bc62857719ca60acdc1b962c2c94e43fd2a7fa99d5f0ecd0b58485875e38d85a12f1ff83a20691b7990b0fdfb562835c47435700ab01f5cd6728582866d6417bdad24896d682f57327f3f357f92e231d7445a88e8d62a31657804bda891fbff40aebfa7f1998e0238556c88b06cad3e4649fb8ae0561742e4f0a5470ff1d960765815806655e27dc35a481884aef885816125ddc6eb204e45cc9e3a72bf6baa8b8c842c5fa47837fb7f939bcd87abde3aabd1e81a732bd2dcf1d6945a33155ae5040e039f4873ac6d10baf1a9e43eb12078833541b2076327aa6d55a090b541f4810fa7b8884ea88c34ee43cbff40d44adb4fdbef702bb488a88099a373799583c0cb80dd2d248b42ee1b654fff03b3806ee493b2720c9b3aadc29bf471698a900bac7456c00b3f89e208250d841ca24424ef4c6e3b07ae9aa5a00ed1f766b7a929a6de5e3a70dbab9c142a3510bbcf84f88c347400197ff4a9f7da8346713e664a231959802d7a6cf75c2a173c2db344e6d4a5d56f14ac840a76697737e218df841fbb7a8f3f08513b3c542e52cc31b94ebdc443d1078b4decdf9a75e95e8aba608d33431ec59b57febae0f555880e116c692c2e9f1a9a65de6bc2837c768c3eb51683d2847d094b175a879ed511e66165f1de8abd1dcd23cac7c1ec82d9a52e308e963a77cf65dca0f0db111d46ea30706015beb00ec729304e0794895cf4c9ffee381b9dc4db3fc4d44181e018a6ee8000b868ef0f6160804464b254d14be3559d4caf9678b5de7b7b1a7a9070d0cf44ffd032e70fcc92e5bbd5cf184b555b97e34c458f87a09abe6de3908048bcc6f5507a73b2223ecf3d9c29f17f00bdf6d61e208cb9005a768db218320e7e978fc959b55e7302ac695dc17885a23246b49bfd619e57d49863161c31abfeaf8f8cdf8833eca414424e4e8845f127a575087d5913b89395ef2aa55d3cf8b3b483f396b713c65a0ba185653e2986e5115071a047fcaf0ae1fa19ae7b04081b1310982d392383bb222ebfa5ba52744e12a72513e438cf6d03af216476c26994891acb28f59838741142ef12497861ec13abc8acbb2466268e8caec8284202d03fcaded555ed974b17d41c330f848d0e2f1b5a9108855768efac063c9920ac12b6a879a08948d0f9200ef3f75da5f41b2f543761bf7d0d86e56cc989297922460db73a03ce84ccc4030fa70397fb5ebc5cbc8f6cf421f23c44bc6189df836d6ed6a0fc78038a5a8608036e674999c34a70fb35b8465c0d6758728acb8d73eabb3ac644d6758c0c73296083f3954c9432d9ed6c71996b021695e7d65b5375b2895a334009edfc2a6919cfc3eec78ad4b9287987f1299da8bedbec20a505cfdbb44723d4bc3cd2d1fe12f00b19849d6f72a610abe23dcbffc8ade7ec3bd0317af222b65c7ff5b5495220fc13e5cda3fa09da3f95fe2d8d76d6e5445d3dc1643b9c66b9c7c8107ed50a0a29b31e66402fea924c509767ad063dfffa4ad6d54d7f58544f1bc2358feb112f8ea19d97c6eb91cb5f369ad9b4107d899d1cae3e5c724bffa48b87ca17f35306d3812384215d1abf008a7b907ad0858d50c125139dcffeaba4361b7f953f6a03f074cca6df53e91ff16c78827e83f0ee880f4f5195310028394fa5c5f3ba09186284bc29f4b6e8416a138505cf499953a2c6c8ccf9a564873d76e865c9910a20d228283e2cd33fc3f56c013a8d7d07716f9d818dd161199b436dd88262394d1a87a38a541a85f8b7eb998dd13fe030b3724d081dea153fce02a84f5558de530c44755f6a9881fdf2e0ace74e8717b9ac72bd9eaaff7885cc06859aa9aebddf0ef40c17f2d1a683b99702ad953a8ca9a51ec84692e1aa88ceea09f4bf605ce20b8cdeda1e3a28db51fbc731c8849bf745eb4e8d856bd9693e77980f418550012794cc6d95b22716d9afe4d185781264b1192ad706040d0e15d4821e30e08f34048456ffd93f3155194cbd076c24c1f5684354f0739143b8211d2991f08e454427e459b107a71f3e0b5f0606c9daa4b4dd3fa76c853bc858ee103e50e7faaeb02a3421bd55fa8a9e287bd2e05ee9a2084aef08260f837b4c3013fe8e3f6cf9420fe4d218ce62b4da5abae4361e0e5e97561c9d68188229a44b345cf28257cf8f053e9f953d6e47e881c8cddc7c1bbfdc923ea870e8c241ef5e7902e730fcf0292ce2643a1ee75a36fd97025cc20e150b3080d378d6046ad87a77ee7263472719181de493b6074cf5a8c4582b691c75bd21d7affa7719d90ef574240bfb654be3072740670a8f778713f5e79fa0343d7c94951d4e1dda38945c1f1c4c79b0f46b1794adf40742c52f886c76405a4e43249a6cd0ad084b03e2523c8631e348666d2f48aa9e998b93e0e25dceab0e1a7ef1a55f7c65f19211cee7cc13f85450317d0b12dbed6276515724929d660a69001e89c88430b48d4aa0c27214317d9ae2931b35e51fc52919c6c6587d109f3ee90e3e0d362188a26ae5ce80ddd83b702b7424ea9db01b49731ecc57445d651091b4bbe3d1bc220b3e5185a8d49a1fe80a831ea7e2fe521e3e04fb11b42c2e4a609ad6015bedee86f0189457819e71f14c3627b9f45f6ecc3447684d160ea4ac997c73642271ce1e6a46ecb8bde88038c39d123f4959a78f0c8007855cab251e8d3da4d630000ecd9126e6833d63328a24c422fc59d9359e12dfcf27d0c5f0199b4821e3cd1de1ff163fc49a9df289a9974503df73519f1552e44e1a98569af102affe855d8f39d6a34742ab7064c82c88bf08e8a01352a500a36f795cdc0b4037aac666c88bd9871982bb6ff04dc88a5245039e2ab2ad19240ea285951e6177b10884632b34fad1217a07b38d550559090520a9e1b863b056838b479879f1895435aa98220a8f9a6d76db3473a6d3847f65040f7ba4d761ee389d4da5f3413232a7046c0abf5070c8b99d88e641b201f5da1c9afdc9edff2bcdc2f470f991089f05dd50150db240ef0f642d811eee33b99129b73f096d8cdddcd5859c0d2e197a96707b15cb6b3702c6682907c8688922ee114ddd36d9907ceb5259cd5bba0084a436ecd1642d23b7f66c6ce0c64185c7d8258c977a52178a57b60b41ab9ece7b84aae11bb5950bbff2dacda0d64240fcb40409ed7a53e69477d230f149529d3fe6428682453d6251fd921c8688547eedd51b5c68844880751a48612aed8826a37576d2bdd8005f765ac392551ff70cde90073d7f0b5512a16dd2034c1376a4080032dc0abe900746558ce59dd2c4d231a706d2665067273dde3df674cfa4ccbadb598f42e13e846fc4a22035f9b854af3c2500eb992c01097039140dd976c37dd9fb5be240f8f89ffeb634aeea48d28b8c04660eceb21c793218ca51e92982bf6e6f26922df5298239c4a89714e8a751cd02a659df9529860a1514f1a38629a5873ddd9b6090e6a39a042002ede0e9cbc9296ccb230a9bae17171ba4ef5cd6001157c8984f129d7b7a851066bd1fbfd5d40418eb076677587b8ad3f0d30aee8b11a1b309a2a4aa67cb340ffd2c851a80ad034548f1cdd55bceb68bc6d92b9b9d2a6e0fe0df3fd0bb95a18ef580e85c6b74262443a276a822babfcf27aae1c1c34816f3ebc80506330c8a1061dab2f6ac40053a62579fbadd88d3554c4ce5b6831fee23a3a531d1ba63e53bca00bb43fc391d63f59a67199feda087c1165c1d5995d0720990e89c48cef7b25de004fdc9190a298c67c460d776b1841fb80ea780f7df5acf91dc80087a3ab194c2a97729c024e42668964e26f5375a7fbe24c1520643ad2f349fcaf537c48bf433f5b9a45b012ebda2247a0f0bbe48f1b1d0e846714989b47d6f92f0d88f5c8739a31bf4133023e14fa286411665dc848f4d58d344698847724fc929854caf1cde8ea0d09c07b9f92374962f73f2d1f40e3902cb7d56b15e7d0eefcb961882c0dde1878b362784afc69cb0794f0fd51b61c1b9d03a02fc47ae558dd9f4deabc27b59977f492e1614d7e474614fd8dbee719e0f69a2f0ce128a6f34032ccb3c35f82d313e590947f4f99ea483df92e7639d67d072741304e8e0bc74dbd0b23f3cb45d85a3bb26374a4396eb3b6a4c00355fb8cc775aaf6703f201ff59b1b4f27a182df262d7089677abe9ae5698d33b15fb7d4dd4ca5c3d907daf4b549e07f51ae0b484c99614a72ed2a0e63935ddee0ba964ae607aba417e84221123ab810580d225047f4929582b6a546e716b2b9c090d4b9ef3ee96ae81e494a5e9adaf4e9643b9612c332e3cc93d565710a48f6e2090808a46e14fd79075d0a72f700e01ecfc85af725a14440a5a40c1004d11b0332ca006e574f5b101aae2b380d39a2a74073f9506bf2e0a6db9e9d44f3c0b34d8f4691cefaddac68fe1f4b9217b8da1ad1c6832af7516ff283f1c24162d5c9d43c6535af3b663c8f6b317999b5a467360cdbc798b621d6450be808681e1ef26c3b9b41b45b8f6ed4a6a3595a19a15eda260e91cf4bd27cc6c4a9a88936d82713001dfb2cad647702a2bc220ae6081bbbc13c83d4d4e062801150d72d7e5118df025a8358f40f4210d7ccd0c64a724bfe36e0a125e3f2f7a19d5762c83f155a224598217f7bb4e7888d0aa934e3093280e049c77787906ec5f65b531dd8523c41c007152ee734bb9f3b41c5ac053e08c2a114b7cc8570dd2060156591ffa67b27471a6d3670e9084e2723e81f98deedafabecd6903aa119e5a8e848c7516df9aa6642fe93d368010ecca14808cbf3b997b04f3bede532447812f18f9dff221fbe5c04e44c2a574bdd76c15b1f60c84093c165abd36b325478cec46b35db110fec226147ac00e55ebc8c2d694c9c5a5a94fdcc3ae9bf905c8a7aaea5c51011c79bf922985e92c6e34eb378a308336dfb376803039ce0e234d2d8a3a1a0ee6b3ccfed7b2e36176bdf444da598ba702c752e2fcfd2e98a4", + "public_inputs_hex": "0x25832c071d6d99ad42c7b885e48b10100726dc0de03c0a779b282c519ccf538a25fc312a5f0009edd084811b739bcbd529987df1cea36f5a2451538666257396000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000097e089d738cbdfe4aabdacf499858d5d00000000000000000000000000000000bea27e9a0462c1bbcfe5d7d11e69ab7c2208484402633db0cfcb2af11d3b66ff07cd7b6b12c3a35e9581183e399d53f710ade7d9aa4cfe74bb36dd9a0e12531b1126fa2403608e2b7d175414fcb9e2f31dd5a66f5ca90ea104b52c48f4a3e630f174014acc8270d5f4dc613a06eb6a3619654bcbcf5e533790d9be255bc5ca90c779d6375fc717d27349065da5753954032f128b9e186d3fd9cd5460214fd5cc67db90c397056d90b3fa1e1e93174c9904fcf7f4ac91f0dc986701c89901fb7d914b8da5dcd57d430d860c3979baf98a" }, "decryption_aggregator": { - "proof_hex": "0x00000000000000000000000000000000000000000000000b848f7067da04597300000000000000000000000000000000000000000000000cfb8eacb33dc5026500000000000000000000000000000000000000000000000a140f61a0ae7da9830000000000000000000000000000000000000000000000000001b35adc769dec000000000000000000000000000000000000000000000005529748f6a3df43120000000000000000000000000000000000000000000000041e2b70da2e142a38000000000000000000000000000000000000000000000002489ca9f8182b061f000000000000000000000000000000000000000000000000000069af3676bfe700000000000000000000000000000000000000000000000bc2f7c98198f35216000000000000000000000000000000000000000000000001de57a498803e7aa800000000000000000000000000000000000000000000000e40fd6827d61103c1000000000000000000000000000000000000000000000000000084230bc9e5b600000000000000000000000000000000000000000000000c20745ecc0a9b617d0000000000000000000000000000000000000000000000098615242b257ddaf500000000000000000000000000000000000000000000000d98b13f67a2b6a5220000000000000000000000000000000000000000000000000000df689a73e63b1a953e2b375615edc3058e7d1ca5cc4bcc12d1207ee7045581b3b6d157383acb008447d2b42adf3a25787526050a2c464130614c700a9cf0b996d758e0ea3101207ba4219ef22ce8b381e24a97633135e5ae877a3905824a6b2117d2c52adb6121f18d2e4a72128ba85103c6084065a0a957c369df32907adc47c59f3457ae3524cfaf1eb600e22c8222d5c7f3d05b89dfb6a6252ed158a263b28cf1d704e00722d53425971fa3915cb5842157f175ef3b6c978bd686b6bb911469c0a0bb04e524323ec504346fc6d320aefb7c8a5aadf1728b7a7598f38ee2595296f4aa053a27c5f74b1cb2d97320928bf8e5004eaea31e7ec579c77a628c4d06c323adffc62948c40c873573a3a100f76bfd152510de33a30d61a10d2b6d1c93de13958e1c18776cc9836534e19b35a0f44676561fe123ab6651f2926973483bed88c85e5c1ed56dc8a8651f15acc31d6d6bcf2e97b303b160aff49148eaae0a509cf30cd9294fb69b8ae360bd1e988a8fd0b940a61d4811e0e8b18fb2e137aa4e76109a151c5d96eba7b16f7543505b2e217df4e672a962b340c011df2743b79be60e0b0c05a2155c315ad8038be74112c3c0a11a2ba8bb424fe02ff440851c431f3a0117298170f8e7b02639cab117e04b8477192bc4e2feb6dc7d675bd3a0e09017ee842e52ae8728ea51e4a18da1ff28088f42d38ff18e60317977213e9c0d60b20d2828872222cc0f34e17aa5c9267d627f4ac25bf6c7969cc08f69079cc5182cf58c183cfc115d5179470fd7395d888cfca34a1913a3ac918e490bb8231b59359ef909ab3830af8794f8ad241303954d3f8c794969cf24f7f171196fd1267895e1e42daea16482d70b755aeac34e0b1442d10765de80604fff4fb678bc7f0400f5db1065748acf1169718b09f0aa0f601350f0a894f8d32b81d408c6d02b1906426515448f4e0aae668ea694fbbc2a7280df188e758dcd850ad11c7fa74268dd35f910a27b4c1b260afcbcd7f6837d48fc77d4a6da0cb7b8500247d05df4e3154c3024c6488ba33e3fd241db9e47eadb5c7ecdd8246a0532a85ea5c12ad12077537a256a2e262e3ba7450fcb7709ad3b2b9857b7326ea74d55f5ceb973b149f8cf7e0a8ab8172a80b043633b24ae10967d6489570114fe7c5bcc2419711b7d4be07121e64aa42315eaadd92cad2c7dfaba18ac683b7ba27997eec1d15edee22fd752017f1e3ea133164724fb9730c4863fac6f3c79aac2204d17c154dfeaa11ad78e1c9c38a7affeb9d26b70487b79b739b2daa0d2b89b0a57de0138d35875d5fd23095e676dc7daa828b9c87b55c7a3518b138dda5947ad0dd1b14a160547a853850ac087cc19fc4ec1f18b50f448df96d3b691645c3f02ae58749b108889cc72921344c9da4fcc45375fc89d97646e8a7d8ac9fc1507cfcb38fe716ca264c886db2146a1ccd11f884504c374b7a78a3396c92c52412791af6611b89bec51c8ba232444938535ffa6ecb26f8768571cb60fcb4e413ce7ccf34fd796bee3fbe9753322b0fa40c4ece2d11c0a0fbe4caf01ee10217d9713e3da320a49d2e44fa046fa2d95725fde9404a03323ed83df779d69954a6159ad108a0cec3860d6790373240e33e2916f05c0e22bf7ef3e1e55026f54b16bac5918c42a031e3cd75368a3ea0911eacdce98241da2874f049bf64456301ae43029d846360fc0b7157f3ccf9c2a618b5f19970b3569e8e6c296cb17ded8d661167462409d035d33f8f410a1af1c9d7c94e3a65ea5bb07307f1472f9bf7d3a77d4d738bafefbbb37b11d76a8592e9c374b65d060a6e0432b1e507bc3121a282a9098f9b1c56d75ca6cca35104415bbbb52c70c65afa557e9a5bda404374ce6d4933c90b2bb75b3ad3579f19bfe2479c82140a0b2d0dc1c358799373f4b0054141fdc63e26b4d40735cb98b412e0a92db0db0d383f17d1a3c5b32c14c7e00ecce12114b2a14c522a007a951e5d02562699300507e2202c4ec98a17de017c2a98f9f696f74f012a63e0ddea2b4c40e88b9ea9eba8c6a614ee3d17688edd8bfd425e968efd6e41f18fa4212a02c471d1fe5f93f27bbc092530c4ac6f2ad3a6560773c63da42312ebe80209dbe7af5221fa153635f616561ac1701355d572dda9f76e1858ec211a1cddd0c571472cc1524e7a358c86623765427aff53132b5a43e43735b0724cf4f7888341d96c119180e1cfed86fd01c41ab9a7b9ed10c57679055a8590d57581a6d0249971f93e12e33f3c568d000fc1ed9f0f12a741a42ec1a40e365c1ef0da413aa7292fdb61c0e994f53d3698d0be3dafb87348b8de14bef041dc9e7928909858239b791c7981e35ba93a4550b707bde9024dae26188c586bd851e350ae151480f3b787fc3db0053c854ac64e45cfd0c7526783b1d9066c34520dad62fd5c2195a94f05dcd90289201e5ef356c1ef34c84a1f3908211af44c1a9e44f63c34bc1077872f831cf2d6227dc6d78093ae08420e2c0ee695b9b8876fcbe7a5e27f7167c33cdfb5d3315023c8573bd927cd69c7dd64f6725215180bc8ec72d43dbe87904c30e01fd9e1315d81e115af8bef91661176d0d43d12c5281e09189e4fa8da6ef31867c5e49229b5e9f1e762ad2820ad879257ae7d089e7c29665fe3350109b817b2ba1cff502fc48497b60a3fcf25520e674245d397e728388b0885fb2254724111ce886c3008b363f7fa3ee256c6d2b66b2ee8ee6706129c381a305f06e0bf6427cb59d072472eff3c40da57fa40bad15e9c5fe639305d72ea09049d2a4598b72aa20bbe11559f8a819c5bc7278828b036cbf3cdbad90b31710103fa95493a3e1d95f14311b48fe60856b93baa932b1264f8203a3c78d7c04f10295c5ee7acf6d430edc2028a04b182925feeca261c0d7721177163c92b273fdc65ea9e8dc8644588ea1090684ef3bb32cd09380e7e12c59b402bd772c4418952cc8a294ff4ff1e46364041d295cc8f55949a82ae31c2f69523f349d5a258bacccd74e56231e958f8fee981ff582ff63854b92917c9bba45cf614b18c5b4632989de011ed79138ab62362d26ef1fd5eebd2afa99b676fdf9ba3ca972fba10c25aa0cb6dab126aa1a390be51ea1f33fa64b2d28c185a7a108e7dab30c1b6294c066e945d9eb6fec0dfdb9691c8121fe3c63bf90063464f2d891bdd627ae213e03b80d381676e921583af3cd21a651eee9fed187b8e69df4575045e3917026bfd4bf22a9aa5c680ce3d5cc0e0637807164449acdb6f3b12ac057411106e158e043f2ae60fa35ef009d6037eb0a92bf7d3b84212cfbf3ec6bc236b7821f0b17152ef2f1dbd536790d8060aaf81de5ee880095e83cca416a8783a531b8b9affc26f14848e3ea28aa826521b91d20a4b663e9fd51696ad6dcfd0068afb00e91ff5a813da0d09e4e27ddd02d477c294acafe501df227625d3ec378c8ebce32a57811927421e2e173efe6c0222a7e111dce77d8ff4a253b43bb277027570fc74609252c0c480a91326a694214312e2f5cab400667c72202f583340647f2910a182c44d174422c75d287fbed54792a2d54d768ea9152152da70641eabc415a78251bf2cd430f248bd5e22089e8d574231c9823edd290fb508e77034dc2f163bdc0126715cc646beef40785e43a7a6c10fad4cc07ac70c73a86c05ab097eae1fa23091df78485e6c00c7e9ab187eb8e09177ebd746640f923894114b8a1c066370d18c21cd3f0779187e04600feb1150e3812fe80bee8cd54a1622028c75ca001bb037e569533f3d9c127b688309a0026ba070ab9931c737db933bff1d7feff03fde071d5d47462704098e3f37e18e509b1f0c3190850f84d9ce5bef54dd7fc2f3c3c578ee43c40ee92e6256f605ded019e527d4b2c3f5e4e29cc85841ff0e94697affc8a31cb61062bc94a0e39bb140656f880eae3933627a1239b9b85969b64e9bffd551162916a19cd0f363259ab1a90ab085bb36bace2486c4692d034964ac64b049d51febf49b19dcfa5f99c170b17bd9df0b4b930338d1ef2d5696406b529fbd7dc830fc8c14c6bd8c16f00f1253c1e478d7e88fd2978ba0bd327c11331425cf4b985fd58b14d879b9839e0620bf079427cc9eeb05626ce30880a78ce60ae4d6ac366b9102d69765aec3752b40bc86f3d0a057736d13e3c85e4713dca46a775894be6a86afc029e0f8a76cea40f2182cf1d36ca720da6d2b5b679660c5061add32b5fc152a820b782087ba66b0a07809344a0134d129ba7f4e19956cfd5c47b410b7302525494b9a3e397b51e3039ad1ef896965dec0bff9b358868014c10ca1fb842e3b901b0e510122498551f2e9d7794aad63d358a377b42b0c6d1d78415abe68f58df1e04dc5bf11769b1051f90bc0f3e131d24df2c55c2e7050e7d33d22ad39e5db73e9af8b1c00128081b8ce0ce2a9951c146ffeff3e1fcd55fa601217e3da2193448fb858c06be8d3c1f7e565a2e821cba698bc9a13112bdfe25250d3823deb0e7a8fb419d9e772a922eb38484d054315f4418bb9a05efd6b9bfc3e5ee052f6a7fde779216815dfc4f13478e9b3d87b0a82f217cd9b0e782f61a8697d5d6707d5e0e04ae039d32acb62cbb49c04501ac0643d2524d3709215390667fd7b63a2c0c85f63f7a392074fd094f6c07f5ef4742de0a6aba56f4b16d8ce2e6f7270e5906c9cac6bbd72e0440214dd6d3ec8f200878ca27d4d36ca018bd7d9092b0aa1b86e6ea37d637778c3808dd56099b383a37fe3b60526ab524475ac22dd37d44a10380cf05c26d795edf159e18b8e9e07abf492f5ad7031ab13106b34b66be1ecc8366bb6933be7233d02250b41b4fb8f028195bc6f56fb47efbaa729680c0a89e3bab9c2d109baaf5231fed54a986f8a867b839ba0b3394cab7b638f79fb5fd0003bbb4f17236d2178b244a32093464ef748333651ad7798fefe65c89e14efea7bf094f077db3dcaaa2153a977ffc12f1b060c3fc74f4cac4c8852b1b86683e693d11c4978c2879e757056e7665ae4ec522122f631b3e7be0e247c70e498be722e31864c30b9e131f00069729385ad3114bbf616f1ee7b0da8bcacb110bf9e27cb437bedf1e283c5261008c0347f73b653e6bf9ac59c203749cca809dd1c666d128eaa074865773063400f1a2f125d9711cbd61c211db9c22d974b11205d2af4aff9f8f5795a2aa02991bc661edf40dcd7704f835795a7eaaa5d2ffca5a355400fd8eb053cd2eb201b72cecc94ff7c922e1351c74bec7068a18db3043d9048ebd87ffccbadae1ec64fa2b05d1c7370963c3ce5976f94d3c3cf4337bc97e2862c5371d7de5fbf8b08cf00a469637d69d340a3acad48ee62a6da336abe55d5a82d1c88e1a4cc0d64019010879351b300c0d4f5c8ec7593bcc6a9afa75eb0b529fe079bd4e99238be11c171ced5a0a55a72439584a10a548ff26452e842426bd0572527c6bb2e48b5f9ecb117d9f4717426d96ddc8c4e5c2d3cf707a3a44a20e5d564401a54fcbb2bec9c81527aed8153ecda2dfe77976690a75f4ad60038a20a8287fba638619b1bd8acf09bb43d9e15613ca424fb0f4b15117d8bf4cc72ceeabc45b803d6a4657ac4acf0bfbd262fd8158150068a3e2e6e6b97148231ab66fedb12b089fbf9ac106e6d70aec7ed98cc0a00c75a21498193b1249a75d4a121c8de1da14e8f03d76530171172b24f9cf58ed5bb84c96a80bff5fb44d8276815de2b11f63280aaf0910c977015b57b509baedf1a0abb96552ded4ffec30c1aa214f478ffbad0332bf585026177219291f2a7a5d6a47eb312e333eebadb57634b2c6b7b42340883b9444a9cf0d756bc8ec5020031ab0255720813527bf9ea6fa107c276178962953db9abb091a6dfccc0ee73df060ed6671445cb8ab79645d36a4c81daf02949f2ccac2f2b50d8c680c18a8038e2e4fb9e4613caec509de7e672fea040c71ade0f84ddf82442060de941d416b6cda862fb8a064d0721b031c7579c9b917480ee6e05054b3b70b73cb22a12cbebf44319d890f99ae72567d4fea41d298a200676aed5c9c440d2c1da3167a37b4a6a2a8e3cab3ab003d0a9bd75c1f3565db7440a50840afa0d820ed8e1a347f5ed5f14306fa9d6580d65de70e3d9e6ff372855141bf3baab542143e686a3af2c0ad7eec32397fea1d8261d7ad9fd280a835cfa66015b1e27517225c5c595103ebf1dae43c83a1b20d5d48a99fdd13de8804b71a36e29bb9220d2eb9e83179fb7d6d036a24a977f063539add79293bc4b8a514db5b794b578e0719e14d05a12be872f6d6d6eac49bf338195d99a4a767b10a4ef31b8df5c8b2240e27dfa9b58ab84a85882f45235480b01b40a00c94a4f7030f0963ce2a4cd8b0263bbcac11527f42563962bd99da5db443d0b1e0033795ca9a8c7903f1f339f6255933c3493c3bf79745abbd70be31483d1cac03942d2168a4f1847170fc85d302fff1ab84401d0eab0359433eeaf7cd60090c9d81e6c8e5c07e205eb049b2f10c72d392a223087ab81ca2a4f0077e20706fab5f7f305bdde4d0a9153a4915de2000df2d1e2967f24ba50b979f116f205af7492a83adf7a55eaa247ee60a2c421e43b1b9e7b656041004affd6a20ea5bb0ef63b91c467780eb487c6070fab41811ce6b8ad866d10db953803612ed1bbf5988481c603f79276edf7e871459055802f3d0053b41b8792dfdd36153e6ed6258f93c1f8e0b8ac021b9b94f525408b202a84935cd7589deadc831c1c5605db0e200fad3e10317a51d3fec67451b252c292e7b1774e660407e5a15b34a8c9f4d61f0e733d8c85ca0963b9f22a8435baa12070dbd1df83e54b0b2a1acc4171d1caee9a39fd3c7923cc6871804cd6a45241522f4d78196ee7eaffc973e1267f5890b93c6d0653bcef6aa53b62ed9b61b841e8bab815b1ded0129cb1b38c56e9a754538a399e7800b170ca36571923260a12d6bb79a7fb8e6dc8e5b7f00ca46cab952bce4483ad5cd24ffbf0f717380323122c46ba422755404ae8510b406b2fd907d9aaeb3963a3c27ececec99a33edaa9101f93327e93488b4a619d33020e760bf00158724f273434655cbb6f8d1a975c132e4be33e35e0efc792875a03699d80227c2f4a82cc1c41779b595ec6b229ca1aeb4878e91d33f5c1f8e6f4fc6dc0272fc57bc3f5695d22c8d8c48d43c1bdc31d2da24ac5e9316f10b959e21550a2cfd755abaefd3f38123733ffcd44e99736179ac0bae52fe1f58c61775f68d32f624cd87d2feb6cb4dbdbf4373a9d66b80d12eb80cbbe95ba9303626558d899af8106ced7de5ee279a67156c0a3c331aec02e87e29957b9c0ac857cce8a96e3f1df0c20d5de2919263398f66b9d600a73211678262826d92f4bcb00a9d6eb2c2eb2a7ecc4938a4014ac4c51c552607b6dc10cd7a5bd4df68a63f60e99a4217feee85660182837c340fc514b1babb8999f22252b722718ed1b4cba7feeea9e62cf1f928561264ffccd96ba25a5b2d251034805640ec7a51cd89c8c15551954728e5c4a0fb51a2eb096f42476fa59c85cede303994fab2c2b79d77b62c0e603897a38e965fefa190cb8f5a56e41f3e5d982ec1d07f555fdc8fb2ad2f4ffe98295c150230780734aa03b45309488fd2833b8381d4757d04fa792cc07684c3779d6e7925b62e7a9c7e4a480bbcb4d6fedac1f18128d5eb739d4b69e8b21071a541c26179848912a0d4cc4ff0a781cb6b31f878f02974c4f50900ed33f113e0bb0f26468012cc533c2ca3992893bab98c90ffc870737d1e3dbd4fefb3f3cad23798bd53a8582110eaffd4d743e338d4d722f37ce1ebcc857a827e17f21b11559e1967b8d77375ab7496a26c4b0b074a869f4dba80ee390a805941102fcfd60ae53451ffdea972f2540da6e0158f526d3746ad4151bbfc38f1e51d61b972ba86463812c0757425438511fb52e822cfaf6de308b220969aa9f86e81ea726dd04aec3f9d5ac8a8f17b0f20f9d609076fc00b14bd3fe02345a027a720c6e69b4a63e5e36183dbfd0f8cc4e91bbe3c3068c619a1b1d3403aff3af1b56cc7b1739136e60067ae287c98d9e2ce149030a202ac73941a6ff0f94086685820732dd374210e88b9f4b63485d7aedd71fb847236dba844137ce0450b47164a5f527c08afd78e8f640c14d87643dd72e423cf6fbba79157dcc420566c93478dd666c41ffa31c2ecd7be1dbce9d9bdcf168d4ada263e0d0f430011c777c6b3b40b46080e53d4119b244eff42c6e69ed48279af0cf4770293edaf511a16c3963ec99669ac601b463cbf66e3fab9c15d3060e000fa88e3d05bc656a1ba70800b6c5741a4423df85e4054f05520df212d9281dc34f7fb9249ecf8c3c0f4d2c8f7acc0e83aee1d251a75f8b91adcb606c62d3ede2690a94ac2278b8bb19f63535ec4947928b83cb975772c1af82294fa24b19f01347a7152ac2c3ddc62079fcae6d7b3760bb8b4c789def8284a0c967e2a4952a1a004f5f0eacd2cc75056ccd1e5bb952dff6b0d686e0518547fa090b71c61135b66143c3902bb940381e174fb8cabadfc57cf2b221173a632bb2118164ee73e7551653239d0f26b0ab0251555276a22689f249497e1aa2fdb80c1ccb10f1c9251356172afcc8daff492210ecc2afbe7e22c86e233d33094753e2d99ebb44400299bfadba8f00742d9d1a3407043af6996354516cea8df2b32a4a812e495d44034010823b33d462803f0b1a6e0bbd39623cc963d33a0a091ca88a609129f5ca0aa07564b4ddf1cf3fda284e629a09f29850659d05d665d6239a15df892595a38396e55b60e15f582ba40f41fd33fc05b2dfdcd49d4d2c57699a0ed952941b8cad789dcf07e30b681da50407bed8c5b81c23c1b3b42c545d849a58c8a573234b62976474fcf2a8fcaeb807573f4628bc97825e7f54b1a3ad043bea287e4445e53f042c4c6a15464841ae11ff27679c65cd10dc23087e03e9e29be3c1f3a2e9cb0ae4fa6854e09b9d26f1063cbac8be17a250addbc6bd7abaae71d56e594050d5c1d7df6b7442966069fd243dd956498931f6cf7cb430a0cd69c77ff8e4607c1afe006c8d74c3f813f7b41f1087a949f426d578c92f78fae3702cc06f55f93ea35fe7b8d001c8f615ce1d1ffe8754bad06ea54d0a3112a3810bf1bc5b9ae3baa0d2ab3c099718bf98bf4820658f23fbdb337379fddaaff6303ce007a89157a5a9a8b2509cb6f2e0c72114244743184f8156393fe128396af8c48d5a74dc8946b61d66137aa6ee7d4930cf264a587fdbd7aa0c068804057b2215c264c3c77663dd4cb58f2bdc2de0b5ab112b104da9bac0d9db69a448412588863ea869d4f890eb8e4faab5827299a111b42ee9463654303cd9f4dcff5e58afe88724abcd3fe4cb3168aef9b6ceb7e9b1a6156679fd2085e6db996c6540ada72d5ea0cff41cdb9483648f9f2685347e7bc512a9d6e535978c5ed0ce38f4cd903a38b3b61ddc2d79e14080166c08fb5272b52644a0ee32396a63c02d3746844ceec71816272a612ce308778c70a75119f5b0140916fafdc97b1f9dcadb8fd0735e7c5e57c9da0c017770e01e20ea42b73f771522f9921eeb1daa7e293c702d0f61b4569b5b516fca3820d31f6dd4ceda2f9728c0cfef56256dfb1a8d61cd21a3f45f7eb98e3091e05328e13e50cdbc6843ce2d8f397f0050b564b3ebd0acbafc6510b3e86e22b2d2047f8ec5257c46db621209a2a078c9dec80cc74b327642819a2f99c7be4b2e1d2199e2f2beac3dc2e5022d6d91efdb7b76b09877ceed20947ac3cab1538083c437423814930ef96dea4c15090bc6cebea4517d208e2e824892c6e16377ee7929e61d65ad7237dd82598010f7abaf49e01ec9e6e08a82c4e853284210a8c4702df5bf12123f71a1f0f5160d6794f9c7a9279b930eea4d341380919281804a4e94872273e2e5cc539c76901209f99b730c355459134fe2c0f31cf6b4588b1d44d3ebac7719797d95bd035208afabe41e1975f751fc36aaa3407e07c6d57413529e35a7c1b38491422ef1291f6a30c0c6daf41e7058c2591f6b097d9b2edde98f1b20ce6fd5aece66bea7fa2915ce7d77023ae83c91694c5f0b737add3e40e4843a6c18f6d707c3d2c85df0299529419ac1919c5bc769faedd0f12b209ccb799f5dc915a985c0708c680aa11d7895f6e24a12d2bfd0a60807702e15814b1520e87f3409de46e5209973232d01db4272a97d90adb153e7cc27dd74f4185a29398200a656d1d9dfd683aaf39313946aea52c413519d6b3bc374cc173cff10809b8909baa02b1e5159edee8bb62eac59720ed6dcacfe763a0b7cfe322855ebf7bff78973198d6938e4ffd88c8b0d32ae740ef3e56931f09c0c29f96ab6c186380f5071cec86000f7a22df3a72d0b895de61a03eac7b5558fbe848e4f10ff02e3908077f41ad02d24fd4cd0bb6b26e7e931f92d07c7fb6398efe14d166d8636b74c50f36125536e8d4e54b8ef490f9613caac20bc9595db4415c3c2220cdde4da13c96c7fc5aec1fe4d3959b9f924f963f560c6b25f8fde46885119f57a6f7371258532c6993d273a15634e653f02b022ab922892ed90592aab7ecbc248ca426f6c781699f05b94fd9699d9193d1fac31588805eb9e9c2b0f6d07d672153267fa971b65d7919fc06fed449ec9f10cfa1765e6fe32511c5cd9964110fa2e8c31067d0aca0594a8e30930f7cad4df0852eeb8f4ee0118d291d2d6bc65e845de6259392a3a23f0ebb4b8044e9b033a0e02436c782b517fd3571f5e640fc633f9eaea7afb3e5e52d7fb7ae85002bd43280e9cb71ca103b038f5440f07ffb5c07022c63c71b7b13c5d02d95611745d5e163831b7d8405c891e99b0187be7e16ee91a4df4d51a1f1e7471a4df113b506b27d0bd739504efa54410a51805c7a0c3473591bc5e1fb407b88989972bc23efa2d26ee8732f82d458d22a48f6f87698fb230510278f71e6110d3c824c27b0ad00a8cfa8560bd7d8182893afe1d9fb2977cb50d6fa56f26d1517d2f71e0ccb42622faa7016742636fb83a916407f2d4efc89f9946cc1cd1e0d1cc3807759633cb0510e8ac665d0a45803f1c9568411eef994874bfcc7931df17395ff51241ff5c124400dfcdd47389cb656691a889fe095e97f339d36646df49e57b965d8b33e214b4f694f8f0925e03fd5f40981b9286d6e407f18f92ffc8c85f83ef8d07181312b7055d28e732a517a8521eaaaa90a3ca67de07dc28e701b85c5dbdacfd5a5008b34dfe53d6fc73f30cb18c00518041bfc57d9f64b64e8678cd4c1188676e530227175b1eef5ff44203e722278bb91f98fe8b911573c39b9f761e7f73dad7a92dbf76cec5be468770a1978606c24b0d3e522f5120b693eff54d38b1d10cd80f114153657e6e4376f300f59fecc5e7709e17b7e14fe4af20642b7ad7bfe91bb0300fd5d9db6bf4df35703fe05bff89f997c274d95ccf9bf07eb5ddb8c8b8fc9c2f48ece63e29a592ea41c2685c73cd1097a2134a4c484b2b53d6b4bb234739e22abdc8030545ac4df71a37aaefb9c7a704ce293764bbbd30c4baadbcf6c369eb0ec714758cb33b4e304652545922f487f96c6a267ffd7fc0d7c11a25d6e0429608c2f6df6ef67e6390eff059329d36ba9db3eac7bca7a8f2ca56840f6141305f2c116a3db192620c0a131bbaefac4da65c54529043350d609fcad09ade9a24402e8725b3338cfb990f458ae7a4c52ccaf53ce9ae282547a422a26827d1d3dce2274e9b51112988587a3ab714f0ef42a1d876dc39e3c112a79cae3896a33d9a13072177ee6d6fea94f01eb78f935f8c9de33b62221ba77b347b9229a334d417182e59c4a6cd9fa657cc2a8667b92f6bb818b472c5d7715b61bc5989755ee041240801037f656357e6c0fa53e6b42cee535390a6876123780b29ba90d7c558da9f12d9a37b69f6f5b3e924428e8b08fc14af078a468c81f4c3c6c1e06c277de2a620a0f69e36deb8c19cddcb73fa68c8301e1ebdf39a72ade861dc02e5ab7f8ab428cab45a4ff96e733274d6d87f1df3e42f219b2d613394a1755de67872ffbeed131a535a20e7c418741bd73ca355044fa144a7936e930279ed6e3ded182d8cc61d89de26952b776cf1d17ed04d61968d07370a8d3950445b4bd9642394f003ff14a6c73f993dc9ca33bfb497cfcb7f27a2f3f2452fead8ab31a0182e3d3b70632ed9d410f61054261e79d7a3ac90233c3b473a3576fff10fcfd468e95749cbdd2add7cff11960f67ed0ef73691934d54f99e0ee94202a349f03436c695b561a81e808338a7d39286e584ac61ee5d2d94c0c22bd24bec13e7e10ef3125e2ae98301659ef85444a286a35b4837e5a034f3f1e4acfa0ae181957571788a160dec670c479afbd10fc99caf3c58705fe8f1fa7cd599743838be1e46742adc2f33a8691dd72b5b0c3d6dc48a5d7fb4bfe2e7112ab91b325348739db3d804d56d207583091d5c455a120de60438a23ac79f773c4f3a7d3f6ba689cd73e78d8fcb11c34928e9f3e2950b59524e5c978460553925ee38e93f4a36ba9fc319a2cb9554530603f73f6d43197e47255602bdbfa9d0f42763a3d7c827fe7652119d280f8bfcb1291f0c1ef60919a98e8fd034a894a276ef544c3c726a4d7765486549002b0b6401c820c3ae13077142caa1a9cf4dfeb037b575379d09bbfdfad8e9a3a65b442a2eb998ee8036dc8ee44b19765f3ad89c68250136bdaebcd6f20a64a2a996a0ee2a2e15af6c67e71250d9fb7dc0c4f5396938174d1836f598c91312cc390edbac22082e3de6dc6c42bbfc782edb4735308a414b581425c46fa1899c43dffab7ad1470b789f3a376d8f05e382e4eef5ad2f730a4c6ca71b3dc181bfedc014a3d2b00dea01112567d0465b3e605cbca12e841543e9f39ecc126724ac802fbccaa8c0238a905a0a909ba0c4d302b30dc3b77073e601e426d5ecdcd9e991f8cb9a833291480283cb121f1bdc9f638f91033e3aa6b5c64dc4006f5aae7cfd5d5bbfac70ba40e9cb25808a0a689515f811e67e7d63cc307cc75654506f44405570f452418754d1712c04993196cab35c7ea1f2144ecc1543a2c4e1591f3b94ecd495fee1c1bb846112a5aae6cb6a19faf9fb27b33277f32daa6f82c824fbb3055507bc818f96b1ec9ef2de81da729dca128fdcda775a39fab77b88be963fb242a099ccc0ece6a91d0bf6d93df0e19f975ad7da6e9f10a546949ebd6b18180ed3825a77e1c6e15d81d01398ec10c8fd8724f52c696b34de7e26ac48375189ddd503e19ed293aa1cd6eae95bcf17f3add4b4dfa09c3433fd656e0c3dadf111b8f1143a7e22516d371c2a38e182f341290fbb5056ac9f1ea51058ee260825918bb89a393502df87d475d7fc3d36b0dc606bcf6c369c51a422d9b95752543704a8d9c2ac374271e2d61cd899fffba684b47845bda1683342d76d8ee853a801288cb933b889f1446f0ad542d89e6721fae1dcf14690775cf7b2bea19715f14e2ce869bfe48871f14cafb1ebc870c16ad964b0571772d77f785dc4d116ac3ec7dd3e6e33a316d292cf4826fc7534dd40a58496a31a6698165ed2d15d6b65f4cf65a083b233081182c75c5c7256093280baf3e6039b485c966a4adc93e968128151b789e493478216822e156940e5383997307d339c3cd0f6e6b797ed3c20efa02724897beb560224117481c8293bacccec8b5930f3debc7459fa6c8e71d9f3277b14c5fa01c4311b90c808a4fdf40dc95186163f4e28cc568c5e5acbd27b7618bd0e5c9bb7efe2219af0f6204b7497060c1d9601f9efc7f317f7c6f7081ab661059f573305d9e2fd2eb51c85ac7b45341c2cc132192bc506304df61661e833aa262d3fa75e21208e014fe42ce0846f8b16168a662a57a5b55d0d27af4237a165855fd27f122851019b4c04fb5d022c676fc313ffb296a03eef785638c893853cfc602561ad32b101fd6ad5ea0fea4d4d5a492017fcad531bc307455c1b7905de3408a9d8850ce25e8e3a1e6ed3c3306eb705fe3785cb93b49278b24fb6a96793798d2f0a057052df7591a5099f3fcbb2e0e7410709cc4bbbe1b05460812d481bb5f02b59603601e677bb528c3a003004de33da4925468554eac3cb3229f138b19a1278a83d7ab15e9be54c76e61c983702c43cffc2d2e9b91907bc8d7274aa2212996a91e1c880655f31c7e5235bd1859b5362ec0d4e1c591b9da7391a509c56d6f7a331e6e7e0e8bd781ec70faec75a6bfb9b6405e5ad2ffe2acf7ab915b986a456f16b61c3f0e1244ad90e3f92e0b892ee2608af2845ec819cb196bfb2cdbda39e30bc912d81b93a3d81947e6fddc6b4f3efb313fed09e5c0d9f6a27b1e97bb5a143474d3b51a0a41cc70485edfc31889587523d0da2943be33c2ef8f1298b0a6194efa03ac29ccc15bb12ba5b38d399585be59fb9ece3a9e74f5a92249c7da5ff28469859c0770a3a910361232dad8292a99fcd4f06d55ad29a3abb22aa9de47d58d9567572260eb019429970a087a1bc0f84db9d940b67051598e083885cf0a54dd7c7f41166e9923e928060b8c82bd127cdddeb969328bd242e5043220916323ddef3e8f09c3519aac68604cb8f6cc8a01aa514bbe678b3c2d57c6a5d69459f3c6adbcd0064007fa97d6dd95157d7281574bb25d82d45f1357627bd5426b55360c9e1c022d671d7c295d43f13f84d21247c8b1ae74a060e60e8aca8c6e9520e0b6defe58", - "public_inputs_hex": "0x15c9b404c344691839abf638a132bd083b09e98c2fadb268923013737d217ad41dfdc7cb6265f100524012f038ee1f205bf8789b70b46c57463dedb4998f7ac800000000000000000000000000000000cb80a0dfbeaeb79af355a70d8f19855c00000000000000000000000000000000915681ec51465d5a3404f61907428b7100000000000000000000000000000000666965e3fee8efc43146d3b5cc157df900000000000000000000000000000000b2039cf00b2cd6017d01a8e38e5d2d102b26ea14534f288a6affb3a0aa4953baf450f69fa48000890435a8ee45258a0a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000214ae98e2b0527277d74d7898e5a1d76041a613ee74f2db890bd6db2fd3a76e9d30329528532c70174aa6a80f652ef9fb86217d722ac4e756dac8ec699873be87009de2f6efc0e2420bebb740d52be9795045be2c08d2f61c665fd8c2946f25a70037344482bad1ff4c46d1ed3887ee2f37d4bc2dd3a1c34c3c6a0b0d75d4fa630000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "proof_hex": "0x0000000000000000000000000000000000000000000000056cad7c4d4ab29b08000000000000000000000000000000000000000000000001c619e9b18c75b568000000000000000000000000000000000000000000000005d70fe88223230f090000000000000000000000000000000000000000000000000000f4d3fe76e6b400000000000000000000000000000000000000000000000f3b1e196b01bccf7500000000000000000000000000000000000000000000000b6a2a87540a20bf3600000000000000000000000000000000000000000000000daa621f0595b95f1a00000000000000000000000000000000000000000000000000008d5a8ba7f638000000000000000000000000000000000000000000000001accc4779895fcbaf000000000000000000000000000000000000000000000000668ea7d6e9d31a1f0000000000000000000000000000000000000000000000044b0fb30c4478834500000000000000000000000000000000000000000000000000006bfc6495aec80000000000000000000000000000000000000000000000004f4f3c14746f379b0000000000000000000000000000000000000000000000088dbe00e529eda58c00000000000000000000000000000000000000000000000f2605405f1946fd4000000000000000000000000000000000000000000000000000025b1f866541452ef1d421942cbeb1c5cfb5397da431759d5d9a9c317d36a930660d1bc170b4702ef125b0f2c11c7a4326be8bccade5618401aefc5255a1c696e6e85324f1050f268c15d9ee4f26e41b34cf4f0d5cfb130caf915adfd5ba31f1bcc79825f919471d415c3651ca431b5f3cd654858e981efe0855a21b2e38d123135b44710f1cab2c035e4105d4bdd3529bb5fe9188da07432c5a89e76b8f89a6fa18f3529cc0bd0cd2927992356821b6e43d1bc83f471bd00bc8f49254474a4f608093bfed179125ae77567866514f161a7684c7e6f6655e7b13e3372a7134f9af19d9f684fceb06f4c1e272c65fdd85029c7fb523f641d823a62439843c26aa5cacb8fcf0dfa10446d9cf70618a9814cb612660cb51726a62b6e43e543cfdddd4d001513e0d9529b98f6dfe08ba29b43c0328d7f11c2aaa68a41680f6c09512906652df9b07b81922552a60c62d7866bfc580eee4c7a39fd466127d0467fd96a77f978a90deff11f53d729bdcfdf44340633294c43751c8ed5297483960c58ab9f5e4313a5e58037cc3e1e0d78015e20d0d922b7dc641a5d1ea3ccdd01925140b4035dc0576c415198c1b75ba202af61715a9e087da1e48acf524606b9345ba54bc72b3447cbb24b16a9c8665ed01f422f4fc43ce9b9b4f3fd06dd1e170974b8f58d297c6998219adee798f050eb69bc48e574c8cc88e5f54a599078596ab2010dee8ad7fd671166a365ee47c4303fb7f3814118d649b5ca3d5f81e8532255ed0a010c6f264b0270b360e011a625807a323e92b639d9c82d3ab7fddb9c617a42b341b7da8cc8f2f3a68ea0915dcc62b8ac703522c1ebbe5530bc3f347537fef899406586e07d21d6e94d5208ecdf0a86971102ce7d61860e0bd1b5125ce717315f91e4d3bd4100f7b505fad6af8e3abbdd4f0759813aae3a05e90c23b4ba78c93b25b1711b9082145f3fd8aea81849b9eb991eae4d7047d7d03ddd13acca9a9777f25674154e60e060bb5c5c7be3c78c5b31e43a5c897e4caffa9f7a1784a3421260ea5aee2d02e6433c0b5662245c4120deabd578c95be23824fddcf69241423fff241f95fba244ad1484c09e631e1b800a5d1ddbc91300085db9bacef86ed1c4d3cb780781e1c9e02ad787c161b5797f8f0659efa8344be77edca236a9fd2bf7bf2de0aa7be073b7654a7dab5618a0ce0309e58b827ba0946e73ef577921924d315838740ff2f02dd4e38468fe93cf477bd8895f1dcc5cf8ad4183ca384bdfbe3d46e4bfdfc13fddd978b48eb5ae0468a16c16e3a40d52eb88c6698a26fe59aa829d3548cea01f8791499143a368cc10df96dd9383f216939090abd0f703ffb62811e52d2361b848b466597ff32c1b723f6160f5e2a142b2eb8e636375a1dd708b9593913d80d2443dbfdb9aa76ec2b2a38a38b13f6511248a7c672e7b2361228788754d4c622966be5bbb77049e05d240123925a9c1cfdb7abab0f41c94d1874090481f9110dcb0a7e51c334aa75119c70b570e358ebbe6a273ae63baf45a461b2508e220422a32a363f8a7c9a1b2b2d5d5477762295c405aaab172eeccf35f892a410c5d9098bd985c36b0c0e5027c47d43d38200babc0cc31af1b49741a4af672038927004aeba9f5a687164f44ce33aee7a5c026f2213eaaa2e1a637d9c946bae55bb171e53d2d5e5c60820d878b6e6a3eeda0199fa2608e90a08b0fbdcd80e5f445c6e0667b98efc1f4fd2b08b320aa8a56807767a8d607c28db5ea61a5ecf9976ce281908a1c40c1000f3038f9196f47dc0ffd1d74305a28ba020cd726f6896f7fe390225cd292aeac8305388b6b765ca96d911283e733663900abcdc06ef4fa7570b15b7c47708512ad8abeb9173b1e6871fbf4315c843b2ea3a91afe5b23b82139d12c032c998348c3f44ed226fe1afc990192fe8bbcaa51e4547def8bb76c8a866192b0dfb27ba2db74f99b66881b6b9259e30e7795eb7524f2b82a997ec646e53031ec3c5b8b34022c16181257ec59b0884c7b4fd20d4b9425e8bd1f375deeba525971ea65b4a5f4256dd47880339f6ee908843d7d2cef8dad1fbdb75c2ca6ada1415f83c7b02138f0602169c0f75725ccf52dfeac97bbe61f439738325607a9e255e82ea48ed8af7f60d3a6b9f4f7c15250688bce43dc311e4e382a8ab0c3dba06c7b8c5ede63770e92feeeb31591d9e35f0db391bbdd3602b73bf8a0f0e91892a7acdc0a53834569dc6b661f12588133c0782d14b3516d4a9b5fe5e9c9df5df0c89c531e0bae4e6050957ba7ef3bfb44bf0bfc1a8d9b5b3d72de063dba8772e0f21894b3966a410b2cc849d184369cbfc20a8d2e76494c73f6294745e969f521f0fd22cf1b3dead3888791fe3a073b7be51f92c285ebe305ebb9cc691bb38b02a7360b39a0cd4db80dce561d9e798ae3bef95013b7e9dd5e43c630b824ece8b023679d5122e7dc07c95c35f9e2ef131138a07bf9020d1b62c389fe33b90552304be90309b9169733745f5900911312d4684235470faca34ed59582d1e2d380f22090616478eaddb735390bf840de0e5751ad629e8413921c82423fe4626c0812b612cc2cd48365f7ad6bb8e932a405567f4cafa3e3fd446e2713f9c626c6ff925a4b25d6a356314bd347906144b57400a22f588169bf9d4f30e77b9c6126a7c26970872791915f48f15f1a6378a83f588850df74ad183e97a9c4ce006b3ac640d2a650b8f228902eed1d0c2786300bdafed28dc54498c78ea482dc2e893a60a017389725f4f281f267191e72df183a69e0902c10081a40fc3da3aed353f03222db1ac7af26d0bec38702928d402544f59e76e0bec359e880fa2843665a0beec29bca4e0d866154021b0e26dcd7fd75b17625bfd982e699790f08ac3a44f584a2923094ff82c4b714ff0dc3a3cd156e174bb08f35a56b7cb2c261a886dea21321c20cc2635ffa25ec21be53e93e63a8267a43e3bac1a43172cda46e031b297a72abd0445f4d8bb99f2554e6f539a71cf629a62cbc7d0c64a3b9dbe0d19f4b4620d83e8ad85e85da1a6a18a22d261a036180ac1c3378c125e4a0c03aab46378780672aa764d1267a28d7048f775faace9735fc5ee7afdc9e17fa5a9721e976f842f007d8690aa54a60c95bd9a013a80b59b6a22324bf2c90740967c080bcb48140eeb8246e3d623b8d388a455c9cf7f1c26b5e98226b396810015c7caa384cdaf07b549ad42aab158f69f3da72c1ea1a5c7cf00b7781f5e5b62ab04838c2f6586209c0cdf477aaa4ba459141775b67218e064b09af3be3f2a03854839a097e3a214f03e13ec21145ebb5ff5c81e1c84a8dfe3bcf4892c79d741144d2a996bd8422321999bc8e0395ff453438bbe7395e0695e49bba09ef3d8764948e1ea9cbccf2fe535c918810038418b8fd8f048d0db49bf6c1bfd553b0c394c8f043240a1a01d143cc3c50f981f3e7d6f6826ce7c2af850858753ae5454281ca9f929134e6805f200d4d7e2d7fea1b738f97037402dc6a3494b951274051f848c485d860c2812c2e371e5630f2ab4e56da8b2818468f4927c63699d3fb07611c88e0f2983b6294f3d21bd180cc64a5a2896d472e5b3383194141ee6003b2827513c89e48b0c235cfe5a962ffe156f1875f202fb14d1ef70eca3a0ea8877981010027167b2be0aed6b04ca467b3d9a477a1cf3f9759f2878e237c85a88ce01ee2f97fd97aa750f2c78111ff70bc2d8a535235222a617573f21dce2cf3dd25b70854b9ffd85350129a858ee033ad5f7fc66562f89d87afae6c544a8686499572a035e5995916e183df4a63d8feb24590f28621073a966a61699cd2377125be6043365010e08c61ed3b9c3d001d9c6cafdd4ea120e46860fbca37108a9a5b9a9f2cfaa8446a25b204c4f28ad5e52ab1695fe49da8663e90c2f797425ae367a7b4a42dcd5bd3fe926070c3ebcdba9804cd4a74722f73b0e5fef3e34743e1182ab54cd798228db6315c57f09394125bb7cba5c9d572ad6d255b4b632732cd4ec7063d63eedb4218e1f4f7caf1d3dd25167dd22623aaab18ca729628705911872313ffaf322ce01cc11c936d0dbb5b63c16ee60ad0a85b8964093eb18a940250ebda39766907bce66207f7dc441572f9677aef7a72d3e5fcec0c942e33315dc4ebbbab927bd09a2cd215d120ba8493452622c212d0aab531d9a7733ac743f52608390995cc2f752570304dad42f576fa8c181604c68f2cf87555228663a7c714e26eeb2c6e5035dc80ccb8b814f89a2383e642b8f829691753053f8140819204bd2180ef8c80e93c8230f81025fc3a42a1aa003c9b8eca00e0e3b850fd88c7e61e94d38b4eebb1c47059fd472bc0b8a3b70517698c7b74bb5e00def97185cd883247b4ddba10739fe06a3379164463d5854dd9a241327e5b419a2993704a75b513977b69b96b8fe8b0c7dd4726e5551284268a6c2e2667e0dbb3b28219223bb18f9e5af9d6709cff22b6a031590edb6b989b09732ed7a0a228a67856f391442545e2e1f737606bedc08f6e378d3ad8b0ba6db8d32942fef5e5378046832541b2d12a81ab902352efb246b2c10091c47689a425ec24e5b7f7bc59198f6f27189a2d7f42fa42b6205ac2e6aedf6cb543d0f606d543198e92acf412b5d884cf750f3b73f8897f702656901a19db1c90575af7dedd38bfb74229699003b67fbf938473413c61fb5e6c78b0878fb7a5db4a5b662313d0612e4c04a4464a176e06b478b5cf83921b18342452f324d99695dcf4ce33ff8efc3fd088f49d0747ff112006b954de65c9c8817af0ee60d9137093a9d4197437d2c57fe12ba577ea475d60906732c5746849cbc50162474e22b1c3c16e4d35f0e6a19c5ba983c4a1112f9281cb1f7bfc916a4caa92485487447bb3393167202c3696aaa302c00a8330093f3a1f3ff72baf44420392e5d2dadcad2bbf8303c926c7039c3c79c2041922c6b26504cc48eb5d12c2abd0a7515c373df38a8b44f793ee83bedffd35934f865ea07f10c96fe43e8857907000a4208a2703d320f159a24f346e3bf840260d052179f50919568d032a820df2b38066eba1ea7cffc02ce4c988b4787d58bdf85849317f0f8bd4f715314438f2237e14e38785e43212317697684d4a412ab17cfa0b6a64c8129424b6c7acb8d1cba0efa1a00b3e405602e7d00df2956376dccbae81d3faef40fca3ac6dcbf4f180f72866e5852fc2f0a5890da5d880214ebd2e79b04deda1742a1859f6f089b292e1c10696a966de1ee893258d934f9e851cdc77e848105dedf1f8337b074861e9774475e00815c94a84286c14d1e346f7da8d89ecc16a0c57e32813be3df9f2ac706f1fc284f222caf7608782ca6c7b7fd86c694a5ee6bfccf9eacdb748d332fb4ba7fb8df774b85b2d1f3adb3534985a4437db9ecfdcbbf9e0314a37b7c72205e241cccd78355ac99944501cfaf2c4ee0d0326ffcfe04e80b51d98b4f520e2e9e0f49718ba976711a22332e887c80194195721841e7490949f926bca49c0e2c5ac948fa21bb642670664aad40c4ce3f3ea70cf7902fff4b3debf9857dfc9c096ac7c71452d53f6a34686ff32984305fdcfed1fe0f995a35894efc50182965109605b2c39700a0ad4041c6541186a45e8d8218f4f4b3fe80b45ad08fdc4adf19f15e6beaaef77a30d12b3ca4303b4f55a4db68894cb4916a602f937439cb652f9b0798be3ed4da72c3fa8c0e1652baa9f88e53d45b7f1d762a91733b7b91a913790a477fe63688116c2b9f014462bf1b667c1e4f402a456bd1274c0f34236d06ed70c9b73a587e902443ce4853bad73c7ae5a937a1e5abb4a9bbf069b2ddb4214bb100536bbb39181927d13f2807691da20dfefa9459e9b0dd21bc3e8c33590686c366bcc30074314e6f086c6384de4ad088a49b786d4fe564b3e460fb97e00fd0cb2dcf6a4019d49fb759201a1509e305a20b0f87e49b3eae7218fca5f0b423824dc2d2ae4cab3aa343abe18d31c9e8a7ec65b6e8ef1e7365d2799b931a4c0b2afd800a183d8e0150007ffe345b3693f3acbb7ed7deaed961da6606e00b6f1b7a15f59ea2046f9375819019b86a5c67d16d94ed5b0d64295a6e9e9be90c853062c4bf2127f94e4398de65e83eec4f2e925f51ac77acd291fe3c4408f006040a91726760ea896b5c3dbb049108f42de5f968db4ca92e3341ecbfbbc8bd7968251f3fa3b07e2549cfe3232195b62b1b328895a777653358631d9ccdfa2f4b05199da8bd676437df062fdba92c8d9363bbbfd2cfa9b522c295983cceaf011e002198f97129a3e9981798ea7fd7049cd1514fb8163b0cb39dc8bdc58221cc19062ca8191c9b30ca4b8a7dcfa8066d6491e7e320a0b07c9b907d489911b05be0a726273667acb63e98cb324ca9064fe9a3e625634edd6683e695b5daf6c04ce97c198d7a2448ce0a0cb26b7ecff1ccbaa524dd91b62dbe5517a89643df21a01f1105aad045e0e4151c8ce7f781b40b424b1a071c214c86e28ea60d2489e594830d2a4bd978bf37e94f0f6824811131f99f95e4d63e6a0b13318639f9b78caa1cff2efa88000f5f654df97206a86ff10504529a5371babf812f2f9507b156639609268cc19ce52b7d8582cd9b3c2c12c2a152a085df6366ecab2be22b8620e077c30d95f6757d5f87a031d47d6497a2e59fa8bf4ac2cbbd7a58bb2f2aec7d8af2be0cb08139cc64f33d98e0c462602b4577ea1f0dc893671a4bee327c9b74b7db2d13ce138d323d1f035f1e3e4e0fd6eb69ecab1fe9ec5d2d3984318a0bb7e65c091c416fdf7cc647b1d3db7d46a8fb1e013a33a8f23ac33987832dd47178a51b2e0eec25fdade8e4794a3ee602f3a41f157191b3859a0b5f91f9dbf921cba24eef05f02af93c999a3d7e457d4a94a393daa7ee8dcdb9ee235cd52bbfb650aa70240cee561b03784a493a7109a40e337d51e55ae3de94bea91662a9dc7f3bf8e4d32f3d70587403d8280e55dc12f0afe0e6dafe9c19f2c0abebb0381546a5debccf264e53483931fb53449130f47d1407cd0c372637c0a644bdb8b25561bb28fa030f303a7d9bbbc6f0d2d80986a300cacba5276340a6f95f5a58dcb62d64218ba208aae2a01c8f4dfb42a5f93d44e870b78edd5bcf239888d6692eed1a118b799705f7b93c34b05ce3ae60f439c1742e22d456d35909b541df1efadd8e19eed68f1295e0e404fce2abb84fdb20c7fb59a1796b7db57ede655778fa81bdf6bddc000f06181a177c30403b7a3a75b0dd16518d63cd9e9168c7b891692816985882e40f1d0bce30a24709a075b64799d5b3e42f16d794f34eba8158f842a4b04e46cc1464e3d7f0282d9a85913fa90267ee8565d27fd10e28a2a1495b6ac494faeb9b0ba366816bdf54e694c63b753d9b66ede27540e3082b8a7172755882f56769130f0af577b8c3ede6e8eecc9425911787b62c5468a9ffea09e7257883b554d17704a23942749653ad9a87c8728fbfa56864e69bb8ae9607228bffd91643a828b31357a199ce3f2e4dc3fd57cb963d783242f9369e886376f57b9497504ebb04311eeec6e6c20c50d981fa9719fc9ed87480ddf9799ad62e7b1996293e2d57b0d92d05db41076cd3d90c81f793e57eda1191e5bdd40fc9d4831fccb2d33e8a569e009580985e29d40823ea35fbccb800afebdb2083a963ad2e72bfb0907cbb026e1224c0ce5f59107ac18b03307bf581f6ebcf3ce7800eb87b02a4d25c3c0780690a714e8aef53ad3e7ee56dc8760a1c6ac40b67dc97386716d8b7c8411f8e0fc10885b65982e9844784a2de0689a608bd2b3acb490d4a1a2a8902ffa562e20fea0b3ec2e1baf84eaa8955f757f304d164da3c8c1583567ee07a64bfa1e740f09427fa58b4185e625c869f6220eabe5b2f89ed573e76807d6834a6d93cf392b87e2911224dbd6ba3729d896600bf314e476e43c599de5b638ada7d19530fe557dd1401d2b9f08ce9d2c5fa7935c57f42fc83467dae1943d6c27882686e3f02cdaf1c23df9d61bd4f2b709fa7d2f488f999653318d8cfda4b40f774190c6ae7c68d04892a4456ad9ce39c61f7ccd63bae1f8735f269382ddab8f29590a03db7cc081f900b5fcfbc91245d4cf6e5d757439efc2b1606fbd5d2f98ee420a6b195a7322557b58063144c3b79efa8ca875cb186d97494f99c68ab9216d3a2e281d7d40f158b4dcce0f341a6ec3b566b77c8475f582af06b323c9dcc48fb8f6e4c24d8bd2b6ded7c6bafe9cb0d8dcca57887b1f03e43d8d38b7907ff65a37b78e7cf0648123971a67c2d9dd6a0138b2002ace0cc4839566f50d6095a9aa06a96083951752e8f860211deb7f9eab0bb30f442879145f272c019d2abc5206aae3924a75010275119d2ab7cef59e1636fad4e8bcad6589ba476e38ba5fc71e968541b1820b12ad654f7ebd9a2522d51d47dc5563ea7766799dd694bdba53b7bc2d2ee15f66e0e3fc5a203198545ca949fdff3dae7e730716d079ad70b35a4a3f49c32526592177f84da459ef90637dd637adbeac1f397ac1a8fa7da7d92e2057284b7afa34a03ec549f7e4965203ef4c0f6af45483907c7953bcf8c7c889f8540b93c48a746229d7a407e0b5589707b9bd26b0d13a7dbad9932aeeb8b7e532566cd92a882042b82821e5a9f5116c612818f9b586b639eba41e67d6c42528bca99a7189bbf2428231bf5a4a55bb5412bce1e75a98aae332ed95fcc476a9e18c5b2a90eac937a016a2a3d1ddc5fe9386871595a4c43ae2a5eea44746228ffb79ac2d9e4bb1d9e19cdf2ad6516c16897028def75fe6a78ff95e7062bfed70f2398582e004f7bcc030954895873d6342cbd903dbbe4b6f2f96b7d64579c9a8fca8996188fa3d9861501fe6f36e13a3c12589da13ee190064cdb3abc7143800a2098120cd0636aba23f08f43ddd021e098bfc75ed28215ba4459610ce3e6ee8194d76d83dc50cff7212d421e7d53f7a8dd7c2e1e37ffe54918f94f9aeba116460e76ac28e44f1c3b266386ba3d0083f22cf5e82672ff1bae279291e5eca52f58b928c5e2543af0e20fd256fbfe682dac42b71e11f695165cb77b9c7dab72d4021899aff8c9359ddc2d3310c8c8bcc83fd122e51bd5dea954f2970c5678b2b7e162a9d491a33e1a1b18a7c052d67d102b81301b710279d85f6ae7fb27eca6387bf45bfa08405fb9bb0449911ac0eb0b98c492b3675f3c8b17d8d4071115048d93ea92df10dd66c26523424c8b0d693ff682420404b198302eee8075c3ea7718467b0ea47e54768edc1e5bd11b2690c72032d1762d2bd386a76e7755b63a2d91f3c20a915289a334d82bed12ce87366262c75696163c36ff5b6533912e2416c90b6e307fa71935a5352a78296eb10928a01c2c4a651a4eb3d84093e27e6350fad6ead63ca737eff9ba04a9b5d17b1c78e1bed6711d5479d8d7590f3f050b7bdb7b15df86cba06af51c2a3341060130da96b435ca1e503c509f8e6efb90fd78840546f24a21472c757d0683c8408285b2c5268c325330e3e318ad6f968d606f1f6ba481531195bf905823fdec89b3dec12f3055bfb8f4e93c5756c65f5ba4fbb00e089e1780abcdd4260ad3487daa873a8913b4c45e3b7f68ceb9212a3672bf84f085d7efa6f261d7e42399de655fa523d772ab1c1977833438eff839b68adeb8fe5aa8e59d12c1d70c2ab4d524888f9758141a552238aa961345d98586a78b2ac3038c8db17f6df1d82d04959c242a3e53a402fd87da822dd33050d9629f63bc27f00a9d46cbadee3508dc65c0df4d1bc81f673be17aac5ae7f3f69fcf7a6b1cbbd3258a666c9886f229bc5e356436ac2d1f53b33a5edd19e1a77a12b2149b6a5adfc40ce4f4963a8f1a06ca726e4ac8dcb3631b1423719308baef7996d574b9bb675f8ffe769dba96276d992c218ea1f31ba038b6452bed51cdb97a78433976a53e90ae82249499dc21c8b280bd34f8521011e2f3bd49c88c90af6ec95104bf11178901157fdbc2f205c3f2f523575b57798ecb059e9c04d14156d2cb37bc8e01ad4d01ac1d8a3b2c1a85415be0a1c245d9caa40076146e69123ea7d79e8f66266677141acbb866f813be14adfd28d46f6c387185fe1ca5e7682b6e6349157ec34ac1d1c98c423c220dc47665532a35946c67453844da63cf704e5292f04b810d0e7fa57c3150759b17598d227e1b98cb744472c8235c725f62484f50516e8e3cabaf70e078e0e3a7116e076bb902491083e6e377440b879c0bcae990baaa3a8e9b75459ab5ce62d60fbe4f0a324270050f7aa5f71e5ba518faf8e7bece0338f44047bac43a5a464d1a5168f794f1a130f23dee9035b4aba6d81761a010944d8bc96679a812867312129fc418698487ba09bfe680bb002453bbef00fb05cb50134e0db7918dca367100aeea96655720ebaba10a03ab329a23cf9227874f3f68f4ff6aba63a1e31bf1048679a2ee2d3456d9682bd89129046a3bccda5e9b7e043c4b6e83a6dcf72fe40457fe3fef8d0acee37066ff15eeb9ca6f72fa59dcedd28085f02783709c00b619ac5cd22b0d57011c94a0878f8bb99e32889ee72cae1c797d2d4a885b32d1ce09b4c591d73bbbb7d4eaf5f2de94eaaa39d8ae46abd25c998d826cd3c2b24be42ae4a7c5ca9328b5da8d991067b46dd82b083afe37b7224d60d9c36c74db94ac15662c27062eb5ba2cb387020d7cd53d674b22fc4c48f1577cb2449b81886ba12eab4237ebdce8ccd34826707beddc50db68501788cedb56a75808aa6c7d4aa406a8374eb417615dc633ffc336066aa7437b69436610335e33beefabb58b09e3235ebfbc7043637c7e9c473e3297abfb2ab388fc82c067d9291e973fa7b641530370b330aa26dfecf195301ece3360465b33ad7c72e2906eae61a109da3b01a12b370cadd8bc59bca75c47f9dfb74bc9e505f82a5a421bc28a3878487f40eb18237cb2c22e928498f304584a9aaa187372271de84eeff56f4941103ca0aaaef40b3b0a7a5967383152a13470687b76ed9bf10b3c7bf3070588acc254d0c076b61d7c5d09d43f049275e66ed27775e66a695dabc5ec9a81efa1cfca62413e7c2715246a49e59a1975a1e8c5f581c16953b3238e7100df6d281fbdd12471022d211e9aa0a04c8c5e70bd1f826f3e21f03aec6849a2bd4278dd034fcab56000f1522b39c1bb9086f00b8c3ca230210495fa2eec66b9e4f1605d6dc58ca2464454e404b80261081908b90d9356638dd7b9240375955d9408ad152408cb84c9b3a4f803d4112f330f636ba8078fe23dbdf44f578540434812e91782f9c476a732cc501d8e7f8a273d121de7c3aa317a277c651fd752cf71d02e2fca19761aa849e2ee2d0aac369adbafb47aa9c60d463225df053213140ae24ab4616518ba9cbabcbe2826a8c47881114d6fc61bd001c4f9eae70bbbabcd40b7f46bf03e9247316e981e48219d24777d9e0dd124bf616f6934f8f03ec89abc05987b272f245882d0eb2da402dac09a7b9efa1ce83b590025507e87eb8a4530c77b478ce8b57332df3621a3363ff40d176d60230a289da7fc40d10b6f39be7dab90796d50bf1cd522021b7c8dad848ad2d32698805a7aaa0b7da3a07ce883c27a90f052b3f5c923c0b21051870d5512241f7bf97c74b83b88c648b7a93c2e18c0553ab6054b7d6652060af7808738a79ce157b6cf189d872c3985c4c25402b164ac64cfcec5e751adb3272894740a4a28c7f5c50e676720a3bb3330c596d1b51b40973744fab0f4066a2ef475f092e495adc50e181438b163624430e3289fa7e53bd79e8aedfd1a52141a59a4c51992a031afad71f74321b61e02102daf44c12787fb487e28f020045c2554b70eafaef11bd3b4473da7fa1171d61a148611b91e857db371a6021e02e5082465d45da6c5799563395c7cccc8dc061dc80d09f2a3834dc88ef7e61b45452aa2073ef7f495b56e50e1e7313a17ed454432a9ce4cae176b67b553badf02372fccd7a69af10c16f409533a7e7a7538d1e0604e93e978dbfbebecdfa78d812e11b390a2a02210f434d15b4a58cf4ef045d66d8c411af62d8578f68208aa70b827f8a69a1b792983f900cc2533a01089fd28ea6b83679cbff1fa567930b411b129c86a45349ea27d2850596c0bd0b9153caa96182ae15c2ec6985782b68cc0f12f2d147d2245c42323ec127108569230a4a6a796cc78f730d86bae5ba49997f111467f3da1fc7da088cf349a40e0d69d5d65df21492d82259acd9ca6f97079f7094cf842aa652186162248fc9f05e452c75f78f79f34b0ceda9d1b5bffbae06b08ace101deb3f05e5fbe700a98c259e1527e01be26cbb7aa3f2e7302489f67210225b03b9a82a5ff486478d3e248d9b0ef0c12e8c2a4a94df156b02e7175dcba0fdd5a9c960a8e915edb6bdd2596529c88f4a10ec7be746be2c056b7d9030aa31050256ea76a82ab8c18d53ba8848d8dbdf070cbab935ae371fc200aa8f858762f072ea8b58db1ee4ba00bf879153fdc81ab8fc745472a1ce17139221ab8ba3f24fae60f84f8815319eaeee9edc8dd43285aeaaca0dfa81d95923810e891d50e1f05570e981b9dbe1758bce636d067ed5d29c5c56c133e83e1545014bea6c55612c41bc021267dcc97203ebbae4be62e5f4f05c579ac4e0b550520668fb26a3e21bca88d9323106c35aabedffb98e83679d39c15bc618ca10e2b7c593b2b6e940bb54d775929f73d8e1d674564291b82a8292adef3495560185db0fb6ce8d479203547fe0a5d369e6253126731a156f003a388674cf6f1f1ffd04416edd62df101bf6fd3ac11e48a7bdee8c49d2775abcd563f4259e2bf92002ee822b6436a2e2c95cfbeb3a90669e505da14754dcff65e62d41f84657e33f15e8c3bf939faec2170671f1e6291e9c234edca69495daea06624af464327803b6369a6c536dd9e1faa338562348d3b8183999edfef72f3cc469dc65912ec86b31587856cddd7a60703129f723525803622560a1ca5491c1cab508b55b80caa329d932834aed32324943bd0827b144b4480c7403b30850fae68fd05be4bcfb4b2ce08d74afd147b2b5eb2b56bcd1fa9ad1657d3a6f3f5d0ad5a2a88d9ea287fde5b14f393355c7c218d23792a7020955fca0672dfd551994178df882d67d9b8833cc2763f390c572b2c2bcbcf6f73a56e126464cf60fe45c6b9b04474f05aee1b9e1573e12bad042deb273bacc444a207e11e8e4c047699014d99cc8c45be5db22815e9982bfe391d1968cfc83a1156a5f9211ba8e93d584d0e4a1de08fa3680546163b245bc8d20fb9ac25bcee5fc0f1b48589051ecb1856fd73f9979b1fbabf4dfb4858952d8d11114326a0fdf9729f2b4a305f5c5da2fd96789a25334ce9b29267314198d95e1569ece283d7b30452e9548c23b31c04019fbd1a7ec52097248c683ddaa69f800145cc51b9a45465d0d480a6914e57fc276596e67fa7a986507ffa4275e6c4d50970302cd091a4a8be2125afdb79384433025caefacfa08235f3f8863cd727d920d0aabc78030e70badd682205e4460eb96e24a8773c81fccd810548c7e2ea99292c5096aee3e1c3c96f0105b5e953e61fd2a139c311e53958af1e82411de02b18196bbb223f4f1f3c526ed3bda944ce929e99b8bddb999bd4d4a055a647b35a124bfe368aff68530d057103fc14b6343c9f6574971ebe03ba3a60c6cbc115c41095420da866b399218277a6a497dffd4f565ae24a2e961dada56b3fa30e4de600d30b82e9bce89cf1b8a67b9f9df4e19e98a203ad8ee0603c9b4d04ef96fea02ec5a3e0869195ac1fecf1aa7456f12a00fe30de4ca88255a5798292f8fd1ed12bd16d8770a1e938acd64621d25b319a09778ea95d5d62fa1087366893b689bc0a48b705c9c8e3c656a8cbad9b13ee4c32906f11e2e985127f5e6ee9298f8a5e1559fa1080bb2251b3433df3b369ff51198d29becad63a2662348404cae1dcf325e207fdeada5171927e9fb74abbb31fbf6f71b6ef4db87176bcf88895653a8528dbde3a3b7081f6e02199d067917d6d80c5cdfece94d3f8c8b39aaaa23e6c371173c2843e76b27011348dc6d9b1387a5ed4ddd05234fd7634c4d29c7a1aaf0c0892efbb8d90bdcb2a75ddd1610c1fb997136b361a72fa06e7dd10e0ff9deea60cf890ef3654011ec6bc245ea07272f1c76cf7da601bd9468ae7221b4c880ad5292921ae1e99b829ea974691ecab3aefc1320aebd275709b159a724c601749c52e1ccf6cfda239095cad645145801c9b4f9c2f9bf3dc5098602ba08f4c17add030395a4d37d68664d28214cb83addb4a361a0979108a8c12cf4f1024985554fb2dc77d514c86fdbdcfc0e136d2a050cd8ae5b7cb34e25f64080b100c7e75fa3c052900b6cf63b8be429867a37d8e13db462bd9a96a713bec5e8ad3c35722375b0db5b4daf2f9fb4f63cd4e8684b42582dc4df2b398e3ec51fc454c7647e4cdfe0061699e4d745a79b019b3b890652b297394d4783f44993c466ab44102f450450758052669d8a9b1b0e6e8185906a9168a75babaa95e15deaebf931c5361f21c180370c3effb062108883082b200a9eea74b5208949535ea97f57ed7fd69ab26167ab4df02686727474d80602348bfe16485e5d4999feb423380a52af2f101ea01e756031c45652577ab522390a7e364d6bf0868b58d4b5ab8b4507daa22b7c0068b7ca0af27f9610f9be95b1e8cfaf17225d5cdf6f7d4c5eead3942e9bf83ee", + "public_inputs_hex": "0x15c9b404c344691839abf638a132bd083b09e98c2fadb268923013737d217ad40488f1f8d24b90d2ff437809f7199eccdee54180e24fbab6e8d07e4dae7c77480000000000000000000000000000000097e089d738cbdfe4aabdacf499858d5d00000000000000000000000000000000bea27e9a0462c1bbcfe5d7d11e69ab7c000000000000000000000000000000005fe27b65c562e50b0f036ea754579e4b000000000000000000000000000000004d71b2b07473783912b25cf8dd9b9c9f0b7850853da4f6de0abb227f35ba4fc88c9701f647ee43a716dcd01fdd540f0a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000210ade7d9aa4cfe74bb36dd9a0e12531b1126fa2403608e2b7d175414fcb9e2f31dd5a66f5ca90ea104b52c48f4a3e630f174014acc8270d5f4dc613a06eb6a3619654bcbcf5e533790d9be255bc5ca90c779d6375fc717d27349065da5753954032f128b9e186d3fd9cd5460214fd5cc67db90c397056d90b3fa1e1e93174c99000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } }