diff --git a/assets/eip-8182/pool_precompile_happy_path.json b/assets/eip-8182/pool_precompile_happy_path.json index b71caed..af4abca 100644 --- a/assets/eip-8182/pool_precompile_happy_path.json +++ b/assets/eip-8182/pool_precompile_happy_path.json @@ -1,11 +1,11 @@ { "description": "Valid Groth16/BN254 proof for the EIP-8182 pool circuit. The PROOF_VERIFY_PRECOMPILE MUST return uint256(1).", - "input": "0x00000000000000000000000000000000000000000000000000000000000002c01246e5b4bcbace8f661e183101640d0db67a8aff835663c6c5edd209524d0b69145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e01c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba11892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a689027da03390c0f5e610eb4ed3c3e8eec26a960864ad77e8bfbc53265cc8725f5ae28a5fcefd9fb0683361f0c015ac61797b592bdce0c101e465b44a1585266133500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b95c359759647c42fcb759c3dd1ffe633c693c21523aebc684bda3dcd839282e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa0000000000000000000000000000000000000000000000000000000067748580000000000000000000000000000000000000000000000000000000000000000118fe68077b7f2e051e5865df48586b0483ea76fd1f44900a8de5f6a2c6e746ed0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d00000000000000000000000000000000000000000000000000000000d0d000a000000000000000000000000000000000000000000000000000000000d0d000a100000000000000000000000000000000000000000000000000000000d0d000a2000000000000000000000000555555555555555555555555555555555555555516234ab58cf72715a9e9436819e19c897108c61fc115817cb4e2af80ba7f10872a8deb2a8d24d8b7baf996d8283706297cea4f508f9bf5d0390b5980d4bf0e3c000000000000000000000000000000000000000000000000000000000000010009dd03405ea26b2709f74f8f0579f4eccb1557ce5ceb1321bed86e26f7d9432b0aad40af59c95c2b3794106a03083d6de81e21948c8d8f9da60b13a5de868f741d1a89a492b932e622e7af8db377596c533aa4a8f416c04b4cdcbc5362789265105de6e494a2c467e874613e4895710771d3eeeb27f1901a6311be6ae995c11e2fd1e7df495aa3d575fdfbf4e4040f372e354b21a2f982de202ea4c3b91c51be049d1246f51f2938157ad4f468efd9e9cbd03c902f7d0ead3dfb031436dafe9830022f847c75d65b11f73e46d33e476f7db51e0848a59277c5fa8c1e12d0faf82ad7ad8181fb2fcc0d8ff43a51d93c7a26c4e53f2291496dc1c8f318d246689a", + "input": "0x00000000000000000000000000000000000000000000000000000000000002c02db032392a80e06df6be0b3a4a7fa8ff4a3b6878997d9cc6721b015c68997d55145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e01c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba11892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a689027da03390c0f5e610eb4ed3c3e8eec26a960864ad77e8bfbc53265cc8725f5ae28a5fcefd9fb0683361f0c015ac61797b592bdce0c101e465b44a1585266133500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b95c359759647c42fcb759c3dd1ffe633c693c21523aebc684bda3dcd839282e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa0000000000000000000000000000000000000000000000000000000067748580000000000000000000000000000000000000000000000000000000000000000101cc6da3694ad47b771d356567472de93165a9692ce4764367c36bb92484d5a70b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d1b56baa0e3b9d5d1b645d1780ec680f56f28acc2986b0c8235aed44cb30db7b52994b1263e7e00e42d88abbbb0100d36c7cc44301dc191a12b906404ef27dd4514953502e73be884325bcf7dee5bd5febbcd36d7cffa3977c2fca4bd0e5fb1f1000000000000000000000000a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a10b19f126011b791d68c37f8f2077407ac5f9a75b96fb53bd9e35d62a61136cdb27fba13c8009c277f1a356ee148b9403d22b3084a41eec9db0226eb086e033ac00000000000000000000000000000000000000000000000000000000000001000d337678ced21363e7ba50b152fb8288898714bb7ee3104db36856da27ace7172a574e3cb8729c7e92361acf842ac76e0325c0db2c14ae1b6de76ca646b498b6089e89683fd19fa957e869557d6f689cc3d0cb8f428277f7ace07ff2910404e4247068be79c9cac00a701fd09016eb915334677f908b5f6c13a89a2f2e2cd26c0a324b3c8a72ef061a18f664177f57022a4234e63e25c313b85f7a08d472657a093e1c2d574373e58ff379fabe60e605bc54eb9100c52c640093a378e2b2def10e2c41517535140d32a151e2814993d114d875215dcf2698edf43a1517a54bd90e9727405fb88692112660e830e285f97a93825a008cb3001e73cd0e6c484c5f", "expectedOutput": "0x0000000000000000000000000000000000000000000000000000000000000001", "components": { - "proof": "0x09dd03405ea26b2709f74f8f0579f4eccb1557ce5ceb1321bed86e26f7d9432b0aad40af59c95c2b3794106a03083d6de81e21948c8d8f9da60b13a5de868f741d1a89a492b932e622e7af8db377596c533aa4a8f416c04b4cdcbc5362789265105de6e494a2c467e874613e4895710771d3eeeb27f1901a6311be6ae995c11e2fd1e7df495aa3d575fdfbf4e4040f372e354b21a2f982de202ea4c3b91c51be049d1246f51f2938157ad4f468efd9e9cbd03c902f7d0ead3dfb031436dafe9830022f847c75d65b11f73e46d33e476f7db51e0848a59277c5fa8c1e12d0faf82ad7ad8181fb2fcc0d8ff43a51d93c7a26c4e53f2291496dc1c8f318d246689a", + "proof": "0x0d337678ced21363e7ba50b152fb8288898714bb7ee3104db36856da27ace7172a574e3cb8729c7e92361acf842ac76e0325c0db2c14ae1b6de76ca646b498b6089e89683fd19fa957e869557d6f689cc3d0cb8f428277f7ace07ff2910404e4247068be79c9cac00a701fd09016eb915334677f908b5f6c13a89a2f2e2cd26c0a324b3c8a72ef061a18f664177f57022a4234e63e25c313b85f7a08d472657a093e1c2d574373e58ff379fabe60e605bc54eb9100c52c640093a378e2b2def10e2c41517535140d32a151e2814993d114d875215dcf2698edf43a1517a54bd90e9727405fb88692112660e830e285f97a93825a008cb3001e73cd0e6c484c5f", "publicInputs": [ - "0x1246e5b4bcbace8f661e183101640d0db67a8aff835663c6c5edd209524d0b69", + "0x2db032392a80e06df6be0b3a4a7fa8ff4a3b6878997d9cc6721b015c68997d55", "0x145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e0", "0x1c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba1", "0x1892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a6890", @@ -18,17 +18,17 @@ "0x2e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa", "0x0000000000000000000000000000000000000000000000000000000067748580", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x18fe68077b7f2e051e5865df48586b0483ea76fd1f44900a8de5f6a2c6e746ed", + "0x01cc6da3694ad47b771d356567472de93165a9692ce4764367c36bb92484d5a7", "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x00000000000000000000000000000000000000000000000000000000d0d000a0", - "0x00000000000000000000000000000000000000000000000000000000d0d000a1", - "0x00000000000000000000000000000000000000000000000000000000d0d000a2", - "0x0000000000000000000000005555555555555555555555555555555555555555", - "0x16234ab58cf72715a9e9436819e19c897108c61fc115817cb4e2af80ba7f1087", - "0x2a8deb2a8d24d8b7baf996d8283706297cea4f508f9bf5d0390b5980d4bf0e3c" + "0x1b56baa0e3b9d5d1b645d1780ec680f56f28acc2986b0c8235aed44cb30db7b5", + "0x2994b1263e7e00e42d88abbbb0100d36c7cc44301dc191a12b906404ef27dd45", + "0x14953502e73be884325bcf7dee5bd5febbcd36d7cffa3977c2fca4bd0e5fb1f1", + "0x000000000000000000000000a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1", + "0x0b19f126011b791d68c37f8f2077407ac5f9a75b96fb53bd9e35d62a61136cdb", + "0x27fba13c8009c277f1a356ee148b9403d22b3084a41eec9db0226eb086e033ac" ], "publicInputsLabels": [ - "noteCommitmentRoot", + "historicalNoteRootAccumulatorRoot", "nullifier0", "nullifier1", "noteBodyCommitment0", diff --git a/assets/eip-8182/pool_precompile_invalid_proof.json b/assets/eip-8182/pool_precompile_invalid_proof.json index 9c4f5f7..92e5d29 100644 --- a/assets/eip-8182/pool_precompile_invalid_proof.json +++ b/assets/eip-8182/pool_precompile_invalid_proof.json @@ -1,12 +1,12 @@ { "description": "A valid proof with a single bit flipped inside pi_c.x. The pairing check MUST fail and the precompile MUST return uint256(0).", "mutation": "byte index 200 of the 256-byte proof XORed with 0x01 (flips one bit of pi_c.x)", - "input": "0x00000000000000000000000000000000000000000000000000000000000002c01246e5b4bcbace8f661e183101640d0db67a8aff835663c6c5edd209524d0b69145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e01c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba11892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a689027da03390c0f5e610eb4ed3c3e8eec26a960864ad77e8bfbc53265cc8725f5ae28a5fcefd9fb0683361f0c015ac61797b592bdce0c101e465b44a1585266133500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b95c359759647c42fcb759c3dd1ffe633c693c21523aebc684bda3dcd839282e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa0000000000000000000000000000000000000000000000000000000067748580000000000000000000000000000000000000000000000000000000000000000118fe68077b7f2e051e5865df48586b0483ea76fd1f44900a8de5f6a2c6e746ed0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d00000000000000000000000000000000000000000000000000000000d0d000a000000000000000000000000000000000000000000000000000000000d0d000a100000000000000000000000000000000000000000000000000000000d0d000a2000000000000000000000000555555555555555555555555555555555555555516234ab58cf72715a9e9436819e19c897108c61fc115817cb4e2af80ba7f10872a8deb2a8d24d8b7baf996d8283706297cea4f508f9bf5d0390b5980d4bf0e3c000000000000000000000000000000000000000000000000000000000000010009dd03405ea26b2709f74f8f0579f4eccb1557ce5ceb1321bed86e26f7d9432b0aad40af59c95c2b3794106a03083d6de81e21948c8d8f9da60b13a5de868f741d1a89a492b932e622e7af8db377596c533aa4a8f416c04b4cdcbc5362789265105de6e494a2c467e874613e4895710771d3eeeb27f1901a6311be6ae995c11e2fd1e7df495aa3d575fdfbf4e4040f372e354b21a2f982de202ea4c3b91c51be049d1246f51f2938157ad4f468efd9e9cbd03c902f7d0ead3dfb031436dafe9830022f847c75d65b10f73e46d33e476f7db51e0848a59277c5fa8c1e12d0faf82ad7ad8181fb2fcc0d8ff43a51d93c7a26c4e53f2291496dc1c8f318d246689a", + "input": "0x00000000000000000000000000000000000000000000000000000000000002c02db032392a80e06df6be0b3a4a7fa8ff4a3b6878997d9cc6721b015c68997d55145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e01c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba11892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a689027da03390c0f5e610eb4ed3c3e8eec26a960864ad77e8bfbc53265cc8725f5ae28a5fcefd9fb0683361f0c015ac61797b592bdce0c101e465b44a1585266133500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b95c359759647c42fcb759c3dd1ffe633c693c21523aebc684bda3dcd839282e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa0000000000000000000000000000000000000000000000000000000067748580000000000000000000000000000000000000000000000000000000000000000101cc6da3694ad47b771d356567472de93165a9692ce4764367c36bb92484d5a70b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d1b56baa0e3b9d5d1b645d1780ec680f56f28acc2986b0c8235aed44cb30db7b52994b1263e7e00e42d88abbbb0100d36c7cc44301dc191a12b906404ef27dd4514953502e73be884325bcf7dee5bd5febbcd36d7cffa3977c2fca4bd0e5fb1f1000000000000000000000000a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a10b19f126011b791d68c37f8f2077407ac5f9a75b96fb53bd9e35d62a61136cdb27fba13c8009c277f1a356ee148b9403d22b3084a41eec9db0226eb086e033ac00000000000000000000000000000000000000000000000000000000000001000d337678ced21363e7ba50b152fb8288898714bb7ee3104db36856da27ace7172a574e3cb8729c7e92361acf842ac76e0325c0db2c14ae1b6de76ca646b498b6089e89683fd19fa957e869557d6f689cc3d0cb8f428277f7ace07ff2910404e4247068be79c9cac00a701fd09016eb915334677f908b5f6c13a89a2f2e2cd26c0a324b3c8a72ef061a18f664177f57022a4234e63e25c313b85f7a08d472657a093e1c2d574373e58ff379fabe60e605bc54eb9100c52c640093a378e2b2def10e2c41517535140d33a151e2814993d114d875215dcf2698edf43a1517a54bd90e9727405fb88692112660e830e285f97a93825a008cb3001e73cd0e6c484c5f", "expectedOutput": "0x0000000000000000000000000000000000000000000000000000000000000000", "components": { - "proof": "0x09dd03405ea26b2709f74f8f0579f4eccb1557ce5ceb1321bed86e26f7d9432b0aad40af59c95c2b3794106a03083d6de81e21948c8d8f9da60b13a5de868f741d1a89a492b932e622e7af8db377596c533aa4a8f416c04b4cdcbc5362789265105de6e494a2c467e874613e4895710771d3eeeb27f1901a6311be6ae995c11e2fd1e7df495aa3d575fdfbf4e4040f372e354b21a2f982de202ea4c3b91c51be049d1246f51f2938157ad4f468efd9e9cbd03c902f7d0ead3dfb031436dafe9830022f847c75d65b10f73e46d33e476f7db51e0848a59277c5fa8c1e12d0faf82ad7ad8181fb2fcc0d8ff43a51d93c7a26c4e53f2291496dc1c8f318d246689a", + "proof": "0x0d337678ced21363e7ba50b152fb8288898714bb7ee3104db36856da27ace7172a574e3cb8729c7e92361acf842ac76e0325c0db2c14ae1b6de76ca646b498b6089e89683fd19fa957e869557d6f689cc3d0cb8f428277f7ace07ff2910404e4247068be79c9cac00a701fd09016eb915334677f908b5f6c13a89a2f2e2cd26c0a324b3c8a72ef061a18f664177f57022a4234e63e25c313b85f7a08d472657a093e1c2d574373e58ff379fabe60e605bc54eb9100c52c640093a378e2b2def10e2c41517535140d33a151e2814993d114d875215dcf2698edf43a1517a54bd90e9727405fb88692112660e830e285f97a93825a008cb3001e73cd0e6c484c5f", "publicInputs": [ - "0x1246e5b4bcbace8f661e183101640d0db67a8aff835663c6c5edd209524d0b69", + "0x2db032392a80e06df6be0b3a4a7fa8ff4a3b6878997d9cc6721b015c68997d55", "0x145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e0", "0x1c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba1", "0x1892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a6890", @@ -19,14 +19,14 @@ "0x2e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa", "0x0000000000000000000000000000000000000000000000000000000067748580", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x18fe68077b7f2e051e5865df48586b0483ea76fd1f44900a8de5f6a2c6e746ed", + "0x01cc6da3694ad47b771d356567472de93165a9692ce4764367c36bb92484d5a7", "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x00000000000000000000000000000000000000000000000000000000d0d000a0", - "0x00000000000000000000000000000000000000000000000000000000d0d000a1", - "0x00000000000000000000000000000000000000000000000000000000d0d000a2", - "0x0000000000000000000000005555555555555555555555555555555555555555", - "0x16234ab58cf72715a9e9436819e19c897108c61fc115817cb4e2af80ba7f1087", - "0x2a8deb2a8d24d8b7baf996d8283706297cea4f508f9bf5d0390b5980d4bf0e3c" + "0x1b56baa0e3b9d5d1b645d1780ec680f56f28acc2986b0c8235aed44cb30db7b5", + "0x2994b1263e7e00e42d88abbbb0100d36c7cc44301dc191a12b906404ef27dd45", + "0x14953502e73be884325bcf7dee5bd5febbcd36d7cffa3977c2fca4bd0e5fb1f1", + "0x000000000000000000000000a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1", + "0x0b19f126011b791d68c37f8f2077407ac5f9a75b96fb53bd9e35d62a61136cdb", + "0x27fba13c8009c277f1a356ee148b9403d22b3084a41eec9db0226eb086e033ac" ] } } diff --git a/assets/eip-8182/pool_precompile_noncanonical_field.json b/assets/eip-8182/pool_precompile_noncanonical_field.json index 29c15bd..5098ffb 100644 --- a/assets/eip-8182/pool_precompile_noncanonical_field.json +++ b/assets/eip-8182/pool_precompile_noncanonical_field.json @@ -1,10 +1,10 @@ { - "description": "publicInputs[0] (noteCommitmentRoot) set to p (BN254 scalar field order). The precompile MUST reject any public input >= p (Section 3.5) and return uint256(0).", + "description": "publicInputs[0] (historicalNoteRootAccumulatorRoot) set to p (BN254 scalar field order). The precompile MUST reject any public input >= p (Section 3.5) and return uint256(0).", "mutation": "publicInputs[0] := p_bn254_fr", - "input": "0x00000000000000000000000000000000000000000000000000000000000002c030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e01c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba11892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a689027da03390c0f5e610eb4ed3c3e8eec26a960864ad77e8bfbc53265cc8725f5ae28a5fcefd9fb0683361f0c015ac61797b592bdce0c101e465b44a1585266133500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b95c359759647c42fcb759c3dd1ffe633c693c21523aebc684bda3dcd839282e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa0000000000000000000000000000000000000000000000000000000067748580000000000000000000000000000000000000000000000000000000000000000118fe68077b7f2e051e5865df48586b0483ea76fd1f44900a8de5f6a2c6e746ed0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d00000000000000000000000000000000000000000000000000000000d0d000a000000000000000000000000000000000000000000000000000000000d0d000a100000000000000000000000000000000000000000000000000000000d0d000a2000000000000000000000000555555555555555555555555555555555555555516234ab58cf72715a9e9436819e19c897108c61fc115817cb4e2af80ba7f10872a8deb2a8d24d8b7baf996d8283706297cea4f508f9bf5d0390b5980d4bf0e3c000000000000000000000000000000000000000000000000000000000000010009dd03405ea26b2709f74f8f0579f4eccb1557ce5ceb1321bed86e26f7d9432b0aad40af59c95c2b3794106a03083d6de81e21948c8d8f9da60b13a5de868f741d1a89a492b932e622e7af8db377596c533aa4a8f416c04b4cdcbc5362789265105de6e494a2c467e874613e4895710771d3eeeb27f1901a6311be6ae995c11e2fd1e7df495aa3d575fdfbf4e4040f372e354b21a2f982de202ea4c3b91c51be049d1246f51f2938157ad4f468efd9e9cbd03c902f7d0ead3dfb031436dafe9830022f847c75d65b11f73e46d33e476f7db51e0848a59277c5fa8c1e12d0faf82ad7ad8181fb2fcc0d8ff43a51d93c7a26c4e53f2291496dc1c8f318d246689a", + "input": "0x00000000000000000000000000000000000000000000000000000000000002c030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e01c41c7d566332daa97c89047f80711d58d60ac72cffa6fee188ba6dffc036ba11892d6bd03edb9183dc830a06efeca6a0c281c97d7ce188e6d02e2f5e78a689027da03390c0f5e610eb4ed3c3e8eec26a960864ad77e8bfbc53265cc8725f5ae28a5fcefd9fb0683361f0c015ac61797b592bdce0c101e465b44a1585266133500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017b95c359759647c42fcb759c3dd1ffe633c693c21523aebc684bda3dcd839282e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa0000000000000000000000000000000000000000000000000000000067748580000000000000000000000000000000000000000000000000000000000000000101cc6da3694ad47b771d356567472de93165a9692ce4764367c36bb92484d5a70b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d1b56baa0e3b9d5d1b645d1780ec680f56f28acc2986b0c8235aed44cb30db7b52994b1263e7e00e42d88abbbb0100d36c7cc44301dc191a12b906404ef27dd4514953502e73be884325bcf7dee5bd5febbcd36d7cffa3977c2fca4bd0e5fb1f1000000000000000000000000a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a10b19f126011b791d68c37f8f2077407ac5f9a75b96fb53bd9e35d62a61136cdb27fba13c8009c277f1a356ee148b9403d22b3084a41eec9db0226eb086e033ac00000000000000000000000000000000000000000000000000000000000001000d337678ced21363e7ba50b152fb8288898714bb7ee3104db36856da27ace7172a574e3cb8729c7e92361acf842ac76e0325c0db2c14ae1b6de76ca646b498b6089e89683fd19fa957e869557d6f689cc3d0cb8f428277f7ace07ff2910404e4247068be79c9cac00a701fd09016eb915334677f908b5f6c13a89a2f2e2cd26c0a324b3c8a72ef061a18f664177f57022a4234e63e25c313b85f7a08d472657a093e1c2d574373e58ff379fabe60e605bc54eb9100c52c640093a378e2b2def10e2c41517535140d32a151e2814993d114d875215dcf2698edf43a1517a54bd90e9727405fb88692112660e830e285f97a93825a008cb3001e73cd0e6c484c5f", "expectedOutput": "0x0000000000000000000000000000000000000000000000000000000000000000", "components": { - "proof": "0x09dd03405ea26b2709f74f8f0579f4eccb1557ce5ceb1321bed86e26f7d9432b0aad40af59c95c2b3794106a03083d6de81e21948c8d8f9da60b13a5de868f741d1a89a492b932e622e7af8db377596c533aa4a8f416c04b4cdcbc5362789265105de6e494a2c467e874613e4895710771d3eeeb27f1901a6311be6ae995c11e2fd1e7df495aa3d575fdfbf4e4040f372e354b21a2f982de202ea4c3b91c51be049d1246f51f2938157ad4f468efd9e9cbd03c902f7d0ead3dfb031436dafe9830022f847c75d65b11f73e46d33e476f7db51e0848a59277c5fa8c1e12d0faf82ad7ad8181fb2fcc0d8ff43a51d93c7a26c4e53f2291496dc1c8f318d246689a", + "proof": "0x0d337678ced21363e7ba50b152fb8288898714bb7ee3104db36856da27ace7172a574e3cb8729c7e92361acf842ac76e0325c0db2c14ae1b6de76ca646b498b6089e89683fd19fa957e869557d6f689cc3d0cb8f428277f7ace07ff2910404e4247068be79c9cac00a701fd09016eb915334677f908b5f6c13a89a2f2e2cd26c0a324b3c8a72ef061a18f664177f57022a4234e63e25c313b85f7a08d472657a093e1c2d574373e58ff379fabe60e605bc54eb9100c52c640093a378e2b2def10e2c41517535140d32a151e2814993d114d875215dcf2698edf43a1517a54bd90e9727405fb88692112660e830e285f97a93825a008cb3001e73cd0e6c484c5f", "publicInputs": [ "0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001", "0x145a2ba89be0289b37361ff401c434eebccd468bcea518f8573a4c9c8ab164e0", @@ -19,14 +19,14 @@ "0x2e263101aad41e82d76b185edf78dcdf23d02e625a92e33d17822a97595ed4aa", "0x0000000000000000000000000000000000000000000000000000000067748580", "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x18fe68077b7f2e051e5865df48586b0483ea76fd1f44900a8de5f6a2c6e746ed", + "0x01cc6da3694ad47b771d356567472de93165a9692ce4764367c36bb92484d5a7", "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x00000000000000000000000000000000000000000000000000000000d0d000a0", - "0x00000000000000000000000000000000000000000000000000000000d0d000a1", - "0x00000000000000000000000000000000000000000000000000000000d0d000a2", - "0x0000000000000000000000005555555555555555555555555555555555555555", - "0x16234ab58cf72715a9e9436819e19c897108c61fc115817cb4e2af80ba7f1087", - "0x2a8deb2a8d24d8b7baf996d8283706297cea4f508f9bf5d0390b5980d4bf0e3c" + "0x1b56baa0e3b9d5d1b645d1780ec680f56f28acc2986b0c8235aed44cb30db7b5", + "0x2994b1263e7e00e42d88abbbb0100d36c7cc44301dc191a12b906404ef27dd45", + "0x14953502e73be884325bcf7dee5bd5febbcd36d7cffa3977c2fca4bd0e5fb1f1", + "0x000000000000000000000000a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1", + "0x0b19f126011b791d68c37f8f2077407ac5f9a75b96fb53bd9e35d62a61136cdb", + "0x27fba13c8009c277f1a356ee148b9403d22b3084a41eec9db0226eb086e033ac" ] } } diff --git a/assets/eip-8182/pool_vk.bin b/assets/eip-8182/pool_vk.bin index 3d0bbfd..67e6682 100644 Binary files a/assets/eip-8182/pool_vk.bin and b/assets/eip-8182/pool_vk.bin differ diff --git a/assets/eip-8182/pool_vk.sha256 b/assets/eip-8182/pool_vk.sha256 index 6853ee3..a67de03 100644 --- a/assets/eip-8182/pool_vk.sha256 +++ b/assets/eip-8182/pool_vk.sha256 @@ -1 +1 @@ -bcd70a23ea61a77cc51beb15af3798342944a3beefad1ec58a4337978d4d49fe +1b96973307bc7ce9e24b1579593a296da4052b10e1292adb74f7f55bd6815e77 diff --git a/assets/eip-8182/shielded-pool-state.json b/assets/eip-8182/shielded-pool-state.json index af14e8a..59974da 100644 --- a/assets/eip-8182/shielded-pool-state.json +++ b/assets/eip-8182/shielded-pool-state.json @@ -1,269 +1,302 @@ { "0x0000000000000000000000000000000000081820": { "balance": "0x0", - "code": "0x608060405260043610610110575f3560e01c80638afcf5311161009d578063e062198d11610062578063e062198d14610347578063e6a5724c14610366578063ee573c9514610385578063f1ffc846146103a4578063f49ad0ef146103dc575f5ffd5b80638afcf531146102a9578063907748a1146102c857806394306c7e146102f65780639e48ff5a14610315578063cac7e4d814610328575f5ffd5b8063681ab4e5116100e3578063681ab4e5146101c85780637a4a6669146101f55780637a51cc681461021457806380e1935e1461023357806387a0975e14610295575f5ffd5b806301c04fc61461011457806318ebfbbc14610135578063403cb22c1461016b578063557b0a4c1461018a575b5f5ffd5b34801561011f575f5ffd5b5061013361012e36600461507c565b6103fb565b005b348015610140575f5ffd5b5061015461014f3660046151ad565b6108e8565b6040516101629291906151f4565b60405180910390f35b348015610176575f5ffd5b50610133610185366004615212565b6109a6565b348015610195575f5ffd5b506101b86101a4366004615212565b5f9081526018602052604090205460ff1690565b6040519015158152602001610162565b3480156101d3575f5ffd5b506101e76101e2366004615212565b610a88565b604051908152602001610162565b348015610200575f5ffd5b506101b861020f366004615212565b610bec565b34801561021f575f5ffd5b506101b861022e366004615212565b610c4a565b34801561023e575f5ffd5b5061027861024d3660046151ad565b6001600160a01b03165f908152600a602052604090208054600182015460029092015460ff90911692565b604080519315158452602084019290925290820152606001610162565b3480156102a0575f5ffd5b50610133610cad565b3480156102b4575f5ffd5b506101b86102c3366004615212565b610d7f565b3480156102d3575f5ffd5b506101b86102e2366004615212565b5f9081526019602052604090205460ff1690565b348015610301575f5ffd5b5061013361031036600461523c565b610e03565b61013361032336600461529f565b610e21565b348015610333575f5ffd5b50610133610342366004615212565b611085565b348015610352575f5ffd5b506101b8610361366004615212565b6111a7565b348015610371575f5ffd5b506101336103803660046152e5565b611201565b348015610390575f5ffd5b5061013361039f366004615305565b611210565b3480156103af575f5ffd5b50600154600554600e54601354604080519485526020850193909352918301526060820152608001610162565b3480156103e7575f5ffd5b506101b86103f6366004615212565b611250565b7f6c2e272b6252cffbe806cb827ba97128b2cd201c877c4f7166635e71c97a680f805c801561043d576040516306fda65d60e31b815260040160405180910390fd5b6001825d4689610180013514610465576040516217e1ef60ea1b815260040160405180910390fd5b8861016001355f0361048a57604051631022c88d60e21b815260040160405180910390fd5b63ffffffff6101608a013511156104b457604051631022c88d60e21b815260040160405180910390fd5b8861016001354211156104da57604051631022c88d60e21b815260040160405180910390fd5b6104e76201518042615368565b896101600135111561050c57604051632a2e38fb60e21b815260040160405180910390fd5b6105168935610bec565b6105335760405163f9ef8b2960e01b815260040160405180910390fd5b8861014001355f0361055857604051632a13fc4560e11b815260040160405180910390fd5b610566896101400135611250565b61058357604051631c69bbed60e11b815260040160405180910390fd5b886101a001355f036105a857604051633c7a087960e11b815260040160405180910390fd5b6105b6896101a00135610c4a565b6105d357604051632a1fe48b60e11b815260040160405180910390fd5b886101c001355f036105f85760405163d18c519b60e01b815260040160405180910390fd5b610606896101c00135610d7f565b6106235760405163140b794760e31b815260040160405180910390fd5b886040013589602001350361064b5760405163e1200f1d60e01b815260040160405180910390fd5b6001600160f81b0360c08a013511156106775760405163c64200e960e01b815260040160405180910390fd5b6001600160a01b0360e08a013511156106a35760405163ac78de6f60e01b815260040160405180910390fd5b6001600160a01b036101008a013511156106d05760405163ac78de6f60e01b815260040160405180910390fd5b6001600160a01b036102408a013511156106fd5760405163ac78de6f60e01b815260040160405180910390fd5b8861024001355f0361072257604051630180840360e61b815260040160405180910390fd5b63ffffffff6101608a0135111561074c57604051631022c88d60e21b815260040160405180910390fd5b63ffffffff6101808a01351115610775576040516217e1ef60ea1b815260040160405180910390fd5b6107808d8d8b6112cf565b61079c8961024001358a61026001358b61028001358e8e611397565b6020808a01355f9081526018909152604090205460ff16156107d15760405163b115d85760e01b815260040160405180910390fd5b6040808a01355f9081526018602052205460ff16156108035760405163b115d85760e01b815260040160405180910390fd5b6020898101355f9081526018825260408082208054600160ff199182168117909255828e01358452828420805490911690911790556101208c013582526019909252205460ff161561086857604051637f3c5a2360e01b815260040160405180910390fd5b6101208901355f908152601960205260408120805460ff1916600117905561089a90899089906101e08d0135906114ca565b6108ac86868b610200013560016114ca565b6108be84848b610220013560026114ca565b6108c789611531565b6108d68989898989898961164c565b5f825d50505050505050505050505050565b6001600160a01b0381165f908152600c6020526040812080546001820180546060939263ffffffff169190819061091e9061537b565b80601f016020809104026020016040519081016040528092919081815260200182805461094a9061537b565b80156109955780601f1061096c57610100808354040283529160200191610995565b820191905f5260205f20905b81548152906001019060200180831161097857829003601f168201915b505050505090509250925050915091565b5f5160206158005f395f51905f5281106109d35760405163f911218f60e01b815260040160405180910390fd5b335f908152600a60205260409020805460ff16610a0357604051632163950f60e01b815260040160405180910390fd5b5f610a13338360010154856116e1565b9050805f03610a355760405163ad7816e560e01b815260040160405180910390fd5b610a3d611735565b610a473382611780565b6002820183905560405183815233907f0d91e5bdaccfc5cf2146443dd68382481c2d88b9f0d42b588b9bd0d24297b6049060200160405180910390a2505050565b335f908152600a602052604081205460ff16610ab757604051632163950f60e01b815260040160405180910390fd5b815f03610ad757604051633d9dec7560e11b815260040160405180910390fd5b5f5160206158005f395f51905f528210610b045760405163f911218f60e01b815260040160405180910390fd5b5f610b0f338461186a565b9050805f03610b315760405163ad7816e560e01b815260040160405180910390fd5b600d549150610b4563ffffffff6001615368565b610b50836001615368565b1115610b6f57604051631691e59f60e31b815260040160405180910390fd5b610b7a600e546118be565b610b83816118ee565b5f828152601260209081526040918290208054336001600160a01b03199091168117909155600e5483518681529283018590528284015291517fa5dc69a0391e92443a87d6fb4eab237085216aa958b9167062ee4a7e2f94065f9181900360600190a250919050565b5f6001548203610bfe57506001919050565b6002546101f4811115610c1057506101f45b5f5b81811015610c41575f81815260046020526040902054849003610c39575060019392505050565b600101610c12565b505f9392505050565b5f815f03610c5957505f919050565b600e548203610c6a57506001919050565b600f546101f4811115610c7c57506101f45b5f5b81811015610c41575f81815260116020526040902054849003610ca5575060019392505050565b600101610c7e565b335f908152600a602052604090205460ff16610cdc57604051632163950f60e01b815260040160405180910390fd5b335f908152600c602052604081208054909163ffffffff9091169003610d1557604051633b87206b60e11b815260040160405180910390fd5b8054335f908152600c60205260408120805463ffffffff1916815563ffffffff9092169190610d476001830182614fb3565b505060405163ffffffff82169033907f644b17d563dfc5a71a746e814664a852f329fb0d27a23cc0e8bbe8a4d223441f905f90a35050565b5f815f03610d8e57505f919050565b6013548203610d9f57506001919050565b5f5b60408111610dfb575f8181526016602052604090205483148015610ddd57505f818152601760205260409081902054610dda90436153ad565b11155b15610deb5750600192915050565b610df4816153c0565b9050610da1565b505f92915050565b610e0e338686611980565b610e1a33848484611b85565b5050505050565b7f6c2e272b6252cffbe806cb827ba97128b2cd201c877c4f7166635e71c97a680f805c8015610e63576040516306fda65d60e31b815260040160405180910390fd5b6001825d5f86118015610e7d57506001600160f81b038611155b610e9a5760405163fe9ba5cd60e01b815260040160405180910390fd5b845f03610eba57604051634f3442d160e01b815260040160405180910390fd5b5f5160206158005f395f51905f528510610ee75760405163f911218f60e01b815260040160405180910390fd5b6001600160a01b038716610f1a57853414610f1557604051630768122960e11b815260040160405180910390fd5b610f8b565b3415610f395760405163cc43410f60e01b815260040160405180910390fd5b5f610f448830611c9c565b9050610f528833308a611d81565b5f610f5d8930611c9c565b905087610f6a83836153ad565b14610f885760405163a3f6847760e01b815260040160405180910390fd5b50505b5f54610f9c63ffffffff6001615368565b610fa7826001615368565b1115610fc657604051631691e59f60e31b815260040160405180910390fd5b5f610fdb87898b6001600160a01b0316611ddc565b90505f610fe88284611e1f565b9050805f0361100a57604051633790f70160e11b815260040160405180910390fd5b611015600154611e61565b61101e81611e91565b336001600160a01b03167f95278718c224a240fc6219a205839fc52938b9ac4e085ed6d42028a0e856cb5b82858c8e6001600160a01b03166001548d8d60405161106e9796959493929190615400565b60405180910390a25050505f825d50505050505050565b335f908152600a602052604090205460ff166110b457604051632163950f60e01b815260040160405180910390fd5b63ffffffff8111156110d957604051637a0d6c4f60e01b815260040160405180910390fd5b5f818152601260205260409020546001600160a01b0316331461110f5760405163564423c360e11b815260040160405180910390fd5b5f8181527fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed602052604090205460010361115c57604051630709b8e360e31b815260040160405180910390fd5b611164611f1c565b61116f816001611f66565b60405181815233907f68e63af5935b7b79778d76306e9c571f044517e00c1f62c0306ceae554a7ed1a9060200160405180910390a250565b5f63ffffffff8211156111cd57604051637a0d6c4f60e01b815260040160405180910390fd5b505f9081527fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed602052604090205460011490565b61120c338383611980565b5050565b335f908152600a602052604090205460ff1661123f57604051632163950f60e01b815260040160405180910390fd5b61124b33848484611b85565b505050565b5f815f0361125f57505f919050565b600554820361127057506001919050565b5f5b6101f48111610dfb575f81815260086020526040902054831480156112b157505f818152600960205260409020546101f4906112ae90436153ad565b11155b156112bf5750600192915050565b6112c8816153c0565b9050611272565b5f5f60306001600160a01b03168585856040516020016112f19392919061543e565b60408051601f198184030181529082905261130b91615564565b5f60405180830381855afa9150503d805f8114611343576040519150601f19603f3d011682016040523d82523d5f602084013e611348565b606091505b509150915081801561135b575080516020145b801561137a575080806020019051810190611376919061557a565b6001145b610e1a57604051630e6f1c3f60e01b815260040160405180910390fd5b846001600160a01b03163b5f036113c157604051630180840360e61b815260040160405180910390fd5b6040805160208101869052808201859052815180820383018152606082019092525f9081906001600160a01b0389169061140390859088908890608401615591565b60408051601f198184030181529181526020820180516001600160e01b031663222a0c5760e21b179052516114389190615564565b5f60405180830381855afa9150503d805f8114611470576040519150601f19603f3d011682016040523d82523d5f602084013e611475565b606091505b5091509150818015611488575080516020145b80156114a35750808060200190518101906114a391906155c0565b6114c05760405163f7f61c5360e01b815260040160405180910390fd5b5050505050505050565b5f5f5160206158005f395f51905f5285856040516114e99291906155e6565b6040519081900390206114fc9190615609565b9050818382146115295760405163025c7a6d60e41b815260ff909116600482015260240160405180910390fd5b505050505050565b8060c001355f036115865760e08101351561155f57604051634da1189160e11b815260040160405180910390fd5b6101008101351561158357604051634da1189160e11b815260040160405180910390fd5b50565b8060e001355f036115aa57604051634da1189160e11b815260040160405180910390fd5b60e08101356101008201356001600160a01b03811661163d575f826001600160a01b03168460c001356040515f6040518083038185875af1925050503d805f8114611610576040519150601f19603f3d011682016040523d82523d5f602084013e611615565b606091505b505090508061163757604051630db2c7f160e31b815260040160405180910390fd5b50505050565b61124b81838560c00135612050565b5f5461165d63ffffffff6001615368565b611668826003615368565b111561168757604051631691e59f60e31b815260040160405180910390fd5b5f61169289836120b3565b905061169f600154611e61565b6116af815f5b6020020151611e91565b6116ba8160016116a5565b6116c58160026116a5565b6116d68982848b8b8b8b8b8b61213f565b505050505050505050565b5f61172d61171c5f5160206158005f395f51905f527f224d4fe0758955862168451f40ccfa4f225172e25cde9fd23cca42a7f9e9ebbc615609565b856001600160a01b031685856121c2565b949350505050565b436006540361174057565b5f61174e6101f46001615368565b6117589043615609565b6005545f91825260086020908152604080842092909255600990529020439081905560065550565b5f8281527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df60205260408120829055829082905b60a0811015611861575f81815260076020908152604080832060018718808552925282205490918190036117fa57603a8360a081106117f5576117f5615628565b015490505b846001165f036118155761180e8482612223565b9350611822565b61181f8185612223565b93505b600185901c94508360075f85600161183a9190615368565b815260208082019290925260409081015f90812089825290925290205550506001016117b4565b50600555505050565b5f6118b56118a55f5160206158005f395f51905f527f10889234306ea7fe15a4c741a161607dc68946d1bcdaeff145a702b7ccc324f0615609565b846001600160a01b03168461222e565b90505b92915050565b8060115f6101f4600f546118d29190615609565b815260208101919091526040015f205550600f80546001019055565b600d54815f5b602081101561196757600183821c165f03611944578160105f8381526020019081526020015f208190555061193d8260da836020811061193657611936615628565b0154612223565b915061195f565b5f8181526010602052604090205461195c9083612223565b91505b6001016118f4565b50600e819055611978826001615368565b600d55505050565b5f5160206158005f395f51905f5282106119ad5760405163f911218f60e01b815260040160405180910390fd5b5f5160206158005f395f51905f5281106119da5760405163f911218f60e01b815260040160405180910390fd5b815f036119fa5760405163fae2ea1d60e01b815260040160405180910390fd5b611a02612252565b8203611a215760405163fae2ea1d60e01b815260040160405180910390fd5b5f828152600b60205260409020546001600160a01b031615611a565760405163e054a8f160e01b815260040160405180910390fd5b6001600160a01b0383165f908152600a60205260409020805460ff1615611a9057604051634f2532fb60e11b815260040160405180910390fd5b5f611a9c8585856116e1565b9050805f03611abe5760405163ad7816e560e01b815260040160405180910390fd5b611ac6611735565b611ad9856001600160a01b031682611780565b60408051606081018252600180825260208083018881528385018881526001600160a01b038b165f818152600a85528781209651875460ff191690151517875592519486019490945551600290940193909355878352600b81529183902080546001600160a01b031916821790558251878152918201869052917f47c8e83729a89f8b0c23b722e4c21f48295ddfcd683910c564e11e6b6037d01c910160405180910390a25050505050565b63ffffffff831615801590611b9957508015155b611bb65760405163038128e560e31b815260040160405180910390fd5b60405180604001604052808463ffffffff16815260200183838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250506001600160a01b0387168152600c602090815260409091208351815463ffffffff191663ffffffff909116178155908301519091506001820190611c489082615694565b509050508263ffffffff16846001600160a01b03167f471a7ed40cba4a57211e4ed6e79021e84e437ce877ff0f11c4d332eb3ca9dcee8484604051611c8e92919061574f565b60405180910390a350505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f928392839291871691611cf59190615564565b5f60405180830381855afa9150503d805f8114611d2d576040519150601f19603f3d011682016040523d82523d5f602084013e611d32565b606091505b5091509150811580611d4657508051602014155b15611d645760405163149d96f160e31b815260040160405180910390fd5b80806020019051810190611d78919061557a565b95945050505050565b5f611d8c8584611c9c565b9050611d9a8585858561229a565b5f611da58685611c9c565b905081811080611dbe575082611dbb83836153ad565b14155b156115295760405163f36aeaa960e01b815260040160405180910390fd5b5f61172d611e175f5160206158005f395f51905f527f18fe5d3a340e273bf669641ea1b02a6e06ee26a7f2faab34ca32cabafd76f835615609565b8585856121c2565b5f6118b5611e5a5f5160206158005f395f51905f527fe9d162f8541d2302bd0aa076cba5767ecc88cb6eefb9c724d3979afeed76f486615609565b848461222e565b8060045f6101f4600254611e759190615609565b815260208101919091526040015f205550600280546001019055565b5f80549082905b6020811015611f0457600183821c165f03611ee1578160035f8381526020019081526020015f2081905550611eda82601a836020811061193657611936615628565b9150611efc565b5f81815260036020526040902054611ef99083612223565b91505b600101611e98565b506001818155611f15908390615368565b5f55505050565b4360145403611f2757565b5f611f3460406001615368565b611f3e9043615609565b6013545f91825260166020908152604080842092909255601790529020439081905560145550565b5f8281527fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed60205260408120829055829082905b6020811015612047575f8181526015602090815260408083206001871880855292528220549091819003611fe05760fa8360208110611fdb57611fdb615628565b015490505b846001165f03611ffb57611ff48482612223565b9350612008565b6120058185612223565b93505b600185901c94508360155f8560016120209190615368565b815260208082019290925260409081015f9081208982529092529020555050600101611f9a565b50601355505050565b6040516001600160a01b03831660248201526044810182905261124b90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526122d2565b6120bb614fea565b6120c9836060013583611e1f565b81526120e360808401356120de846001615368565b611e1f565b60208201526120fb60a08401356120de846002615368565b60408201528051158015906121135750602081015115155b80156121225750604081015115155b6118b857604051633790f70160e11b815260040160405180910390fd5b61012089013560408a013560208b01357ff0b44aeb00769322d0d1c556d150bdfcb0b8c0854dda5f7643e50d9a87f4cf936102408d01358c5f60200201518d600160200201518e600260200201518e6001548f8f8f8f8f8f6040516121af9c9b9a99989796959493929190615762565b60405180910390a4505050505050505050565b5f68040000000000000000818080806121dd8a8a8a886123d2565b93509350935093505f5160206158005f395f51905f5280612200576122006155f5565b8785089350612211848484846123d2565b50919c9b505050505050505050505050565b5f6118b58383614f90565b5f5f612245858585680300000000000000006123d2565b5091979650505050505050565b5f61229561228d5f5160206158005f395f51905f527f5bd7095477bb52849b43c2f6f8d7dd5bd2f2edf4510a84c30a08f9d02fb7910b615609565b61dead614f90565b905090565b6040516001600160a01b03808516602483015283166044820152606481018290526116379085906323b872dd60e01b9060840161207c565b5f5f836001600160a01b0316836040516122ec9190615564565b5f604051808303815f865af19150503d805f8114612325576040519150601f19603f3d011682016040523d82523d5f602084013e61232a565b606091505b50915091508161234d5760405163149d96f160e31b815260040160405180910390fd5b80515f0361237f57836001600160a01b03163b5f036116375760405163149d96f160e31b815260040160405180910390fd5b80516020146123a15760405163149d96f160e31b815260040160405180910390fd5b808060200190518101906123b591906155c0565b6116375760405163149d96f160e31b815260040160405180910390fd5b5f5f5f5f5f5160206158005f395f51905f52808906818906828906838906828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e590910197507f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d69093019550507f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa90910192507f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf80190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490290910197507f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e9093019550507f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99690910192507f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e0190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473890910197507f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca069093019550507f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754990910192507f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b0190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e890910197507f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f9093019550507f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a190910192507f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd694143244701905083858180099450858586099450858186099450508285818209935085848509935085818509935050818581820992508583840992508581840992505080858182099150858283099150858183099150508284018183018485018782820890508384018884820890508860048409925088818408925088600485099350888285089350888482089050888383087f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf909101975092955091935091508490508581800994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf81184019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee7584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e557484019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d8584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e0884019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd5984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b8784019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd8351792684019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b884019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d72984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d6584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde18784019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f384019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b6484019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb17384019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad1684019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed70584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f1684019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d8350584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a531902584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a680035584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206158405f395f51905f5288090894508581875f5160206158605f395f51905f5287090893508581875f5160206157e05f395f51905f5286090892508581875f5160206158205f395f51905f528509089150507f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38840193507f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5830192507f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c820191507f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f810190508385818209945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a90910197507f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a969093019550507f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce90910192507f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f9590190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b90910197507f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a49093019550507f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf90910192507f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f14550190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433590910197507f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b9093019550507f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df90910192507f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c4040190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383089150809750508295508094505080925050508398508297508196508095505050505050945094509450949050565b5f5f614fa784845f680200000000000000006123d2565b50919695505050505050565b508054614fbf9061537b565b5f825580601f10614fce575050565b601f0160209004905f5260205f20908101906115839190615008565b60405180606001604052806003906020820280368337509192915050565b5b8082111561501c575f8155600101615009565b5090565b5f5f83601f840112615030575f5ffd5b50813567ffffffffffffffff811115615047575f5ffd5b60208301915083602082850101111561505e575f5ffd5b9250929050565b5f6102a08284031215615076575f5ffd5b50919050565b5f5f5f5f5f5f5f5f5f5f5f6103408c8e031215615097575f5ffd5b8b3567ffffffffffffffff8111156150ad575f5ffd5b6150b98e828f01615020565b909c509a505060208c013567ffffffffffffffff8111156150d8575f5ffd5b6150e48e828f01615020565b909a5098506150f890508d60408e01615065565b96506102e08c013567ffffffffffffffff811115615114575f5ffd5b6151208e828f01615020565b9097509550506103008c013567ffffffffffffffff811115615140575f5ffd5b61514c8e828f01615020565b9095509350506103208c013567ffffffffffffffff81111561516c575f5ffd5b6151788e828f01615020565b915080935050809150509295989b509295989b9093969950565b80356001600160a01b03811681146151a8575f5ffd5b919050565b5f602082840312156151bd575f5ffd5b6118b582615192565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b63ffffffff83168152604060208201525f61172d60408301846151c6565b5f60208284031215615222575f5ffd5b5035919050565b803563ffffffff811681146151a8575f5ffd5b5f5f5f5f5f60808688031215615250575f5ffd5b853594506020860135935061526760408701615229565b9250606086013567ffffffffffffffff811115615282575f5ffd5b61528e88828901615020565b969995985093965092949392505050565b5f5f5f5f5f608086880312156152b3575f5ffd5b6152bc86615192565b94506020860135935060408601359250606086013567ffffffffffffffff811115615282575f5ffd5b5f5f604083850312156152f6575f5ffd5b50508035926020909101359150565b5f5f5f60408486031215615317575f5ffd5b61532084615229565b9250602084013567ffffffffffffffff81111561533b575f5ffd5b61534786828701615020565b9497909650939450505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156118b8576118b8615354565b600181811c9082168061538f57607f821691505b60208210810361507657634e487b7160e01b5f52602260045260245ffd5b818103818111156118b8576118b8615354565b5f600182016153d1576153d1615354565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b87815286602082015285604082015284606082015283608082015260c060a08201525f61543160c0830184866153d8565b9998505050505050505050565b6102c081525f6154536102c0830185876153d8565b833560208481019190915284013560408085019190915284013560608085019190915284013560808085019190915284013560a08085019190915284013560c08085019190915284013560e08085019190915284013561010080850191909152840135610120808501919091528401356101408085019190915284013561016080850191909152840135610180808501919091528401356101a0808501919091528401356101c0808501919091528401356101e0808501919091528401356102008085019190915284013561022080850191909152840135610240808501919091528401356102608085019190915284013561028080850191909152909301356102a0909201919091525092915050565b5f82518060208501845e5f920191825250919050565b5f6020828403121561558a575f5ffd5b5051919050565b604081525f6155a360408301866151c6565b82810360208401526155b68185876153d8565b9695505050505050565b5f602082840312156155d0575f5ffd5b815180151581146155df575f5ffd5b9392505050565b818382375f9101908152919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261562357634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b601f82111561124b57805f5260205f20601f840160051c810160208510156156755750805b601f840160051c820191505b81811015610e1a575f8155600101615681565b815167ffffffffffffffff8111156156ae576156ae61563c565b6156c2816156bc845461537b565b84615650565b6020601f8211600181146156f4575f83156156dd5750848201515b5f19600385901b1c1916600184901b178455610e1a565b5f84815260208120601f198516915b828110156157235787850151825560209485019460019092019101615703565b508482101561574057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f61172d6020830184866153d8565b60018060a01b038d1681528b60208201528a60408201528960608201528860808201528760a082015261012060c08201525f6157a36101208301888a6153d8565b82810360e08401526157b68187896153d8565b90508281036101008401526157cc8185876153d8565b9f9e50505050505050505050505050505056fe00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1530644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e70c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740ba26469706673582212201cbe8846771623c48600eb200b15881bcae087a8d91a8e037529206d087b1eb964736f6c634300081c0033", + "code": "0x60806040526004361061011b575f3560e01c80638afcf5311161009d578063e062198d11610062578063e062198d1461037e578063e6a5724c1461039d578063ee573c95146103bc578063f1ffc846146103db578063f49ad0ef14610413575f5ffd5b80638afcf531146102e0578063907748a1146102ff57806394306c7e1461032d5780639e48ff5a1461034c578063cac7e4d81461035f575f5ffd5b8063681ab4e5116100e3578063681ab4e5146101ff578063683dfedf1461022c5780637a51cc681461024b57806380e1935e1461026a57806387a0975e146102cc575f5ffd5b806301c04fc61461011f57806318ebfbbc14610140578063403cb22c146101765780634e465c4914610195578063557b0a4c146101c1575b5f5ffd5b34801561012a575f5ffd5b5061013e61013936600461520a565b610432565b005b34801561014b575f5ffd5b5061015f61015a36600461533b565b61091f565b60405161016d929190615382565b60405180910390f35b348015610181575f5ffd5b5061013e6101903660046153a0565b6109dd565b3480156101a0575f5ffd5b506003546004546040805192835263ffffffff90911660208301520161016d565b3480156101cc575f5ffd5b506101ef6101db3660046153a0565b5f908152601b602052604090205460ff1690565b604051901515815260200161016d565b34801561020a575f5ffd5b5061021e6102193660046153a0565b610abf565b60405190815260200161016d565b348015610237575f5ffd5b506101ef6102463660046153a0565b610c23565b348015610256575f5ffd5b506101ef6102653660046153a0565b610c7f565b348015610275575f5ffd5b506102af61028436600461533b565b6001600160a01b03165f908152600d602052604090208054600182015460029092015460ff90911692565b60408051931515845260208401929092529082015260600161016d565b3480156102d7575f5ffd5b5061013e610ce2565b3480156102eb575f5ffd5b506101ef6102fa3660046153a0565b610db4565b34801561030a575f5ffd5b506101ef6103193660046153a0565b5f908152601c602052604090205460ff1690565b348015610338575f5ffd5b5061013e6103473660046153ca565b610e38565b61013e61035a36600461542d565b610e56565b34801561036a575f5ffd5b5061013e6103793660046153a0565b61103c565b348015610389575f5ffd5b506101ef6103983660046153a0565b61115e565b3480156103a8575f5ffd5b5061013e6103b7366004615473565b6111b8565b3480156103c7575f5ffd5b5061013e6103d6366004615493565b6111c7565b3480156103e6575f5ffd5b5060015460085460115460165460408051948552602085019390935291830152606082015260800161016d565b34801561041e575f5ffd5b506101ef61042d3660046153a0565b611207565b7f6c2e272b6252cffbe806cb827ba97128b2cd201c877c4f7166635e71c97a680f805c8015610474576040516306fda65d60e31b815260040160405180910390fd5b6001825d468961018001351461049c576040516217e1ef60ea1b815260040160405180910390fd5b8861016001355f036104c157604051631022c88d60e21b815260040160405180910390fd5b63ffffffff6101608a013511156104eb57604051631022c88d60e21b815260040160405180910390fd5b88610160013542111561051157604051631022c88d60e21b815260040160405180910390fd5b61051e62015180426154f6565b896101600135111561054357604051632a2e38fb60e21b815260040160405180910390fd5b61054d8935610c23565b61056a576040516377fb554760e11b815260040160405180910390fd5b8861014001355f0361058f57604051632a13fc4560e11b815260040160405180910390fd5b61059d896101400135611207565b6105ba57604051631c69bbed60e11b815260040160405180910390fd5b886101a001355f036105df57604051633c7a087960e11b815260040160405180910390fd5b6105ed896101a00135610c7f565b61060a57604051632a1fe48b60e11b815260040160405180910390fd5b886101c001355f0361062f5760405163d18c519b60e01b815260040160405180910390fd5b61063d896101c00135610db4565b61065a5760405163140b794760e31b815260040160405180910390fd5b88604001358960200135036106825760405163e1200f1d60e01b815260040160405180910390fd5b6001600160f81b0360c08a013511156106ae5760405163c64200e960e01b815260040160405180910390fd5b6001600160a01b0360e08a013511156106da5760405163ac78de6f60e01b815260040160405180910390fd5b6001600160a01b036101008a013511156107075760405163ac78de6f60e01b815260040160405180910390fd5b6001600160a01b036102408a013511156107345760405163ac78de6f60e01b815260040160405180910390fd5b8861024001355f0361075957604051630180840360e61b815260040160405180910390fd5b63ffffffff6101608a0135111561078357604051631022c88d60e21b815260040160405180910390fd5b63ffffffff6101808a013511156107ac576040516217e1ef60ea1b815260040160405180910390fd5b6107b78d8d8b611286565b6107d38961024001358a61026001358b61028001358e8e61134e565b6020808a01355f908152601b909152604090205460ff16156108085760405163b115d85760e01b815260040160405180910390fd5b6040808a01355f908152601b602052205460ff161561083a5760405163b115d85760e01b815260040160405180910390fd5b6020898101355f908152601b825260408082208054600160ff199182168117909255828e01358452828420805490911690911790556101208c01358252601c909252205460ff161561089f57604051637f3c5a2360e01b815260040160405180910390fd5b6101208901355f908152601c60205260408120805460ff191660011790556108d190899089906101e08d013590611481565b6108e386868b61020001356001611481565b6108f584848b61022001356002611481565b6108fe896114e8565b61090d89898989898989611603565b5f825d50505050505050505050505050565b6001600160a01b0381165f908152600f6020526040812080546001820180546060939263ffffffff169190819061095590615509565b80601f016020809104026020016040519081016040528092919081815260200182805461098190615509565b80156109cc5780601f106109a3576101008083540402835291602001916109cc565b820191905f5260205f20905b8154815290600101906020018083116109af57829003601f168201915b505050505090509250925050915091565b5f5160206159a85f395f51905f528110610a0a5760405163f911218f60e01b815260040160405180910390fd5b335f908152600d60205260409020805460ff16610a3a57604051632163950f60e01b815260040160405180910390fd5b5f610a4a3383600101548561169a565b9050805f03610a6c5760405163ad7816e560e01b815260040160405180910390fd5b610a746116ee565b610a7e3382611739565b6002820183905560405183815233907f0d91e5bdaccfc5cf2146443dd68382481c2d88b9f0d42b588b9bd0d24297b6049060200160405180910390a2505050565b335f908152600d602052604081205460ff16610aee57604051632163950f60e01b815260040160405180910390fd5b815f03610b0e57604051633d9dec7560e11b815260040160405180910390fd5b5f5160206159a85f395f51905f528210610b3b5760405163f911218f60e01b815260040160405180910390fd5b5f610b463384611823565b9050805f03610b685760405163ad7816e560e01b815260040160405180910390fd5b6010549150610b7c63ffffffff60016154f6565b610b878360016154f6565b1115610ba657604051631691e59f60e31b815260040160405180910390fd5b610bb1601154611877565b610bba816118a7565b5f828152601560209081526040918290208054336001600160a01b0319909116811790915560115483518681529283018590528284015291517fa5dc69a0391e92443a87d6fb4eab237085216aa958b9167062ee4a7e2f94065f9181900360600190a250919050565b5f6003548203610c3557506001919050565b6006546040811115610c45575060405b5f5b81811015610c76575f81815260076020526040902054849003610c6e575060019392505050565b600101610c47565b505f9392505050565b5f815f03610c8e57505f919050565b6011548203610c9f57506001919050565b6012546101f4811115610cb157506101f45b5f5b81811015610c76575f81815260146020526040902054849003610cda575060019392505050565b600101610cb3565b335f908152600d602052604090205460ff16610d1157604051632163950f60e01b815260040160405180910390fd5b335f908152600f602052604081208054909163ffffffff9091169003610d4a57604051633b87206b60e11b815260040160405180910390fd5b8054335f908152600f60205260408120805463ffffffff1916815563ffffffff9092169190610d7c6001830182615141565b505060405163ffffffff82169033907f644b17d563dfc5a71a746e814664a852f329fb0d27a23cc0e8bbe8a4d223441f905f90a35050565b5f815f03610dc357505f919050565b6016548203610dd457506001919050565b5f5b60408111610e30575f8181526019602052604090205483148015610e1257505f818152601a60205260409081902054610e0f904361553b565b11155b15610e205750600192915050565b610e298161554e565b9050610dd6565b505f92915050565b610e43338686611939565b610e4f33848484611b3e565b5050505050565b7f6c2e272b6252cffbe806cb827ba97128b2cd201c877c4f7166635e71c97a680f805c8015610e98576040516306fda65d60e31b815260040160405180910390fd5b6001825d5f86118015610eb257506001600160f81b038611155b610ecf5760405163fe9ba5cd60e01b815260040160405180910390fd5b845f03610eef57604051634f3442d160e01b815260040160405180910390fd5b5f5160206159a85f395f51905f528510610f1c5760405163f911218f60e01b815260040160405180910390fd5b6001600160a01b038716610f4f57853414610f4a57604051630768122960e11b815260040160405180910390fd5b610fc0565b3415610f6e5760405163cc43410f60e01b815260040160405180910390fd5b5f610f798830611c55565b9050610f878833308a611d3a565b5f610f928930611c55565b905087610f9f838361553b565b14610fbd5760405163a3f6847760e01b815260040160405180910390fd5b50505b5f54610fd163ffffffff60016154f6565b610fdc8260016154f6565b1115610ffb57604051631691e59f60e31b815260040160405180910390fd5b5f61100889898985611d95565b905061101381611de2565b61101e600154611e6d565b505061102e898983858a8a611f62565b50505f825d50505050505050565b335f908152600d602052604090205460ff1661106b57604051632163950f60e01b815260040160405180910390fd5b63ffffffff81111561109057604051637a0d6c4f60e01b815260040160405180910390fd5b5f818152601560205260409020546001600160a01b031633146110c65760405163564423c360e11b815260040160405180910390fd5b5f8181527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd7602052604090205460010361111357604051630709b8e360e31b815260040160405180910390fd5b61111b611fd6565b611126816001612020565b60405181815233907f68e63af5935b7b79778d76306e9c571f044517e00c1f62c0306ceae554a7ed1a9060200160405180910390a250565b5f63ffffffff82111561118457604051637a0d6c4f60e01b815260040160405180910390fd5b505f9081527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd7602052604090205460011490565b6111c3338383611939565b5050565b335f908152600d602052604090205460ff166111f657604051632163950f60e01b815260040160405180910390fd5b61120233848484611b3e565b505050565b5f815f0361121657505f919050565b600854820361122757506001919050565b5f5b6101f48111610e30575f818152600b60205260409020548314801561126857505f818152600c60205260409020546101f490611265904361553b565b11155b156112765750600192915050565b61127f8161554e565b9050611229565b5f5f60306001600160a01b03168585856040516020016112a89392919061558e565b60408051601f19818403018152908290526112c2916156b4565b5f60405180830381855afa9150503d805f81146112fa576040519150601f19603f3d011682016040523d82523d5f602084013e6112ff565b606091505b5091509150818015611312575080516020145b801561133157508080602001905181019061132d91906156ca565b6001145b610e4f57604051630e6f1c3f60e01b815260040160405180910390fd5b846001600160a01b03163b5f0361137857604051630180840360e61b815260040160405180910390fd5b6040805160208101869052808201859052815180820383018152606082019092525f9081906001600160a01b038916906113ba908590889088906084016156e1565b60408051601f198184030181529181526020820180516001600160e01b031663222a0c5760e21b179052516113ef91906156b4565b5f60405180830381855afa9150503d805f8114611427576040519150601f19603f3d011682016040523d82523d5f602084013e61142c565b606091505b509150915081801561143f575080516020145b801561145a57508080602001905181019061145a9190615710565b6114775760405163f7f61c5360e01b815260040160405180910390fd5b5050505050505050565b5f5f5160206159a85f395f51905f5285856040516114a0929190615736565b6040519081900390206114b39190615759565b9050818382146114e05760405163025c7a6d60e41b815260ff909116600482015260240160405180910390fd5b505050505050565b8060c001355f0361153d5760e08101351561151657604051634da1189160e11b815260040160405180910390fd5b6101008101351561153a57604051634da1189160e11b815260040160405180910390fd5b50565b8060e001355f0361156157604051634da1189160e11b815260040160405180910390fd5b60e08101356101008201356001600160a01b0381166115f4575f826001600160a01b03168460c001356040515f6040518083038185875af1925050503d805f81146115c7576040519150601f19603f3d011682016040523d82523d5f602084013e6115cc565b606091505b50509050806115ee57604051630db2c7f160e31b815260040160405180910390fd5b50505050565b61120281838560c0013561210a565b5f5461161463ffffffff60016154f6565b61161f8260036154f6565b111561163e57604051631691e59f60e31b815260040160405180910390fd5b5f611649898361216d565b905061165b815f5b6020020151611de2565b611666816001611651565b611671816002611651565b61167c600154611e6d565b505061168f8982848b8b8b8b8b8b6121f9565b505050505050505050565b5f6116e66116d55f5160206159a85f395f51905f527f224d4fe0758955862168451f40ccfa4f225172e25cde9fd23cca42a7f9e9ebbc615759565b856001600160a01b03168585612290565b949350505050565b43600954036116f957565b5f6117076101f460016154f6565b6117119043615759565b6008545f918252600b6020908152604080842092909255600c90529020439081905560095550565b5f8281527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e360205260408120829055829082905b60a081101561181a575f818152600a6020908152604080832060018718808552925282205490918190036117b357603d8360a081106117ae576117ae615778565b015490505b846001165f036117ce576117c784826122f1565b93506117db565b6117d881856122f1565b93505b600185901c945083600a5f8560016117f391906154f6565b815260208082019290925260409081015f908120898252909252902055505060010161176d565b50600855505050565b5f61186e61185e5f5160206159a85f395f51905f527f10889234306ea7fe15a4c741a161607dc68946d1bcdaeff145a702b7ccc324f0615759565b846001600160a01b0316846122fc565b90505b92915050565b8060145f6101f460125461188b9190615759565b815260208101919091526040015f205550601280546001019055565b601054815f5b602081101561192057600183821c165f036118fd578160135f8381526020019081526020015f20819055506118f68260dd83602081106118ef576118ef615778565b01546122f1565b9150611918565b5f8181526013602052604090205461191590836122f1565b91505b6001016118ad565b5060118190556119318260016154f6565b601055505050565b5f5160206159a85f395f51905f5282106119665760405163f911218f60e01b815260040160405180910390fd5b5f5160206159a85f395f51905f5281106119935760405163f911218f60e01b815260040160405180910390fd5b815f036119b35760405163fae2ea1d60e01b815260040160405180910390fd5b6119bb612320565b82036119da5760405163fae2ea1d60e01b815260040160405180910390fd5b5f828152600e60205260409020546001600160a01b031615611a0f5760405163e054a8f160e01b815260040160405180910390fd5b6001600160a01b0383165f908152600d60205260409020805460ff1615611a4957604051634f2532fb60e11b815260040160405180910390fd5b5f611a5585858561169a565b9050805f03611a775760405163ad7816e560e01b815260040160405180910390fd5b611a7f6116ee565b611a92856001600160a01b031682611739565b60408051606081018252600180825260208083018881528385018881526001600160a01b038b165f818152600d85528781209651875460ff191690151517875592519486019490945551600290940193909355878352600e81529183902080546001600160a01b031916821790558251878152918201869052917f47c8e83729a89f8b0c23b722e4c21f48295ddfcd683910c564e11e6b6037d01c910160405180910390a25050505050565b63ffffffff831615801590611b5257508015155b611b6f5760405163038128e560e31b815260040160405180910390fd5b60405180604001604052808463ffffffff16815260200183838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250506001600160a01b0387168152600f602090815260409091208351815463ffffffff191663ffffffff909116178155908301519091506001820190611c0190826157e4565b509050508263ffffffff16846001600160a01b03167f471a7ed40cba4a57211e4ed6e79021e84e437ce877ff0f11c4d332eb3ca9dcee8484604051611c4792919061589f565b60405180910390a350505050565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291515f928392839291871691611cae91906156b4565b5f60405180830381855afa9150503d805f8114611ce6576040519150601f19603f3d011682016040523d82523d5f602084013e611ceb565b606091505b5091509150811580611cff57508051602014155b15611d1d5760405163149d96f160e31b815260040160405180910390fd5b80806020019051810190611d3191906156ca565b95945050505050565b5f611d458584611c55565b9050611d5385858585612368565b5f611d5e8685611c55565b905081811080611d77575082611d74838361553b565b14155b156114e05760405163f36aeaa960e01b815260040160405180910390fd5b5f5f611dab8486886001600160a01b03166123a0565b9050611db781846123e3565b9150815f03611dd957604051633790f70160e11b815260040160405180910390fd5b50949350505050565b5f80549082905b6020811015611e5557600183821c165f03611e32578160025f8381526020019081526020015f2081905550611e2b82601d83602081106118ef576118ef615778565b9150611e4d565b5f81815260026020526040902054611e4a90836122f1565b91505b600101611de9565b506001818155611e669083906154f6565b5f55505050565b6004545f63ffffffff8210611e9557604051631691e59f60e31b815260040160405180910390fd5b5f611ea08484612425565b905060035460075f6040600654611eb79190615759565b815260208101919091526040015f9081209190915560068054600101905581905b6020811015611f4557600185821c165f03611f22578160055f8381526020019081526020015f2081905550611f1b8261011d83602081106118ef576118ef615778565b9150611f3d565b5f81815260056020526040902054611f3a90836122f1565b91505b600101611ed8565b506003819055611f568460016154f6565b60045592949293505050565b336001600160a01b03167f4f50743f3b15106d8b49fb472475010a8bcac7d02a946d31af64f8e65002ad1a8585888a6001600160a01b031660015488886001600454611fae919061553b565b600354604051611fc6999897969594939291906158b2565b60405180910390a2505050505050565b4360175403611fe157565b5f611fee604060016154f6565b611ff89043615759565b6016545f91825260196020908152604080842092909255601a90529020439081905560175550565b5f8281527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd760205260408120829055829082905b6020811015612101575f818152601860209081526040808320600187188085529252822054909181900361209a5760fd836020811061209557612095615778565b015490505b846001165f036120b5576120ae84826122f1565b93506120c2565b6120bf81856122f1565b93505b600185901c94508360185f8560016120da91906154f6565b815260208082019290925260409081015f9081208982529092529020555050600101612054565b50601655505050565b6040516001600160a01b03831660248201526044810182905261120290849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612460565b612175615178565b6121838360600135836123e3565b815261219d60808401356121988460016154f6565b6123e3565b60208201526121b560a08401356121988460026154f6565b60408201528051158015906121cd5750602081015115155b80156121dc5750604081015115155b61187157604051633790f70160e11b815260040160405180910390fd5b61012089013560408a013560208b01357fd9b2a1b669adef4d4b48cafddd594657a72e88c332684113c5e7a64a490e12ba6102408d01358c5f60200201518d600160200201518e600260200201518e6001548f8f8f8f8f8f6001600454612260919061553b565b60035460405161227d9e9d9c9b9a999897969594939291906158fd565b60405180910390a4505050505050505050565b5f68040000000000000000818080806122ab8a8a8a88612560565b93509350935093505f5160206159a85f395f51905f52806122ce576122ce615745565b87850893506122df84848484612560565b50919c9b505050505050505050505050565b5f61186e838361511e565b5f5f61231385858568030000000000000000612560565b5091979650505050505050565b5f61236361235b5f5160206159a85f395f51905f527f5bd7095477bb52849b43c2f6f8d7dd5bd2f2edf4510a84c30a08f9d02fb7910b615759565b61dead61511e565b905090565b6040516001600160a01b03808516602483015283166044820152606481018290526115ee9085906323b872dd60e01b90608401612136565b5f6116e66123db5f5160206159a85f395f51905f527f18fe5d3a340e273bf669641ea1b02a6e06ee26a7f2faab34ca32cabafd76f835615759565b858585612290565b5f61186e61241e5f5160206159a85f395f51905f527fe9d162f8541d2302bd0aa076cba5767ecc88cb6eefb9c724d3979afeed76f486615759565b84846122fc565b5f61186e61241e5f5160206159a85f395f51905f527f2b71bb57ff3a3a776166cfdfe9b49b2d50d7004780ecb05a69afc31b47cd9f26615759565b5f5f836001600160a01b03168360405161247a91906156b4565b5f604051808303815f865af19150503d805f81146124b3576040519150601f19603f3d011682016040523d82523d5f602084013e6124b8565b606091505b5091509150816124db5760405163149d96f160e31b815260040160405180910390fd5b80515f0361250d57836001600160a01b03163b5f036115ee5760405163149d96f160e31b815260040160405180910390fd5b805160201461252f5760405163149d96f160e31b815260040160405180910390fd5b808060200190518101906125439190615710565b6115ee5760405163149d96f160e31b815260040160405180910390fd5b5f5f5f5f5f5160206159a85f395f51905f52808906818906828906838906828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e590910197507f265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d69093019550507f199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa90910192507f157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf80190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac9490290910197507f0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e9093019550507f251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b99690910192507f13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e0190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd473890910197507f011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca069093019550507f0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f36754990910192507f04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b0190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e890910197507f259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f9093019550507f28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a190910192507f0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd694143244701905083858180099450858586099450858186099450508285818209935085848509935085818509935050818581820992508583840992508581840992505080858182099150858283099150858183099150508284018183018485018782820890508384018884820890508860048409925088818408925088600485099350888285089350888482089050888383087f0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf909101975092955091935091508490508581800994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf81184019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee7584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e557484019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d8584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e0884019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd5984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b8784019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd8351792684019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f062100eb485db06269655cf186a68532985275428450359adc99cec6960711b884019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d72984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507e94975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d6584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde18784019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f384019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507eb7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b6484019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb17384019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad1684019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed70584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea984019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f1684019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d084019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d8350584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a531902584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a680035584019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac84019350838581820994508585860994508581860994505082840182018582820890508581875f5160206159e85f395f51905f5288090894508581875f516020615a085f395f51905f5287090893508581875f5160206159885f395f51905f5286090892508581875f5160206159c85f395f51905f528509089150507f1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38840193507f0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5830192507f1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c820191507f25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f810190508385818209945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a90910197507f13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a969093019550507f2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce90910192507f21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f9590190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b90910197507f0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a49093019550507f0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf90910192507f09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f14550190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383087f0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd433590910197507f2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b9093019550507f1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df90910192507f176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c4040190508385818009945085858609945085818609945050828581820993508584850993508581850993505081858182099250858384099250858184099250508085818209915085828309915085818309915050828401818301848501878282089050838401888482089050886004840981019250886004850982019350888482089050888383089150809750508295508094505080925050508398508297508196508095505050505050945094509450949050565b5f5f61513584845f68020000000000000000612560565b50919695505050505050565b50805461514d90615509565b5f825580601f1061515c575050565b601f0160209004905f5260205f209081019061153a9190615196565b60405180606001604052806003906020820280368337509192915050565b5b808211156151aa575f8155600101615197565b5090565b5f5f83601f8401126151be575f5ffd5b50813567ffffffffffffffff8111156151d5575f5ffd5b6020830191508360208285010111156151ec575f5ffd5b9250929050565b5f6102a08284031215615204575f5ffd5b50919050565b5f5f5f5f5f5f5f5f5f5f5f6103408c8e031215615225575f5ffd5b8b3567ffffffffffffffff81111561523b575f5ffd5b6152478e828f016151ae565b909c509a505060208c013567ffffffffffffffff811115615266575f5ffd5b6152728e828f016151ae565b909a50985061528690508d60408e016151f3565b96506102e08c013567ffffffffffffffff8111156152a2575f5ffd5b6152ae8e828f016151ae565b9097509550506103008c013567ffffffffffffffff8111156152ce575f5ffd5b6152da8e828f016151ae565b9095509350506103208c013567ffffffffffffffff8111156152fa575f5ffd5b6153068e828f016151ae565b915080935050809150509295989b509295989b9093969950565b80356001600160a01b0381168114615336575f5ffd5b919050565b5f6020828403121561534b575f5ffd5b61186e82615320565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b63ffffffff83168152604060208201525f6116e66040830184615354565b5f602082840312156153b0575f5ffd5b5035919050565b803563ffffffff81168114615336575f5ffd5b5f5f5f5f5f608086880312156153de575f5ffd5b85359450602086013593506153f5604087016153b7565b9250606086013567ffffffffffffffff811115615410575f5ffd5b61541c888289016151ae565b969995985093965092949392505050565b5f5f5f5f5f60808688031215615441575f5ffd5b61544a86615320565b94506020860135935060408601359250606086013567ffffffffffffffff811115615410575f5ffd5b5f5f60408385031215615484575f5ffd5b50508035926020909101359150565b5f5f5f604084860312156154a5575f5ffd5b6154ae846153b7565b9250602084013567ffffffffffffffff8111156154c9575f5ffd5b6154d5868287016151ae565b9497909650939450505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611871576118716154e2565b600181811c9082168061551d57607f821691505b60208210810361520457634e487b7160e01b5f52602260045260245ffd5b81810381811115611871576118716154e2565b5f6001820161555f5761555f6154e2565b5060010190565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6102c081525f6155a36102c083018587615566565b833560208481019190915284013560408085019190915284013560608085019190915284013560808085019190915284013560a08085019190915284013560c08085019190915284013560e08085019190915284013561010080850191909152840135610120808501919091528401356101408085019190915284013561016080850191909152840135610180808501919091528401356101a0808501919091528401356101c0808501919091528401356101e0808501919091528401356102008085019190915284013561022080850191909152840135610240808501919091528401356102608085019190915284013561028080850191909152909301356102a0909201919091525092915050565b5f82518060208501845e5f920191825250919050565b5f602082840312156156da575f5ffd5b5051919050565b604081525f6156f36040830186615354565b8281036020840152615706818587615566565b9695505050505050565b5f60208284031215615720575f5ffd5b8151801515811461572f575f5ffd5b9392505050565b818382375f9101908152919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261577357634e487b7160e01b5f52601260045260245ffd5b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b601f82111561120257805f5260205f20601f840160051c810160208510156157c55750805b601f840160051c820191505b81811015610e4f575f81556001016157d1565b815167ffffffffffffffff8111156157fe576157fe61578c565b6158128161580c8454615509565b846157a0565b6020601f821160018114615844575f831561582d5750848201515b5f19600385901b1c1916600184901b178455610e4f565b5f84815260208120601f198516915b828110156158735787850151825560209485019460019092019101615853565b508482101561589057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f6116e6602083018486615566565b89815288602082015287604082015286606082015285608082015261010060a08201525f6158e561010083018688615566565b60c08301949094525060e00152979650505050505050565b60018060a01b038f1681528d60208201528c60408201528b60608201528a60808201528960a082015261016060c08201525f61593e61016083018a8c615566565b82810360e084015261595181898b615566565b9050828103610100840152615967818789615566565b610120840195909552505061014001529c9b50505050505050505050505056fe00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac1530644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e70c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740ba26469706673582212201bf4d6ad6e0048ab35e4a077939c7768d88caf32e4e223475f623db4c2565bfb64736f6c634300081c0033", "nonce": "0x1", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000001": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x0000000000000000000000000000000000000000000000000000000000000005": "0x0577b5b4aa3eaba75b2a919d5d7c63b7258aa507d38e346bf2ff1d48790379ff", - "0x000000000000000000000000000000000000000000000000000000000000000e": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x0000000000000000000000000000000000000000000000000000000000000013": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x000000000000000000000000000000000000000000000000000000000000001a": "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000000000001b": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x000000000000000000000000000000000000000000000000000000000000001c": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x000000000000000000000000000000000000000000000000000000000000001d": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x000000000000000000000000000000000000000000000000000000000000001e": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x000000000000000000000000000000000000000000000000000000000000001f": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x0000000000000000000000000000000000000000000000000000000000000020": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x0000000000000000000000000000000000000000000000000000000000000021": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x0000000000000000000000000000000000000000000000000000000000000022": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x0000000000000000000000000000000000000000000000000000000000000023": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x0000000000000000000000000000000000000000000000000000000000000024": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0000000000000000000000000000000000000000000000000000000000000025": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0000000000000000000000000000000000000000000000000000000000000026": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x0000000000000000000000000000000000000000000000000000000000000027": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0000000000000000000000000000000000000000000000000000000000000028": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x0000000000000000000000000000000000000000000000000000000000000029": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x000000000000000000000000000000000000000000000000000000000000002a": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x000000000000000000000000000000000000000000000000000000000000002b": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x000000000000000000000000000000000000000000000000000000000000002c": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x000000000000000000000000000000000000000000000000000000000000002d": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x000000000000000000000000000000000000000000000000000000000000002e": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x000000000000000000000000000000000000000000000000000000000000002f": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x0000000000000000000000000000000000000000000000000000000000000030": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x0000000000000000000000000000000000000000000000000000000000000031": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0000000000000000000000000000000000000000000000000000000000000032": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x0000000000000000000000000000000000000000000000000000000000000034": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x0000000000000000000000000000000000000000000000000000000000000035": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x0000000000000000000000000000000000000000000000000000000000000036": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x0000000000000000000000000000000000000000000000000000000000000037": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0000000000000000000000000000000000000000000000000000000000000038": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x0000000000000000000000000000000000000000000000000000000000000039": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x000000000000000000000000000000000000000000000000000000000000003a": "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000000000000000000000000000000000000000003b": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x000000000000000000000000000000000000000000000000000000000000003c": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x000000000000000000000000000000000000000000000000000000000000003d": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x000000000000000000000000000000000000000000000000000000000000003e": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x000000000000000000000000000000000000000000000000000000000000003f": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x0000000000000000000000000000000000000000000000000000000000000040": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x0000000000000000000000000000000000000000000000000000000000000041": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x0000000000000000000000000000000000000000000000000000000000000042": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x0000000000000000000000000000000000000000000000000000000000000043": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x0000000000000000000000000000000000000000000000000000000000000044": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0000000000000000000000000000000000000000000000000000000000000045": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0000000000000000000000000000000000000000000000000000000000000046": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x0000000000000000000000000000000000000000000000000000000000000047": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0000000000000000000000000000000000000000000000000000000000000048": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x0000000000000000000000000000000000000000000000000000000000000049": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x000000000000000000000000000000000000000000000000000000000000004a": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x000000000000000000000000000000000000000000000000000000000000004b": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x000000000000000000000000000000000000000000000000000000000000004c": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x000000000000000000000000000000000000000000000000000000000000004d": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x000000000000000000000000000000000000000000000000000000000000004e": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x000000000000000000000000000000000000000000000000000000000000004f": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x0000000000000000000000000000000000000000000000000000000000000050": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x0000000000000000000000000000000000000000000000000000000000000051": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0000000000000000000000000000000000000000000000000000000000000052": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x0000000000000000000000000000000000000000000000000000000000000053": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x0000000000000000000000000000000000000000000000000000000000000054": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x0000000000000000000000000000000000000000000000000000000000000055": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x0000000000000000000000000000000000000000000000000000000000000056": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x0000000000000000000000000000000000000000000000000000000000000057": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0000000000000000000000000000000000000000000000000000000000000058": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x0000000000000000000000000000000000000000000000000000000000000059": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x000000000000000000000000000000000000000000000000000000000000005a": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", - "0x000000000000000000000000000000000000000000000000000000000000005b": "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", - "0x000000000000000000000000000000000000000000000000000000000000005c": "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", - "0x000000000000000000000000000000000000000000000000000000000000005d": "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", - "0x000000000000000000000000000000000000000000000000000000000000005e": "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", - "0x000000000000000000000000000000000000000000000000000000000000005f": "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", - "0x0000000000000000000000000000000000000000000000000000000000000060": "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", - "0x0000000000000000000000000000000000000000000000000000000000000061": "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6", - "0x0000000000000000000000000000000000000000000000000000000000000062": "0x1fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb", - "0x0000000000000000000000000000000000000000000000000000000000000063": "0x1a180441acbe2e25177de322888800476d75191e3c2c753300dedf84de7d2053", - "0x0000000000000000000000000000000000000000000000000000000000000064": "0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a", - "0x0000000000000000000000000000000000000000000000000000000000000065": "0x2de9cf8ca22a0c9f7ac822564e7e90726457ffdee6107772e7461aa6dacf876d", - "0x0000000000000000000000000000000000000000000000000000000000000066": "0x15e4cf322bd4693b5ba17d7d77599ed6b40e943b15d4b652dcd1b206f57a4c6e", - "0x0000000000000000000000000000000000000000000000000000000000000067": "0x02f79c24831208eb014af76127ee58b95cf9598ad1dad9c82e19f10b7fee8f6f", - "0x0000000000000000000000000000000000000000000000000000000000000068": "0x19d4d18c572a9b0b503094e1de87b8594e1d37dd1da42acdb3a19bd35f005a3a", - "0x0000000000000000000000000000000000000000000000000000000000000069": "0x24d3e3c36e11f6dac11d08927f0a925e2c4c42248a913c18da9f5cc0da73836a", - "0x000000000000000000000000000000000000000000000000000000000000006a": "0x131b0345b2f2564b2338810cd8d7b90a8d5a2fcc1a9a8876a494dbe3c8135c6c", - "0x000000000000000000000000000000000000000000000000000000000000006b": "0x0e765e363b659fafffce80bef02723bbbea3669cc9b07f327b4fc9c959c169a5", - "0x000000000000000000000000000000000000000000000000000000000000006c": "0x0f2d774b6dc7c8c6c49e2056f9f9e77d510637ff52368027fd8326821c83445a", - "0x000000000000000000000000000000000000000000000000000000000000006d": "0x16599e0bb19201fa33d4c00c3f7c5189552a26038ee219b1c8b08fd1b16ecd52", - "0x000000000000000000000000000000000000000000000000000000000000006e": "0x22f62d7c8204be97acc7644d4b14a422c17e573506e900a4788acbfb8c8b1aba", - "0x000000000000000000000000000000000000000000000000000000000000006f": "0x0691a1f6e7dd363914d2754f434659383019fe2a1d10a9ce92d152decccfc5f5", - "0x0000000000000000000000000000000000000000000000000000000000000070": "0x1250a6bd4582016e8af7d74a31a7d181864326e50cea97f643b70ec9d94e1efc", - "0x0000000000000000000000000000000000000000000000000000000000000071": "0x02d2011d328f63f5cb9eb68a6806f8ce624ceb84a876a390fda61d6d6bb5a530", - "0x0000000000000000000000000000000000000000000000000000000000000072": "0x1b593cc9332c0bb29333e5833284e18e765bb17fc0a7718f6b21d8a833a0765b", - "0x0000000000000000000000000000000000000000000000000000000000000073": "0x019bffd7d85c0863485890e50a717ebb21d4b888f0268d9c7258a3db25f969d9", - "0x0000000000000000000000000000000000000000000000000000000000000074": "0x12340d5bb49b5667c9194321fc364488d0f082a8fb1bc4f1b96359209b1bf110", - "0x0000000000000000000000000000000000000000000000000000000000000075": "0x2209d88df4bf41b2e002ff46f8ac45aa4ec8b222f4551c178fe50f99b505681f", - "0x0000000000000000000000000000000000000000000000000000000000000076": "0x04f95f7efd61e5dfab009860f0e53b7e65686c5dbb1b1a800d597ec130836f92", - "0x0000000000000000000000000000000000000000000000000000000000000077": "0x074b0f589c0d62b3ee0d70fd057f9d0e143a6b888d0a9f60ac1d0f1c77ddf863", - "0x0000000000000000000000000000000000000000000000000000000000000078": "0x05e7d0fbf97820e4f7e37899bee6f967bc67f5b396f760665eb5ce76f51cff90", - "0x0000000000000000000000000000000000000000000000000000000000000079": "0x0ee294cdea89cdfb6a3fd3f85316222c2e6e7482b9cd052cea388141037acdb5", - "0x000000000000000000000000000000000000000000000000000000000000007a": "0x073f3f1b95b5cafa069fe1bb5e08c8586775783cc6a11c35ab0107dbd0437dd6", - "0x000000000000000000000000000000000000000000000000000000000000007b": "0x12a604345e9442be58176866c68899249a7c14a777af0938a759826474ebb215", - "0x000000000000000000000000000000000000000000000000000000000000007c": "0x00b983d964a33bdccf941858b4eed650917cc9c35265f14ec2715dc6999c0489", - "0x000000000000000000000000000000000000000000000000000000000000007d": "0x1a1a7fbdc860bcc40d4b3eea4c8f469f991050b9fb6ef33ca3694edc4f36a82b", - "0x000000000000000000000000000000000000000000000000000000000000007e": "0x0df2ad5009b0aa7b9cc62d10f9fddc978e28452ef5f3bb3d274743359383592b", - "0x000000000000000000000000000000000000000000000000000000000000007f": "0x16e0518517026f2c7cbf14301679bcecd00e8babaf0bda664c49b02dcda6b4dd", - "0x0000000000000000000000000000000000000000000000000000000000000080": "0x205e35d27e9528e137e8f93ff50b877d6f0fa3230e1215df6360ef7ca4b3680a", - "0x0000000000000000000000000000000000000000000000000000000000000081": "0x2b14a855c417e66c86c9e1bd864e0a5b00d45bbe84e6d93749ef109d25790d9d", - "0x0000000000000000000000000000000000000000000000000000000000000082": "0x2cde883b4ec6916a780528e64ab784c3c081ed2d71397c5d739a5bd4f24a8e3c", - "0x0000000000000000000000000000000000000000000000000000000000000083": "0x1bf2b15c37a3eb5f94bbf12c10e19a22f3c8ddde72133d9fe32db2be7387a77c", - "0x0000000000000000000000000000000000000000000000000000000000000084": "0x1fd2be106c935c189640b47d2ad9deb51ff348845b7e6cf0eca562435735fa67", - "0x0000000000000000000000000000000000000000000000000000000000000085": "0x3029a5ede685ae7e42e029a4f1b22a0575d6b5cef84f695a2f987ede9fe41280", - "0x0000000000000000000000000000000000000000000000000000000000000086": "0x002c16523888340ddb03fff41ab7a56b492c345a76411e5d3467360264cc5f67", - "0x0000000000000000000000000000000000000000000000000000000000000087": "0x2c6d19a82f4a7679d929c99dbbe056cf07e74fe0460e9d5b81226b9b2283d96d", - "0x0000000000000000000000000000000000000000000000000000000000000088": "0x2c5164b5c7798ae26796f2374fe1acace1a69b5772352fdd9c09e83b95847e75", - "0x0000000000000000000000000000000000000000000000000000000000000089": "0x0d31f8f2a4e34d6731f1042d995d4ab9b3f9dc01e033446521947534ed617886", - "0x000000000000000000000000000000000000000000000000000000000000008a": "0x1f1a7feb56222e6eb83bf3beb69f5efcc05d10c2cff3d6c3f5b8134943ef678e", - "0x000000000000000000000000000000000000000000000000000000000000008b": "0x24c4aca03d4a952cc1b2879b1241b0669afde82390de9fc8edad89c2fda41014", - "0x000000000000000000000000000000000000000000000000000000000000008c": "0x1c0857ed41b1a306a787fd591e14f0190c7332745112e4d4aaa4f71fcdb18b1e", - "0x000000000000000000000000000000000000000000000000000000000000008d": "0x145e3cb92e0058bc04394485e73dd1f9ba87c2cc15a3b201c027e43109dbef81", - "0x000000000000000000000000000000000000000000000000000000000000008e": "0x26e0aeb64465f3ad7046be46afc13c942be769135549b36c833947b4e0da69df", - "0x000000000000000000000000000000000000000000000000000000000000008f": "0x21f428f358cce02f84038fd4cbd838dabd72b8ceed847cde16375f1c98ab81fd", - "0x0000000000000000000000000000000000000000000000000000000000000090": "0x0c3e112a2286b468499a5ea53e050bcb848dc0f70c7d758c7602e327746a063b", - "0x0000000000000000000000000000000000000000000000000000000000000091": "0x291d939f9e3a70af5d6d2d8caffc34175cbfab587d4e9e293821806149453d9e", - "0x0000000000000000000000000000000000000000000000000000000000000092": "0x2e81f77acaf016b7fc5567d50a96773c72743783e7bba0e5a12a4a135485a49f", - "0x0000000000000000000000000000000000000000000000000000000000000093": "0x12e0e08c58426173229fb99e97a35c8f75a8c4f30ec5ed8fbe7b00c81765c2ec", - "0x0000000000000000000000000000000000000000000000000000000000000094": "0x25ee0b3dc3db03f85b355d34f156066cc1ad50112589092d90de8ebb4017d116", - "0x0000000000000000000000000000000000000000000000000000000000000095": "0x0b29d0ddf485319a9bfbf6b263e865a67c6122e7f47ecc482f591f92e4effaf4", - "0x0000000000000000000000000000000000000000000000000000000000000096": "0x140f26545084fcd739e0abf03a75d1c889b8dd99818e9ae23ed638a63fee2191", - "0x0000000000000000000000000000000000000000000000000000000000000097": "0x2fb6de61ff780b7274373cb13232d4c9ad8487c6ebb1e3121a16ddec2c4b624c", - "0x0000000000000000000000000000000000000000000000000000000000000098": "0x0854275e7235881668b5b98251a66d8c9b82af0a6451da41d0eac04d4e7811c8", - "0x0000000000000000000000000000000000000000000000000000000000000099": "0x0822679ef57fef500de54d6cba8415ce9ac944d3afb1dd4cacce2b2ff451403f", - "0x000000000000000000000000000000000000000000000000000000000000009a": "0x1d0ca0d26b8051fcceaedb7a95f25c4cd5e71ffce3ae1f2942c3612c8f6e80a8", - "0x000000000000000000000000000000000000000000000000000000000000009b": "0x2353d576c4d9f118a4bc7b2c492f7164cf173bc2c37d17f7fa6126c7d0094927", - "0x000000000000000000000000000000000000000000000000000000000000009c": "0x188e9347138c524bda0413d4ad63350c88ba806491204abd61a285d192d50e14", - "0x000000000000000000000000000000000000000000000000000000000000009d": "0x126c2038a88263356a46f4de9a59b538df61a3c4cedee042ba66193debf0d4b7", - "0x000000000000000000000000000000000000000000000000000000000000009e": "0x1b34d0aba99f650468f0d3241fab6192755b6ee17d345f3c23f784c365e97e52", - "0x000000000000000000000000000000000000000000000000000000000000009f": "0x13f60d322ff331eeb58a3c85acc593c97f8930c1f07e92b9c19772ba6f185221", - "0x00000000000000000000000000000000000000000000000000000000000000a0": "0x10d2b5662f6977c2cf9b23c1d7dfce6a56ccc7baf7bc7b2cbb505368828888c1", - "0x00000000000000000000000000000000000000000000000000000000000000a1": "0x1000b1532ad15dab1910284d08588e0ed96b09a95a7b06180bd40f3e43041aa4", - "0x00000000000000000000000000000000000000000000000000000000000000a2": "0x0e4425e6397061fb0a1cb79d4861ee8e780ec260783d6462dda5109cf13e0311", - "0x00000000000000000000000000000000000000000000000000000000000000a3": "0x13999b236cd8cb12546b95e2234e5e92f2dbe1ea227ee7ff9477896864d9c26f", - "0x00000000000000000000000000000000000000000000000000000000000000a4": "0x16253ee85a590b7d7e450d3ef38b6d8d72e57d7985d98fdae9d3e69d280e1490", - "0x00000000000000000000000000000000000000000000000000000000000000a5": "0x0849dd12c0483e541856ebf80f3fe755a4f4cbc02a3921c2909d04890f9ce86b", - "0x00000000000000000000000000000000000000000000000000000000000000a6": "0x2f4f55d48db9c60e9b822552c9db290c03cfa51fe52e0980f99fd882bd2e0065", - "0x00000000000000000000000000000000000000000000000000000000000000a7": "0x26e9c4c282f2aba00a3f528e04abab1e63df8a908636c7295a4f67135c986e75", - "0x00000000000000000000000000000000000000000000000000000000000000a8": "0x1d5717b6a1d0d20e41d35e2c7d0b4fa001924d91618550026106b4fc2b978b9e", - "0x00000000000000000000000000000000000000000000000000000000000000a9": "0x16276c3116072ae2d3815ebef6eae3c7418641bc048667418409cb1a36a3c6bd", - "0x00000000000000000000000000000000000000000000000000000000000000aa": "0x200ace77e0d131b2652e782f50136c4f3e7bd21b7342327715ae96796b0e4785", - "0x00000000000000000000000000000000000000000000000000000000000000ab": "0x303f0d0ee0cfc4509ac0174c85aad3ee1aab586e90b118f8de5aa446d2aec8ca", - "0x00000000000000000000000000000000000000000000000000000000000000ac": "0x21d023dac5b44bad38d5b4f08ecc711cc9f9a916ee3a8e9e406236cef888f7e8", - "0x00000000000000000000000000000000000000000000000000000000000000ad": "0x1ee0da36a81b54a9eef3b4b0a1b2f8d697855a48b8db44478aa2383eb635b218", - "0x00000000000000000000000000000000000000000000000000000000000000ae": "0x2dbabb204983acc8179b7b3242862961b174d22f4fefcd81e68c6549c9a88cea", - "0x00000000000000000000000000000000000000000000000000000000000000af": "0x23954e35feba58a113fa213392abd035c2b032f0b4e83c2f52a83d18e54433bc", - "0x00000000000000000000000000000000000000000000000000000000000000b0": "0x2aed396db05f304fc6775f10e0aa0dceeefe297e511ad478414eb1ab84844957", - "0x00000000000000000000000000000000000000000000000000000000000000b1": "0x25221fd64e70bb4c90b30a2fb1852ddaa8704ba4680584651c3c9732f501e138", - "0x00000000000000000000000000000000000000000000000000000000000000b2": "0x04e4fe96e487b1979011964d97719275a68773ee23ba55fe2f809d69c10c3a22", - "0x00000000000000000000000000000000000000000000000000000000000000b3": "0x2c212b4c639445a6c03ea31cc755c51433c61afbed9eea3556b36f27cdf344a6", - "0x00000000000000000000000000000000000000000000000000000000000000b4": "0x249a023bda5b6a8d6b1e3d994693cdd3ad81f0282b95d5a15ddc36b195138e4e", - "0x00000000000000000000000000000000000000000000000000000000000000b5": "0x156b5cd887b306896b7ca039e2afa02868ba62817d7b7e5d2896ae14e1a9a7e5", - "0x00000000000000000000000000000000000000000000000000000000000000b6": "0x162d3e89ec9131809bc10150382a744f65af577521cc37c46bd00912f3eb4d31", - "0x00000000000000000000000000000000000000000000000000000000000000b7": "0x22075061e5564be974e193731c06a4e22cfc8242a38180c732ad2f0d4604e3fe", - "0x00000000000000000000000000000000000000000000000000000000000000b8": "0x0b6b9c320f299ad3afd75f0d0bd81afbb0e757f8307f61978d5de7817f608327", - "0x00000000000000000000000000000000000000000000000000000000000000b9": "0x0506e0a856c856e7634ab226160b6a323261a3e0c8810f68e2743a4263b57ee2", - "0x00000000000000000000000000000000000000000000000000000000000000ba": "0x2413c3e2b026ffff5628832762082690520fc5a22f825e3af1a86cc435901981", - "0x00000000000000000000000000000000000000000000000000000000000000bb": "0x2cef9a3613e8172d950b3c1cb7cab1224277ad2712ac02e96dc8519794a8ad5f", - "0x00000000000000000000000000000000000000000000000000000000000000bc": "0x0f636c6a10dbda008e10895d5b588f5b5d01a5da3a09c361c1a0b548b560b220", - "0x00000000000000000000000000000000000000000000000000000000000000bd": "0x18c09a08d500307171b4f240ce0f2c5e78866ec7e6374a0176047fa890fba0ff", - "0x00000000000000000000000000000000000000000000000000000000000000be": "0x0a3cc6a6411731de29dc727f71370d6c9ad89980d868ed69220b8807e76c9f1a", - "0x00000000000000000000000000000000000000000000000000000000000000bf": "0x199c7b72643a56c5dacc094c5ab51c19ea6d4e2ab5067abd873cfd728483ee3a", - "0x00000000000000000000000000000000000000000000000000000000000000c0": "0x0a9c91ec9d961021c7f3e816b9aa9a04257acde68474586c8a9d9d5c940807e8", - "0x00000000000000000000000000000000000000000000000000000000000000c1": "0x14c5fd147f901e87ded8a14a4fc59939bfb72af7f7e67186e733fe9bb2d03eca", - "0x00000000000000000000000000000000000000000000000000000000000000c2": "0x1acef925c3cca5dc9f0a031563d268374fdb1719c59b743c7ee6667ef6879399", - "0x00000000000000000000000000000000000000000000000000000000000000c3": "0x0ea860a77c1c5de892c3659365c610d079fa8d064fc0982291d5b2313505b8a2", - "0x00000000000000000000000000000000000000000000000000000000000000c4": "0x0cf81c182313729421c7b9a627208a70acde524a61589b88630842aec4151fbe", - "0x00000000000000000000000000000000000000000000000000000000000000c5": "0x03c1dd4555254c7c2663290bee910ae8f7359fe0cc45e306a9df149b9583fc28", - "0x00000000000000000000000000000000000000000000000000000000000000c6": "0x2380880753bc787886c9330c047d222cc2a90ac6be2fe1bbe69c3be7c83c7b0e", - "0x00000000000000000000000000000000000000000000000000000000000000c7": "0x1db6521a766a6d998d0502d2543209962f3352d55e72b29656bfc3d7e2a250d8", - "0x00000000000000000000000000000000000000000000000000000000000000c8": "0x05c4aa57c046dd90cdccc970263f2dec18fa0dac5108e96d9ef1511758d3d191", - "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x0c879e4b1793ca7ad312adf8d83aa14a3b7df00eff18e9e9b8d1da21dc0b3033", - "0x00000000000000000000000000000000000000000000000000000000000000ca": "0x2f234d5aab8610df7b41caf56ed7db37efde646138f699c64da49313f944b20b", - "0x00000000000000000000000000000000000000000000000000000000000000cb": "0x2abb52222822ff819894aa1506aceb69cdd387abb73d541f1e8ba8f971fb4375", - "0x00000000000000000000000000000000000000000000000000000000000000cc": "0x1d9472930835607a1a5543cc38ab10b3db29aa5bd46d779548a05927fae2531c", - "0x00000000000000000000000000000000000000000000000000000000000000cd": "0x22b45ca22855701aa0ecb8609bdc31390e8c94cd9935202ed90d90c07e5f6c67", - "0x00000000000000000000000000000000000000000000000000000000000000ce": "0x0a1f39f29473f6a16b502a67dc2683705e177ef3763ca210b36a6222f201928c", - "0x00000000000000000000000000000000000000000000000000000000000000cf": "0x156cc79f3ce078aad6e5696dca53bd414daee13f69b6e1843927981c36505697", - "0x00000000000000000000000000000000000000000000000000000000000000d0": "0x228e1ea054fd72054b743d4d83e8cb1fd688fcf6e988b79cd73c590befbea8c8", - "0x00000000000000000000000000000000000000000000000000000000000000d1": "0x26b7327ab922821bd4f8140cce34ff4ccea50fbc5422ae813c2656408cce3a70", - "0x00000000000000000000000000000000000000000000000000000000000000d2": "0x1f88cb99931d78883fc9390abb33404b4b7d45ab032cfabf43c2cba6bf04924c", - "0x00000000000000000000000000000000000000000000000000000000000000d3": "0x2c9a9e3033be9def3f405a74334e13abda0a9bf0e2dded80e07464946626163c", - "0x00000000000000000000000000000000000000000000000000000000000000d4": "0x1ffba91116956a6d7499ce126e4d007b26ba57aa42ca8d260b1e6cd7f38541c5", - "0x00000000000000000000000000000000000000000000000000000000000000d5": "0x04d01766bf4af18c1c993689ba59328da95a06be98204edda80174720e47b975", - "0x00000000000000000000000000000000000000000000000000000000000000d6": "0x0a3a44d64bcf0c2b158912d887c5993e9568331b7249d98aed3e143c555bee34", - "0x00000000000000000000000000000000000000000000000000000000000000d7": "0x1b03b3acfb879340d7ded90a8a34d6aaa567e052a02fde21942fee82e8f66410", - "0x00000000000000000000000000000000000000000000000000000000000000d8": "0x26fa331c2375a0bb32aa7f2084a5ff100db2398c10a3415fb1d082dffd478794", - "0x00000000000000000000000000000000000000000000000000000000000000d9": "0x27db7d141d06b30011b01150c3a4e29bb43e22eed0d8c7e73219256fad9255f8", - "0x00000000000000000000000000000000000000000000000000000000000000da": "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000000000000000000000000000000000000db": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x00000000000000000000000000000000000000000000000000000000000000dc": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x00000000000000000000000000000000000000000000000000000000000000dd": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x00000000000000000000000000000000000000000000000000000000000000de": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x00000000000000000000000000000000000000000000000000000000000000df": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x00000000000000000000000000000000000000000000000000000000000000e0": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x00000000000000000000000000000000000000000000000000000000000000e1": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x00000000000000000000000000000000000000000000000000000000000000e2": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x00000000000000000000000000000000000000000000000000000000000000e3": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x00000000000000000000000000000000000000000000000000000000000000e4": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x00000000000000000000000000000000000000000000000000000000000000e5": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x00000000000000000000000000000000000000000000000000000000000000e6": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x00000000000000000000000000000000000000000000000000000000000000e7": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x00000000000000000000000000000000000000000000000000000000000000e8": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x00000000000000000000000000000000000000000000000000000000000000e9": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x00000000000000000000000000000000000000000000000000000000000000ea": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x00000000000000000000000000000000000000000000000000000000000000eb": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x00000000000000000000000000000000000000000000000000000000000000ec": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x00000000000000000000000000000000000000000000000000000000000000ed": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x00000000000000000000000000000000000000000000000000000000000000ee": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x00000000000000000000000000000000000000000000000000000000000000ef": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x00000000000000000000000000000000000000000000000000000000000000f0": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x00000000000000000000000000000000000000000000000000000000000000f1": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x00000000000000000000000000000000000000000000000000000000000000f2": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x00000000000000000000000000000000000000000000000000000000000000f3": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x00000000000000000000000000000000000000000000000000000000000000f4": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x00000000000000000000000000000000000000000000000000000000000000f5": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x00000000000000000000000000000000000000000000000000000000000000f6": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x00000000000000000000000000000000000000000000000000000000000000f7": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x00000000000000000000000000000000000000000000000000000000000000f8": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x00000000000000000000000000000000000000000000000000000000000000f9": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", - "0x00000000000000000000000000000000000000000000000000000000000000fa": "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x00000000000000000000000000000000000000000000000000000000000000fb": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", - "0x00000000000000000000000000000000000000000000000000000000000000fc": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", - "0x00000000000000000000000000000000000000000000000000000000000000fd": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", - "0x00000000000000000000000000000000000000000000000000000000000000fe": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", - "0x00000000000000000000000000000000000000000000000000000000000000ff": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", - "0x0000000000000000000000000000000000000000000000000000000000000100": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", - "0x0000000000000000000000000000000000000000000000000000000000000101": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", - "0x0000000000000000000000000000000000000000000000000000000000000102": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", - "0x0000000000000000000000000000000000000000000000000000000000000103": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", - "0x0000000000000000000000000000000000000000000000000000000000000104": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", - "0x0000000000000000000000000000000000000000000000000000000000000105": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", - "0x0000000000000000000000000000000000000000000000000000000000000106": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", - "0x0000000000000000000000000000000000000000000000000000000000000107": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", - "0x0000000000000000000000000000000000000000000000000000000000000108": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", - "0x0000000000000000000000000000000000000000000000000000000000000109": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", - "0x000000000000000000000000000000000000000000000000000000000000010a": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", - "0x000000000000000000000000000000000000000000000000000000000000010b": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", - "0x000000000000000000000000000000000000000000000000000000000000010c": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", - "0x000000000000000000000000000000000000000000000000000000000000010d": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", - "0x000000000000000000000000000000000000000000000000000000000000010e": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", - "0x000000000000000000000000000000000000000000000000000000000000010f": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", - "0x0000000000000000000000000000000000000000000000000000000000000110": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", - "0x0000000000000000000000000000000000000000000000000000000000000111": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", - "0x0000000000000000000000000000000000000000000000000000000000000112": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", - "0x0000000000000000000000000000000000000000000000000000000000000113": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", - "0x0000000000000000000000000000000000000000000000000000000000000114": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", - "0x0000000000000000000000000000000000000000000000000000000000000115": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", - "0x0000000000000000000000000000000000000000000000000000000000000116": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", - "0x0000000000000000000000000000000000000000000000000000000000000117": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", - "0x0000000000000000000000000000000000000000000000000000000000000118": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", - "0x0000000000000000000000000000000000000000000000000000000000000119": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14" + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x0000000000000000000000000000000000000000000000000000000000000008": "0x0577b5b4aa3eaba75b2a919d5d7c63b7258aa507d38e346bf2ff1d48790379ff", + "0x0000000000000000000000000000000000000000000000000000000000000011": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x0000000000000000000000000000000000000000000000000000000000000016": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x000000000000000000000000000000000000000000000000000000000000001d": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000001e": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x000000000000000000000000000000000000000000000000000000000000001f": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x0000000000000000000000000000000000000000000000000000000000000020": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x0000000000000000000000000000000000000000000000000000000000000021": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x0000000000000000000000000000000000000000000000000000000000000022": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x0000000000000000000000000000000000000000000000000000000000000041": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x0000000000000000000000000000000000000000000000000000000000000042": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x0000000000000000000000000000000000000000000000000000000000000043": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x0000000000000000000000000000000000000000000000000000000000000044": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x0000000000000000000000000000000000000000000000000000000000000045": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x0000000000000000000000000000000000000000000000000000000000000046": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x0000000000000000000000000000000000000000000000000000000000000047": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0000000000000000000000000000000000000000000000000000000000000048": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0000000000000000000000000000000000000000000000000000000000000049": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x000000000000000000000000000000000000000000000000000000000000004a": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x000000000000000000000000000000000000000000000000000000000000004b": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x000000000000000000000000000000000000000000000000000000000000004c": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x000000000000000000000000000000000000000000000000000000000000004d": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x000000000000000000000000000000000000000000000000000000000000004e": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x000000000000000000000000000000000000000000000000000000000000004f": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x0000000000000000000000000000000000000000000000000000000000000050": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x0000000000000000000000000000000000000000000000000000000000000051": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x0000000000000000000000000000000000000000000000000000000000000052": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x0000000000000000000000000000000000000000000000000000000000000053": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x0000000000000000000000000000000000000000000000000000000000000054": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0000000000000000000000000000000000000000000000000000000000000055": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x0000000000000000000000000000000000000000000000000000000000000056": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x0000000000000000000000000000000000000000000000000000000000000057": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x0000000000000000000000000000000000000000000000000000000000000058": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x0000000000000000000000000000000000000000000000000000000000000059": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x000000000000000000000000000000000000000000000000000000000000005a": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x000000000000000000000000000000000000000000000000000000000000005b": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x000000000000000000000000000000000000000000000000000000000000005c": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x000000000000000000000000000000000000000000000000000000000000005d": "0x0b59baa35b9dc267744f0ccb4e3b0255c1fc512460d91130c6bc19fb2668568d", + "0x000000000000000000000000000000000000000000000000000000000000005e": "0x2c45bb0c3d5bc1dc98e0baef09ff46d18c1a451e724f41c2b675549bb5c80e59", + "0x000000000000000000000000000000000000000000000000000000000000005f": "0x121468e6710bf1ffec6d0f26743afe6f88ef55dab40b83ca0a39bc44b196374c", + "0x0000000000000000000000000000000000000000000000000000000000000060": "0x2042c32c823a7440ceb6c342f9125f1fe426b02c527cd8fb28c85d02b705e759", + "0x0000000000000000000000000000000000000000000000000000000000000061": "0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5", + "0x0000000000000000000000000000000000000000000000000000000000000062": "0x0f55a0d491a9da093eb999fa0dffaf904620cbc78d07e63c6f795c5c7512b523", + "0x0000000000000000000000000000000000000000000000000000000000000063": "0x21849764e1aa64b83a69e39d27eedaec2a8f97066e5ddb74634ffdb11388dd9a", + "0x0000000000000000000000000000000000000000000000000000000000000064": "0x2e33ee2008411c04b99c24b313513d097a0d21a5040b6193d1f978b8226892d6", + "0x0000000000000000000000000000000000000000000000000000000000000065": "0x1fd848aa69e1633722fe249a5b7f53b094f1c9cef9f5c694b073fd1cc5850dfb", + "0x0000000000000000000000000000000000000000000000000000000000000066": "0x1a180441acbe2e25177de322888800476d75191e3c2c753300dedf84de7d2053", + "0x0000000000000000000000000000000000000000000000000000000000000067": "0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a", + "0x0000000000000000000000000000000000000000000000000000000000000068": "0x2de9cf8ca22a0c9f7ac822564e7e90726457ffdee6107772e7461aa6dacf876d", + "0x0000000000000000000000000000000000000000000000000000000000000069": "0x15e4cf322bd4693b5ba17d7d77599ed6b40e943b15d4b652dcd1b206f57a4c6e", + "0x000000000000000000000000000000000000000000000000000000000000006a": "0x02f79c24831208eb014af76127ee58b95cf9598ad1dad9c82e19f10b7fee8f6f", + "0x000000000000000000000000000000000000000000000000000000000000006b": "0x19d4d18c572a9b0b503094e1de87b8594e1d37dd1da42acdb3a19bd35f005a3a", + "0x000000000000000000000000000000000000000000000000000000000000006c": "0x24d3e3c36e11f6dac11d08927f0a925e2c4c42248a913c18da9f5cc0da73836a", + "0x000000000000000000000000000000000000000000000000000000000000006d": "0x131b0345b2f2564b2338810cd8d7b90a8d5a2fcc1a9a8876a494dbe3c8135c6c", + "0x000000000000000000000000000000000000000000000000000000000000006e": "0x0e765e363b659fafffce80bef02723bbbea3669cc9b07f327b4fc9c959c169a5", + "0x000000000000000000000000000000000000000000000000000000000000006f": "0x0f2d774b6dc7c8c6c49e2056f9f9e77d510637ff52368027fd8326821c83445a", + "0x0000000000000000000000000000000000000000000000000000000000000070": "0x16599e0bb19201fa33d4c00c3f7c5189552a26038ee219b1c8b08fd1b16ecd52", + "0x0000000000000000000000000000000000000000000000000000000000000071": "0x22f62d7c8204be97acc7644d4b14a422c17e573506e900a4788acbfb8c8b1aba", + "0x0000000000000000000000000000000000000000000000000000000000000072": "0x0691a1f6e7dd363914d2754f434659383019fe2a1d10a9ce92d152decccfc5f5", + "0x0000000000000000000000000000000000000000000000000000000000000073": "0x1250a6bd4582016e8af7d74a31a7d181864326e50cea97f643b70ec9d94e1efc", + "0x0000000000000000000000000000000000000000000000000000000000000074": "0x02d2011d328f63f5cb9eb68a6806f8ce624ceb84a876a390fda61d6d6bb5a530", + "0x0000000000000000000000000000000000000000000000000000000000000075": "0x1b593cc9332c0bb29333e5833284e18e765bb17fc0a7718f6b21d8a833a0765b", + "0x0000000000000000000000000000000000000000000000000000000000000076": "0x019bffd7d85c0863485890e50a717ebb21d4b888f0268d9c7258a3db25f969d9", + "0x0000000000000000000000000000000000000000000000000000000000000077": "0x12340d5bb49b5667c9194321fc364488d0f082a8fb1bc4f1b96359209b1bf110", + "0x0000000000000000000000000000000000000000000000000000000000000078": "0x2209d88df4bf41b2e002ff46f8ac45aa4ec8b222f4551c178fe50f99b505681f", + "0x0000000000000000000000000000000000000000000000000000000000000079": "0x04f95f7efd61e5dfab009860f0e53b7e65686c5dbb1b1a800d597ec130836f92", + "0x000000000000000000000000000000000000000000000000000000000000007a": "0x074b0f589c0d62b3ee0d70fd057f9d0e143a6b888d0a9f60ac1d0f1c77ddf863", + "0x000000000000000000000000000000000000000000000000000000000000007b": "0x05e7d0fbf97820e4f7e37899bee6f967bc67f5b396f760665eb5ce76f51cff90", + "0x000000000000000000000000000000000000000000000000000000000000007c": "0x0ee294cdea89cdfb6a3fd3f85316222c2e6e7482b9cd052cea388141037acdb5", + "0x000000000000000000000000000000000000000000000000000000000000007d": "0x073f3f1b95b5cafa069fe1bb5e08c8586775783cc6a11c35ab0107dbd0437dd6", + "0x000000000000000000000000000000000000000000000000000000000000007e": "0x12a604345e9442be58176866c68899249a7c14a777af0938a759826474ebb215", + "0x000000000000000000000000000000000000000000000000000000000000007f": "0x00b983d964a33bdccf941858b4eed650917cc9c35265f14ec2715dc6999c0489", + "0x0000000000000000000000000000000000000000000000000000000000000080": "0x1a1a7fbdc860bcc40d4b3eea4c8f469f991050b9fb6ef33ca3694edc4f36a82b", + "0x0000000000000000000000000000000000000000000000000000000000000081": "0x0df2ad5009b0aa7b9cc62d10f9fddc978e28452ef5f3bb3d274743359383592b", + "0x0000000000000000000000000000000000000000000000000000000000000082": "0x16e0518517026f2c7cbf14301679bcecd00e8babaf0bda664c49b02dcda6b4dd", + "0x0000000000000000000000000000000000000000000000000000000000000083": "0x205e35d27e9528e137e8f93ff50b877d6f0fa3230e1215df6360ef7ca4b3680a", + "0x0000000000000000000000000000000000000000000000000000000000000084": "0x2b14a855c417e66c86c9e1bd864e0a5b00d45bbe84e6d93749ef109d25790d9d", + "0x0000000000000000000000000000000000000000000000000000000000000085": "0x2cde883b4ec6916a780528e64ab784c3c081ed2d71397c5d739a5bd4f24a8e3c", + "0x0000000000000000000000000000000000000000000000000000000000000086": "0x1bf2b15c37a3eb5f94bbf12c10e19a22f3c8ddde72133d9fe32db2be7387a77c", + "0x0000000000000000000000000000000000000000000000000000000000000087": "0x1fd2be106c935c189640b47d2ad9deb51ff348845b7e6cf0eca562435735fa67", + "0x0000000000000000000000000000000000000000000000000000000000000088": "0x3029a5ede685ae7e42e029a4f1b22a0575d6b5cef84f695a2f987ede9fe41280", + "0x0000000000000000000000000000000000000000000000000000000000000089": "0x002c16523888340ddb03fff41ab7a56b492c345a76411e5d3467360264cc5f67", + "0x000000000000000000000000000000000000000000000000000000000000008a": "0x2c6d19a82f4a7679d929c99dbbe056cf07e74fe0460e9d5b81226b9b2283d96d", + "0x000000000000000000000000000000000000000000000000000000000000008b": "0x2c5164b5c7798ae26796f2374fe1acace1a69b5772352fdd9c09e83b95847e75", + "0x000000000000000000000000000000000000000000000000000000000000008c": "0x0d31f8f2a4e34d6731f1042d995d4ab9b3f9dc01e033446521947534ed617886", + "0x000000000000000000000000000000000000000000000000000000000000008d": "0x1f1a7feb56222e6eb83bf3beb69f5efcc05d10c2cff3d6c3f5b8134943ef678e", + "0x000000000000000000000000000000000000000000000000000000000000008e": "0x24c4aca03d4a952cc1b2879b1241b0669afde82390de9fc8edad89c2fda41014", + "0x000000000000000000000000000000000000000000000000000000000000008f": "0x1c0857ed41b1a306a787fd591e14f0190c7332745112e4d4aaa4f71fcdb18b1e", + "0x0000000000000000000000000000000000000000000000000000000000000090": "0x145e3cb92e0058bc04394485e73dd1f9ba87c2cc15a3b201c027e43109dbef81", + "0x0000000000000000000000000000000000000000000000000000000000000091": "0x26e0aeb64465f3ad7046be46afc13c942be769135549b36c833947b4e0da69df", + "0x0000000000000000000000000000000000000000000000000000000000000092": "0x21f428f358cce02f84038fd4cbd838dabd72b8ceed847cde16375f1c98ab81fd", + "0x0000000000000000000000000000000000000000000000000000000000000093": "0x0c3e112a2286b468499a5ea53e050bcb848dc0f70c7d758c7602e327746a063b", + "0x0000000000000000000000000000000000000000000000000000000000000094": "0x291d939f9e3a70af5d6d2d8caffc34175cbfab587d4e9e293821806149453d9e", + "0x0000000000000000000000000000000000000000000000000000000000000095": "0x2e81f77acaf016b7fc5567d50a96773c72743783e7bba0e5a12a4a135485a49f", + "0x0000000000000000000000000000000000000000000000000000000000000096": "0x12e0e08c58426173229fb99e97a35c8f75a8c4f30ec5ed8fbe7b00c81765c2ec", + "0x0000000000000000000000000000000000000000000000000000000000000097": "0x25ee0b3dc3db03f85b355d34f156066cc1ad50112589092d90de8ebb4017d116", + "0x0000000000000000000000000000000000000000000000000000000000000098": "0x0b29d0ddf485319a9bfbf6b263e865a67c6122e7f47ecc482f591f92e4effaf4", + "0x0000000000000000000000000000000000000000000000000000000000000099": "0x140f26545084fcd739e0abf03a75d1c889b8dd99818e9ae23ed638a63fee2191", + "0x000000000000000000000000000000000000000000000000000000000000009a": "0x2fb6de61ff780b7274373cb13232d4c9ad8487c6ebb1e3121a16ddec2c4b624c", + "0x000000000000000000000000000000000000000000000000000000000000009b": "0x0854275e7235881668b5b98251a66d8c9b82af0a6451da41d0eac04d4e7811c8", + "0x000000000000000000000000000000000000000000000000000000000000009c": "0x0822679ef57fef500de54d6cba8415ce9ac944d3afb1dd4cacce2b2ff451403f", + "0x000000000000000000000000000000000000000000000000000000000000009d": "0x1d0ca0d26b8051fcceaedb7a95f25c4cd5e71ffce3ae1f2942c3612c8f6e80a8", + "0x000000000000000000000000000000000000000000000000000000000000009e": "0x2353d576c4d9f118a4bc7b2c492f7164cf173bc2c37d17f7fa6126c7d0094927", + "0x000000000000000000000000000000000000000000000000000000000000009f": "0x188e9347138c524bda0413d4ad63350c88ba806491204abd61a285d192d50e14", + "0x00000000000000000000000000000000000000000000000000000000000000a0": "0x126c2038a88263356a46f4de9a59b538df61a3c4cedee042ba66193debf0d4b7", + "0x00000000000000000000000000000000000000000000000000000000000000a1": "0x1b34d0aba99f650468f0d3241fab6192755b6ee17d345f3c23f784c365e97e52", + "0x00000000000000000000000000000000000000000000000000000000000000a2": "0x13f60d322ff331eeb58a3c85acc593c97f8930c1f07e92b9c19772ba6f185221", + "0x00000000000000000000000000000000000000000000000000000000000000a3": "0x10d2b5662f6977c2cf9b23c1d7dfce6a56ccc7baf7bc7b2cbb505368828888c1", + "0x00000000000000000000000000000000000000000000000000000000000000a4": "0x1000b1532ad15dab1910284d08588e0ed96b09a95a7b06180bd40f3e43041aa4", + "0x00000000000000000000000000000000000000000000000000000000000000a5": "0x0e4425e6397061fb0a1cb79d4861ee8e780ec260783d6462dda5109cf13e0311", + "0x00000000000000000000000000000000000000000000000000000000000000a6": "0x13999b236cd8cb12546b95e2234e5e92f2dbe1ea227ee7ff9477896864d9c26f", + "0x00000000000000000000000000000000000000000000000000000000000000a7": "0x16253ee85a590b7d7e450d3ef38b6d8d72e57d7985d98fdae9d3e69d280e1490", + "0x00000000000000000000000000000000000000000000000000000000000000a8": "0x0849dd12c0483e541856ebf80f3fe755a4f4cbc02a3921c2909d04890f9ce86b", + "0x00000000000000000000000000000000000000000000000000000000000000a9": "0x2f4f55d48db9c60e9b822552c9db290c03cfa51fe52e0980f99fd882bd2e0065", + "0x00000000000000000000000000000000000000000000000000000000000000aa": "0x26e9c4c282f2aba00a3f528e04abab1e63df8a908636c7295a4f67135c986e75", + "0x00000000000000000000000000000000000000000000000000000000000000ab": "0x1d5717b6a1d0d20e41d35e2c7d0b4fa001924d91618550026106b4fc2b978b9e", + "0x00000000000000000000000000000000000000000000000000000000000000ac": "0x16276c3116072ae2d3815ebef6eae3c7418641bc048667418409cb1a36a3c6bd", + "0x00000000000000000000000000000000000000000000000000000000000000ad": "0x200ace77e0d131b2652e782f50136c4f3e7bd21b7342327715ae96796b0e4785", + "0x00000000000000000000000000000000000000000000000000000000000000ae": "0x303f0d0ee0cfc4509ac0174c85aad3ee1aab586e90b118f8de5aa446d2aec8ca", + "0x00000000000000000000000000000000000000000000000000000000000000af": "0x21d023dac5b44bad38d5b4f08ecc711cc9f9a916ee3a8e9e406236cef888f7e8", + "0x00000000000000000000000000000000000000000000000000000000000000b0": "0x1ee0da36a81b54a9eef3b4b0a1b2f8d697855a48b8db44478aa2383eb635b218", + "0x00000000000000000000000000000000000000000000000000000000000000b1": "0x2dbabb204983acc8179b7b3242862961b174d22f4fefcd81e68c6549c9a88cea", + "0x00000000000000000000000000000000000000000000000000000000000000b2": "0x23954e35feba58a113fa213392abd035c2b032f0b4e83c2f52a83d18e54433bc", + "0x00000000000000000000000000000000000000000000000000000000000000b3": "0x2aed396db05f304fc6775f10e0aa0dceeefe297e511ad478414eb1ab84844957", + "0x00000000000000000000000000000000000000000000000000000000000000b4": "0x25221fd64e70bb4c90b30a2fb1852ddaa8704ba4680584651c3c9732f501e138", + "0x00000000000000000000000000000000000000000000000000000000000000b5": "0x04e4fe96e487b1979011964d97719275a68773ee23ba55fe2f809d69c10c3a22", + "0x00000000000000000000000000000000000000000000000000000000000000b6": "0x2c212b4c639445a6c03ea31cc755c51433c61afbed9eea3556b36f27cdf344a6", + "0x00000000000000000000000000000000000000000000000000000000000000b7": "0x249a023bda5b6a8d6b1e3d994693cdd3ad81f0282b95d5a15ddc36b195138e4e", + "0x00000000000000000000000000000000000000000000000000000000000000b8": "0x156b5cd887b306896b7ca039e2afa02868ba62817d7b7e5d2896ae14e1a9a7e5", + "0x00000000000000000000000000000000000000000000000000000000000000b9": "0x162d3e89ec9131809bc10150382a744f65af577521cc37c46bd00912f3eb4d31", + "0x00000000000000000000000000000000000000000000000000000000000000ba": "0x22075061e5564be974e193731c06a4e22cfc8242a38180c732ad2f0d4604e3fe", + "0x00000000000000000000000000000000000000000000000000000000000000bb": "0x0b6b9c320f299ad3afd75f0d0bd81afbb0e757f8307f61978d5de7817f608327", + "0x00000000000000000000000000000000000000000000000000000000000000bc": "0x0506e0a856c856e7634ab226160b6a323261a3e0c8810f68e2743a4263b57ee2", + "0x00000000000000000000000000000000000000000000000000000000000000bd": "0x2413c3e2b026ffff5628832762082690520fc5a22f825e3af1a86cc435901981", + "0x00000000000000000000000000000000000000000000000000000000000000be": "0x2cef9a3613e8172d950b3c1cb7cab1224277ad2712ac02e96dc8519794a8ad5f", + "0x00000000000000000000000000000000000000000000000000000000000000bf": "0x0f636c6a10dbda008e10895d5b588f5b5d01a5da3a09c361c1a0b548b560b220", + "0x00000000000000000000000000000000000000000000000000000000000000c0": "0x18c09a08d500307171b4f240ce0f2c5e78866ec7e6374a0176047fa890fba0ff", + "0x00000000000000000000000000000000000000000000000000000000000000c1": "0x0a3cc6a6411731de29dc727f71370d6c9ad89980d868ed69220b8807e76c9f1a", + "0x00000000000000000000000000000000000000000000000000000000000000c2": "0x199c7b72643a56c5dacc094c5ab51c19ea6d4e2ab5067abd873cfd728483ee3a", + "0x00000000000000000000000000000000000000000000000000000000000000c3": "0x0a9c91ec9d961021c7f3e816b9aa9a04257acde68474586c8a9d9d5c940807e8", + "0x00000000000000000000000000000000000000000000000000000000000000c4": "0x14c5fd147f901e87ded8a14a4fc59939bfb72af7f7e67186e733fe9bb2d03eca", + "0x00000000000000000000000000000000000000000000000000000000000000c5": "0x1acef925c3cca5dc9f0a031563d268374fdb1719c59b743c7ee6667ef6879399", + "0x00000000000000000000000000000000000000000000000000000000000000c6": "0x0ea860a77c1c5de892c3659365c610d079fa8d064fc0982291d5b2313505b8a2", + "0x00000000000000000000000000000000000000000000000000000000000000c7": "0x0cf81c182313729421c7b9a627208a70acde524a61589b88630842aec4151fbe", + "0x00000000000000000000000000000000000000000000000000000000000000c8": "0x03c1dd4555254c7c2663290bee910ae8f7359fe0cc45e306a9df149b9583fc28", + "0x00000000000000000000000000000000000000000000000000000000000000c9": "0x2380880753bc787886c9330c047d222cc2a90ac6be2fe1bbe69c3be7c83c7b0e", + "0x00000000000000000000000000000000000000000000000000000000000000ca": "0x1db6521a766a6d998d0502d2543209962f3352d55e72b29656bfc3d7e2a250d8", + "0x00000000000000000000000000000000000000000000000000000000000000cb": "0x05c4aa57c046dd90cdccc970263f2dec18fa0dac5108e96d9ef1511758d3d191", + "0x00000000000000000000000000000000000000000000000000000000000000cc": "0x0c879e4b1793ca7ad312adf8d83aa14a3b7df00eff18e9e9b8d1da21dc0b3033", + "0x00000000000000000000000000000000000000000000000000000000000000cd": "0x2f234d5aab8610df7b41caf56ed7db37efde646138f699c64da49313f944b20b", + "0x00000000000000000000000000000000000000000000000000000000000000ce": "0x2abb52222822ff819894aa1506aceb69cdd387abb73d541f1e8ba8f971fb4375", + "0x00000000000000000000000000000000000000000000000000000000000000cf": "0x1d9472930835607a1a5543cc38ab10b3db29aa5bd46d779548a05927fae2531c", + "0x00000000000000000000000000000000000000000000000000000000000000d0": "0x22b45ca22855701aa0ecb8609bdc31390e8c94cd9935202ed90d90c07e5f6c67", + "0x00000000000000000000000000000000000000000000000000000000000000d1": "0x0a1f39f29473f6a16b502a67dc2683705e177ef3763ca210b36a6222f201928c", + "0x00000000000000000000000000000000000000000000000000000000000000d2": "0x156cc79f3ce078aad6e5696dca53bd414daee13f69b6e1843927981c36505697", + "0x00000000000000000000000000000000000000000000000000000000000000d3": "0x228e1ea054fd72054b743d4d83e8cb1fd688fcf6e988b79cd73c590befbea8c8", + "0x00000000000000000000000000000000000000000000000000000000000000d4": "0x26b7327ab922821bd4f8140cce34ff4ccea50fbc5422ae813c2656408cce3a70", + "0x00000000000000000000000000000000000000000000000000000000000000d5": "0x1f88cb99931d78883fc9390abb33404b4b7d45ab032cfabf43c2cba6bf04924c", + "0x00000000000000000000000000000000000000000000000000000000000000d6": "0x2c9a9e3033be9def3f405a74334e13abda0a9bf0e2dded80e07464946626163c", + "0x00000000000000000000000000000000000000000000000000000000000000d7": "0x1ffba91116956a6d7499ce126e4d007b26ba57aa42ca8d260b1e6cd7f38541c5", + "0x00000000000000000000000000000000000000000000000000000000000000d8": "0x04d01766bf4af18c1c993689ba59328da95a06be98204edda80174720e47b975", + "0x00000000000000000000000000000000000000000000000000000000000000d9": "0x0a3a44d64bcf0c2b158912d887c5993e9568331b7249d98aed3e143c555bee34", + "0x00000000000000000000000000000000000000000000000000000000000000da": "0x1b03b3acfb879340d7ded90a8a34d6aaa567e052a02fde21942fee82e8f66410", + "0x00000000000000000000000000000000000000000000000000000000000000db": "0x26fa331c2375a0bb32aa7f2084a5ff100db2398c10a3415fb1d082dffd478794", + "0x00000000000000000000000000000000000000000000000000000000000000dc": "0x27db7d141d06b30011b01150c3a4e29bb43e22eed0d8c7e73219256fad9255f8", + "0x00000000000000000000000000000000000000000000000000000000000000dd": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000de": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x00000000000000000000000000000000000000000000000000000000000000df": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x00000000000000000000000000000000000000000000000000000000000000e0": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x00000000000000000000000000000000000000000000000000000000000000e1": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x00000000000000000000000000000000000000000000000000000000000000e2": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x00000000000000000000000000000000000000000000000000000000000000e3": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x00000000000000000000000000000000000000000000000000000000000000e4": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x00000000000000000000000000000000000000000000000000000000000000e5": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x00000000000000000000000000000000000000000000000000000000000000e6": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x00000000000000000000000000000000000000000000000000000000000000e7": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x00000000000000000000000000000000000000000000000000000000000000e8": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x00000000000000000000000000000000000000000000000000000000000000e9": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x00000000000000000000000000000000000000000000000000000000000000ea": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x00000000000000000000000000000000000000000000000000000000000000eb": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x00000000000000000000000000000000000000000000000000000000000000ec": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x00000000000000000000000000000000000000000000000000000000000000ed": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x00000000000000000000000000000000000000000000000000000000000000ee": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x00000000000000000000000000000000000000000000000000000000000000ef": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x00000000000000000000000000000000000000000000000000000000000000f0": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x00000000000000000000000000000000000000000000000000000000000000f1": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x00000000000000000000000000000000000000000000000000000000000000f2": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x00000000000000000000000000000000000000000000000000000000000000f3": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x00000000000000000000000000000000000000000000000000000000000000f4": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x00000000000000000000000000000000000000000000000000000000000000f5": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x00000000000000000000000000000000000000000000000000000000000000f6": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x00000000000000000000000000000000000000000000000000000000000000f7": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x00000000000000000000000000000000000000000000000000000000000000f8": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x00000000000000000000000000000000000000000000000000000000000000f9": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x00000000000000000000000000000000000000000000000000000000000000fa": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x00000000000000000000000000000000000000000000000000000000000000fb": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x00000000000000000000000000000000000000000000000000000000000000fc": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x00000000000000000000000000000000000000000000000000000000000000fd": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000fe": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x00000000000000000000000000000000000000000000000000000000000000ff": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x0000000000000000000000000000000000000000000000000000000000000100": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x0000000000000000000000000000000000000000000000000000000000000101": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x0000000000000000000000000000000000000000000000000000000000000102": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x0000000000000000000000000000000000000000000000000000000000000103": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x0000000000000000000000000000000000000000000000000000000000000104": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x0000000000000000000000000000000000000000000000000000000000000105": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x0000000000000000000000000000000000000000000000000000000000000106": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x0000000000000000000000000000000000000000000000000000000000000107": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0000000000000000000000000000000000000000000000000000000000000108": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0000000000000000000000000000000000000000000000000000000000000109": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x000000000000000000000000000000000000000000000000000000000000010a": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x000000000000000000000000000000000000000000000000000000000000010b": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x000000000000000000000000000000000000000000000000000000000000010c": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x000000000000000000000000000000000000000000000000000000000000010d": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x000000000000000000000000000000000000000000000000000000000000010e": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x000000000000000000000000000000000000000000000000000000000000010f": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x0000000000000000000000000000000000000000000000000000000000000110": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x0000000000000000000000000000000000000000000000000000000000000111": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x0000000000000000000000000000000000000000000000000000000000000112": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x0000000000000000000000000000000000000000000000000000000000000113": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x0000000000000000000000000000000000000000000000000000000000000114": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0000000000000000000000000000000000000000000000000000000000000115": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x0000000000000000000000000000000000000000000000000000000000000116": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x0000000000000000000000000000000000000000000000000000000000000117": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x0000000000000000000000000000000000000000000000000000000000000118": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x0000000000000000000000000000000000000000000000000000000000000119": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x000000000000000000000000000000000000000000000000000000000000011a": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x000000000000000000000000000000000000000000000000000000000000011b": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x000000000000000000000000000000000000000000000000000000000000011c": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14", + "0x000000000000000000000000000000000000000000000000000000000000011d": "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000000011e": "0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1", + "0x000000000000000000000000000000000000000000000000000000000000011f": "0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290", + "0x0000000000000000000000000000000000000000000000000000000000000120": "0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20", + "0x0000000000000000000000000000000000000000000000000000000000000121": "0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e", + "0x0000000000000000000000000000000000000000000000000000000000000122": "0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf", + "0x0000000000000000000000000000000000000000000000000000000000000123": "0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76", + "0x0000000000000000000000000000000000000000000000000000000000000124": "0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b", + "0x0000000000000000000000000000000000000000000000000000000000000125": "0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1", + "0x0000000000000000000000000000000000000000000000000000000000000126": "0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972", + "0x0000000000000000000000000000000000000000000000000000000000000127": "0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686", + "0x0000000000000000000000000000000000000000000000000000000000000128": "0x0f320b0703439a8114f81593de99cd0b8f3b9bf854601abb5b2ea0e8a3dda4a7", + "0x0000000000000000000000000000000000000000000000000000000000000129": "0x0d07f6e7a8a0e9199d6d92801fff867002ff5b4808962f9da2ba5ce1bdd26a73", + "0x000000000000000000000000000000000000000000000000000000000000012a": "0x1c4954081e324939350febc2b918a293ebcdaead01be95ec02fcbe8d2c1635d1", + "0x000000000000000000000000000000000000000000000000000000000000012b": "0x0197f2171ef99c2d053ee1fb5ff5ab288d56b9b41b4716c9214a4d97facc4c4a", + "0x000000000000000000000000000000000000000000000000000000000000012c": "0x2b9cdd484c5ba1e4d6efcc3f18734b5ac4c4a0b9102e2aeb48521a661d3feee9", + "0x000000000000000000000000000000000000000000000000000000000000012d": "0x14f44d672eb357739e42463497f9fdac46623af863eea4d947ca00a497dcdeb3", + "0x000000000000000000000000000000000000000000000000000000000000012e": "0x071d7627ae3b2eabda8a810227bf04206370ac78dbf6c372380182dbd3711fe3", + "0x000000000000000000000000000000000000000000000000000000000000012f": "0x2fdc08d9fe075ac58cb8c00f98697861a13b3ab6f9d41a4e768f75e477475bf5", + "0x0000000000000000000000000000000000000000000000000000000000000130": "0x20165fe405652104dceaeeca92950aa5adc571b8cafe192878cba58ff1be49c5", + "0x0000000000000000000000000000000000000000000000000000000000000131": "0x1c8c3ca0b3a3d75850fcd4dc7bf1e3445cd0cfff3ca510630fd90b47e8a24755", + "0x0000000000000000000000000000000000000000000000000000000000000132": "0x1f0c1a8fb16b0d2ac9a146d7ae20d8d179695a92a79ed66fc45d9da4532459b3", + "0x0000000000000000000000000000000000000000000000000000000000000133": "0x038146ec5a2573e1c30d2fb32c66c8440f426fbd108082df41c7bebd1d521c30", + "0x0000000000000000000000000000000000000000000000000000000000000134": "0x17d3d12b17fe762de4b835b2180b012e808816a7f2ff69ecb9d65188235d8fd4", + "0x0000000000000000000000000000000000000000000000000000000000000135": "0x0e1a6b7d63a6e5a9e54e8f391dd4e9d49cdfedcbc87f02cd34d4641d2eb30491", + "0x0000000000000000000000000000000000000000000000000000000000000136": "0x09244eec34977ff795fc41036996ce974136377f521ac8eb9e04642d204783d2", + "0x0000000000000000000000000000000000000000000000000000000000000137": "0x1646d6f544ec36df9dc41f778a7ef1690a53c730b501471b6acd202194a7e8e9", + "0x0000000000000000000000000000000000000000000000000000000000000138": "0x064769603ba3f6c41f664d266ecb9a3a0f6567cd3e48b40f34d4894ee4c361b3", + "0x0000000000000000000000000000000000000000000000000000000000000139": "0x1595bb3cd19f84619dc2e368175a88d8627a7439eda9397202cdb1167531fd3f", + "0x000000000000000000000000000000000000000000000000000000000000013a": "0x2a529be462b81ca30265b558763b1498289c9d88277ab14f0838cb1fce4b472c", + "0x000000000000000000000000000000000000000000000000000000000000013b": "0x0c08da612363088ad0bbc78abd233e8ace4c05a56fdabdd5e5e9b05e428bdaee", + "0x000000000000000000000000000000000000000000000000000000000000013c": "0x14748d0241710ef47f54b931ac5a58082b1d56b0f0c30d55fb71a6e8c9a6be14" } } } \ No newline at end of file diff --git a/circuits/common/components.circom b/circuits/common/components.circom index d08b794..d76dfb7 100644 --- a/circuits/common/components.circom +++ b/circuits/common/components.circom @@ -170,6 +170,18 @@ template BlindedAuthCommitment() { out <== s.out; } +// poseidon(HISTORICAL_NOTE_ROOT_LEAF_DOMAIN, noteRoot, rootLogIndex) +template HistoricalNoteRootLeaf() { + signal input noteRoot; + signal input rootLogIndex; + signal output out; + component s = Poseidon2Sponge(3); + s.in[0] <== HISTORICAL_NOTE_ROOT_LEAF_DOMAIN(); + s.in[1] <== noteRoot; + s.in[2] <== rootLogIndex; + out <== s.out; +} + // poseidon(USER_REGISTRY_LEAF_DOMAIN, user, ownerNullifierKeyHash, noteSecretSeedHash) template UserRegistryLeaf() { signal input user; diff --git a/circuits/common/domain_tags.circom b/circuits/common/domain_tags.circom index ceb87da..b8bfe02 100644 --- a/circuits/common/domain_tags.circom +++ b/circuits/common/domain_tags.circom @@ -18,3 +18,4 @@ function AUTH_POLICY_DOMAIN() { return 74783058401264919259277611191201163542142 function POLICY_COMMITMENT_DOMAIN() { return 6338547258800233130574849689702491542495107684713039042527186625902532184047; } function BLINDED_AUTH_COMMITMENT_DOMAIN() { return 756399867490099330638290786584416416080745084077161872791688004783717414890; } function USER_REGISTRY_LEAF_DOMAIN() { return 15515235365186476782347438139971163950627118837282640891085419045297106578364; } +function HISTORICAL_NOTE_ROOT_LEAF_DOMAIN() { return 19650399206361210150162958082810624246933416256015341980966772636511810461478; } diff --git a/circuits/pool/pool.circom b/circuits/pool/pool.circom index b9320ac..6c7b5bc 100644 --- a/circuits/pool/pool.circom +++ b/circuits/pool/pool.circom @@ -23,7 +23,7 @@ include "bits.circom"; template Pool() { // ===== Public inputs (21 fields, Section 10 declaration order) ===== - signal input noteCommitmentRoot; + signal input historicalNoteRootAccumulatorRoot; signal input nullifier0; signal input nullifier1; signal input noteBodyCommitment0; @@ -59,6 +59,15 @@ template Pool() { signal input inLeafIndex[2]; // <2^32 signal input inSiblings[2][32]; // path bits derived from inLeafIndex + // Per-input historical-root-accumulator witnesses (Section: EIP-8182 + // historical note-root accumulator). Each real input proves the note's + // membership in a private noteRoot, then proves that noteRoot is a leaf + // at rootLogIndex of the public accumulator. Phantom slots (inIsReal == 0) + // gate both checks and may carry placeholders. + signal input inNoteRoot[2]; // private per-input post-creation note root + signal input inRootLogIndex[2]; // <2^32; accumulator leaf index for inNoteRoot[i] + signal input inHistRootSiblings[2][32]; // depth-32 accumulator siblings + // Outputs: 3 slots, each real (1) or dummy (0); slot 2 is fee slot when real signal input outIsReal[3]; // bool signal input outAmount[3]; // <2^248 @@ -185,14 +194,18 @@ template Pool() { // ===== Inputs: per-slot derivation ===== // For each input, derive owner / body / final commitment / nullifier, check - // Merkle path against noteCommitmentRoot for real inputs, and select - // between real and phantom nullifier by isReal. + // Merkle path against a private per-slot inNoteRoot[i] for real inputs, then + // prove inNoteRoot[i] is a leaf of the public accumulator at inRootLogIndex[i], + // and select between real and phantom nullifier by isReal. component inOC[2]; component inBC[2]; component inNC[2]; component inNF[2]; component inPN[2]; component inPath[2]; + component nbInRootIdx[2]; + component histLeaf[2]; + component histPath[2]; signal inEffectiveNullifier[2]; for (var i = 0; i < 2; i++) { @@ -222,14 +235,32 @@ template Pool() { inPN[i].inputIndex <== i; // Merkle path: path bits = leafIndex bits (LSB-first), siblings - // witnessed; selectively constrained to noteCommitmentRoot for real. + // witnessed; selectively constrained to the private inNoteRoot[i] for + // real inputs. Observers learn only the accumulator root, not the + // creation-era note root the path lands at. inPath[i] = MerklePath(32); inPath[i].leaf <== inNC[i].out; for (var b = 0; b < 32; b++) { inPath[i].pathBits[b] <== nbInLeaf[i].out[b]; inPath[i].siblings[b] <== inSiblings[i][b]; } - inIsReal[i] * (inPath[i].root - noteCommitmentRoot) === 0; + inIsReal[i] * (inPath[i].root - inNoteRoot[i]) === 0; + + // Historical-note-root accumulator membership for real inputs. + nbInRootIdx[i] = Num2Bits(32); + nbInRootIdx[i].in <== inRootLogIndex[i]; + + histLeaf[i] = HistoricalNoteRootLeaf(); + histLeaf[i].noteRoot <== inNoteRoot[i]; + histLeaf[i].rootLogIndex <== inRootLogIndex[i]; + + histPath[i] = MerklePath(32); + histPath[i].leaf <== histLeaf[i].out; + for (var b = 0; b < 32; b++) { + histPath[i].pathBits[b] <== nbInRootIdx[i].out[b]; + histPath[i].siblings[b] <== inHistRootSiblings[i][b]; + } + inIsReal[i] * (histPath[i].root - historicalNoteRootAccumulatorRoot) === 0; // Effective nullifier = real ? real-nullifier : phantom-nullifier inEffectiveNullifier[i] <== inPN[i].out + inIsReal[i] * (inNF[i].out - inPN[i].out); @@ -459,7 +490,7 @@ template Pool() { } component main { public [ - noteCommitmentRoot, + historicalNoteRootAccumulatorRoot, nullifier0, nullifier1, noteBodyCommitment0, noteBodyCommitment1, noteBodyCommitment2, publicAmountOut, publicRecipientAddress, publicTokenAddress, diff --git a/contracts/script/InstallSystemContracts.s.sol b/contracts/script/InstallSystemContracts.s.sol index 93bb720..7010343 100644 --- a/contracts/script/InstallSystemContracts.s.sol +++ b/contracts/script/InstallSystemContracts.s.sol @@ -67,6 +67,18 @@ contract ShieldedPoolInstallHarness is ShieldedPool { authPolicyRevocationSparseEmptyHashes[AUTH_POLICY_TREE_DEPTH - 1], authPolicyRevocationSparseEmptyHashes[AUTH_POLICY_TREE_DEPTH - 1] ); + + // Historical note-root accumulator (depth 32, append-only). + historicalNoteRootEmptyHashes[0] = 0; + for (uint256 i = 1; i < HISTORICAL_NOTE_ROOT_TREE_DEPTH; ++i) { + historicalNoteRootEmptyHashes[i] = PoseidonFieldLib.merkleHash( + historicalNoteRootEmptyHashes[i - 1], historicalNoteRootEmptyHashes[i - 1] + ); + } + currentHistoricalNoteRootAccumulatorRoot = PoseidonFieldLib.merkleHash( + historicalNoteRootEmptyHashes[HISTORICAL_NOTE_ROOT_TREE_DEPTH - 1], + historicalNoteRootEmptyHashes[HISTORICAL_NOTE_ROOT_TREE_DEPTH - 1] + ); } } diff --git a/contracts/src/MockPoolPrecompile.sol b/contracts/src/MockPoolPrecompile.sol index 01ca2a8..fb33fad 100644 --- a/contracts/src/MockPoolPrecompile.sol +++ b/contracts/src/MockPoolPrecompile.sol @@ -22,7 +22,7 @@ contract MockPoolPrecompile { /// @notice Spec contract: 21 public inputs in declaration order. struct PublicInputs { - uint256 noteCommitmentRoot; + uint256 historicalNoteRootAccumulatorRoot; uint256 nullifier0; uint256 nullifier1; uint256 noteBodyCommitment0; @@ -83,7 +83,7 @@ contract MockPoolPrecompile { uint256[2] memory pC = [_word(proofBytes, 192), _word(proofBytes, 224)]; uint256[21] memory pub; - pub[0] = pi.noteCommitmentRoot; + pub[0] = pi.historicalNoteRootAccumulatorRoot; pub[1] = pi.nullifier0; pub[2] = pi.nullifier1; pub[3] = pi.noteBodyCommitment0; diff --git a/contracts/src/PoolGroth16Verifier.sol b/contracts/src/PoolGroth16Verifier.sol index e6b17b7..4cfc568 100644 --- a/contracts/src/PoolGroth16Verifier.sol +++ b/contracts/src/PoolGroth16Verifier.sol @@ -37,77 +37,77 @@ contract PoolGroth16Verifier { uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 8756017623139984336496876893964416148316510601149465215104782973528317478233; - uint256 constant deltax2 = 10901077060512718959968985747029556910379728413149866109621587712491681677989; - uint256 constant deltay1 = 20982794953279600096083881417704582570116037968668252642486378588803253163391; - uint256 constant deltay2 = 1214478808432330683794019212183248070415565552030737764310333871534226002230; + uint256 constant deltax1 = 17662636731906445441713532452823035302820960793116552139261854305035722638402; + uint256 constant deltax2 = 9523993313529240934833338338506894541799246086808631220656966344382961090104; + uint256 constant deltay1 = 14559284151572724262640398227909990848650550286114615571207209390139495389385; + uint256 constant deltay2 = 18053580355189984402155768374859935564397876102508090259492025497042793506210; - uint256 constant IC0x = 15055002528442960883936305926337935987129249116587087952310710949394502298075; - uint256 constant IC0y = 19523770993323736607726398168359771196927296395522296844870355605469294349140; + uint256 constant IC0x = 6251128491006576975464608998745730063203126257710012950147245613265083104078; + uint256 constant IC0y = 4358594320216710973424080250967897587875556369072994083524613923329314206694; - uint256 constant IC1x = 4035863800226454203673984355553870068268417999207475091945334568028302851221; - uint256 constant IC1y = 1052561466828869242240286736751261005213216395846672281941827559260344670921; + uint256 constant IC1x = 19328188513176886913976828290964719128176411488982685593885779353020606460526; + uint256 constant IC1y = 4107899146187342297972259475991370771502577509952477322539207252979013327762; - uint256 constant IC2x = 12727282839835333764076099311649403111092399785141200189709626033897901511122; - uint256 constant IC2y = 20018305672506751156780095560092522551962194740383163532928470719597170776383; + uint256 constant IC2x = 13730619270311694569938371707083289812398086127629069577340825046284527797574; + uint256 constant IC2y = 8572779718837432883751868528077990552795622110693576842559080177633718737187; - uint256 constant IC3x = 16015806444777073973084980814776974741801949827163401908286950855446883941172; - uint256 constant IC3y = 15873358695801115514285026702118124300828554093616174915335476033573571561969; + uint256 constant IC3x = 6343061745339434409606093311601410893585128568850343477711272022590910000903; + uint256 constant IC3y = 6589710809040980768916620417654363309304642055505510081141113276445164636548; - uint256 constant IC4x = 21134436275069578763545206422096425414761472812927828928787059634913088626015; - uint256 constant IC4y = 15652891752642462930422696066087556731253423526760344491996525709820241931744; + uint256 constant IC4x = 3166492715946167967525200768538800959651787215373962562744315471829128042364; + uint256 constant IC4y = 11853123674280488227208490662754893290234648707473738862654512430695390324606; - uint256 constant IC5x = 1564529156547147854100055880269840886758701217970401351930904634761131099244; - uint256 constant IC5y = 15352971237739616952845533910884646930018545165028153215177833927241366989774; + uint256 constant IC5x = 16748630884616646100860898023214017045384255769544291830897813459576670172145; + uint256 constant IC5y = 9805167210824213819901390711885579533789854464588635656407913557526477882187; - uint256 constant IC6x = 8704157116224366037325424354532531240677988801073579386899222712824257760614; - uint256 constant IC6y = 18760192985514817046499219000066421276027597290307856758933000077830598749743; + uint256 constant IC6x = 618387263339774868537601345046567983932190726076902450976536814069627880781; + uint256 constant IC6y = 666212404167790121508958595648958057905790367468989379775247658076849769567; - uint256 constant IC7x = 17419077034007206390495823109729318227390689746639725197955227619565217675360; - uint256 constant IC7y = 19362686987522401728688988415681875342431578209542964158091175527023812537994; + uint256 constant IC7x = 17204434840233577293982227246590544939400432789632553531642734013195466653007; + uint256 constant IC7y = 12759735207140053586542109093649133621171128158303154710137307044436264069717; - uint256 constant IC8x = 18775208107491817368776139395297735361932383674623098800593098054362037682666; - uint256 constant IC8y = 8362390630161518797135658134289445062789889568839097281306801131849280178978; + uint256 constant IC8x = 11622346812103938627615269523870720900182353613287981791359017450589444319891; + uint256 constant IC8y = 6916781370311969492303016254834227100428892614760504029680464479352352652401; - uint256 constant IC9x = 5864080987789053233836244032715490731945355219203465233230142183761233840046; - uint256 constant IC9y = 17428760043660841046649082744615157895664059842467301288842333762099815393389; + uint256 constant IC9x = 4502192700263165302026794990615550356808919733834794766231409251222532280369; + uint256 constant IC9y = 17846391502892162479631381557309503802111020859167154898545738570017050091676; - uint256 constant IC10x = 16917352129475560542044523152432854563165855781383218430973801402623378849131; - uint256 constant IC10y = 21110192659472786470766938940296993680794423985230856632390919793814957804561; + uint256 constant IC10x = 1530592568611302234315398746000235282627141911816405765595924556097906288341; + uint256 constant IC10y = 20198956411346587099165504381159348250352204125966906341811917713630576432834; - uint256 constant IC11x = 2084686631518211276061509310079726703646267545967401615305472585135327004171; - uint256 constant IC11y = 3229319714297860352867383384999565021739304791618741506249861433990196909246; + uint256 constant IC11x = 393233953531031432662965421493001791676114985233073427525855627091239158854; + uint256 constant IC11y = 19142412975982979481471558158992987125079482831088011991582467922436197782948; - uint256 constant IC12x = 17492141460381831465948473468046750742579895367018210023034963748525810888550; - uint256 constant IC12y = 15251121147179881101647745829978353496590670690798110115043057029959794658925; + uint256 constant IC12x = 4317491193328100605576720937370674378484829214426734790681159323682570015966; + uint256 constant IC12y = 10482295921297911750198703129002055289695434147362610461496580007054469510785; - uint256 constant IC13x = 6664473166318091094110852263451198618449621833096518006100743186952737142859; - uint256 constant IC13y = 20255738325629637473777193728975079150537287579229927271751299335109192338627; + uint256 constant IC13x = 9315781331377082214154830867130328639059242784581265771848929716621052857889; + uint256 constant IC13y = 87928002193935386455466010433307979835922279444973985034062047297376302959; - uint256 constant IC14x = 11587466116939764422758162765143448463976621248971498758987538161034705571172; - uint256 constant IC14y = 7330941415928001400750420183057629670111970998875223254870011157294478131996; + uint256 constant IC14x = 21878194293980388033716224755886467395852261210001106435711053831000090507954; + uint256 constant IC14y = 2555386700132998486855030606028790602598449821014919876062369697446347462118; - uint256 constant IC15x = 11281851002804243578011380084811190653551220980973643805116057814935696631618; - uint256 constant IC15y = 16395777216783492909005210222541212222011541561875975497869635814458246238936; + uint256 constant IC15x = 18383564137593513610662529364809059794660782879413895642616106865979173527135; + uint256 constant IC15y = 393434458617162546477853605158897319222072134619020558125016778124604872157; - uint256 constant IC16x = 2849018238632466768907861645404282108792517472929019798148910095715667085388; - uint256 constant IC16y = 10151701158226356587672669906703001276035692467360579961724710591006446137932; + uint256 constant IC16x = 13145060854550564056954944105328359762464011537323807387964245404668040181431; + uint256 constant IC16y = 12706549075668107237844573151518406366369737180494360078909237856647006850294; - uint256 constant IC17x = 5391947111644386260618732370835001346318161796598016677549758213107492888631; - uint256 constant IC17y = 3949225606531754239949990237816776565141285660971920115578536383931740320487; + uint256 constant IC17x = 13703662972121494171609529145352972817797239103374653719271454657441132251510; + uint256 constant IC17y = 11068813137761919448010448844337653570309336953510946624660919946799894517432; - uint256 constant IC18x = 3525794634932563135661571650376027116501393517334634550119214652785690275057; - uint256 constant IC18y = 19795254789552632680008662430315969546157115100747890726957033538622095274685; + uint256 constant IC18x = 20594225345418212567644306139285868141404765809519366005091275120238913143218; + uint256 constant IC18y = 16866255810461421469334874219916041497028000401905374214830489806107447207908; - uint256 constant IC19x = 5639725300418623769846231796795571590202032393366344441816063133059635610787; - uint256 constant IC19y = 13944472833392329343534751141249933302026316219441922300147827785614464870786; + uint256 constant IC19x = 3569743376317329572356339932599809221743221792690748427261166950873691920712; + uint256 constant IC19y = 2274226713147987174034322651966937145554306987082066168326916376585315679592; - uint256 constant IC20x = 12050541280799851099161886470355914880088805913668231214691841623039729333791; - uint256 constant IC20y = 4508811265406221196298660750773733004616256498479198746191217986140105420814; + uint256 constant IC20x = 14974694720520405300447163674970619458708178649358736208683958865913585748488; + uint256 constant IC20y = 411607131780800019798862464673048323075934173802886189181732344253115359303; - uint256 constant IC21x = 9165805418252944049230643169750462375464532673078533680529833737662362597557; - uint256 constant IC21y = 21543525875037260863910050135508672842549101145472288462110497758444555948878; + uint256 constant IC21x = 15059412159546867388928531887166873975229785465361350027562291625924388810013; + uint256 constant IC21y = 16170946436207515607835983658575562173123499786864547058897590702819518005223; // Memory data diff --git a/contracts/src/ShieldedPool.sol b/contracts/src/ShieldedPool.sol index ee5a9c3..3d7d0f3 100644 --- a/contracts/src/ShieldedPool.sol +++ b/contracts/src/ShieldedPool.sol @@ -14,13 +14,14 @@ contract ShieldedPool { // -------------------------------- Constants -------------------------------- uint256 internal constant MAX_INTENT_LIFETIME = 86400; - uint256 internal constant NOTE_COMMITMENT_ROOT_HISTORY_SIZE = 500; uint256 internal constant USER_REGISTRY_ROOT_HISTORY_BLOCKS = 500; uint256 internal constant AUTH_POLICY_REGISTRATION_ROOT_HISTORY_SIZE = 500; uint256 internal constant AUTH_POLICY_ROOT_HISTORY_BLOCKS = 64; uint256 internal constant COMMITMENT_TREE_DEPTH = 32; uint256 internal constant REGISTRY_TREE_DEPTH = 160; uint256 internal constant AUTH_POLICY_TREE_DEPTH = 32; + uint256 internal constant HISTORICAL_NOTE_ROOT_TREE_DEPTH = 32; + uint256 internal constant HISTORICAL_NOTE_ROOT_ACCUMULATOR_HISTORY_SIZE = 64; uint256 internal constant MAX_LEAF_INDEX = type(uint32).max; uint256 internal constant MAX_ADDRESS_VALUE = type(uint160).max; uint256 internal constant MAX_AMOUNT_VALUE = type(uint248).max; @@ -34,7 +35,7 @@ contract ShieldedPool { /// @notice 21 public inputs per EIP-8182 Section 5.3 / Section 10. struct PublicInputs { - uint256 noteCommitmentRoot; + uint256 historicalNoteRootAccumulatorRoot; uint256 nullifier0; uint256 nullifier1; uint256 noteBodyCommitment0; @@ -106,7 +107,7 @@ contract ShieldedPool { error UnexpectedEth(); error UnknownAuthPolicyRegistrationRoot(); error UnknownAuthPolicyRevocationRoot(); - error UnknownNoteCommitmentRoot(); + error UnknownHistoricalNoteRootAccumulatorRoot(); error UnknownUserRegistryRoot(); error UserAlreadyRegistered(); error UserNotRegistered(); @@ -131,7 +132,9 @@ contract ShieldedPool { uint256 postInsertionCommitmentRoot, bytes outputNoteData0, bytes outputNoteData1, - bytes outputNoteData2 + bytes outputNoteData2, + uint256 historicalNoteRootIndex, + uint256 postInsertionHistoricalNoteRootAccumulatorRoot ); event ShieldedPoolDeposit( @@ -141,7 +144,9 @@ contract ShieldedPool { uint256 amount, uint256 tokenAddress, uint256 postInsertionCommitmentRoot, - bytes outputNoteData + bytes outputNoteData, + uint256 historicalNoteRootIndex, + uint256 postInsertionHistoricalNoteRootAccumulatorRoot ); event UserRegistered( @@ -170,9 +175,21 @@ contract ShieldedPool { // Note-commitment tree (depth-32 append-only). uint256 internal nextLeafIndex; uint256 internal currentNoteCommitmentRoot; - uint256 internal noteCommitmentRootHistoryCount; mapping(uint256 => uint256) private filledNoteCommitmentSubtrees; - mapping(uint256 => uint256) internal noteCommitmentRootHistory; + + // Historical note-root accumulator (depth-32 append-only). One leaf is + // appended per note-insertion batch (one per deposit, one per transact). + // Spend acceptance compares the public input's accumulator root against + // the current root or a small recent-root submission buffer; the + // 500-entry note-commitment-root ring buffer is removed. + uint256 internal currentHistoricalNoteRootAccumulatorRoot; + // Stored as uint256 internally; capped one leaf short of the depth-32 + // mathematical capacity so the value always fits in uint32 for the + // public read API. + uint256 internal nextHistoricalNoteRootIndex; + mapping(uint256 => uint256) private filledHistoricalNoteRootSubtrees; + uint256 internal historicalNoteRootAccumulatorHistoryCount; + mapping(uint256 => uint256) internal historicalNoteRootAccumulatorHistory; // User-registry tree (depth-160 sparse, MSB-first key). uint256 internal currentUserRegistryRoot; @@ -211,6 +228,7 @@ contract ShieldedPool { uint256[REGISTRY_TREE_DEPTH] internal userRegistrySparseEmptyHashes; uint256[AUTH_POLICY_TREE_DEPTH] internal authPolicyRegistrationEmptyHashes; uint256[AUTH_POLICY_TREE_DEPTH] internal authPolicyRevocationSparseEmptyHashes; + uint256[HISTORICAL_NOTE_ROOT_TREE_DEPTH] internal historicalNoteRootEmptyHashes; // -------------------------------- Modifier -------------------------------- @@ -261,8 +279,10 @@ contract ShieldedPool { // Steps 3-6: roots. require( - isAcceptedNoteCommitmentRoot(publicInputs.noteCommitmentRoot), - UnknownNoteCommitmentRoot() + isAcceptedHistoricalNoteRootAccumulatorRoot( + publicInputs.historicalNoteRootAccumulatorRoot + ), + UnknownHistoricalNoteRootAccumulatorRoot() ); require(publicInputs.registryRoot != 0, ZeroRegistryRoot()); require( @@ -337,11 +357,18 @@ contract ShieldedPool { uint256 leafIndex0 = nextLeafIndex; require(leafIndex0 + 3 <= MAX_LEAF_INDEX + 1, TreeFull()); uint256[3] memory commitments = _sealTransactCommitments(publicInputs, leafIndex0); - _pushNoteCommitmentRootHistory(currentNoteCommitmentRoot); _insertNoteCommitment(commitments[0]); _insertNoteCommitment(commitments[1]); _insertNoteCommitment(commitments[2]); - _emitTransact(publicInputs, commitments, leafIndex0, outputNoteData0, outputNoteData1, outputNoteData2); + _appendHistoricalNoteRoot(currentNoteCommitmentRoot); + _emitTransact( + publicInputs, + commitments, + leafIndex0, + outputNoteData0, + outputNoteData1, + outputNoteData2 + ); } function _emitTransact( @@ -352,6 +379,11 @@ contract ShieldedPool { bytes calldata outputNoteData1, bytes calldata outputNoteData2 ) private { + // historicalNoteRootIndex / postInsertionHistoricalNoteRootAccumulatorRoot + // are read from storage rather than threaded as locals to avoid + // stack-too-deep when emitting all event fields without via_ir. + // _appendHistoricalNoteRoot has already advanced both before this is + // called, so nextHistoricalNoteRootIndex - 1 is the just-appended index. emit ShieldedPoolTransact( publicInputs.nullifier0, publicInputs.nullifier1, @@ -364,7 +396,9 @@ contract ShieldedPool { currentNoteCommitmentRoot, outputNoteData0, outputNoteData1, - outputNoteData2 + outputNoteData2, + nextHistoricalNoteRootIndex - 1, + currentHistoricalNoteRootAccumulatorRoot ); } @@ -459,17 +493,39 @@ contract ShieldedPool { uint256 leafIndex = nextLeafIndex; require(leafIndex + 1 <= MAX_LEAF_INDEX + 1, TreeFull()); + uint256 finalCommitment = _sealDepositCommitment(token, amount, ownerCommitment, leafIndex); + + _insertNoteCommitment(finalCommitment); + _appendHistoricalNoteRoot(currentNoteCommitmentRoot); + + _emitDeposit(token, amount, finalCommitment, leafIndex, outputNoteData); + } + + function _sealDepositCommitment( + address token, + uint256 amount, + uint256 ownerCommitment, + uint256 leafIndex + ) private pure returns (uint256 finalCommitment) { uint256 body = PoseidonFieldLib.noteBodyCommitment( ownerCommitment, amount, uint256(uint160(token)) ); - uint256 finalCommitment = PoseidonFieldLib.noteCommitment(body, leafIndex); + finalCommitment = PoseidonFieldLib.noteCommitment(body, leafIndex); require(finalCommitment != 0, ZeroNoteCommitment()); + } - _pushNoteCommitmentRootHistory(currentNoteCommitmentRoot); - _insertNoteCommitment(finalCommitment); - + function _emitDeposit( + address token, + uint256 amount, + uint256 finalCommitment, + uint256 leafIndex, + bytes calldata outputNoteData + ) private { + // historicalNoteRootIndex / postInsertionHistoricalNoteRootAccumulatorRoot + // are read from storage to avoid stack-too-deep without via_ir. + // _appendHistoricalNoteRoot has already advanced both. emit ShieldedPoolDeposit( msg.sender, finalCommitment, @@ -477,7 +533,9 @@ contract ShieldedPool { amount, uint256(uint160(token)), currentNoteCommitmentRoot, - outputNoteData + outputNoteData, + nextHistoricalNoteRootIndex - 1, + currentHistoricalNoteRootAccumulatorRoot ); } @@ -660,18 +718,35 @@ contract ShieldedPool { return intentReplayIdUsed[intentReplayId]; } - function isAcceptedNoteCommitmentRoot(uint256 root) public view returns (bool) { - if (root == currentNoteCommitmentRoot) return true; - uint256 historyLength = noteCommitmentRootHistoryCount; - if (historyLength > NOTE_COMMITMENT_ROOT_HISTORY_SIZE) { - historyLength = NOTE_COMMITMENT_ROOT_HISTORY_SIZE; + function isAcceptedHistoricalNoteRootAccumulatorRoot(uint256 root) + public + view + returns (bool) + { + if (root == currentHistoricalNoteRootAccumulatorRoot) return true; + uint256 historyLength = historicalNoteRootAccumulatorHistoryCount; + if (historyLength > HISTORICAL_NOTE_ROOT_ACCUMULATOR_HISTORY_SIZE) { + historyLength = HISTORICAL_NOTE_ROOT_ACCUMULATOR_HISTORY_SIZE; } for (uint256 slot; slot < historyLength; ++slot) { - if (noteCommitmentRootHistory[slot] == root) return true; + if (historicalNoteRootAccumulatorHistory[slot] == root) return true; } return false; } + function getCurrentHistoricalNoteRootAccumulatorRoot() + external + view + returns (uint256 root, uint32 nextIndex) + { + // Cast is safe by construction: _appendHistoricalNoteRoot caps + // nextHistoricalNoteRootIndex at MAX_LEAF_INDEX = type(uint32).max. + return ( + currentHistoricalNoteRootAccumulatorRoot, + uint32(nextHistoricalNoteRootIndex) + ); + } + function isAcceptedUserRegistryRoot(uint256 root) public view returns (bool) { if (root == 0) return false; if (root == currentUserRegistryRoot) return true; @@ -711,13 +786,44 @@ contract ShieldedPool { // -------------------------------- Tree maintenance -------------------------------- - function _pushNoteCommitmentRootHistory(uint256 root) private { - noteCommitmentRootHistory[ - noteCommitmentRootHistoryCount % NOTE_COMMITMENT_ROOT_HISTORY_SIZE - ] = root; + function _appendHistoricalNoteRoot(uint256 noteRoot) + private + returns (uint256 index, uint256 newRoot) + { + index = nextHistoricalNoteRootIndex; + // Capped one leaf short of the depth-32 mathematical capacity + // (2^32 - 1 leaves) so the stored next-index always fits in uint32. + require(index < MAX_LEAF_INDEX, TreeFull()); + + uint256 leaf = PoseidonFieldLib.historicalNoteRootLeaf(noteRoot, index); + + // Push the previous accumulator root into the recent-root submission + // buffer (matching the pre-insert push order of the prior + // note-commitment ring buffer). + historicalNoteRootAccumulatorHistory[ + historicalNoteRootAccumulatorHistoryCount % + HISTORICAL_NOTE_ROOT_ACCUMULATOR_HISTORY_SIZE + ] = currentHistoricalNoteRootAccumulatorRoot; unchecked { - ++noteCommitmentRootHistoryCount; + ++historicalNoteRootAccumulatorHistoryCount; + } + + uint256 currentHash = leaf; + for (uint256 level; level < HISTORICAL_NOTE_ROOT_TREE_DEPTH; ++level) { + if (((index >> level) & 1) == 0) { + filledHistoricalNoteRootSubtrees[level] = currentHash; + currentHash = PoseidonFieldLib.merkleHash( + currentHash, historicalNoteRootEmptyHashes[level] + ); + } else { + currentHash = PoseidonFieldLib.merkleHash( + filledHistoricalNoteRootSubtrees[level], currentHash + ); + } } + currentHistoricalNoteRootAccumulatorRoot = currentHash; + nextHistoricalNoteRootIndex = index + 1; + newRoot = currentHash; } function _pushAuthPolicyRegistrationRootHistory(uint256 root) private { diff --git a/contracts/src/libraries/PoseidonFieldLib.sol b/contracts/src/libraries/PoseidonFieldLib.sol index dce6d6b..35c5158 100644 --- a/contracts/src/libraries/PoseidonFieldLib.sol +++ b/contracts/src/libraries/PoseidonFieldLib.sol @@ -26,6 +26,8 @@ library PoseidonFieldLib { uint256(keccak256("eip-8182.auth_policy")) % FIELD_MODULUS; uint256 internal constant USER_REGISTRY_LEAF_DOMAIN = uint256(keccak256("eip-8182.user_registry_leaf")) % FIELD_MODULUS; + uint256 internal constant HISTORICAL_NOTE_ROOT_LEAF_DOMAIN = + uint256(keccak256("eip-8182.historical_note_root_leaf")) % FIELD_MODULUS; function merkleHash(uint256 left, uint256 right) internal pure returns (uint256) { return Poseidon2Sponge.hashPair(left, right); @@ -87,4 +89,16 @@ library PoseidonFieldLib { function dummyOwnerNullifierKeyHash() internal pure returns (uint256) { return Poseidon2Sponge.hashPair(OWNER_NULLIFIER_KEY_HASH_DOMAIN, 0xdead); } + + function historicalNoteRootLeaf(uint256 noteRoot, uint256 rootLogIndex) + internal + pure + returns (uint256) + { + return Poseidon2Sponge.hash3( + HISTORICAL_NOTE_ROOT_LEAF_DOMAIN, + noteRoot, + rootLogIndex + ); + } } diff --git a/contracts/test/Bench.t.sol b/contracts/test/Bench.t.sol index bb30cfd..be1d6f2 100644 --- a/contracts/test/Bench.t.sol +++ b/contracts/test/Bench.t.sol @@ -452,7 +452,7 @@ contract BenchTest is Test, InstallSystemContractsBase { session, string.concat(".pool.publicSignals[", vm.toString(i), "]") ); } - pi.noteCommitmentRoot = ps[0]; + pi.historicalNoteRootAccumulatorRoot = ps[0]; pi.nullifier0 = ps[1]; pi.nullifier1 = ps[2]; pi.noteBodyCommitment0 = ps[3]; diff --git a/contracts/test/GasBreakdown.t.sol b/contracts/test/GasBreakdown.t.sol index 1b82506..9ebd6d4 100644 --- a/contracts/test/GasBreakdown.t.sol +++ b/contracts/test/GasBreakdown.t.sol @@ -71,14 +71,15 @@ contract GasBreakdownTest is Test, InstallSystemContractsBase { pool.registerAuthPolicy(0xa3); ( - uint256 noteRoot, + , uint256 userRoot, uint256 authReg, uint256 authRev ) = pool.getCurrentRoots(); + (uint256 accRoot, ) = pool.getCurrentHistoricalNoteRootAccumulatorRoot(); ShieldedPool.PublicInputs memory pi = ShieldedPool.PublicInputs({ - noteCommitmentRoot: noteRoot, + historicalNoteRootAccumulatorRoot: accRoot, nullifier0: 0x111, nullifier1: 0x222, noteBodyCommitment0: 0xb1, diff --git a/contracts/test/Integration.t.sol b/contracts/test/Integration.t.sol index ab49ce4..a5fbf3e 100644 --- a/contracts/test/Integration.t.sol +++ b/contracts/test/Integration.t.sol @@ -91,7 +91,7 @@ contract IntegrationTest is Test, InstallSystemContractsBase { function testPoolPrecompileRejectsNoncanonicalPublicInput() public view { bytes memory poolProof = vm.parseBytes(stdJson.readString(session, ".pool.proofHex")); ShieldedPool.PublicInputs memory pi = _readPublicInputs(); - pi.noteCommitmentRoot = PoseidonFieldLib.FIELD_MODULUS; + pi.historicalNoteRootAccumulatorRoot = PoseidonFieldLib.FIELD_MODULUS; (bool ok, bytes memory ret) = PROOF_VERIFY_PRECOMPILE_ADDRESS.staticcall( abi.encode(poolProof, pi) @@ -150,11 +150,12 @@ contract IntegrationTest is Test, InstallSystemContractsBase { uint256 authRegRootBefore, uint256 authRevRootBefore ) = pool.getCurrentRoots(); + (uint256 accRootBefore, ) = pool.getCurrentHistoricalNoteRootAccumulatorRoot(); // Use real on-chain roots in the public inputs so the precompile // would have something to compare against (the mock ignores it). ShieldedPool.PublicInputs memory pi = ShieldedPool.PublicInputs({ - noteCommitmentRoot: noteRootBefore, + historicalNoteRootAccumulatorRoot: accRootBefore, nullifier0: 0x111, nullifier1: 0x222, noteBodyCommitment0: 0xb1, @@ -248,6 +249,72 @@ contract IntegrationTest is Test, InstallSystemContractsBase { assertEq(address(pool).balance, 1 ether); } + function testDepositAppendsHistoricalNoteRootAndEmitsFields() public { + (uint256 accBefore, uint32 idxBefore) = + pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + assertEq(uint256(idxBefore), 0, "fresh pool starts with no accumulator leaves"); + + uint256 ownerCommitment = + uint256(keccak256("owner commitment hist")) % PoseidonFieldLib.FIELD_MODULUS; + vm.deal(address(this), 1 ether); + vm.recordLogs(); + pool.deposit{value: 1 ether}(address(0), 1 ether, ownerCommitment, "delivery"); + + (uint256 accAfter, uint32 idxAfter) = + pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + assertEq(uint256(idxAfter), 1, "deposit appends one accumulator leaf"); + assertTrue(accAfter != accBefore, "accumulator root must advance"); + + // Submission buffer accepts both pre-deposit and post-deposit roots. + assertTrue(pool.isAcceptedHistoricalNoteRootAccumulatorRoot(accAfter)); + assertTrue(pool.isAcceptedHistoricalNoteRootAccumulatorRoot(accBefore)); + + // The deposit event's last two fields carry index + post-insertion root. + Vm.Log[] memory logs = vm.getRecordedLogs(); + bytes32 sig = keccak256( + "ShieldedPoolDeposit(address,uint256,uint256,uint256,uint256,uint256,bytes,uint256,uint256)" + ); + bool found; + for (uint256 i; i < logs.length; ++i) { + if (logs[i].topics[0] == sig) { + (, , , , , bytes memory ond, uint256 histIdx, uint256 histRoot) = + abi.decode( + logs[i].data, + (uint256, uint256, uint256, uint256, uint256, bytes, uint256, uint256) + ); + ond; // unused + assertEq(histIdx, 0, "first accumulator leaf is at index 0"); + assertEq(histRoot, accAfter, "event root must equal current acc root"); + found = true; + break; + } + } + assertTrue(found, "ShieldedPoolDeposit event must be emitted"); + } + + function testTransactAppendsOneHistoricalNoteRootPerCall() public { + AcceptAllAuthVerifier alwaysAcceptAuth = new AcceptAllAuthVerifier(); + AcceptAllPoolPrecompile alwaysAcceptPool = new AcceptAllPoolPrecompile(); + vm.etch(PROOF_VERIFY_PRECOMPILE_ADDRESS, address(alwaysAcceptPool).code); + + address sender = address(0x1234); + uint256 senderOnk = uint256(keccak256("acc-sender onk")) % PoseidonFieldLib.FIELD_MODULUS; + uint256 senderSeed = uint256(keccak256("acc-sender seed")) % PoseidonFieldLib.FIELD_MODULUS; + vm.prank(sender); + pool.registerUser(senderOnk, senderSeed); + vm.prank(sender); + pool.registerAuthPolicy(uint256(keccak256("policy x")) % PoseidonFieldLib.FIELD_MODULUS); + + ShieldedPool.PublicInputs memory pi = _basePI(address(alwaysAcceptAuth)); + (, uint32 idxBefore) = pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + + pool.transact(new bytes(256), new bytes(256), pi, "o0", "o1", "o2"); + + (, uint32 idxAfter) = pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + assertEq(uint256(idxAfter), uint256(idxBefore) + 1, + "transact appends exactly one accumulator leaf"); + } + // ----------------------- Layer 2: negative tests ------------------------- /// @dev Etches the always-accept pool precompile, registers a sender, and @@ -283,13 +350,14 @@ contract IntegrationTest is Test, InstallSystemContractsBase { returns (ShieldedPool.PublicInputs memory pi) { ( - uint256 noteRoot, + , uint256 userRoot, uint256 authRegRoot, uint256 authRevRoot ) = pool.getCurrentRoots(); + (uint256 accRoot, ) = pool.getCurrentHistoricalNoteRootAccumulatorRoot(); pi = ShieldedPool.PublicInputs({ - noteCommitmentRoot: noteRoot, + historicalNoteRootAccumulatorRoot: accRoot, nullifier0: 0x111, nullifier1: 0x222, noteBodyCommitment0: 0xb1, @@ -441,12 +509,12 @@ contract IntegrationTest is Test, InstallSystemContractsBase { pool.transact(new bytes(256), new bytes(256), pi, "OOPS", "o1", "o2"); } - function testTransactRevertsUnknownNoteCommitmentRoot() public { + function testTransactRevertsUnknownHistoricalNoteRootAccumulatorRoot() public { (ShieldedPool.PublicInputs memory pi, ) = _setupForTransact(); - pi.noteCommitmentRoot = uint256(keccak256("not in history")) + pi.historicalNoteRootAccumulatorRoot = uint256(keccak256("not in history")) % PoseidonFieldLib.FIELD_MODULUS; - vm.expectRevert(ShieldedPool.UnknownNoteCommitmentRoot.selector); + vm.expectRevert(ShieldedPool.UnknownHistoricalNoteRootAccumulatorRoot.selector); pool.transact(new bytes(256), new bytes(256), pi, "o0", "o1", "o2"); } @@ -640,7 +708,7 @@ contract IntegrationTest is Test, InstallSystemContractsBase { session, string.concat(".pool.publicSignals[", vm.toString(i), "]") ); } - pi.noteCommitmentRoot = ps[0]; + pi.historicalNoteRootAccumulatorRoot = ps[0]; pi.nullifier0 = ps[1]; pi.nullifier1 = ps[2]; pi.noteBodyCommitment0 = ps[3]; diff --git a/contracts/test/TransactDemoAuth.t.sol b/contracts/test/TransactDemoAuth.t.sol index 0bef056..9293790 100644 --- a/contracts/test/TransactDemoAuth.t.sol +++ b/contracts/test/TransactDemoAuth.t.sol @@ -141,14 +141,21 @@ contract TransactDemoAuthTest is Test, InstallSystemContractsBase { uint256 onChainAuthRegRoot, uint256 onChainAuthRevRoot ) = pool.getCurrentRoots(); - assertEq(onChainNoteRoot, pi.noteCommitmentRoot, - "note tree root mismatch (witness vs contract)"); + (uint256 onChainAccRoot, uint32 onChainAccNextIndex) = + pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + assertEq(onChainAccRoot, pi.historicalNoteRootAccumulatorRoot, + "historical note-root accumulator root mismatch (witness vs contract)"); + assertEq(uint256(onChainAccNextIndex), 2, + "expected two accumulator leaves after two deposits"); assertEq(onChainRegistryRoot, pi.registryRoot, "user registry root mismatch"); assertEq(onChainAuthRegRoot, pi.authPolicyRegistrationRoot, "auth-policy registration root mismatch"); assertEq(onChainAuthRevRoot, pi.authPolicyRevocationRoot, "auth-policy revocation root mismatch"); + // Use onChainNoteRoot for a sanity assertion that the note tree did + // advance with both deposits (private to the prover, no spend role). + assertTrue(onChainNoteRoot != 0, "note tree must have post-deposit root"); // 5. Submit the proof. bytes memory poolProof = vm.parseBytes(stdJson.readString(session, ".pool.proofHex")); @@ -169,6 +176,10 @@ contract TransactDemoAuthTest is Test, InstallSystemContractsBase { assertTrue(pool.isIntentReplayIdUsed(pi.intentReplayId), "intentReplayId must be consumed"); (uint256 noteRootAfter,,,) = pool.getCurrentRoots(); assertTrue(noteRootAfter != onChainNoteRoot, "note root must advance after transact"); + (uint256 accRootAfter, uint32 accNextIndexAfter) = + pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + assertTrue(accRootAfter != onChainAccRoot, "accumulator root must advance after transact"); + assertEq(uint256(accNextIndexAfter), 3, "transact appends one accumulator leaf"); } function _register(address user, uint256 nullifierKey, uint256 noteSecretSeed) private { @@ -188,7 +199,7 @@ contract TransactDemoAuthTest is Test, InstallSystemContractsBase { session, string.concat(".pool.publicSignals[", vm.toString(i), "]") ); } - pi.noteCommitmentRoot = ps[0]; + pi.historicalNoteRootAccumulatorRoot = ps[0]; pi.nullifier0 = ps[1]; pi.nullifier1 = ps[2]; pi.noteBodyCommitment0 = ps[3]; diff --git a/contracts/test/TransactHonkAuth.t.sol b/contracts/test/TransactHonkAuth.t.sol index 815a449..be93072 100644 --- a/contracts/test/TransactHonkAuth.t.sol +++ b/contracts/test/TransactHonkAuth.t.sol @@ -65,6 +65,8 @@ contract TransactHonkAuthTest is Test, InstallSystemContractsBase { string internal session; + bool internal sessionAvailable; + function setUp() public { vm.chainId(1); // The witness pins validUntilSeconds = 1735689600. @@ -76,21 +78,31 @@ contract TransactHonkAuthTest is Test, InstallSystemContractsBase { poolGroth16 = new PoolGroth16Verifier(); poolPrecompile = new MockPoolPrecompile(poolGroth16); honkVerifier = new HonkVerifier(); - - // Read session before constructing the wrapper -- need the proof length. - session = vm.readFile("build/integration_honk/session.json"); - bytes memory authProofBytes = vm.parseBytes(stdJson.readString(session, ".auth.proofHex")); - authVerifierImpl = new RealAuthVerifier(honkVerifier, authProofBytes.length); - authDataCommitment = stdJson.readUint(session, ".sidecar.auth_data_commitment_dec"); - mockTokenImpl = new MockERC20(); + // Honk session is produced by scripts/integration/build_honk_session.js, + // which requires bb/nargo. Gracefully skip the test when it isn't + // present so `forge test` works without those binaries installed. + try vm.readFile("build/integration_honk/session.json") returns (string memory s) { + session = s; + sessionAvailable = true; + bytes memory authProofBytes = vm.parseBytes(stdJson.readString(session, ".auth.proofHex")); + authVerifierImpl = new RealAuthVerifier(honkVerifier, authProofBytes.length); + authDataCommitment = stdJson.readUint(session, ".sidecar.auth_data_commitment_dec"); + vm.etch(AUTH_VERIFIER_ADDR, address(authVerifierImpl).code); + } catch { + sessionAvailable = false; + } + vm.etch(PROOF_VERIFY_PRECOMPILE_ADDRESS, address(poolPrecompile).code); - vm.etch(AUTH_VERIFIER_ADDR, address(authVerifierImpl).code); vm.etch(TOKEN_ADDR, address(mockTokenImpl).code); } function testTransactHonkAuthSucceeds() public { + if (!sessionAvailable) { + emit log("build/integration_honk/session.json missing; skipping (run scripts/integration/build_honk_session.js)"); + return; + } _register(SENDER, SENDER_NULLIFIER_KEY, SENDER_SECRET_SEED); _register(RECIPIENT0, R0_NULLIFIER_KEY, R0_SECRET_SEED); _register(RECIPIENT2, R2_NULLIFIER_KEY, R2_SECRET_SEED); @@ -133,8 +145,10 @@ contract TransactHonkAuthTest is Test, InstallSystemContractsBase { uint256 onChainAuthRegRoot, uint256 onChainAuthRevRoot ) = pool.getCurrentRoots(); - assertEq(onChainNoteRoot, pi.noteCommitmentRoot, - "note tree root mismatch"); + (uint256 onChainAccRoot, ) = + pool.getCurrentHistoricalNoteRootAccumulatorRoot(); + assertEq(onChainAccRoot, pi.historicalNoteRootAccumulatorRoot, + "historical note-root accumulator root mismatch"); assertEq(onChainRegistryRoot, pi.registryRoot, "user registry root mismatch"); assertEq(onChainAuthRegRoot, pi.authPolicyRegistrationRoot, @@ -179,7 +193,7 @@ contract TransactHonkAuthTest is Test, InstallSystemContractsBase { session, string.concat(".pool.publicSignals[", vm.toString(i), "]") ); } - pi.noteCommitmentRoot = ps[0]; + pi.historicalNoteRootAccumulatorRoot = ps[0]; pi.nullifier0 = ps[1]; pi.nullifier1 = ps[2]; pi.noteBodyCommitment0 = ps[3]; diff --git a/scripts/assets/gen_precompile_vectors.js b/scripts/assets/gen_precompile_vectors.js index fc953b6..342ba7c 100644 --- a/scripts/assets/gen_precompile_vectors.js +++ b/scripts/assets/gen_precompile_vectors.js @@ -113,7 +113,7 @@ async function verifyOK(p, pubs) { proof: "0x" + proofBytes.toString("hex"), publicInputs: publicsBig.map((b) => "0x" + b.toString(16).padStart(64, "0")), publicInputsLabels: [ - "noteCommitmentRoot", + "historicalNoteRootAccumulatorRoot", "nullifier0", "nullifier1", "noteBodyCommitment0", @@ -176,14 +176,15 @@ async function verifyOK(p, pubs) { ); // ----- Vector 3: non-canonical public input ----- - // Set publicInputs[0] (noteCommitmentRoot) to exactly p (BN254 scalar field - // order). Section 3.5 forbids public inputs >= p; the precompile MUST reject. + // Set publicInputs[0] (historicalNoteRootAccumulatorRoot) to exactly p + // (BN254 scalar field order). Section 3.5 forbids public inputs >= p; the + // precompile MUST reject. const ncPublics = [...publicsBig]; ncPublics[0] = BN254_FR; const ncInput = encodeInput(proofBytes, ncPublics); const ncVec = { description: - "publicInputs[0] (noteCommitmentRoot) set to p (BN254 scalar field order). The precompile MUST reject any public input >= p (Section 3.5) and return uint256(0).", + "publicInputs[0] (historicalNoteRootAccumulatorRoot) set to p (BN254 scalar field order). The precompile MUST reject any public input >= p (Section 3.5) and return uint256(0).", mutation: "publicInputs[0] := p_bn254_fr", input: ncInput, expectedOutput: diff --git a/scripts/circom/gen_domain_tags.js b/scripts/circom/gen_domain_tags.js index 6723ea0..103fac9 100644 --- a/scripts/circom/gen_domain_tags.js +++ b/scripts/circom/gen_domain_tags.js @@ -29,6 +29,7 @@ const CONTEXTS = [ ['POLICY_COMMITMENT_DOMAIN', 'policy_commitment'], ['BLINDED_AUTH_COMMITMENT_DOMAIN', 'blinded_auth_commitment'], ['USER_REGISTRY_LEAF_DOMAIN', 'user_registry_leaf'], + ['HISTORICAL_NOTE_ROOT_LEAF_DOMAIN','historical_note_root_leaf'], ]; const tags = {}; diff --git a/scripts/integration/build_honk_session.js b/scripts/integration/build_honk_session.js index 7442dc4..f4a2d52 100644 --- a/scripts/integration/build_honk_session.js +++ b/scripts/integration/build_honk_session.js @@ -149,6 +149,17 @@ function runQuiet(cmd, args, opts = {}) { const tPool = Date.now() - t0; console.log(` pool proved in ${(tPool / 1000).toFixed(2)}s`); + // Emit proof.json + public.json adjacent to the wtns; scripts/assets/refresh.sh + // reads these. Mirrors `snarkjs groth16 prove --proof ... --public ...` CLI. + fs.writeFileSync( + path.join(POOL_BUILD, "proof.json"), + JSON.stringify(poolProof, null, 2), + ); + fs.writeFileSync( + path.join(POOL_BUILD, "public.json"), + JSON.stringify(poolPublics, null, 2), + ); + console.log("==> 6) auth witness + bb prove"); run("nargo", ["execute", "auth"], { cwd: NOIR_AUTH_DIR }); // Need a VK for prove; regenerate to be safe (cheap). diff --git a/scripts/integration/build_session.js b/scripts/integration/build_session.js index 298db16..800e76e 100644 --- a/scripts/integration/build_session.js +++ b/scripts/integration/build_session.js @@ -101,6 +101,18 @@ function run(cmd, args, opts = {}) { const t1 = Date.now(); console.log(` pool proved in ${(t1 - t0) / 1000}s`); + // Emit proof.json + public.json adjacent to the witness binary, in the + // same shape `snarkjs groth16 prove --proof ... --public ...` writes from + // the CLI. scripts/assets/refresh.sh reads these. + fs.writeFileSync( + path.join(POOL_DIR, "proof.json"), + JSON.stringify(poolProof, null, 2), + ); + fs.writeFileSync( + path.join(POOL_DIR, "public.json"), + JSON.stringify(poolPublics, null, 2), + ); + console.log("==> proving auth"); const t2 = Date.now(); const { proof: authProof, publicSignals: authPublics } = await snarkjs.groth16.prove( diff --git a/scripts/noir/gen_honk_pool_witness_input.js b/scripts/noir/gen_honk_pool_witness_input.js index 2204a32..c2fa9c5 100644 --- a/scripts/noir/gen_honk_pool_witness_input.js +++ b/scripts/noir/gen_honk_pool_witness_input.js @@ -183,12 +183,35 @@ const inNoteCommitment = inAmount.map((_, i) => const inRealNullifier = inAmount.map((_, i) => poseidon(T.NULLIFIER_DOMAIN, inNoteCommitment[i], senderOwnerNullifierKey)); -const noteLeaves = new Map([ +// Mirror the on-chain two-deposit setup: input 0 was deposited first +// (post-deposit-1 root R1, accumulator leaf 0); input 1 was deposited next +// (post-deposit-2 root R2, accumulator leaf 1). Each input gets its own +// per-slot noteRoot + rootLogIndex, exercising the spec's per-slot +// independence. +const noteLeavesAfterDeposit1 = new Map([ + [Number(inLeafIndex[0]), inNoteCommitment[0]], +]); +const noteLeavesAfterDeposit2 = new Map([ [Number(inLeafIndex[0]), inNoteCommitment[0]], [Number(inLeafIndex[1]), inNoteCommitment[1]], ]); -const noteCommitmentRoot = noteCommitmentTreeRoot(noteLeaves, 32); -const inSiblings = inLeafIndex.map(idx => noteCommitmentSiblings(Number(idx), noteLeaves, 32)); +const noteRootAfterDeposit1 = noteCommitmentTreeRoot(noteLeavesAfterDeposit1, 32); +const noteRootAfterDeposit2 = noteCommitmentTreeRoot(noteLeavesAfterDeposit2, 32); + +const inNoteRoot = [noteRootAfterDeposit1, noteRootAfterDeposit2]; +const inRootLogIndex = [0n, 1n]; +const inSiblings = [ + noteCommitmentSiblings(Number(inLeafIndex[0]), noteLeavesAfterDeposit1, 32), + noteCommitmentSiblings(Number(inLeafIndex[1]), noteLeavesAfterDeposit2, 32), +]; + +const histLeaves = new Map(inNoteRoot.map((nr, i) => [ + Number(inRootLogIndex[i]), + poseidon(T.HISTORICAL_NOTE_ROOT_LEAF_DOMAIN, nr, inRootLogIndex[i]), +])); +const historicalNoteRootAccumulatorRoot = noteCommitmentTreeRoot(histLeaves, 32); +const inHistRootSiblings = inRootLogIndex.map(idx => + noteCommitmentSiblings(Number(idx), histLeaves, 32)); // ---- Outputs ---- // transfer: all 3 real. amounts = [8, 5, 2]; sum=15 = inputs(10+5). @@ -387,7 +410,7 @@ const arr2 = a => a.map(arr); const out = { // public (21) - noteCommitmentRoot: toStr(noteCommitmentRoot), + historicalNoteRootAccumulatorRoot: toStr(historicalNoteRootAccumulatorRoot), nullifier0: toStr(inRealNullifier[0]), nullifier1: toStr(inRealNullifier[1]), noteBodyCommitment0: toStr(outNoteBodyCommitment[0]), @@ -422,6 +445,11 @@ const out = { inLeafIndex: arr(inLeafIndex), inSiblings: arr2(inSiblings), + // private — historical note-root accumulator membership (per real input) + inNoteRoot: arr(inNoteRoot), + inRootLogIndex: arr(inRootLogIndex), + inHistRootSiblings: arr2(inHistRootSiblings), + // private — outputs outIsReal: arr(outIsReal), outAmount: arr(outAmount), diff --git a/scripts/witness/gen_pool_witness_input.js b/scripts/witness/gen_pool_witness_input.js index b0a1105..eacb868 100644 --- a/scripts/witness/gen_pool_witness_input.js +++ b/scripts/witness/gen_pool_witness_input.js @@ -147,12 +147,40 @@ const inNoteCommitment = inAmount.map((_, i) => const inRealNullifier = inAmount.map((_, i) => poseidon(T.NULLIFIER_DOMAIN, inNoteCommitment[i], senderOwnerNullifierKey)); -const noteLeaves = new Map([ +// Mirror the on-chain two-deposit setup: input 0 was deposited first +// (post-deposit-1 root R1, accumulator leaf 0); input 1 was deposited next +// (post-deposit-2 root R2, accumulator leaf 1). Each input gets its own +// per-slot noteRoot + rootLogIndex, exercising the spec's per-slot +// independence. +const noteLeavesAfterDeposit1 = new Map([ + [Number(inLeafIndex[0]), inNoteCommitment[0]], +]); +const noteLeavesAfterDeposit2 = new Map([ [Number(inLeafIndex[0]), inNoteCommitment[0]], [Number(inLeafIndex[1]), inNoteCommitment[1]], ]); -const noteCommitmentRoot = noteCommitmentTreeRoot(noteLeaves, 32); -const inSiblings = inLeafIndex.map(idx => noteCommitmentSiblings(Number(idx), noteLeaves, 32)); +const noteRootAfterDeposit1 = noteCommitmentTreeRoot(noteLeavesAfterDeposit1, 32); +const noteRootAfterDeposit2 = noteCommitmentTreeRoot(noteLeavesAfterDeposit2, 32); + +const inNoteRoot = [noteRootAfterDeposit1, noteRootAfterDeposit2]; +const inRootLogIndex = [0n, 1n]; +// Each input's note-tree path is taken at the era it was first witnessed. +// Input 0: leaf 0 in a tree that has only itself. +// Input 1: leaf 1 in a tree that has both inputs. +const inSiblings = [ + noteCommitmentSiblings(Number(inLeafIndex[0]), noteLeavesAfterDeposit1, 32), + noteCommitmentSiblings(Number(inLeafIndex[1]), noteLeavesAfterDeposit2, 32), +]; + +// Build the depth-32 historical note-root accumulator: leaf at index i is +// poseidon(HISTORICAL_NOTE_ROOT_LEAF_DOMAIN, inNoteRoot[i], i). +const histLeaves = new Map(inNoteRoot.map((nr, i) => [ + Number(inRootLogIndex[i]), + poseidon(T.HISTORICAL_NOTE_ROOT_LEAF_DOMAIN, nr, inRootLogIndex[i]), +])); +const historicalNoteRootAccumulatorRoot = noteCommitmentTreeRoot(histLeaves, 32); +const inHistRootSiblings = inRootLogIndex.map(idx => + noteCommitmentSiblings(Number(idx), histLeaves, 32)); // ---- Outputs (all 3 real) ---- const outIsReal = [1n, 1n, 1n]; @@ -300,7 +328,7 @@ const arr2 = a => a.map(arr); const out = { // public (21) - noteCommitmentRoot: toStr(noteCommitmentRoot), + historicalNoteRootAccumulatorRoot: toStr(historicalNoteRootAccumulatorRoot), nullifier0: toStr(inRealNullifier[0]), nullifier1: toStr(inRealNullifier[1]), noteBodyCommitment0: toStr(outNoteBodyCommitment[0]), @@ -335,6 +363,11 @@ const out = { inLeafIndex: arr(inLeafIndex), inSiblings: arr2(inSiblings), + // private — historical note-root accumulator membership (per real input) + inNoteRoot: arr(inNoteRoot), + inRootLogIndex: arr(inRootLogIndex), + inHistRootSiblings: arr2(inHistRootSiblings), + // private — outputs outIsReal: arr(outIsReal), outAmount: arr(outAmount), diff --git a/scripts/witness/negative_test.js b/scripts/witness/negative_test.js index 4b223a7..c5e10cc 100644 --- a/scripts/witness/negative_test.js +++ b/scripts/witness/negative_test.js @@ -174,6 +174,27 @@ const cases = [ return i; }, }, + { + name: 'wrong rootLogIndex (accumulator membership fails)', + mutate: (i) => { + // Witnessed accumulator path lands at index 0 (slot 0's witness). + // Mutating to index 5 changes histLeaf and the path bits, so the + // recomputed accumulator root no longer matches + // historicalNoteRootAccumulatorRoot. + i.inRootLogIndex[0] = '5'; + return i; + }, + }, + { + name: 'wrong noteRoot (per-input note membership fails)', + mutate: (i) => { + // Perturb slot 0's claimed creation-era noteRoot. The Merkle path's + // computed root no longer equals inNoteRoot[0] for the real input. + const r0 = BigInt(i.inNoteRoot[0]); + i.inNoteRoot[0] = ((r0 + 1n) % BigInt('21888242871839275222246405745257275088548364400416034343698204186575808495617')).toString(); + return i; + }, + }, { name: 'withdrawal-mode witness with outIsReal[1] = 1 (forbidden)', mutate: (i) => { diff --git a/src/lib/intent.js b/src/lib/intent.js index 90b2e19..3bed045 100644 --- a/src/lib/intent.js +++ b/src/lib/intent.js @@ -7,7 +7,7 @@ const { poseidon } = require("./poseidon2"); const T = require("./domain_tags"); const PUBLIC_INPUT_FIELDS = [ - "noteCommitmentRoot", + "historicalNoteRootAccumulatorRoot", "nullifier0", "nullifier1", "noteBodyCommitment0",